亲和图实例

1 亲和图的定义 为研究因数和函数F(n)(正整数n除 n以外的 正因数之和)的性质以及完全数、相亲数对、多元亲和数链等问题,定义一个无限有向图 ——亲和图。 亲和图的顶点集与非负整数集一一对应,(下文中将用某非负整数指代它所对应的顶点),对顶点n,若F(n)=m,

 1 亲和图的定义

为研究因数和函数F(n)(正整数nn以外的正因数之和)的性质以及完全数、相亲数对、多元亲和数链等问题,定义一个无限有向图——亲和图。

亲和图的顶点集与非负整数集一一对应,(下文中将用某非负整数指代它所对应的顶点),对顶点n,若F(n)=m,则从n到m连一条有向边(n指向m),注意1指向0,0指向自己。

由以上定义得知:

1)亲和图的所有性质为正整数集固有,整个图随正整数集和因数定义的建立而确定。

2)亲和图中每个顶点出度都是1;入度不确定。

3)完全数6,28等引出的边指向自己。

4)相亲数对(220,284)等在图中呈现为一个两元环(220指向284;284指向220)。

我们希望得到图的其他性质,但无限图是不可能完全画出的。我们采取以下两个手段:一方面,我们希望知道对给定的一个点,哪些点指向这个点;另一方面,由于点给定时,它引出的路线也唯一确定,我们希望追踪这条路线通向哪里。

2 入度求解

0的入度为2,0和1指向它。

1的入度为无穷大。因为一个数直接指向1当且仅当它为素数,而素数有无穷多个。

对于0、1以外的数,我们说明,尽管图是无限的,每个顶点的入度只有有限多。

命题:

若F(n=m,则n≤(m1)

证明:

显然n是合数。当n不是平方数,取它除1以外最小的因数i,则n/i(不等于i)也是n的因数。此时有:

 

亦即

当n是平方数,它至少含因数,故有:

 

等号当且仅当是除1以外n的唯一因数时取得。

证毕。

根据这一命题,我们很容易写出求解入度的程序。

程序1:

功能:求mn之间每个数的入度和指向它的所有顶点,结果保存于D:/1.txt。

使用:输入m n;

作者:Nithouson

代码:C++)

#include <stdio.h>
#include <stdlib.h>

int SumofDivisors(int n)
{
    int i,s=1;
    for(i=2;i*i<n;i++)
    {
       if(n%i==0) s+=i+n/i;
    }
    if(i*i==n)
        return s+i;
    else
        return s;
}

int main()
{
    FILE*pad;
    pad=fopen("D://1.txt","w");
    int m,n,con,i;
    scanf("%d %d",&m,&n);
    int*s=(int*)malloc((n*n)*sizeof(int));
    for(i=2;i<=n*n;i++)
        s[i]=SumofDivisors(i);//空间换时间,预存所有因数和。
    for(int j=m;j<=n;j++)
    {
        fprintf(pad,"%d ",j);
        con=0;
        for(i=2;i<=n*n;i++)
        {
            if(s[i]==j)
            {
                con++;
                fprintf(pad,"%d ",i);
            }
        }
        fprintf(pad,"(%d)\n",con);
    }
    free(s);
    return 0;
}


我用此程序计算了1-1000的所有顶点入度,得出以下信息:

1)有些非0数入度0,如2、5、52、88、96等。事实上1到1000中共有89个数入度为0,而且它们中只有5是奇数。

2)100以内的入度最大值为9,在91和97取得;1000以内的最大值为56,在841取得。

3)奇数入度通常比附近的偶数入度多。事实上,2-1000中奇数的平均入度为17.060,而偶数的平均只有1.409,差异非常明显。10000以内偶数入度的最大值仅为5)

3 顶点集的盈亏

对一个顶点集,若总入度减总出度为正,称为盈余;否则称为亏损。

经计算2-100盈余162;2-1000盈余8234。这或许意味着F(n)有整体减小的趋势。

4 路径追踪

从一个顶点出发,不断沿引出的边前进,其实质是F(n)无限次迭代的过程。我们设想以下结果。

1)路线最终到达1,之后停在0。

2)路线进入一个闭环中(可能为完全数、相亲数对或多元亲和数链),之后一直在闭环中循环。

(形式上0也可理解为一个闭环,但(1)(2)的成因有很大不同,故分成两种情况)

是否只有以上这两种结局呢?理想上希望如此,但这尚需证明。而且,程序必须满足有限步终止原则,并且不能超出整数变量表达范围。所以追加两种情形:

3)某一步的值超出int的表达范围;

4)有限步后(这里定为10000步)尚未达成(1)(2)(3)中任何一条。

条件编译程序如下,它可选择输出希望获取的四种情况之一。

程序2:

功能:求mn之间每个数的前进路线和路线长度,结果保存于D:/1.txt。

使用:输入m n;

作者:Nithouson

代码:C++)

#include <stdio.h>
#include <stdlib.h>
#define ONE 1 //到1终止
#define LOOP 2 //进入闭环
#define BEYONDLIM 3 //超过2147483647
#define OVERLONG 4 //运行超过10000次
 
int SumofDivisors(int n)
(同程序1)
int main()
{
    FILE*pad;
    pad=fopen("D://1.txt","w");
    int m,n;
    const int MAX=10000; //迭代次数上限
    scanf("%d %d",&m,&n);
    int s[MAX];
    for(int i=m;i<=n;i++)
    {
        int j,br=0,p;
        s[0]=i;
        for(j=1;j<MAX;j++)
        {
            s[j]=SumofDivisors(s[j-1]);
            if(s[j]<0) //超出2147483647后int会读成负数
            {
                #ifdef BEYONDLIM
                for(p=0;p<=j-1;p++)
                {
                    fprintf(pad,"%d->",s[p]);
                }
                fprintf(pad,"Beyond Limit\n");
                #endif // BEYONDLIM
                break;
            }
            if(s[j]==1)
            {
                #ifdef ONE
                for(p=0;p<=j-1;p++)
                {
                    fprintf(pad,"%d->",s[p]);
                }
                fprintf(pad,"1 (%d)\n",j);
                #endif // ONE
                break;
            }
            for(int k=0;k<=j-1;k++)
            {
                if(s[j]==s[k])
                {
                    #ifdef LOOP
                    for(p=0;p<=j-1;p++)
                    {
                        fprintf(pad,"%d->",s[p]);
                    }
                    fprintf(pad,"%d (%d)[%d]\n",s[j],j,j-k);
                    //j为前进总步数,j-k为闭环长
                    #endif // LOOP           
 }
            if(br)
            {
                br=0;
                break;
            }
        }
        if(j==MAX)
        {
            #ifdef OVERLONG
            for(p=0;p<=j-1;p++)
            {
                fprintf(pad,"%d->",s[p]);
            }
            fprintf(pad,"To Be Continued\n");
            #endif
        }
    }
    return 0;
}


100000以内的数进行分类追踪,发现至少有80723个数都回到1。至少有2073个数进入闭环。有17204个数超出int范围,它们中也会有一部分最终回到1,另一部分进入闭环,是否还有一部分真的永不重复(那意味着序列无上界)?没有数超出次数的界限。

5 亲和图的结构与闭环

到这里我们对亲和图的结构有了大致的认识。1(或0)是大多数数的归宿,如百川汇海。完全数、相亲数,亲和数链则是一少部分数的吸引子。

1以外的任一个节点,我们可以任意有限阶数地追踪它的来源,即先求指向它的数,再求指向指向它的数的数,以此类推。对于闭环,我们也可以对它进行来源追踪,称为闭环的来源k阶展开

10万以内的完全数只有6,28,496,8128四个。6的3阶展开为(图1)

10万以内的相亲数13对,以220和284为例1阶展开(图2)


 

三元亲和数链在较小整数范围内没有解。值得一提的是五元亲和数链12496-14288-15472-14536-14264,五个数大小类似又都不大,用来象征奥运五环、五洲和谐再合适不过了。另一个较小的环有28元,14316-19116-31704-47616-83328-177792-295488-629072-589786-294896-358336-418904-366556-274924-275444-243760-376736-381028-285778-152990-122410-97946-48976-45946-22976-22744-19916-17716。用程序2的LOOP模式,再加环长不小于3的条件,就能发现这个环。我还用程序2验证了:涉及10万以内数,长度不小于3,且没有数超出int范围的闭环只有以上的一个5元环和一个28元环。

6 未竟的事业

亲和图中的重大问题还有很多有待解决,如:

1)任一点出发最终回到1或进入闭环的猜想是否正确?

2)如何解释奇数的入度普遍多于偶数这一事实?

3)亲和图中是否存在孤立结构(即一个顶点集,既没有从集合内指向集合外的边,又没有从集合外指向集合内的边)?

对于闭环,也有一系列问题。相亲数是否有无穷多对?两数差最小是多少,是不是26(1184,1210)?差最大是否有无穷大?三元及以上的亲和数链,是否有无穷多?

感觉上说,如果说完全数尚有规律可把握,多元的亲和数链则显得离散,有巧合的成分(只要算出的F(n)之前碰巧出现过,就成环了)。每个数因数分解性质的不同,为理论上整体把握亲和图的性质带来了困难。更大规模的计算与绘图,或许会给我们带来更多新发现。

2017年1月8日

17:39:28

知秋君
上一篇 2024-09-01 17:36
下一篇 2024-09-01 17:02

相关推荐