K iI@dZddlmZddlmZddlmZddlmZddl m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlmZdd lm Z dd l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;mZ>m?Z?m@Z@mAZAmBZBdd lCmDZDmEZEdd lFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSdd lTmUZUmVZVmWZWddlXmYZYmZZZm[Z[ddl\m]Z]ddl^m_Z_ddl`maZadZbdZcdZddZedZfGddeZgGddeZhe dZiGddZjGddZkGd d!ZlGd"d#ZmGd$d%ZnGd&d'enZoGd(d)enZpGd*d+enZqGd,d-enZrGd.d/enZsGd0d1enZtGd2d3enZuGd4d5enZvGd6d7enZwGd8d9enZxGd:d;enZyGd<d=enZzGd>d?enZ{Gd@dAenZ|dBZ}dCZ~dDZdEZdFZdGZdHZdIZdJZdKZdLZdMage dNdOddPfdQZdRZdMa dUdSZdUdTZyM)Va@ Expand Hypergeometric (and Meijer G) functions into named special functions. The algorithm for doing this uses a collection of lookup tables of hypergeometric functions, and various of their properties, to expand many hypergeometric functions in terms of special functions. It is based on the following paper: Kelly B. Roach. Meijer G Function Representations. In: Proceedings of the 1997 International Symposium on Symbolic and Algebraic Computation, pages 205-211, New York, 1997. ACM. It is described in great(er) detail in the Sphinx documentation. ) defaultdict)product)reduce)prod) SYMPY_DEBUG)SDummysymbolssympifyTupleexpandIpiMul EulerGammaoozoo expand_funcAddnanExprRational)Moddefault_sort_key)!expsqrtrootlog lowergammacosbesseligamma uppergammaexpinterfsinbesseljEiCiSiShisinhcoshChifresnelsfresnelc polar_lift exp_polarfloorceilingrf factoriallerchphi Piecewisere elliptic_k elliptic_e)polarify unpolarify) hyperHyperRep_atanhHyperRep_power1HyperRep_power2 HyperRep_log1HyperRep_asin1HyperRep_asin2HyperRep_sqrts1HyperRep_sqrts2 HyperRep_log2HyperRep_cosasinHyperRep_sinasinmeijerg)Matrixeyezeros)apartpolyPoly)residue) powdenest)siftcv|jr t|dS|j\}}t|d|zSN) is_Numberr as_coeff_Add)xcs `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/simplify/hyperexpand.py_mod1r]Us7 {{1ay >> DAq q!9q=c84 tdt\  fd} fd}|ddt |fdt |tj z fdzft t ttj z dz gt ddggt tj z zd z z tj z zd z z gd z z  dz zd z z gg|d d t t dgt d z dggt d dz z gddgg|tj dft d ft t dgt ddggt td ddd z z dz gddgg|tj tj ft d ft t ttd d gt ddggt td dtj gd d z z dz gg|tj zftj ft t t tj z  gt ddggt d g d zdz zdz d z z tj d zdz zd z z z gg| gtj gt t t gt ddggt d g zd z z dd z z dz gg|ddgdtj zgt t! dgt ddggt tj z d z z dd z z dz gddgg|tj tj gtj"gt t% t' gt dt(z dggt td dd d zdz z gtd dtj gg|td dtj gtj"gt t% t' gt ddt(z ggt td dd d zdz z gtd dtj gg|td dddgtj dgt t zt dgt td dtj" d zz tddggt tj d d z z dz gdd dz z ggdg|td dddgddgt ttj t+ dgt tdddd zz z dd zz dd zz ggt dz dz z ddgdd dz zz dtj ggdg|dggt dz zt zt-dz zdgt dz dggt dz zdgddgg|gdzgt tj z zt dz zt/tj z dz zt1tj zzdtj z zz tj z zt dz zt/tj z dz zt1tj zzdtj z zz gt ddggt dz dz g dz dz dzz ggt3d  z}|gdzgt | zzt-|zt zgt ddggt  dgd gg|td dgtj gt t5t( zt6 zt9t6t5 zzz |dgtddtddgt t5t(t6t;dt5 zzt=dt? dztt6t(zdz zt5t(z ztAdt5 ztCdt? dztt6t(zdz zt5t(z zzztt6 t(zdz zdt? dzz t5t(t? dzt;dt5 ztCdt? dztt6t(zdz zt5t(z zt6tAdt5 zzt=dt? dztt6t(zdz zt5t(z zzztt6 t(zdz zdz dgt gdgt td ddtddg tdddggdg|tj gtdddzgt dzdz z t6 zt5t( z zt9t6t5 zzdzdz z t3d  z zzt-t3d  zzdzdz z t zgt gdgt td dddgd dgdd gg|ddgddgt tE tG z t dtHgt d z ddd z ggt gdd ddggdgdg|dtj ftAdt5 z|ggt t1 dz dz zzt/dz dt5 zzt1 ddz z zzt/dt5 zzgt ddggt ddg dz ggd tddzz fd} fd}|gtj tj zgt |dzdz |dz  tddzz|dzdz t5 z|dz  tddzzgdd zzzt1dzz ddzz dz zzt gdgt gddtj z ddgddtj dg dddz ggdd ztddzztKt6t(zdz z |gtj zdzgdt5t3d  zzddzz zt1dzdzzt tMdzdz t/dzdz z t/dz tMdzdz zt/dzdz tMdz zz z dzt/dz ztMdz z dzt/dz tMdzdz zt/dzdz tMdz zzzgzt gdgt dtddddgdddzz dz td ddgddddzz tddgd zdddz gg|gtj z dzgt tj z zt/tj z t5 dzz dz zt/tj z t5 zt/tddz t5 z tddz zt/tddz t5 dzzgt t1tj zdz dtj z zz dt1tj z zt1tj zzddz zz dggt ddzz ddg dz tj z tj gd dgg|tj gdz gt(dz ztOt(zz t t/dz t5 t/dz t5 zt5 t/ t5 t/dz t5 zt/dz t5 t/t5 zzzt/ t5 t/t5 zgzt gdgt dz tj dg d gdtj  gg|tj gtddtddgt tQdt5 zdz t5 z t;dt5 zdz t5 z tAdt5 zgt gdgt td dtj dgdtd dtj gdd zdgg|tddgtddtddgt t=tt(t6zdz t? dzdzt5t(z t(tt(t6zdz t? dzdzt5t(z dzzz t;dt5 zt5 z tAdt5 zgt gdgt tddtdddgdtd ddgd dgg|tddgtj tddgt t5t(tt6 t(zdz ztCdt? dztt6t(zdz zt5t(z zdt? dzz tAdt5 zt;dt5 zt5 zgt gdgt td dtdddggd d tj gg|tj zgdzdzz dzgt1t1dzz dzzt5 dz ddzz zzt t/dz t5 t/dzz t5 zt5 t/t5 zt/dzz t5 zt5 t/dz t5 zt/dzz dzt5 zt/t5 t/dzz dzt5 zgzt gdgt dtj tj dg dz dz d dz g dz ddzz dz gdtj tj d zgg|ddgddtddgt tSdt5 ztGdt5 zz tAdt5 zt5 t;dt5 zzdtHgt d z dddd z ggt dtj dtd ddggd!d tj ddggd"gd"g|ddgdddzgt tG tUd ztHzz dzdzz dzzz   zzt1tW z zdz dzz t zdzdzz dzz  dzdzz dzzz gt dz dd z dggt d dd z dgd ddgdd dggd#gy$)%z Create our knowledge base. za b c, z)clsc ^t||}jt||fyNHyper_FunctionappendFormula) apbqresfuncabr[formulaezs r\addzadd_formulae..addhs,b"%aq!Qi89r^c dt||} jt| df|||yrbrc) rgrhBCMrjrkrlr[rmrns r\addbzadd_formulae..addbls2b"%a1ay!QBCr^rWr)rWrW)rvz3/2)rrr )rWrr)rWrwr)rrWrwr)rrrrc6t|t|zSrbr"r(rkrnrZs r\fpzadd_formulae..fpq!}wq!},,r^c6t|t|z Srbrrs r\fmzadd_formulae..fmrr^)rWrrr)rrWrri)rr)rrrW)rrrWrr)rrrrr)rrrrwN),r r rrArHalfrLrBrCr@rrDrFrGrIrJrEOner;r<rrHr r"r#r2rrr&r-r0rr.r1r)rrr3r(r'r,r/r%r$) rmrortmzrrrkrlr[rZrns ` @@@@@r\ add_formulaerds/JAq!Q::DDBAr?A2q)* !QZ1Q3' A& QVVQ/13 4 !Q  1qvv:q.!a%(166A:q.!a%*@AQU)QAYA./1 2 3   q!1% &Aq {(; !QAY!Q( )+ !&&!qxl "A& ' !Q  (2q/1a!e9Q;/!Q8 9; !&&!&& AeH< "OHROQ$GH I !Q  (2q/166*Q1q5 ! ,<= >@ !QVVaZ166* !Q'/1"qvv+q*I)IJ K !Q  !aRRTAX,q.!a%(!&&1bdQh<Q3G*GHJ KL !aR166( !!Q')9!Q)?@ A !Q  !aR1Q3A;1q5 ! 45 68 !Q!AFF( "A& '!Q)9 1qvv:A&1q5 ! 4q!f= >@  !&&!&& AEE7 A 1 . / !B$  (2q/2qs1u:.2q/166*, -.  (2q/166 "QUUG A 1 . / !QrT  (2q/2qs1u:.2q/166*, -. (2q/1a 1661+ >!$$mA&6: ; (2q/AEE61Q3<!Q@A B !&&!QAYq[)Q1q5 "  (2q/1a 1a& +]1-=qA B (1a.2qs8+Q!Wb!A#h?@ A !A#q1u+q!$q!QU)}a&@)L MO  !qc61q1u:A.AE11EEqIJ !a% vA 1~1v&>?A!qse QVVaZQqS)'!aff*ac*BBQVV$%%&!_5QVVaZQqS)'!aff*ac*BBQVV$%%&!_56 7 !Q  !A#qsacAaC!A#I/0 1 3 B B!q1ug qb!Jq"--qQx8 9 !Q  1"a1a&! "$ "aAFF8SVd2a4j1"oc!DG)n.L%LM !x1~x1~. $r(Ad1T!W9o-hqa|C"QK7OPTUWPX7X.YY"1T!W9ohqa|C"QK7OPTUWPX7X.YYZ[2aL!"#DAJ,0r(41:%tAd1gIx$q!* SQRSUQUVWQW[@XY]^`Ya@a7b'b()$qay/(9(1T!QZB !8Aq>BBD E F !&&!x1~q1u- AaC!Gqb!$r!t*,S47^;AaC!GjnQ.1"55Az"~a/01AaC!GSV#% &   (2q/1a(1qb!*q!Qi@ A C !Q!Q AQQJ7 8 !A#q!RT"# $ Aq! lLI JL QVVJQtAwY(aS q!q1uai.(Q$q' )BBq!a!A#g,&wq!DG)'<<> ? !Q 6Aq6AA<"89; !Xa^ A-- affaQVV $ AaC!GQAaCAx1~,=!=AaC!GQQ'AaCAx1~4E)EG H r!t9 1Q3Z !Q1WaK 0 1   QVVaZA&Q"Q1q5!# $ % 1Q3!Q  !B$q& 11AaQVVQqS ! DB! " "a!A#g .uQqSz1} < 1q!$WQqS1Wa%88GAaCOGAaC!GQ$77acAgq)'!A#q/9:;Agac1o%gac1o5AwqsAwqsQw':: 1q!,WQqS!_<=> ? @ @   !Xa^Q*a!A#gq[(2q/15QAaC!Q0a%Aq1u%' ( ) !q166z1Q3 QVVaZQVVT!W!=q!@@QUGAJQ88!hq!n,d1g67Xa^a'(Xa^1CT!W)Mq)PPR S 5QVV$a''AFFQJ75QVV$$U1qvv:%66q1q5zA  !ac'1a1Q3 AFF";aAYG HJ !&&Aq1u: QUC1I  QQ(QQ)@@a'1"d1g.wq1ud1g/FF#AE473GAtAw4GGHI!T!W%gaa&99; < <   !a%#QQVVaR" # $ !&&HQNHQN3 QtAwY!$q')4$q' ?1+?tAqz\KAd1gIAd1gItAw& ) *   (2q/HQNA;+AAFF+- . /" !QZ1Q31Q37Q;/ q%!a! $ $Q Q1W'= = QQ(1q$q')BBaDG,,WQqS1Wd1g-FFaQQ001q1d1g1NNDG$WQqS1Wq[$q'%BBD E E   !QVVQVVQ'A#q1ua1%A#q!ac'1Q3'QVVQVVRT*, - . !Q!QA' QtAwY#aQi.0aQi$q'$qay/"91jJ K !A#q!Q1%& ' !QVVQQ3 Q1%  " # $( !QQ1Q3K CGfQm+j891adQqSj1n;MNQB1":uQx*Q*;;*Aq!taczA~&') * !A#q"Q$"# $ "Qr!tAQBqAa  r^c tttd\ td  fd} fd}| zgg  zggtt dz  zzt zt  zt dz   zzzgtddggt zdgd zgg|fd}td t z}td t z}td t ztd z z }td t z}|ggtjz ggttt tjz zz||z||zz ztt zz||z||zzztt zzgtgd gttjz ddg tjgddgg|y) NabczrhocT jt||||  g|||| yrb)re MeijerFormula)anrgbmrhrqrrrsmatcherrkrlr[rmrrns r\roz!add_meijerg_formulae..adds3 b"b"a!Q3&'Aw8 9r^c|jd}|j\}}d}t||z jsd}||}}t||z js||z dkDry||g}|r||g}|||z it |gg|gfS)NrFT)rrr]simplify G_Function)rjrZyrnswappedlrkrs r\detect_uppergammaz/add_meijerg_formulae..detect_uppergammas GGAJww1a!e%%'(GQ !a%!!# $A  F AAQ1q5!:qc2q"#===r^rWrrwc |jd}|j\}}}t||z jdk(rVt||z jdk(rytj tj tj f}|||}}}nt||z jdk(r6tj tj tj f}|||}}}n5tj tj tj f}|||}}}t||z jdk7s\t||z jdk7s=t||z jtj k7s||z dkDs||z dkDry |it|gg|D cgc]} |tj z | zc} gfScc} w)z.https://functions.wolfram.com/07.34.03.0984.01rN)rrr]rrrZeror) rjrZuvwsigx1x2rtrks r\ detect_3113z)add_meijerg_formulae..detect_3113s GGAJ''1a !a%!!# $ )a!e%%'(A-66166166*C1aABa!e%%'(A-vvqvvqvv.q!rAvvqvvqvv.q!r2 1r6##% &! + 1r6##% &! + 1q5""$ % /B a"fqj 1vz1#rC+HqAJN+H"MMM+Hs+Grv)rxrr)listmapr rLr#rr$r'rr!r+rr*rr) rmrorrsc_S_rrrkrlr[rrns ` @@@@@r\add_meijerg_formulaersc%()JAq!Q ,C99 >S 2QW~ra!e QV#CF*:a+;;a!e QS\)+ ,Axq" 1s7|,- N2 Ad1gIA QtAwYB Ad1gIA B 1T!W9 AR!QAFF #RRQZ("R%!A#+6RA qtbd{+RA    |QVVR#aAFF^aAY?@ r^cfd}|S)z@ Create a function that simplifies rational functions in ``z``. c|j\}}|j}t|jt|\}}}||j z|j z S)z6 Efficiently simplify the rational function ``expr``. )as_numer_denomr rPcancelas_expr)exprnumerdenomr[rns r\simpzmake_simp..simps^**, u ua.//UA?5%5==?"U]]_44r^ru)rnrs` r\ make_simprs5 Kr^cNtr|D]}t|dtyy)N)end)rprint)argsrks r\debugrs( A !   r^cteZdZdZfdZedZedZedZfdZ dZ dZ d Z d Z xZS) rdz( A generalized hypergeometric function. ct||}ttt t ||_ttt t ||_|Srb)super__new__r rrr rgrh)r`rgrhobj __class__s r\rzHyper_Function.__new__sDgoc"S_-.S_-. r^c2|j|jfSrb)rgrhselfs r\rzHyper_Function.argss!!r^cVt|jt|jfSrb)lenrgrhrs r\sizeszHyper_Function.sizessDGG c$''l++r^c:td|jDS)zt Number of upper parameters that are negative integers This is a transformation invariant. c3bK|]'}t|jxr |j)ywrb)bool is_integer is_negative.0rZs r\ z'Hyper_Function.gamma..s"IA4 67Is-/)sumrgrs r\r#zHyper_Function.gammasIIIIr^cRt||j|jfzSrb)r_hashable_contentrgrhrrs r\rz Hyper_Function._hashable_contents*w(*dgg. r^cDt|j|j|Srb)r?rgrh)rargs r\__call__zHyper_Function.__call__sTWWdggs++r^ct|jtt|jt}}d}|j||||fS)a6 Compute the invariant vector. Explanation =========== The invariant vector is: (gamma, ((s1, n1), ..., (sk, nk)), ((t1, m1), ..., (tr, mr))) where gamma is the number of integer a < 0, s1 < ... < sk nl is the number of parameters a_i congruent to sl mod 1 t1 < ... < tr ml is the number of parameters b_i congruent to tl mod 1 If the index pair contains parameters, then this is not truly an invariant, since the parameters cannot be sorted uniquely mod1. Examples ======== >>> from sympy.simplify.hyperexpand import Hyper_Function >>> from sympy import S >>> ap = (S.Half, S.One/3, S(-1)/2, -2) >>> bq = (1, 2) Here gamma = 1, k = 3, s1 = 0, s2 = 1/3, s3 = 1/2 n1 = 1, n2 = 1, n2 = 2 r = 1, t1 = 0 m1 = 2: >>> Hyper_Function(ap, bq).build_invariants() (1, ((0, 1), (1/3, 1), (1/2, 2)), ((0, 2),)) c t|j}td|Ds|jdt |Dcgc]\}}|r |t |fc}}}|Scc}}w)Nc3BK|]}t|dtyw)rN) isinstancerrs r\rz>Hyper_Function.build_invariants..tr..$s=z!A$,=sct|dSNrrrZs r\z=Hyper_Function.build_invariants..tr..%s*:1Q4*@r^key)ritemsanysorttupler)bucketmodvaluess r\trz+Hyper_Function.build_invariants..tr"sg&,,.)F=f== @ A&;3!#f+.FMs A, )rTrgr]rhr#)rabucketsbbucketsrs r\build_invariantszHyper_Function.build_invariantssDF"$''5143G(  BxL"X,77r^c|j|jk7ry|j|j|j|jfDcgc]}t|tc}\}}}}d}||f||ffD]\}} t t |jt | jzD]} | |vs!| | vst|| t| | k7ryt || } t | | } | j| jt| | D]\} }|t| |z z }|Scc}w)zd Estimate how many steps it takes to reach ``func`` from self. Return -1 if impossible. rwr) r#rgrhrTr]setrkeysrrzipabs)rrjparams oabuckets obbucketsrrdiffrobucketrl1l2ijs r\ difficultyzHyper_Function.difficulty,sD :: #77DGGTWWdgg>4@594G4@0 9h!)9 5)7LM 'OFG4 .glln1EEF 'v%3g+=vc{+s73>> from sympy.simplify.hyperexpand import G_Function >>> from sympy.abc import y >>> from sympy import S >>> a, b = [1, 3, 2, S(3)/2], [1 + y, y, 2, y + 3] >>> G_Function(a, b, [2], [y]).compute_buckets() ({0: [3, 2, 1], 1/2: [3/2]}, {0: [2], y: [y, y + 1, y + 3]}, {0: [2]}, {y: [y]}) rz)TFFTrc|z Srbru)rZx0s r\rz,G_Function.compute_buckets..s Rr^)rreverse)rangerrrrrgrrhr]rerrrdict)rrdictspanpappbmpbqdiclisrZflipmrrr s @r\compute_bucketszG_Function.compute_bucketsus0BGq%JAk$&7%JJ"S#sEDGGTWWdggtww#GH (HC (E!H $$Q' ( (U$>? ICIIK 51X / >A   u-!d1g-..&K.s D(Dct|jt|jt|jt|jfSrb)rrrgrrhrs r\ signaturezG_Function.signatures1DGG c$''lCL#dgg,GGr^) rrrrrrrrrrrrrs@r\rr`sE 447>#/JHHr^rrZc4eZdZdZdZddZedZdZy)rfa- This class represents hypergeometric formulae. Explanation =========== Its data members are: - z, the argument - closed_form, the closed form expression - symbols, the free symbols (parameters) in the formula - func, the function - B, C, M (see _compute_basis) Examples ======== >>> from sympy.abc import a, b, z >>> from sympy.simplify.hyperexpand import Formula, Hyper_Function >>> func = Hyper_Function((a/2, a/3 + b, (1+a)/2), (a, b, (a+b)/7)) >>> f = Formula(func, z, None, [a, b]) cH|jjDcgc] }t|z }}|jjDcgc]}t|zdz }}tt |z|j t |zz }t |t}|jdz }|g}t|D]<} |j|j |dj|j z>t||_ tdgdg|zzg|_ t|} | jdt!|d} |j"dd} | j%| j'|t| g |j"dz |_ycc}wcc}w)z Compute a set of functions B=(f1, ..., fn), a nxn matrix M and a 1xn matrix C such that: closed_form = C B z d/dz B = M B. rWrwrN)rjrg_xrhrrnrQdegreer rerrLrqrrrM col_insertrN all_coeffsr  row_insertrs) r closed_formrkafactorsrlbfactorsrrPn_rrs r\_compute_basiszFormula._compute_basiss\%)IILL1qBF11(, 51BFQJ55#x. 466#x.#88D"~ DKKMA  Mq 0A HHTVVAbEJJtvv.. / 0!s1u & F LLE!QK ( DOO ab ! a&!+odoo.?.B!BC#25s FFNc t|}t|}t|Dcgc]}|j|s|}}||_||_||_||_||_||_||j|yycc}wrb) r hasrnr rqrrrsrjr') rrjrnrir rqrrrsrZs r\__init__zFormula.__init__s AJcl%g.>$((1+1>>  ?    $ ?s BBcvtdt|j|jtj S)Nc||d|dzzSNrrWrurrs r\rz%Formula.closed_form..!AaD1I+r^rrrrrqrrrs r\r"zFormula.closed_form%-s466466/BAFFKKr^c Z!ddlm}|j}|j}t |t j jk7s+t |t j jk7r t dg}jD]w}|j jjvr|j|7|j jjvr|j|ktd|t|Dcgc]*}tttj|,}}||fD cgc]} t| t c} \} } | | fD  cgc]/} | j#D cic]\}} |t | c} }1c} }} \}}jDcgc]}dg}}g}t%}|D](!j jj jfD cgc]} t| !fdc} \}}| |f| |ffD]3\} }t't| j)t|j)zD]}|| vs!||vst | |t ||k7rmtj|D]\}} !|j*r||Dcgc]}|j-|s|}}!j/}||xx|z cc<|D]Q}| |D]G}||j1||z |\}|j*r td| j|IS6g}tj|D]a\}} !|}t3t5| }t7t9| }|jt;||dzD cgc]} || z c} c|j=fdt|D+|Scc}wcc} wcc} }wcc} }} wcc}wcc} wcc}wcc} w) z Find substitutions of the free symbols that match ``func``. Return the substitution dictionaries as a list. Note that the returned instantiations need not actually match, or be valid! r)solvez-Cannot instantiate other number of parametersz?At least one of the parameters of the formula must be equal to c8t|jSrb)r]xreplace)rZrepls r\rz-Formula.find_instantiations.. sU1::d;K5Lr^zValue should not be truerWc 3nK|],}tttj|.ywrb)rrrr )rrrs r\rz.Formula.find_instantiations..#s&Y1d4DLL!(<#=>Ys25) sympy.solversr3rgrhrrj TypeErrorr rre ValueErrorrrrrrTr]rr rr free_symbolsr)copyr5r4minr5maxr extend)"rrjr3rgrh symbol_valuesrkr base_replrrrrvalsa_invb_invr&critical_valuesresult_nsymb_asymb_brrrexprsrepl0targetn0a0min_max_r%r6s"` @r\find_instantiationszFormula.find_instantiationss ( WW WW r7c$)),,' '3r7c$)),,6G+GKL L  >ADIILL%%%$$R(diill'''$$R( 9:"=>>  >&}57$s4<<89:7 7ACRIfd651I('2446<\\^D'!TCID4 u(, 51A355 W ZD#yy||TYY\\:<#6+LM>> from sympy.simplify.hyperexpand import (FormulaCollection, ... Hyper_Function) >>> f = FormulaCollection() >>> f.lookup_origin(Hyper_Function((), ())).closed_form exp(_z) >>> f.lookup_origin(Hyper_Function([1], ())).closed_form HyperRep_power1(-1, _z) >>> from sympy import S >>> i = Hyper_Function([S('1/4'), S('3/4 + 4')], [S.Half]) >>> f.lookup_origin(i).closed_form HyperRep_sqrts1(-1/4, _z) Nrwc |dSrrurs r\rz1FormulaCollection.lookup_origin..ks AaDr^rc3zK|]3}|jtjtt t5ywrb)r)rNaNrr)res r\rz2FormulaCollection.lookup_origin..os%NaquuQUUBS1Ns9;)rrrVrUrQrjr5rrrerrfrnrqsubsrrrsr) rrjrYrpossiblerXreplsr6func2rr&f2s r\ lookup_originzFormulaCollection.lookup_origin?s*##%  D** *t--e44))%05 5 .. .''. 8A))$/E 8-002''-2:tQ 67 8 8  . )!)  AtQT2qssxx~CCHHTNACCHHTN4BNBDD"$$;MNN   r^Nrrrrr*rdrur^r\rSrS)s7F&3r^rSc,eZdZdZdZedZdZy)rz This class represents a Meijer G-function formula. Its data members are: - z, the argument - symbols, the free symbols (parameters) in the formula - func, the function - B, C, M (c/f ordinary Formula) c ||||fD cgc]!} tttt| #c} \}}}}t |||||_||_||_| |_||_ ||_ | |_ ycc} wrb) r rrr rrjrnr _matcherrqrrrs) rrrgrrhrnr rqrrrsrrs r\r*zMeijerFormula.__init__suACRR@PQ1%c&!n!56QBBr2r2.   Rs&A5cvtdt|j|jtj S)Nc||d|dzzSr-rur.s r\rz+MeijerFormula.closed_form..r/r^r0rs r\r"zMeijerFormula.closed_formr1r^c |j|jjk7ry|j|}||\}}t|j|j |j |j|jg|jj||jj||jj|d Sy)z Try to instantiate the current formula to (almost) match func. This uses the _matcher passed on init. N) rrjrhrrrgrrhrnrqr_rrrs)rrjrir_newfuncs r\try_instantiatezMeijerFormula.try_instantiates >>TYY00 0mmD! ?MD' WZZWZZ!%!%T!2DFFKK4E!%T!2D: : r^N)rrrrr*rr"rmrur^r\rrus'LL :r^rceZdZdZdZdZy)MeijerFormulaCollectionz= This class holds a collection of meijer g formulae. cg}t|tt|_|D]4}|j|jj j |6t|j|_yrb)rrrrmrjrrer)rrmformulas r\r*z MeijerFormulaCollection.__init__s]X&#D)  BG MM',,00 1 8 8 A BT]]+ r^c|j|jvry|j|jD]}|j|}||cSy)z* Try to find a formula that matches func. N)rrmrm)rrjrqris r\rdz%MeijerFormulaCollection.lookup_originsK >> .}}T^^4 G))$/C  r^Nrerur^r\roros,r^roceZdZdZdZy)Operatora Base class for operators to be applied to our functions. Explanation =========== These operators are differential operators. They are by convention expressed in the variable D = z*d/dz (although this base class does not actually care). Note that when the operator is applied to an object, we typically do *not* blindly differentiate but instead use a different representation of the z*d/dz operator (see make_derivative_operator). To subclass from this, define a __init__ method that initializes a self._poly variable. This variable stores a polynomial. By convention the generator is z*d/dz, and acts to the right of all coefficients. Thus this poly x**2 + 2*z*x + 1 represents the differential operator (z*d/dz)**2 + 2*z**2*d/dz. This class is used only in the implementation of the hypergeometric function expansion algorithm. c|jj}|j|g}|ddD]}|j||d|d|dz}t |dd|ddD] \}}|||zz }|S)a Apply ``self`` to the object ``obj``, where the generator is ``op``. Examples ======== >>> from sympy.simplify.hyperexpand import Operator >>> from sympy.polys.polytools import Poly >>> from sympy.abc import x, y, z >>> op = Operator() >>> op._poly = Poly(x**2 + z*x + y, x) >>> op.apply(z**7, lambda f: f.diff(z)) y*z**7 + 7*z**7 + 42*z**5 rWNrwr)_polyr r rer)rropcoeffsdiffsr[rds r\applyzOperator.applys&&( (A LLE"I ' ( 1IeAh qr E!"I. DAq 1HA r^N)rrrrr|rur^r\rtrts 4r^rtceZdZdZdZy) MultOperatorz! Simply multiply by a "constant" c.t|t|_yrb)rQrrv)rps r\r*zMultOperator.__init__s!R[ r^N)rrrrr*rur^r\r~r~s +!r^r~ceZdZdZdZdZy)ShiftAz Increment an upper index. cxt|}|dk(r tdtt|z dzt|_y)Nrz"Cannot increment zero upper index.rWr r:rQrrv)rais r\r*zShiftA.__init__s4 R[ 7AB B"R%!)R( r^cHdd|jjdz zS)NzrWrrvr rs r\__str__zShiftA.__str__s$&!DJJ,A,A,CA,F*FGGr^Nrrrrr*rrur^r\rrs%) Hr^rceZdZdZdZdZy)ShiftBz Decrement a lower index. c~t|}|dk(r tdtt|dz z dzt|_y)NrWz"Cannot decrement unit lower index.rrbis r\r*zShiftB.__init__s8 R[ 7AB B"b1f+/2. r^cNdd|jjdz dzzS)NzrWrrrs r\rzShiftB.__str__s)&!DJJ,A,A,CA,F*F*JKKr^Nrrur^r\rrs$/ Lr^rceZdZdZdZdZy)UnShiftAz Decrement an upper index. cttt|||g\}}}||_||_||_t|}t|}|j |dz }|dk(r tdt||zt}|D]}|tt|ztz}td}t||z|z |x} } |D]} | | | dz j|zz} | jd } | dk(r tdtt| jdd|jj|t|z dzt} t| |z | z t|_y) Note: i counts from zero! rWrz"Cannot decrement unit upper index.Az0Cannot decrement upper index: cancels with lowerNrwrrr _ap_bq_ipopr:rQrr as_polynthr rr_rv) rrgrhrrnrrrkrr%Drlb0s r\r*zUnShiftA.__init__slWr2qk23 B "X "X VVAY] 7AB B 2rN "A b1fb! !A " #JRTBY""A (A a!e__Q'' 'A (eeAhY 723 3 allnSb)1-557<rrrrs r\rzUnShiftA.__str__/";?778<$((L Lr^Nrrur^r\rr s%*BLr^rceZdZdZdZdZy)UnShiftBz Increment a lower index. cttt|||g\}}}||_||_||_t|}t|}|j |dz}|dk(r tdtt|dz zt}|D]}|tt|zdz tz}!td}t|dz |z|z dz|} t||} |D]} | | | j|zz} | jd} | dk(r tdtt| jdd|jj|t|dz z dzt} t|| z | z t|_y)rrWrz Cannot increment -1 lower index.rqz*Cannot increment index: cancels with upperNrwr) rrgrhrrnrrrlrqrr%rkrs r\r*zUnShiftB.__init__7sWr2qk23 B "X "X VVAY] 7?@ @ R!Vb ! &A b1fqj"% %A & #J "q&!b1$a ( AJ $A !aiil" #A $UU1X 7IJ J allnSb)1-557<< r26{Q !# %1q5"*b) r^cVd|jd|jd|jdS)NzrWrrs r\rzMeijerShiftA.__str__es(DJJ,A,A,CA,FGGr^Nrrur^r\rr^s''Hr^rceZdZdZdZdZy) MeijerShiftBz Decrement an upper a index. cXt|}td|z tzt|_yrVrrs r\r*zMeijerShiftB.__init__ls! R[!b&2+r* r^cHdd|jjdz zS)NzrWrrs r\rzMeijerShiftB.__str__ps$(A 0E0E0G0J,JKKr^Nrrur^r\rris'+Lr^rceZdZdZdZdZy) MeijerShiftCz Increment a lower b index. cTt|}t| tzt|_yrbrrs r\r*zMeijerShiftC.__init__ws R[2#(B' r^cDd|jjd zS)NzrWrrs r\rzMeijerShiftC.__str__{s"(TZZ-B-B-DQ-G,GHHr^Nrrur^r\rrts&(Ir^rceZdZdZdZdZy) MeijerShiftDz Decrement a lower a index. cXt|}t|dz tz t|_yrVrrs r\r*zMeijerShiftD.__init__s! R["q&2+r* r^cHd|jjddzzS)NzrWrrs r\rzMeijerShiftD.__str__s$(DJJ,A,A,CA,F,JKKr^Nrrur^r\rrs&+Lr^rceZdZdZdZdZy)MeijerUnShiftAz Decrement an upper b index. c 8 ttt|||||g\}}}}}||_||_||_||_||_t|}t|}t|}t|}|j|dz }tdttd|Dztd|Dz}td} t|| z |  t|| t fd|Dzt fd|Dz} | jd} | dk(r tdtt| jd d | j!j#| |tz t} t|| z | z t|_y ) rrWc3JK|]}t|tz tywrbrQrrrls r\rz*MeijerUnShiftA.__init__..s.sCaYZDaQSDTCarrc3.K|] }dz|z ywrWNrurrkrs r\rz*MeijerUnShiftA.__init__..s6aq1uqy6c30K|] } |zdz ywrrurs r\rz*MeijerUnShiftA.__init__..s=WqrAvz=Wsrz(Cannot decrement upper b index (cancels)Nrw)rrr _anr_bmrrrrQrrr rr:r rr_rv) rrrgrrhrrnrrrr%rrs @r\r*zMeijerUnShiftA.__init__sb Wr2r2q.A!BCBB "X "X "X "X VVAY] BK$<<< rr^Nrrur^r\rrs&%*NNr^rcLeZdZdZdZedZedZedZdZ y) ReduceOrderz8 Reduce Order by cancelling an upper and a lower index. clt|}t|}||z }|jr|dkry|jr |jrytj |}t j}t|D]}|t|z|z||zz z}t|t|_ ||_ ||_ |S)z< For convenience if reduction is not possible, return None. rN)r is_Integerrrrtrrrr rrQrv_a_b)r`rbjr%rrks r\rzReduceOrder.__new__Fs R[ R[ G||q1u ==R..$ EEq (A "r'A+Q' 'A (!R[  r^ct|}t|}||z }|js |jsytj |}t j }t|D]}||tz|z|zz}t|t|_ |dk(r||_ ||_ |Std|dz d|_ td|dz d|_ |S)zN Cancel b + sign*s and a + sign*s This is for meijer G functions. NrwrWF)evaluate)r rrrtrrrr rrQrvrrr)r`rlrksignr%rrrs r\_meijerzReduceOrder._meijer\s AJ AJ E == $ EEq #A $r'A+/ "A #!R[ 2:DGDG  !QUU3DG!QUU3DG r^c(|j||dS)Nrwr)r`rlrks r\ meijer_minuszReduceOrder.meijer_minusvs{{1a$$r^c4|jd|z d|z dSrVr)r`rkrls r\ meijer_pluszReduceOrder.meijer_pluszs{{1q5!a%++r^c<d|jd|jdS)Nz">> from sympy.simplify.hyperexpand import reduce_order, Hyper_Function >>> reduce_order(Hyper_Function((1, 2), (3, 4))) (Hyper_Function((1, 2), (3, 4)), []) >>> reduce_order(Hyper_Function((1,), (1,))) (Hyper_Function((), ()), []) >>> reduce_order(Hyper_Function((2, 4), (3, 3))) (Hyper_Function((2,), (3,)), []) )rrgrhrrrdr )rjrnbqrs r\ reduce_orderrs>.(+GWXCi %+uc{ 3Y >>r^ct|j|jtjd\}}}t|j |j tjt\}}}t||||||zfS)a  Given the Meijer G function parameters, ``func``, find a sequence of operators that reduces order as much as possible. Return newfunc, [operators]. Examples ======== >>> from sympy.simplify.hyperexpand import (reduce_order_meijer, ... G_Function) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [3, 4], [1, 2]))[0] G_Function((4, 3), (5, 6), (3, 4), (2, 1)) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [3, 4], [1, 8]))[0] G_Function((3,), (5, 6), (3, 4), (1,)) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [7, 5], [1, 5]))[0] G_Function((3,), (), (), (1,)) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [7, 5], [5, 3]))[0] G_Function((), (), (), ()) ct| Srbrrs r\rz%reduce_order_meijer..s-=qb-Ar^) rrrhrrrrgrrr)rjrrops1nbmrops2s r\reduce_order_meijerrso,#477DGG[5L5L#ACNCd"477DGG[5M5M#35NCd c3S )4$; 66r^cfd}|S)z? Create a derivative operator, to be passed to Operator.apply. cp|jz|zz}|jt}|Srb)r applyfuncr)rrrzrsrns r\doitz&make_derivative_operator..doits4 affQiK!A#  KK ! %r^ru)rsrnrs`` r\make_derivative_operatorrs Kr^cN|}t|D]}|j||}|S)zk Apply the list of operators ``ops`` to object ``obj``, substituting ``op`` for the generator. )reversedr|)ropsrwrios r\apply_operatorsrs1 C c]ggc2 Jr^c n|j|j|j|jfDcgc]}t|tc}\}}}}t t |j t t |j k7sEt t |j t t |j k7rt|d|g}dfd} fd} tt |j t |j ztD]X} d} d} d}d}| |vr || } || } | |vr || }|| }t | t | k7st |t |k7rt|d|| | ||fDcgc]}t|tc}\} } }}d}||| }||| }t | dk(r|| g||||z }nt |dk(r|| | g| ||z }np| d }| d }|d|z dks |d|z dkr td ||z dkDr|| | || ||z }|| | ||||z }n|| | ||||z }|| | || ||z }| || <||| <[|j|Scc}wcc}w) a( Devise a plan (consisting of shift and un-shift operators) to be applied to the hypergeometric function ``target`` to yield ``origin``. Returns a list of operators. Examples ======== >>> from sympy.simplify.hyperexpand import devise_plan, Hyper_Function >>> from sympy.abc import z Nothing to do: >>> devise_plan(Hyper_Function((1, 2), ()), Hyper_Function((1, 2), ()), z) [] >>> devise_plan(Hyper_Function((), (1, 2)), Hyper_Function((), (1, 2)), z) [] Very simple plans: >>> devise_plan(Hyper_Function((2,), ()), Hyper_Function((1,), ()), z) [] >>> devise_plan(Hyper_Function((), (2,)), Hyper_Function((), (1,)), z) [] Several buckets: >>> from sympy import S >>> devise_plan(Hyper_Function((1, S.Half), ()), ... Hyper_Function((2, S('3/2')), ()), z) #doctest: +NORMALIZE_WHITESPACE [, ] A slightly more complicated plan: >>> devise_plan(Hyper_Function((1, 3), ()), Hyper_Function((2, 2), ()), z) [, ] Another more complicated plan: (note that the ap have to be shifted first!) >>> devise_plan(Hyper_Function((1, -1), (2,)), Hyper_Function((3, -2), (4,)), z) [, , , , ] z not reachable from cg}tt|D]K}||||z dkDr|}d}n|}d}||||k7s&||||gz }||xx|z cc<||||k7r&M|S)NrrWrw)r r)frotoincdecrrshchs r\ do_shiftszdevise_plan..do_shifts"ss3x A!us1v~!Q%3q6/3 |#A" Q%3q6/  r^c .||dfdS)z( Shift us from (nal, nbk) to (al, nbk). ct||Srb)rrrs r\rz2devise_plan..do_shifts_a..4svad|r^c,t|zz|Srb)r)rraotherbothernbkrns r\rz2devise_plan..do_shifts_a..5shq6z3<A&Nr^ru)nalralrrr rns ` ``r\ do_shifts_az devise_plan..do_shifts_a2sb";NP Pr^c.||fddS)z( Shift us from (nal, nbk) to (nal, bk). c,tz|z|Srb)r)rrrrrrns r\rz2devise_plan..do_shifts_b..:shsV|QZA&Nr^ct||Srb)rrs r\rz2devise_plan..do_shifts_b..;sfQqTlr^ru)rrbkrrr rns` ``r\ do_shifts_bz devise_plan..do_shifts_b7sbN24 4r^rrucLg}|D]}||k7s |j|||Srb)r?)rrrrs r\otherszdevise_plan..othersNs4A %8HHSV$ %Hr^rrwzNon-suitable parameters.) rgrhrTr]rrrr:sortedrr )rLoriginrnrrr nabuckets nbbucketsrrrrzrrrrrrrrnamaxamaxr s ` @r\ devise_planr$s^yy&))VYY B0D 15VU0C0D,Hh 9 4  !Sinn.>)?%@@ X]]_% &#d9>>3C.D*E EvvFGG C P 4 D)D,AAGW X1   =!BA,C =!BA,C r7c#h #b'SX"566JK K#r3')#1*:;)CS   1% 1% r7a< ;r3FF; ;C W\ ;sBFF; ;CGEb6D1v~"bedla&7 !;<<t|a{3R@@{2sB??{3R@@{3B?? !  ! c1fKKM Jq0Dd)s J--J2c t|jtt|jt}}t |t j dk7ry|t j d}|dkryt j |vryt|t j }|j|d}|dkryt|j}|j|t|j}|j||dz}|D cgc]} | |z  }} |D cgc]} | |z  }} g} t|dz D]} | jt| dz!| jt|||zz } | t|D cgc]} t!| |c} z} | t|Dcgc]}t!||c}z} | t#| gz } d}t|D]^} || zt| z }|t|Dcgc]}t!|| c}z}|t|D cgc]} t!| | c} z}||z }`t%||| | fScc} wcc} wcc} wcc}wcc}wcc} w)z? Try to recognise a hypergeometric sum that starts from k > 0. rWNr)rTrgr]rhrrrrrremover rerr r7rr6r~rd)rjrnrrrzrrrrrZrr%facrlrkrrs r\try_shifted_sumr(ts<dggu-tDGGU/ChH 8AFF !AAvvvX Xaff AFFH !AAv tww-CJJqM tww-CJJqMFA Q1q5 C  Q1q5 C  C 1q5\" 6!a%=!"KKM A,q!t C33'aAq' ((C33'aAq' ((CL  C A 1X qD1  SS)2a8) ** SS)2a8) ** Q  #s #S1" ,,+  ('*)s$ I" I I 0I% I* &I/ c  t|jtt|jt}}|tj }|tj }|j |j |Dcgc] }|dks | }}|Dcgc] }|dks | c} rt fd|DrtS|sy|d}d} tj} ttt| D]`} | |z} | | dzz} | t|jDcgc]}|| z c}z} | t|jD cgc]} | | z c} z} | | z } b| Scc}wcc}wcc}wcc} w)zj Recognise polynomial cases. Returns None if not such a case. Requires order to be fully reduced. rc3.K|] }|dkyw)rwNru)rrkbl0s r\rz!try_polynomial..s,11s2w;,rNrwrW)rTrgr]rhrrrallrrr rr r)rjrnrrrNrrZal0rkr'rir%rlr+s @r\try_polynomialr.sKdggu-tDGGU/ChH !&& B !&& BGGIGGI #AF1 #C # #AF1 #C s,,,  BA C %%C DrO $ q q1u  sDGG,qQU,-- sDGG,qQU,-- s   J# $ #-,s$ E E E" E" E'  E, c  t|jtt|jt}}i}|j D]@\}}|dk7r||vry||}t |t |f||<|j |dB|ik7rytj|vry|tj\}}||dgzf|tj<td} tj} tj} |j D]\}\} }t| t|k7ryt| |D]a\} }| |z jr'| |z }| t|| z|z} | t||z} <|| z }| t| |z} | t| | z|z} ct| | z | }t!j"|}g}i}|D]^}|j%\} } | j'| sDt)| | }|j*s t-d|j/\\}} || | z |fgz }l| j'| r t1d| j3| \}\}d}|j4r|j6}|j8}|| k(rd} nm|j:rV|j=| \} }d}|| k7r|j=| \}}||| z| zk7rt1d|z| |z} |||zz}n t1d|j?| gjA| |z |fai}i}td }|jCd ddd|z z i}|r3tE|d dD]}|||jG|z||dz<!|D]:\} }|j?tjgjA| ||z<|j D]\} }|D]1\} }|j?tI||| gjA| 3|jCd tEd|d ddzD]2}| tI||| fdtI||dz | fg|tI||| <4| tI|d| fdd|z z tjfg|tI|d| <i}!tKtjgt |jMzD] \}}||!|< tO|!j d Dcgc]\}}tQ|}"}}tS|"}#tSdgt|#zg}$|j D]\}} t!| |$|!|<tUt|#}%|j D]\}}|D]\} }&| |%|!||!|&f<tW||dg|#|$|%Scc}}w)z Try to find an expression for Hyper_Function ``func`` in terms of Lerch Transcendents. Return None if no such expression can be found. rNrWrzp should be monomialz. s 1r^rrwc |dSrVrurs r\rztry_lerchphi..*s QqTr^rvc |dSrVrurs r\rztry_lerchphi..4s adr^),rTrgr]rhrrrrrr rrr is_positiver6rOr make_argsrr)rQ is_monomialr9LTNotImplementedError as_coeff_mulis_Powrbaseis_Addas_independentrWrerr rr8 enumeraterrrrLrNrf)'rjrrpairedrvaluebvalueaintsbintsrrravaluerkrlrpartr monomialstermsrrindepdepr%tmpr&derivrxrnmonrr[transbasisrqrrrsb2s' r\ try_lerchphirOsdggu-tDGGU/ChH Fnn& U !88+#E{DL1s  S$  2~vvX!&&>LE5UaS[)F166N c A EEE EEE!'& ff v;#f+ %' &DAqA""EAE1%Aq!EAq!AE1% & &( ua D == DI E9))+ uyy|UAA== 677JUaA 1U7A, 'I  99Q<%'BC C))!, u  ::A((C !8A ZZ''*FAsAax))!,1acAg~)*@3*FGG FA QTME%&MN N B&&e Q'78=9L E F c A NN~N& aQi.Cy}Q'( *A3q6;;q>)CAJ *61!%%$++Ac!fH56 81 ?DAq   hq!Q/ 4 ; ;A > ? >"q!B%(Q,' DA*+XaA->(?)*HQAq,A(B(DE(1a# $ D'(R!Q):$;%&AY$6$8hq!Q 8 E155'D$6671a*05B+D EA[^ EE Eu ACF |A 11g%(  c!f A '1 'EAr%&AeAhb ! " '' 4D"aA .. EsWc rtd}|jr |jDcgc] }t|z }}|jDcgc]}t|zdz }}tt |z|t |zz }t |t}|j }g} t|} t|D]d} |jd| z}| t|gt|jddz|j|gz } | |dz ksS| | | | f<|| | | dzf<ft| } tdgdg|dz zzg} t|g}t|D]} |j| || z|j}|jdg|z}t!|D].\} }t!| || zD]\}}||xx||zz cc<0t!|D]6\} }| ||dz d|dz fz |jdz | |dz | f<8t#||dg| | | Sg} t|jdd}tt%|D] }| tg||gz } ||xxdz cc<"| tg||gz } t| } t%| }tdgdg|dz zzg} t|} |t |jz | d|dz f<td|D]4} |j| dz | | | dz f<|j| dz  | | | f<6t#||dg| | | Scc}wcc}w)zU Create a formula object representing the hypergeometric function ``func``. rnrWrN)r rgrrhrrQrrNr r?rrLrMrer r r=rfr)rjrnrkr#rlr$rrPr%rMrsrrqrrderivsrrir[rzr{rhrs r\build_hypergeometric_formularR@sv c A ww$(GG,qBF,,(,01BFQJ00#x. 1S(^#33D"~ DKKM !Hq A QA eQC$twwqr{"33TWWa@A AE1q5y"!Q$!QU(  5M QC1#q1u+%& 'a&q 'A MM!F1I+ & ' DOO  c!eaL DAq!!F1I+. 1A!A#   cN JDAq"VAE]1a!e844_T__5Fq5IIAa!eQhK JtQb!Q22 $''!* s2w A eBA&' 'E qEQJE  %B"## 5M F QC1#q1u+%& ' !HTWW o!QU( q! &A''!a%.AaQhKwwq1u~oAadG &tQb!Q22Y-0s L/L4ct|t|}}|}t|}|dk(rtjSddlm}|dk(r:|dk(r4||z\}}} |dk(r;t | |z |z t | zt | |z z t | |z z S|dk(r|||z | zdk(r||}}|dk(r|||z | zdk(r|jrh|jr\dtt|zdz zt | zt ||z dzzt | dz z t |dz |z dzz St |dz dzt ||z dzzt |dzz t |dz |z dzz St|||S)z Try to find a closed-form expression for hyper(ap, bq, z), where ``z`` is supposed to be a "special" value, e.g. 1. This function tries various of the classical summation formulae (Gauss, Saalschuetz, etc). rrrvrWrw) rr>rrsympy.simplify.simplifyrr#rrr!rr?) rgrhrnrqz_rrkrlr[s r\hyperexpand_specialrXzs r7CGqA B1 AAvuu 0Av!q&r'1a 6Q#E!H,U1q5\9%A,F F 7xA *a/aqA 7xA *a/|| RT!V}UA2Y.uQUQY/??A2a4[!!&qsQw{!344QqS1W~eAEAI&661q5\""'!a! "455 R r^Nz0rWdefaultcjrtjSddlm}t ddk(rdfd}t tatd|t|\}} | r td |n td t|} | Otd t| | fd } t| zfd } t|| jStj} t|} | | \}} } td|| | z } t| | fd} t| zfd} || j} tdvrst!|j"t!|j$fdk(rFt'|} || | j)t*t,}|j/t*s|| zSt j1|}| t3|}|tddt'|}td|j4d|j6| t9||j6z } ||| | z}t;|dj)t*t,S)a7 Try to find an expression for the hypergeometric function ``func``. Explanation =========== The result is expressed in terms of a dummy variable ``z0``. Then it is multiplied by ``premult``. Then ``ops0`` is applied. ``premult`` must be a*z**prem for some a independent of ``z``. rrTF)r_rZ nonrepsmallc t|jj|j |t |j j|j  }t|t |j j|j t |j jdzz }dk(r|jt }tdt||jj|j tjz}|j }r|j}|S)NrrWc||d|dzzSr-rur.s r\rz5_hyperexpand..carryout_plan..sq1ad{r^)rrrr_rnrrsrMshaperrrrrqrrrewrite) rXrrrrzriops0prempremultr`rnrYs r\ carryout_planz#_hyperexpand..carryout_plans ACCHHQSS"-s4QSSXXacc25FK M At4QSSXXacc25F+/ACCIIaL0A+A6BCEG H a< IbM*A *C13388ACC3D,Eqvv Nw VffRm ++g&C r^z)Trying to expand hypergeometric function  Reduced order to  Could not reduce order.z Recognised polynomial.c,|jzSrbrrXrYs r\rz_hyperexpand..s166": r^c,|jzSrbrhris r\rz_hyperexpand..sr!&&*}r^z+ Recognised shifted sum, reduced order to c,|jzSrbrhris r\rz_hyperexpand..s"QVVBZ-r^c,|jzSrbrhris r\rz_hyperexpand..s2affRj=r^)rWrw)rvrWz Could not find an origin. z@Will return answer in terms of simpler hypergeometric functions.z Found an origin:  Tpolar)is_zerorrrUrr= _collectionrSrrr.rr>r_rr(rrgrhrRreplacer?rXr)rdrOr"rjr$rS)rjrnrarYrcrbr`rrdrrirnopsrXrzrqs `````` r\ _hyperexpandrtsR yyuu 0A)  *')  5t<T"ID#  #T* )* r "C  () C&= > AgIt-D E(1+**2q122 A $ #C  dA ;TB t  3 78A' 4)@AA QA!}S\3tww<$@F$J ( . !S ! ) )%1D EuuU|q5L''-Gt$ ,2 3/t4 !4!4c7<<H;tW\\2 ..C gs#a'A Qd # + +E3F GGr^c J d}t|jt|jt|j t|j g}d}|rDd}||j fdd z}| ||gz }d}0||j fdd z}| ||gz }d}[| |j fddz}| ||gz }d}| |j fd dz}| ||gz }d}||jfd dg}| ||gz }d}||jfd dg}| ||gz }d}| |j fd dg}| ||gz }d}| |j fd dg}| ||gz }d}C|rDt|jk7sHt|jk7s0 t|jk7s t|jk7r t d|j |S)a Find operators to convert G-function ``fro`` into G-function ``to``. Explanation =========== It is assumed that ``fro`` and ``to`` have the same signatures, and that in fact any corresponding pair of parameters differs by integers, and a direct path is possible. I.e. if there are parameters a1 b1 c1 and a2 b2 c2 it is assumed that a1 can be shifted to a2, etc. The only thing this routine determines is the order of shifts to apply, nothing clever will be tried. It is also assumed that ``fro`` is suitable. Examples ======== >>> from sympy.simplify.hyperexpand import (devise_plan_meijer, ... G_Function) >>> from sympy.abc import z Empty plan: >>> devise_plan_meijer(G_Function([1], [2], [3], [4]), ... G_Function([1], [2], [3], [4]), z) [] Very simple plans: >>> devise_plan_meijer(G_Function([0], [], [], []), ... G_Function([1], [], [], []), z) [] >>> devise_plan_meijer(G_Function([0], [], [], []), ... G_Function([-1], [], [], []), z) [] >>> devise_plan_meijer(G_Function([], [1], [], []), ... G_Function([], [2], [], []), z) [] Slightly more complicated plans: >>> devise_plan_meijer(G_Function([0], [], [], []), ... G_Function([2], [], [], []), z) [, ] >>> devise_plan_meijer(G_Function([0], [], [0], []), ... G_Function([-1], [], [1], []), z) [, ] Order matters: >>> devise_plan_meijer(G_Function([0], [], [0], []), ... G_Function([1], [], [1], []), z) [, ] ctt||D]Q\}\}|z js|z |z dkDs%tfd|Ds:||}||xx|z cc<|cSy)aD Try to apply ``shifter`` in order to bring some element in ``f`` nearer to its counterpart in ``to``. ``diff`` is +/- 1 and determines the effect of ``shifter``. Counter is a list of elements blocking the shift. Return an operator if change was possible, else None. rc3(K|] }|k7 ywrbru)rrZrks r\rz8devise_plan_meijer..try_shift..Rs01Q0sN)r=rrr,) rXrshifterrcounteridxrlr rks @r\ try_shiftz%devise_plan_meijer..try_shiftGsl%SAY/ KC!QQ""At|a'7000S\#$  r^TFc$t|Srb)rrfanfapfbmfbqrns r\rz$devise_plan_meijer.._S#sAq!Ir^rWc$t|Srb)rr}s r\rz$devise_plan_meijer..frr^c$t|Srb)rr}s r\rz$devise_plan_meijer..mrr^rwc$t|Srb)rr}s r\rz$devise_plan_meijer..trr^c t|Srb)r)rr~s r\rz$devise_plan_meijer..z\#a&-Ar^c t|Srb)r)rrs r\rz$devise_plan_meijer..rr^c t|Srb)r)rrs r\rz$devise_plan_meijer..rr^c t|Srb)r)rrs r\rz$devise_plan_meijer..rr^zCould not devise plan.)rrrgrrhr7r ) rrrnr{rchangerwr~rrrs ` @@@@r\devise_plan_meijerr sNt svv,C svv,C svv,C svv,C C F  sBEEI#)% > B4KCF  sBEEI#)% > B4KCF  sBEEI39& > B4KCF  sBEEI39& > B4KCF  sBEE#A2r J > B4KCF  sBEE#A2r J > B4KCF  sBEE#A1b I > B4KCF  sBEE#A1b I > B4KCF c d d255kSDK/3$ruu+3E 4; !":;;KKM Jr^c  t ta|dk(rd}|}td|td}t |\}r td|n tdtj |}|td|j t|j ||z t|jj|j|t|jj|j||}|jt|}||j j|j|z} | dj||} t#| d Std d fd } td| |j$|j&|j(|j*||\} } d} D]@}t-|j.j|dz t0t0 it0|_B| | |j&| |j$| |j*| |j(d|z \}}t#| j||d } t#|jd|z d }t3|t4s|jd|z }||}|j6dkDsk|j6dk(rht9|j(t9|j*k(r=t;|j<dkdur#t?|t?dk(r | durd } |durd }| d ur| jA|xsd} n| jA|xsd} |d ur|jA|xsd}n|jA|xsd}| dur|dur|dk(rd}|tBk(rd} t3| t4s| j||} t3|t4s|j||}d}|| | }|||}tE||ddtFfkr ||kr| S|StI|d|ddkr.tI|d|ddkrtK| | f||f||d fStK| | f||f||d f} | jMtNr |s td| jMtNr|r| S||S)a Try to find an expression for the Meijer G function specified by the G_Function ``func``. If ``allow_hyper`` is True, then returning an expression in terms of hypergeometric functions is allowed. Currently this just does Slater's theorem. If expansions exist both at zero and at infinity, ``place`` can be set to ``0`` or ``zoo`` for the preferred choice. NrZz1Try to expand Meijer G function corresponding to rnrerfz Found a Meijer G formula: rTrnz; Could not find a direct formula. Trying Slater's theorem.c|D]>}t||dkDsd}||vrt||}|dzt||ks>yy)z Test if slater applies. rWrFT)r)rrrrs r\can_doz_meijergexpand..can_dosU !A3q6{Q8CF Aq53s1v;&  !r^c & t||||}|j\}}} }+|| stjdfSt |t |zt |t |zk} t |t |zt |t |zk(rt dk} | durtjdfStj} |D]} t || dk(rD|| d} d}t |}|j| |D]}|t|| z z}|D]}|td| z|z z}|D]}|td| z|z z}|D]}|t|| z z}t |t |zDcgc] }d| z|z  }}t |t |zDcgc] }d| z|z  }}ttjt |t |z z}||z}-|z | z}tt|||,-|| d}| ||zz } Z|| d}|| ddDcgc]}||z  }}t |}| | d|dzDcgc]}||z  }}t |}|| D]}|j|t |} | | d|D]}| j||d}!t||D"cgc] \}"}|"|z  }#}"}td}$|$z}%|D]?}t|ds |j rt#t%|}|%t||$z z}%A|D]}|%td|z |$zz}%|D]}|%td|z |$zz}%|D]}|%t||$z z}%t'|%}%t)t#t%|!D]'}&t+|%|$||&z}'t-|',fd}'| |'z} )||!z}(ttjt | t |zdzz}||z}-|z |(z}t |t |zDcgc] }d|(z|z  c}dgz}t |t |zDcgc] }d|(z|z  }}tt|||,-||(d}tj|!zt/|!z })t)|D]4}*|)tj|#|*zt1|!||*z dz|#|*z z})6|D]}|)td|z |(zz})|D]}|)t||(z z})| D]}|)t||(z z})|D]}|)td|z |(zz})| |)|zz } | | fScc}wcc}wcc}wcc}wcc}}"wcc}wcc}w)NFrWrr`rwrc,|jzSrbrh)rXrns r\rz3_meijergexpand..do_slater..! s!AFF1I+r^)rrrrrrrr&r#r2 NegativeOnertrdrr rrXintroundrr rRrr7r6).rrrgrhrnzfinalrjr&rrcondrirbhr'borajrkrrlrrhargrchypb_rkirrliaolurdir integrandrzresidaurrrrrrs. ` r\ do_slaterz!_meijergexpand..do_slaters"b"b)--/3Qc3665= 2wR 3r7SW#44 r7SW B#b' 1 1q6A:D 5=665= ffT A3q6{aVAY"X " *B5b>)C*.B5R"--C..B5R"--C.*B5b>)C*+/8d2h+>?aq2vz??+/8d2h+>?aq2vz??q}}s2wR/@ABxQ3)">#s#;T3#$gr4AsSy VAY(+Aqr 3"b2g33G(+AvA7"b2g77"XQ!AIIaL!"XQ!AIIaL!V*-b"+6Aa!e66#JqD .Aq!9aMq1u-I.2Aq1uqy!11I22Aq1uqy!11I2.Aq1u-I. ( 2 s59~.!A#Iq"q&9E+E38MNE5LC! "Wq}}s2wR/@1/DEFxQ3)+/8d2h+>?aq2vz?1#E+/8d2h+>?aq2vz??">#s#;T3#$gr4AMMB' " 5qHA1-bbeaA.GGGAH+Aq1urz**A+'Aq2v&A''Aq2v&A'+Aq1urz**A+qu iT lDyQ@?477:@?s*U/:U4 U9' U>V=V ,Vrc2|Dcgc]}d|z  c}Scc}wrVru)rrZs r\rz_meijergexpand..trB s !!A!!!s rWrwFnonrepr\c|durd}n |durd}nd}|jttt trd}||j t |j fS)NTrFrWrvry)r)rrrcountr? count_ops)rrc0s r\weightz_meijergexpand..weightr sW 4<B U]BB 88BbS# &BDJJu%t~~'788r^z@ Could express using hypergeometric functions, but not allowed.)(_meijercollectionrorr rrdrjrrrrr_rnrrsrrrqrSrrrgrhrQrvrrrdeltarr:nur2r`rr=rr>r9r)r?)rjrY allow_hyperr`placefunc0rnrXrrrzrslater1cond1rrwslater2cond2rrw1w2rrrs @@@r\_meijergexpandrsa 35) E =tD c A#D)ID#  #T* )* ''-A} ,aff5 !!&&$22 ACCHHQSS!,c4QSSXXacc15EqI K KK ! % acchhqssA  aDIIa $'' GH eN c Atww$''1bINGU"> q!A#rB3&78"=>r$''{BtwwKDGGbk !B$(NGU Q+48G Q"-T:G eT " 1ac" QAww{ A#add)s144y0 X]5 (Z^z!}-L  E  E }//'"5X6//'":]; }//'"5X6//'":]; Ee50 A:E C<E eT " 1b! eT " 1b! 9  B  B 2r{q!Rj 7NN 2a5"Q%A#beRU"3q"8'5)GU+;eBi=NOO 7E"We$4uRy$6GHAuuU|K ! " 55<; 9r^ct|}fd}fd}|jt|jt|S)a Expand hypergeometric functions. If allow_hyper is True, allow partial simplification (that is a result different from input, but still containing hypergeometric functions). If a G-function has expansions both at zero and at infinity, ``place`` can be set to ``0`` or ``zoo`` to indicate the preferred choice. Examples ======== >>> from sympy.simplify.hyperexpand import hyperexpand >>> from sympy.functions import hyper >>> from sympy.abc import z >>> hyperexpand(hyper([], [], z)) exp(z) Non-hyperegeometric parts of the expression and hypergeometric expressions that are not recognised are left unchanged: >>> hyperexpand(1 + hyper([1, 1, 1], [], z)) hyper((1, 1, 1), (), z) + 1 cVtt|||}| t|||S|S)Nr)rtrdr?)rgrhrnrzr`s r\ do_replacezhyperexpand..do_replace s1 B/G D 9R# #Hr^c tt|d|d|d|d|}|jttt t s|Sy)NrrW)r`r)rrr)rrr)rgrhrnrzrrr`s r\ do_meijerzhyperexpand..do_meijer sQ :beRUBqE2a5A1u >uuS#rB3'H(r^)r rrr?rK)rXrr`rrrs ``` r\ hyperexpandr s82  A 99UJ ' / / CCr^)FrZN)r collectionsr itertoolsr functoolsrmathrsympyr sympy.corerr r r r r rrrrrrrrrrrsympy.core.modrsympy.core.sortingrsympy.functionsrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<$sympy.functions.elementary.complexesr=r>sympy.functions.special.hyperr?r@rArBrCrDrErFrGrHrIrJrKsympy.matricesrLrMrN sympy.polysrOrPrQ sympy.seriesrRsympy.simplify.powsimprSsympy.utilities.iterablesrTr]rrrrrdrrrfrSrrortr~rrrrrrrrrrrrrrrrrrr$r(r.rOrRrXrqrtrrrrrur^r\rsrt$@@@@@/HHHHHHHHHF5555.-)) ,* ]@ @F ATAH<H<H@ 3ZBBNIIX&:&:R.22j!8! HX H LX L&Lx&LR'Lx'LTH8HL8LI8IL8L#NX#NL,NX,N^0NX0Nf.NX.Nb=(=@4?87<FR*-Z8@/F73t#J  "eDk11"hHVEN9B}@'Dr^