如何使循环迭代更快?

问题描述 投票:1回答:1

我以前从未遇到过这个问题。我正在尝试生成非常大的素数。问题在于该程序太慢而无法发挥任何作用。当我修改代码以显示每一个数字时,它越低越好,但显示数字仍然很慢。有什么方法可以使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:我忘了提到程序将这些值写入文本文档。我不认为这会减慢程序的速度,因为无论如何都不会打印任何内容。

python python-3.x loops primes
1个回答
0
投票

我在您指定的范围内编写了一个非常快速的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
© www.soinside.com 2019 - 2024. All rights reserved.