| Ruud H.G. van Tol on Sat, 14 Dec 2024 20:29:14 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: quick ugly port of bellard.org/pi/pi1.c |
Ported it a bit deeper, used Mods:
pi_dec(n)= {
my( a=1, sum=0, N );
n>0||n=1;
N= floor((n + 20) * log(10) / log(13.5));
until( a > 3*N
, my( kq1=0, kq2=-1, kq3=-3, kq4=-2, av, den, num, s, v, vmax );
a= nextprime(a+1);
vmax= floor(log(3*N) / log(a));
if( a == 2, vmax+= (N - n); vmax > 0 || next );
av= a^vmax;
if( a == 2
, num= Mod( 1, av); v= -n
, num= Mod(2^n, av); v= 0
);
den= Mod(1, av);
s= Mod(0, av);
for( k=1, N
, my(t);
t= 2 * k;
if( (kq1+=2) >= a
, (kq1 % a) || until( t%a, t\= a; v-- )
);
num*= t;
t= 2 * k - 1;
if( (kq2+=2) >= a
, (kq2 % a) || until( t%a, t\= a; v-- )
);
num*= t;
t= 9 * k - 3;
if( (kq3+=9) >= a
, (kq3 % a) || until( t%a, t\= a; v++ )
);
den*= t;
t= 3 * k - 2;
if( (kq4+=3) >= a
, (kq4 % a) || until( t%a, t\= a; v++ )
);
if( a == 2, v++, t*= 2);
den*= t;
if( v > 0
, t= if( a == 2 || av%2, 1/den, 1);
t*= num * (25 * k - 3) * a^(vmax-v);
s+= t;
)
);
s*= 5^(n - 1);
sum= (sum + lift(s) / av) % 1.0;
);
printf("Decimal digits of pi at position %d: %09d\n"
, n
, floor(sum * 1e9)
);
return(0);
}
-- Ruud