【问题标题】:Find Mersenne prime numbers using list comprehensions and my code使用列表推导和我的代码查找梅森素数
【发布时间】:2016-11-23 05:20:52
【问题描述】:

我编写了这段代码来查找素数,但我如何更改它来查找梅森素数?

def prime_test_list(n,known_primes):
k = 1
stop_val = len(known_primes)
if(n>2):
    while k<stop_val:
        cprime = known_primes[k]
        if n%cprime == 0:
            return 0            
        else:
            k+=1
    return 1
else:
    return 1

def prime_print_list(a):
    n = 2
    known_primes = [1] 
    while(n<a):
        val = prime_test_list(n,known_primes)
        if(val==1):
            known_primes.append(n)            
        n+=1
    print known_primes

【问题讨论】:

  • set(format(n, 'b')) == {'1'}
  • 你是什么意思??
  • 我上面的函数将打印素数。所以例如 prime_print_list(20) 是 1,2,3,5,7,11,13,17,19),但梅森素数不包括 5,11,13,..

标签: python algorithm python-2.7 primes


【解决方案1】:

类似这样的:

def mersenne_test(n):

    k = 0
    m = 0
    while m<=n:
        m = 2**k-1
        if(n==m):
            return "This number is a Mersenne number since it is equal by to 2**%d-1" % k
        k += 1
    return "This number is not a Mersenne number."

【讨论】:

  • 我正在寻找梅森素数。我相信他们是 49
  • @user59220 hm ...这不是你应该检查的信仰问题
  • 我的问题是如何打印出梅森素数,我相信它们是 49
【解决方案2】:

我们可以将您的素数代码用作查找梅森尼素数的部分。第一步,清理你的代码:

def prime_test_list(n, known_primes):
    if n < 2:
        return False

    if n % 2 == 0:
        return n == 2  # 2 is the only even prime

    k = 0

    while known_primes[k] ** 2 <= n:

        if n % known_primes[k] == 0:
            return False

        k += 1

    return True

def prime_print_list(a):
    known_primes = [2]

    for n in range(3, a, 2):
        if prime_test_list(n, known_primes):
            known_primes.append(n)

    return known_primes

print(prime_print_list(100))

输出

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

prime_print_list(n) 函数返回所有小于n 的素数。现在我们需要添加一个函数并扩展prime_print_list()。我使用的是 Python 3,但它应该可以在 Python 2 中使用。

我们需要添加的函数是Lucas-Lehmer primality test,在我们使用现有的prime_test_list() 函数检查指数的素数后调用它。

我们将扩展prime_print_list() 成为mersenne_prime_print_list((),让它做它所做的事情,然后执行上述测试并在单独的列表中跟踪阳性结果:

def lucas_lehmer_test(p, m):
    s = 4

    for _ in range(p - 2):
        s = ((s * s) - 2) % m

    return s == 0

def prime_test_list(n, known_primes):
    if n < 2:
        return False

    if n % 2 == 0:
        return n == 2  # 2 is the only even prime

    k = 0

    while known_primes[k] ** 2 <= n:

        if n % known_primes[k] == 0:
            return False

        k += 1

    return True

def mersenne_prime_print_list(a):
    known_primes = [2]
    known_mersenne_primes = [3]

    for n in range(3, a, 2):
        if prime_test_list(n, known_primes):
            known_primes.append(n)

            m = 2 ** n - 1

            if lucas_lehmer_test(n, m):
                known_mersenne_primes.append(m)

    return known_mersenne_primes

print(mersenne_prime_print_list(100))

输出

[3、7、31、127、8191、131071、524287、2147483647、2305843009213693951、618970019642690137449562111]

mersenne_prime_print_list(n) 函数返回所有素数指数小于n 的梅森素数。

在大约 50 个已知的梅森素数中,上面的代码不会让你超过 20 个左右 (mersenne_prime_print_list(5000)),否则它会变得太低效。

就列表推导而言,它们不是必需的,但可以随意重写代码以使用它们。

【讨论】:

    【解决方案3】:

    我还没有测试过,但也许这会起作用?

    k = 1
    
    while k<n:
        if( pow( 2, k) - 1 == n):
            print "This number is a mersenne prime"
            break
        if( pow( 2, k) >= n):
            print "This number is not a mersenne prime"
            break
        else:
            k+=1
    

    它遍历所有的梅森素数,直到找到与给定数字匹配或直到平方大于给定数字。

    【讨论】:

    • 我需要找到 merssene unmbers。我需要编写一个函数来打印出梅森素数
    • @user59220 我不太清楚你的意思。您的第一个函数测试 n 是否为素数,但现在您要求打印一个梅森素数列表的函数?据我了解,梅森素数有无数个。
    • 我想打印前 13 个数字。
    • def prime_test_list(n,known_primes): k = 1 stop_val = len(known_primes) if(n>2): while k
    • 然后,def prime_print_list(a): n = 2 known_primes = [1] while(n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2017-01-15
    • 2020-09-08
    相关资源
    最近更新 更多