《数学与泛型编程:高效编程的奥秘》一3.4 完美数

简介: 本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第3章,第3.4节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 完美数

正如3.1节所说,古希腊人对数字的各种属性都很感兴趣。他们所提出的一个概念叫做完美数(perfect number),也就是其值等于所有真因子之和的数。古希腊人知道下面这四个完美数:

  6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064
有人认为完美数与自然及宇宙的结构有关。例如28这个完美数就与月亮绕地球旋转所经历的天数相近。
古希腊人真正想要知道的是有没有一种方式能够推测出其他的完美数。他们对已知的完美数做了素因子分解(prime factorization):

  6 = 2·3 = 21·3
28 = 4·7 = 22·7

496 = 16·31 = 24·31
8128 = 64·127 = 26·127
并且观察到下列规律:
6 = 2·3 = 21·(22-1)
28 = 4·7 = 22·(23-1)
120 = 8·15 = 23·(24-1)不是完美数
496 = 16·31 = 24·(25-1)
2016 = 32·63 = 25·(26-1)不是完美数
8128 = 64·127 = 26·(27-1)
如果一个数可以写成上述形式,而且其中的第二项是素数,那么这个数就是完美数。欧几里得在公元300年左右证明了这个结论。
定理3.3 (《几何原本》第9卷第36号命题)
如果是素数,那么是完美数。
有用的公式
开始证明该定理之前,大家应该先记住两个代数公式。首先是幂差(difference of powers)公式:
(3.1)
这个公式很容易就能通过下面两个等式推导出来:
x(xn + xn-1y + … + xyn-1 + yn) = xn-1 + xny + xn-1y2 + … + xyn(3.2)
y(xn + xn-1y + … + xyn-1 + yn) = xny + xn-1y2 + … + xyn + yn-1(3.3)
根据分配律,等式(3.2)与等式(3.3)的左右两侧是分别相等的。用等式(3.2)减去等式(3.3),就可以得到等式(3.1)。
第二个有用的公式,是奇数次幂的求和(sum of odd powers)公式:
x2n-1 + y2n-1 = (x + y)(x2n-x2n-1y + …-xy2n-1 + y2n)(3.4)
要想推导出这个公式,我们可以先把求和转化为求差,然后套用前面所得到的等式(3.1):
x2n+1 + y2n+1 = x2n+1--y2n+1
= x2n+1-(-y)2n+1
= (x-(-y))(x2n + x2n-1(-y)+…+(-y)2n)
= (x + y)(x2n-x2n-1y +…-xy2n-1+ y2n)
在刚才的推导过程中,之所以能够把-y2n+1变为(-y)2n+1,是因为-1的奇数次方依然是-1,因此可以把-y2n+1写成(-1)2n+1y2n+1,进而写成(-y)2n+1。我们在证明定理3.3的时候,亟须使用这两个公式。
我们知道,当n大于0时:
screenshot

上面这个式子可以通过幂差公式推导出来:
2n-1 =(2-1)(2n-1 + 2n-2 + … + 2 + 1)
或者你也可以这么想:用二进制数的形式来对2的幂进行连加。
习题3.5 通过等式(3.1)来证明:如果2n-1是素数,那么n就是素数。
我们现在要按照德国著名数学家高斯(Carl Gauss)的办法来证明定理3.3。(本书第8章还会谈到高斯。)首先,把定理中的n写为n-1,并利用等式(3.5),把其中的两个都替换为2n-1,于是定理就变成:
如果2n-1是素数,那么2n-1(2n-1)就是完美数。
接下来定义一个函数σ(n),用它来表示n的所有因子之和。如果n的素数分解形式是:
screenshot

那么,我们就把指数ai的每一种组合方式都列出来,并将其运用到相应的素因子上面,这样就可以得到n的全部因子。比方说,24的素数分解形式是23·31,因此,其各个因子是{20·30, 21·30, 22·30, 23·30, 20·31, 21·31, 22·31, 23·31}。于是,这些因子之和就是:
2030 + 2130 + 2230 + 2330 + 2031 + 2131 + 2231 + 2331 = (20 + 21 + 22 + 23)(30 + 31)
因此,我们可以把任何一个数n的所有因子之和,写为连乘的形式:
screenshot

在推导最后一步的时候,我们运用幂差公式,对分子进行了化简。(本例中的整数变量p,指的是素数,在本书接下来的各种证明过程中,除非另做说明,否则也将遵循这一惯例。)
习题3.6 证明:如果n与m互质(coprime,也就是没有共同的素因子),那么
σ(nm)= σ(n)σ(m)
(这个命题的另外一种表述方式为:σ是积性函数(multiplicative function)。)
现在我们定义这样一个名为真因子总和(aliquot sum)的函数α(n):
α(n)= σ(n)-n
换句话说,n的真因子总和就是其所有的真因子之和,也就是除去n自身之外的那些因子之和。
现在,我们已经做好了证明定理3.3所需的准备工作,这条定理也称为《几何原本》第9卷第36号命题:
如果2n-1是素数,那么2n-1(2n-1)就是完美数。
证明 设q = 2n-1(2n-1)。我们已经知道,2是个素数,而根据该定理所列出的条件,2n-1也是个素数,因此,2n-1(2n-1)就可以视为一种形式的素数分解,其中 m = 2, p1 = 2, a1 = n-1, p2 = 2n-1, a2 = 1。套用因子求和公式(参见等式(3.6)),可以得出:
screenshot

而根据α函数的定义,我们可以得出:
α(q)= σ(q)- q = 2q - q = q
因此,q是完美数。□
我们可以把欧几里得的这条定理解读为:如果某数具备特定的形式,那它就是完美数。值得思考的地方在于,该定理的逆命题是否成立:如果某数是完美数,那么它是否必定具备2n-1(2n-1)的形式?欧拉(Euler)在18世纪已经证明,偶完美数必定具备该形式,然而他并没有证明那个更加通用的命题,也就是:每一个完美数都具备这样的形式。这个问题直到今天也没有解决,我们无法确定奇完美数是否存在。
习题3.7 证明每一个偶完美数都是三角形数。
习题3.8 证明偶完美数每个因子的倒数之和,必定是2。例如6是偶完美数,对它的4个因子分别取倒数,并将其相加,就得到:
screenshot

相关文章
|
6月前
|
数据挖掘 Python
揭秘编程世界:深入理解变量的奥秘
揭秘编程世界:深入理解变量的奥秘
33 0
|
算法 Linux 程序员
C语言个人感悟以及与C++之间的区别之经典
C语言个人感悟以及与C++之间的区别之经典
172 0
C语言个人感悟以及与C++之间的区别之经典
|
算法 程序员 Python
考点:猴子分桃问题,程序员可以将数学逻辑思维转换为编程思维【Python习题07】
考点:猴子分桃问题,程序员可以将数学逻辑思维转换为编程思维【Python习题07】
191 0
|
自然语言处理 算法 程序员
初识C语言之算法设计篇——带你走进编程世界的小院!
初识C语言之算法设计篇——带你走进编程世界的小院!
224 0
初识C语言之算法设计篇——带你走进编程世界的小院!
|
算法 数据库 C++
一些计算机编程的经典书籍总结(大家一起来补充!)
(最后更新时间:2010.11.26  11点16分) 这个帖子原本是在C++奋斗 乐园论坛讨论的,后来觉得有必要和更多朋友分享下,所以就在这里也贴出来了,希望大家一起补充。 因为我个人学的是C/C++的,所以JAVA等程序语言的书籍我就不讨论了。
1086 0
《数学与泛型编程:高效编程的奥秘》一3.1 整数的几何属性
本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第3章,第3.1节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1496 0
|
算法 程序员
《数学与泛型编程:高效编程的奥秘》一2.2 改进该算法
本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第2章,第2.2节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1374 0
|
算法
《数学与泛型编程:高效编程的奥秘》一1.1 编程与数学
本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第1章,第1.1节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2018 0
|
算法 C++
《数学与泛型编程:高效编程的奥秘》一2.1 埃及乘法算法
本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第2章,第2.1节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1948 0
|
算法
《数学与泛型编程:高效编程的奥秘》一导读
Alex是数学专业出身,但我不是。因此,我很努力地试着去读懂课程里的一些材料,并根据自身体会来确定那些需要加以解说的难点。如果你发现本书所用的一些描述方式及术语和专业数学家稍有不同,或是本书在解释某个问题时多写了几个简单的步骤,那么这应该归咎于我才对。
1510 0