/*martin_n_fuller@btinternet.com2008年2月1日计算A005245、A005520、A005421的程序A005245(1)=1A005245(n)=最小值{A005244(x)+A005246(y):x+y=n或x*y=n}A005520(n)=最小m,A005245(m)=nA005421(n)=m的数量,A005245(m)=n要检查反例的猜想:大卫·威尔逊[2]:最小值{A005245(x)+A005244(y):x+y=n}=A00524五(n-1)+1(反例n=21080618是CD_Eater在俄罗斯论坛lib.mexmat.ru上提出的,并由Max Alekseyev验证。该程序确认它是最小的。)大卫·威尔逊[3]:A005245(n)=最小值(此程序查找最小反例n=353942783和n=516743639)UPINT段F26:A005245(p)=A005244(p-1)+1,对于p素数。([3]的最小反例也是质数,所以p=353942783是反例)计算A005245的程序:1.创建一个足够大的数组来存储序列值并用一个固定的上限填充它。2.设置A(1)=13.从n=2开始的回路a.循环以确认的所有顺序项开始,以及两个乘数<n都被检查为数组中新最小值的所有乘积。b.检查所有附加值A(m)+A(n-m)。这证实了序列中的项n。c.检查从n*2到n^2的所有乘法,并将任何改进的最小值存储在数组中。d.现在准备继续下一个循环。优化步骤3b:想要找到A(m)+A(n-m)<目前为止最好的。设置目标=目前为止最好的-1。我们知道m>A000792(k)意味着A(m)>k。因此,如果A000792(k)+A000792。函数A000792(k)+A000792。找到具有潜在解决方案的最大k<=目标/2后,检查所有m<=A000792(k)。在这个程序中,我们想找到大卫·威尔逊猜想的反例[2],所以我们将目标从(目前为止最好的)-1放宽到已知的A(n-1)值。无需使用A(m)=A(m-1)+1检查任何m,因为它们不能优于A(m-1)。未来扩展:这个程序是内存密集型的,这限制了它的范围。但由于步骤3b中的优化,没有必要同时存储所有序列。所需要做的就是为加法提供足够的最新项,然后为乘法提供n/2、n/3等。解决方案1:最近的术语可以保存在一个小数组中,根据乘法的需要进行筛选。这将使射程立即翻倍。解决方案2:这个想法可以扩展,对n/2、n/3等使用更多的小数组,直到商足够小。随着条款的重新计算,程序将放慢速度,但我预计10^10将持续一整夜。*/#包括#包括typedef无符号字符A005245_value_t;typedef结构{无符号大小;A005245_value_t*数组;}A005245Array_t;#define MAX_A005245_VALUE 127/*保持安全系数为2以避免溢出*/未签名的A000792(A005245_值_t n){无符号结果=1;而(n>=5|n==3){结果*=3;n-=3;}返回结果<<(n/2);}空隙A005245_免费(A005245Array_t*a){a->大小=0;自由(a->数组);a->数组=0;}整数A005245_init(A005245Array_t*a,无符号大小){无符号i;A005245_免费(a);a->数组=(A005245_value_t*)malloc(size*sizeof(A00545_value_t));if(一个->数组){a->尺寸=尺寸;a->数组[1]=1;对于(i=2;i<大小;i++)a->数组[i]=最大值(MAX_A005245_VALUE);}return(一个->数组!=0);}空隙A005245_additions_to_n(A005245Array_t*a,无符号n){无符号极限m,m;A005245_value_t目标,k;if(a->array[n]>a->array[n-1]+1)a->数组[n]=a->数组[1]+1;目标=a->阵列[n-1];k=目标/2;而(A000792(k)+A000792)(目标-k)<n)k--;limit_m=A000792(k);/*之前已经使用了m=1,不需要m=2..5,因为它们不能比m=1更好*/对于(m=6;m<=limit_m;m++){if(a->数组[n]>a->数组[m]+a->数组(n-m)){printf(“[3]的反例:A(%u)+A(%u)=%u<猜想(%u,m、 n-m,(无符号)(a->array[m]+a->array[n-m]),n,(unsigned)a->array[n]);a->数组[n]=a->数组[m]+a->数组(n-m);}else if(a->array[n-1]+1>a->array[m]+a->ararray[n-m])printf(“[2]的反例:A(%u)+A(%u)=%u<A(%u-1)+1=%u\n”,m、 n-m,(无符号)(a->array[m]+a->array[n-m]),n,(unsigned)a->array[n-1]+1);}}空隙A005245_多重复制_from_n(A005245Array_t*a,无符号n){无符号m,mn;对于(m=2,mn=2*n;(m<=n)&&(mn<a->大小);m++,mn+=n)if(a->array[mn]>a->array[m]+a->array[n])a->array[mn]=a->array[m]+a->ararray[n];}整数main(int argc,char*argv[]){无符号n=0;A005245_阵列_t A005245;A005245_值_t A005520_n,A000792_n;无符号A000792_value;无符号A005421[MAX_A005245_VALUE+1];如果(argc>1)sscanf(argv[1],“%u”,&n);如果(n<2){printf(“语法:A005245 limit \n”);返回1;}如果(!A005245_init(&A005245,n)){A005245_免费(&A005245);printf(“内存不足”);返回2;}A005520_n=1;A000792_n=A000792_value=2;对于(n=0;n<=MAX_A005245_VALUE;n++)A005421[n]=0;对于(n=2;n<A005245.size;n++){A005245_additions_to_n(&A005245,n);A005245_复制_来自n(&A005245,n);如果(A005520_n<A005245.数组[n]){A005520_n=A005245.数组[n];printf(“A005520(%u)=%u\n”,(无符号)A005520_n,n);}A005421[A005245.array[n]]++;如果(n>=A000792_value){printf(“A005421(%u)=%u\n”,(无符号)A000792_n,A005421[A000792_n]);A000792_n++;A000792_value=A000792(A000792_n);}}A005245_免费(&A005245);返回0;}