fricas
(1) -> <spad>
fricas
)abbrev package ZEIL Zeilberger
++ Author: $author
++ Date Created: $defaultdate
++ License: BSD
++ References:
++ Description:
++
Zeilberger() : Exports == Implementation where
R ==> Integer
X ==> Expression R
XX ==> (X,X)->X
OF ==> OutputForm
SUP ==> SparseUnivariatePolynomial
FPX ==> FRAC SUPX
NNI ==> NonNegativeInteger
SYM ==> Symbol
SUPX ==> SUP(X)
NIXX ==> (NNI,X,X) -> X
EFSP ==> ElementaryFunctionStructurePackage(R,X)
TSPR ==> TransSolvePackage R
LEQX ==> List Equation X
EQSR ==> Record(eqs:LEQX,unk:List X,cert:X)
nz ==> normalize$EFSP
Exports == with
term : (XX,NNI,X) -> X
termRatio : (XX,NNI,X) -> Record(p0:X,r:X,s:X)
gosper : (SUPX,SUPX) -> Record(pa:SUPX,pb:SUPX,pc:SUPX)
upperBound : (Record(pa:SUPX,pb:SUPX,pc:SUPX),SUPX) -> Union(Integer,"failed")
equationsSetup : (XX,NNI,X) -> EQSR
solveEquations: EQSR -> Union(LEQX,"failed")
recEq: (XX,NNI,X) -> Union(Equation X,"failed")
Implementation == add
term(F:XX,J:NNI,k:X):X ==
n:X:='n::X
t:List(X):=[subscript('a,[j::OF])::X*F(n+j::X,k) for j in 0..J]
reduce(_+,t)
termRatio(F:XX,J:NNI,k:X):Record(p0:X,r:X,s:X) ==
n:X:='n::X
--q:X:=nz( term(F,J,k+1::X)/term(F,J,k) )
r12:=nz(F(n,k+1::X)/F(n,k))
s12:=nz(F(n,k)/F(n-1::X,k))
r1:=numerator r12
r2:=denominator r12
s1:=numerator s12
s2:=denominator s12
P1:=(j:NNI):X+->reduce("*",[eval(s1,n,n+j::X-i::X) for i in 0..j-1],1)
P2:=(j:NNI):X+->reduce("*",[eval(s2,n,n+l::X) for l in j+1..J],1)
p:List(X):=[subscript('a,[j::OF])::X * P1(j) * P2(j) for j in 0..J]
p0:=nz(reduce(_+,p))
u1:List(X):=[eval(s2,n,n+l::X) for l in 1..J]
u2:List(X):=[eval(s2,[n=n+l::X,k=k+1::X]) for l in 1..J]
r:= r1 * reduce("*",u1,1)
s:= r2 * reduce("*",u2,1)
qrs:=nz(r/s)
[p0,numerator qrs,denominator qrs]
gosper(r:SUPX,s:SUPX):Record(pa:SUPX,pb:SUPX,pc:SUPX) ==
lcr:=leadingCoefficient r
lcs:=leadingCoefficient s
Z:=lcr/lcs
r:=r/lcr
s:=s/lcs
h:X:='h::X
single:=create()$SingletonAsOrderedSet
Rh:X:=resultant(r,eval(s,single,single::SUPX+h::SUPX))
Rh0:List Equation X:=solve(Rh=0,'h)$TransSolvePackage(R)
nums:List X:=[rhs z for z in Rh0|integer?(rhs z)$IntegerRetractions(X)]
ints:List Integer:=[retract(u) for u in nums]
S:=[u for u in ints | u >=0 ]
--output("** NNI zeroes of the resultant: ",S::OutputForm)$OutputPackage
N:=#S
p:=[subscript('p,[j::OF])::X::SUPX for j in 0..N]
q:=[subscript('q,[j::OF])::X::SUPX for j in 0..N]
w:=[subscript('w,[j::OF])::X::SUPX for j in 1..N]
p.1:=r
q.1:=s
for j in 1..N repeat
w.j:=gcd(p.j,eval(q.j,single,single::SUPX+(S.j)::SUPX))
p.(j+1) := numer(p.j / w.j)
q.(j+1) := numer(q.j / eval(w.j,single,single::SUPX-(S.j)::SUPX))
a:=Z*p.(N+1)
b:=q.(N+1)
P1:=(i:NNI):SUPX+->reduce("*",[eval(w.i,single,single::SUPX-j::SUPX) for j in 1..S.i],1)
c:=reduce("*",[P1(i) for i in 1..N],1)
[a,b,c]
upperBound(g:Record(pa:SUPX,pb:SUPX,pc:SUPX),p0:SUPX):Union(Integer,"failed") ==
single:=create()$SingletonAsOrderedSet
a:SUPX:=g.pa
b:SUPX:=g.pb
c:SUPX:=g.pc * p0
lc ==> leadingCoefficient
BA:X:=lc(eval(b,single,single::SUPX-1::SUPX)-a)
if degree(a) ~= degree(b) or lc a ~= lc b then
D:List Integer:=[degree(c)-max(degree(a),degree(b))]
else
x:X:=BA/lc(a)
if integer?(x)$IntegerRetractions(X) then
D:=[degree(c)-degree(a)+1,retract x]
else
D:=[degree(c)-degree(a)+1]
--output("** D:=",D::OutputForm)$OutputPackage
--output("** BA:=",BA::OutputForm)$OutputPackage
--output("** lca:=",lc(a)::OutputForm)$OutputPackage
D:=[u for u in D | u>=0 ]
empty? D => "failed"
max(D)
equationsSetup(F:XX,J:NNI,k:X):EQSR ==
single:=create()$SingletonAsOrderedSet
tr:=termRatio(F,J::NNI,k::X)
ur:=univariate(tr.r,kernel 'k)
us:=univariate(tr.s,kernel 'k)
up0:=numer univariate(tr.p0,kernel 'k) --?
pr:=retract(ur)@SUPX
ps:=retract(us)@SUPX
p0:=up0 --retract(up0)@SUPX
g:=gosper(pr,ps)
d:=upperBound(g,up0)
d case "failed" => [[],[],0]
d:=d::Integer
b:=[subscript('b,[j::OF])::X for j in 0..d]
x0:=reduce(_+,[b.l*k^(l-1) for l in 1..d+1],0)
x1:=reduce(_+,[b.l*(k+1)^(l-1) for l in 1..d+1],0)
ux0:=numer univariate(x0,kernel 'k)
ux1:=numer univariate(x1,kernel 'k)
p:=g.pc * p0
p2:=g.pa
p3:=eval(g.pb,single,single::SUPX - 1::SUPX)
eqx:SUPX:=p2*ux1-p3*ux0-p
ceqx:List X:=coefficients(eqx)
--output("** Equations:=",ceqx::OutputForm)$OutputPackage
a:=[subscript('a,[j::OF])::X for j in 0..J]
gp:=p3/p*ux0
gpn:X:=retract eval(numer gp,single,k::SUPX)
gpd:X:=retract eval(denom gp,single,k::SUPX)
G:X:=gpn/gpd*term(F,J,k)
[[u=0$X for u in ceqx],concat(a,b),G]
solveEquations(e:EQSR):Union(LEQX,"failed") ==
empty?(e.eqs) or empty?(e.unk) => "failed"
s:=solve(e.eqs,[e.unk.i for i in 1..min(#e.unk-1,#e.eqs)])$TSPR
empty? s => "failed"
first s
recEq(F:XX,J:NNI,k:X):Union(Equation X,"failed") ==
es:=equationsSetup(F,J,k)
sol:=solveEquations(es)
if sol case "failed" then return "failed"
else sol:=sol::LEQX
S:=operator 'S
n:='n::X
rec:List X:=[rhs(sol.(i+1)) * S(n+i::X) for i in 0..J]
rr:=reduce(_+,rec,0)
rr:=numerator nz(rr)
u0:LEQX:=[es.unk.i=0 for i in #es.eqs+1..#es.unk-1]
if not empty? u0 then rr:=nz(eval(rr,u0))
rr:=eval(rr,[es.unk.(#es.unk)=1])
rr=0$X</spad>
fricas
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/3572774548778315158-25px001.spad
using old system compiler.
ZEIL abbreviates package Zeilberger
------------------------------------------------------------------------
initializing NRLIB ZEIL for Zeilberger
compiling into NRLIB ZEIL
compiling exported term : ((Expression Integer,Expression Integer) -> Expression Integer,NonNegativeInteger,Expression Integer) -> Expression Integer
Time: 0.03 SEC.
compiling exported termRatio : ((Expression Integer,Expression Integer) -> Expression Integer,NonNegativeInteger,Expression Integer) -> Record(p0: Expression Integer,r: Expression Integer,s: Expression Integer)
Time: 0.06 SEC.
compiling exported gosper : (SparseUnivariatePolynomial Expression Integer,SparseUnivariatePolynomial Expression Integer) -> Record(pa: SparseUnivariatePolynomial Expression Integer,pb: SparseUnivariatePolynomial Expression Integer,pc: SparseUnivariatePolynomial Expression Integer)
Time: 0.15 SEC.
compiling exported upperBound : (Record(pa: SparseUnivariatePolynomial Expression Integer,pb: SparseUnivariatePolynomial Expression Integer,pc: SparseUnivariatePolynomial Expression Integer),SparseUnivariatePolynomial Expression Integer) -> Union(Integer,failed)
processing macro definition lc ==> leadingCoefficient
Time: 0.08 SEC.
compiling exported equationsSetup : ((Expression Integer,Expression Integer) -> Expression Integer,NonNegativeInteger,Expression Integer) -> Record(eqs: List Equation Expression Integer,unk: List Expression Integer,cert: Expression Integer)
Time: 0.23 SEC.
compiling exported solveEquations : Record(eqs: List Equation Expression Integer,unk: List Expression Integer,cert: Expression Integer) -> Union(List Equation Expression Integer,failed)
Time: 0.08 SEC.
compiling exported recEq : ((Expression Integer,Expression Integer) -> Expression Integer,NonNegativeInteger,Expression Integer) -> Union(Equation Expression Integer,failed)
Time: 0.03 SEC.
(time taken in buildFunctor: 0)
Time: 0 SEC.
Warnings:
[1] termRatio: not known that (AlgebraicallyClosedField) is of mode (CATEGORY domain (IF (has (Integer) (IntegralDomain)) (PROGN (ATTRIBUTE (AlgebraicallyClosedFunctionSpace (Integer))) (ATTRIBUTE (TranscendentalFunctionCategory)) (ATTRIBUTE (CombinatorialOpsCategory)) (ATTRIBUTE (LiouvillianFunctionCategory)) (ATTRIBUTE (SpecialFunctionCategory)) (SIGNATURE reduce (% %)) (SIGNATURE number? ((Boolean) %)) (IF (has (Integer) (PolynomialFactorizationExplicit)) (ATTRIBUTE (PolynomialFactorizationExplicit)) noBranch) (SIGNATURE setSimplifyDenomsFlag ((Boolean) (Boolean))) (SIGNATURE getSimplifyDenomsFlag ((Boolean)))) noBranch))
[2] termRatio: not known that (TranscendentalFunctionCategory) is of mode (CATEGORY domain (IF (has (Integer) (IntegralDomain)) (PROGN (ATTRIBUTE (AlgebraicallyClosedFunctionSpace (Integer))) (ATTRIBUTE (TranscendentalFunctionCategory)) (ATTRIBUTE (CombinatorialOpsCategory)) (ATTRIBUTE (LiouvillianFunctionCategory)) (ATTRIBUTE (SpecialFunctionCategory)) (SIGNATURE reduce (% %)) (SIGNATURE number? ((Boolean) %)) (IF (has (Integer) (PolynomialFactorizationExplicit)) (ATTRIBUTE (PolynomialFactorizationExplicit)) noBranch) (SIGNATURE setSimplifyDenomsFlag ((Boolean) (Boolean))) (SIGNATURE getSimplifyDenomsFlag ((Boolean)))) noBranch))
[3] termRatio: k is BOTH a variable and a literal
[4] equationsSetup: k is BOTH a variable and a literal
Cumulative Statistics for Constructor Zeilberger
Time: 0.66 seconds
finalizing NRLIB ZEIL
Processing Zeilberger for Browser database:
--------constructor---------
--->-->Zeilberger((term ((Expression (Integer)) (Mapping (Expression (Integer)) (Expression (Integer)) (Expression (Integer))) (NonNegativeInteger) (Expression (Integer))))): Not documented!!!!
--->-->Zeilberger((termRatio ((Record (: p0 (Expression (Integer))) (: r (Expression (Integer))) (: s (Expression (Integer)))) (Mapping (Expression (Integer)) (Expression (Integer)) (Expression (Integer))) (NonNegativeInteger) (Expression (Integer))))): Not documented!!!!
--->-->Zeilberger((gosper ((Record (: pa (SparseUnivariatePolynomial (Expression (Integer)))) (: pb (SparseUnivariatePolynomial (Expression (Integer)))) (: pc (SparseUnivariatePolynomial (Expression (Integer))))) (SparseUnivariatePolynomial (Expression (Integer))) (SparseUnivariatePolynomial (Expression (Integer)))))): Not documented!!!!
--->-->Zeilberger((upperBound ((Union (Integer) failed) (Record (: pa (SparseUnivariatePolynomial (Expression (Integer)))) (: pb (SparseUnivariatePolynomial (Expression (Integer)))) (: pc (SparseUnivariatePolynomial (Expression (Integer))))) (SparseUnivariatePolynomial (Expression (Integer)))))): Not documented!!!!
--->-->Zeilberger((equationsSetup ((Record (: eqs (List (Equation (Expression (Integer))))) (: unk (List (Expression (Integer)))) (: cert (Expression (Integer)))) (Mapping (Expression (Integer)) (Expression (Integer)) (Expression (Integer))) (NonNegativeInteger) (Expression (Integer))))): Not documented!!!!
--->-->Zeilberger((solveEquations ((Union (List (Equation (Expression (Integer)))) failed) (Record (: eqs (List (Equation (Expression (Integer))))) (: unk (List (Expression (Integer)))) (: cert (Expression (Integer))))))): Not documented!!!!
--->-->Zeilberger((recEq ((Union (Equation (Expression (Integer))) failed) (Mapping (Expression (Integer)) (Expression (Integer)) (Expression (Integer))) (NonNegativeInteger) (Expression (Integer))))): Not documented!!!!
; compiling file "/var/aw/var/LatexWiki/ZEIL.NRLIB/ZEIL.lsp" (written 13 JUN 2026 01:20:09 PM):
; wrote /var/aw/var/LatexWiki/ZEIL.NRLIB/ZEIL.fasl
; compilation finished in 0:00:00.704
------------------------------------------------------------------------
Zeilberger is now explicitly exposed in frame initial
Zeilberger will be automatically loaded when needed from
/var/aw/var/LatexWiki/ZEIL.NRLIB/ZEIL
fricas
--)co zeilberger
X ==> EXPR INT
Type: Void
fricas
S := operator 'S
fricas
-- EJn ..... expected
-- SJn ..... calculated (recEq)
----
J:=1
fricas
----
F11:(X,X)->X:= (n,k) +-> binomial(n,k)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F11(n,k),k)
Type: Equation(Expression(Integer))
fricas
E11:= - S(n + 1) + 2 * S(n) = 0;
Type: Equation(Expression(Integer))
fricas
S11:=recEq(F11,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F12:(X,X)->X:= (n,k) +-> binomial(n,k)^2
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F12(n,k),k)
Type: Equation(Expression(Integer))
fricas
E12:= (- n - 1)*S(n + 1) + (4*n + 2)*S(n) = 0;
Type: Equation(Expression(Integer))
fricas
S12:=recEq(F12,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F13:(X,X)->X:= (n,k) +-> (-1)^k*binomial(2*n,k)^3 -- Dixon
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F13(n,k),k)
Type: Equation(Expression(Integer))
fricas
E13:=(- n^2 - 2*n - 1)*S(n + 1) + (- 27 * n^2 - 27 * n - 6) * S(n) = 0;
Type: Equation(Expression(Integer))
fricas
S13:=recEq(F13,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F14:(X,X)->X:= (n,k) +-> 4^(-k)*binomial(n,2*k)*binomial(2*k,k)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F14(n,k),k)
Type: Equation(Expression(Integer))
fricas
E14:= (- n - 1)*S(n + 1) + (2*n + 1)*S(n) = 0;
Type: Equation(Expression(Integer))
fricas
S14:=recEq(F14,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F15:(X,X)->X:= (n,k) +-> binomial(n+k,2*k)*binomial(2*k,k)*(-1)^k/(k+1) -- only 2 eq 4 unk
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = summation(F15(n,k),k) -- sum hangs!!!
Type: Equation(Expression(Integer))
fricas
E15:= (- n^2 - 3 * n - 2)*S(n + 1) + (n^2 + n)*S(n) = 0 ;
Type: Equation(Expression(Integer))
fricas
S15:=recEq(F15,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F16:(X,X)->X:= (n,k) +-> (-1)^k*binomial(n,k)*binomial(2*n-2*k,n+a)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F16(n,k),k)
Type: Equation(Expression(Integer))
fricas
E16:= (n - a + 1)*S(n + 1) + (- 2*n - 2)*S(n) = 0 ; --***verify
Type: Equation(Expression(Integer))
fricas
S16:=recEq(F16,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F17:(X,X)->X:= (n,k) +-> binomial(x,k)*binomial(y,n-k)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F17(n,k),k)
Type: Equation(Expression(Integer))
fricas
E17:= (- n - 1)*S(n + 1) + (y + x - n)*S(n) = 0 ; --***verify
Type: Equation(Expression(Integer))
fricas
S17:=recEq(F17,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F18:(X,X)->X:= (n,k) +-> k*binomial(2*n+1,2*k+1)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F18(n,k),k)
Type: Equation(Expression(Integer))
fricas
E18:= (- 2 * n^2 + n)*S(n + 1) + (8*n^2 + 4*n)*S(n) = 0 ; --***verify
Type: Equation(Expression(Integer))
fricas
S18:=recEq(F18,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F19:(X,X)->X:= (n,k) +-> (-1)^k*binomial(n-k,k)*2^(n-2*k)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F19(n,k),k)
Type: Equation(Expression(Integer))
fricas
E19:= (n + 1)*S(n + 1) + (- n - 2)*S(n) = 0 ; --***verify
Type: Equation(Expression(Integer))
fricas
S19:=recEq(F19,1,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
J:=2
fricas
F21:(X,X)->X:= (n,k) +-> binomial(2*k,k)*binomial(n,k)*(-1/2)^k -- Reed-Dawson
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F21(n,k),k)
Type: Equation(Expression(Integer))
fricas
E21:= (- n - 2)*S(n + 2) + (n + 1)*S(n) = 0 ;
Type: Equation(Expression(Integer))
fricas
S21:=recEq(F21,2,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F22:(X,X)->X:= (n,k) +-> 2^(-n)*(-1)^k*binomial(2*n-2*k,n-k)*binomial(n-k,k)*x^(n-2*k)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F22(n,k),k)
Type: Equation(Expression(Integer))
fricas
-- Legendre polynomials
E22:= (n + 2)*S(n + 2) + (- 2*n - 3) * x * S(n + 1) + (n + 1)*S(n) = 0 ;
Type: Equation(Expression(Integer))
fricas
S22:=recEq(F22,2,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
F23:(X,X)->X:= (n,k) +-> 2^(-k)*factorial(n)/factorial(k)/factorial(n-2*k)
Type: ((Expression(Integer), Expression(Integer)) -> Expression(Integer))
fricas
S(n) = sum(F23(n,k),k)
Type: Equation(Expression(Integer))
fricas
E23:= - S(n + 2) + S(n + 1) + (n + 1)*S(n) = 0 ; --***verify
Type: Equation(Expression(Integer))
fricas
S23:=recEq(F23,2,k)
Type: Union(Equation(Expression(Integer)),...)
fricas
SJn:= [S11,S12,S13,S14,S15,S16,S17,S18,S19,S22,S23];
Type: List(Union(Equation(Expression(Integer)),"failed"))
fricas
EJn:= [E11,E12,E13,E14,E15,E16,E17,E18,E19,E22,E23];
Type: List(Equation(Expression(Integer)))
fricas
check:=[integer?(lhs SJn.i / lhs EJn.i) for i in 1..#SJn]
Type: List(Boolean)
fricas
reduce(_and,check)
Type: Boolean