python梅森素数/完全数

完全数(Perfect number):
称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身;
梅森数:
指形如2^ p-1的一类数,其中指数p是正整数,常记为Mp ;
梅森素数:
梅森数是素数,就称为梅森素数,即:2^ p-1为素数;
完全数和梅森素数关系:
大数学家欧拉曾推算出完全数的获得公式:如果p是素数数,且2^ p-1也是素数,那么(2^ p-1)* 2^(p-1)便是一个完全数。

方法一. 常规获取完全数:

def f(num):
    L = []
    for i in range(1, num + 1):
        s = 0
        for j in range(1, i):
            if i % j == 0:
                s += j
        if s == i:
            L.append(s)
    return L
start = datetime.datetime.now()
print(f(10000))
end = datetime.datetime.now()
print(end - start)
[6, 28, 496, 8128]
0:00:03.254306

获取10000以内的完全数用时3.254306秒

方法二. 梅森素数对应获取完全数:

import datetime
from math import sqrt
def prime_number(m):
    L = [2, 3]
    for n in range(2, m):
        for i in range(2, int(sqrt(n))+1):
            if n % i == 0:
                break
            if int(sqrt(n)) == i:
                L.append(n)
    return L

def perfect_number(x):
    List = []
    for n in prime_number(x):
        if (pow(2, n)-1)*pow(2, n-1) > x:
            break
        if pow(2, n)-1 in prime_number(x):
            List.append((pow(2, n)-1)*pow(2, n-1))
    return List

start = datetime.datetime.now()
print(perfect_number(10000))
end = datetime.datetime.now()
print(end - start)
[6, 28, 496, 8128]
0:00:00.194480

获取10000以内的完全数用时0.194480秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值