Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在PYTHON中查找完美数_Python 3.x - Fatal编程技术网

Python 3.x 在PYTHON中查找完美数

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

我确实已经有了答案,但我很好奇是否有更好的方法通过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 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