복붙노트

[PYTHON] 파이썬 언어를위한 isPrime 함수

PYTHON

파이썬 언어를위한 isPrime 함수

그래서 인터넷에서 약간의 도움으로이 문제를 해결할 수 있었고 이것이 내가 가진 것입니다.

def isPrime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False

    return True

하지만 내 질문은 정말로 그것을하는 방법이지만, 왜. 나는 1이 "프라임"숫자로 간주되지 않는다는 것을 이해하며, 범위 내에서 어떤 것이 든 나누면 자동으로 프라임을 반환하므로 False 문을 반환한다는 것을 이해합니다. 하지만 제 질문은 여기에 "n"놀이가 어떤 역할을합니까? 관심을 가져 주셔서 대단히 감사합니다.

추신. 나는 매우 미숙하고 한 달 전에 프로그래밍에 소개되었습니다 : S

해결법

  1. ==============================

    1.인터넷 주변에 떠있는 많은 소수 테스트 중 다음과 같은 주요 테스트를 고려하십시오.

    인터넷 주변에 떠있는 많은 소수 테스트 중 다음과 같은 주요 테스트를 고려하십시오.

    def is_prime(n):
      if n == 2 or n == 3: return True
      if n < 2 or n%2 == 0: return False
      if n < 9: return True
      if n%3 == 0: return False
      r = int(n**0.5)
      f = 5
      while f <= r:
        print '\t',f
        if n%f == 0: return False
        if n%(f+2) == 0: return False
        f +=6
      return True    
    

    프라임 번호 5003을 고려하십시오.

    print is_prime(5003)
    

    인쇄물:

     5
     11
     17
     23
     29
     35
     41
     47
     53
     59
     65
    True
    

    r = int (n ** 0.5) 라인은 70으로 평가됩니다 (5003의 제곱근은 70.7318881411이고 int ()는이 값을 자릅니다)

    최초의 몇 가지 테스트와 루프 중간의 테스트 때문에 루프는 매 6 번째마다 평가하면됩니다.

    5005의 다음 홀수 (2 이외의 모든 짝수는 소수가 아니기 때문에)를 생각해보십시오. 똑같은 내용이 출력됩니다.

     5
    False
    

    제한은 x * y == y * x이므로 제곱근입니다.이 함수는 5005가 5로 나눌 수 있으므로 소수가 아닌 것을 알기 위해 1 개의 루프 만 수행하면됩니다. 5 X 1001 == 1001 X 5 (둘 다 5005 임) 이후, 우리는 5에서 우리가 알고있는 것을 알기 위해 루프에서 1001로 완전히 갈 필요가 없습니다!

    자, 가지고있는 알고리즘을 살펴 보자.

    def isPrime(n):
        for i in range(2,int(n**0.5)+1):
            if n%i==0:
                return False
    
        return True
    

    두 가지 문제가 있습니다.

    그래서:

    def isPrime2(n):
        if n==2 or n==3: return True
        if n%2==0 or n<2: return False
        for i in range(3,int(n**0.5)+1,2):   # only odd numbers
            if n%i==0:
                return False    
    
        return True
    

    확인 - 속도가 약 30 % 빨라졌습니다 (벤치마킹 한 결과 ...)

    is_prime을 사용한 알고리즘은 매 6 번째 정수 만 루프를 통해 반복하기 때문에 여전히 약 2 배 빠른 속도입니다. (다시 한 번 벤치마킹했습니다.)

    참고 : x ** 0.5는 제곱근입니다.

    >>> import math
    >>> math.sqrt(100)==100**0.5
    True
    

    참고 2 : 소수 테스트는 컴퓨터 과학에서 흥미로운 문제입니다.

  2. ==============================

    2.n ** .5에서는 n을 제곱하지 않고 제곱근을 취합니다.

    n ** .5에서는 n을 제곱하지 않고 제곱근을 취합니다.

    숫자 20을 고려하십시오. 정수 인자는 1, 2, 4, 5, 10 및 20입니다. 20을 2로 나누고 10을 얻으면 확인하지 않고도 10으로 나눌 수 있습니다. 4로 나누고 5를 얻으면 5를 확인하지 않고도 4와 5로 나눌 수 있다는 것을 알 수 있습니다.

    요인의 중간 점에 도달 한 후에는 더 이상 이전에 요인으로 인식하지 않은 번호를 확인할 필요가 없습니다. 그러므로 무언가가 소수인지보기 위해 중간에 가면되고,이 중간 점은 숫자의 제곱근을 취함으로써 찾을 수 있습니다.

    또한 이유 1은 소수가 아니기 때문에 소수는 2 개의 요인 1과 자체를 갖는 것으로 정의됩니다. 즉 2는 1 * 2, 3은 1 * 3, 5는 1 * 5입니다. 그러나 1 (1 * 1)은 오직 하나의 요소 만 가지고 있습니다. 따라서이 정의를 충족하지 못합니다.

  3. ==============================

    3.질문은 조금 전에 묻지 만, 나는 당신을위한 더 짧은 해결책을 가지고있다.

    질문은 조금 전에 묻지 만, 나는 당신을위한 더 짧은 해결책을 가지고있다.

    isPrime(Number):
        return 2 in [Number,2**Number%Number]
    

    숫자 연산이 2가 아닌 소수라면 2를 반환합니다. 그러나 2가 주어진 숫자이면 우리가 찾고있는 목록에 추가됩니다.

    2^5=32    32%5=2
    2^7=128   128%7=2
    2^11=2048 2048%11=2
    

    등등 ...

    isPrime ()은 Number가 Prime이면 True를 반환하고 그렇지 않으면 False를 반환합니다.

  4. ==============================

    4.부동 소수점 연산은 아래에서 수행되지 않습니다. 이것은 더 빠르며 더 높은 논증을 용인 할 것입니다. 당신이 제곱근에만 가야만하는 이유는 숫자의 제곱근보다 큰 인수가 있다면 그 인수도 제곱근보다 작기 때문입니다.

    부동 소수점 연산은 아래에서 수행되지 않습니다. 이것은 더 빠르며 더 높은 논증을 용인 할 것입니다. 당신이 제곱근에만 가야만하는 이유는 숫자의 제곱근보다 큰 인수가 있다면 그 인수도 제곱근보다 작기 때문입니다.

    def is_prime(n):
        """"pre-condition: n is a nonnegative integer
        post-condition: return True if n is prime and False otherwise."""
        if n < 2: 
             return False;
        if n % 2 == 0:             
             return n == 2  # return False
        k = 3
        while k*k <= n:
             if n % k == 0:
                 return False
             k += 2
        return True
    
  5. ==============================

    5.숫자의 제곱근을 찾는 것이 효율성을위한 것입니다. 예. 36의 요인을 찾으려한다면 36을 곱하기 위해 곱할 수있는 가장 높은 숫자는 6.7 * 7 = 49입니다.

    숫자의 제곱근을 찾는 것이 효율성을위한 것입니다. 예. 36의 요인을 찾으려한다면 36을 곱하기 위해 곱할 수있는 가장 높은 숫자는 6.7 * 7 = 49입니다.

    그러므로 36의 모든 요인에 6을 곱하거나 더 작은 수를 곱해야합니다.

  6. ==============================

    6.

    def is_prime(x):
        if x < 2:
            return False
        elif x == 2:
            return True  
        for n in range(2, x):
            if x % n ==0:
                return False
        return True
    
  7. ==============================

    7.당신이 작성하는 모든 코드는 효율적이어야합니다. 가장 쉬운 방법은 숫자 'n'을 2에서 (n-1)로 나눌 수 있는지 확인하는 것입니다. 이것은 매우 큰 숫자를 고려할 때 많은 시간이 걸립니다. 제곱근 방법은 적은 수의 비교로 코드를 더 빠르게 만들 수 있습니다. 알고리즘 설계 및 분석의 복잡성에 대해 읽어보십시오.

    당신이 작성하는 모든 코드는 효율적이어야합니다. 가장 쉬운 방법은 숫자 'n'을 2에서 (n-1)로 나눌 수 있는지 확인하는 것입니다. 이것은 매우 큰 숫자를 고려할 때 많은 시간이 걸립니다. 제곱근 방법은 적은 수의 비교로 코드를 더 빠르게 만들 수 있습니다. 알고리즘 설계 및 분석의 복잡성에 대해 읽어보십시오.

  8. ==============================

    8.나는 늦었는지 모르지만 장래에 누군가를 돕기 위해 여기에 남겨 둘 것입니다.

    나는 늦었는지 모르지만 장래에 누군가를 돕기 위해 여기에 남겨 둘 것입니다.

    프로그램에서 계산할 숫자 범위를 줄이기 위해 (n)의 제곱근 즉 int (n ** 0.5)를 사용합니다.

    예를 들어, 우리는 100의 소수를 테스트하기 위해 시범 분할을 할 수 있습니다. 100의 모든 약수를 봅시다.

    2, 4, 5, 10, 20, 25, 50 여기서 우리는 가장 큰 요소가 100/2 = 50이라는 것을 알 수 있습니다. 이것은 모든 n에 해당됩니다 : 모든 제수는 n / 2보다 작거나 같습니다. 약수를 면밀히 살펴보면 일부는 중복되는 것을 볼 수 있습니다. 목록을 다르게 작성하면

    100 = 2 × 50 = 4 × 25 = 5 × 20 = 10 × 10 = 20 × 5 = 25 × 4 = 50 × 2 중복성이 명백해진다. 우리가 √100 인 10에 이르면 약수가 그냥 뒤집어 반복됩니다. 따라서, 우리는 √n보다 큰 시험 약수를 더 제거 할 수 있습니다.

    16과 같은 다른 번호를 가져 가십시오.

    그것의 약수는 2,4,8

    16 = 2 * 8, 4 * 4, 8 * 2.

    16의 제곱근 인 4에 도달 한 후에 우리는 이미 2 * 8로했던 8 * 2를 반복했다는 것을 알 수 있습니다. 이 패턴은 모든 숫자에 해당됩니다.

    반복을 피하기 위해 숫자 n의 제곱근까지의 소수성을 테스트합니다.

    그래서 우리는 부동 소수점으로 범위를 원하지 않기 때문에 제곱근을 int로 변환합니다.

    자세한 정보는 위키피디아의 소수 테스트를 읽으십시오.

  9. ==============================

    9.이 메서드는 여기에있는 재귀 및 열거 형 메서드보다 느리지 만 Wilson의 정리를 사용하며 한 줄에 불과합니다.

    이 메서드는 여기에있는 재귀 및 열거 형 메서드보다 느리지 만 Wilson의 정리를 사용하며 한 줄에 불과합니다.

    from math import factorial
    
    def is_prime(x):
        return factorial(x - 1)  % x == x - 1
    
  10. ==============================

    10.

    isPrime=lambda x: all(x % i != 0 for i in range(int(x**0.5)+1)[2:])
    

    그리고 그것을 사용하는 방법을 간다.

    isPrime(2) == False
    isPrime(5) == True
    isPrime(7) == True
    

    사용할 수있는 모든 소수를 찾으려면 :

    filter(isPrime, range(4000)[2:])[:5]
    => [2, 3, 5, 7, 11]
    

    이 경우 5는 발견 될 소수의 수와 소수가 검색 될 4000 개의 최대 범위를 나타냅니다.

  11. ==============================

    11.

    def is_prime(x):  
        if x < 2:  
            return False  
        for n in range(2, (x) - 1):  
            if x % n == 0:  
                return False  
        return True
    
  12. ==============================

    12.이것은 나의 방법이다.

    이것은 나의 방법이다.

    import math
    
    def isPrime(n):
        'Returns True if n is prime, False if n is not prime. Will not work if n is 0 or 1'
    
        # Make sure n is a positive integer
        n = abs(int(n))
    
        # Case 1: the number is 2 (prime)
        if n == 2: return True
    
        # Case 2: the number is even (not prime)
        if n % 2 == 0: return False
    
        # Case 3: the number is odd (could be prime or not)
    
        # Check odd numbers less than the square root for possible factors 
        r = math.sqrt(n)
        x = 3 
        while x <= r:
            if n % x == 0: return False  # A factor was found, so number is not prime
            x += 2 # Increment to the next odd number
    
        # No factors found, so number is prime  
        return True 
    

    원래 질문에 답하기 위해, n ** 0.5는 n의 근의 제곱과 같습니다. 복합 숫자는 항상 제곱근보다 작거나 같은 인수를 갖기 때문에이 숫자 뒤에 오는 요소를 확인하지 않아도됩니다. 이것은 모든 n에 대해 2와 n 사이의 모든 요소를 ​​확인하는 것보다 빠릅니다. 더 적은 수를 확인하기 때문에 n이 커짐에 따라 더 많은 시간을 절약 할 수 있습니다.

  13. ==============================

    13.

    def isPrime(num,div=2):
        if(num==div):
            return True
        elif(num % div == 0):
            return False
        else:
            return isPrime(num,div+1)
    
  14. ==============================

    14.int (n ** 0.5)는 sqrt (n)의 floor 값으로, n (n ** 2)의 2의 힘과 혼동을 일으 킵니다. n이 소수가 아닌 경우, i * j = n과 같이 두 개의 숫자 1

    int (n ** 0.5)는 sqrt (n)의 floor 값으로, n (n ** 2)의 2의 힘과 혼동을 일으 킵니다. n이 소수가 아닌 경우, i * j = n과 같이 두 개의 숫자 1

    이제, i, j 중 하나가 sqrt (n)보다 크거나 같다고 가정하면 sqrt (n) * sqrt (n) = n 이후 - 다른 하나는 sqrt보다 작거나 같아야 함을 의미합니다. (엔).

    이 경우 [2, sqrt (n)] 범위의 정수를 반복하는 것이 좋습니다. 그리고 그것은 정확히 게시 된 코드가하는 일입니다.

    실제 스마트 캐쉬로 나오려면 다음 한 줄짜리 기능을 사용하십시오.

    import re
    def is_prime(n):    
        return not re.match(r'^1?$|^(11+?)\1+$',n*'1')
    

    "magic regex"에 대한 설명은 여기에서 찾을 수 있습니다.

  15. ==============================

    15.

    def fun(N):#prime test
    if N>1 :
        for _ in xrange(5):
            Num=randint(1,N-1)
            if pow(Num,N-1,N)!=1:
                return False
        return True
    return False
    

    숫자가 소수 일 경우 거짓, 그렇지 않으면 거짓

  16. ==============================

    16.이것은 내 np 방법입니다.

    이것은 내 np 방법입니다.

    def is_prime(x):
        if x < 4:
            return True
        if all([(x > 2), (x % 2 == 0)]):
            return False
        else:
            return np.array([*map(lambda y: ((x % y) == 0).sum(), np.arange(1, x + 1))]).sum() == 2
    

    성능은 다음과 같습니다.

    %timeit is_prime(2)
    %timeit is_prime(int(1e3))
    %timeit is_prime(5003)
    
    10000 loops, best of 3: 31.1 µs per loop
    10000 loops, best of 3: 33 µs per loop
    10 loops, best of 3: 74.2 ms per loop
    
  17. ==============================

    17.

    def is_prime(n):
        n=abs(n)
        if n<2:    #Numbers less than 2 are not prime numbers
            return "False"
        elif n==2: #2 is a prime number
            return "True"
        else:
            for i in range(2,n): # Highlights range numbers that can't be  a factor of prime number n. 
                if n%i==0:
                    return "False" #if any of these numbers are factors of n, n is not a prime number
        return "True" # This is to affirm that n is indeed a prime number after passing all three tests
    
  18. ==============================

    18.의사 코드 (https://en.wikipedia.org/wiki/Primality_test)를 Python으로 구현했습니다.이 도움이 되었으면합니다.

    의사 코드 (https://en.wikipedia.org/wiki/Primality_test)를 Python으로 구현했습니다.이 도움이 되었으면합니다.

    # original pseudocode https://en.wikipedia.org/wiki/Primality_test
    def isPrime(n):
        # Corner Cases
        if (n<= 1): return False
        elif (n<= 3): return True
        elif (n%2 == 0 or n%3 == 0): return False
    
        i = 5
        while i*i<=n:
            if (n%i==0 or n%(i+2)==0): return False
            i += 6
    
        return True;
    
    %timeit isPrime(800)
    
  19. ==============================

    19.아주 간단합니다!

    아주 간단합니다!

    def prime(x):
      if x == 1:
        return False
      else:
        for a in range(2,x):
          if x % a == 0:
            return False
      return True
    
  20. ==============================

    20.번호 1은 소수이거나 복합으로 간주되지 않는 특별한 경우입니다. 자세한 정보는 http://mathworld.wolfram.com/PrimeNumber.html을 참조하십시오.

    번호 1은 소수이거나 복합으로 간주되지 않는 특별한 경우입니다. 자세한 정보는 http://mathworld.wolfram.com/PrimeNumber.html을 참조하십시오.

    과, (n ** 0.5) -> 그러면 'n'의 '제곱근'이 생깁니다. 그것이 "0.5 또는 1/2의 힘으로 키워지기 때문에"

    그리고 우리는 왜 그 일을합니까? 숫자 400을 예로 들어 보겠습니다. a * b 형식으로 표현할 수 있습니다.

    1*400 = 400
    2*200 = 400
    4*100 = 400
    5*80 = 400
    8*50 = 400
    10*40 = 400
    16*25 = 400
    20*20 = 400
    25*16 = 400
    40*10 = 400
    50*8 = 400
    80*5 = 400
    100*4 = 400
    200*2 = 400
    400*1 = 400
    

    400의 제곱근은 20입니다. 'a'가 20 'b'에 도달 할 때 감소하기 시작하기 때문에 20까지 나누기 만 확인하면된다는 것을 알 수 있습니다. 그래서 궁극적으로 우리는 제곱근보다 작은 숫자로 나눗셈을 검사하고 있습니다.

  21. ==============================

    21.나는 내가 말한 어떤 것보다 빠르다고 생각되는 새로운 해결책을 가지고있다. 파이썬에서의 함수

    나는 내가 말한 어떤 것보다 빠르다고 생각되는 새로운 해결책을 가지고있다. 파이썬에서의 함수

    이는 다음과 같은 아이디어에 기반합니다. N / D = R 임의의 수 N에 대해 N을 나눌 수있는 가능한 최소 수 (소수가 아닌 경우)는 D = 2이고 해당 결과 R은 (N / 2) (가장 높음)입니다.

    D가 커질수록 결과 R은 작아진다. 예 : D = 3으로 나눈 결과 R = (N / 3) 그래서 N이 N에 의해 ​​나눌 수 있는지를 검사 할 때 우리는 그것이 R로 나눌 수 있는지를 검사하고 있습니다.

    그래서 D가 커지고 R이 작아 질 때까지 (D == R == 제곱근 (N))

    그 다음에 우리는 단지 2에서 sqrt (N) 시간을 절약 할 수있는 또 다른 팁은 홀수를 확인하는 것입니다. 번호가 짝수로 나눌 수 있기 때문에 2로 나눌 수도 있습니다.

    시퀀스는 3,5,7,9, ......, sqrt (N)이 될 것입니다.

    import math
    def IsPrime (n): 
        if (n <= 1 or n % 2 == 0):return False
        if n == 2:return True
        for i in range(3,int(math.sqrt(n))+1,2):
            if (n % i) == 0:
                return False
        return True
    
  22. ==============================

    22.

    for i in range(2,5003):
        j = 2
        c = 0
        while j < i:
            if i % j == 0:
                c = 1
                j = j + 1
            else:
                j = j + 1
        if c == 0:
            print(str(i) + ' is a prime number')
        else:
            c = 0
    
  23. ==============================

    23.여기 내거야.

    여기 내거야.

    import math
    
    def is_prime(num):
    
        if num % 2 == 0 and num > 2: 
           return False
        for i in range(3, int(math.sqrt(num)) + 1, 2):
            if num % i == 0:
                return False
        return True
    
  24. ==============================

    24.

    def is_prime(x):  
        if x<2:  
            return False  
        elif x == 2:  
            return True  
        else:  
            for n in range(2, x):  
                if x%n==0:  
                    return False  
            return True
    
  25. ==============================

    25.Srsly 얘들 아 ... 왜 이런 식의 간단한 방법에 대해 많은 코드 라인이 필요합니까? 내 솔루션은 다음과 같습니다.

    Srsly 얘들 아 ... 왜 이런 식의 간단한 방법에 대해 많은 코드 라인이 필요합니까? 내 솔루션은 다음과 같습니다.

    def isPrime(a):
        div = a - 1
        res = True
        while(div > 1):
            if a % div == 0:
                res = False
            div = div - 1
        return res
    
  26. from https://stackoverflow.com/questions/15285534/isprime-function-for-python-language by cc-by-sa and MIT license