下面是一个(更有效的)筛子版本:# search all numbers in [2..limit] for perfect numbers

# (ones whose proper divisors sum to the number)

limit = int(input("enter upper limit for perfect number search: "))

# initialize - all entries are multiples of 1

# (ignore sieve[0] and sieve[1])

sieve = [1] * (limit + 1)

n = 2

while n <= limit:

# check n

if sieve[n] == n:

print(n, "is a perfect number")

# add n to all k * n where k > 1

kn = 2 * n

while kn <= limit:

sieve[kn] += n

kn += n

n += 1

找到10000个6 is a perfect number

28 is a perfect number

496 is a perfect number

8128 is a perfect number

将这些因素分解可以得到一个有趣的模式:6 3 * 2 ( 4 - 1) * ( 4 / 2)

28 7 * 2 * 2 ( 8 - 1) * ( 8 / 2)

496 31 * 2 * 2 * 2 * 2 ( 32 - 1) * ( 32 / 2)

8128 127 * 2 * 2 * 2 * 2 * 2 * 2 (128 - 1) * (128 / 2)

其中第一个因子(3,7,31,127)是一个素数,它比二的幂小一倍,并且乘以二的相同幂的一半。此外,所涉及的幂是素数(2**2,2**3,2**5,2**7)。

事实上,Euclid证明了当2**p - 1是素数时(2**p - 1) * 2**(p - 1)是一个完美数,而只有当p是素数时才可能(尽管不能保证)。欧拉进一步证明了所有的偶数都必须是这种形式。

这意味着一个更高效的版本-我将继续使用循环,可以随意重写它。首先,我们需要一个素数源和一个is-u素数测试:def primes(known_primes=[7, 11, 13, 17, 19, 23, 29]):

"""

Generate every prime number in ascending order

"""

# 2, 3, 5 wheel

yield from (2, 3, 5)

yield from known_primes

# The first time the generator runs, known_primes

# contains all primes such that 5 < p < 2 * 3 * 5

# After each wheel cycle the list of known primes

# will be added to.

# We need to figure out where to continue from,

# which is the next multiple of 30 higher than

# the last known_prime:

base = 30 * (known_primes[-1] // 30 + 1)

new_primes = []

while True:

# offs is chosen so 30*i + offs cannot be a multiple of 2, 3, or 5

for offs in (1, 7, 11, 13, 17, 19, 23, 29):

k = base + offs # next prime candidate

for p in known_primes:

if not k % p:

# found a factor - not prime

break

elif p*p > k:

# no smaller prime factors - found a new prime

new_primes.append(k)

break

if new_primes:

yield from new_primes

known_primes.extend(new_primes)

new_primes = []

base += 30

def is_prime(n):

for p in primes():

if not n % p:

# found a factor - not prime

return False

elif p * p > n:

# no factors found - is prime

return True

然后搜索看起来像# search all numbers in [2..limit] for perfect numbers

# (ones whose proper divisors sum to the number)

limit = int(input("enter upper limit for perfect number search: "))

for p in primes():

pp = 2**p

perfect = (pp - 1) * (pp // 2)

if perfect > limit:

break

elif is_prime(pp - 1):

print(perfect, "is a perfect number")

发现enter upper limit for perfect number search: 2500000000000000000

6 is a perfect number

28 is a perfect number

496 is a perfect number

8128 is a perfect number

33550336 is a perfect number

8589869056 is a perfect number

137438691328 is a perfect number

2305843008139952128 is a perfect number

不到一秒钟;-)

完全数python程序_Python完全数相关推荐

  1. 含类定义的完整python程序_Python——变量,运算,条件,循环

    Python Python开发 Python语言 Python--变量,运算,条件,循环 注释 1.注释是什么 注释就是给代码做的一些简短的说明,让我们更好的去理解代码,注意程序执行的时候,不会去执行 ...

  2. 如何退出python程序_python怎么退出程序

    python程序退出方式[sys.exit() os._exit() os.kill() os.popen(...)]. 1. sys.exit() 执行该语句会直接退出程序,这也是经常使用的方法,也 ...

  3. python编程第一程序_第一个Python程序_Python编程开发教程

    第一个Python程序 用notepad++编写程序代码 语言设置为python(高量显示函数和关键字)(注意:行首不能有空格,Python对缩进要求严格) 命令提示符运行 cd \文件名 #打开py ...

  4. 温度转换的python程序_Python通过小实例入门学习---1.0(温度转换)

    1.安装Python 3 下载地址: Welcome to Python.org​www.python.org 2."温度转换"实例:摄氏度--->华氏度 / 华氏度---& ...

  5. linux停止python程序_python – Linux上的多处理进程终止失败

    我刚刚注意到Linux上进程终止(来自多处理库)方法的问题.我有应用程序使用多处理库,但-当我在Windows上调用终止函数时,一切都很好,另一方面,Linux失败了这个解决方案.作为过程杀戮的替代, ...

  6. 基础的python程序_Python程序入门

    Python语法元素入门 Python语法元素分析 注释 注释:程序员在代码中加入的说明信息,不被计算机执行 注释的两种方法: 单行注释以#开头 多行注释以'''开头和结尾 # Here are th ...

  7. 手机编写python程序_Python实现自动上京东抢手机

    本文实例为大家分享了Python自动上京东抢手机的具体代码,供大家参考,具体内容如下 上次抢荣耀V9,被京东给恶心到了,所以就写了个简单的Python来自动抢V9.虽然用的是比较蠢的方法,但觉得还是有 ...

  8. collatz序列 python程序_Python Collatz序列实现过程解析

    编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数,那么 collatz()就打印出 number // 2, 并返回该值.如果 number 是奇数, col ...

  9. 温度转换的python程序_python学习阶段性小结

    Python中从现实问题到程序实现 一.程序:简单理解就是计算机所能听懂我们所说的话,. 二.计算机:其实它很笨,它没有我们人类那么聪明. 1它可以按照你告诉它的话去执行. 2它不能帮你想出解决一个问 ...

最新文章

  1. 在首次发布三周之后,MLflow迎来了0.2版本
  2. 矩阵特征值与行列式、迹的关系
  3. VTK:几何对象之SourceObjects
  4. 在php中函数名称区分大小写吗,PHP中的变量名,函数名,类名是区分大小写的吗...
  5. 转换php script类型,javascript如何实现值的类型转换
  6. [react] React的isMounted有什么作用?
  7. SQL Server 数据库管理常用的SQL和T-SQL语句
  8. 德勤预判:2022技术七大趋势
  9. python爬虫源码项目_32个Python爬虫实战项目,满足你的项目慌(带源码)
  10. 程序员挑战高薪,你必须会的十大面试题《一》
  11. *N#1234567CG,解析征信报告里的暗语
  12. C 语言指针与汇编地址(一)
  13. Windows中的NTUSER.DAT文件是什么?
  14. sam音高修正_Melodyneplugin音高修正插件使用入门(精)
  15. 该信谁?跳槽究竟是涨工资还是毁一生
  16. pkg-config
  17. TCP断开时的状态与Linux nf_conntrack
  18. java.net.url 中文乱码_asp.net URL中包含中文参数造成乱码的解决方法
  19. 站在巨人肩膀上的牛顿:Kubernetes和SAP Kyma
  20. github提交代码:schannel: failed to receive handshake, SSL/TLS connection failed

热门文章

  1. quercus下载_介绍Quercus,一个基于JavaPHP框架
  2. java基于ssm中小型企业公文流转系统的设计与实现
  3. INTR和INTE的区别
  4. 六、合并代码到开发分支(分支的合并、删除、分支的从属关系信息)
  5. 云计算(二):云计算的三种服务模式
  6. VUE layui之table数据表格使用详细说明
  7. word插入MathType公式行距变大调整办法
  8. excel中上面是数字怎么变为字母
  9. 京东猎户座发布开源,配置化一键生成cms系统
  10. java自学——arrary工具类和双色球案例