趣味数学及编程拓展
上QQ阅读APP看书,第一时间看更新

1.5 完全数与p-完全数

完全数是数学家们研究最多也是最热的一类整数,其中是否存在奇完全数还是尚无答案、留有悬念的问题。

本节在探索完全数的基础上,引入因数比的概念,进一步引申与探索因数比为大于1的正整数p的p-完全数。

1.5.1 完全数

若正整数n的所有小于n的正因数之和若等于n本身,则称数n为完全数,又称完美数。例如,6的小于6的正因数为1,2,3,而6=1+2+3,则6是一个完全数。

试探求指定区间[x,y]内的完全数。

1. 设计要点

对指定区间[x,y]中的每一个整数a实施枚举判别。根据完全数的定义,为了判别整数a是不是完全数,用试商判别法找出a的所有小于a的因数k。

注意到1是任何整数的因数,先把因数1定下来,即因数和s赋初值1。

注意到整数a若为非平方数,它的大于1小于a的因数成对出现,其中较小的因数要小于a的平方根sqrt(a)。因此,在作赋值b=sqrt(a)之后,因数k的循环可设置从2到b来完成,大大减少k循环次数,缩减程序的运行时间。

若整数a恰为整数b的平方,此时b为a的一个因数而不是一对,注意到因数b加了两次,应把多加一次的b从s中减去。

结束循环后,如果a=s,整数a即为完全数。特别指出,若整数a为完全数又是奇数,即找到了“奇完全数”,这是一个令人鼓舞的发现,作特别说明。

为了检验找到的完全数并输出其各个因数,对找到的完全数a实施2~a/2的逐个检验是否为因数,输出该因数并求和s0。如果a=s0,即应用另因数分解法通过验证无误,则输出“(已通过验证。)”。

2. 程序设计
3. 程序运行示例与说明

程序对区间内的所有整数实施分解检验,没有发现奇完全数。至今为止,寻找到的完全数都是偶完全数。

本程序应用两种不同的方法分解因数求和验证,并输出找到的完全数的各个因数,这是程序的特色。

是否存在奇完全数,目前既不能证明,也不能否定,还有待数学家进一步的研究探讨。

1.5.2 p-完全数

设正整数a的小于其本身的因数之和为s,定义比值

p(a)=s/a

为整数a的因数比。

事实上,完全数是因数比为1的整数。例如,p(6)=1,6为完全数。

若整数的因数比为某一大于1的整数p,则称该整数为p-完全数。

例如,p(120)=2,则120为2-完全数;p(32 760)=3,则32 760为3-完全数。

试搜索指定区间[x,y]中的完全数与p-完全数。若区间中没有完全数与p-完全数,探求并输出区间中哪一整数的因数比最接近某一正整数。

1. 设计要点

为扩大整数的范围,相关变量设置为double型。

为了求整数a的真因数和s,设置k(2~sqrt(a))循环枚举,如果k是a的因数,则a/k也是a的因数,通过迭代s=s+k+a/k;求取a的因数和s。

同样,如果a=b∗b,显然k=b,a/k=b,此时k=a/k。而因数b只有一个,所以此时必须从和s中减去一个b,这样避免重复计算的处理是必要的。

设置min存储因数比与正整数差值的最小值。通过计算s,t=s/a及与正整数d的最小差距c=t-d(c≥0):若c=0,此时的因数比t为正整数,通过数组p,q存储a及其因数比;若c>0,说明其因数比t非正整数,则通过与min比较,记录其因数和s1与因数比t1,求取因数比最接近的正整数d1。

2. 程序设计
3. 程序运行示例与说明

在区间[100,40 000]中搜索到p=1,2,3的p-完全数各两个。

在区间[10 000,20 000]中没有p-完全数,则输出其因数比最接近的整数16 384。

程序还可探求到因数比为4的4-完全数,如下所示。

     请输入区间x,y:518666803000,518666804000
       p(518666803200)=4

是否存在5-完全数或6-完全数?笔者猜想存在p-完全数的整数p是无限的,只是当p>4时的p-完全数会更加庞大,其探求过程也更为复杂。