正如已经提到的,没有发现奇完美数。根据维基百科关于完美数的文章,如果存在任何奇数完美数,它们必须大于 10 1500。显然,寻找奇完美数需要复杂的方法和/或大量时间。:)
正如Wikipedia上所述,欧几里得证明了即使是完全数也可以从梅森素数中产生,而欧拉证明了相反,所有偶数都具有这种形式。
所以我们可以通过生成梅森素数来产生一个偶数的列表。我们可以(相对)通过Lucas-Lehmer 测试快速测试一个数字是否是梅森素数。
这是一个可以做到这一点的简短程序。这里使用的primes
函数是罗伯特威廉汉克斯写的,其余的代码是我几分钟前刚刚写的。:)
''' Mersenne primes and perfect numbers '''
def primes(n):
""" Return a list of primes < n """
# From http://stackoverflow.com/a/3035188/4014959
sieve = [True] * (n//2)
for i in range(3, int(n**0.5) + 1, 2):
if sieve[i//2]:
sieve[i*i//2::i] = [False] * ((n - i*i - 1) // (2*i) + 1)
return [2] + [2*i + 1 for i in range(1, n//2) if sieve[i]]
def lucas_lehmer(p):
''' The Lucas-Lehmer primality test for Mersenne primes.
See https://en.wikipedia.org/wiki/Mersenne_prime#Searching_for_Mersenne_primes
'''
m = (1 << p) - 1
s = 4
for i in range(p - 2):
s = (s * s - 2) % m
return s == 0 and m or 0
#Lucas-Lehmer doesn't work on 2 because it's even, so we just print it manually :)
print('1 2\n3\n6\n')
count = 1
for p in primes(1280):
m = lucas_lehmer(p)
if m:
count += 1
n = m << (p - 1)
print(count, p)
print(m)
print(n, '\n')
输出
1 2
3
6
2 3
7
28
3 5
31
496
4 7
127
8128
5 13
8191
33550336
6 17
131071
8589869056
7 19
524287
137438691328
8 31
2147483647
2305843008139952128
9 61
2305843009213693951
2658455991569831744654692615953842176
10 89
618970019642690137449562111
191561942608236107294793378084303638130997321548169216
11 107
162259276829213363391578010288127
13164036458569648337239753460458722910223472318386943117783728128
12 127
170141183460469231731687303715884105727
14474011154664524427946373126085988481573677491474835889066354349131199152128
13 521
6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151
23562723457267347065789548996709904988477547858392600710143027597506337283178622239730365539602600561360255566462503270175052892578043215543382498428777152427010394496918664028644534128033831439790236838624033171435922356643219703101720713163527487298747400647801939587165936401087419375649057918549492160555646976
14 607
531137992816767098689588206552468627329593117727031923199444138200403559860852242739162502265229285668889329486246501015346579337652707239409519978766587351943831270835393219031728127
141053783706712069063207958086063189881486743514715667838838675999954867742652380114104193329037690251561950568709829327164087724366370087116731268159313652487450652439805877296207297446723295166658228846926807786652870188920867879451478364569313922060370695064736073572378695176473055266826253284886383715072974324463835300053138429460296575143368065570759537328128
15 1279
10407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087
54162526284365847412654465374391316140856490539031695784603920818387206994158534859198999921056719921919057390080263646159280013827605439746262788903057303445505827028395139475207769044924431494861729435113126280837904930462740681717960465867348720992572190569465545299629919823431031092624244463547789635441481391719816441605586788092147886677321398756661624714551726964302217554281784254817319611951659855553573937788923405146222324506715979193757372820860878214322052227584537552897476256179395176624426314480313446935085203657584798247536021172880403783048602873621259313789994900336673941503747224966984028240806042108690077670395259231894666273615212775603535764707952250173858305171028603021234896647851363949928904973292145107505979911456221519899345764984291328
该输出是在 2GHz 32 位机器上在 4.5 秒内产生的。您可以轻松生成更大的梅森素数和完美数,但不要指望它会很快。