说起《几何原本》,那是数学中神一般的存在,它奠定了现代几何的基础。而其作者就是大名鼎鼎的欧几里得,在数学史上当然也是一个伟大的奠基人,而且以高产著称,其中,完全数就是他发现的。
完全数,定义为所有因数相加(因数中去掉自身),和等于自己的自然数。例如第一个完全数是6,它除去自身的因数是1,2,3,1+2+3的和恰好是6,第二个完全数是28。
相应的,因数和小于自身的称为亏数,大于自身的叫做盈数。
那么,完全数有什么用途呢?答,目前还没发现。数学家是一个伟大的职业,一生中研究的问题较少,如果没有阶段性的进展,那是有点悲哀的,只能作为下一个数学家的阶梯,一步一步往上爬。就拿完全数来说,没发现它的用途之前,它只不是一个数字游戏。但是它的证明难度却不是你我凡人能够Hold住的,付出多少数学家的心血,才发现这么一些”有趣”的东西。
于是,数学家们发现:
完全数可以展开成2的幂和,看不懂?看图:
完全数还可以表示成连续自然数之和:
完全数所有因数(包括它本身)的倒数和等于2:
目前还没有发现奇完全数,偶完全数都以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
这样就可以了:)
好了,今天就介绍到这里了,大家如果发现更有趣的,请在下面分享吧。
原创版权,如引用需要注明来源和链接。