完全数(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秒