【问题标题】:Test for the Primality of Mersenne numbers测试梅森数的素性
【发布时间】:2020-09-08 03:09:36
【问题描述】:

请帮忙解决这个问题;

对于具有指数 p 的给定梅森数,如果 Lucas-Lehmer 级数在位置 p - 2 处为 0,则该数是素数。编写一个函数来测试具有指数 p 的梅森数是否为素数。测试素数 p 在 3 到 65 之间的梅森数是否为素数。您的最终答案应该是由 (Mersenne exponent, 0) 或 (1) 组成的元组列表,用于您测试的每个 Mersenne 数,其中 0 和 1 分别替换“False”和“True”。下面显示的是我尝试的解决方案

#function to define a mersenne number
def mersenne_number(p):
    return 2**p - 1

#function to generate the Lucas-Lehmer sequence
def lucas_lehmer(p):
    ll_seq = [4]
    if p > 2:
        for i in range(1, (p - 2) + 1):
            n_i = (ll_seq[i-1] ** 2 - 2)%(2**p - 1)
            ll_seq.append(n_i)
    return ll_seq

#To generate a list of Tuples consisting of (mersenne exponents, 1 or 0), 1 and 0 represent True and False respectively.
mersenne_primes = []

def ll_prime(num1, num2):
    for p in range(3, 65):
        if lucas_lehmer(p)[-1] == 0:
            mersenne_primes.append((p, 1))
        else:
            mersenne_primes.append((p, 0))

    print(mersenne_primes)

我在这个阶段得到了错误的输出。该函数返回的素数梅森指数不是素数,意思是 0。

【问题讨论】:

标签: python data-structures


【解决方案1】:

我在这里的维基百科页面上的伪代码中实现了 Lucas Lehmer 测试:

def LucasLehmer(p):
   if p == 2:
     return True
   s = 4
   M = pow(2, p) - 1
   for x in range (1, (p-2)+1):
      s = ((s * s) - 2) % M
   if s == 0: return True
   else: return False

for x in range(2,10000): 
   if LucasLehmer(x): 
      print(f"2**{x}-1 is Prime") 
                                                                                                                                                           
2**2-1 is Prime
2**3-1 is Prime
2**5-1 is Prime
2**7-1 is Prime
2**13-1 is Prime
2**17-1 is Prime
2**19-1 is Prime
2**31-1 is Prime
2**61-1 is Prime
2**89-1 is Prime
2**107-1 is Prime
2**127-1 is Prime
2**521-1 is Prime
2**607-1 is Prime
2**1279-1 is Prime
2**2203-1 is Prime
2**2281-1 is Prime


我还更改了数学以使其成为分解引擎,如果您有兴趣在此处使用它进行分解:

import math

def PrimeFinderLucasLehmer4(N):
   p = 1<<N.bit_length()-1
   if N == 2:
     return 2
   if N == 3:
     return 3
   s = 4
   M = pow(p, 2) - 1
   for x in range (1, 100000):
     s = (((s * N ) - 2 )) % M
     xx = [math.gcd(s, N)] + [math.gcd(s*p+x,N) for x in range(7)] + [math.gcd(s*p-x,N) for x in range(1,7)] 
     try:
        prime = min(list(filter(lambda x: x not in set([1]),xx)))
     except:
        prime = 1
     if prime == 1:
        continue
     else:
        break
   #print (s, x, prime, xx)
   return prime


In [70]: PrimeFinderLucasLehmer4(1009732533765211)                                                                                                                                        
Out[70]: 11344301

And from https://stackoverflow.com/questions/4078902/cracking-short-rsa-keys

In [71]: PrimeFinderLucasLehmer4(10142789312725007)                                                                                                                                       
Out[71]: 100711423


【讨论】:

    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2019-10-28
    相关资源
    最近更新 更多