29 lines
837 B
Text
29 lines
837 B
Text
include mpfr.e
|
|
|
|
sequence lf_list
|
|
|
|
procedure init(integer n)
|
|
mpz f = mpz_init(1)
|
|
lf_list = repeat(f,n+1)
|
|
for i=1 to n do
|
|
f = mpz_init_set(f)
|
|
mpz_mul_si(f,f,i)
|
|
lf_list[i+1] = f
|
|
end for
|
|
end procedure
|
|
|
|
function lf(integer n, bool len=false)
|
|
-- Returns left factorial of n, or it's length, as a string
|
|
mpz sumf = mpz_init(0)
|
|
for k=1 to n do mpz_add(sumf,sumf,lf_list[k]) end for
|
|
return iff(len?sprintf("%d",mpz_sizeinbase(sumf,10))
|
|
:mpz_get_str(sumf))
|
|
end function
|
|
|
|
-- Main procedure
|
|
atom t0 = time()
|
|
init(10000)
|
|
for i=0 to 10 do printf(1,"!%d = %s\n",{i,lf(i)}) end for
|
|
for i=20 to 110 by 10 do printf(1,"!%d = %s\n",{i,lf(i)}) end for
|
|
for i=1000 to 10000 by 1000 do printf(1,"!%d contains %s digits\n",{i,lf(i,true)}) end for
|
|
printf(1,"complete (%3.2fs)\n",{time()-t0})
|