(PARI)数字计数(n,基数=10)=本地(d);如果(n==0,返回(1));d=1+地板(对数(n)/对数(底座));而(n>=基数^d,d++);而(n<基数^(d-1),d--);d;
{
a(n)=
local(r,num2,num5,d,M,pLeft,mainP,searchP,fixed,x,rNeeded,y,nextP);
r=n;
d=数字计数(n);
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;
p左=n-num2-num5;
mainP=如果(num2==d,2,3);
搜索P=最小值(4,pLeft);
固定=2^num2*5^num5;
x=mainP^(pLeft-搜索P);
r需要=升力(Mod(r,M)/Mod(x,M));
while(bigmomega(rNeeded)!=搜索P,
r需要+=M
);
y=固定*x*r需要;
如果(mainP==2,
下一个P=3,
nextP=if(数字5==d,5,7)
);
while(searchP<pLeft&&fixed*x*nextP^(1+searchP)/mainP<y,
搜索P++;
x/=主P
);
r需要=升力(Mod(r,M)/Mod(x,M));
while(bigmomega(rNeeded)!=搜索P,
r需要+=M
);
return(固定*x*rNeeded);
}(结束)
|