python因数之和等于数字本身,完全数,盈数,亏数到底是什么鬼?python实现给你看...

说起《几何原本》,那是数学中神一般的存在,它奠定了现代几何的基础。而其作者就是大名鼎鼎的欧几里得,在数学史上当然也是一个伟大的奠基人,而且以高产著称,其中,完全数就是他发现的。

116d0a240fd42f59fd8643863a244f65.png

完全数,定义为所有因数相加(因数中去掉自身),和等于自己的自然数。例如第一个完全数是6,它除去自身的因数是1,2,3,1+2+3的和恰好是6,第二个完全数是28。

相应的,因数和小于自身的称为亏数,大于自身的叫做盈数。

那么,完全数有什么用途呢?答,目前还没发现。数学家是一个伟大的职业,一生中研究的问题较少,如果没有阶段性的进展,那是有点悲哀的,只能作为下一个数学家的阶梯,一步一步往上爬。就拿完全数来说,没发现它的用途之前,它只不是一个数字游戏。但是它的证明难度却不是你我凡人能够Hold住的,付出多少数学家的心血,才发现这么一些”有趣”的东西。

于是,数学家们发现:

dd89f647cf1e79955b2f004f472e36cd.png

完全数可以展开成2的幂和,看不懂?看图:

84775c00c5d9b90fb4466f04e2423ae8.png

完全数还可以表示成连续自然数之和:

642e659300f5e070b424cfacddadcb9a.png

完全数所有因数(包括它本身)的倒数和等于2:

d997f89377891d0557785bd63460513b.png

目前还没有发现奇完全数,偶完全数都以6或28结尾。另外,第10个完全数已经达到了54位,所以在程序中用普通算法来判断完全数会导致整数溢出。

虽然普通算法实现没太大意义,但是我们还是用python看看吧:

# perf_num.pyimport mathclass math_game: # 如果是完全数,返回True def is_perf_num(num): facs = [] # list初始化,自然数都有因数1,顺便加入吧,省得后面计算 facs.append(1) # 前面加了1,所以从2开始去探测是否能够除尽 # 使用平方根作为截止条件,省去后面过多循环。 for fac in range(2, int(math.sqrt(num) + 1)): if(num % fac == 0): facs.append(fac) # 如果当前因数除尽,同时加入另外一个因数 # 节省循环次数,同时消除类似5*5这样重复因数 if(num / fac != fac): facs.append(num / fac) sum = 0 for fac in facs: sum += fac return sum == num

python作为一种脚本语言,调试起来很方便,直接python命令进入解释器环境即可:

python>>> from perf_num import math_game>>> math_game.is_perf_num(6)True

但是,这里有一个大坑一定要注意,解释器加载模块后有缓存,所以如果你修改了文件,需要在环境中重新加载,才能反映最近的更新:

>>> importlib.reload(sys.modules['perf_num'])>>> from perf_num import math_game

这样就可以了:)

好了,今天就介绍到这里了,大家如果发现更有趣的,请在下面分享吧。

原创版权,如引用需要注明来源和链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值