//OEIS A092671://“编号n,以便方程有解//1=1/x_1+…+1/x_k(对于任何k),0<x_1<…<x_k=n。”bOutputForbFile:=true;bShowSolns:=false;itos:=IntegerToString;n最大值:=1810;//测试的最大n//(在Magma Calculator上运行此程序// http://magma.maths.usyd.edu.au/calc///在约0.3秒内产生1000个项)//最大值:=15934;//测试的最大n////(在Magma Calculator上运行此程序// // http://magma.maths.usyd.edu.au/calc/////在约4秒内生成10000个项)存储最大值:=14;//23导致岩浆计算器内存不足//mStoreMax不足以证明n的最小值n//对于mStoreMax=1..22,是否在序列中:// [ 10, 21, 44, 78, 152, 259, 423, 1199, 2453, 4188, 8359, 8359, 15472, 37095,// 52144, 102014, 133220, 180622, 427161, 427161, 678696, 979238]//建立一个包含整数1..mStoreMax倒数的所有子集和的表;//第m行将包含总和中包含1/m的所有子集总和。s: =[0/1];//空和,存储为分数对于[1..mStoreMax]do中的mr: =1/m;d: =2^(m-1);//表格新行的偏移量因为我在[1..d]做s[i+d]:=s[i]+r;结束;结束;providedInCount:=0;providedOutCount:=0;故障计数:=0;//特殊情况:n=1n: =1;bIsInSeq:=[true];//1为序列A092671providedInCount+:=1;termCount:=1;//序列中的第一项如果bOutputForbFile,则术语计数,n;//输出到b文件结束条件:;[2..nMax]do中的n如果IsPrimePower(n),则bIsInSeq[n]:=假;provedOutCount+:=1;其他的//求除n的最大素数幂F: =因式分解(n);pAtPP最大值:=F[1][1];PPmax:=pAtPPmax^F[1][2];对于[2..#F]do中的ip: =F[i][1];PP:=p^F[i][2];如果PP大于PPmax,则PPmax:=PP;pAtPP最大值:=p;结束条件:;结束;m: =n div PPmax;如果m le mStoreMax,则b解决方案:=false;//初始化b溶液不可能:=true;//初始化对于[2^(m-1)+1..2^m]do中的i如果分子[i]mod pAtPPmax eq 0,则i1stGoodSumInS:=i;b解决方案:=true;b溶液不可能:=false;断裂;结束条件:;结束;如果bSolnImpossible,则providedOutCount+:=1;结束条件:;其他的b解决方案:=false;//初始化b溶液不可能:=false;//无法使用表s[]排除这种可能性rm:=1/m;对于[1..#s]中的i dot: =s[i]+rm;如果分子(t)mod pAtPPmax eq 0,则i1stGoodSumInS:=i;b解决方案:=true;断裂;结束条件:;结束;如果不是b解决方案可能性,那么""; “mStoreMax太小的第一个n:”,n;断裂;结束条件:;结束条件:;如果bSolnImpossible,则bIsInSeq[n]:=错误;else//搜索解决方案(我的猜想:存在解决方案)bSolnFound:=false;总和:=1/n;xSet:={n};//单位分数求和分母中的整数集b成功:=false;如果PPmax ^2 gtn,则//(根据经验,此阈值似乎可以正常工作)//使用表s[]中的第一个良好结果//得到一组整数(包括n)//其倒数和没有PPmax//作为分母中的一个因素sumBest:=0/1;xSetBest:={};如果m gt mStoreMax,则//m未在i1stGoodSumInS-1中编码x加:=m*PPmax;xSetBest:=包含(xSetBest,xAdd);sumBest+:=1/xAdd;结束条件:;t: =i1stGoodSumInS-1;毫米:=0;虽然t gt 0做毫米+:=1;如果t mod 2 eq 1,则x加:=mm*PPmax;xSetBest:=包含(xSetBest,xAdd);sumBest+:=1/xAdd;结束条件:;t: =t div 2;结束while;如果分子(sumBest)等于1,则DBest:=分母(sumBest);如果bIsInSeq[DBest],则b成功:=true;elif DBest mod 2 eq 0则//denom为偶数如果IsPrimePower(DBest),则//denom的pwr为2b成功:=true;结束条件:;结束条件:;结束条件:;如果不是bSuccess,那么sum:=sumBest;xSet:=xSetBest;结束条件:;结束条件:;如果不是b成功,则while sum lt 1 do(当总和为1时)xSet0:=xSet;D0:=分母(总和);F0:=因式分解(D0);FF0:=F0[#F0];PMax0:=FF0[1];PMaxPwr0:=PMax0^FF0[2];mMax:=n div PMaxPwr0;F试验:=F0;xSetBest:=xSet0;sumBest:=总和;b成功:=false;//看起来(无论如何,对于n<=90000)添加了更多//很少需要一个以上的倒数,但如果需要,//需要三个,永远不需要三个以上。//(但这取决于经验“如果PPmax^2 gtn”//阈值高于。)//尝试添加一个倒数对于[1..mMax]中的m1 doxAdd1:=m1*PMaxPwr0;如果xSet0中没有xAdd1,则总和测试:=总和+1/xAdd1;DTest:=分母(sumTest);如果DTest mod PMaxPwr0 ne 0,则如果D测试等式1,则b改进:=true;其他的b改进:=false;//初始化FTest:=因子分解(DTest);对于[#FTest..1 by-1]do中的kTestkBest:=kTest+#FBest-#FTest;如果kBest eq为0,则断裂;elif FTest[kTest][1]lt FBest[kBest][1]然后b改进:=true;断裂;elif FTest[kTest][1]gt FBest[kBest][1]然后断裂;else//即FTest[kTest][1]=FBest[kBest][1]如果FTest[kTest][2]lt FBest[kBest][2],则b改进:=true;断裂;结束条件:;结束条件:;结束;结束条件:;如果b改善了,那么xSetBest:=包含(xSet0,xAdd1);F试验:=F试验;sumBest:=sumTest;如果分子(sumBest)等于1,则DBest:=分母(sumBest);如果bIsInSeq[DBest],则b成功:=true;elif DBest mod 2 eq 0则//denom为偶数如果IsPrimePower(DBest),则//dnm的pwr为2b成功:=true;结束条件:;结束条件:;如果bSuccess,则断裂;结束条件:;结束条件:;结束条件:;结束条件:;结束条件:;结束;如果bSuccess,则断裂;结束条件:;如果sumBest eq sum,则//无改进//试着加上两个倒数对于[1..mMax-1]中的m1 doxAdd1:=m1*PMaxPwr0;如果xSet0中没有xAdd1,则对于m2 in[m1+1…mMax]doxAdd2:=m2*PMaxPwr0;如果xSet0中没有xAdd2,则总和测试:=总和+1/xAdd1+1/xAdd.2;DTest:=分母(sumTest);如果DTest mod PMaxPwr0 ne 0,则如果D测试等式1,则b改进:=true;其他的b改进:=false;//初始化FTest:=因子分解(DTest);对于[#FTest..1 by-1]do中的kTestkBest:=kTest+#FBest-#FTest;如果kBest eq为0,则断裂;elif FTest[kTest][1]lt FBest[kBest][1]然后b改进:=正确;断裂;elif FTest[kTest][1]gt FBest[kBest][1]然后断裂;else//即FTest[kTest][1]=FBest[kBest][1]如果FTest[kTest][2]lt FBest[kBest][2],则b改进:=正确;断裂;结束条件:;结束条件:;结束;结束条件:;如果b改善了,那么xSetBest:=包含(xSet0,xAdd1);xSetBest:=包含(xSetBest,xAdd2);F试验:=F试验;sumBest:=sumTest;如果分子(sumBest)等于1,则DBest:=分母(sumBest);如果bIsInSeq[DBest],则b成功:=true;elif DBest mod 2 eq 0则//denom为偶数如果IsPrimePower(DBest),则//denom为2的pwrb成功:=true;结束条件:;结束条件:;如果bSuccess,则断裂;结束条件:;结束条件:;结束条件:;结束条件:;结束条件:;结束;如果bSuccess,则断裂;结束条件:;结束条件:;结束;如果bSuccess,则断裂;结束条件:;结束条件:;如果sumBest eq sum,则//无改进//试着加上三个倒数对于[1..mMax-2]中的m1 doxAdd1:=m1*PMaxPwr0;如果xSet0中没有xAdd1,则对于m2 in[m1+1…mMax-1]doxAdd2:=m2*PMaxPwr0;如果xSet0中没有xAdd2,则对于m3 in[m2+1…mMax]doxAdd3:=m3*PMaxPwr0;如果xSet0中没有xAdd3,则总和测试:=总和+1/xAdd1+1/xAdd2+1/xAdd.3;DTest:=分母(sumTest);如果DTest mod PMaxPwr0 ne 0,则如果D测试等式1,则b改进:=正确;其他的b改进:=false;//初始化FTest:=因子分解(DTest);对于[#FTest..1 by-1]do中的kTestkBest:=kTest+#FBest-#FTest;如果kBest eq为0,则断裂;elif FTest[kTest][1]lt FBest[kBest][1]然后b改进:=true;断裂;elif FTest[kTest][1]gt FBest[kBest][1]然后断裂;else//即FTest[kTest][1]=FBest[kBest][1]如果FTest[kTest][2]lt FBest[kBest][2],则b改进:=true;断裂;结束条件:;结束条件:;结束;结束条件:;如果b改善了,那么xSetBest:=包含(xSet0,xAdd1);xSetBest:=包含(xSetBest,xAdd2);xSetBest:=包含(xSetBest,xAdd3);FBest:=F测试;sumBest:=sumTest;如果分子(sumBest)等于1,则DBest:=分母(sumBest);如果bIsInSeq[DBest],则b成功:=true;elif DBest mod 2 eq 0则//denom为偶数如果IsPrimePower(DBest),则//denom的pwr为2b成功:=true;结束条件:;结束条件:;如果bSuccess,则断裂;结束条件:;结束条件:;结束条件:;结束条件:;结束条件:;结束;如果bSuccess,则断裂;结束条件:;结束条件:;结束;如果bSuccess,则断裂;结束条件:;结束条件:;结束;如果bSuccess,则断裂;结束条件:;结束条件:;如果sumBest eq sum,则//无改进中断;//失败!结束条件:;xSet:=xSetBest;sum:=sumBest;结束时;结束条件:;bIsInSeq[n]:=真;//(但只有在未发生故障的情况下才能证明这一点)如果bSuccess,则provedInCount+:=1;如果是bShowSolns,则itos(n)*“:”,sumBest,xSetBest;结束条件:;termCount+:=1;如果bOutputForbFile,则术语计数,n;结束条件:;else//失败failureCount+:=1;n,“=”,itos(n div PPmax)*“*”*itos(PPmax,s[i1stGoodSumInS],Intseq(i1stGoodSumInS-1,2);如果总和ne 1/n,则“***至少通过1次改进后失败***”;总和,“=”,xSet;断裂;结束条件:;结束条件:;结束条件:;结束条件:;结束;"";“[1..”*itos(nMax)*“]中整数n的数量,其中”;“证明n在A092671中:”,provedInCount;“已证明n不在A092671中:”,provedOutCount;“程序无法证明任何结果:”,failureCount;