2^30-2^100 크기의 단일 시스템에서 소수를 계산하려고합니다.
내 알고리즘은 아래에 포함되어 있습니다.
나는이 파이썬 코드를 각 숫자에 대해 O(sqrt(n/2))
(나는 믿는다)으로 최적화했다 : 홀수 만 받아들이고 전달 된 숫자가 다른 메서드에서 이상하다는 것을 보장한다.프리미엄 테스트가 무차별 방식보다 오래 걸리는데 어떻게 개선 할 수 있습니까?
저는 페르마 소수성 테스트을 사용하여 프로세스 속도를 향상 시켰습니다. 그러나 숫자는 내장 된 math.pow()
방법에 비해 너무 큽니다. 그래서 지수로 제곱 한 값을 사용했습니다.
그러나 큰 수의 경우에는 매우 오랜 시간이 걸립니다.
구현이 잘못 되었습니까?
시간은 스퀘어 링 알고리즘에서 비롯됩니다. 반복 스택 또한 내 메모리를 먹어 치우며, 더 빠른 알고리즘으로 조사해야합니까?
숫자가 35184372088967이 소수인지 계산하려면 무차별 알고리즘을 사용하여 .00100111 초가 걸렸지 만 소수 테스트를 실행하려면 .40608 초가 걸립니다.
브 루트 포스 소수 검사 : 페르마의 알고리즘의
def isPrime(n):
for i in range(3,int(math.sqrt(n)),2):
if(n%i==0):
return False
return True
구현 :
def couldBePrime(n):
if(n>308):
return power(2,n-1)%n==1
else:
return math.pow(2,n-1)%n==1
(시간이 소요되는 부분) 알고리즘을 제곱하여 지수화 :
def power(base,exp):
if exp == 0:
return 1
elif exp == 1:
return base
elif (exp & 1) != 0:
return base * power(base * base, exp // 2)
else:
return power(base * base, exp // 2)
코드에 몇 가지 문제가 있습니다. 문제 중 일부는 과학적 모델링과 관련이 있습니다 (CS.SE에서 처리하는 것이 가장 좋고 SO에서 주제가 가장 잘 나타남). 일부는 Python 구현과 관련이 있습니다 CS.SE에 있고 SO에서 가장 잘 처리 됨). 그래서 Stack Overflow (재 게시하지 말아주세요)로 옮겨 가고 있습니다. – Gilles
당신의 힘 함수 대신에, modular exponentiation을 수행하기 위해'pow (base, exponent, modulus)'라고 말하십시오. 내장 된 함수이기 때문에 직접 작성할 필요가 없습니다. – user448810