(phixonline)-->
with javascript_semantics
include mpfr.e
procedure D(mpz n)
integer s = mpz_cmp_si(n,0)
if s<0 then mpz_neg(n,n) end if
if mpz_cmp_si(n,2)<0 then
mpz_set_si(n,0)
else
sequence f = mpz_prime_factors(n)
integer c = sum(vslice(f,2)),
f1 = f[1][1]
if c=1 then
mpz_set_si(n,1)
elsif c=2 then
mpz_set_si(n,f1 + iff(length(f)=1?f1:f[2][1]))
else
assert(mpz_fdiv_q_ui(n,n,f1)=0)
mpz d = mpz_init_set(n)
D(n)
mpz_mul_si(n,n,f1)
mpz_add(n,n,d)
end if
if s<0 then mpz_neg(n,n) end if
end if
end procedure
sequence res = repeat(0,200)
mpz n = mpz_init()
for i=-99 to 100 do
mpz_set_si(n,i)
D(n)
res[i+100] = mpz_get_str(n)
end for
printf(1,"%s\n\n",{join_by(res,1,10," ",fmt:="%4s")})
for m=1 to 20 do
mpz_ui_pow_ui(n,10,m)
D(n)
assert(mpz_fdiv_q_ui(n,n,7)=0)
printf(1,"D(10^%d)/7 = %s\n",{m,mpz_get_str(n)})
end for