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

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时:
《数学与泛型编程:高效编程的奥秘》一3.4 完美数

上面这个式子可以通过幂差公式推导出来:
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的素数分解形式是:
《数学与泛型编程:高效编程的奥秘》一3.4 完美数

那么,我们就把指数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的所有因子之和,写为连乘的形式:
《数学与泛型编程:高效编程的奥秘》一3.4 完美数

在推导最后一步的时候,我们运用幂差公式,对分子进行了化简。(本例中的整数变量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)),可以得出:
《数学与泛型编程:高效编程的奥秘》一3.4 完美数

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

上一篇:阿里云ECS使用体验


下一篇:ECS使用有感