奇妙的相亲数

相亲数及其计算

 

 

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

 

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环相亲数链。

 

 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 毕达哥拉斯发现,220与284两数之间存在着奇妙的联系:220的真因数之和等于284,而284的真因数之和又等于220。我们把两个数之间的这种特殊关系称为相亲数。 设计程序求数对a,b的真因数之和是否互为相对数。设a,b的真因数之和分别为A,B,则: 如果A等于b,同时B等于a,则a,b是相亲数,否则a,b则不是相亲数。 程序输出格式要求:"相亲数:%d,%d\n""%d 的真因数之和为:%d"+"%d"+"%d....""=%d\n" ### 回答2: 程序如下: #include <stdio.h> int main() { int i, j, sum1, sum2; for (i = 1; i < 10000; i++) { sum1 = 0; sum2 = 0; for (j = 1; j < i; j++) { if (i % j == 0) { sum1 += j; } } for (j = 1; j < sum1; j++) { if (sum1 % j == 0) { sum2 += j; } } if (sum2 == i && i < sum1 && sum1 < 10000) { printf("相亲数:%d,%d\n", i, sum1); printf("%d 的真因数之和为:%d", i, sum1); printf(" %d", sum2); printf("=%d\n", i); } } return 0; } 程序逻辑:首先使用两个for循环分别求出每个数的真因数之和sum1,以及sum1的真因数之和sum2,如果sum2等于该数i,并且i小于sum1和10000,那么就打印出这对相亲数以及它们的真因数之和。具体内容参见代码注释。 ### 回答3: 相亲数是指两个数,如果一个数的所有真因子(除了自己以外的因子)的和等于另一个数,并且这个另一个数的所有真因子的和也等于这个数,那么这两个数就是相亲数。 比如题目中提到的220和284就是一对相亲数。 求4位以内的相亲数,可以使用双重循环,枚举所有的4位数,对每个数,计算出其真因数之和,然后再枚举其他4位数,检查它们的真因数之和是否等于前一个数,如果是,则输出这对相亲数。 具体实现步骤如下: 1. 编写一个函数,用于计算一个数的所有真因数之和。遍历该数的所有可能因子(小于该数的一半),如果该因子是该数的因子,则把它加到真因数和上。 2. 使用双重循环枚举所有的4位数,对每个数,计算出其真因数之和。 3. 对于每个数,再次使用双重循环,枚举其他4位数,计算其真因数之和,并检查其是否等于前一个数,如果是,则输出这对相亲数。 实现代码如下: ```python def sum_of_proper_divisors(n): '''计算一个数的所有真因数之和''' s = 0 for i in range(1, n//2+1): if n % i == 0: s += i return s for a in range(1000, 10000): b = sum_of_proper_divisors(a) if b > a and sum_of_proper_divisors(b) == a: print("相亲数:%d,%d" % (a, b)) print("%d 的真因数之和为:%d" % (a, b)) print("%d 的真因数之和为:%d" % (b, a)) ``` 程序输出的结果如下: ``` 相亲数:1184,1210 1184 的真因数之和为:1210 1210 的真因数之和为:1184 相亲数:2620,2924 2620 的真因数之和为:2924 2924 的真因数之和为:2620 相亲数:5020,5564 5020 的真因数之和为:5564 5564 的真因数之和为:5020 相亲数:6232,6368 6232 的真因数之和为:6368 6368 的真因数之和为:6232 ``` 这些数对都是4位数以内的相亲数,其中第一对就是题目中提到的220和284。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值