Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python 2.7中加速Mersenne素数py_Python - Fatal编程技术网

如何在Python 2.7中加速Mersenne素数py

如何在Python 2.7中加速Mersenne素数py,python,Python,我希望在Python2.7中优化和加速这个py,它可以查找梅森素数,过滤非梅森素数,过滤偶数。数字2不起作用,但没关系。代码在26秒内找到M44497。在更快的CPU上,它可以在15秒内找到它。它在7.5小时内找到了M859433。我怎么能说让M44497在7秒内运行,只是希望你们知道 import time def myfunction(): myfunction() def prime_sieve(): yield 2; yield 3;

我希望在Python2.7中优化和加速这个py,它可以查找梅森素数,过滤非梅森素数,过滤偶数。数字2不起作用,但没关系。代码在26秒内找到M44497。在更快的CPU上,它可以在15秒内找到它。它在7.5小时内找到了M859433。我怎么能说让M44497在7秒内运行,只是希望你们知道

import time
def myfunction():
myfunction()

def prime_sieve():                         
yield 2; yield 3; yield 5; yield 7;   

def mod_mersenne(n, prime, mersenne_prime):
while n > mersenne_prime:
n = (n & mersenne_prime) + (n >> prime)
if n== mersenne_prime:


return 0
return n
def is_mersenne_prime(prime, mersenne_prime): 
s = 4
for i in range(prime - 2):

s = mod_mersenne((s*s - 2), prime, mersenne_prime)
return s == 0

def calculate_perfects(n):

primes = prime_sieve()
next(primes)                     
if is_mersenne_prime(n,(2**n - 1) ):
yield((2**n-1 ))

print ("Mersenne Determinate Program Tom O'Neil, The Program only prints Mersenne 
Primes and it filters non-mersenne primes and even numbers.  The number 2 returns 
nothing!")
def runpro():

keep_running = True


num = int(input('Enter a number to test: '))



while keep_running:
    start = time.time()  
    for perfect in calculate_perfects(num):

    print ((True))
    elapsed = time.time() - start
    print "\tfound in %.f seconds" % elapsed

    start = time.time()     
    num = int(input('Enter a number to test: '))


    if num == 0:
    keep_running = False

    runpro()

您可以使用gmpy2,我创建了一个同时执行这两种功能的程序,您可以看到gmpy2可以在2秒钟内解决它:

def makersmarknongmpy2(n):
  z = 9
  mask = (1<<n)-1
  
  def mer_rem(x, bits): 
      # Below is same as:   return x % mask 
      while True: 
          r = 0
          while x != 0: 
              r += x & mask 
              x >>= bits 
          if r == mask: 
              r = 0 
          if r < mask: 
              return r 
          x = r 
              
  for x in range(n-1):
     z = mer_rem(z * z, n)
  return z == 9

import gmpy2

def makersmark(n):
  z = 9
  mask = gmpy2.mpz((1<<n)-1)
  
  def mer_rem(x, bits): 
      # Below is same as:   return x % mask 
      while True: 
          r = gmpy2.mpz(0) 
          while x != 0: 
              r += x & mask 
              x >>= bits 
          if r == mask: 
              r = gmpy2.mpz(0) 
          if r < mask: 
              return r 
          x = r 
        
  z = gmpy2.mpz(z)
  n = gmpy2.mpz(n)       
  for x in range(n-1):
     z = mer_rem(z * z, n)
  return z == 9
  
start = time.time()
print(makersmark(44497)
end = time.time()
print(end-start)

True
2.0241031646728516


start = time.time()
print(makersmarknongmpy2(44497)
end = time.time()
print(end-start)

True
16.902064561843872
def MakerMarkNongMPY2(n):
z=9
掩码=(1=位)
如果r==掩码:
r=0
如果r<掩码:
返回r
x=r
对于范围(n-1)内的x:
z=mer_rem(z*z,n)
返回z==9
进口gmpy2
def制造商标记(n):
z=9
掩码=gmpy2.mpz((1=位
如果r==掩码:
r=gmpy2.mpz(0)
如果r<掩码:
返回r
x=r
z=gmpy2.mpz(z)
n=gmpy2.mpz(n)
对于范围(n-1)内的x:
z=mer_rem(z*z,n)
返回z==9
开始=时间。时间()
打印(makersmark(44497)
end=time.time()
打印(结束-开始)
真的
2.0241031646728516
开始=时间。时间()
打印(MakerMarkNongMPY2(44497)
end=time.time()
打印(结束-开始)
真的
16.902064561843872

使用Python以外的语言是速度的最佳选择:它会慢慢地处理那些while循环,朱丽亚可能是一种替代解释语言的好选择。你也可以查看Python NUBBA JIT编译器,或者Cython。嗨,李察和Tip,Cython的这个脚本。我相信我需要一个C++编译器和Pip安装cython。任何帮助都会很好。:)我相信如果你在Google上搜索,StackOverflow会有很多关于运行cython的问题和答案。很难遵循你发布的代码(请正确缩进),但它可能有助于缓存/记忆计算结果。例如,看一看,关于优化或重构代码的问题更适合。