a gen. base expansion program in Maple
Simon Plouffe
plouffe at math.uqam.ca
Wed Mar 4 22:41:14 CET 1998
## General base expansion program written by Simon Plouffe, April 1996.
## This program expand a real number with several algorithms and tries
## the gfun engine to find an expression for that number.
## There are 13 algorithms in all and 2 calling procedures.
## Gfun is a program in Maple that was originally written by F. Bergeron
## and Simon Plouffe and later greatly improved by Salvy and Zimmermann (INRIA)
## It is now part of the share package in Maple, to get it
## type with(share);readshare(gfun,calculus);
##
## Trydev and Tryhard
## They are both called with 1 parameter : the number.
## That number is evaluated in floating point within the procedure, so
## a call with Trydev(cosh(1)+sin(1)) will work.
## Both procedures accept numeric and symbolic answers, complex numbers
## are converted to absolute values.
## Trydev is using the convert(",ratpoly) of Maple to guess the rational
## fraction of the elements (in power series) of the expansion.
## Tryhard will use guessgf(",x) of the GFUN package. (5 minutes with 24
## digits precision).
##
## To test a number X , type Trydev(X); for a quick answer,
## Tryhard(X); for a deeper answer (longer)
###############################################################################
# Continued Fraction
#
# y(n) = [1/x(n)]
# x(n+1) = {1/x(n)}
#
#
r2cf:=proc(s)
local max,liste,S,liste2,nn;
S := evalf(abs(s));
max := 10^(Digits-2);
liste2:=convert(S,confrac);
nn:=nops(liste2)-3;
liste:=[op(1..nn,liste2)];
RETURN(liste);
end:
######################################################################
# Egyptian fraction
#
# y(n) = 1+[1/x(n)]
# x(n+1) = x(n)-1/y(n)
#
#
r2ef:=proc(s)
local max,liste,prod,S,T;
S := evalf(frac(abs(s)));
max := 10^(Digits-5);
prod := 1;
liste := [trunc(s)];
while prod <= max do
T := 1+trunc(1/S);
S := S-1/T;
liste := [op(liste),T];
prod := prod*T
od;
RETURN(liste);
end:
###############################################################################
# Egyptian product
#
# y(n) = 1+[1/x(n)]
# x(n+1) = {x(n)*y(n)}
#
#
r2ep:=proc(s)
local max,liste,prod,S,T;
S := evalf(frac(abs(s)));
max := 10^(Digits-5);
prod := 1;
liste := [trunc(s)];
while prod <= max do
T := 1+trunc(1/S);
S := frac(S*T);
liste := [op(liste),T];
prod := prod*T
od;
RETURN(liste);
end:
###############################################################################
# Alternated Egyptian fraction
#
# y(n) = [1/x(n)]
# x(n+1) = 1/x(n)-y(n)
#
#
r2aef:=proc(s)
local max,liste,prod,S,T;
S := evalf(frac(abs(s)));
max := 10^(Digits-5);
prod := 1;
liste := [trunc(s)];
while prod <= max do
T := trunc(1/S);
S := 1/T-S;
liste := [op(liste),T];
prod := prod*T
od;
RETURN(liste);
end:
###############################################################################
# Alternated Egyptian product
#
# y(n) = [1/x(n)]
# x(n+1) = 1-{(x(n)*y(n)}
#
r2aep:=proc(s)
local max,liste,prod,S,T;
S := evalf(frac(abs(s)));
max := 10^(Digits-5);
prod := 1;
liste := [trunc(s)];
while prod <= max do
T := trunc(1/S);
S := 1-frac(S*T);
liste := [op(liste),T];
prod := prod*T
od;
RETURN(liste);
end:
###############################################################################
# Base k algorithm
#
# y(n) = [k*x(n)]
# x(n+1) = {k*x(n)}
#
#
r2bk:=proc(s,b) local i,j,v,premier,fin;
v:=abs(evalf(s));
fin:=min(trunc(evalf(Digits/log10(b)))-5,32);
[trunc(v),seq(trunc(v*b**(i+1))-b*trunc(v*b**(i)),i=0..fin)];
end:
###############################################################################
# Factorial base
#
# y(n) = [n!*x(n)]
# x(n+1) = x(n) - y(n)/n!
#
#
r2fb:=proc(s)
local max,liste,prod,S,T,k;
S := evalf(frac(abs(s)));
max := 10^(Digits-2);
prod:=1;k:=1;
liste := [trunc(s)];
while prod <= max do
T := trunc(k!*S);
S := S-T/k!;
liste := [op(liste),T];
k:=k+1;
prod := prod*k;
od;
RETURN(liste);
end:
###############################################################################
r2p:=proc(s) local max,liste,prod,S,T;
S:=evalf(abs(s));
max:=10**(Digits-2);
if S>1 then
prod:=1:
liste:=[trunc(abs(s))];
while prod<=max do
T:=1+floor(1/(S-1));
S:=S/(T+1)*T;
liste:=[op(liste),T];
prod:=prod*T;
od;
elif S<1 then
prod:=1:liste:=[trunc(abs(s))];
while prod<=max do
T:=1+floor(1/abs(S-1));
S:=S/(T-1)*T;
liste:=[op(liste),T];
prod:=prod*T;
od;
fi;
RETURN (liste);
end:
Trydev:=proc(s)
local v,w,nn,aa,i,wildguess;
v:=evalf(s);
w:=1/v;
##################
r2cf(v);aa:=";
print(`guessing a gen. fun. for continued fraction : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ef(v);aa:=";
print(`guessing a gen. gun. for egyptian fraction of x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ep(v);aa:=";
print(`guessing a gen. gun. for egyptian product of x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ep(w);aa:=";
print(`guessing a gen. gun. for egyptian product of 1/x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ef(w);aa:=";
print(`guessing a gen. gun. for egyptian fraction of 1/x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2p(v);aa:=";
print(`guessing a gen. gun. for infinite product of x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2aep(v);aa:=";
print(`guessing a gen. gun. for alt. egyptian product of x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2aef(v);aa:=";
print(`guessing a gen. gun. for alt. egyptian fraction of x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else print(`FAIL`) fi;
##################
r2aep(w);aa:=";
print(`guessing a gen. gun. for alt. egyptian product of 1/x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2aef(w);aa:=";
print(`guessing a gen. gun. for alt. egyptian fraction of 1/x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2fb(v);aa:=";
print(`guessing a gen. gun. for factorial base of x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2fb(w);aa:=";
print(`guessing a gen. gun. for factorial base of 1/x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2bk(v,2);aa:=";
print(`guessing a gen. gun. for binary expansion of x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2bk(w,2);aa:=";
print(`guessing a gen. gun. for binary expansion of 1/x : `);
wildguess:=listtoratpoly(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
end:
Tryhard:=proc(s)
local v,w,nn,aa,i,wildguess;
v:=evalf(s);
w:=1/v;
##################
r2cf(v);aa:=";
print(`guessing a gen. fun. for continued fraction : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ef(v);aa:=";
print(`guessing a gen. gun. for egyptian fraction of x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ep(v);aa:=";
print(`guessing a gen. gun. for egyptian product of x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ep(w);aa:=";
print(`guessing a gen. gun. for egyptian product of 1/x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2ef(w);aa:=";
print(`guessing a gen. gun. for egyptian fraction of 1/x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2p(v);aa:=";
print(`guessing a gen. gun. for infinite product of x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2aep(v);aa:=";
print(`guessing a gen. gun. for alt. egyptian product of x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2aef(v);aa:=";
print(`guessing a gen. gun. for alt. egyptian fraction of x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else print(`FAIL`) fi;
##################
r2aep(w);aa:=";
print(`guessing a gen. gun. for alt. egyptian product of 1/x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2aef(w);aa:=";
print(`guessing a gen. gun. for alt. egyptian fraction of 1/x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2fb(v);aa:=";
print(`guessing a gen. gun. for factorial base of x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2fb(w);aa:=";
print(`guessing a gen. gun. for factorial base of 1/x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2bk(v,2);aa:=";
print(`guessing a gen. gun. for binary expansion of x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
r2bk(w,2);aa:=";
print(`guessing a gen. gun. for binary expansion of 1/x : `);
wildguess:=guessgf(aa,x);
if length(wildguess)<3*length(aa) then print(wildguess) else
print(`FAIL`) fi;
##################
end:
More information about the SeqFan
mailing list