奇妙的相亲数

时间:2022-07-27 11:11:28

相亲数及其计算

 

 

在数学中有一些奇妙的数字,例如完美数、回文数、相亲数、水仙花数等等。本文介绍其中的相亲数。

 

1 相亲数

定义:不同的正整数A和正整数B组成的数对称为相亲数,当且仅当A的真因数之和等于BB的真因数之和等于A

例如,整数220的真因数包括1245101120224455110,而1+2+4+5+10+11+20+22+44+55+110=284;反过来,284的真因数包括12471142,而1+2+4+71+142=220。因此,220284是一对相亲数。

220284是第一对相亲数。此后,人们一直难以找到其他的相亲数,从而引起人们的猜想是不是自然界只有这一对相亲数,并由这一对数引发了很多浪漫的神话。

17世纪法国数学家费尔玛进行了大量冗长乏味的计算后,终于找到了第二对相亲数1729618416。两年后,法国“解析几何之父”笛卡尔于1638331日宣布找到了第三对亲和数94370569363584

著名数学家欧拉也研究过相亲数这个问题。1750年,他先后公布了60对相亲数。不仅列出了亲和数的数表,而且还公布了全部运算过程。欧拉将相亲数划分为五种类型加以讨论。例如第一类是寻找形如aqpar的相亲数对,这里pqr是不能整除a的互异素数,a=2n。他用试的方法讨论了22×5×11=22022×7=284,得到了第一对相亲数,依此又分别讨论其他情况,在第一类型里经过计算一共得到了11对相亲数。

欧拉的发现,解开了2000多年来的难题,使数学家惊喜叫绝。可是,由于方法与工具限制,人们却难以一个一个地验算核对,并且难以验证是否还存在其他的相亲数。在1866年,一个意大利青年巴格尼尼发现11841210是仅仅比220284稍为大一些的第二对相亲数。欧拉算出了长达几十位数字的相亲数,却偏偏遗漏了近在身边的第二对。

时光又过了半个多世纪,数学家在前人的基础上更新方法,陆陆续续又找到了许多对新的相亲数。到1923年,数学家麦达其和叶维勒汇总前人研究成果与自己研究所得,发表了1095对相亲数,其中最大的数有25位。同年,另一个荷兰数学家里勒找到了一对有152位数的相亲数。

随着时间的推移,人们靠笔算很难像欧拉那样一下发现众多的相亲数;随着数位越来越大,发现的数也越来越少。此时有数学家推测:若一对相亲数的数值愈大,则这两个数之比愈接近于1。这个推测是否成立,还有待数学家的证实。

现代以来,随着电子计算机系统计算能力的不断增强,很多以前不能解决的问题都能借助计算机而解决。相亲数也是如此。据70年代统计,人们共找到1200多对相亲数,并且,有人还曾有序不漏地用计算机检验与搜寻相亲数。例如近10年来,美国数学家在耶鲁大学先进的计算机上,对所有100万以下的数逐一进行了检验,总共找到了42对相亲数,发现10万以下的仅有13对,部分地消除了对欧拉等人列出的相亲数数表的疑虑。

目前,现在通过已发现10位以下的大量相亲数。但是,寻找相亲数还有许多有待探求的问题,如:目前找到的每一对相亲数所含的两个数,总是同时为偶数或同时为奇数,是否存在一个是偶数,而另一个是奇数的相亲数?目前找到的奇相亲数均是3的倍数,这是偶然性,还是必然规律?

下面给出一段本人用C语言编写的计算相亲数的程序:

void main()

{

       long int A = 1;        //保存第一个数

       long int B = 1;        //保存第二个数

       int SumOfA;          //保存第一个数真因数之和

       int SumOfB;          //保存第二个数真因数之和

       int j;

 

       //对每个数A都算出真因数之和SumOfA(设为B

       //B计算出真因数之和SumOfB

       //如果SumOfB等于A,则AB就是一对相亲数

       for(A=2; A<1000000; A++)

       {

              //A的因数和,初始为0

              SumOfA = 0;

 

              //判断任意小于A的整数j是否是A的因数

              //若是,则把j加到因数和中

              for(j=1; j<=A/2; j++)

                     if(A%j == 0)

                     {

                            SumOfA += j;

                     }

 

              //设置B=SumOfA,计算B的真因数之和SumOfB

              B = SumOfA;

SumOfB = 0;

              for(j=1; j<=B/2; j++)

                     if(B%j == 0)

                     {

                            SumOfB+=j;

                     }

             

              //判断ASumOfB是否相等

              //注意:还要判断两个数AB是否相等!

              //A>B时会出现重复输出相亲数,因此不输出

              if(( A == SumOfB) &&( A < B))

                     printf("%d, %d/n", A, SumOfA);

       }

}

这是一个未经优化的程序,运行时找到10对相亲数所用的时间比较短,但要获得更多的相亲数,需要更长的运行时间。据报道,美国数学家在耶鲁大学的计算机上,对所有一百万以下的数进行了检验,共找到了42对“相亲数”。下表仅列出由上面程序计算出的前22对“相亲数”:

220284

11841210

26202924

50205564

62326368

1074410856

1228514595

1729618416

6302076084

6692866992

6709571145

6961587633

7975088730

100485124155

122265139815

122368123152

141664153176

142310168730

171856176336

176272180848

185368203432

196724202444

值得一提的是,约公元9世纪时,阿拉伯数学家本·科拉建立了一个有名的相亲数公式:

   对任意大于1的正整数x,若a = 3*2x-1b=3*2x-1-1c=9*22x-1-1都是素数,则2xab2xc就是一对相亲数。

   但是这个公式实际计算起来特别复杂,在依靠人工运算的古代,并不能使人们发现更多的相亲数,这个公式也未经验证。

 

2 金兰数

上面介绍的相亲数是两个正整数的真因数之和互相等于对方,金兰数是相亲数的扩展。若正整数A的真因数之和等于BB的真因数之和等于CC的真因数之和等于C,而C的真因数之和恰好等于A,则称ABC这三个正整数组成金兰数对。

 

3 n环相亲数链

上面提到金兰数是相亲数的扩展,实际上,相亲数还可以在金兰数的基础上进行更多的扩展:对于正整数A1A2A3An-1An,若A1的真因数之和等于A2A2的真因数之和等于A3An-1的真因数之和等于An,而An的真因数之和恰好等于A1,则称正整数A1A2A3An-1An组成n环相亲数链。