完全数

 1 """
 2 如果一个数恰好等于它的因子之和,则称该数为“完全数” 。各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。
 3 例如:
 4 第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。
 5 第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
 6 第三个完全数是496,有约数1、2、4、8、16、31、62、124、248、496,除去其本身496外,其余9个数相加,1+2+4+8+16+31+62+124+248=496。后面的完全数还有8128、33550336等等。
 7 特有性质
 8 (1)所有的完全数都是三角形数。
 9 (2)所有的完全数的倒数都是调和数。
10 (3)可以表示成连续奇立方数之和。
11 (4)都可以表达为2的一些连续正整数次幂之和。
12 (5)完全数都是以6或8结尾。
13 (6)各位数字辗转式相加个位数是1。
14 (7)它们被3除余1、被9除余1、1/2被27除余1。
15 计算方法
16 推导公式:
17 大数学家欧拉曾推算出完全数的获得公式:如果p是质数,且2^p-1也是质数,那么(2^p-1)X2^(p-1)便是一个完全数。
18 例如p=2,是一个质数,2^p-1=3也是质数,(2^p-1)X2^(p-1)=3X2=6,是完全数。
19 但是2^p-1什么条件下才是质数呢?事实上,当2^p-1是质数的时候,称其为梅森素数。
20 """
21 perfectnumber = 1  #完全数的开始值
22 while True:
23     #判断是否是完全数,如果是则打印
24     List = []   # 每次循环开始都创建一个新列表,用来存因数
25     for ax in range(1,perfectnumber):
26         if perfectnumber % ax ==0: #如果 ax 是 perfectunmber的因数
27             List.append(ax)   # 放在列表中,此时List列表中perfectnumber所有的因数
28     if sum(List) == perfectnumber:
29         print(perfectnumber,'是完全数')
30     perfectnumber += 1
31 
32 #c/c++嵌套的python,即cython
33 import datetime
34 def isPrime(N):
35     if N < 4: return N > 1
36     if ((N & 1) == 0): return False
37     i = 3
38     while i * i <= N :
39         if (N % i) == 0 : return False
40         i += 2
41     return True
42 def primality(N, M):
43     if N == 2 : return True
44     s = 4
45     for i in range(0, N - 2) :
46         s = (s * s - 2) % M
47     return s == 0
48 def findPerfectNumber() :
49     count = 0
50     begin = datetime.datetime.now()
51     strContent = ""
52     for i in range(2, 5000):
53         M = (1 << i) - 1
54         t = M << (i-1)
55         # 当p为素数且梅森数2^p-1为素数时2^(p-1)*(2^p-1)为完全数
56         if isPrime(i) and primality(i,M) :
57             count += 1
58             numLen = len(str(t))
59             strContent = strContent + "" + str(count) + "" + str(numLen) + "位数:" + str(t) + "\r\n"
60     end = datetime.datetime.now()
61     print(strContent)
62     print("FindPerfectNumber运行花费时间为:", (end - begin).total_seconds(), "s")
63 findPerfectNumber()

 

posted @ 2020-09-07 22:55  touch丶  阅读(948)  评论(0编辑  收藏  举报