home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-07-29 | 53.5 KB | 1,503 lines |
-
- (* Copyright 1991 Wolfram Research Inc.*)
-
- (*:Version: Mathematica 2.0 *)
-
- (*:Name: Algebra`SymbolicSum` *)
-
- (*:Author:
- Victor S. Adamchik, February 1991.
- *)
-
- (*:Keywords:
- InfiniteSum, FiniteSum, Product
- *)
-
- (*:Requirements: none. *)
-
- (*:Limitations:
- This package can evaluate symbolic sums of the following type
- Sum[ a[k],{k,min,max} ] ,
- where
- a[k+1]/a[k] is a rational function.
- *)
-
- BeginPackage["Algebra`SymbolicSum`"]
-
- SymbolicSum::usage = "SymbolicSum[f, {i, imin, imax}] attempts
- to find the value of Sum[f, {i, imin, imax} ] for symbolic
- imin,imax. SymbolicSum[f, {i, imax}] evaluates the sum of f
- with i running from 1 to imax."
-
- Begin["`Private`"]
-
- (*========================================================================*)
-
- Unprotect[ Sum,SymbolicSum,Product ]
-
- trig = offHyper = True
-
- Sum[ expr_,{k_Symbol,max_} ] := Sum[expr,{k,1,max}]/;Not[NumberQ[max]]
-
- Sum[ expr_,{k_Symbol,min_,max_} ] :=
- Module[ {answer,inter=FailSum,p},
- answer = SymbolicSumD[expr//.{
- a_^(b_. k) :> (a^b)^k/;FreeQ[{a,b},k],
- a_^k b_^k :> (a b)^k/;FreeQ[{a,b},k]}/.{
- (- a_)^b_ :> (-1)^b a^b /; a=!=1 },{k,min,max}];
- If[ !FreeQ[answer,Donor],
- While[ !FreeQ[inter,FailSum],
- inter =
- Block[ {FiniteSum},
- Reduction[SumFloor[ expr,{k,min,max},
- Cases[p answer,w_/;Not[FreeQ[w,Donor]]][[1]]/.
- a_. Donor[x_,y_] :> x], FiniteSum]
- ];
- answer = If[ Length[answer[[2]]] == 0,
- Donor[True,{}],
- Donor[answer[[2,1]],Complement[Rest[answer[[2]]]]]];
- inter
- ];
- answer = inter,
- answer ];
- (answer//.complex) /; FreeQ[answer,FailSum]
- ]/;
- FreeQ[min,Floor] && Not[FreeQ[max,Floor]]
-
- Sum[ expr_, {k_Symbol,min_,max_} ] :=
- Module[ {answer},
- answer = SymbolicSumD[Expand[expr//.{
- a_^(b_. k) :> (a^b)^k/;FreeQ[{a,b},k],
- a_^k b_^k :> (a b)^k/;FreeQ[{a,b},k]}/.{
- (- a_)^b_ :> (-1)^b a^b /; a=!=1 }],{k,min,max}];
- If[ FreeQ[{max,min}, DirectedInfinity],
- Factor[answer],
- answer ]/; And@@(FreeQ[answer,#]&/@{FailSum,Donor})
- ]/;FreeQ[{min,max}, Complex] &&(!NumberQ[max] || !NumberQ[min])
-
- (*========================================================================*)
-
- SymbolicSum[ expr_,{k_Symbol,max_} ] :=
- SymbolicSum[expr,{k,1,max}]/;Not[NumberQ[N[max]]]
-
- SymbolicSum[ expr_,{k_Symbol,min_,max_} ] :=
- Module[ {answer,inter=FailSum,p},
- answer = SymbolicSumD[expr//.{
- a_^(b_. k) :> (a^b)^k/;FreeQ[{a,b},k],
- a_^k b_^k :> (a b)^k/;FreeQ[{a,b},k]}/.{
- (- a_)^b_ :> (-1)^b a^b /; a=!=1 },{k,min,max}];
- If[ !FreeQ[answer,Donor],
- While[ !FreeQ[inter,FailSum],
- inter =
- Block[ {FiniteSum},
- Reduction[SumFloor[ expr,{k,min,max},
- Cases[p answer,w_/;Not[FreeQ[w,Donor]]][[1]]/.
- a_. Donor[x_,y_] :> x], FiniteSum]
- ];
- answer = If[ Length[answer[[2]]] == 0,
- Donor[True,{}],
- Donor[answer[[2,1]],Complement[Rest[answer[[2]]]]]];
- inter
- ];
- answer = inter,
- answer ];
- (answer//.complex) /; FreeQ[answer,FailSum]
- ]/;
- FreeQ[min,Floor] && Not[FreeQ[max,Floor]]
-
- SymbolicSum[ expr_, {k_Symbol,min_,max_} ] :=
- Module[ {answer},
- answer = SymbolicSumD[Expand[expr//.{
- a_^(b_. k) :> (a^b)^k/;FreeQ[{a,b},k],
- a_^k b_^k :> (a b)^k/;FreeQ[{a,b},k]}/.{
- (- a_)^b_ :> (-1)^b a^b /; a=!=1 }],{k,min,max}];
- If[ FreeQ[{max,min}, DirectedInfinity],
- Factor[answer],
- answer ]/; And@@(FreeQ[answer,#]&/@{FailSum,Donor})
- ] /; FreeQ[{min,max}, Complex] &&(!NumberQ[max] || !NumberQ[min])
-
-
- (*========================================================================*)
-
- (*========================================================================*)
-
- Product[ expr_,{k_Symbol,max_} ] :=
- Product[expr,{k,1,max}] /; Not[NumberQ[N[max]]]
-
- Product[ expr_, {k_Symbol,min_,max_} ] :=
- Module[ {answer,r},
- Flag1 = Flag2 = Flag3 = True;
- answer = SymbolicProduct[expr,{k,min,max}];
- If[ !FreeQ[answer,FailSum],
- If[ !SameQ[r = Factor[expr]/.
- { c_. k^2+a_. k+b_ :> c PowerExpand[
- (k+(a/c+Sqrt[a^2/c^2-4b/c])/2) *
- (k+(a/c-Sqrt[a^2/c^2-4b/c])/2),{k}] /;
- FreeQ[{a,b,c},k]
- },expr],
- answer = SymbolicProduct[r ,{k,min,max}]
- ]
- ];
- If[ !FreeQ[answer,FailSum],
- If[ !SameQ[r = Together[expr],expr],
- answer = SymbolicProduct[r ,{k,min,max}]
- ]
- ];
- If[ !FreeQ[answer,Product],
- TransfAnswerForProduct[answer/.
- Product[f_,{p_,minp_,maxp_}] :>
- Product[f/.p->k,{k,minp,maxp}]],
- TransfAnswerForProduct[answer]
- ] /; FreeQ[answer,FailSum]
- ]/;FreeQ[{min,max},Null] && (Not[NumberQ[N[max]]] || Not[NumberQ[N[min]]])
-
- (*========================================================================*)
-
- SymbolicSumD[ expr_,{k_,min_Integer,max_Integer} ] :=
- Sum[expr,{k,min,max}]
-
- SymbolicSumD[ expr_,{k_,DirectedInfinity[-1],max_/;max=!=Infinity} ] :=
- Module[ {var},
- SymbolicSumD[ expr/.k->-var,{var,-max,Infinity} ]
- ]
-
- SymbolicSumD[ expr_,{k_,min_,max_} ] := 0/; Not[NumberQ[N[min]]] &&
- Not[NumberQ[N[max]]] && max=!=Infinity && ZnakSum[max-min]
-
- SymbolicSumD[ const_ expr_,{k_,min_,max_} ] :=
- const SymbolicSumD[expr,{k,min,max}] /;
- FreeQ[const,k]
-
- SymbolicSumD[ expr1_ + expr2_,{arg__} ] :=
- Module[ { answer },
- answer = SymbolicSumD[expr1,{arg}];
- If[ !FreeQ[answer,FailSum] || !FreeQ[answer,DirectedInfinity],
- answer = FailSum,
- answer += SymbolicSumD[expr2,{arg}];
- If[ !FreeQ[answer,FailSum] || !FreeQ[answer,DirectedInfinity],
- FailSum,
- TransfAnswer[ answer ]
- ]
- ]
- ]
-
- SymbolicSumD[ q_^(c_. (a1_+a2_)) expr_.,{k_,min_,max_} ] :=
- q^(c a1) SymbolicSumD[(q^c)^a2 expr/.
- (-1)^(n_?EvenQ s_) :> 1,{k,min,max}]/;
- FreeQ[{q,a1,c},k]
-
- SymbolicSumD[ (-1)^(n_?Negative s_) expr_,{k_,min_,max_} ] :=
- SymbolicSumD[ Times@@{(-1)^(-n s),expr},{k,min,max} ]
-
- SymbolicSumD[ expr_,{k_,min_,Infinity} ] :=
- Module[ {p,answer},
- answer = SymbolicSumD[(expr/.k->(p+min))/.{Plus->ExpandPlus}/.
- {a_^b_ :> a^Expand[b]},{p,0,Infinity}];
- If[ !FreeQ[answer,FailSum],
- SymbolicSumD[expr/.k->(p+min),{p,0,Infinity}],
- answer ]
- ] /;min=!=DirectedInfinity[-1] &&
- (Not[NumberQ[min]] || IntegerQ[min] && Positive[min])
-
- ExpandPlus[ v__ ] := Expand[Plus[v]]
-
- SymbolicSumD[ expr_,{k_,min_Integer,max_} ] := 0 /; ZnakSum[max]
-
- SymbolicSumD[ expr_,{k_,n_Integer?Positive + Floor[p_],m_} ] := 0/;
- Expand[m-p]<=0
-
- SymbolicSumD[ expr_,{k_,n_Integer?Positive + Floor[p_],Floor[m_]} ] := 0/;
- Expand[m-p]<=0
-
- SymbolicSumD[ expr_,{k_,min_,max_} ] :=
- Module[ {p},
- SymbolicSumD[(expr/.k->(p+min))/.{
- q_^w_ :> q^Expand[w],
- Cos[ w_ ] :> Cos[Expand[w]]/;Not[FreeQ[w,k]],
- Sin[ w_ ] :> Sin[Expand[w]]/;Not[FreeQ[w,k]]
- }/.Plus->ExpandPlus,{p,0,max-min}]
- ]/; FreeQ[{min,max},Floor] && max=!=Infinity &&
- !NumberQ[N[min]] && !NumberQ[N[max]]
-
- SymbolicSumD[ expr_,{k_,min_,max_} ] :=
- Module[ {exprnew},
- exprnew = Expand[expr,Trig->True]/.
- { Cos[ w_ ] :> Cos[Collect[w,k]]/;Not[FreeQ[w,k]],
- Sin[ w_ ] :> Sin[Collect[w,k]]/;Not[FreeQ[w,k]] };
- SymbolicSumDTrig[ exprnew,{k,min,max} ]
- ]/; trig &&
- Or@@(Not[FreeQ[expr,#]]&/@{Sin,Cos})
-
- SymbolicSumD[ expr_,{k_,min_,max_} ] :=
- SymbolicSumD[ Expand[expr//.
- {
- Sinh[w_] :> E^w/2 - E^(-w)/2,
- Cosh[w_] :> E^w/2 + E^(-w)/2
- }], {k,min,max}]/;
- Or@@(Not[FreeQ[expr,#]]&/@{Sinh,Cosh})
-
- SymbolicSumD[ expr_,{k_,min_Integer,DirectedInfinity[1]} ] :=
- GlobInfiniteSum[expr,{k,min,DirectedInfinity[1]}]
-
- SymbolicSumD[ expr_,{k_,DirectedInfinity[-1],DirectedInfinity[1]} ] :=
- GlobInfiniteSum[expr,
- {k,DirectedInfinity[-1],DirectedInfinity[1]}]
-
- SymbolicSumD[ expr_,{k_,min_Integer,max_} ] :=
- Block[ {answer,TransfAnswer},
- answer = FiniteSum[expr,{k,min,max}];
- If[ FreeQ[answer,Donor] && FreeQ[answer,TransfAnswer],
- TransfAnswer[answer],
- answer ] /; And@@(FreeQ[answer,#]&/@{FailSum,DirectedInfinity})
- ]/;
- Not[IntegerQ[max]] && max=!=Infinity
-
- SymbolicSumD[ expr_,{k_,min_,max_} ] := k FailSum
-
- (*========================================================================
-
- Trigonometric Finite Sum
-
- ========================================================================*)
-
- SymbolicSumDTrig[ const_ expr_,{k_,min_,max_} ] :=
- const SymbolicSumDTrig[expr,{k,min,max}]/;FreeQ[const,k]
-
- SymbolicSumDTrig[ expr_Plus,{k_,min_,max_} ] :=
- SymbolicSumDTrig[#,{k,min,max}]&/@expr
-
- SymbolicSumDTrig[ f_[x_. k_ + a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- Csc[x/2] Sin[Expand[x (max+1)/2]] f[Expand[x max/2 + a]] +
- If[Negative[min],1,-1] SumNew[f[x k+a],{k,0,min-1}] /;
- (f===Sin || f===Cos) && FreeQ[{a,x,max},k] && max=!=Infinity
-
- SymbolicSumDTrig[ (-1)^k_ f_[x_. k_+a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- Sec[x/2] Sin[Expand[(x+Pi) (max+1)/2]] f[Expand[(x+Pi) max/2] + a] +
- If[Negative[min],1,-1] SumNew[(-1)^k f[x k+a],{k,0,min-1}] /;
- (f===Sin || f===Cos) && FreeQ[{a,x,max},k] && max=!=Infinity
-
- SymbolicSumDTrig[ Binomial[max_,k_] f_[x_. k_ + a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- 2^max Cos[x/2]^max f[Expand[a+ max x/2]] +
- If[Negative[min],1,-1] SumNew[Binomial[max,k] f[x k+a],{k,0,min-1}] /;
- (f===Sin || f===Cos) && FreeQ[{a,x,max},k] && max=!=Infinity
-
- SymbolicSumDTrig[ (-1)^k_ Binomial[max_,k_] f_[x_. k_ + a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- (-1)^max 2^max Sin[x/2]^max f[Expand[a+ max (Pi+x)/2]] +
- If[Negative[min],1,-1] *
- SumNew[ (-1)^k Binomial[max,k] f[x k+a],{k,0,min-1}] /;
- (f===Sin || f===Cos) && FreeQ[{a,x,max},k] && max=!=Infinity
-
- SymbolicSumDTrig[ k_^m_Integer?EvenQ f_[x_. k_ + a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- Module[ {var},
- (-1)^(m/2) *
- D[ SymbolicSumDTrig[f[var k+a],{k,min,max}], {var,m}]/.var->x
- ] /; Positive[m]
-
- SymbolicSumDTrig[ (-1)^k_ k_^m_Integer?EvenQ f_[x_. k_ + a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- Module[ {var},
- (-1)^(m/2) *
- D[SymbolicSumDTrig[(-1)^k f[var k+a],{k,min,max}],{var,m}]/.var->x
- ] /; Positive[m]
-
- SymbolicSumDTrig[ k_^m_. f_[x_. k_ + a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- Module[ {var},
- D[ SymbolicSumDTrig[
- If[ f===Sin,
- If[ OddQ[Floor[(m-1)/2]],1,-1] Cos[var k+a],
- If[ OddQ[Floor[(m-1)/2]],-1,1] Sin[var k+a] ],
- {k,min,max} ],{var,m} ]/.var->x
- ] /; IntegerQ[m] && OddQ[m] && Positive[m]
-
- SymbolicSumDTrig[ (-1)^k_ k_^m_. f_[x_. k_ + a_.],
- {k_,min_Integer,max_/;FreeQ[max,Floor]} ] :=
- Module[ {var},
- D[ SymbolicSumDTrig[
- If[ f==Sin,
- If[ OddQ[Floor[(m-1)/2]],1,-1] Cos[var k+a] (-1)^k,
- If[ OddQ[Floor[(m-1)/2]],-1,1] Sin[var k+a] (-1)^k ],
- {k,min,max} ],{var,m} ]/.var->x
- ] /; IntegerQ[m] && OddQ[m] && Positive[m]
-
- SymbolicSumDTrig[ expr_,{k_,min_,max_} ] :=
- SymbolicSumD[expr,{k,min,max}] /; FreeQ[expr,Sin] && FreeQ[expr,Cos]
-
- SymbolicSumDTrig[ expr_,{k_,min_,max_} ] :=
- Module[ { answer },
- trig = False;
- answer = SymbolicSumD[ Expand[expr//.
- {
- Sin[w_Plus] :> Module[ {const}, const = ComPlus[w,k];
- Sin[w-const] Cos[const] + Cos[w-const] Sin[const] ] /;!FreeQ[w,k],
- Cos[w_Plus] :> Module[ {const}, const = ComPlus[w,k];
- Cos[w-const] Cos[const] - Sin[w-const] Sin[const] ] /;!FreeQ[w,k],
- Sin[w_] :> - I E^(w I)/2 + I E^(-w I)/2 /;!FreeQ[w,k],
- Cos[w_] :> E^(w I)/2 + E^(-w I)/2 /;!FreeQ[w,k]
- }
- ], {k,min,max}];
- trig = True;
- answer
- ]
-
-
- (*========================================================================
-
- Infinite Sum
-
- ========================================================================*)
-
- GlobInfiniteSum[ expr_,{k_,min_Integer,DirectedInfinity[1]} ] :=
- Block[ {TransfAnswer,answer,p},
- answer = InfiniteSum[(Expand[expr]//.
- { a_^(b_. k+r1_.) c_^(d_. k+r2_.) :>
- a^r1 c^r2 (a^b c^d)^k/;FreeQ[{a,b,c,d},k],
- Floor[a_Times] :> Floor[Expand[a]],
- Floor[k+n_.] :> k+n /; IntegerQ[n],
- Floor[k+n_Rational] :> k+Floor[n]
- })/.
- {(n_?Negative a_)^b_ :> (-1)^b (-n a)^b},k,min];
- If[ !FreeQ[answer,DirectedInfinity],
- answer,
- If[ !FreeQ[answer,FailSum],
- answer = InfiniteSum[(Factor[expr]//.
- {
- a_^(b_. k+r1_.) c_^(d_. k+r2_.) :>
- a^r1 c^r2 (a^b c^d)^k/;FreeQ[{a,b,c,d},k]
- })/.{(n_?Negative a_)^b_ :> (-1)^b (-n a)^b
- },
- k,min];
- If[ !FreeQ[answer,FailSum],
- p FailSum,
- TransfAnswer[answer/.TransfAnswer[ w_ ] :> w]
- ],
- TransfAnswer[answer/.TransfAnswer[ w_ ] :> w]
- ]
- ]
- ]
-
- GlobInfiniteSum[ expr_,{k_,DirectedInfinity[-1],DirectedInfinity[1]} ] :=
- Block[ {TransfAnswer,answer,r},
- If[ Expand[expr/.k->-z] === Expand[expr/.k->z],
- answer = 2 GlobInfiniteSum[expr,{k,0,DirectedInfinity[1]}] -
- (expr/.k->0),
- answer =
- SymbolicSumD[expr,{k,0,Infinity}] +
- SymbolicSumD[expr/.k->-r,{r,1,Infinity}]/.
- {TransfAnswer[ w_ ] :> w}];
- TransfAnswer[ answer ] /; FreeQ[answer,FailSum]
- ]
-
- GlobInfiniteSum[ __ ] := Module[ {var}, var FailSum ]
-
- InfiniteSum[ k_^_Integer?Negative expr_.,k_,0 ] :=
- (Message[Power::infy,HoldForm[1/0]]; DirectedInfinity[])
-
- InfiniteSum[ expr1_ + expr2_,k_,min_ ] :=
- Module[ { answer },
- answer = InfiniteSum[expr1,k,min];
- If[ !FreeQ[answer,FailSum] || !FreeQ[answer,DirectedInfinity],
- answer = FailSum,
- answer += InfiniteSum[expr2,k,min];
- If[ !FreeQ[answer,FailSum] || !FreeQ[answer,DirectedInfinity],
- FailSum,
- TransfAnswer[ answer ]
- ]
- ]
- ]
-
- InfiniteSum[ expr_,k_,min_ ] := expr Infinity/;FreeQ[expr,k]
-
- InfiniteSum[ const_ expr_,k_,min_ ] :=
- const InfiniteSum[expr,k,min] /;FreeQ[const,k]
-
- InfiniteSum[ q_^(a1_+a2_) expr_.,k_,min_ ] :=
- q^a1 InfiniteSum[q^a2 expr/.(-1)^(n_?EvenQ s_) :> 1,k,min]/;
- FreeQ[{q,a1},k]
-
- InfiniteSum[ (-1)^(n_?Negative s_) expr_,k_,min_ ] :=
- InfiniteSum[ Times@@{(-1)^(-n s),expr},k,min ]
-
- InfiniteSum[ q_^k_ expr_,k_,min_ ] :=
- Module[ { exprnew, pp, pp1},
- exprnew = expr//.
- {
- a_. (d_. k+c_.)^2 +b_ :> (pp1 = Sqrt[b];
- (Sqrt[a] d k+Sqrt[a] c+I pp)*
- (Sqrt[a] d k+Sqrt[a] c-I pp) )/;
- FreeQ[{a,b,c,d},k] && Not[Znak[a]]&&Not[Znak[b]],
- a_. (d_. k+c_.)^n_+b_ :> Factor[a (d k+c)^n+b] /;
- IntegerQ[n] && FreeQ[{a,b,c,d},k]
- };
- exprnew = Expand[q^k Apart[exprnew,k]];
- ( InfiniteSum[ exprnew,k,min ]/.pp->pp1 )/;
- Head[exprnew]===Plus && expr=!=exprnew
- ]
-
- (*=============== Zeta Function ========================================*)
-
- InfiniteSum[ k_^s_.,k_,1 ] := Zeta[-s]/;
- FreeQ[s,k]&&(Not[NumberQ[s]] || Re[s]<-1)
-
- InfiniteSum[ k_^s_.,k_,min_?Positive ] :=
- Zeta[-s] - Sum[k^s,{k,1,min-1}]/;
- FreeQ[s,k]&&(Not[NumberQ[s]] || Re[s]<-1)
-
- InfiniteSum[ (b_. k_+a_)^s_.,k_,0 ] :=
- If[ !IntegerQ[a/b] || Positive[N[a/b]] || !NumberQ[s],
- b^s Zeta[-s,a/b],
- 0^s
- ]/; FreeQ[{a,b,s},k] &&
- (!NumberQ[s] || Re[s]<-1)
-
- InfiniteSum[ (b_. k_+a_)^s_.,k_,min_/;min=!=0 ] :=
- b^s Zeta[-s,a/b] +
- If[Negative[min],1,-1] SumNew[(b k+a)^s,{k,0,min-1}]/;
- FreeQ[{a,b,s},k]&&(Not[NumberQ[s]] || Re[s]<-1)
-
- InfiniteSum[ (b_. k_+a_.)^s_.,k_,min_ ] := Infinity/;FreeQ[{a,b,s},k]
-
- InfiniteSum[ (-1)^k_ k_^s_.,k_,1 ] :=
- If[(-s)===1,-Log[2],(2^(1+s) - 1) Zeta[-s]]/;
- FreeQ[s,k]&&(Not[NumberQ[s]] || Re[s]<0)
-
- InfiniteSum[ (-1)^k_ k_^s_.,k_,min_?Positive ] :=
- If[(-s)===1,-Log[2],(2^(1+s) - 1) Zeta[-s]] -
- Sum[(-1)^k k^s,{k,1,min-1}]/;
- FreeQ[s,k]&&(Not[NumberQ[s]] || Re[s]<0)
-
- InfiniteSum[ (-1)^k_ (b_. k_+a_)^s_.,k_,0 ] :=
- If[ (-s)===1,
- (PolyGamma[0,(a/b+1)/2]-PolyGamma[0,a/(2b)])/(2b),
- If[ !IntegerQ[a/b] || Positive[a/b] || !NumberQ[s],
- (2b)^s (Zeta[-s,a/(2b)] - Zeta[-s,a/(2b)+1/2]),
- 0^s
- ]
- ]/;
- FreeQ[{a,b,s},k]&&(Not[NumberQ[s]] || Re[s]<0)
-
- InfiniteSum[ (-1)^k_ (b_. k_+a_)^s_.,k_,min_/;min=!=0 ] :=
- If[(-s)===1,(PolyGamma[0,a/(2b)+1/2]-PolyGamma[0,a/(2b)])/(2b) -
- If[Negative[min],1,-1] SumNew[(-1) (b k+a)^s,{k,0,min-1}],
- (2b)^s (Zeta[-s,a/(2b)] - Zeta[-s,a/(2b)+1/2]) +
- If[Negative[min],1,-1] SumNew[(-1)^k (b k+a)^s,{k,0,min-1}]]/;
- FreeQ[{a,b,s},k]&&(Not[NumberQ[s]] || Re[s]<0)
-
- InfiniteSum[ (-1)^k_ (b_. k_+a_.)^s_.,k_,min_ ] := FailSum/;FreeQ[{a,b,s},k]
-
-
- (*=============== LerchPhi Function =======================================*)
-
- InfiniteSum[ x_^(c_. k_) (b_. k_ + a_.)^s_.,k_,min_ ] :=
- InfiniteSumLerchPhi[(x^c)^k (b k+a)^s,k,min] /;
- FreeQ[{a,b,c,x,s},k]
-
- InfiniteSum[ (-1)^k_ x_^(c_. k_) (b_. k_ + a_.)^s_.,k_,min_ ] :=
- InfiniteSumLerchPhi[(-x^c)^k (b k+a)^s,k,min]/;
- FreeQ[{a,b,c,x,s},k]
-
- InfiniteSumLerchPhi[ x_^k_ k_^s_.,k_,min_?Positive ] :=
- x LerchPhi[x,-s,1] - Sum[x^k k^s,{k,1,min-1}]/;FreeQ[{x,s},k]
-
- InfiniteSumLerchPhi[ x_^k_ (b_. k_ + a_.)^s_.,k_,min_ ] :=
- ComplexInfinity /;IntegerQ[a/b] && (a + min) <= 0
-
- InfiniteSumLerchPhi[ x_^k_ (b_. k_ + a_.)^s_.,k_,min_ ] :=
- b^s LerchPhi[x,-s,a/b] +
- If[Negative[min],1,-1] SumNew[x^k (b k+a)^s,{k,0,min-1}]/;
- FreeQ[{a,b,x,s},k] && Not[CondLerch[a/b,min]]
-
- InfiniteSumLerchPhi[ x_^k_ (b_. k_ + a_)^s_.,k_,min_ ] :=
- b^s Module[{n},
- InfiniteSum[x^Expand[n-a/b] n^s,n,min+a/b]]/;
- FreeQ[{a,b,x,s},k] && CondLerch[a/b,min]
-
- CondLerch[ a_,min_ ] := True/;IntegerQ[a]&&Negative[a]&&min+a>0
-
- CondLerch[ __ ] := False
-
- (*==========================================================================*)
-
- InfiniteSum[ (-1)^(c_. k_),k_,min_ ] := FailSum
-
- InfiniteSum[ x_^(c_. k_),k_,min_ ] := Infinity /;
- Abs[N[x^c]] >= 1.
-
- InfiniteSum[ (-1)^k_ x_^(c_. k_),k_,min_ ] := Infinity /;
- Abs[N[x^c]] > 1.
-
- (*=============== Hypergeometric Function =================================*)
-
- InfiniteSum[ 1/(k_^4 + a_),k_,min_ ] :=
- Module[ { v = Pi Sqrt[2] a^(1/4) },
- 1/(2a) + Pi^4(Sinh[v]+Sin[v])/((Cosh[v]-Cos[v]) v^3) -
- Sum[1/(i^4+a^4),{i,0,min-1}]
- ]/;
- FreeQ[a,k] && !Znak[a]
-
- InfiniteSum[ (-1)^k/(k_^4 + a_),k_,min_ ] :=
- Module[ { v = Pi Sqrt[2] a^(1/4), u = Pi a^(1/4)/Sqrt[2] },
- 1/(2a) - Pi^4(Sinh[v]+Sin[v])/((Cosh[v]-Cos[v]) v^3) +
- Pi^4(Sinh[u]+Sin[u])/((Cosh[u]-Cos[u]) v^3) -
- Sum[If[i==0,1,(-1)^i]/(i^4+a^4),{i,0,min-1}]
- ]/;
- FreeQ[a,k] && !Znak[a]
-
- InfiniteSum[ expr_. Gamma[c_. + k_/2]^n_.,k_,0 ] :=
- Module[ {m},
- GlobInfiniteSum[(expr Gamma[c+m]^n)/.k->(2 m),{m,0,Infinity}] +
- GlobInfiniteSum[(expr Gamma[c+m+1/2]^n)/.k->(2 m+1),{m,0,Infinity}]
- ]
-
- InfiniteSum[ expr_,k_,min_ ] :=
- Module[ { eps,exprnew,exprold },
- exprnew = expr//.{
- Gamma[a_Times] :> Gamma[Expand[a]],
- Factorial[a_Times] :> Factorial[Expand[a]]
- };
- If[ !FreeQ[exprnew,Pochhammer],
- exprnew = exprnew/.{
- Pochhammer[a_,n_Integer?Positive + k] :>
- Pochhammer[a,n] Pochhammer[a+n,k]
- }
- ];
- exprold = exprnew;
- If[ !FreeQ[exprnew,Gamma],
- exprnew = exprnew//.
- {Gamma[a_. k+b_]^n_. :>
- Gamma[b]^n (a^(n a))^k *
- Product[Pochhammer[(b+i)/a,k]^n,{i,0,a-1}] /;
- FreeQ[b,k] && IntegerQ[a] && a>0 && IntegerQ[n],
- Gamma[a_. k+b_]^n_. :>
- (-1)^(-a k n) Gamma[b]^n ((-a)^(-n a))^k *
- Product[Pochhammer[Expand[(b-i)/a],k]^(-n),{i,1,-a}]/;
- FreeQ[b,k] && IntegerQ[a] && a<0 && IntegerQ[n]
- }];
- If[ !FreeQ[exprnew,Factorial] || !FreeQ[exprnew,Binomial],
- exprnew = exprnew//.
- { Binomial[w_,v_]^n_. :>
- w!^n/(v!^n (w-v)!^n),
- (a_. k+b_.)!^n_. :>
- Gamma[b+1]^n (a^(n a))^k *
- Product[Pochhammer[(b+i)/a,k]^n,{i,1,a}]/;
- IntegerQ[n] && IntegerQ[a] && a>0 && FreeQ[b,k]
- }];
- exprnew = exprnew//.
- {
- c_. k^2 + a_. k + b_ :> c PowerExpand[(k+(a/c+Sqrt[a^2/c^2-4b/c])/2)*
- (k+(a/c-Sqrt[a^2/c^2-4b/c])/2),{k}] /;
- FreeQ[{a,b,c},k],
- a_. (d_. k+c_.)^2 + b_ :> (Sqrt[a] d k+Sqrt[a] c+I Sqrt[b])*
- (Sqrt[a] d k+Sqrt[a] c-I Sqrt[b])/;
- FreeQ[{a,b,c,d},k] && !Znak[a] && !Znak[b],
- a_. (d_. k+c_.)^n_+ b_ :> (exprold=exprold/.
- {a(d k+c)^n+b :> Factor[a (d k+c)^n+b]};
- Factor[a (d k+c)^n+b])/;
- IntegerQ[n] && FreeQ[{a,b,c,d},k],
- a_. k+b_ :> b Pochhammer[1+b/a,k]/Pochhammer[b/a,k]/;
- FreeQ[{a,b},k] && Not[CondLim[b/a]],
- a_. k+b_ :> (exprold=exprold/.{a k+ b:> a k+b+eps};
- (b+eps) Pochhammer[1+b/a+eps/a,k]/
- Pochhammer[b/a+eps/a,k])/;
- FreeQ[{a,b},k] && CondLim[b/a]
- }/.{a_^k b_^k :> (a b)^k};
- HypergeometricSeries[1,exprold,exprnew,k,min,eps]
- ]
-
- HypergeometricSeries[ c_,exprold_,const_ expr_,k_,min_,eps_ ] :=
- HypergeometricSeries[
- If[!FreeQ[const,Complex],ExpandAll[c const],c const],
- exprold,expr,k,min,eps]/;
- FreeQ[const,k] && FreeQ[const,eps]
-
- HypergeometricSeries[ c_,exprold_,expr_. Pochhammer[n_,k_]^(s_Symbol d_.),
- k_,min_,eps_ ] := eps FailSum
-
- HypergeometricSeries[ c_,exprold_,expr_. (-1)^m_/;!FreeQ[m,Pochhammer],
- k_,min_,eps_ ] := eps FailSum
-
- HypergeometricSeries[ c_,exprold_,expr_,k_,min_,eps_ ] :=
- Module[ {cond,arg,l,uppar,lowpar,coef,res},
- If[ offHyper, Off[HypergeometricPFQ::hdiv]; offHyper=False];
- uppar = Join[{1},Flatten[
- Cases[l expr,Pochhammer[a_,k]^n_./;IntegerQ[n]&&Positive[n]]/.
- {Pochhammer[a_,b_]^n_. :> Table[a,{i,1,n}]}]];
- lowpar = Flatten[
- Cases[l expr,Pochhammer[a_,k]^n_./;IntegerQ[n]&&Negative[n]]/.
- {Pochhammer[a_,b_]^n_. :> Table[a,{i,1,-n}]}];
- {cond,arg,l,coef} =
- BuildList[AnalysRest[(expr/.
- Pochhammer[a_,b_]^n_. :> 1/;IntegerQ[n]) //.
- { a_^(b_. k) :> (a^b)^k/;FreeQ[{a,b},k],
- a_^k b_^k :> (a b)^k/;FreeQ[{a,b},k]}//.{
- a_^(b_. k) v_^k :> (a^b v)^k/;!NumberQ[v] && FreeQ[{a,b,v},k]
- },k,eps]];
- If[cond,
- If[FreeQ[expr,eps] && l>=0,
- If[ FreeQ[ res =
- HypergeometricPFQ[ If[l==0,uppar,
- Join[Table[1+eps,{i,1,l}],uppar]],
- If[l==0,lowpar,
- Join[Table[eps,{i,1,l}],lowpar]],arg]/.GaussRule,
- DirectedInfinity],
- On[HypergeometricPFQ::hdiv]; offHyper=True;
- If[ l==0,
- coef(Simplify[c] res + If[ Negative[min],1,-1 ] *
- SumNew[ exprold,{k,0,min-1} ] ),
- coef Expand[eps^l Simplify[c] res +
- If[ Negative[min],1,-1 ] *
- SumNew[ exprold (k+eps)^l/k^l,{k,0,min-1} ]]/.
- eps->0],
- DirectedInfinity[]
- ],
- CoefNotZeroTerm[LimitSum[Expand[coef eps^l *
- Simplify[c] (HypergeometricPFQ[
- If[l==0,uppar,
- Join[Table[If[l>0,1+eps,eps],{i,1,Abs[l]}],uppar]],
- If[l==0,lowpar,
- Join[Table[If[l>0,eps,1+eps],{i,1,Abs[l]}],lowpar]],
- arg]/.GaussRule) +
- If[Negative[min],1,-1] *
- Apply[SumNew,{exprold (k+eps)^l/k^l,{k,0,min-1}}]],eps,0],1,eps,0]],
- FailSum eps]
- ] /;
- CorrectExpr[ expr, k ]
-
- HypergeometricSeries[ c__, eps_ ] := eps FailSum
-
- CorrectExpr[ c_. Pochhammer[n_,k_]^l_Integer, k_ ] :=
- CorrectExpr[ c,k ] /; FreeQ[n,k]
-
- CorrectExpr[ c_. Pochhammer[n_,k_], k_ ] := CorrectExpr[ c,k ]/; FreeQ[n,k]
-
- CorrectExpr[ k_^n_., k_ ] := True /; IntegerQ[n]
-
- CorrectExpr[ c_. x_^(a_. k_), k_ ] := CorrectExpr[ c,k ] /;FreeQ[{x,a},k]
-
- CorrectExpr[ c_, k_ ] := True /; FreeQ[c,k]
-
- CorrectExpr[ c_, k_ ] := False
-
- (*========================================================================
-
- Finite Sum
-
- ========================================================================*)
-
- FiniteSum[ const_ expr_,{k_,min_,max_} ] :=
- const FiniteSum[expr,{k,min,max}]/;FreeQ[const,k]
-
- FiniteSum[ a_^(b_. k_),{k_,min_,max_} ] :=
- (1 - a^Expand[b (max+1)])/(1 - a^b) +
- If[Negative[min],1,-1] SumNew[ a^(b k),{k,0,min-1} ] /;
- FreeQ[{a,b},k]
-
- FiniteSum[ expr_Plus,{k_,min_,max_} ] := FiniteSum[#,{k,min,max}]&/@expr
-
- FiniteSum[ expr_, {k_, min_, max_}] := expr (max+1-min) /;
- FreeQ[expr, k]
-
- FiniteSum[(m_. k_ + c_.)^i_., {k_, n0_, n1_}] :=
- m^i(BernoulliB[i+1, n1+1+c/m] - BernoulliB[i+1, n0+c/m])/(i+1) /;
- IntegerQ[i] && i>0 && FreeQ[{m,c},k]
-
- FiniteSum[(-1)^k_ (m_. k_ + c_.)^i_., {k_, n0_, n1_}] :=
- m^i((-1)^n1 EulerE[i, n1+1+c/m] + (-1)^n0 EulerE[i, n0+c/m])/2/;
- IntegerQ[i] && i>0 && FreeQ[{m,c},k]
-
- FiniteSum[(m_. k_ + c_.)^s_, {k_, min_?Negative, max_}] :=
- FiniteSum[(-m k+c)^s,{k,1,-min}] +
- FiniteSum[(m k+c)^s,{k,0,max}]
-
- FiniteSum[(m_. k_ + c_.)^s_, {k_, min_?NonNegative, max_}] :=
- If[ s===-1,m^s(PolyGamma[0,max+1+c/m]-PolyGamma[0,min+c/m]),
- m^s(Zeta[-s,min+c/m] - Zeta[-s,max+1+c/m]) ]
-
- FiniteSum[(-1)^k_ (m_. k_ + c_.)^s_, {k_, min_?Negative, max_}] :=
- FiniteSum[(-1)^k (-m k+c)^s,{k,1,-min}] +
- FiniteSum[(-1)^k (m k+c)^s,{k,0,max}]
-
- FiniteSum[(-1)^k_ (m_. k_ + c_.)^s_, {k_,min_?NonNegative, max_}] :=
- If[s===-1,
- m^s/2 (
- (-1)^max(PolyGamma[0,max/2+1+c/(2m)]-
- PolyGamma[0,max/2+1/2+c/(2m)]) +
- (-1)^min(PolyGamma[0,min/2+1/2+c/(2m)]-
- PolyGamma[0,min/2+c/(2m)]) ),
- 2^s m^s (
- (-1)^min(Zeta[-s,min/2+c/(2m)] - Zeta[-s,min/2+1/2+c/(2m)]) +
- (-1)^max(Zeta[-s,max/2+1/2+c/(2m)] - Zeta[-s,max/2+1+c/(2m)]) )]
-
- FiniteSum[ expr_, {k_, min_?Negative, max_} ] :=
- Module[ {var},
- SymbolicSumD[ expr/.k->-var,{var,1,-min}] +
- SymbolicSumD[ expr,{k,0,max}]
- ]
-
- FiniteSum[ expr_, {k_, min_, max_}] :=
- SymbolicSumD[ Expand[expr],{k,min,max}] /;
- PolynomialQ[Expand[expr],k]
-
- FiniteSum[ Binomial[n_,k_ m_Integer + p_Integer],
- {k_,min_?NonNegative,Floor[r_]}] :=
- If[min==0,
- 2^n Sum[Cos[k Pi/m]^n Cos[Expand[(n-2p) Pi k/m]],{k,1,m}]/m,
- 2^n Sum[Cos[k Pi/m]^n Cos[Expand[(n-2p) Pi k/m]],{k,1,m}]/m -
- Sum[Binomial[n,k m + p],{k,0,min-1}] ]/;
- FreeQ[n,k] && Floor[Expand[r-n/m+p/m]]===0 && m>=p+1
-
- FiniteSum[ Binomial[n_,k_ m_Integer],
- {k_,min_?NonNegative,Floor[r_]}] :=
- If[min==0,
- 2^n Sum[Cos[k Pi/m]^n Cos[n Pi k/m],{k,1,m}]/m,
- 2^n Sum[Cos[k Pi/m]^n Cos[n Pi k/m],{k,1,m}]/m -
- Sum[Binomial[n,k m],{k,0,min-1}] ]/;
- FreeQ[n,k] && Floor[Expand[r-n/m]]===0
-
- FiniteSum[ expr_, {k_, n0_Integer, n1_}] :=
- Module[ {exprnew,list,elem,lim,answer},
- exprnew = expr//.
- {
- Binomial[w_,v_]^n_. :> Expand[w]!^n/(Expand[v]!^n Expand[w-v]!^n),
- (a_. k+b_.)!^n_. :>
- (b!)^n (a^(n a))^k *
- Product[Pochhammer[Expand[(b+i)/a],k]^n,{i,1,a}]/;
- IntegerQ[a] && a>0,
- (a_. k+b_.)!^n_. :>
- (-1)^(-a k n) (b!)^n ((-a)^(n a))^k *
- Product[Pochhammer[Expand[(b-i+1)/a],k]^(-n),{i,1,-a}]/;
- IntegerQ[a] && a<0,
- Gamma[a_. k+b_]^n_. :>
- Gamma[b]^n (a^(n a))^k *
- Product[Pochhammer[Expand[(b+i)/a],k]^n,{i,0,a-1}]/;
- IntegerQ[a] && a>0 && IntegerQ[n],
- Gamma[a_. k+b_]^n_. :>
- (-1)^(-a k n) Gamma[b]^n ((-a)^(-n a))^k *
- Product[Pochhammer[Expand[(b-i)/a],k]^(-n),{i,1,-a}]/;
- IntegerQ[a] && a<0 && IntegerQ[n],
- a_. k+b_ :> b Pochhammer[1+b/a,k]/Pochhammer[b/a,k]/;
- Not[CondLim[b/a]]
- };
- list = Expand[Cases[exprnew,
- Pochhammer[a_,k]^n_./;IntegerQ[n] && Positive[n] && (
- ZnakSum[a] || IntegerQ[Expand[n1+a]])]/.
- Pochhammer[a_,k]^n_. :> a];
- answer =
- If[ Length[list] == 0, FailSum,
- elem = Union[list/.a_ b_. + c_. :> a/;Head[a]===Symbol];
- lim =
- If[ Length[elem] == 1, -SymbolicMax[list,elem],
- If[ !FreeQ[-list,n1],n1, FailSum]
- ]];
- answer =
- If[ !FreeQ[{answer,lim}, FailSum], FailSum,
- If[ NumberQ[lim],-SumNew@@{exprnew//.PochToAlg,{k,lim+1,n1}} +
- GlobInfiniteSum[exprnew,{k,n0,Infinity}],
- If[ !FreeQ[n1,Floor] && ZnakSum[Expand[(n1/.Floor[r_]:>r)-lim]],
- Donor[lim,Complement[-list,{lim}]],
- If[ (ExpandAll[exprnew/.k->(lim+1)]/.
- {Pochhammer[a_,b_] :> 0/;Expand[a+b-1]===0})===0,
- -SumNew@@{expr,{k,lim+1,n1}} +
- GlobInfiniteSum[exprnew,{k,n0,Infinity}],
- FailSum]
- ]]];
- (answer//.PochToAlg)/;FreeQ[answer,FailSum]
- ]/;Not[FreeQ[expr,Binomial]] || Not[FreeQ[expr,Factorial]]
-
- FiniteSum[ expr_, {k_, min_Integer, max_}] :=
- Module[ {var,answer},
- answer = InfiniteSum[expr,k,min];
- ((answer - GlobInfiniteSum[(expr/.k->var+max+1)/.
- a_^b_ :> a^Expand[b],{var,0,Infinity}]) /.
- {HypergeometricPFQ[uppar_,lowpar_,arg_] :> var FailSum /;
- Length[uppar] > Length[lowpar]+1})/;
- And@@(FreeQ[answer,#]&/@{FailSum,DirectedInfinity})
- ]
-
- FiniteSum[ __ ] := Module[ {var}, var FailSum ]
-
- (*========================================================================
-
- Product
-
- ========================================================================*)
-
- SymbolicProduct[ const_,{k_,min_,max_} ] :=
- const^(max-min+1) /; FreeQ[const,k]
-
- SymbolicProduct[ expr_,{k_,min_Integer,max_Integer} ] :=
- Product[expr,{k,min,max}]
-
- SymbolicProduct[ const_ expr_,{k_,min_,max_} ] :=
- const^(max-min+1) SymbolicProduct[expr,{k,min,max}] /;
- FreeQ[const,k] && FreeQ[{min,max},DirectedInfinity]
-
- SymbolicProduct[ k_^n_.,{k_,min_Integer,Infinity} ] :=
- If@@{Re[N[n]]>=0,
- If[FreeQ[n,Complex],Infinity,ComplexInfinity],
- 0} /; FreeQ[n,k]
-
- SymbolicProduct[ (c_ k_+a_.)/(c_ k_ + b_.),{k_,min_,max_} ] :=
- SymbolicProduct[ (k+a/c)/(k+b/c),{k,min,max} ]
-
- SymbolicProduct[ (k_+a_.)/(k_ + b_.),{k_,min_Integer,Infinity} ] :=
- If@@{Re[N[a-b]]>=0,
- If[FreeQ[N[{a,b}],Complex],Infinity,ComplexInfinity],
- 0} /;
- FreeQ[{a,b},k]
-
- SymbolicProduct[ 1+(-1)^k_ a_. (2k_+b_Integer)^n_Integer?Negative,
- {k_,1,Infinity} ] :=
- If[ b==1, (Pi/2)^(-n) Abs[EulerE[-n-1]]/(2 (-n-1)!),
- If[ Positive[b],
- (Pi/2)^(-n) Abs[EulerE[-n-1]]/(2 (-n-1)!) /
- Product[1+(-1)^k (2k+1)^n,{k,1,Floor[b/2]}],
- (Pi/2)^(-n) Abs[EulerE[-n-1]]/(2 (-n-1)!) *
- Product[1+(-1)^k (-2k+1)^n,{k,0,Floor[-b/2]}]
- ]] /;
- OddQ[n] && OddQ[b] && a===(-1)^Floor[b/2]
-
- SymbolicProduct[ Sec[expr_]^n_. f_.,{k_,min_,max_} ] :=
- SymbolicProduct[f,{k,min,max}] /
- SymbolicProduct[Cos[expr],{k,min,max}]^n /;
- FreeQ[n,k] && FreeQ[{min,max},DirectedInfinity]
-
- SymbolicProduct[ Csc[expr_]^n_. f_.,{k_,min_,max_} ] :=
- SymbolicProduct[f,{k,min,max}] /
- SymbolicProduct[Sin[expr],{k,min,max}]^n /;
- FreeQ[n,k] && FreeQ[{min,max},DirectedInfinity]
-
- SymbolicProduct[ Tan[expr_]^n_. f_.,{k_,min_,max_} ] :=
- SymbolicProduct[f,{k,min,max}] *
- SymbolicProduct[Sin[expr],{k,min,max}]^n /
- SymbolicProduct[Cos[expr],{k,min,max}]^n /;
- FreeQ[n,k] && FreeQ[{min,max},DirectedInfinity]
-
- SymbolicProduct[ Cot[expr_]^n_. f_.,{k_,min_,max_} ] :=
- SymbolicProduct[f,{k,min,max}] *
- SymbolicProduct[Cos[expr],{k,min,max}]^n /
- SymbolicProduct[Sin[expr],{k,min,max}]^n /;
- FreeQ[n,k] && FreeQ[{min,max},DirectedInfinity]
-
- SymbolicProduct[ expr_,{k_,max_,max_} ] :=
- expr /. k->max
-
- SymbolicProduct[ expr_,{k_,min_/;!IntegerQ[min],max_/;!IntegerQ[max]} ] :=
- Module[ {var},
- SymbolicProduct[expr/.k->(var+min),{var,0,max-min}]
- ] /;
- IntegerQ[max-min] && Positive[max-min]
-
- SymbolicProduct[ expr_,{k_,min_Integer/;min!=1,max_} ] :=
- Module[ {var},
- SymbolicProduct[ (expr/.{a_. k :> Expand[a(var+min-1)]/;FreeQ[a,k]})/.
- {(-1)^(n_Integer + s_) :> (-1)^n (-1)^s},
- {var,1, If[FreeQ[max,DirectedInfinity],max-min+1,max]}]
- ]
-
- SymbolicProduct[ expr_Times,{k_,min_,max_} ] :=
- Module[ { answer },
- answer = Product[#,{k,min,max}]&/@expr;
- If[ FreeQ[answer, FailSum] && FreeQ[answer, Product],
- answer,
- FailSum
- ]
- ] /;
- FreeQ[{min,max},DirectedInfinity]
-
- SymbolicProduct[ q_^(a1_+a2_) expr_.,{k_,min_,max_} ] :=
- q^(a1 (max-min+1)) *
- SymbolicProduct[q^a2 expr/.(-1)^(n_?EvenQ s_) :> 1,{k,min,max}]/;
- FreeQ[{q,a1},k] && FreeQ[{min,max},DirectedInfinity]
-
- SymbolicProduct[ (-1)^(n_?Negative s_) expr_,{arg__} ] :=
- SymbolicProduct[ Times@@{(-1)^(-n s),expr},{arg} ]
-
- SymbolicProduct[ k_^s_.,{k_,1,max_} ] := (max!)^s /;
- FreeQ[s,k] && max=!=Infinity
-
- SymbolicProduct[ (b_ k_ + a_)^s_.,{k_,min_,max_} ] :=
- SymbolicProduct[ b^s (k+a/b)^s,{k,min,max} ] /;
- FreeQ[a,k]
-
- SymbolicProduct[ (k_ + a_)^s_.,{k_,1,max_} ] := Pochhammer[a+1,max]^s /;
- FreeQ[{a,s},k] && max=!=Infinity
-
- SymbolicProduct[ (k_ + a_.)^(k_+c_),{k_,1,max_} ] :=
- SymbolicProduct[ (k+a)^k,{k,1,max}] *
- SymbolicProduct[ (k+a)^c,{k,1,max}] /;
- FreeQ[{a,c},k]
-
- SymbolicProduct[ (k_ + a_.)^k_,{k_,1,max_} ] :=
- Gamma[max+a+1]^max Product[Gamma[k+a]^(-1),{k,1,max}] /;
- FreeQ[a,k] && max=!=Infinity
-
- SymbolicProduct[ w_^expr_,{k_,min_,max_} ] :=
- w^Sum[expr,{k,min,max}] /; FreeQ[w,k]
-
- SymbolicProduct[ Sin[2 k_ Pi a_] ,{k_,1,max_} ] :=
- SymbolicProduct[ 2 Sin[k Pi/a] Cos[k Pi/a],{k,1,max}] /;
- IntegerQ[1/a-max]
-
- SymbolicProduct[ Sin[k_ Pi a_] ,{k_,1,max_} ] :=
- If[ Expand[1/a-max-1]===0, 2^(-max) (max+1),
- If[ Negative[1/a-max-1],
- SymbolicProduct[ Sin[k Pi a] ,{k,1,1/a-1} ] *
- Product[ Sin[k Pi a] ,{k,1/a,max} ],
- Module[ {y},
- Limit[Product[ Sin[y+ k Pi a] ,{k,0,max} ]/Sin[y],y->0]
- ] ]] /;
- IntegerQ[1/a-max]
-
- SymbolicProduct[ Sin[y_. + k_ Pi a_/;!Znak[a]] ,{k_,1,max_} ] :=
- If[ 1/a===max, -2^(1-max) Sin[Expand[y max]],
- If[ Negative[1/a-max],
- SymbolicProduct[ Sin[y+ k Pi a] ,{k,1,1/a} ] *
- Product[ Sin[y+ k Pi a] ,{k,1/a+1,max} ],
- If[ Sin[y]=!=0,
- SymbolicProduct[ Sin[y+ k Pi a] ,{k,0,max} ]/Sin[y],
- FailSum]] ] /;
- FreeQ[{y,a},k] && IntegerQ[1/a - max]
-
- SymbolicProduct[ Sin[y_. + k_ Pi a_/;Znak[a]] ,{k_,1,max_} ] :=
- If[ -1/a===max, (-1)^max 2^(1-max) Sin[Expand[y max]],
- If[ Negative[-1/a-max],
- SymbolicProduct[ Sin[y+ k Pi a] ,{k,1,-1/a} ] *
- Product[ Sin[y+ k Pi a] ,{k,-1/a+1,max} ],
- If[ Sin[y]=!=0,
- SymbolicProduct[ Sin[y+ k Pi a] ,{k,0,max} ]/Sin[y],
- FailSum]] ] /;
- FreeQ[{y,a},k] && IntegerQ[-1/a - max]
-
- SymbolicProduct[ Cos[y_. + k_ Pi a_/;!Znak[a]] ,{k_,1,max_} ] :=
- If[ 1/a===max, -2^(1-max) Sin[Expand[(2y + Pi) max/2]],
- If[ Negative[1/a-max],
- SymbolicProduct[ Cos[y+ k Pi a] ,{k,1,1/a} ] *
- Product[ Cos[y+ k Pi a] ,{k,1/a+1,max} ],
- If[ Cos[y]=!=0,
- SymbolicProduct[ Cos[y+ k Pi a] ,{k,0,max} ]/Cos[y],
- FailSum]] ] /;
- FreeQ[{y,a},k] && IntegerQ[1/a - max]
-
- SymbolicProduct[ Cos[y_. + k_ Pi a_/;Znak[a]] ,{k_,1,max_} ] :=
- If[ -1/a===max, (-1)^max 2^(1-max) Sin[Expand[(2y + Pi) max/2]],
- If[ Negative[-1/a-max],
- SymbolicProduct[ Cos[y+ k Pi a] ,{k,1,-1/a} ] *
- Product[ Cos[y+ k Pi a] ,{k,-1/a+1,max} ],
- If[ Cos[y]=!=0,
- SymbolicProduct[ Cos[y+ k Pi a] ,{k,0,max} ]/Cos[y],
- FailSum]] ] /;
- FreeQ[{y,a},k] && IntegerQ[-1/a - max]
-
- SymbolicProduct[ 1 + a_. (b_ k_+c_)^n_Integer?Negative,{k_,1,Infinity} ] :=
- SymbolicProduct[ 1 + a b^n (k+Expand[c/b])^n,{k,1,Infinity}] /;
- FreeQ[{a,b,c},k]
-
- SymbolicProduct[ 1 + a_. (k_+c_Integer)^n_Integer?Negative,
- {k_,1,Infinity} ] :=
- If[ Positive[c],
- Module[ {var,x},
- If[ (1+a c^n)=!=0,
- SymbolicProduct[1+a (var+c-1)^n,{var,1,Infinity}] /
- (1+a c^n),
- Limit[Product[1+a x (var+c-1)^n,{var,1,Infinity}]/
- (1+a x c^n), x->1]]
- ],
- 1/(k+c) /. k->-c] /;
- FreeQ[{a,c},k]
-
- SymbolicProduct[ 1 + a_. k_^n_Integer?Negative,{k_,1,Infinity} ] :=
- If[ n==-1, If[ Positive[N[a]], Infinity, FailSum ],
- a^(-1) *
- Product[ Gamma[E^(-Pi I (-n+1)/n) E^(-2 Pi I p/n) *
- If[ Znak[a], E^(-Pi I/n) (-a)^(-1/n), a^(-1/n)] ]^(-1),
- {p,0,-n-1}]
- ] /;
- FreeQ[a,k]
-
- SymbolicProduct[ 1 + a_./(k_ + b_)^2,{k_,1,Infinity} ] :=
- Gamma[b+1]^2/(Gamma[b+1+Sqrt[-a]] Gamma[b+1-Sqrt[-a]]) /;
- FreeQ[{a,b},k] && Znak[a]
-
- SymbolicProduct[ 1 + a_./(k_ + b_)^2,{k_,1,Infinity} ] :=
- Gamma[b+1]^2/(Gamma[b+1+I Sqrt[a]] Gamma[b+1-I Sqrt[a]]) /;
- FreeQ[{a,b},k]
-
- SymbolicProduct[ expr_,{k_,min_,max_} ] :=
- ( Flag1 = False;
- answer = SymbolicProduct[Factor[expr],{k,min,max}]
- ) /;
- Flag1
-
- SymbolicProduct[ expr_,{k_,min_,max_} ] :=
- ( Flag2 = False;
- SymbolicProduct[Apart[expr,k],{k,min,max}]
- ) /;
- Flag2
-
- SymbolicProduct[ expr_,{k_,min_,max_} ] :=
- ( Flag3 = False;
- SymbolicProduct[expr/.
- {c_. k^2+a_. k+b_ :>
- c PowerExpand[(k+(a/c+Sqrt[a^2/c^2-4b/c])/2) *
- (k+(a/c-Sqrt[a^2/c^2-4b/c])/2),{k}] /;
- FreeQ[{a,b,c},k]
- },{k,min,max}]
- ) /;
- Flag3
-
- SymbolicProduct[ a__ ] := {a} + FailSum
-
- (*========================================================================
-
- Supplement
-
- ========================================================================*)
-
- Reduction[ expr_,function_ ] :=
- Module[ {len1,len2},
- len2 = Union[
- len1 = Cases[ Expand[expr],w_/;Not[FreeQ[w,function]] ]//.
- {w_. function@@{a_,{b__}} :> {a,{b}} } ];
- If[ Length[len2] < Length[len1],
- CollectExpr[expr,len2,function],
- expr ]
- ]
-
- CollectExpr[ expr_,{pat_},function_ ] := Collect[ expr,function@@pat ]
-
- CollectExpr[ expr_,{pat1_,pat__},function_ ] :=
- CollectExpr[ Collect[ expr, function@@pat1 ], {pat},function ]
-
- SumFloor[ expr_,{k_,min_Integer?NonNegative,max_},sup_ ] :=
- If[ (expr/.k->min)===(expr/.k->sup),
- SymbolicSumD[expr,{k,min,sup}]/2 +
- (expr/.k->Floor[sup/2]) (1+(-1)^sup)/4 +
- Sum[expr,{k,1+Floor[sup/2],max}],
- If[ Length[Cases[expr,k^n_Negative]]==0 && min>0,
- SumFloor[expr,{k,0,max},sup] -
- Sum[expr,{k,0,min-1}],
- FailSum ]]
-
- SumFloor[ __ ] := FailSum
-
- SymbolicMax[ {a_},elem_ ] := a
-
- SymbolicMax[ {a_,b_,v___},elem_ ] :=
- If[ Znak[(b-a)/.w1_. elem+w2_. :> w1],
- SymbolicMax[{a,v},elem],
- SymbolicMax[{b,v},elem] ]
-
- BuildList[ a_ list[v__] ] := {v,a}
-
- BuildList[ list[v__] ] := {v,1}
-
- AnalysRest[ (eps_+a_.)^n_. expr_.,k_,eps_] :=
- AnalysRest[expr,k,eps] (eps+a)^n
-
- AnalysRest[ a_^k_ x_^(n_. k_),k_,eps_ ] :=
- list[True, a x^n,0] /; FreeQ[{a,x,n},k]
-
- AnalysRest[ x_^(n_. k_),k_,eps_ ] := list[True,x^n,0]/;FreeQ[{x,n},k]
-
- AnalysRest[ 1,k_,eps_ ] := list[True,1,0]
-
- AnalysRest[ (-1)^k_,k_,eps_ ] := list[True,-1,0]
-
- AnalysRest[ (-1)^k_ x_^(n_. k_) k_^l_./;IntegerQ[l],k_,eps_ ] :=
- list[True,-x^n,l]/;FreeQ[{x,n},k]
-
- AnalysRest[ x_^(n_. k_) k_^l_./;IntegerQ[l],k_,eps_ ] :=
- list[True,x^n,l]/;FreeQ[{x,n},k]
-
- AnalysRest[ k_^l_./;IntegerQ[l],k_,eps_ ] := list[True,1,l]
-
- AnalysRest[ (-1)^k k_^l_./;IntegerQ[l],k_,eps ] := list[True,-1,l]
-
- AnalysRest[ __ ] := list[False,False,False]
-
- SumNew[ expr_,{var_,min_,max_} ] :=
- Sum[expr,{var,min,max}]/;Expand[min-max-1]<=0
-
- SumNew[ expr_,{var_,min_,max_} ] :=
- Sum[expr,{var,max+1,min-1}]
-
- CoefNotZeroTerm[f_,n_,x_,s_] :=
- Module[ {var,g,q=0,i=0},
- g = f/.x->(var+s);
- g = If[Not[FreeQ[g,PolyGamma]],g/.PolyGamma->PolyGamma1,g];
- While[ q===0,
- q = Normal[Series[g,{var,0,n+i}]]/.PolyGamma1->PolyGamma/.{
- Power[u_ v_,k_]:>Power[u,k] Power[v,k]};
- i=i+2 ];
- Expand[q/.{
- c_ var^k_Integer :> Together[c] var^k/;FreeQ[c,var] && k<0 }
- ]//.var->0]/;FreeQ[f,FailSum] && FreeQ[f,Infinity]
-
- CoefNotZeroTerm[f_/;Not[FreeQ[f,FailSum]],n_,x_,s_] := x FailSum
-
- CoefNotZeroTerm[f_/;Not[FreeQ[f,Infinity]],n_,x_,s_] := x Infinity
-
- SimpPochhammer[f_Plus] := Map[ SimpPochhammer1[#]&,f ]
-
- SimpPochhammer[v_] := SimpPochhammer1[v]
-
- SimpPochhammer1[ Times[v1___,Pochhammer[w1_,v_]^n_.,v2___,
- Pochhammer[w2_,v_]^m_.] ] :=
- Module[ {p},
- p = Min[ Abs[n], Abs[m] ];
- If[ (w1-w2)===1,
- SimpPochhammer1[v1 v2 Pochhammer[w1,v]^(n-p) *
- Pochhammer[w2,v]^(m+p)] ((w2+v)/w2)^p,
- SimpPochhammer1[v1 v2 Pochhammer[w1,v]^(n-p) *
- Pochhammer[w2,v]^(m+p)] (w1/(w1+v))^p
- ]
- ]/; (w2-w1==1 || w1-w2==1) && IntegerQ[n] && n>0 && m<0
-
- SimpPochhammer1[v_] := v//.PochToAlg
-
-
- LimitSum[ f_,n_,x_,s_] := x FailSum/;
- !FreeQ[f,FailSum] || !FreeQ[f,DirectedInfinity]
-
- LimitSum[ f_Plus,x_,s_] := Map[LimitSum[#,x,s]&,f]
-
- LimitSum[Gamma[u_]^n_.,x_,s_] :=
- LimitSum[Gamma[u+1]^n/u^n,x,s]/;CondLim[u//.x->s]
-
- LimitSum[PolyGamma[k_,u_]^n_.,x_,s_] :=
- LimitSum[Expand[(PolyGamma[k,u+1]-(-1)^k k! u^(-k-1))^n],x,s]/;
- CondLim[u//.x->s]
-
- LimitSum[Times[v1___,Gamma[u_]^n_.,v2___],x_,s_] :=
- LimitSum[v1 v2 Gamma[u+1]^n/u^n ,x,s]/;CondLim[u//.x->s]
-
- LimitSum[Times[v1___,Gamma[u_,0,a_]^n_.,v2___],x_,s_] :=
- LimitSum[Expand[v1 v2 (Gamma[u+1,0,a]/u + a^u E^(-a)/u)^n],x,s]/;
- CondLim[u//.x->s]
-
- LimitSum[Times[v1___,Gamma[u_,a_]^n_.,v2___],x_,s_] :=
- LimitSum[Expand[v1 v2 (Gamma[u+1,a] + a^u E^(-a)/Gamma[u+1])^n],x,s]/;
- CondLim[u//.x->s]
-
- LimitSum[Times[v1___,PolyGamma[k_,u_]^n_.,v2___],x_,s_] :=
- LimitSum[Expand[v1 v2 (PolyGamma[k,u+1]-(-1)^k k! u^(-k-1))^n],x,s]/;
- CondLim[u//.x->s]
-
- LimitSum[Times[v1___,LerchPhi[z_,n_,u_],v2___],x_,s_] :=
- LimitSum[v1 v2,x,s] Module[ {p=u/.x->s},
- Sum[z^i/(i+u)^n,{i,0,-p}] +
- Sum[z^i/(i+p)^n,{i,1-p,Infinity}] ]/;
- CondLim[u/.x->s]
-
- LimitSum[LerchPhi[z_,n_,u_],x_,s_] :=
- Module[ {p=u/.x->s},
- Sum[z^i/(i+u)^n,{i,0,-p}] +
- Sum[z^i/(i+p)^n,{i,1-p,Infinity}] ]/;
- CondLim[u/.x->s]
-
- LimitSum[Times[v1___,Literal[HypergeometricPFQ][up_,low_,arg_],v2___],x_,s_] :=
- (HypergeometricPFQ[up,low,arg]//.x->s) LimitSum[v1 v2,x,s]/;
- And@@(Not[CondLim[#/.x->s]]&/@Join[up,low])
-
- LimitSum[Times[v1___,Literal[Hypergeometric2F1][a_,b_,c_,arg_],v2___],x_,s_] :=
- (Hypergeometric2F1[a,b,c,arg]//.x->s) LimitSum[v1 v2,x,s]/;
- And@@(Not[CondLim[#/.x->s]]&/@{a,b,c})
-
- LimitSum[Times[v1___,Literal[Hypergeometric1F1][a_,b_,arg_],v2___],x_,s_] :=
- (Hypergeometric1F1[a,b,arg]//.x->s) LimitSum[v1 v2,x,s]/;
- And@@(Not[CondLim[#/.x->s]]&/@{a,b})
-
- LimitSum[Times[v1___,Literal[HypergeometricPFQ][up_,low_,arg_],v2___],x_,s_] :=
- LimitSum[Expand[v1 v2 SeriesForHyperFun[up,low,arg,
- Min[Select[up//.x->s,IntegerQ[#] && #<=0&]],x,s ]],x,s]/;FreeQ[low,x]
-
- LimitSum[Times[v1___,Literal[Hypergeometric2F1][a_,b_,c_,arg_],v2___],x_,s_] :=
- LimitSum[Expand[v1 v2 SeriesForHyperFun[{a,b},{c},arg,
- Min[Select[{a,b}//.x->s,IntegerQ[#] && #<=0&]],x,s ]],x,s]/;FreeQ[c,x]
-
- LimitSum[Times[v1___,Literal[Hypergeometric1F1][a_,b_,arg_],v2___],x_,s_] :=
- LimitSum[Expand[v1 v2 SeriesForHyperFun[{a},{b},arg,
- Min[Select[{a}//.x->s,IntegerQ[#] && #<=0&]],x,s ]],x,s]/;FreeQ[b,x]
-
- LimitSum[Times[v1___,Literal[Hypergeometric2F1][a_,b_,c_,arg_],v2___],x_,s_] :=
- LimitSum[v1 v2,x,s] *
- Module[ {answer,k}, answer = LimitInfiniteSum[
- Pochhammer[a,k] Pochhammer[b,k]/(k!*
- Pochhammer[c,k]) arg^k//.PochToAlg,k,x,s];
- If[FreeQ[answer,Hypergeometric2F1],answer,FailSum]]/;Not[FreeQ[c,x]]
-
- LimitSum[Literal[Hypergeometric2F1][a_,b_,c_,arg_],x_,s_] :=
- Module[ {answer,k}, answer = LimitInfiniteSum[
- Pochhammer[a,k] Pochhammer[b,k]/(k!*
- Pochhammer[c,k]) arg^k//.PochToAlg,k,x,s];
- If[FreeQ[answer,Hypergeometric2F1],answer,FailSum]]/;Not[FreeQ[c,x]]
-
- LimitSum[Times[v1___,Literal[Hypergeometric1F1][a_,c_,arg_],v2___],x_,s_] :=
- LimitSum[v1 v2,x,s] *
- Module[ {answer,k}, answer = LimitInfiniteSum[
- Pochhammer[a,k]/(k! Pochhammer[c,k]) arg^k//.PochToAlg,k,x,s];
- If[FreeQ[answer,FailSum],answer,FailSum]]/;Not[FreeQ[c,x]]
-
- LimitSum[Literal[Hypergeometric1F1][a_,c_,arg_],x_,s_] :=
- Module[ {answer,k}, answer = LimitInfiniteSum[
- Pochhammer[a,k]/(k! Pochhammer[c,k]) arg^k//.PochToAlg,k,x,s];
- If[FreeQ[answer,Hypergeometric1F1],answer,FailSum]]/;Not[FreeQ[c,x]]
-
- LimitSum[Times[v1___,Literal[HypergeometricPFQ][up_,low_,arg_],v2___],x_,s_] :=
- LimitSum[v1 v2,x,s] *
- Module[ {k},
- LimitInfiniteSum[
- MultPochham[up,k]/(k! MultPochham[low,k]) arg^k//.PochToAlg,
- k,x,s]
- ]/;Not[FreeQ[low,x]]
-
- LimitSum[f_,x_,s_] := f
-
- LimitInfiniteSum[ c_ expr_,k_,eps_,s_ ] :=
- c LimitInfiniteSum[ expr,k,eps,s ]/;FreeQ[c,k]
-
- LimitInfiniteSum[ expr_,k_,eps_,s_ ] :=
- Block[ {p,answer,LimitSum,m},
- p = If[ Length[p = Select[(Cases[expr,(k+c_. eps+w_.)^n_?Negative]/.
- (k+c_. eps+v_.)^m_:>(k+c eps+v)^(-m))/.{k->0, eps->s},IntegerQ]]==0,
- 0,Min[p] ];
- answer = Sum[expr,{k,0,-p}] +
- Sum[expr/.eps->s,{k,1-p,DirectedInfinity[1]}]/.
- TransfAnswer[a_]:>a;
- If[ FreeQ[answer,LimitSum],answer,
- Sum[expr,{k,0,-p}] +
- Sum[expr/.eps->s/.k->m+1,{m,-p,DirectedInfinity[1]}]]
- ]
-
- SeriesForHyperFun[up_,low_,arg_,k_Integer,x_,s_] :=
- Sum[MultPochham[up,i] arg^i/((MultPochham[low,i]//.x->s) i!),
- {i,0,k+1}]
-
- SeriesForHyperFun[up_,low_,arg_,k_,x_,s_] :=
- (HypergeometricPFQ[up,low,arg]//.x->s)
-
- SeriesForHyperFun[ __ ] := FailSum
-
- PochToAlg = {
- Pochhammer[0,k_] :> 0,
- Pochhammer[n_Integer?Positive,k_] :> (k+n-1)!/(n-1)!,
- Pochhammer[a_,k_]^n_. Pochhammer[b_,k_]^(m_?Negative) :> a^n/(a+k)^n/;
- b-a===1 && n+m===0,
- Pochhammer[a_,k_]^n_. Pochhammer[b_,k_]^(m_?Negative) :> (a+k)^n/a^n/;
- a-b===1 && n+m===0,
- Pochhammer[a_,k_] :> (-1)^(-a) (-a)!/; a+k===0,
- Pochhammer[1/2,k_] :> 4^(-k) Expand[2k]!/k!,
- Pochhammer[3/2,k_] :> 4^(-k) Expand[2k+1]!/k!,
- Pochhammer[a_,k_] :> (-1)^k Pochhammer[1-a-k,k]/;NumberQ[a+k],
- Pochhammer[a_?Negative,k_/;FreeQ[k,Floor[_]]] :> a/(a+k) Pochhammer[1+a,k],
- (a_Rational)^k_ :> Numerator[a]^k/Denominator[a]^k,
- (a_)! :> Expand[a]!
- }
-
- CondLim[u_] := IntegerQ[u] && u <= 0
-
- Znak[n_ a_] := True/;NumberQ[n] && Im[n]===0 && n<0
-
- Znak[Complex[0,n_] a_.] := True/;n<0
-
- Znak[n_] := True/;NumberQ[n] && Im[n]===0 &&n<0
-
- Znak[a_] := False
-
- ZnakSum[n_ a_] := True/;NumberQ[n] && Im[n]===0 && n<0
-
- ZnakSum[Complex[0,n_] a_.] := True/;n<0
-
- ZnakSum[n_] := True/;NumberQ[n] && Im[n]===0 &&n<0
-
- ZnakSum[n_ + c_] := True/;NumberQ[n] && ZnakSum[c]
-
- ZnakSum[n_ + c_] := True/;ZnakSum[n] && ZnakSum[c]
-
- ZnakSum[a_] := False
-
- TransfAnswer[ Indeterminate ] := Module[ {var}, var FailSum ]
-
- TransfAnswer[ g_[f_,{r__}] v_. ] :=
- g[f,{r}] TransfAnswer[v] /; g===Sum || g===Product
-
- TransfAnswer[ v_ ] :=
- Module[ {answer = v//.{0^m_ :> 0,
- (n_Integer)^(m_Integer s_) :> (n^Abs[m])^(Sign[m] s)} },
- answer = If[ !FreeQ[answer,Zeta],
- answer/.Zeta[n_Integer?Positive,z_] :>
- PolyGamma[n-1,z] (-1)^n/(n-1)!,
- answer ];
- If[ !FreeQ[answer, Gamma],
- answer = SimplifyGamma[answer/.PochToGam//.GammaToFact]//.
- {n_Rational^k_ :> Numerator[n]^k Denominator[n]^(-k),
- (-1)^(-s_) :> (-1)^s} ];
- If[ !FreeQ[v,LerchPhi], answer = answer/.LerchRule];
- If[ !FreeQ[answer,Complex], answer = answer//.complex];
- If[ !FreeQ[answer,Log], answer = SimpLog[answer] ];
- If[ !FreeQ[answer,PolyGamma], answer = SimplifyPolyGamma[answer] ];
- If[ Depth[answer] < 10 && Length[answer] <= 8,
- Simplify[answer//.SimpTrigSum],
- answer
- ]
- ] /;
- And@@(FreeQ[Hold[v],#]&/@{HypergeometricPFQ,Hypergeometric2F1})
-
- TransfAnswer[ v_ ] := v /.{
- HypergeometricPFQ[uppar_,lowpar_,arg_] :> arg FailSum /;
- (Length[uppar] > Length[lowpar]+1) &&
- And@@(NumberQ[#]&/@Join[uppar,lowpar]) }
-
-
- TransfAnswerForProduct[ g_[f_,{r__}] v_. ] :=
- g[f,{r}] TransfAnswerForProduct[v] /; g===Sum || g===Product
-
- TransfAnswerForProduct[ v_ ] :=
- Module[ {answer},
- answer = v//.
- {(n_Integer)^(m_Integer + s_) :> n^m n^s,
- n_Rational^k_ :> Numerator[n]^k Denominator[n]^(-k),
- (n_Integer)^(m_Integer s_) :> (n^Abs[m])^(Sign[m] s)};
- If[ !FreeQ[answer, Pochhammer],
- answer = SimpPochhammer[Expand[
- answer/.Pochhammer[a_,n_]:>Pochhammer[Expand[a],n]]]];
- If[ !FreeQ[answer, Gamma],
- answer = SimplifyGamma[answer]//.
- {n_Rational^k_ :> Numerator[n]^k Denominator[n]^(-k)} ];
- If[ Length[answer] < 7,
- Simplify[answer],
- answer]
- ]
-
- complex = {
- a_ Cos[b_] + Complex[0,c_] Sin[d_] :> a E^(I b)/;a===c && b===d,
- a_ Cos[b_] + Complex[0,c_] Sin[d_] :> a E^(-I b)/;a+c===0 && b===d,
- (1 + E^(Complex[0,c_] a_.))^n_. :> E^(I c n a/2) 2^n Cos[a c/2]^n,
- (1 - E^(Complex[0,c_] a_.))^n_. :> E^(I c n a/2) 2^n Sin[a c/2]^n (-I)^n,
- (-1 + E^(Complex[0,c_] a_.))^n_. :> E^(I c n a/2) 2^n Sin[a c/2]^n I^n
- }
-
- SimpLog[ expr_/; !FreeQ[expr,Log[_]] ] :=
- Module[ {exprN,list,div,pos = {},i=0 },
- exprN = Expand[expr//.{
- Log[n_ a_] :> Log[n] + Log[a] /; NumberQ[n] && NumberQ[a],
- Log[Rational[a_,b_]] :> Log[a]-Log[b],
- Log[Power[n_, m_]] :> m Log[n]/; NumberQ[n] && NumberQ[m]}];
- list = Union[Cases[exprN,w_. Log[n_Integer]/;FreeQ[w,Log[_]]]/.
- w_. Log[n_] :> n];
- div = GCD@@list;
- If[ Length[list]>1 && div!=1,
- list = Complement[list,{div}];
- SimpLog[exprN//.BuildRule[
- Log[#]&/@list ,Log[div]+Log[#]&/@(list/div) ]]
- ,
- If[ Length[list]<=2,
- exprN
- ,
- While[Length[pos]==0 && Length[list]>1,
- i = i+ 1;
- listN = {list[[1]],#}&/@Rest[list];
- list = Rest[list];
- pos = Position[ (GCD@@#)&/@listN,a_/; a != 1 ]
- ];
- If[ Length[pos]!=0,
- list = Take[listN,pos[[1]]][[1]];
- div = GCD@@list;
- SimpLog[exprN//.BuildRule[Log[#]&/@list ,
- Log[div]+Log[#]&/@(list/div) ]]
- ,
- exprN
- ]
- ]
- ]
- ]
-
- SimpLog[ expr_ ] := expr
-
- BuildRule[{l_,lR___},{r_,rR___}] :=
- Join[{l :> r},BuildRule[{lR},{rR}]]
-
- BuildRule[{},{}] := {}
-
-
- SimpTrigSum = {
- a_. Tan[x_] + b_. Cot[x_] +c_.:> c + 2 a Csc[2 x]/;a===b,
- a_. Tanh[x_] + n_?Negative b_. Coth[x_] +c_.:> c-2 a Csch[2 x]/;
- a+b n===0&&Not[Znak[a]],
- n_?Negative a_. Tanh[x_] + b_. Coth[x_] +c_.:> c+2 a Csch[2 x]/;
- a n+b===0&&Not[Znak[b]]
- }
-
-
- LerchRule = {
- LerchPhi[z_/;!Znak[z],n_,1/2] :>
- 2 (PolyLog[n,Sqrt[z]]-PolyLog[n,-Sqrt[z]])/Sqrt[z]
- }
-
- GammaToFact = {
- Gamma[ w_ ] :> ( Gamma[Expand[w]]/.GammaToFact1 )
- }
-
- GammaToFact1 = {
- Gamma[ n_+k_Plus ] :> (n+k-1)!/; FreeQ[k,Complex] && IntegerQ[n] && n>0 &&
- And@@(!Znak[#]&/@(k/.Plus->List)),
- Gamma[ 1/2+k_Plus ] :> Sqrt[Pi] Expand[2k]!/((4^k) k!)/;
- FreeQ[k,Complex] && And@@(!Znak[#]&/@(k/.Plus->List)),
- Gamma[ n_+k_Times ] :> (n+k-1)!/;FreeQ[k,Complex] &&
- IntegerQ[n] && n>0 && Not[Znak[k]],
- Gamma[ n_+k_Symbol ] :> (n+k-1)!/;IntegerQ[n]&&n>0 && Not[Znak[k]],
- Gamma[ 1/2+k_Times ] :> Sqrt[Pi] Expand[2k]!/((4^k) k!)/;
- FreeQ[k,Complex] && Not[Znak[k]],
- Gamma[ 1/2+k_Symbol ] :> Sqrt[Pi] Expand[2k]!/((4^k) k!),
- Gamma[ 1/2-k_Symbol ] :> (-1)^k Pi/Gamma[1/2+k]
- }
-
- PochToGam = {
- Pochhammer[ w_,n_ ] :> Gamma[w+n]/Gamma[w]
- }
-
- ComPlus[b_ + f_,x_] := b + ComPlus[f,x]/;FreeQ[b,x]
-
- ComPlus[f_,x_] := 0
-
- MultPochham[a_,k_] := Times@@(Pochhammer[#,k]&/@a)
-
- GaussRule = {
- Literal[Hypergeometric2F1][ a_,b_/;ZnakSum[b],c_,z_/;Not[Znak[z]] ] :>
- 2^c/z^b Cos[2 b ArcCos[1/Sqrt[z]]]/;
- Expand[a-b-1/2]===0 && Expand[c-2 a]===0,
- Literal[Hypergeometric2F1][ b_/;ZnakSum[b],a_,c_,z_/;Not[Znak[z]] ] :>
- 2^c/z^b Cos[2 b ArcCos[1/Sqrt[z]]]/;
- Expand[a-b-1/2]===0 && Expand[c-2 a]===0,
- Literal[Hypergeometric2F1][ n_,m_,c_,z_/;Not[Znak[z]] ] :> (-1)^(-4n) (-2n)! *
- If[ Expand[c-2 n]===0, 1/(-2 n)!, Gamma[c]/Gamma[c-2n] ] *
- (z/4)^(-n) GegenbauerC[-2n,1-c+2n,1/Sqrt[z]]/;
- ZnakSum[n] && Expand[m-n-1/2]===0 && (!NumberQ[n] || !NumberQ[m]),
- Literal[Hypergeometric2F1][ m_,n_,c_,z_/;Not[Znak[z]] ] :> (-1)^(-4n) (-2n)! *
- If[ Expand[c-2 n]===0, 1/(-2 n)!, Gamma[c]/Gamma[c-2n] ] *
- (z/4)^(-n) GegenbauerC[-2n,1-c+2n,1/Sqrt[z]]/;
- ZnakSum[n] && Expand[m-n-1/2]===0 && (!NumberQ[n] || !NumberQ[m])
- }
-
- (*========================================================================*)
-
- Protect[ Sum,SymbolicSum,Product ]
-
- End[] (* Algebra`SymbolicSum`Private` *)
-
- SetAttributes[Sum, ReadProtected]
-
- SetAttributes[SymbolicSum, ReadProtected]
-
- SetAttributes[Product, ReadProtected]
-
- EndPackage[] (* Algebra`SymbolicSum` *)
-
-
-