Python 3.x 在PYTHON中查找完美数
我确实已经有了答案,但我很好奇是否有更好的方法通过python对这个问题进行编码。多谢各位 如果一个数等于它的所有除数之和,则称为完美数,不包括 数字本身。例如,6是一个完美的数字,因为6的除数是1,2,3,6 6=1+2+3。再举一个例子,28是一个完美的数字,因为它的除数是1,2,4, 7,14,28和28=1+2+4+7+14。然而,15不是一个完美的数字,因为它的除数是 分别为1,3,5,15和15 6=1+3+5。编写一个程序,找出所有四个完美数 这是我的答案Python 3.x 在PYTHON中查找完美数,python-3.x,Python 3.x,我确实已经有了答案,但我很好奇是否有更好的方法通过python对这个问题进行编码。多谢各位 如果一个数等于它的所有除数之和,则称为完美数,不包括 数字本身。例如,6是一个完美的数字,因为6的除数是1,2,3,6 6=1+2+3。再举一个例子,28是一个完美的数字,因为它的除数是1,2,4, 7,14,28和28=1+2+4+7+14。然而,15不是一个完美的数字,因为它的除数是 分别为1,3,5,15和15 6=1+3+5。编写一个程序,找出所有四个完美数 这是我的答案 for i in ran
for i in range(1,10000):
summ = 0
for m in range(i):
if i % (m+1) == 0:
summ = summ + (m+1)
g = summ - i
if g == i :
print(g)
以下是使用Lucas-Lehmer测试检查完美数的完美数算法:
def ffs(x):
return (x&-x).bit_length()-1
def levelx(N, withstats=False):
if N <= 1: return False
temp = N
newlevel = temp.bit_length()
primetest = temp//(2**(ffs(temp)))
offset = temp//primetest
s = 4
nextlevel = newlevel // 2
check = temp // (2**nextlevel)
prevtemp = 2**nextlevel
if withstats == True:
print (newlevel, newlevel, temp)
print (newlevel, nextlevel+one, prevtemp)
if (prevtemp & (prevtemp-1) == 0) and prevtemp != 0:
if offset.bit_length() == primetest.bit_length():
if ((primetest+1) & ((primetest+1)-1) == 0):
for x in range(primetest.bit_length()-1):
s = (s * s - 2) % primetest
if withstats == True:
print(s)
if s in [0,2]: return True
return False
else: return False
else: return False
else: return False
您可以使用gmpy2将其速度提高约10倍
In [645]: for x in range(2,100):
...: if levelx((2**(x-1))*(2**x-1)) == True:
...: print(x, (2**(x-1))*(2**x-1))
...:
...:
2 6
3 28
5 496
7 8128
13 33550336
17 8589869056
19 137438691328
31 2305843008139952128
61 2658455991569831744654692615953842176
89 191561942608236107294793378084303638130997321548169216