login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

Edit detail for HYPGEOM revision 1 of 1

1
Editor: pagani
Time: 2026/06/06 10:35:36 GMT+0
Note: tests for fricas 1.3.12

changed:
-
\begin{spad}
-- Sat 9 May 22:36:23 CEST 2026
--------------------------------------
)abbrev package HYPGEOM HyperGeometric
--------------------------------------
HyperGeometric(): Exports == Implementation where
  R ==> Fraction Integer  -- must be FRAC INT not INT!!
  X ==> Expression R
  NNI ==> NonNegativeInteger
  SMP ==> SparseMultivariatePolynomial(R, Kernel X) -- if R has IntegralDomain
  SUP ==> SparseUnivariatePolynomial SMP 
  FSF ==> FunctionalSpecialFunction(R,X)
  
  EFSP   ==> ElementaryFunctionStructurePackage(R,X)
  FACSUP ==> Factored SUP
  FACREC ==> Record(factor:SUP, exponent:NNI)
  
  HYPER  ==> Record(ap:List X, bq:List X, fac:X)
  PARAM  ==> Record(ab:List SUP, const:List SUP)

  Exports == with
    rational? : (X,Symbol) -> Boolean
      ++ rational?(r,x) returns true if r is of the form p/q where p and q
      ++ are univariate polynomials in x.
    factoredForm : (X->X) -> Fraction(FACSUP)
      ++ factoredForm(f) returns the fraction f(?+1)/f(?) in the variable "?", 
      ++ where numerator and denominator are factored, provided that this 
      ++ fraction is a rational function; otherwise an error message is
      ++ produced. 
    factoredForm : X -> Fraction(FACSUP) 
    admissible? : Fraction(FACSUP) -> Boolean
      ++ admissible?(ff), where ff is the output of factoredForm, checks if
      ++ the factorization is complete (i.e. linear) and the b coefficients
      ++ are positive.      
    getParameters : FACSUP -> PARAM
      ++ getParameters(p) gives the parameters of sparse univariate polynomial
      ++ p, that is the list of zeroes and possibly a constant factor when
      ++ different from 1.
    convert : SUP -> X
      ++ convert(p) converts the SparseUnivariatePolynomial p to Expression
      ++ Integer.
    pFq : (X->X) -> HYPER
      ++ pFq(f) provides the hypergeometric parameters as a record of the
      ++ form Record(ap:List X, bq:List X, fac:X), where X=EXPR(INT).
    pFq : X -> HYPER
    construct: (HYPER,Symbol) -> X
      ++ construct(pfq,x) constructs the hypergeometric expression with 
      ++ the output of pFq in the symbol x.
    display : HYPER -> OutputForm
      ++ Fancy display the output of pFq.
    hyperLookup : HYPER -> X
      ++ Lookup the output of pFq in a table.
    createHyperF : HYPER -> X
      ++
    hgFtoHYPER : X -> HYPER
      ++ hgFtoHYPER(f) converts f:=hypergeometricF([a..],[b..],x) to
      ++ a HYPER record [[a..],[b..],x]$HYPER.
    sum : (X,Symbol) -> X

  Implementation == add

    rational0?(p:X,xs:Symbol):Boolean ==
      x:=xs::X
      up:=univariate(p,kernel xs)
      dup:=denom up
      nup:=numer up
      cdup:= coefficients dup
      ndup:= coefficients nup
      fox:=(u:X):Boolean+->freeOf?(u,x)
      every?(fox,cdup) and every?(fox,ndup)

    rational?(f:X, xs:Symbol):Boolean ==
      k:Kernel X:=kernel xs
      for kk in tower f repeat
        a:Boolean:=member?(k, tower(kk::X)) 
        b:Boolean:=(symbolIfCan(kk) case "failed")
        a and b => return false
      true

    factoredForm(f:X->X):Fraction(FACSUP) ==
      ns:X:=(nsym:=new()$Symbol)::X
      q:=f(ns+1)/f(ns)
      nq:=normalize(q)$EFSP
      not rational?(nq,retract ns) => error "Not rational"
      dnq:=denom nq
      nnq:=numer nq
      unnq:=univariate(nnq,kernel nsym)
      udnq:=univariate(dnq,kernel nsym)
      funnq:=factor unnq
      fudnq:=factor udnq
      funnq/fudnq

    factoredForm(S:X):Fraction(FACSUP) ==
      mk:=mainKernel S
      mk case "failed" => error "mainKernel failed."
      not (name mk = 'summation) => error "Sum expected."
      args:=argument mk
      not (#args = 3) => error "Unexpected number of kernel arguments."
      summand:=first args
      var:=second args
      not freeOf?(summand,third args) => error "Strange summand."
      q:=eval(summand,var=var+1)/summand
      nq:=normalize(q)$EFSP
      not rational?(nq,retract var) => error "Not rational"
      dnq:=denom nq
      nnq:=numer nq
      unnq:=univariate(nnq,kernel retract var)
      udnq:=univariate(dnq,kernel retract var)
      funnq:=factor unnq
      fudnq:=factor udnq
      funnq/fudnq

    admissible? ff ==
      fn:=factors(numer ff)
      fd:=factors(denom ff)
      not empty? fn and max [degree(u.factor) for u in fn] > 1 => false
      not empty? fd and max [degree(u.factor) for u in fd] > 1 => false
      --todo: check fd: b's>0
      --qm:=create()$SingletonAsOrderedSet
      empty? fd => true
      --[(s.factor-qm) ??? for s in fd]
      true

    getParameters x ==
      qm:=create()$SingletonAsOrderedSet
      r:List FACREC:=factors x
      l1:List SUP:=[]
      l2:List SUP:=[]
      for s in r repeat
        p:SUP:=s.factor
        if variables p = [qm]
        then
          q1:=p-qm::SUP
          for i in 1..s.exponent repeat
            l1:=cons(q1,l1)
        else
          q2:=p 
          for i in 1..s.exponent repeat
            l2:=cons(q2,l2)
      return [l1,l2]$PARAM


    convert(x:SUP):X ==
      k:Kernel(X):=first tower('_%::X) --'
      y:SMP:=multivariate(x,k)$SMP
      coerce(y)$X
      

    buildConst(x:List SUP):X ==
      empty?(x) => 1$X
      p:SUP:=reduce(_*,x)
      convert p
      

    pFq(f:X->X):HYPER ==
      ff:=factoredForm(f)
      gpn:=getParameters(numer ff)
      gpd:=getParameters(denom ff)
      a:=[convert t for t in gpn.ab]
      b:=[convert t for t in gpd.ab]
      if member?(1$X,b) then
        b:=delete(b,position(1$X,b))
      else
        a:=cons(1$X,a)
      c:=convert unit(numer ff)
      ca:=buildConst(gpn.const)
      cb:=buildConst(gpd.const)
      [a,b,c*ca/cb]$HYPER

    pFq(S:X):HYPER ==
      ff:=factoredForm(S)
      gpn:=getParameters(numer ff)
      gpd:=getParameters(denom ff)
      a:=[convert t for t in gpn.ab]
      b:=[convert t for t in gpd.ab]
      if member?(1$X,b) then
        b:=delete(b,position(1$X,b))
      else
        a:=cons(1$X,a)
      c:=convert unit(numer ff)
      ca:=buildConst(gpn.const)
      cb:=buildConst(gpd.const)
      [a,b,c*ca/cb]$HYPER        
 
    construct(x,s) ==
      v:=s::X
      a:=x.ap
      b:=x.bq
      c:=x.fac
      av:=[paren(v+t) for t in a]
      bv:=[paren(v+t) for t in b]
      num:=1$X
      den:=1$X
      if not empty? av then
        num:=reduce(_*,av)
      if not empty? bv then
        den:=reduce(_*,bv)    
      c*num/den/(v+1$X)
      

    display(x:HYPER):OutputForm ==
      OF ==> OutputForm
      a:=[s::OF for s in x.ap]
      b:=[s::OF for s in x.bq]
      c:=(x.fac)::OF
      p:=(#a)::OF
      q:=(#b)::OF
      A:=sub(presub('F::OF,p),q)
      if #a < #b then
        a:=append(a,['*::OF for i in 1..#b- #a])
      else
        b:=append(b,['*::OF for i in 1..#a- #b])
      --B:=binomial(blankSeparate a, blankSeparate b)
      B:=blankSeparate [A,matrix [a,b],bracket c]
      --hconcat(A,B)


    checkGauss2F1(x:HYPER):Boolean ==
      not(#(x.ap)=2 and #(x.bq)=1) => false
      not(x.fac=1$X) => false
      a:Union(Integer,"failed"):=retractIfCan(x.ap.1)
      b:Union(Integer,"failed"):=retractIfCan(x.ap.2)
      if a case Integer then 
        a:=a::Integer
        if a < 0 then return true        
      if b case Integer then
        b:=b::Integer 
        if b < 0 then return true
      r:X:=x.bq.1 - x.ap.1 - x.ap.2 
      not smaller?(r,0::X) => true
      false

    checkKummer2F1(x:HYPER):Boolean ==
      not(#(x.ap)=2 and #(x.bq)=1) => false
      not(x.fac=-1$X) => false 
      r:X:=x.ap.1 - x.ap.2 + x.bq.1       
      r=1$X => true
      false

    hyperLookup(x:HYPER):X ==
      a:=x.ap
      b:=x.bq
      c:=x.fac
      p:= #a
      q:= #b
      if p=1 then
        if q=0 then
          return (1-c)^(-a.1)
      checkGauss2F1(x) => Gamma(b.1-a.1-a.2)*Gamma(b.1)/ _
                          (Gamma(b.1-a.1)*Gamma(b.1-a.2))   
      checkKummer2F1(x) => Gamma((1/2)*a.2+1)*Gamma(a.2-a.1+1)/ _
                          (Gamma(a.2+1)*Gamma((1/2)*a.2-a.1+1))                             
      0$X


    -- better: mainKernel hypergeometricF
    --         argument mainKernel hypergeometricF([a1..ap],[b1..bq],x) -->
    --         [a1,..,ap,b1,..,bq,x,p,q] as List(X)
    -- name mainKernel hyper... -->  hypergeometricF @ Symbol
    
    hgFtoHYPER(f:X):HYPER ==
      k:=mainKernel(f) 
      k case "failed" => error "Not a kernel?" 
      not(name k = 'hypergeometricF) => error "Not hypergeometricF."
      args:List X:=argument k
      narg:=#args
      q:Union(Integer,"failed"):=retractIfCan(args.narg)
      p:Union(Integer,"failed"):=retractIfCan(args.(narg-1))
      p case "failed" => error "p?"
      q case "failed" => error "q?"
      ap:=args.(1..p)
      bq:=args.(p+1..q+1)
      fac:=args.(q+2)
      [ap,bq,fac]$HYPER
      

    -- :todo:check f(0)~=0
    sum(f:X,s:Symbol):X ==
      S:=summation(f,s)
      h:HYPER:=pFq(S)
      eval(f,s::X=0) * hypergeometricF(h.ap,h.bq,h.fac)
      


-- S1:=sum((-1)^k*(x/2)^(2*k+p)/factorial(k)/factorial(k+p),k)
-- S2:=sum(1/(2*n-1)/factorial(2*n+1),n)  --  display pFq(S2)
\end{spad}
\begin{axiom}
)version

-- binomial(n,k)
-- expected: hypergeometricF([- n],[],- 1) = 2^n
sum(binomial(n,k),'k)
sum(binomial(n,k),'k)$HYPGEOM

-- x^k/k!
-- expected: hypergeometricF([],[],x) = exp(x)
sum(x^k/factorial(k),'k)$HYPGEOM

-- Example 3.3.1.
-- expected: hypergeometricF([],[1],2)
sum(2^k/factorial(k)^2,'k)$HYPGEOM


-- Example 3.3.2.
--                            1   3  1  1
-- expected: - hypergeometricF([- -],[-, -],-)
--                            2   2  2  4
sum(1/(2*k-1)/factorial(2*k+1),'k)$HYPGEOM

-- Example 3.3.4. 
-- expected: hypergeometricF([- n],[1],1)
sum(binomial(n,k)*(-1)^k/factorial(k),'k)$HYPGEOM

-- Example 3.3.5. (Bessel: J_p(x))
--                                    1  2  1   p
--       hypergeometricF([],[p + 1],- - x )(- x)
--                                    4     2
--       ----------------------------------------
--                          p!
sum((-1)^k*(x/2)^(2*k+p)/factorial(k)/factorial(k+p),'k)$HYPGEOM


-- Sec 3.4 / binomial(n,k)^2
-- expected: hypergeometricF([- n, - n],[1],1)
sum(binomial(n,k)^2,k)$HYPGEOM
-- sum(x^k*binomial(n,k)^2,k)$HYPGEOM --> hypergeometricF([- n, - n],[1],x)


-- Sec 3.4.1
-- expected: binomial(r,n)/(r-n+1)*hypergeometricF([-n,n-r-1,(s-r)/2,(s-r+1)/2],
--    [(1-r)/2,-r/2,s-r],1)
sum((-1)^k*binomial(r - s - k, k)*binomial(r - 2*k, n - k)/(r - n - k + 1),k)$HYPGEOM

-- Sec 3.4.2
-- expected hypergeometricF([-n, -n, -n], [1, 1], -1),
sum(binomial(n, k)^3, k)$HYPGEOM

-- Example 3.6.1
-- expected: hypergeometricF([- 2 n, - 2 n],[1],- 1) 
sum((-1)^k*binomial(2*n,k)^2,k)$HYPGEOM

-- Example 3.6.2
-- expected: 
--                        1                            1     4 n
--       hypergeometricF([-, - 2 n, - 2 n],[1, - 2 n + -],1)(   )
--                        2                            2     2 n
-- tricky (in principle violates b>0, however, cancelling negative factorials)
sum((-1)^k*binomial(2*n,k)*binomial(2*k,k)*binomial(4*n-2*k,2*n-k),k)$HYPGEOM


----------------
-- 3.8 Exercises
----------------
sum(binomial(n,k)*binomial(n+a,k)*binomial(n-a,n-k),k)$HYPGEOM
sum(binomial(n,k)^5,k)$HYPGEOM
sum((-1)^k*binomial(k,n-k),k)$HYPGEOM
---- 3.a-g
sum(binomial(n,k)/binomial(2*n-1,k),k)$HYPGEOM
sum(binomial(n,k)^2*binomial(3*n+k,2*n),k)$HYPGEOM
sum((-1)^k*binomial(n,k)*factorial(k+3*a)/factorial(k+a),k)$HYPGEOM
sum(4^k*(-1)^k*binomial(k+a,a)*binomial(n+k,2*k+2*a),k)$HYPGEOM
sum(binomial(2*n+2,2*k+1)*binomial(x+k,2*n+1),k)$HYPGEOM
sum(binomial(2*n+1,2*p+2*k+1)*binomial(p+k,k),k)$HYPGEOM
sum((-1)^k*binomial(2*n,k)*binomial(2*x,x+n-k)*binomial(2*z,z-n+k),k)$HYPGEOM
----

f:=-sum(1/(2*k-1)/factorial(2*k+1),'k)$HYPGEOM
hgFtoHYPER f

sum((-1)^k*binomial(n,k),'k)$HYPGEOM --> 0?
\end{axiom}

fricas
(1) -> <spad>
Sat 9 May 22:36:23 CEST 2026 --------------------------------------
fricas
)abbrev package HYPGEOM HyperGeometric
--------------------------------------
HyperGeometric(): Exports == Implementation where
  R ==> Fraction Integer  -- must be FRAC INT not INT!!
  X ==> Expression R
  NNI ==> NonNegativeInteger
  SMP ==> SparseMultivariatePolynomial(R, Kernel X) -- if R has IntegralDomain
  SUP ==> SparseUnivariatePolynomial SMP 
  FSF ==> FunctionalSpecialFunction(R,X)
EFSP ==> ElementaryFunctionStructurePackage(R,X) FACSUP ==> Factored SUP FACREC ==> Record(factor:SUP, exponent:NNI)
HYPER ==> Record(ap:List X, bq:List X, fac:X) PARAM ==> Record(ab:List SUP, const:List SUP)
Exports == with rational? : (X,Symbol) -> Boolean ++ rational?(r,x) returns true if r is of the form p/q where p and q ++ are univariate polynomials in x. factoredForm : (X->X) -> Fraction(FACSUP) ++ factoredForm(f) returns the fraction f(?+1)/f(?) in the variable "?", ++ where numerator and denominator are factored, provided that this ++ fraction is a rational function; otherwise an error message is ++ produced. factoredForm : X -> Fraction(FACSUP) admissible? : Fraction(FACSUP) -> Boolean ++ admissible?(ff), where ff is the output of factoredForm, checks if ++ the factorization is complete (i.e. linear) and the b coefficients ++ are positive. getParameters : FACSUP -> PARAM ++ getParameters(p) gives the parameters of sparse univariate polynomial ++ p, that is the list of zeroes and possibly a constant factor when ++ different from 1. convert : SUP -> X ++ convert(p) converts the SparseUnivariatePolynomial p to Expression ++ Integer. pFq : (X->X) -> HYPER ++ pFq(f) provides the hypergeometric parameters as a record of the ++ form Record(ap:List X, bq:List X, fac:X), where X=EXPR(INT). pFq : X -> HYPER construct: (HYPER,Symbol) -> X ++ construct(pfq,x) constructs the hypergeometric expression with ++ the output of pFq in the symbol x. display : HYPER -> OutputForm ++ Fancy display the output of pFq. hyperLookup : HYPER -> X ++ Lookup the output of pFq in a table. createHyperF : HYPER -> X ++ hgFtoHYPER : X -> HYPER ++ hgFtoHYPER(f) converts f:=hypergeometricF([a..],[b..],x) to ++ a HYPER record [[a..],[b..],x]$HYPER. sum : (X,Symbol) -> X
Implementation == add
rational0?(p:X,xs:Symbol):Boolean == x:=xs::X up:=univariate(p,kernel xs) dup:=denom up nup:=numer up cdup:= coefficients dup ndup:= coefficients nup fox:=(u:X):Boolean+->freeOf?(u,x) every?(fox,cdup) and every?(fox,ndup)
rational?(f:X, xs:Symbol):Boolean == k:Kernel X:=kernel xs for kk in tower f repeat a:Boolean:=member?(k, tower(kk::X)) b:Boolean:=(symbolIfCan(kk) case "failed") a and b => return false true
factoredForm(f:X->X):Fraction(FACSUP) == ns:X:=(nsym:=new()$Symbol)::X q:=f(ns+1)/f(ns) nq:=normalize(q)$EFSP not rational?(nq,retract ns) => error "Not rational" dnq:=denom nq nnq:=numer nq unnq:=univariate(nnq,kernel nsym) udnq:=univariate(dnq,kernel nsym) funnq:=factor unnq fudnq:=factor udnq funnq/fudnq
factoredForm(S:X):Fraction(FACSUP) == mk:=mainKernel S mk case "failed" => error "mainKernel failed." not (name mk = 'summation) => error "Sum expected." args:=argument mk not (#args = 3) => error "Unexpected number of kernel arguments." summand:=first args var:=second args not freeOf?(summand,third args) => error "Strange summand." q:=eval(summand,var=var+1)/summand nq:=normalize(q)$EFSP not rational?(nq,retract var) => error "Not rational" dnq:=denom nq nnq:=numer nq unnq:=univariate(nnq,kernel retract var) udnq:=univariate(dnq,kernel retract var) funnq:=factor unnq fudnq:=factor udnq funnq/fudnq
admissible? ff == fn:=factors(numer ff) fd:=factors(denom ff) not empty? fn and max [degree(u.factor) for u in fn] > 1 => false not empty? fd and max [degree(u.factor) for u in fd] > 1 => false --todo: check fd: b's>0 --qm:=create()$SingletonAsOrderedSet empty? fd => true --[(s.factor-qm) ??? for s in fd] true
getParameters x == qm:=create()$SingletonAsOrderedSet r:List FACREC:=factors x l1:List SUP:=[] l2:List SUP:=[] for s in r repeat p:SUP:=s.factor if variables p = [qm] then q1:=p-qm::SUP for i in 1..s.exponent repeat l1:=cons(q1,l1) else q2:=p for i in 1..s.exponent repeat l2:=cons(q2,l2) return [l1,l2]$PARAM
convert(x:SUP):X == k:Kernel(X):=first tower('_%::X) --' y:SMP:=multivariate(x,k)$SMP coerce(y)$X
buildConst(x:List SUP):X == empty?(x) => 1$X p:SUP:=reduce(_*,x) convert p
pFq(f:X->X):HYPER == ff:=factoredForm(f) gpn:=getParameters(numer ff) gpd:=getParameters(denom ff) a:=[convert t for t in gpn.ab] b:=[convert t for t in gpd.ab] if member?(1$X,b) then b:=delete(b,position(1$X,b)) else a:=cons(1$X,a) c:=convert unit(numer ff) ca:=buildConst(gpn.const) cb:=buildConst(gpd.const) [a,b,c*ca/cb]$HYPER
pFq(S:X):HYPER == ff:=factoredForm(S) gpn:=getParameters(numer ff) gpd:=getParameters(denom ff) a:=[convert t for t in gpn.ab] b:=[convert t for t in gpd.ab] if member?(1$X,b) then b:=delete(b,position(1$X,b)) else a:=cons(1$X,a) c:=convert unit(numer ff) ca:=buildConst(gpn.const) cb:=buildConst(gpd.const) [a,b,c*ca/cb]$HYPER
construct(x,s) == v:=s::X a:=x.ap b:=x.bq c:=x.fac av:=[paren(v+t) for t in a] bv:=[paren(v+t) for t in b] num:=1$X den:=1$X if not empty? av then num:=reduce(_*,av) if not empty? bv then den:=reduce(_*,bv) c*num/den/(v+1$X)
display(x:HYPER):OutputForm == OF ==> OutputForm a:=[s::OF for s in x.ap] b:=[s::OF for s in x.bq] c:=(x.fac)::OF p:=(#a)::OF q:=(#b)::OF A:=sub(presub('F::OF,p),q) if #a < #b then a:=append(a,['*::OF for i in 1..#b- #a]) else b:=append(b,['*::OF for i in 1..#a- #b]) --B:=binomial(blankSeparate a, blankSeparate b) B:=blankSeparate [A,matrix [a,b],bracket c] --hconcat(A,B)
checkGauss2F1(x:HYPER):Boolean == not(#(x.ap)=2 and #(x.bq)=1) => false not(x.fac=1$X) => false a:Union(Integer,"failed"):=retractIfCan(x.ap.1) b:Union(Integer,"failed"):=retractIfCan(x.ap.2) if a case Integer then a:=a::Integer if a < 0 then return true if b case Integer then b:=b::Integer if b < 0 then return true r:X:=x.bq.1 - x.ap.1 - x.ap.2 not smaller?(r,0::X) => true false
checkKummer2F1(x:HYPER):Boolean == not(#(x.ap)=2 and #(x.bq)=1) => false not(x.fac=-1$X) => false r:X:=x.ap.1 - x.ap.2 + x.bq.1 r=1$X => true false
hyperLookup(x:HYPER):X == a:=x.ap b:=x.bq c:=x.fac p:= #a q:= #b if p=1 then if q=0 then return (1-c)^(-a.1) checkGauss2F1(x) => Gamma(b.1-a.1-a.2)*Gamma(b.1)/ _ (Gamma(b.1-a.1)*Gamma(b.1-a.2)) checkKummer2F1(x) => Gamma((1/2)*a.2+1)*Gamma(a.2-a.1+1)/ _ (Gamma(a.2+1)*Gamma((1/2)*a.2-a.1+1)) 0$X
-- better: mainKernel hypergeometricF -- argument mainKernel hypergeometricF([a1..ap],[b1..bq],x) --> -- [a1,..,ap,b1,..,bq,x,p,q] as List(X) -- name mainKernel hyper... --> hypergeometricF @ Symbol
hgFtoHYPER(f:X):HYPER == k:=mainKernel(f) k case "failed" => error "Not a kernel?" not(name k = 'hypergeometricF) => error "Not hypergeometricF." args:List X:=argument k narg:=#args q:Union(Integer,"failed"):=retractIfCan(args.narg) p:Union(Integer,"failed"):=retractIfCan(args.(narg-1)) p case "failed" => error "p?" q case "failed" => error "q?" ap:=args.(1..p) bq:=args.(p+1..q+1) fac:=args.(q+2) [ap,bq,fac]$HYPER
-- :todo:check f(0)~=0 sum(f:X,s:Symbol):X == S:=summation(f,s) h:HYPER:=pFq(S) eval(f,s::X=0) * hypergeometricF(h.ap,h.bq,h.fac)
-- S1:=sum((-1)^k*(x/2)^(2*k+p)/factorial(k)/factorial(k+p),k) -- S2:=sum(1/(2*n-1)/factorial(2*n+1),n) -- display pFq(S2)</spad>
fricas
Compiling FriCAS source code from file 
      /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/5770435868577614772-25px001.spad
      using old system compiler.
   HYPGEOM abbreviates package HyperGeometric 
------------------------------------------------------------------------
   initializing NRLIB HYPGEOM for HyperGeometric 
   compiling into NRLIB HYPGEOM 
   compiling local rational0? : (Expression Fraction Integer,Symbol) -> Boolean
Time: 0.05 SEC.
compiling exported rational? : (Expression Fraction Integer,Symbol) -> Boolean Time: 0 SEC.
compiling exported factoredForm : Expression Fraction Integer -> Expression Fraction Integer -> Fraction Factored SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer) Time: 0.03 SEC.
compiling exported factoredForm : Expression Fraction Integer -> Fraction Factored SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer) Time: 0.02 SEC.
compiling exported admissible? : Fraction Factored SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer) -> Boolean Time: 0 SEC.
compiling exported getParameters : Factored SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer) -> Record(ab: List SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer),const: List SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer)) Time: 0 SEC.
compiling exported convert : SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer) -> Expression Fraction Integer Time: 0 SEC.
compiling local buildConst : List SparseUnivariatePolynomial SparseMultivariatePolynomial(Fraction Integer,Kernel Expression Fraction Integer) -> Expression Fraction Integer Time: 0 SEC.
compiling exported pFq : Expression Fraction Integer -> Expression Fraction Integer -> Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer) Time: 0.02 SEC.
compiling exported pFq : Expression Fraction Integer -> Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer) Time: 0.02 SEC.
compiling exported construct : (Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer),Symbol) -> Expression Fraction Integer Time: 0.02 SEC.
compiling exported display : Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer) -> OutputForm processing macro definition OF ==> OutputForm Time: 0 SEC.
compiling local checkGauss2F1 : Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer) -> Boolean Time: 0.01 SEC.
compiling local checkKummer2F1 : Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer) -> Boolean Time: 0 SEC.
compiling exported hyperLookup : Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer) -> Expression Fraction Integer Time: 0.18 SEC.
compiling exported hgFtoHYPER : Expression Fraction Integer -> Record(ap: List Expression Fraction Integer,bq: List Expression Fraction Integer,fac: Expression Fraction Integer) Time: 0 SEC.
compiling exported sum : (Expression Fraction Integer,Symbol) -> Expression Fraction Integer Time: 0.05 SEC.
(time taken in buildFunctor: 0) Time: 0 SEC.
Warnings: [1] factoredForm: not known that (AlgebraicallyClosedField) is of mode (CATEGORY domain (IF (has (Fraction (Integer)) (IntegralDomain)) (PROGN (ATTRIBUTE (AlgebraicallyClosedFunctionSpace (Fraction (Integer)))) (ATTRIBUTE (TranscendentalFunctionCategory)) (ATTRIBUTE (CombinatorialOpsCategory)) (ATTRIBUTE (LiouvillianFunctionCategory)) (ATTRIBUTE (SpecialFunctionCategory)) (SIGNATURE reduce (% %)) (SIGNATURE number? ((Boolean) %)) (IF (has (Fraction (Integer)) (PolynomialFactorizationExplicit)) (ATTRIBUTE (PolynomialFactorizationExplicit)) noBranch) (SIGNATURE setSimplifyDenomsFlag ((Boolean) (Boolean))) (SIGNATURE getSimplifyDenomsFlag ((Boolean)))) noBranch)) [2] factoredForm: not known that (TranscendentalFunctionCategory) is of mode (CATEGORY domain (IF (has (Fraction (Integer)) (IntegralDomain)) (PROGN (ATTRIBUTE (AlgebraicallyClosedFunctionSpace (Fraction (Integer)))) (ATTRIBUTE (TranscendentalFunctionCategory)) (ATTRIBUTE (CombinatorialOpsCategory)) (ATTRIBUTE (LiouvillianFunctionCategory)) (ATTRIBUTE (SpecialFunctionCategory)) (SIGNATURE reduce (% %)) (SIGNATURE number? ((Boolean) %)) (IF (has (Fraction (Integer)) (PolynomialFactorizationExplicit)) (ATTRIBUTE (PolynomialFactorizationExplicit)) noBranch) (SIGNATURE setSimplifyDenomsFlag ((Boolean) (Boolean))) (SIGNATURE getSimplifyDenomsFlag ((Boolean)))) noBranch)) [3] getParameters: l1 has no value [4] getParameters: l2 has no value
Cumulative Statistics for Constructor HyperGeometric Time: 0.44 seconds
finalizing NRLIB HYPGEOM Processing HyperGeometric for Browser database: --->-->HyperGeometric(constructor): Not documented!!!! --------(rational? ((Boolean) (Expression (Fraction (Integer))) (Symbol)))--------- --------(factoredForm ((Fraction (Factored (SparseUnivariatePolynomial (SparseMultivariatePolynomial (Fraction (Integer)) (Kernel (Expression (Fraction (Integer)))))))) (Mapping (Expression (Fraction (Integer))) (Expression (Fraction (Integer))))))--------- --->-->HyperGeometric((factoredForm ((Fraction (Factored (SparseUnivariatePolynomial (SparseMultivariatePolynomial (Fraction (Integer)) (Kernel (Expression (Fraction (Integer)))))))) (Expression (Fraction (Integer)))))): Not documented!!!! --------(admissible? ((Boolean) (Fraction (Factored (SparseUnivariatePolynomial (SparseMultivariatePolynomial (Fraction (Integer)) (Kernel (Expression (Fraction (Integer))))))))))--------- --------(getParameters ((Record (: ab (List (SparseUnivariatePolynomial (SparseMultivariatePolynomial (Fraction (Integer)) (Kernel (Expression (Fraction (Integer)))))))) (: const (List (SparseUnivariatePolynomial (SparseMultivariatePolynomial (Fraction (Integer)) (Kernel (Expression (Fraction (Integer))))))))) (Factored (SparseUnivariatePolynomial (SparseMultivariatePolynomial (Fraction (Integer)) (Kernel (Expression (Fraction (Integer)))))))))--------- --------(convert ((Expression (Fraction (Integer))) (SparseUnivariatePolynomial (SparseMultivariatePolynomial (Fraction (Integer)) (Kernel (Expression (Fraction (Integer))))))))--------- --------(pFq ((Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer))))) (Mapping (Expression (Fraction (Integer))) (Expression (Fraction (Integer))))))--------- --->-->HyperGeometric((pFq ((Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer))))) (Expression (Fraction (Integer)))))): Not documented!!!! --------(construct ((Expression (Fraction (Integer))) (Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer))))) (Symbol)))--------- --------(display ((OutputForm) (Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer)))))))--------- --->-->HyperGeometric((display ((OutputForm) (Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer)))))))): Improper first word in comments: Fancy "Fancy display the output of \\spad{pFq}." --------(hyperLookup ((Expression (Fraction (Integer))) (Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer)))))))--------- --->-->HyperGeometric((hyperLookup ((Expression (Fraction (Integer))) (Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer)))))))): Improper first word in comments: Lookup "Lookup the output of \\spad{pFq} in a table." --------(createHyperF ((Expression (Fraction (Integer))) (Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer)))))))--------- --------(hgFtoHYPER ((Record (: ap (List (Expression (Fraction (Integer))))) (: bq (List (Expression (Fraction (Integer))))) (: fac (Expression (Fraction (Integer))))) (Expression (Fraction (Integer)))))--------- --->-->HyperGeometric((sum ((Expression (Fraction (Integer))) (Expression (Fraction (Integer))) (Symbol)))): Not documented!!!! --->-->HyperGeometric(): Missing Description ; compiling file "/var/aw/var/LatexWiki/HYPGEOM.NRLIB/HYPGEOM.lsp" (written 07 JUN 2026 05:13:20 PM):
; wrote /var/aw/var/LatexWiki/HYPGEOM.NRLIB/HYPGEOM.fasl ; compilation finished in 0:00:00.144 ------------------------------------------------------------------------ HyperGeometric is now explicitly exposed in frame initial HyperGeometric will be automatically loaded when needed from /var/aw/var/LatexWiki/HYPGEOM.NRLIB/HYPGEOM

fricas
)version
"FriCAS 1.3.12 compiled at Sat 7 Jun 23:54:49 CEST 2025"
-- binomial(n,k) -- expected: hypergeometricF([- n],[],- 1) = 2^n sum(binomial(n,k),'k)

\label{eq1}\sum_{
\displaystyle
k}{\hbox{\axiomType{BINOMIAL}\ } \left({n , \: k}\right)}(1)
Type: Expression(Integer)
fricas
sum(binomial(n,k),'k)$HYPGEOM

\label{eq2}hypergeometricF \left({{\left[ - n \right]}, \:{\left[ \right]}, \: - 1}\right)(2)
Type: Expression(Fraction(Integer))
fricas
-- x^k/k!
-- expected: hypergeometricF([],[],x) = exp(x)
sum(x^k/factorial(k),'k)$HYPGEOM

\label{eq3}hypergeometricF \left({{\left[ \right]}, \:{\left[ \right]}, \: x}\right)(3)
Type: Expression(Fraction(Integer))
fricas
-- Example 3.3.1.
-- expected: hypergeometricF([],[1],2)
sum(2^k/factorial(k)^2,'k)$HYPGEOM

\label{eq4}hypergeometricF \left({{\left[ \right]}, \:{\left[ 1 \right]}, \: 2}\right)(4)
Type: Expression(Fraction(Integer))
fricas
-- Example 3.3.2.
--                            1   3  1  1
-- expected: - hypergeometricF([- -],[-, -],-)
--                            2   2  2  4
sum(1/(2*k-1)/factorial(2*k+1),'k)$HYPGEOM

\label{eq5}-{hypergeometricF \left({{\left[ -{\frac{1}{2}}\right]}, \:{\left[{\frac{3}{2}}, \:{\frac{1}{2}}\right]}, \:{\frac{1}{4}}}\right)}(5)
Type: Expression(Fraction(Integer))
fricas
-- Example 3.3.4. 
-- expected: hypergeometricF([- n],[1],1)
sum(binomial(n,k)*(-1)^k/factorial(k),'k)$HYPGEOM

\label{eq6}hypergeometricF \left({{\left[ - n \right]}, \:{\left[ 1 \right]}, \: 1}\right)(6)
Type: Expression(Fraction(Integer))
fricas
-- Example 3.3.5. (Bessel: J_p(x))
--                                    1  2  1   p
--       hypergeometricF([],[p + 1],- - x )(- x)
--                                    4     2
--       ----------------------------------------
--                          p!
sum((-1)^k*(x/2)^(2*k+p)/factorial(k)/factorial(k+p),'k)$HYPGEOM

\label{eq7}\frac{{hypergeometricF \left({{\left[ \right]}, \:{\left[{p + 1}\right]}, \: -{{\frac{1}{4}}\ {{x}^{2}}}}\right)}\ {{\left({\frac{1}{2}}\  x \right)}^{p}}}{p !}(7)
Type: Expression(Fraction(Integer))
fricas
-- Sec 3.4 / binomial(n,k)^2
-- expected: hypergeometricF([- n, - n],[1],1)
sum(binomial(n,k)^2,k)$HYPGEOM

\label{eq8}hypergeometricF \left({{\left[ - n , \: - n \right]}, \:{\left[ 1 \right]}, \: 1}\right)(8)
Type: Expression(Fraction(Integer))
fricas
-- sum(x^k*binomial(n,k)^2,k)$HYPGEOM --> hypergeometricF([- n, - n],[1],x)
-- Sec 3.4.1 -- expected: binomial(r,n)/(r-n+1)*hypergeometricF([-n,n-r-1,(s-r)/2,(s-r+1)/2], -- [(1-r)/2,-r/2,s-r],1) sum((-1)^k*binomial(r - s - k, k)*binomial(r - 2*k, n - k)/(r - n - k + 1),k)$HYPGEOM

\label{eq9}\frac{{hypergeometricF \left({{\left[{{{\frac{1}{2}}\  s}-{{\frac{1}{2}}\  r}+{\frac{1}{2}}}, \:{{{\frac{1}{2}}\  s}-{{\frac{1}{2}}\  r}}, \: - n , \:{- r + n - 1}\right]}, \:{\left[{s - r}, \:{-{{\frac{1}{2}}\  r}+{\frac{1}{2}}}, \: -{{\frac{1}{2}}\  r}\right]}, \: 1}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({r , \: n}\right)}}{r - n + 1}(9)
Type: Expression(Fraction(Integer))
fricas
-- Sec 3.4.2
-- expected hypergeometricF([-n, -n, -n], [1, 1], -1),
sum(binomial(n, k)^3, k)$HYPGEOM

\label{eq10}hypergeometricF \left({{\left[ - n , \: - n , \: - n \right]}, \:{\left[ 1, \: 1 \right]}, \: - 1}\right)(10)
Type: Expression(Fraction(Integer))
fricas
-- Example 3.6.1
-- expected: hypergeometricF([- 2 n, - 2 n],[1],- 1) 
sum((-1)^k*binomial(2*n,k)^2,k)$HYPGEOM

\label{eq11}hypergeometricF \left({{\left[ -{2 \  n}, \: -{2 \  n}\right]}, \:{\left[ 1 \right]}, \: - 1}\right)(11)
Type: Expression(Fraction(Integer))
fricas
-- Example 3.6.2
-- expected: 
--                        1                            1     4 n
--       hypergeometricF([-, - 2 n, - 2 n],[1, - 2 n + -],1)(   )
--                        2                            2     2 n
-- tricky (in principle violates b>0, however, cancelling negative factorials)
sum((-1)^k*binomial(2*n,k)*binomial(2*k,k)*binomial(4*n-2*k,2*n-k),k)$HYPGEOM

\label{eq12}{hypergeometricF \left({{\left[{\frac{1}{2}}, \: -{2 \  n}, \: -{2 \  n}\right]}, \:{\left[ 1, \:{-{2 \  n}+{\frac{1}{2}}}\right]}, \: 1}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({{4 \  n}, \:{2 \  n}}\right)}(12)
Type: Expression(Fraction(Integer))
fricas
----------------
-- 3.8 Exercises
----------------
sum(binomial(n,k)*binomial(n+a,k)*binomial(n-a,n-k),k)$HYPGEOM

\label{eq13}{hypergeometricF \left({{\left[ - n , \: - n , \:{- n - a}\right]}, \:{\left[ 1, \:{- a + 1}\right]}, \: - 1}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({{n - a}, \: n}\right)}(13)
Type: Expression(Fraction(Integer))
fricas
sum(binomial(n,k)^5,k)$HYPGEOM

\label{eq14}hypergeometricF \left({{\left[ - n , \: - n , \: - n , \: - n , \: - n \right]}, \:{\left[ 1, \: 1, \: 1, \: 1 \right]}, \: - 1}\right)(14)
Type: Expression(Fraction(Integer))
fricas
sum((-1)^k*binomial(k,n-k),k)$HYPGEOM

\label{eq15}{hypergeometricF \left({{\left[ 1, \: 1, \: - n \right]}, \:{\left[{-{{\frac{1}{2}}\  n}+ 1}, \:{-{{\frac{1}{2}}\  n}+{\frac{1}{2}}}\right]}, \:{\frac{1}{4}}}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({0, \: n}\right)}(15)
Type: Expression(Fraction(Integer))
fricas
---- 3.a-g
sum(binomial(n,k)/binomial(2*n-1,k),k)$HYPGEOM

\label{eq16}hypergeometricF \left({{\left[ 1, \: - n \right]}, \:{\left[{-{2 \  n}+ 1}\right]}, \: 1}\right)(16)
Type: Expression(Fraction(Integer))
fricas
sum(binomial(n,k)^2*binomial(3*n+k,2*n),k)$HYPGEOM

\label{eq17}{hypergeometricF \left({{\left[{{3 \  n}+ 1}, \: - n , \: - n \right]}, \:{\left[{n + 1}, \: 1 \right]}, \: 1}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({{3 \  n}, \:{2 \  n}}\right)}(17)
Type: Expression(Fraction(Integer))
fricas
sum((-1)^k*binomial(n,k)*factorial(k+3*a)/factorial(k+a),k)$HYPGEOM

\label{eq18}\frac{{hypergeometricF \left({{\left[{{3 \  a}+ 1}, \: - n \right]}, \:{\left[{a + 1}\right]}, \: 1}\right)}\ {{\left(3 \  a \right)}!}}{a !}(18)
Type: Expression(Fraction(Integer))
fricas
sum(4^k*(-1)^k*binomial(k+a,a)*binomial(n+k,2*k+2*a),k)$HYPGEOM

\label{eq19}{hypergeometricF \left({{\left[{n + 1}, \:{- n +{2 \  a}}\right]}, \:{\left[{a +{\frac{1}{2}}}\right]}, \: 1}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({n , \:{2 \  a}}\right)}(19)
Type: Expression(Fraction(Integer))
fricas
sum(binomial(2*n+2,2*k+1)*binomial(x+k,2*n+1),k)$HYPGEOM

\label{eq20}\begin{array}{@{}l}
\displaystyle
{\left({2 \  n}+ 2 \right)}\  \cdot 
\
\
\displaystyle
{hypergeometricF \left({{\left[{x + 1}, \: - n , \:{- n -{\frac{1}{2}}}\right]}, \:{\left[{x -{2 \  n}}, \:{\frac{3}{2}}\right]}, \: 1}\right)}\  \cdot 
\
\
\displaystyle
{\hbox{\axiomType{BINOMIAL}\ } \left({x , \:{{2 \  n}+ 1}}\right)}
(20)
Type: Expression(Fraction(Integer))
fricas
sum(binomial(2*n+1,2*p+2*k+1)*binomial(p+k,k),k)$HYPGEOM

\label{eq21}{hypergeometricF \left({{\left[{p - n +{\frac{1}{2}}}, \:{p - n}\right]}, \:{\left[{p +{\frac{3}{2}}}\right]}, \: 1}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({{{2 \  n}+ 1}, \:{{2 \  p}+ 1}}\right)}(21)
Type: Expression(Fraction(Integer))
fricas
sum((-1)^k*binomial(2*n,k)*binomial(2*x,x+n-k)*binomial(2*z,z-n+k),k)$HYPGEOM

\label{eq22}\begin{array}{@{}l}
\displaystyle
{hypergeometricF \left({{\left[ -{2 \  n}, \:{- x - n}, \:{- z - n}\right]}, \:{\left[{z - n + 1}, \:{x - n + 1}\right]}, \: 1}\right)}\  \cdot 
\
\
\displaystyle
{\hbox{\axiomType{BINOMIAL}\ } \left({{2 \  x}, \:{x + n}}\right)}\ {\hbox{\axiomType{BINOMIAL}\ } \left({{2 \  z}, \:{z - n}}\right)}
(22)
Type: Expression(Fraction(Integer))
fricas
----
f:=-sum(1/(2*k-1)/factorial(2*k+1),'k)$HYPGEOM

\label{eq23}hypergeometricF \left({{\left[ -{\frac{1}{2}}\right]}, \:{\left[{\frac{3}{2}}, \:{\frac{1}{2}}\right]}, \:{\frac{1}{4}}}\right)(23)
Type: Expression(Fraction(Integer))
fricas
hgFtoHYPER f

\label{eq24}\left[{ap ={\left[ -{\frac{1}{2}}\right]}}, \:{bq ={\left[{\frac{3}{2}}, \:{\frac{1}{2}}\right]}}, \:{fac ={\frac{1}{4}}}\right](24)
Type: Record(ap: List(Expression(Fraction(Integer))),bq: List(Expression(Fraction(Integer))),fac: Expression(Fraction(Integer)))
fricas
sum((-1)^k*binomial(n,k),'k)$HYPGEOM --> 0?

\label{eq25}hypergeometricF \left({{\left[ - n \right]}, \:{\left[ \right]}, \: 1}\right)(25)
Type: Expression(Fraction(Integer))