(PARI)数字计数(n,基数=10)=本地(d);如果(n==0,返回(1));d=1+地板(对数(n)/对数(底座));而(n>=基数^d,d++);而(n<基数^(d-1),d--);d;
leastCombo(numPrimes,firstPrime,limit,M,r;
lcHelper(left,i,limit,minimum,found,nextP,M,r)=本地(p);if(left==0,返回(if(找到%M==r,找到,限制));p=质数(i);limit=lcHelper(left-1,i+1,limit,minimum,found*p,nextP,M,r);if(minimum*prime(nextP)/p<=limit,limit=lcHelper(left,i+1,limit),minimum*prime(nextP,/p,found,nextP+1,M,r));极限;
{
\如果此函数的假设失败,则返回0;否则返回正确答案。默认值为3和40时,在前1000个术语中不会发生故障。
a(n,searchP=3,searchSize=40)=
局部(r,num2,num5,d,M,pLeft,assumedP,fixed,x,rNeeded,y,best,z,zz,j,z3,pLimit);
r=n;
d=数字计数(n);
如果(n<7,
而(ω(r)!=n、 r+=10);
返回(r)
);
while(num2<d&&!(r%2),
num2++;
r=r/2
);
while(num5<d&&!(r%5),
数字5++;
r=r/5
);
M=10^d/2^num2/5^num5;
pLeft=n-如果(num2,1,0)-如果(num5,1,O);
搜索P=3;
搜索大小=40;
固定=2^num2*5^num5;
假设P=pLeft-搜索P;
x=3*prod(i=4,假设P+2,素数(i));
r需要=升力(Mod(r,M)/Mod(x,M));
最佳=素数(n+40)^searchP;
forvec(v=向量(searchP,i,[假设P+3,假设P+searchSize+2]),y=prod(i=1,searchP、prime(v[i]));如果(y%M==r需要,最佳=min(最佳,y)),2);
如果(最佳==searchP^prime(n+40),则返回(0));
y=固定*x*最佳;
z=固定*x*prod(i=假设P+3,pLeft+2,素数(i));
如果(z>=2*y,返回(0));
r需要=升程(Mod(r,M)/3);
return(固定*3*leastCombo(pLeft-1,4,y/fixed/3,M,rNeeded));
}(结束)
|