为了账号安全,请及时绑定邮箱和手机立即绑定

求大神用Python,找前5个默尼森数!

求大神用Python,找前5个默尼森数!

yuantongxin 2016-04-20 11:14:00
找前5个默尼森数。P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。
查看完整描述

5 回答

已采纳
?
清波

TA贡献165条经验 获得超90个赞

从另外一个问题中 搬来 素数判断:

import math
  
  
## 定义 素数 判断函数
def isprime(n):
    if n!=int(n) or n<2:  ## 此处稍作改进
        return False
    for i in range(2,int(math.sqrt(n)+1)):
        if n % i ==0:
            return False
    return True
     
     
## 定义 默尼森数 判断函数
def ismonisen(n):
    if isprime(math.log(n+1,2)) and isprime(n):
        return True
    return False
     
 
## 至此,准备工作完毕, 也定义一个获取 默尼森数的函数吧,这次传进去 个整数,返回该数量的 默尼森数 列表:
def get_monisen(n):
    if n!= int(n) or n<1:
        return []
    x=3
    result=[3]
    while True:
        if isprime(x) and isprime(2**x-1):
            result.append(2**x-1)
        if len(result)==n:
            return result
        x+=2
     
 
## 测试:
print (get_monisen(8))

[3, 7, 31, 127, 8191, 131071, 524287, 2147483647]


算是写完了,做了一些无谓的判断, 习惯使然。  结果题主验证下,如果不对的话,我可以接着修改。。

再次修改, 优化get_monisen(), 可以算到8了。。

查看完整回答
3 反对 回复 2016-04-20
  • yuantongxin
    yuantongxin
    有异常; NameError: global name 'log' is not defined
  • 清波
    清波
    恩, log 少写了, 应该是 math.log , 在 def ismonisen 中
  • 清波
    清波
    再次修改 get_monisen 函数,充分利用函数的 return 终止函数的功能,减少冗余代码。
?
再见你

TA贡献5条经验 获得超1个赞

写了一个,但不是很简便,如果有更好的方式,请告诉一下,谢谢。

import math
a=0
b=1
L=[]
def sushu(b):
	for x in range(1,int(math.sqrt(b)+1)):
		if x!=1 and b%x==0:
			return False
	return True
while True:
	if(a==5):
		break
	if sushu(b):
		c=2**b-1
		if sushu(c) and b!=c:
			L.append(c)
			a=a+1
	b=b+1
print (L)


抱歉,以上代码修改了一下,请再试一下

查看完整回答
1 反对 回复 2016-04-20
?
vero爱慕课

TA贡献1条经验 获得超0个赞

import math


def prime(num):

    if num != int(num) or num < 2:

        return 0

    max = int(math.sqrt(num))

    for i in range(2,max+1):

        if num % i == 0:

            return 0

    return 1


def monisen(no):

    i = 0

    p = 1

    x = []

    while True:

        if prime(p): 

            if prime(2**p-1): 

                m = 2**p-1 

                x.append(m)

                i += 1

                if i == no: 

                    return x 

                else:

                    p += 1

            else:

                    p += 1

        else:

            p += 1 


print(monisen(int(input())))

寻找前n个默尼森数的程序,键入8,结果为:[3, 7, 31, 127, 8191, 131071, 524287, 2147483647]


查看完整回答
反对 回复 2017-08-09
?
qq_满儿燕_04214753

TA贡献1条经验 获得超0个赞

from math import sqrt

def isprime(x):

    if x==1:

        return False

    k=int(sqrt(x))

    for j in range(2,k+1):

        if x%j==0:

            return False

    return True

__________________________________________________________________

def monisen():

    sum=0

    P=2

    print 'P M'

    while True:

        if isprime(P):

            M=2**P-1

            if isprime(M):

                print P,M

                sum+=1

                if sum==5:

                    break            

        P+=1    

___________________________________________________________________

调用:

>>> monisen()

P M

2 3

3 7

5 31

7 127

13 8191




查看完整回答
反对 回复 2016-10-16
?
UPC周伟伟

TA贡献1条经验 获得超0个赞

import math

def isPrime(n):
    'judge a number is a prime'
    if n==1:
        return False
    k=int(math.sqrt(n))
    for i in range(2,k+1):
        if n%i==0:
            return False
            break
    return True
    
def getMonisen():
    count=0
    list=[]
    P=2
    while True:
        if isPrime(P):
            M=2**P-1
            if isPrime(M):
                list.append(M)
                count+=1
                if count==5:
                    break
        P+=1
    return list
    
list=getMonisen()
print list


查看完整回答
反对 回复 2016-04-24
  • 5 回答
  • 1 关注
  • 11934 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信