我以前从未遇到过这个问题。我正在尝试生成非常大的素数。问题在于该程序太慢而无法发挥任何作用。当我修改代码以显示每一个数字时,它越低越好,但显示数字仍然很慢。有什么方法可以使Python(3)循环更快?如果没有,是否有办法使我的程序更快?
我的代码
import os, time, random
lower = 100000000000000000
upper = 999999999999999999
fh = open("pit.txt", "w+")
print("Starting...")
x = 0
for num in range(lower, upper + 1):
x = x + 1
if num > 1:
for i in range(2, num):
if (num % i) == 0:
break
else:
print("KEY_CODE = " + str(x))
print(num)
fh.write(str(num) + ",")
print("Done.")
fh.close()
PS:我忘了提到程序将这些值写入文本文档。我不认为这会减慢程序的速度,因为无论如何都不会打印任何内容。
我在您指定的范围内编写了一个非常快速的Primefinder。如果您想要更好的isprime测试,则可以从sympy导入isprime:
import random
import math
def isprime(hm, iterx=150):
for x in range(iterx):
if pow(random.randint(2,hm-1), hm-1, hm) != 1:
return False
return True
def prime_finder(start, end, primeanswer=False, withstats=True):
while True:
randnum = random.randint(start, end)
while math.gcd(randnum, 1<<randnum.bit_length()) == 2 and isprime(randnum//2) == False:
randnum = random.randint(start, end)
answer = randnum//2
# This option makes the finding of a prime much longer, i would suggest not using it as
# the whole point is a prime answer.
if primeanswer == True:
if isprime(answer) == False:
continue
powers2find = pow(answer, randnum-1, randnum)
if powers2find == answer:
continue
if powers2find < start or powers2find > end:
continue
if isprime(powers2find) == True:
break
else:
continue
if withstats == False:
return powers2find
elif withstats == True:
return f"pow({answer}, {randnum}-1, {randnum}) = {powers2find}"
return powers2find
结果:
In [2]: prime_finder(100000000000000000,999999999999999999)
Out[2]: 'pow(106974006956583922, 213948013913167845-1, 213948013913167845) = 144873055261278481'
In [3]: prime_finder(100000000000000000,999999999999999999)
Out[3]: 'pow(428583304152980488, 857166608305960977-1, 857166608305960977) = 527820433483021711'
In [4]: prime_finder(100000000000000000,999999999999999999)
Out[4]: 'pow(325303586907911770, 650607173815823541-1, 650607173815823541) = 160187520431555971'
您可以像这样运行它以获得答案:
In [10]: prime_finder(100000000000000000,999999999999999999,withstats=False)
...:
Out[10]: 443393963672858509