
    EdI                       d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 dd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mZmZmZ ddlmZ dd	lm Z  dd
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;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZE ddlFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZS ddlTmUZUmVZVmWZW ddlXmYZYmZZZm[Z[ ddl\m]Z] ddl^m_Z_ ddl`maZa d Zbd Zcd Zdd Zed Zf G d de          Zg G d de          Zh ed          Zi G d d          Zj G d d          Zk G d  d!          Zl G d" d#          Zm G d$ d%          Zn G d& d'en          Zo G d( d)en          Zp G d* d+en          Zq G d, d-en          Zr G d. d/en          Zs G d0 d1en          Zt G d2 d3en          Zu G d4 d5en          Zv G d6 d7en          Zw G d8 d9en          Zx G d: d;en          Zy G d< d=en          Zz G d> d?en          Z{ G d@ dAen          Z|dB Z}dC Z~dD ZdE ZdF ZdG ZdH ZdI ZdJ ZdK ZdL ZdMag  edN          dOddPfdQZdR ZdMa	 	 dVdTZdVdUZdMS )Wa@  
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)SDummysymbolssympifyTupleexpandIpiMul
EulerGammaoozooexpand_funcAddnanExprRational)Moddefault_sort_key)!expsqrtrootlog
lowergammacosbesseligamma
uppergammaexpinterfsinbesseljEiCiSiShisinhcoshChifresnelsfresnelc
polar_lift	exp_polarfloorceilingrf	factoriallerchphi	Piecewisere
elliptic_k
elliptic_e)polarify
unpolarify)hyperHyperRep_atanhHyperRep_power1HyperRep_power2HyperRep_log1HyperRep_asin1HyperRep_asin2HyperRep_sqrts1HyperRep_sqrts2HyperRep_log2HyperRep_cosasinHyperRep_sinasinmeijerg)Matrixeyezeros)apartpolyPoly)residue)	powdenestsiftc                     | j         rt          | d          S |                                 \  }} t          |d          | z   S N   )	is_Numberr   as_coeff_Add)xcs     :lib/python3.11/site-packages/sympy/simplify/hyperexpand.py_mod1r^   U   sA     	{ 1ayy>>DAqq!99q=    c                 =   	
 t          dt                    \  
 
fd} 
fd} |ddt          
                      |fdt           
                      |t          j        z
  fdz  ft          t          
          t          t          j        z   
          dz  g          t          ddgg          t          t          j        z
  
z  d
z
  z  t          j        z
  
z  d
z
  z  gd
z
  z  
dz
  z  d
z
  z  gg                      |d	d
t          t          
          dg          t          d
z  dgg          t          d

dz
  z  gddgg                      |t          j        dft	          d          ft          t          
          dg          t          ddgg          t          t          dd          dd
z
  z  dz  gddgg                      |t          j        t          j        ft	          d          ft          t          
          t          t          dd          
          g          t          ddgg          t          t          dd          t          j        gd
d
z
  z  dz  gg                      |t          j        z   ft          j        ft          t           
          t           t          j        z
  
           g          t          ddgg          t          d g
dz  dz
  z  dz  d
z
  z  t          j        
dz  dz
  z  d
z
  z  z
  gg                      | gt          j        gt          t          
          t          
          g          t          ddgg          t          d g
z  d
z
  z  dd
z
  z  dz  gg                      |ddgdt          j        z  gt          t!          
          dg          t          ddgg          t          
t          j        z
  d
z
  z  dd
z
  z  dz  gddgg                      |t          j        t          j        gt          j        gt          t%          
          t'          
          g          t          dt(          z  dgg          t          t          dd          dd
z  dz
  z  gt          dd          t          j        gg                      |t          dd          t          j        gt          j        gt          t%          
          t'          
          g          t          ddt(          z  gg          t          t          dd          dd
z  dz
  z  gt          dd          t          j        gg                      |t          dd          ddgt          j        dgt          
t          
          z  t          
          dg          t          t          dd          t          j         d
z  z  t          dd          gg          t          t          j        d
d
z
  z  dz  gdd

dz
  z  gg dg                      |t          dd          ddgddgt          t          t          j        
          t+          
          dg          t          t          dd          dd
z  z  z
  dd
z  z  dd
z  z  gg          t          
dz  
dz
  z  ddgdd
dz
  z  z  dt          j        gg dg                      |dggt          
dz
  z  t          
          z  t-          dz
  
          z  dg          t          dz
  dgg          t          dz
  
z   dgddgg                      |gdz  gt          
t          j        z
  z  t          
dz            z  t/          t          j        z
  
dz            z  t1          t          j        z             z  dt          j        z
  z  z  
t          j        z
  z  t          
dz            z  t/          t          j        z   
dz            z  t1          t          j        z             z  dt          j        z
  z  z  g          t          ddgg          t          
dz  
dz  g
dz  
dz  dz  z
  gg                     t3          d          
z  } |gdz   gt          | z  z  t-          |          z  t          
          z  g          t          ddgg          t           dgd
gg                      |t          dd          gt          j        gt          
          t5          t(          
z            t6           z  t9          t6          t5          
          z            z  z
              |dgt          dd          t          dd          gt          t5          t(                    t6          t;          dt5          
          z            z  t=          dt?          
d          z  t          t6          t(          z  dz            z  t5          t(                    z            z  tA          dt5          
          z            tC          dt?          
d          z  t          t6          t(          z  dz            z  t5          t(                    z            z  z   z  t          t6           t(          z  dz            z  dt?          
d          z  z  t5          t(                    t?          
d          z  t;          dt5          
          z            tC          dt?          
d          z  t          t6          t(          z  dz            z  t5          t(                    z            z  t6          tA          dt5          
          z            z  t=          dt?          
d          z  t          t6          t(          z  dz            z  t5          t(                    z            z  z   z  t          t6           t(          z  dz            z  dz  dg          t          g dg          t          t          dd          dt          dd          g
t          dd          dgg dg                      |t          j        gt          dd          dz   gt          dz  dz
  z  t6           z  t5          t(          
z            z  t9          t6          t5          
          z            z  dz  dz
  z  t3          d          
z   z  z  t-          t3          d          
z            z  dz  dz
  z  t          
          z  g          t          g dg          t          t          dd          ddgd dgdd
gg                      |ddgddgt          tE          
          tG          
          z
  t          
          dtH          g          t          d
z  ddd
z  gg          t          g dd
ddgg dg dg                      |dt          j        ftA          dt5          
          z                        |g gt          t1                    
dz
  dz  z  z  t/          dz
  dt5          
          z            z  t1                    
ddz  z
  z  z  t/          dt5          
          z            z  g          t          ddgg          t          ddg
dz
  gg                     d
t          dd          z  z  		fd}	fd} |g t          j        t          j        z   gt           |dz  dz
  
           |dz  
          
t          dd          z  z   |dz  dz
  
          t5          
          z   |dz  
          
t          dd          z  z  g          ddz  z  z  t1          dz            z  
ddz  z
  dz  z  z  t          g dg          t          g ddt          j        z
  ddgddt          j        dg
dddz
  gg                     dd
z  t          dd          z  z  tK          t6          t(          z  dz            z  	 |g t          j        z   dz  gdt5          t3          d          
z            z  ddz  z
  z  t1          dz            dz  z  t          tM          dz  dz
  	          t/          dz  dz
  	          z  	t/          dz  	          tM          dz  dz
  	          z  t/          dz  dz
  	          tM          dz  	          z  z
  z  	dz  t/          dz  	          z  tM          dz  	          z  	dz  t/          dz  	          tM          dz  dz
  	          z  t/          dz  dz
  	          tM          dz  	          z  z   z  g          z  t          g dg          t          dt          dd          ddgdddz  z
  dz  t          dd          dgddddz  z
  t          dd          gd
z  dddz
  gg                      |gt          j        z
  dz  gt          
t          j        z
  z  t/          t          j        z
  t5          
                    dz  z  
dz
  z  t/          t          j        z
  t5          
                    z  t/          t          dd          z
  t5          
                    z  
t          dd          z
  z  t/          t          dd          z
  t5          
                    dz  z  g          t          t1          t          j        z             dz   dt          j        z
  z  z  dt1          t          j        z
            z  t1          t          j        z             z  ddz
  z  z  dgg          t          ddz  z
  ddg
dz  t          j        z
  t          j        gd
dgg                      |t          j        gdz
  gt(          dz
  z  tO          t(          z            z  t          t/          dz
  t5          
                    t/          dz
  t5          
                    z  t5          
          t/           t5          
                    t/          dz
  t5          
                    z  t/          dz
  t5          
                    t/          t5          
                    z  z   z  t/           t5          
                    t/          t5          
                    z  g          z  t          g dg          t          dz
  t          j        dg
d
gdt          j         gg                      |t          j        gt          dd          t          dd          gt          tQ          dt5          
          z            dz  t5          
          z  t;          dt5          
          z            dz  t5          
          z  tA          dt5          
          z            g          t          g dg          t          t          dd          t          j        dgdt          dd          t          j        gdd
z  dgg                      |t          dd          gt          dd          t          dd          gt          t=          t          t(          t6          z  dz            t?          
d          z  dz  t5          t(                    z            t(          t          t(          t6          z  dz            t?          
d          z  dz  t5          t(                    z  dz  z  z  t;          dt5          
          z            t5          
          z  tA          dt5          
          z            g          t          g dg          t          t          dd          t          dd          dgdt          dd          dgd
dgg                      |t          dd          gt          j        t          dd          gt          t5          t(                    t          t6           t(          z  dz            z  tC          dt?          
d          z  t          t6          t(          z  dz            z  t5          t(                    z            z  dt?          
d          z  z  tA          dt5          
          z            t;          dt5          
          z            t5          
          z  g          t          g dg          t          t          dd          t          dd          dgg d d
t          j        gg                      |t          j        z   gdz  dz  z
  dz   gt1                    t1          dz  z
  dz             z  t5          
          dz  ddz  z
  z  z  t          t/          dz
  t5          
                    t/          dz  z
  t5          
                    z  t5          
          t/          t5          
                    z  t/          dz  z
  t5          
                    z  t5          
          t/          dz
  t5          
                    z  t/          dz  z
  dz   t5          
                    z  t/          t5          
                    t/          dz  z
  dz   t5          
                    z  g          z  t          g dg          t          dt          j        t          j        dg
dz  dz
  d
dz  g
dz  ddz  z
  
dz  gdt          j        t          j        dz  gg                      |ddgddt          dd          gt          tS          dt5          
          z            tG          dt5          
          z            z
  tA          dt5          
          z            t5          
          t;          dt5          
          z            z  dtH          g          t          d
z  dddd
z  gg          t          dt          j        dt          dd          dgg d!d
t          j        ddgg d"g d"g                      |ddgdddz   gt          tG          
           tU          d
           z   tH          z   z  
dz  dz  z
  dz   z  z  
  z  z  t1                    tW          
           z
  z  dz
  dz  z  t          
          z  dz  dz  z
  dz   z  
dz  dz  z
  dz   z  z  g          t          dz
  dd
z  dgg          t          ddd
z  dgd ddgdd
dgg d#g                     d$S )%z Create our knowledge base. za b c, z)clsc           
      x    t          | |          }                    t          ||f                     d S NHyper_FunctionappendFormula)	apbqresfuncabr\   formulaezs	       r]   addzadd_formulae.<locals>.addh   s>    b"%%aq!Qi8899999r_   c                 ~    t          | |          }	                    t          |
d f|||                     d S rc   rd   )rh   ri   BCMrk   rl   rm   r\   rn   ro   s         r]   addbzadd_formulae.<locals>.addbl   sD    b"%%a1ay!QBBCCCCCr_       rX   r   )rX   rX   )rw   z3/2   )r   r   r      	         )rX   r   r   )rX   rx   r   )r   rX   rx   r   )r   r   r   r   c                 F    t          |           t          |           z   S rc   r"   r(   rl   ro   r[   s     r]   fpzadd_formulae.<locals>.fp       q!}}wq!}},,r_   c                 F    t          |           t          |           z
  S rc   r   r   s     r]   fmzadd_formulae.<locals>.fm   r   r_   )rX   r   r   r   )r   rX   r   r   i   )   r   r   )r   r   rX   )r   r   rX   r   r   )r   r   r   r   r   )r   r   r   rx   N),r
   r	   r   rA   r   HalfrL   rB   rC   r@   r   rD   rF   rG   rI   rJ   rE   Oner;   r<   r   rH   r    r"   r#   r2   r   r   r&   r-   r0   r   r.   r1   r)   r   r   r3   r(   r'   r,   r/   r%   r$   )rn   rp   ru   mzr   r   rl   rm   r\   r[   ro   s   `     @@@@@r]   add_formulaer   d   sf   ///JAq!Q: : : : : : : : :D D D D D D D D D CBA Cr?A2q))*** 	D!QZ1Q3'	A&& QVQ//13 
4 
4	!Q			1qv:q.!a%(16A:q.!a%*@AQU)QAYA./1 
2 
2	3 3 3 	D	q!!1%	&	&Aq	{(;(;	!QAY!Q(	)	)+ + + 	D!&!qxxl	""A&	'	'	!Q			(2q//1a!e9Q;/!Q8	9	9; ; ; 	D!&!&	AeHH<	""OHROOQ$G$GH	I	I	!Q			(2q//16*Q1q5	!,<=	>	>@ @ @ 	D!QVaZ16*	!Q''/1"qv+q*I*I)IJ	K	K	!Q			!aRRTAX,q.!a%(!&1bdQh<Q3G*GHJ 
K 
KL L L 	D!aR16(	!!Q'')9!Q)?)?@	A	A	!Q			!aR1Q3A;1q5	!45	6	68 8 8 	D!Q!AF(	""A&	'	'!Q)9)9	1qv:A&1q5	!4q!f=	>	>@ @ @
 	D!&!&	AE7	A
1.	/	/	!B$			(2q//2qs1u:.2q//16*, 
- 
-. . .
 	D(2q//16	"QUG	A
1.	/	/	!QrT			(2q//2qs1u:.2q//16*, 
- 
-. . . 	D(2q//1a	 161+	>!$$$mA&6&6:	;	;	(2q//AE61Q3<!Q@A	B	B	!&!QAYq[)Q1q5	" 
 
   	D(2q//1a	 1a&	++]1-=-=qA	B	B	(1a..2qs8+Q!Wb!A#h?@	A	A	!A#q1u+q!$q!QU)}a&@)))L	M	MO O O 	D!qc61q1u:A.AE11E1EEqIJJ	!a%		vA	1~1v&>??A A AD!qse	QVaZQqS)'!af*ac*B*BBQV$$%%&!_5QVaZQqS)'!af*ac*B*BBQV$$%%&!_56 
7 
7 
!Q			!A#qsacAaC!A#I/0	1	13 3 3 
B	BD!q1ug	qb!Jq"---qQx8	9	9	!Q			1"a1a&!	"	"$ $ $
 C"aAF8SVVd2a4jj1"oc!DGG)nn.L%LMMM 	D!x1~~x1~~.	$r((Ad1T!WW9oo-hqa|C"QKK7OPTUWPXPX7X.Y.YY"1T!WW9oohqa|C"QKK7OPTUWPXPX7X.Y.YYZ [2aLL!"#DAJJ,0 r((41::%tAd1ggIx$q!**SQRSUQUVWQW[[@XY]^`YaYa@a7b7b'b()$qay//(9(1T!QZZ<PSTUVXTXYZTZP[P[C[\`ac\d\dCd:e:e(e(f gr"uQw<<  !"  
 
 
			(2q//8Aq>>B !8Aq>>BBBBD 
E 
EF F F 	D!&!x1~~q1u-	AaC!Gqb!$r!t**,S477^^;AaC!GjnnQ.1"55Az"~~a/001AaC!GSVV#% 
& 
& 
			(2q//1a(1qb!*q!Qi@	A	AC C C 	D!Q!Q	AQQJ7	8	8	!A#q!RT"#	$	$	Aq!lllLLLI	J	JL L L CQVJQtAwwY(((DaS	q!q1uai.(Q$q''	)B)BBq!a!A#g,&wq!DGG)'<'<<> 
? 
?	!Q		6Aq6AA<"899; ; ; 	
!Xa^^
A- - - - -- - - - - 	DafaQV$	AaC!GQAaCAx1~~,=!=AaC!GQQ'AaCAx1~~4E)EG 
H 
Hr!t9
1Q3ZZ
  !Q1WaK 0
1 
			QVaZA&Q"Q1q5!# 
$ 
$% % % 	
1Q3!Q
	!B$q& 1 11ADaQVQqS!
DB!""
"a!A#g	.uQqSzz1}	<	1q!$$WQqS1Wa%8%88GAaCOOGAaC!GQ$7$77acAgq))'!A#q//9: ;Agac1oo%gac1oo5AwqsAwqsQw':':: 1q!,,WQqS!__<= >	? 
@ 
@
@ 
			!Xa^^Q*a!A#gq[(2q//15QAaC!Q0a%Aq1u%' 
( 
() ) ) 	D!q16z1Q3	QVaZQVT!WW!=!=q!@@QUGAJQ888!hq!nn,d1gg667Xa^^a'(Xa^^1CT!WW)M)Mq)PPR 
S 
S 
5QV$$a''AFQJ75QV$$$U1qv:%6%66q1q5zA  
 
 
!ac'1a1Q3
AF";aAYG	H	HJ J J 	D!&Aq1u:	QUC1II		QQ((QQ)@)@@a'1"d1gg..wq1ud1gg/F/FF#AE47733GAtAww4G4GGH I!T!WW%%gaa&9&99; 
< 
<
<
 
			!a%#QQVaR" 
# 
#	$ 	$ 	$ 	D!&HQNNHQNN3	QtAwwY!$q'')4$q''	??1+<T!WW+DaQi" 
# 
#				(2q//161-8B??AF/KaQRSTQTVW[Y	Z	Z	\ \ \ 	D(1a..	HQNNHQNN;	T!V !A  !!%"! "!!# #
 "$s2a46{{41::'=a'?R'H1&L!LO Ad1ggItAww&Ad1ggI!
" 
" 
			(2q//HQOOQ78B??Q/AQ') 
* 
*+ + +& 	D(1a..	AFHQNN3	 RU1W &41::c!B$q&kk1$r((:< << >?tAqzz\K Ad1ggIAd1ggItAww&)
* 
* 
			(2q//HQNNA;+++AAF+- 
. 
./ / /" 	D!QZ1Q31Q37Q;/	q%!a!$$	$Q	Q1W'=	=	QQ((1q$q'')B)BBaDGG,,,WQqS1Wd1gg-F-FFaQQ0001q1d1gg1N1NNDGG$$WQqS1Wq[$q''%B%BBD 
E 
E
E
 
			!QVQVQ'A#q1ua1%A#q!ac'1Q3'QVQVRT*, 
- 
-
. 
. 
. 	D!Q!QA'	QtAwwY#aQi..0aQi$q''$qay//"91jJ 
K 
K	!A#q!Q1%&	'	'	!QVQQ3 Q1%  	" 
# 
#	$ $ $( 	D!QQ1Q3K	CGGfQmm+j891adQqSj1n;MNQB1":uQxx*Q*;*;;<a!eaZG3q661a4!A#:>*Aq!taczA~&') 
* 
* 
!A#q"Q$"#	$	$	"Qr!tAQBqAa 
 
	 	 	 	 	r_   c                    	
 t          t          t          d                    \  	
t          d          	
 fd}fd} |z   gg z   gg t          t	          dz
            z  z  t                    z  t                    z  t	          dz
            z   z  z  g          t          ddgg          t          z   dgdz   gg          |           fd}t          d	t                    z            }t          d	t                    z            }t          d	t                    z            t          d	z  z
  }t          d	t                    z            } |gg t          j        z
  gg t          t          t                    t          j        z
  z  z  ||z  ||z  z
  z  t          t                    z  z  ||z  ||z  z   z  t          t                    z  z  g          t          g d
g          t          t          j        z
  ddgt          j        gddgg          |           d S )Nabczrhoc                 f                         t          | |||	
g||||
  
                   d S rc   )rf   MeijerFormula)anrh   bmri   rr   rs   rt   matcherrl   rm   r\   rn   r   ro   s           r]   rp   z!add_meijerg_formulae.<locals>.add  sL    b"b"a!Q3&'Aw8 8 	9 	9 	9 	9 	9r_   c                 4   | j         d         }| j        \  }}d}t          ||z
                                            sd}||}}t          ||z
                                            s	||z
  dk    rd S ||g}|r||g}|||z
  it	          |gg |g           fS )Nr   FT)r   r   r^   simplify
G_Function)rk   r[   yro   swappedlrl   r   s         r]   detect_uppergammaz/add_meijerg_formulae.<locals>.detect_uppergamma  s    GAJw1a!e%%''(( 	GQ!a%!!##$$ 	A	 	4F 	AAQ1q5!:qc2q"#=#===r_   rX   r   rx   c                    | j         d         | j        \  }}}t          ||z
                                            dk    rTt          ||z
                                            dk    rdS t          j        t          j        t          j        f}|||}}}n{t          |z
                                            dk    r*t          j        t          j        t          j        f}|||}}}n)t          j        t          j        t          j        f}|||}}}t          |z
                                            dk    slt          |z
                                            dk    sDt          |z
                                            t          j        k    s|z
  dk    s	|z
  dk    rdS 	it          gg fd|D             g           fS )z-http://functions.wolfram.com/07.34.03.0984.01r   Nc                 4    g | ]}t           j        z
  |z   S rv   )r   r   ).0tr[   s     r]   
<listcomp>z=add_meijerg_formulae.<locals>.detect_3113.<locals>.<listcomp>  s#    +H+H+HqAJN+H+H+Hr_   )r   r   r^   r   r   r   Zeror   )
rk   uvwsigx1x2r   r[   rl   s
           @r]   detect_3113z)add_meijerg_formulae.<locals>.detect_3113  s   GAJ'1a!a%!!##$$) 	$a!e%%''((A- 61616*C1aABBa!e%%''((A- $vqvqv.q!rAvqvqv.q!r21r6##%%&&!+ 	1r6##%%&&!+	1q5""$$%%/	 B
	  "fqj	 F1vz1#r+H+H+H+HC+H+H+H"MMMMr_   rw   )ry   r   r   )listmapr	   rL   r#   r   r$   r'   r   r!   r+   r   r*   r   r   )rn   rp   r   r   sc_S_rs   rl   rm   r\   r   ro   s   `       @@@@@r]   add_meijerg_formulaer     s   c%(())JAq!Q
,,C9 9 9 9 9 9 9 9 9 9> > > > > > CS	2QW~ra!eQV#CFF*:a+;+;;a!eQS\)+ 	, 	,Axq"1s7|,--  N N N N N2 	Ad1ggIA	QtAwwYB	Ad1ggIA	B
1T!WW9ACR!QAF
#RRQZ("R%!A#+6RAqtbd{+RA 	  	  	


|QVR#aAF^aAY?@@    r_   c                       fd}|S )z@ Create a function that simplifies rational functions in ``z``. c                    |                                  \  }}|                                }t          |                              t          |                    \  }}}||                                z  |                                z  S )z6 Efficiently simplify the rational function ``expr``. )as_numer_denomr   rP   cancelas_expr)exprnumerdenomr\   ro   s       r]   simpzmake_simp.<locals>.simp  sn    **,,uua..//UA??5%5==??"U]]__44r_   rv   )ro   r   s   ` r]   	make_simpr     s#    5 5 5 5 5 Kr_   c                  `    t           r&| D ]}t          |d           t                       d S d S )N )end)r   print)argsrl   s     r]   debugr     sF      	 	A! r_   c                        e Zd ZdZ fdZed             Zed             Zed             Z fdZ	d Z
d Zd	 Zd
 Z xZS )re   z( A generalized hypergeometric function. c                    t                                          |           }t          t          t	          t
          |                     |_        t          t          t	          t
          |                     |_        |S rc   )super__new__r   r   r   r   rh   ri   )ra   rh   ri   obj	__class__s       r]   r   zHyper_Function.__new__  sU    ggooc""S__--.S__--.
r_   c                     | j         | j        fS rc   )rh   ri   selfs    r]   r   zHyper_Function.args  s    !!r_   c                 R    t          | j                  t          | j                  fS rc   )lenrh   ri   r   s    r]   sizeszHyper_Function.sizes  s    DGc$'ll++r_   c                 >    t          d | j        D                       S )zt
        Number of upper parameters that are negative integers

        This is a transformation invariant.
        c              3   L   K   | ]}t          |j        o|j                  V   d S rc   )bool
is_integeris_negativer   r[   s     r]   	<genexpr>z'Hyper_Function.gamma.<locals>.<genexpr>  s3      IIA4677IIIIIIr_   )sumrh   r   s    r]   r#   zHyper_Function.gamma  s#     IIIIIIIIr_   c                 b    t                                                      | j        | j        fz   S rc   )r   _hashable_contentrh   ri   r   r   s    r]   r   z Hyper_Function._hashable_content  s.    ww((**dg.  	r_   c                 8    t          | j        | j        |          S rc   )r?   rh   ri   )r   args     r]   __call__zHyper_Function.__call__  s    TWdgs+++r_   c                     t          | j        t                    t          | j        t                    }}d }| j         ||           ||          fS )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          |                                           } t          d | D                       s|                     d            t	          d | D                       } | S )Nc              3   L   K   | ]}t          |d          t                    V   dS )r   N)
isinstancer   r   s     r]   r   z>Hyper_Function.build_invariants.<locals>.tr.<locals>.<genexpr>$  s0      ==z!A$,,======r_   c                 ,    t          | d                   S Nr   r   r[   s    r]   <lambda>z=Hyper_Function.build_invariants.<locals>.tr.<locals>.<lambda>%  s    *:1Q4*@*@ r_   keyc                 :    g | ]\  }}||t          |          fS rv   r   )r   modvaluess      r]   r   z?Hyper_Function.build_invariants.<locals>.tr.<locals>.<listcomp>&  s;       ;3S#f++.   r_   )r   itemsanysorttuple)buckets    r]   trz+Hyper_Function.build_invariants.<locals>.tr"  s~    &,,..))F==f===== B @ @AAA  &     FMr_   )rU   rh   r^   ri   r#   )r   abucketsbbucketsr   s       r]   build_invariantszHyper_Function.build_invariants  sV    F "$'51143G3G(	 	 	 
BBxLL""X,,77r_   c                    | j         |j         k    rdS d | j        | j        |j        |j        fD             \  }}}}d}||f||ffD ]\  }}t          t	          |                                          t	          |                                          z             D ]}	|	|vs0|	|vs,t          ||	                   t          ||	                   k    r  dS t	          ||	                   }
t	          ||	                   }|
                                 |                                 t          |
|          D ]\  }}|t          ||z
            z  }|S )zd Estimate how many steps it takes to reach ``func`` from self.
            Return -1 if impossible. rx   c                 8    g | ]}t          |t                    S rv   rU   r^   r   paramss     r]   r   z-Hyper_Function.difficulty.<locals>.<listcomp>1  s8     4@ 4@ 4@ 594G4G 4@ 4@ 4@r_   r   )
r#   rh   ri   setr   keysr   r   zipabs)r   rk   	oabuckets	obbucketsr   r   diffr   obucketr   l1l2ijs                 r]   
difficultyzHyper_Function.difficulty,  s    :# 	24@ 4@7DGTWdg>4@ 4@ 4@0	9h !)9 5)7LM 
	' 
	'OFG4..gllnn1E1EEFF 	' 	'v% 3g+= vc{++s73</@/@@222&+&&'#,''						BKK ' 'DAqCAJJ&DD'	' r_   c                     | j         D ]&}| j        D ]}||z
  j        r||z
  j        du r  dS '| j         D ]}|dk    r dS | j        D ]}|j        r
|j        r dS dS )a  
        Decide if ``self`` is a suitable origin.

        Explanation
        ===========

        A function is a suitable origin iff:
        * none of the ai equals bj + n, with n a non-negative integer
        * none of the ai is zero
        * none of the bj is a non-positive integer

        Note that this gives meaningful results only when none of the indices
        are symbolic.

        Fr   T)rh   ri   r   r   is_nonpositive)r   rl   rm   s      r]   _is_suitable_originz"Hyper_Function._is_suitable_originC  s       	! 	!AW ! !E% !1q5*=*F ! 555!  	 	AAv uu 	 	A|  0 uutr_   )__name__
__module____qualname____doc__r   propertyr   r   r#   r   r   r   r  r  __classcell__r   s   @r]   re   re     s        22     " " X" , , X, J J XJ    , , ,-8 -8 -8^  .      r_   re   c                   d     e Zd ZdZ fdZed             Z fdZd Zd Z	ed             Z
 xZS )r   z A Meijer G-function. c                    t                                          |           }t          t          t	          t
          |                     |_        t          t          t	          t
          |                     |_        t          t          t	          t
          |                     |_        t          t          t	          t
          |                     |_	        |S rc   )
r   r   r   r   r   r   r   rh   r   ri   )ra   r   rh   r   ri   r   r   s         r]   r   zG_Function.__new__c  s    ggooc""S__--.S__--.S__--.S__--.
r_   c                 6    | j         | j        | j        | j        fS rc   )r   rh   r   ri   r   s    r]   r   zG_Function.argsk  s    $'4733r_   c                 T    t                                                      | j        z   S rc   )r   r   r   r   s    r]   r   zG_Function._hashable_contento  s     ww((**TY66r_   c                 P    t          | j        | j        | j        | j        |          S rc   )rK   r   rh   r   ri   )r   ro   s     r]   r   zG_Function.__call__r  s     tw$'1===r_   c                    d t          d          D             x}\  }}}}t          || j        | j        | j        | j        f          D ]2\  }}|D ]*}|t          |                                       |           +3t          |d          D ]F\  }}	|                                D ],\  }
}|d         |	                    fd|	           |||
<   -Gt          d |D                       S )a  
        Compute buckets for the fours sets of parameters.

        Explanation
        ===========

        We guarantee that any two equal Mod objects returned are actually the
        same, and that the buckets are sorted by real part (an and bq
        descendending, bm and ap ascending).

        Examples
        ========

        >>> 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]})

        c                 6    g | ]}t          t                    S rv   )r   r   )r   r   s     r]   r   z.G_Function.compute_buckets.<locals>.<listcomp>  s     %J%J%JAk$&7&7%J%J%Jr_   r{   )TFFTr   c                     | z
  S rc   rv   )r[   x0s    r]   r   z,G_Function.compute_buckets.<locals>.<lambda>  s    R r_   )r   reversec                 ,    g | ]}t          |          S rv   )dictr   r   s     r]   r   z.G_Function.compute_buckets.<locals>.<listcomp>  s    ---!d1gg---r_   )ranger   r   rh   r   ri   r^   rf   r   r   r   )r   dictspanpappbmpbqdiclisr[   flipmr   r  s               @r]   compute_bucketszG_Function.compute_bucketsu  s#   0 &K%Jq%J%J%JJ"S#sEDGTWdgtw#GHH 	( 	(HC ( (E!HH$$Q''''( U$>?? 	 	ICIIKK  51X

////
>>>A
 --u---...r_   c                     t          | j                  t          | j                  t          | j                  t          | j                  fS rc   )r   r   rh   r   ri   r   s    r]   	signaturezG_Function.signature  s1    DGc$'llCLL#dg,,GGr_   )r  r  r  r  r   r	  r   r   r   r#  r%  r
  r  s   @r]   r   r   `  s               4 4 X47 7 7 7 7> > >#/ #/ #/J H H XH H H H Hr_   r   r[   c                   <    e Zd ZdZd ZddZed             Zd ZdS )rg   a-  
    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])

    c                 0   d | j         j        D             }d | j         j        D             }t          t	          | z  | j        t	          | z  z
  }t          |t                    } |j                    dz
  }|g}t          |          D ]=}|	                    | j        |d         
                    | j                  z             >t          |          | _        t          dgdg|z  z   g          | _        t          |          }	|	                    dt!          |d                    }	 |j                    dd         }
|
                                 |	                    |t          |
g            |j                    d         z            | _        dS )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.
        c                 "    g | ]}t           |z   S rv   _xr   rl   s     r]   r   z*Formula._compute_basis.<locals>.<listcomp>  s    111qBF111r_   c                 (    g | ]}t           |z   d z
  S rX   r)  r   rm   s     r]   r   z*Formula._compute_basis.<locals>.<listcomp>  s     5551BFQJ555r_   rX   rx   r   N)rk   rh   ri   r*  r   ro   rQ   degreer  rf   r   rL   rr   rs   rM   
col_insertrN   
all_coeffsr  
row_insertrt   )r   closed_formafactorsbfactorsr   rP   nrm   _r"  r   s              r]   _compute_basiszFormula._compute_basis  se    21DIL11155	555#x. 46#x.#88D"~~DKMMAMq 	0 	0AHHTVAbEJJtv...////!s1u&&FFLLE!QKK((DOabb!			a&!++odo.?.?.B!BCCr_   Nc                     t          |          }t          |          }fdt          |          D             }|| _        || _        || _        || _        || _        | _        ||                     |           d S d S )Nc                 >    g | ]}                     |          |S rv   has)r   r[   rk   s     r]   r   z$Formula.__init__.<locals>.<listcomp>  s(    >>>$((1++>1>>>r_   )r   ro   r
   rr   rs   rt   rk   r8  )r   rk   ro   rj   r
   rr   rs   rt   s    `      r]   __init__zFormula.__init__  s    AJJcll>>>>gg..>>>	
  	%$$$$$	% 	%r_   c                 j    t          d t          | j        | j                  t          j                  S )Nc                 *    | |d         |d         z  z   S Nr   rX   rv   r   r"  s     r]   r   z%Formula.closed_form.<locals>.<lambda>      !AaD1I+ r_   r   r   rs   rr   r   r   r   s    r]   r3  zFormula.closed_form  (    --s4646/B/BAFKKKr_   c                     ddl m} |j        }|j        }t	          |          t	           j        j                  k    s*t	          |          t	           j        j                  k    rt          d          g } j        D ]e j        j        j        v r|	                    |           + j        j        j        v r|	                    |           Tt          d           fdt          | D             }d ||fD             \  }}d ||fD             \  }	}
d  j        D             }g }t                      }|D ]:fd	 j        j         j        j        fD             \  }}||f||ffD ]O\  }}t          t          |                                          t          |                                          z             D ]}||vs0||vs,t	          ||                   t	          ||                   k    r nt!           j        |          D ]\  }         j        rfd
||         D             }                                }|xx         |z  cc<   |D ]\}||         D ]Q} ||                    |          |z
  |          \  }|j        rt          d          |	                    |           R]Qg }t!           j        |          D ]w\  }         t)          t+          |                    }t-          t/          |                    }|	                    fdt1          ||dz             D                        x|                     fdt          | D                        <|S )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 c           
      n    g | ]1}t          t          t          j        |                              2S rv   r  r   r   r
   )r   r   r   s     r]   r   z/Formula.find_instantiations.<locals>.<listcomp>   sE     7 7 7 $s4<8899:: 7 7 7r_   c                 8    g | ]}t          |t                    S rv   r   r   s     r]   r   z/Formula.find_instantiations.<locals>.<listcomp>  s"    IIIfd6511IIIr_   c                 J    g | ] }d  |                                 D             !S )c                 4    i | ]\  }}|t          |          S rv   r   )r   rl   valss      r]   
<dictcomp>z:Formula.find_instantiations.<locals>.<listcomp>.<dictcomp>  s$    DDD'!TCIIDDDr_   )r   )r   r   s     r]   r   z/Formula.find_instantiations.<locals>.<listcomp>  s?     4 4 4 EDV\\^^DDD 4 4 4r_   c                     g | ]}d gS r   rv   )r   r7  s     r]   r   z/Formula.find_instantiations.<locals>.<listcomp>  s    5551A3555r_   c                 6    g | ]}t          |fd           S )c                 H    t          |                                         S rc   )r^   xreplace)r[   repls    r]   r   z8Formula.find_instantiations.<locals>.<listcomp>.<lambda>	  s    U1::d;K;K5L5L r_   rT   )r   r   rS  s     r]   r   z/Formula.find_instantiations.<locals>.<listcomp>	  s=     < < < #6+L+L+L+LMM < < <r_   c                 >    g | ]}|                               |S rv   r;  )r   r   rl   s     r]   r   z/Formula.find_instantiations.<locals>.<listcomp>  s(     N N N$$((1++ N N N Nr_   zValue should not be truec                     g | ]}|z   S rv   rv   )r   r6  a0s     r]   r   z/Formula.find_instantiations.<locals>.<listcomp>"  s    "I"I"Ia26"I"I"Ir_   rX   c           	   3   v   K   | ]3}t          t          t          j        |                              V  4d S rc   rH  )r   r   r   s     r]   r   z.Formula.find_instantiations.<locals>.<genexpr>#  s?      YY1d4DL!(<(<#=#=>>YYYYYYr_   )sympy.solversrF  rh   ri   r   rk   	TypeErrorr
   r   rf   
ValueErrorr   r	   r   r   r   r   free_symbolscopyrR  r4   minr5   maxr  extend)r   rk   rF  rh   ri   symbol_values	base_replr   r   a_invb_invcritical_valuesresult_nsymb_asymb_br   r   r   rL  exprsrepl0r   targetn0r   min_max_rl   rV  rS  s   `                           @@@r]   find_instantiationszFormula.find_instantiations  s5    	('''''WWr77c$),''' 	M3r77c$),6G6G+G 	MKLLL 	> 	>ADIL%% >$$R((((dil'' >$$R(((( j9:"= > > >7 7 7 7%}57 7 7	IIRIII(4 4'24 4 4u55555WW 	Z 	ZD< < < <#y|TY\:< < <NFF%-v$668J#K Z ZtFKKMM22T',,..5I5IIJJ 0 0C6) s'/A "6#;//3ws|3D3DD#&t|_#E#E 0 047/ %$ N N N N'#, N N N $		aB$) 0 0D*0+ 0 0&+eDMM%,@,@6,I2&N&N#%? !Q*45O*P*P$P $B	000 "4<AA K KGAtaB T++D"3t99--DMM"I"I"I"I5tax3H3H"I"I"IJJJJYYYYQWHXYYYYYYYr_   )NNN)	r  r  r  r  r8  r=  r	  r3  ro  rv   r_   r]   rg   rg     sq         .D D D4% % % %$ L L XL: : : : :r_   rg   c                       e Zd ZdZd Zd ZdS )FormulaCollectionz- A collection of formulae to use as origins. c                    i | _         i | _        g | _        t          | j                   | j        D ]}|j        j        }t          |j                  dk    r/| j                             |g           	                    |           U|j        
                                }|| j                            |i           |<   dS )z7 Doing this globally at module init time is a pain ... r   N)symbolic_formulaeconcrete_formulaern   r   rk   r   r   r
   
setdefaultrf   r   )r   fr   invs       r]   r=  zFormulaCollection.__init__,  s    !#!#T]###
  	F 	FAFLE19~~! F&11%<<CCAFFFFf--//DE&11%<<SAA	F 	Fr_   c                 ,   |                                 }|j        }|| j        v r"|| j        |         v r| j        |         |         S || j        vrdS g }| j        |         D ]}|                    |          }|D ]f}|j                            |          }|                                s1|                    |          }	|	dk    rM|	                    |	|||f           g|
                    d            |D ]\  }
}}}t          ||j        dg |j                            |          |j                            |          |j                            |                    }t#          d |j        |j        |j        fD                       s|c S dS )a{  
        Given the suitable target ``func``, try to find an origin in our
        knowledge base.

        Examples
        ========

        >>> 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)
        Nrx   c                     | d         S r   rv   r   s    r]   r   z1FormulaCollection.lookup_origin.<locals>.<lambda>k  s
    AaD r_   r   c              3   z   K   | ]6}|                     t          j        t          t           t                    V  7d S rc   )r<  r   NaNr   r   )r   es     r]   r   z2FormulaCollection.lookup_origin.<locals>.<genexpr>o  s8      NNaquuQUBS11NNNNNNr_   )r   r   rt  rs  ro  rk   rR  r  r  rf   r   rg   ro   rr   subsrs   rt   r   )r   rk   rw  r   possiblerv  replsrS  func2r   r7  f2s               r]   lookup_originzFormulaCollection.lookup_origin?  s   * ##%%
D** 	6t-e44	6)%055 .. 	4'. 		8 		8A))$//E 8 8--0022 ''--2: tQ 677778 	..)))!) 	 	AtQT2qsxx~~CHHTNNACHHTNN4 4BNNBD"$;MNNNNN 			 tr_   Nr  r  r  r  r=  r  rv   r_   r]   rq  rq  )  s;        77F F F&3 3 3 3 3r_   rq  c                   4    e Zd ZdZd Zed             Zd ZdS )r   z
    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                     d ||||fD             \  }}}}t          ||||          | _        || _        || _        |
| _        || _        || _        |	| _        d S )Nc           
      `    g | ]+}t          t          t          t          |                     ,S rv   )r   r   r   r   r  s     r]   r   z*MeijerFormula.__init__.<locals>.<listcomp>  s-    QQQ1%c&!nn!5!56QQQr_   )r   rk   ro   r
   _matcherrr   rs   rt   )r   r   rh   r   ri   ro   r
   rr   rs   rt   r   s              r]   r=  zMeijerFormula.__init__  si    QQRR@PQQQBBr2r2..	r_   c                 j    t          d t          | j        | j                  t          j                  S )Nc                 *    | |d         |d         z  z   S r@  rv   rA  s     r]   r   z+MeijerFormula.closed_form.<locals>.<lambda>  rB  r_   rC  r   s    r]   r3  zMeijerFormula.closed_form  rD  r_   c                 ^   |j         | j        j         k    rdS |                     |          }|~|\  }}t          |j        |j        |j        |j        | j        g | j	        
                    |          | j        
                    |          | j        
                    |          d
  
        S dS )z
        Try to instantiate the current formula to (almost) match func.
        This uses the _matcher passed on init.
        N)r%  rk   r  r   r   rh   r   ri   ro   rr   r}  rs   rt   )r   rk   rj   r}  newfuncs        r]   try_instantiatezMeijerFormula.try_instantiate  s    
 >TY00 	4mmD!! 	:MD' WZWZ!%!%T!2!2DFKK4E4E!%T!2!2D: : :	: 	:r_   N)r  r  r  r  r=  r	  r3  r  rv   r_   r]   r   r   u  sZ            L L XL: : : : :r_   r   c                       e Zd ZdZd Zd ZdS )MeijerFormulaCollectionz=
    This class holds a collection of meijer g formulae.
    c                     g }t          |           t          t                    | _        |D ],}| j        |j        j                                     |           -t          | j                  | _        d S rc   )r   r   r   rn   rk   r%  rf   r  )r   rn   formulas      r]   r=  z MeijerFormulaCollection.__init__  sm    X&&&#D)) 	B 	BGM',0188AAAAT]++r_   c                     |j         | j        vrdS | j        |j                  D ]}|                    |          }||c S dS )z* Try to find a formula that matches func. N)r%  rn   r  )r   rk   r  rj   s       r]   r  z%MeijerFormulaCollection.lookup_origin  sc    >. 	4}T^4 	 	G))$//C 


	 	r_   Nr  rv   r_   r]   r  r    s<         , , ,    r_   r  c                       e Zd ZdZd ZdS )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                 F   | j                                         }|                                 |g}|dd         D ]&}|                     ||d                              '|d         |d         z  }t	          |dd         |dd                   D ]\  }}|||z  z  }|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
        rX   Nrx   r   )_polyr1  r  rf   r   )r   r   opcoeffsdiffsr\   rds           r]   applyzOperator.apply  s     &&(( 	( 	(ALLE"I''''1IeAhqrr
E!""I.. 	 	DAq1HAAr_   N)r  r  r  r  r  rv   r_   r]   r  r    s-         4    r_   r  c                       e Zd ZdZd ZdS )MultOperatorz! Simply multiply by a "constant" c                 :    t          |t                    | _        d S rc   )rQ   r*  r  )r   ps     r]   r=  zMultOperator.__init__  s    !R[[


r_   N)r  r  r  r  r=  rv   r_   r]   r  r    s)        ++! ! ! ! !r_   r  c                       e Zd ZdZd Zd ZdS )ShiftAz Increment an upper index. c                     t          |          }|dk    rt          d          t          t          |z  dz   t                    | _        d S )Nr   z"Cannot increment zero upper index.rX   r   rZ  rQ   r*  r  )r   ais     r]   r=  zShiftA.__init__  sF    R[[7 	CABBB"R%!)R((


r_   c                 L    dd| j                                         d         z  z  S )Nz<Increment upper %s.>rX   r   r  r1  r   s    r]   __str__zShiftA.__str__  s%    &!DJ,A,A,C,CA,F*FGGr_   Nr  r  r  r  r=  r  rv   r_   r]   r  r    s=        %%) ) )H H H H Hr_   r  c                       e Zd ZdZd Zd ZdS )ShiftBz Decrement a lower index. c                     t          |          }|dk    rt          d          t          t          |dz
  z  dz   t                    | _        d S )NrX   z"Cannot decrement unit lower index.r  r   bis     r]   r=  zShiftB.__init__  sJ    R[[7 	CABBB"b1f+/2..


r_   c                 R    dd| j                                         d         z  dz   z  S )Nz<Decrement lower %s.>rX   r   r  r   s    r]   r  zShiftB.__str__  s*    &!DJ,A,A,C,CA,F*F*JKKr_   Nr  rv   r_   r]   r  r    s=        $$/ / /L L L L Lr_   r  c                       e Zd ZdZd Zd ZdS )UnShiftAz Decrement an upper index. c                    t          t          t          |||g                    \  }}}|| _        || _        || _        t          |          }t          |          }|                    |          dz
  }|dk    rt          d          t          ||z  t                    }|D ]"}|t          t          |z   t                    z  }#t          d          }t          ||z  |z
  |          x}	}
|D ] }|	|
|dz
                      |          z   z  }	!|	                    d           }|dk    rt          d          t          t          |	                                dd         |                                                              |t          |z  dz             t                    }	t          |	|z
  |z  t                    | _        dS ) Note: i counts from zero! rX   r   z"Cannot decrement unit upper index.Az0Cannot decrement upper index: cancels with lowerNrx   r   r   r   _ap_bq_ipoprZ  rQ   r*  r	   as_polynthr1  r   r}  r  )r   rh   ri   r   ro   r  r"  rl   r  r6  Drm   b0s                r]   r=  zUnShiftA.__init__  s   Wr2qk2233	B"XX"XXVVAYY]7 	CABBB2rNN 	" 	"Ab1fb!!!AA#JJRTBY"""A 	( 	(Aa!e__Q''''AAeeAhhY7 	3 2 3 3 3 allnnSbS)1--5577<<Q2	JJBOO1q5"*b))


r_   c                 8    d| j         d| j        d| j        dS )Nz<Decrement upper index # of , .>r  r  r  r   s    r]   r  zUnShiftA.__str__/  *     ;?7778<$(((L 	Lr_   Nr  rv   r_   r]   r  r    s>        %%* * *BL L L L Lr_   r  c                       e Zd ZdZd Zd ZdS )UnShiftBz Increment a lower index. c                    t          t          t          |||g                    \  }}}|| _        || _        || _        t          |          }t          |          }|                    |          dz   }|dk    rt          d          t          t          |dz
  z  t                    }|D ]%}|t          t          |z   dz
  t                    z  }&t          d          }t          |dz
  |z  |z
  dz   |          }	t          ||          }
|D ]}|
|	|                    |          z   z  }
|
                    d          }|dk    rt          d          t          t          |
                                dd         |                                                              |t          |dz
  z  dz             t                    }
t          ||
z
  |z  t                    | _        dS )r  rX   r   z Cannot increment -1 lower index.rr   z*Cannot increment index: cancels with upperNrx   r  )r   rh   ri   r   ro   r  r"  rm   rr   r  r6  rl   r  s                r]   r=  zUnShiftB.__init__7  s   Wr2qk2233	B"XX"XXVVAYY]7 	A?@@@R!Vb!! 	& 	&Ab1fqj"%%%AA#JJ"q&!b1$a((AJJ 	$ 	$A!aiill"#AAUU1XX7 	KIJJJallnnSbS)1--5577<<r26{Q   !#% % 1q5"*b))


r_   c                 8    d| j         d| j        d| j        dS )Nz<Increment lower index #r  r  r  r  r   s    r]   r  zUnShiftB.__str__Y  r  r_   Nr  rv   r_   r]   r  r  4  s>        $$ *  *  *DL L L L Lr_   r  c                       e Zd ZdZd Zd ZdS )MeijerShiftAz Increment an upper b index. c                 h    t          |          }t          |t          z
  t                    | _        d S rc   r   rQ   r*  r  r  s     r]   r=  zMeijerShiftA.__init__a  s&    R[["r'2&&


r_   c                 F    d| j                                         d         z  S )Nz<Increment upper b=%s.>rX   r  r   s    r]   r  zMeijerShiftA.__str__e  s     (DJ,A,A,C,CA,FGGr_   Nr  rv   r_   r]   r  r  ^  s=        ''' ' 'H H H H Hr_   r  c                       e Zd ZdZd Zd ZdS )MeijerShiftBz Decrement an upper a index. c                 n    t          |          }t          d|z
  t          z   t                    | _        d S rW   r  r  s     r]   r=  zMeijerShiftB.__init__l  s*    R[[!b&2+r**


r_   c                 L    dd| j                                         d         z
  z  S )Nz<Decrement upper a=%s.>rX   r  r   s    r]   r  zMeijerShiftB.__str__p  s%    (A
0E0E0G0G0J,JKKr_   Nr  rv   r_   r]   r  r  i  s=        ''+ + +L L L L Lr_   r  c                       e Zd ZdZd Zd ZdS )MeijerShiftCz Increment a lower b index. c                 j    t          |          }t          | t          z   t                    | _        d S rc   r  r  s     r]   r=  zMeijerShiftC.__init__w  s(    R[[2#(B''


r_   c                 H    d| j                                         d          z  S )Nz<Increment lower b=%s.>rX   r  r   s    r]   r  zMeijerShiftC.__str__{  s#    (TZ-B-B-D-DQ-G,GHHr_   Nr  rv   r_   r]   r  r  t  s=        &&( ( (I I I I Ir_   r  c                       e Zd ZdZd Zd ZdS )MeijerShiftDz Decrement a lower a index. c                 n    t          |          }t          |dz
  t          z
  t                    | _        d S rW   r  r  s     r]   r=  zMeijerShiftD.__init__  s*    R[["q&2+r**


r_   c                 L    d| j                                         d         dz   z  S )Nz<Decrement lower a=%s.>rX   r  r   s    r]   r  zMeijerShiftD.__str__  s%    (DJ,A,A,C,CA,F,JKKr_   Nr  rv   r_   r]   r  r    s=        &&+ + +L L L L Lr_   r  c                       e Zd ZdZd Zd ZdS )MeijerUnShiftAz Decrement an upper b index. c           
          t          t          t          |||||g                    \  }}}}}|| _        || _        || _        || _        || _        t          |          }t          |          }t          |          }t          |          }|                    |          dz
  }t          dt                    t          d |D                       z  t          d |D                       z  }t          d          }	t          ||	z
  |	          t          ||	          t          fd|D                       z  t          fd|D                       z  }
|
                    d          }|dk    rt          d          t          t          |
                                d	d
         |	                                                              |	|t          z
            t                    }
t          ||
z
  |z  t                    | _        d	S )r  rX   c              3   P   K   | ]!}t          |t          z
  t                    V  "d S rc   rQ   r*  r.  s     r]   r   z*MeijerUnShiftA.__init__.<locals>.<genexpr>  s0      <<AtAFB//<<<<<<r_   c              3   P   K   | ]!}t          t          |z
  t                    V  "d S rc   r  r.  s     r]   r   z*MeijerUnShiftA.__init__.<locals>.<genexpr>  s2      CaCaYZDaQSDTDTCaCaCaCaCaCar_   r  c              3   (   K   | ]}d z   |z
  V  dS rX   Nrv   r   rl   r  s     r]   r   z*MeijerUnShiftA.__init__.<locals>.<genexpr>  s+      66aq1uqy666666r_   c              3   *   K   | ]} |z   d z
  V  dS r  rv   r  s     r]   r   z*MeijerUnShiftA.__init__.<locals>.<genexpr>  s-      =W=WqrAvz=W=W=W=W=W=Wr_   r   z(Cannot decrement upper b index (cancels)Nrx   )r   r   r   _anr  _bmr  r  r  rQ   r*  r   r	   r  rZ  r1  r   r}  r  )r   r   rh   r   ri   r   ro   r  r"  r  r6  r  r  s               @r]   r=  zMeijerUnShiftA.__init__  s    Wr2r2q.A!B!BCCBB"XX"XX"XX"XXVVAYY]BKK$<<<<<<<<tCaCa^`CaCaCa?a?aa#JJaOOAJJ66662666666=W=W=W=WTV=W=W=W9W9WWUU1XX7 	IGHHHallnnSbS)1--5577<<QRHH"MM1q5"*b))


r_   c                 X    d| j         d| j        d| j        d| j        d| j        dS )Nz<Decrement upper b index #r  r  r  r  r  r  r  r  r   s    r]   r  zMeijerUnShiftA.__str__  :     EIWWW&*hhh$(((DHHHN 	Nr_   Nr  rv   r_   r]   r  r    s=        ''* * *<N N N N Nr_   r  c                       e Zd ZdZd Zd ZdS )MeijerUnShiftBz Increment an upper a index. c           
      (   t          t          t          |||||g                    \  }}}}}|| _        || _        || _        || _        || _        t          |          }t          |          }t          |          }t          |          }|                    |          dz   }t          |t                    }|D ]%}	|t          d|	z
  t          z   t                    z  }&|D ]%}	|t          |	dz
  t          z
  t                    z  }&t          d          }
t          |
|z   dz
  |
          }t          d|
          }|D ]}|| |z   z  }|D ]
}|||z
  z  }|                    d          }|dk    rt          d          t          t          |                                dd         |
                                                              |
d|z
  t          z             t                    }t          ||z
  |z  t                    | _        dS )r  rX   rr   r   z(Cannot increment upper a index (cancels)Nrx   r   r   r   r  r  r  r  r  r  rQ   r*  r	   r  rZ  r1  r   r}  r  r   r   rh   r   ri   r   ro   r  r"  rl   rr   r  r6  rm   r  s                  r]   r=  zMeijerUnShiftB.__init__  s    Wr2r2q.A!B!BCCBB"XX"XX"XX"XXVVAYY]BKK 	& 	&Aa!ebj"%%%AA 	& 	&Aa!ebj"%%%AA#JJR!QAJJ 	 	A1"q&MAA 	 	A!a%LAAUU1XX7 	IGHHHallnnSbS)1--5577<<q2v{ ! ! 1q5"*b))


r_   c                 X    d| j         d| j        d| j        d| j        d| j        dS )Nz<Increment upper a index #r  r  r  r  r   s    r]   r  zMeijerUnShiftB.__str__  r  r_   Nr  rv   r_   r]   r  r    s>        ''%* %* %*NN N N N Nr_   r  c                       e Zd ZdZd Zd ZdS )MeijerUnShiftCz Decrement a lower b index. c           
         t          t          t          |||||g                    \  }}}}}|| _        || _        || _        || _        || _        t          |          }t          |          }t          |          }t          |          }|                    |          dz
  }t          dt                    }|D ]"}	|t          |	t          z
  t                    z  }#|D ]"}	|t          t          |	z
  t                    z  }#t          d          }
t          ||
z   |
          }t          ||
          }|D ]}||dz   |z
  z  }|D ]}|| |z   dz
  z  }|                    d          }|dk    rt          d          t          t          |                                dd         |
                                                              |
t          |z
            t                    }t          ||z
  |z  t                    | _        dS )r  rX   rs   r   z(Cannot decrement lower b index (cancels)Nrx   r  )r   r   rh   r   ri   r   ro   r  r"  rm   rs   r  r6  rl   r  s                  r]   r=  zMeijerUnShiftC.__init__  s    Wr2r2q.A!B!BCCBB"XX"XX"XX"XXVVAYY]BKK 	" 	"Aa"fb!!!AA 	" 	"Ab1fb!!!AA#JJaOOAJJ 	 	A!a%!)AA 	 	A1"q&1*AAUU1XX7 	IGHHHallnnSbS)1--5577<<QRHH"MM1q5"*b))


r_   c                 X    d| j         d| j        d| j        d| j        d| j        dS )Nz<Decrement lower b index #r  r  r  r  r   s    r]   r  zMeijerUnShiftC.__str__  r  r_   Nr  rv   r_   r]   r  r    s>        &&$* $* $*LN N N N Nr_   r  c                       e Zd ZdZd Zd ZdS )MeijerUnShiftDz Increment a lower a index. c           
      (   t          t          t          |||||g                    \  }}}}}|| _        || _        || _        || _        || _        t          |          }t          |          }t          |          }t          |          }|                    |          dz   }t          |t                    }|D ]%}	|t          d|	z
  t          z   t                    z  }&|D ]%}	|t          |	dz
  t          z
  t                    z  }&t          d          }
t          |dz
  |
z
  |
          }t          d|
          }|D ]}|| |z   z  }|D ]
}|||z
  z  }|                    d          }|dk    rt          d          t          t          |                                dd         |
                                                              |
|dz
  t          z
            t                    }t          ||z
  |z  t                    | _        dS )r  rX   rr   r   z(Cannot increment lower a index (cancels)Nrx   r  r  s                  r]   r=  zMeijerUnShiftD.__init__  s    Wr2r2q.A!B!BCCBB"XX"XX"XX"XXVVAYY]BKK 	& 	&Aa!ebj"%%%AA 	& 	&Aa!ebj"%%%AA#JJa!QAJJ 	 	A1"q&MAA 	 	A!a%LAAUU1XX7 	IGHHHallnnSbS)1--5577<<rAv{ ! ! 1q5"*b))


r_   c                 X    d| j         d| j        d| j        d| j        d| j        dS )Nz<Increment lower a index #r  r  r  r  r   s    r]   r  zMeijerUnShiftD.__str__>  r  r_   Nr  rv   r_   r]   r  r    s>        &&%* %* %*NN N N N Nr_   r  c                   `    e Zd ZdZd Zed             Zed             Zed             Zd Z	dS )ReduceOrderz8 Reduce Order by cancelling an upper and a lower index. c                 v   t          |          }t          |          }||z
  }|j        r|dk     rdS |j        r	|j        rdS t                              |           }t          j        }t          |          D ]}|t          |z   |z   ||z   z  z  }t          |t                    |_        ||_        ||_        |S )z< For convenience if reduction is not possible, return None. r   N)r   
is_Integerr   r  r  r   r   r   r  r*  rQ   r  _a_b)ra   r  bjr6  r   r  ks          r]   r   zReduceOrder.__new__F  s    R[[R[[G| 	q1u 	4= 	R. 	4$$Eq 	( 	(A"r'A+Q''AA!R[[
r_   c                    t          |          }t          |          }||z
  }|j        s|j        sdS t                              |           }t
          j        }t          |          D ]}||t          z  |z   |z   z  }t          |t                    |_
        |dk    r||_        ||_        n4t          d|dz
  d          |_        t          d|dz
  d          |_        |S )zN Cancel b + sign*s and a + sign*s
            This is for meijer G functions. Nrx   rX   F)evaluate)r   r   r  r  r   r   r   r  r*  rQ   r  r  r  r   )ra   rm   rl   signr6  r   r  r  s           r]   _meijerzReduceOrder._meijer\  s     AJJAJJE= 	 	4$$Eq 	# 	#A$r'A+/"AA!R[[
2: 	4DGDGG!QUU333DG!QUU333DGr_   c                 0    |                      ||d          S )Nrx   r   )ra   rm   rl   s      r]   meijer_minuszReduceOrder.meijer_minusv  s    {{1a$$$r_   c                 <    |                      d|z
  d|z
  d          S rW   r  )ra   rl   rm   s      r]   meijer_pluszReduceOrder.meijer_plusz  s     {{1q5!a%+++r_   c                 (    d| j         d| j        dS )Nz"<Reduce order by cancelling upper z with lower r  )r  r  r   s    r]   r  zReduceOrder.__str__~  s     WWWdggg 	r_   N)
r  r  r  r  r   classmethodr   r  r  r  rv   r_   r]   r  r  C  s        BB  ,   [2 % % [% , , [,    r_   r  c                    t          |           } t          |          }|                     |           |                    |           g }g }| D ]{}d}t          t          |                    D ]-} ||||                   }||                    |            n.||                    |           f|                    |           ||||fS )z? Order reduction algorithm used in Hypergeometric and Meijer G r   N)r   r   r  r   r  rf   )	rh   ri   genr   nap	operatorsrl   r  r   s	            r]   _reduce_orderr    s    	bB	bBGGGGGG
CI 
! 
!s2ww 	 	AQ1B q			  	!JJqMMMMR    Ir_   c                     t          | j        | j        t          t                    \  }}}t          t          | t          |           |fS )a  
    Given the hypergeometric function ``func``, find a sequence of operators to
    reduces order as much as possible.

    Explanation
    ===========

    Return (newfunc, [operators]), where applying the operators to the
    hypergeometric function newfunc yields func.

    Examples
    ========

    >>> 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 by cancelling upper 1 with lower 1.>])
    >>> reduce_order(Hyper_Function((2, 4), (3, 3)))
    (Hyper_Function((2,), (3,)), [<Reduce order by cancelling
    upper 4 with lower 3.>])
    )r  rh   ri   r  r   re   r   )rk   r
  nbqr  s       r]   reduce_orderr    s@    . (+GWXXCi%+uc{33Y>>r_   c                     t          | j        | j        t          j        d           \  }}}t          | j        | j        t          j        t                    \  }}}t          ||||          ||z   fS )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((), (), (), ())
    c                 "    t          |            S rc   r   r   s    r]   r   z%reduce_order_meijer.<locals>.<lambda>  s    -=qb-A-A r_   )
r  r   ri   r  r  r   rh   r  r   r   )rk   r   r  ops1nbmr
  ops2s          r]   reduce_order_meijerr    sr    , #47DG[5L#A#AC CNCd"47DG[5M#35 5NCd c3S))4$;66r_   c                       fd}|S )z? Create a derivative operator, to be passed to Operator.apply. c                     |                                z  | z  z   }|                    t                              }|S rc   )r   	applyfuncr   )rs   r  rt   ro   s     r]   doitz&make_derivative_operator.<locals>.doit  s;    affQiiK!A#KK	!%%r_   rv   )rt   ro   r  s   `` r]   make_derivative_operatorr    s)          Kr_   c                 Z    | }t          |          D ]}|                    ||          }|S )zk
    Apply the list of operators ``ops`` to object ``obj``, substituting
    ``op`` for the generator.
    )reversedr  )r   opsr  rj   os        r]   apply_operatorsr    s8    
 Cc]]  ggc2Jr_   c           	      0   d | j         | j        |j         |j        fD             \  }}}}t          t          |                                                    t          t          |                                                    k    s^t          t          |                                                    t          t          |                                                    k    rt          | d|          g }d fd}fd}	t          t          |                                          t          |                                          z   t                    D ]}
d}d}d}d}|
|v r||
         }||
         }|
|v r||
         }||
         }t          |          t          |          k    s t          |          t          |          k    rt          | d|          d ||||fD             \  }}}}d	 } |||
          } |||
          }t          |          d
k    r| |	g ||||          z  }nt          |          d
k    r| ||g |||          z  }n|d         }|d         }|d
         |z
  d
k    s|d
         |z
  d
k    rt          d          ||z
  d
k    r%| ||||||          z  }| |	|||||          z  }n$| |	|||||          z  }| ||||||          z  }|||
<   |||
<   |                                 |S )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)
    [<Increment upper 1.>]
    >>> devise_plan(Hyper_Function((), (2,)), Hyper_Function((), (1,)), z)
    [<Increment lower index #0 of [], [1].>]

    Several buckets:

    >>> from sympy import S
    >>> devise_plan(Hyper_Function((1, S.Half), ()),
    ...             Hyper_Function((2, S('3/2')), ()), z) #doctest: +NORMALIZE_WHITESPACE
    [<Decrement upper index #0 of [3/2, 1], [].>,
    <Decrement upper index #0 of [2, 3/2], [].>]

    A slightly more complicated plan:

    >>> devise_plan(Hyper_Function((1, 3), ()), Hyper_Function((2, 2), ()), z)
    [<Increment upper 2.>, <Decrement upper index #0 of [2, 2], [].>]

    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)
    [<Decrement lower 3.>, <Decrement lower 4.>,
    <Decrement upper index #1 of [-1, 2], [4].>,
    <Decrement upper index #1 of [-1, 3], [4].>, <Increment upper -2.>]
    c                 8    g | ]}t          |t                    S rv   r   r   s     r]   r   zdevise_plan.<locals>.<listcomp>  s8     0D 0D 0D 15VU0C0C 0D 0D 0Dr_   z not reachable from c                    g }t          t          |                     D ]d}||         | |         z
  dk    r|}d}n|}d}||         | |         k    r2| || |          gz  }| |xx         |z  cc<   ||         | |         k    2e|S )Nr   rX   rx   )r  r   )frotoincdecr  r   shchs           r]   	do_shiftszdevise_plan.<locals>.do_shifts"  s    s3xx 
	 
	A!us1v~! Q%3q6/ 3

|#A" Q%3q6/  
r_   c           	      4     | |d fd          S )z( Shift us from (nal, nbk) to (al, nbk). c                 ,    t          | |                   S rc   )r  r  r   s     r]   r   z2devise_plan.<locals>.do_shifts_a.<locals>.<lambda>4  s    vad|| r_   c                 4    t          | z   z   |          S rc   )r  )r  r   aotherbothernbkro   s     r]   r   z2devise_plan.<locals>.do_shifts_a.<locals>.<lambda>5  s    hq6z3<A&N&N r_   rv   )nalr0  alr.  r/  r)  ro   s    ` ``r]   do_shifts_az devise_plan.<locals>.do_shifts_a2  s<    yb";";NNNNNNNP P 	Pr_   c                 4      || fdd           S )z( Shift us from (nal, nbk) to (nal, bk). c                 4    t          z   | z   |          S rc   )r  )r  r   r.  r/  r1  ro   s     r]   r   z2devise_plan.<locals>.do_shifts_b.<locals>.<lambda>:  s    hsV|QZA&N&N r_   c                 ,    t          | |                   S rc   )r  r,  s     r]   r   z2devise_plan.<locals>.do_shifts_b.<locals>.<lambda>;  s    fQqTll r_   rv   )r1  r0  bkr.  r/  r)  ro   s   `  ``r]   do_shifts_bz devise_plan.<locals>.do_shifts_b7  s9    ybNNNNNNN224 4 	4r_   r   rv   c                 T    g | ]%}t          t          |          t                     &S )r   )sortedr   r   r  s     r]   r   zdevise_plan.<locals>.<listcomp>K  s<     ) ) ) #4770@AAA ) ) )r_   c                 z    g }|                                  D ]#\  }}||k    r|t          | |                   z  }$|S rc   )r   r   )r  r   r   r  values        r]   otherszdevise_plan.<locals>.othersN  sH    AIIKK & &58 &c!f%AHr_   r   rx   zNon-suitable parameters.)	rh   ri   r   r   r   rZ  r:  r   r  )rk  originro   r   r   	nabuckets	nbbucketsr  r3  r8  r  r2  r1  r7  r0  r=  r.  r/  namaxamaxr)  s     `                 @r]   devise_planrC    s   \0D 0Dy&)VY	B0D 0D 0D,Hh	9 4  !!Sinn.>.>)?)?%@%@@ HX]]__%%&&#d9>>3C3C.D.D*E*EEHvvvvvFGGG
C   P P P P P P
4 4 4 4 4 4 D))D,A,AAGWXXX 1 1= 	!BA,C= 	!BA,Cr77c#hh 	L#b''SXX"5 	L66666JKKK) )#r3') ) )CS	 	 	 	1%%	1%%r77a< 	@;;r3FF;;;CCWW\ 	@;;sBFF;;;CCGEb6D1v~" =bedla&7 = !;<<<t|a @{{3R@@@{{2sB??? {{3R@@@{{3B???	!	!KKMMMJr_   c                    t          | j        t                    t          | j        t                    }}t	          |t
          j                           dk    rdS |t
          j                 d         }|dk    rdS t
          j        |vrdS t          |t
          j                           }|                                 |d         dk    rdS t          | j                  }|	                    |           t          | j                  }|	                               dz  fd|D             }fd|D             }g }t          |dz
            D ]'|                    t          dz                        (|                                 t                    |z  z  }	|	t          fd|D              z  }	|	t          fd|D              z  }	|t!          |	          gz  }d}
t                    D ]L|z  t                    z  }|t          fd|D              z  }|t          fd	|D              z  }|
|z  }
Mt#          ||          ||
 fS )
z? Try to recognise a hypergeometric sum that starts from k > 0. rX   Nr   c                     g | ]}|z
  S rv   rv   r   r[   r  s     r]   r   z#try_shifted_sum.<locals>.<listcomp>      


Q1q5


r_   c                     g | ]}|z
  S rv   rv   rF  s     r]   r   z#try_shifted_sum.<locals>.<listcomp>  rG  r_   c                 0    g | ]}t          |          S rv   r6   )r   rm   r  s     r]   r   z#try_shifted_sum.<locals>.<listcomp>  !    '''aAq'''r_   c                 0    g | ]}t          |          S rv   rJ  )r   rl   r  s     r]   r   z#try_shifted_sum.<locals>.<listcomp>  rK  r_   c                 0    g | ]}t          |          S rv   rJ  r   rl   r6  s     r]   r   z#try_shifted_sum.<locals>.<listcomp>  !    )))2a88)))r_   c                 0    g | ]}t          |          S rv   rJ  r   rm   r6  s     r]   r   z#try_shifted_sum.<locals>.<listcomp>  rO  r_   )rU   rh   r^   ri   r   r   r   r   r   remover  rf   r  r  r7   r   r  re   )rk   ro   r   r   r  r   r
  r  r  facr  r"  r  r6  s               @@r]   try_shifted_sumrT  t  s   dgu--tDGU/C/ChH
8AF! tAAv tvX tXafAFFHHH	!AAv t
tw--CJJqMMM
tw--CJJqMMMFA



#


C



#


C
C1q5\\ " "

6!a%==!!!!KKMMM
A,,q!t
C3''''3'''((C3''''3'''((CLC	A1XX  qD1	S))))S)))**	S))))S)))**	Q#s##S1",,r_   c                   
 t          | j        t                    t          | j        t                    }}|t          j                 }|t          j                 }|                                 |                                 d |D             }d |D             

r"t          
fd|D                       rt          S |sdS |d         }d}t          j	        }	t          t          t          |                      D ]N||z  }|dz   z  }|t          fd| j        D              z  }|t          fd| j        D              z  }|	|z  }	O|	S )	zj Recognise polynomial cases. Returns None if not such a case.
        Requires order to be fully reduced. c                     g | ]
}|d k    |S rO  rv   r   s     r]   r   z"try_polynomial.<locals>.<listcomp>  !    
#
#
#AF
#1
#
#
#r_   c                     g | ]
}|d k    |S rO  rv   r   s     r]   r   z"try_polynomial.<locals>.<listcomp>  rW  r_   c              3   0   K   | ]}|d          k     V  dS )rx   Nrv   )r   rl   bl0s     r]   r   z!try_polynomial.<locals>.<genexpr>  s+      ,,11s2w;,,,,,,r_   Nrx   rX   c                     g | ]}|z   S rv   rv   rN  s     r]   r   z"try_polynomial.<locals>.<listcomp>      ,,,qQU,,,r_   c                     g | ]}|z   S rv   rv   rQ  s     r]   r   z"try_polynomial.<locals>.<listcomp>  r\  r_   )rU   rh   r^   ri   r   r   r   allr   r   r   r   r  r   )rk   ro   r   r   rV  r  al0rl   rS  rj   rZ  r6  s             @@r]   try_polynomialr`    sf    dgu--tDGU/C/ChH	!&	B	!&	BGGIIIGGIII
#
#b
#
#
#C
#
#b
#
#
#C
 s,,,,,,,,, 	 tBA
C
%CDrOO$  qq1us,,,,DG,,,--s,,,,DG,,,--s
Jr_   c           	         t          | j        t                    t          | j        t                    }}i }|                                D ]Q\  }}|dk    r||vr dS ||         }t          |          t          |          f||<   |                    |d           R|i k    rdS t          j        |vrdS |t          j                 \  }}||dgz   f|t          j        <   t          d          }	t          j
        }
t          j
        }|                                D ]\  }\  }}t          |          t          |          k    r dS t          ||          D ]l\  }}||z
  j        r/||z
  }|
t          ||	z   |          z  }
|t          ||          z  }>||z
  }|
t          ||          z  }
|t          ||	z   |          z  }mt          |
|z  |	          }t!          j        |          }g }i }|D ]}|                                \  }
}|                    |	          sKt)          |
|	          }|j        st-          d          |                                \  \  }}|||z  |fgz  }z|
                    |	          rt1          d          |                    |	          \  }\  }d}|j        r|j        }|j        }||	k    r|dk     nz|j        rd|                    |	          \  }}d}||	k    r|                    |	          \  }}|||	z  |z   k    rt1          d|z            ||z  }|||z  z  }nt1          d          |                    |g                                |
|z  |f           i }i }t          d	          }|!                    d
            ddd|z
  z  i}|rBtE          |d         d                   D ]&}|||         #                    |          z  ||dz   <   '|D ]A\  }}|                    t          j
        g                                |||         z             B|                                D ]\  }}|D ]=\  } }|                    tI          |||          g                                |            >|!                    d            tE          d|d         d         dz             D ]>}| tI          |||          fdtI          ||dz
  |          fg|tI          |||          <   ?| tI          |d|          fdd|z
  z  t          j
        fg|tI          |d|          <   i }!tK          t          j
        gt          |&                                          z             D ]
\  }}||!|<   d tO          t          |!                                          d           D             }"tQ          |"          }#tQ          dgt          |#          z  g          }$|                                D ]\  }} t!          |  |$|!|         <   tS          t          |#                    }%|                                D ] \  }}|D ]\  } }&| |%|!|         |!|&         f<   !tU          | |dg |#|$|%          S )z
    Try to find an expression for Hyper_Function ``func`` in terms of Lerch
    Transcendents.

    Return None if no such expression can be found.
    r   NrX   r   zp should be monomialz<Need partial fraction decomposition with linear denominatorszunrecognised form %sz%unrecognised form of partial fractionro   c                     | d         S rW   rv   r   s    r]   r   ztry_lerchphi.<locals>.<lambda>   s
    1 r_   r   rx   c                     | d         S rW   rv   r   s    r]   r   ztry_lerchphi.<locals>.<lambda>*  s
    QqT r_   rw   c                 2    g | ]\  }}t          |          S rv   )r   )r   rm   r7  s      r]   r   z try_lerchphi.<locals>.<listcomp>3  s4     E E EA[^^ E E Er_   c                     | d         S rW   rv   r   s    r]   r   ztry_lerchphi.<locals>.<lambda>4  s
    ad r_   )+rU   rh   r^   ri   r   r   r  r   r   r	   r   r   r   is_positiver6   rO   r   	make_argsr   r<  rQ   is_monomialrY  LTNotImplementedErroras_coeff_mulis_Powr   baseis_Addas_independentru  rf   r   r  r   r8   	enumerater   r:  rL   rN   rg   )'rk   r   r   pairedr   r<  bvalueaintsbintsr   r   r   avaluerl   rm   r  partr   	monomialstermsr   r  indepdepr6  tmpr7  derivr  ro   monr   r\   transbasisrr   rs   rt   b2s'                                          r]   try_lerchphir    s)    dgu--tDGU/C/ChHFnn&&    
U!8 	8+ 	44#E{{DLL1sS$2~ tvX t!&>LE5UaS[)F16Nc

AEEEE!' & &ffv;;#f++% 	44 '' 	& 	&DAqA" &EAE1%Aq!EAq!AE1%	& ua  D=DIE 9 9))++uyy|| 	UAA= 8 6777JUaA1U7A,'I99Q<< 	C% 'B C C C))!,,u: 	A(C!8 	OFFFZ 
	O''**FAsAax -))!,,1acAg~ H)*@3*FGGGFAQTMEE%&MNNNB&&eQ'78888 EFc

ANN~~N&&&aQi.C *y}Q'(( 	* 	*A3q6;;q>>)CAJJ 6 61!%$$++Ac!fH5555 8 81 	? 	?DAqhq!Q//44;;A>>>>	>>"""q!B%(Q,'' 	D 	DA*+XaA->->(?)*HQAq,A,A(B(DE(1a##$$&'R!Q):):$;%&AY$6$8hq!Q  E15'D$6$6677  1aE E&ekkmm1D1D5B]+D +D +D E E EEuACFF
|A  11g%(c!ffA ' '1 	' 	'EAr%&AeAhb	!""	'4D"aA...r_   c           
         t          d          }| j        r%d | j        D             }d | j        D             }t          t	          | z  |t	          | z  z
  }t          |t                    } |j                    }g }t          |          }t          |          D ]e}	| j        d         |	z   }
|t          |
gt          | j        dd                   z   | j        |          gz  }|	|dz
  k     r|
 ||	|	f<   |
||	|	dz   f<   ft          |          }t          dgdg|dz
  z  z   g          }t          |          g}t          |          D ] }	|                    |||	         z             ! |j                    }|                                 dg|z  }t!          |          D ]6\  }	}t!          |||	         z            D ]\  }}||xx         ||z  z  cc<   7t!          |          D ]=\  }	}| ||dz
           d|dz
  f         z   |j                    d         z  ||dz
  |	f<   >t#          | |dg |||          S g }t          | j        dd                   }t          t%          |                    D ]'}|t          g ||          gz  }||xx         dz  cc<   (|t          g ||          gz  }t          |          }t%          |          }t          dgdg|dz
  z  z   g          }t          |          }|t	          | j         z  |d|dz
  f<   t          d|          D ]0}	| j        |	dz
           ||	|	dz
  f<   | j        |	dz
            ||	|	f<   1t#          | |dg |||          S )zU
    Create a formula object representing the hypergeometric function ``func``.

    ro   c                 "    g | ]}t           |z   S rv   r)  r+  s     r]   r   z0build_hypergeometric_formula.<locals>.<listcomp>K  s    ,,,qBF,,,r_   c                 (    g | ]}t           |z   d z
  S r-  r)  r.  s     r]   r   z0build_hypergeometric_formula.<locals>.<listcomp>L  s     0001BFQJ000r_   r   rX   N)r	   rh   ri   r*  r   rQ   r/  rN   r  r?   r   rL   rM   rf   r1  r  rp  rg   r   )rk   ro   r4  r5  r   rP   r6  r  rt   r  rl   rr   rs   derivsr   rj   r\   r  r  ri   r   s                        r]   build_hypergeometric_formular  @  s    	c

Aw -3,,DG,,,00000#x. 1S(^#33D"~~DKMM!HHq 	  	 A
QAeQC$twqrr{"3"33TWa@@AAE1q5y  "!Q$!QU(5MMQC1#q1u+%&''a&&q 	' 	'AMM!F1I+&&&&DO			c!eaLL 	 	DAq!!F1I+..  1A!A#cNN 	J 	JDAq"VAE]1a!e844_T_5F5Fq5IIAa!eQhKKtQb!Q222 $'!!!*s2ww 	 	AeBA&&''EqEEEQJEEEE%B""##5MMFFQC1#q1u+%&''!HHTWo!QU(q! 	& 	&A'!a%.AaQhKwq1u~oAadGGtQb!Q222r_   c                    t          |           t          |          }}|}t          |          }|dk    rt          j        S ddlm} |dk    rq|dk    rj| |z   \  }}}	|dk    rKt          |	|z
  |z
            t          |	          z  t          |	|z
            z  t          |	|z
            z  S |dk    r |||z
  |	z             dk    r||}}|dk    r |||z
  |	z             dk    r|j        rx|j        rqdt          t          |z  dz            z  t          |           z  t          ||z
  dz             z  t          | dz            z  t          |dz  |z
  dz             z  S t          |dz  dz             t          ||z
  dz             z  t          |dz             z  t          |dz  |z
  dz             z  S t          | ||          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).
    r   r   rw   rX   rx   )r   r>   r   r   sympy.simplify.simplifyr   r#   r   r   r!   r   r?   )
rh   ri   ro   r  qz_r   rl   rm   r\   s
             r]   hyperexpand_specialr  z  s    r77CGGqA	
B1AAv u000000Av 5!q& 5r'1a6 	GQ##E!HH,U1q5\\9%A,,FF7 	xxA	**a/ 	aqA7 	5xxA	**a/ 	5| 5 5RT!V}UA2YY.uQUQY/?/??A2a4[[!!&qsQw{!3!34 4 QqS1W~~eAEAI&6&661q5\\""'!a!"4"45 5 Rr_   Nz0rX   defaultc                    j         rt          j        S ddlm} t          d          dk    rdfd}t          t                      at          d	|            t          |           \  } }	|	rt          d
|            nt          d           t          |           }
|
ft          d           t          |
|	fd          }t          |z  fd          }t           ||                                                  S t          j        }t          |           }
|
|
\  } }}t          d|            |	|z  }	t          ||	fd          }t          |z  fd          } ||                                        }t                    dv rt!          | j                  t!          | j                  fdk    rXt'          |           } |||	                              t*          t,                    }|                    t*                    s||z   S t                              |           }|t3          |           }|t          dd           t'          |           }t          d|j        d|j                   |	t9          | |j                  z  }	 |||	          |z   }t;          |d                              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``.
    r   r  F)r}  r  nonrepsmallc                    t          | j                            | j        
          |t	          | j                            | j        
          
                    }t          |t	          | j                            | j        
          t          | j        j        d                   z  z   
                    }dk    r"|                    t          
                    }t          d t          || j                            | j        
                    t          j                  z  }|                    
	          }r|                              }|S )Nr   rX   c                 *    | |d         |d         z  z   S r@  rv   rA  s     r]   r   z5_hyperexpand.<locals>.carryout_plan.<locals>.<lambda>  s    q1ad{ r_   )r  rs   r}  ro   r  rt   rM   shaper  r   r   r   rr   r   r   rewrite)rv  r  rs   r  rj   ops0prempremultr  ro   r  s        r]   carryout_planz#_hyperexpand.<locals>.carryout_plan  s.   ACHHQS"--s4QSXXac25F5FKKM MAt4QSXXac25F5F+/ACIaL0A0A+A6BCEG GH H a< 	+IbMM**A**C1388AC3D3D,E,EqvNNwVffRmm 	'++g&&C
r_   Nz)Trying to expand hypergeometric function   Reduced order to   Could not reduce order.z  Recognised polynomial.c                 4    |                                z  S rc   r   rv  r  s    r]   r   z_hyperexpand.<locals>.<lambda>  s    166":: r_   c                 4    |                                z  S rc   r  r  s    r]   r   z_hyperexpand.<locals>.<lambda>  s    r!&&**} r_   z+  Recognised shifted sum, reduced order to c                 4    |                                z  S rc   r  r  s    r]   r   z_hyperexpand.<locals>.<lambda>  s    "QVVBZZ- r_   c                 4    |                                z  S rc   r  r  s    r]   r   z_hyperexpand.<locals>.<lambda>  s    2affRjj= r_   )rX   rx   )rw   rX   z  Could not find an origin. z@Will return answer in terms of simpler hypergeometric functions.z  Found an origin:  Tpolar)is_zeror   r   r  r   r=   _collectionrq  r   r  r`  r  r>   r}  r   rT  r   rh   ri   r  replacer?   r  r<  r  r  r3  rk   rC  rS   )rk   ro   r  r  r  r  r  r   r  r  rj   r  nopsrv  r  r  s    ``````         r]   _hyperexpandr    sZ    	y u000000A)           *  *'))	
5t<<< T""ID#
 +#T****)*** r
"
"C
 3()))C&=&=&=&=>>AgIt-D-D-D-DEE((1++**2q11222 	
A
$
#
#C
 dA;TBBBt 	3 7 7 7 788A'	4)@)@)@)@AAAQA !}} S\\3tw<<$@F$J (..M!S!!))%1DEEuuU|| 	q5L ''--G  %t$$ 5,2	3 	3 	3 /t44	
!4c7<HHH ;tW\2...C 	gs##a'AQd###++E3FGGGr_   c           	      0  	
 d }t          | j                  t          | j                  t          | j                  	t          | j                  
g }d}|r3d} ||j        	
fdd	
z             }|	||gz  }d}. ||j        	
fdd	
z             }|	||gz  }d}W |	|j        	
fdd	z             }|	||gz  }d} |
|j        	
fd
d	z             }|	||gz  }d} ||j        fdd	g           }|	||gz  }d} ||j        fdd	g           }|	||gz  }d} |	|j        	fddg           }|
||gz  }d} |
|j        
fddg           }|
||gz  }d}3|3t          |j                  k    sHt          |j                  k    s0	t          |j                  k    s
t          |j                  k    rt          d          |                                 |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)
    [<Increment upper a index #0 of [0], [], [], [].>]
    >>> devise_plan_meijer(G_Function([0], [], [], []),
    ...                    G_Function([-1], [], [], []), z)
    [<Decrement upper a=0.>]
    >>> devise_plan_meijer(G_Function([], [1], [], []),
    ...                    G_Function([], [2], [], []), z)
    [<Increment lower a index #0 of [], [1], [], [].>]

    Slightly more complicated plans:

    >>> devise_plan_meijer(G_Function([0], [], [], []),
    ...                    G_Function([2], [], [], []), z)
    [<Increment upper a index #0 of [1], [], [], [].>,
    <Increment upper a index #0 of [0], [], [], [].>]
    >>> devise_plan_meijer(G_Function([0], [], [0], []),
    ...                    G_Function([-1], [], [1], []), z)
    [<Increment upper b=0.>, <Decrement upper a=0.>]

    Order matters:

    >>> devise_plan_meijer(G_Function([0], [], [0], []),
    ...                    G_Function([1], [], [1], []), z)
    [<Increment upper a index #0 of [0], [], [1], [].>, <Increment upper b=0.>]
    c                     t          t          | |                    D ]X\  }\  }|z
  j        rF|z
  |z  dk    r:t          fd|D                       r ||          }| |xx         |z  cc<   |c S YdS )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.
        r   c              3   $   K   | ]
}|k    V  d S rc   rv   )r   r[   rl   s     r]   r   z8devise_plan_meijer.<locals>.try_shift.<locals>.<genexpr>R  s'      001Q000000r_   N)rp  r   r   r^  )	rv  r   shifterr   counteridxrm   r'  rl   s	           @r]   	try_shiftz%devise_plan_meijer.<locals>.try_shiftG  s     %SAYY// 	 	KC!QQ"()At|a'7000000000 WS\\#$				 	r_   TFc                 ,    t          |           S rc   )r  r   fanfapfbmfbqro   s    r]   r   z$devise_plan_meijer.<locals>.<lambda>_      S#sAq!I!I r_   rX   Nc                 ,    t          |           S rc   )r  r  s    r]   r   z$devise_plan_meijer.<locals>.<lambda>f  r  r_   c                 ,    t          |           S rc   )r  r  s    r]   r   z$devise_plan_meijer.<locals>.<lambda>m  r  r_   rx   c                 ,    t          |           S rc   )r  r  s    r]   r   z$devise_plan_meijer.<locals>.<lambda>t  r  r_   c                 .    t          |                    S rc   )r  )r   r  s    r]   r   z$devise_plan_meijer.<locals>.<lambda>z      \#a&-A-A r_   c                 .    t          |                    S rc   )r  )r   r  s    r]   r   z$devise_plan_meijer.<locals>.<lambda>  r  r_   c                 .    t          |                    S rc   )r  )r   r  s    r]   r   z$devise_plan_meijer.<locals>.<lambda>  r  r_   c                 .    t          |                    S rc   )r  )r   r  s    r]   r   z$devise_plan_meijer.<locals>.<lambda>  r  r_   zCould not devise plan.)r   r   rh   r   ri   rj  r  )r#  r$  ro   r  r  changer  r  r  r  r  s     `    @@@@r]   devise_plan_meijerr    s1   t   sv,,C
sv,,C
sv,,C
sv,,C
CF
 1YsBEIIIIIIII#)% %  	B4KCFYsBEIIIIIIII#)% %  	B4KCFYsBEIIIIIIII39& &  	B4KCFYsBEIIIIIIII39& &  	B4KCFYsBE#A#A#A#A2rJJ 	B4KCFYsBE#A#A#A#A2rJJ 	B4KCFYsBE#A#A#A#A1bII 	B4KCFYsBE#A#A#A#A1bII 	B4KCFc  1d d25kk <SDKK/ <3$ru++3E <4;;<!":;;;KKMMMJr_   Fc           
      
   t           t                      a |dk    rd}| }t          d|            t          d          }t	          |           \  } rt          d|            nt          d           t                               |           }|t          d|j                   t          |j        | |          z  t          |j	        
                    |j        |          t          |j        
                    |j        |          |                    }|                    t          |                    }||j        
                    |j        |          z  }	|	d         
                    ||          }	t#          |	d	
          S t          d           d fd}
t          d           |
| j        | j        | j        | j        ||          \  }}d }D ]F}t-          |j        
                    |dz  t0          t0           i          t0                    |_        G |
 || j                   || j                   || j                   || j                  d|z            \  }}t#          |
                    ||          d	
          }t#          |
                    d|z            d	
          }t3          |t4                    s|
                    d|z            } | |          }|j        dk    so|j        dk    rpt9          |j                  t9          |j                  k    rFt;          |j                  dk     dur,t?          |          t?          d          k    r|durd	}|durd	}|d	u r|                     |pd          }n|                     |pd          }|d	u r|                     |pd          }n|                     |pd          }|dur|dur|dk    rd}|tB          k    rd}t3          |t4                    s|
                    ||          }t3          |t4                    s|
                    ||          }d } |||          } |||          }tE          ||          ddtF          fk    r
||k     r|S |S tI          |d         |d                   dk    r@tI          |d         |d                   dk    r tK          ||f||f ||          d	f          S tK          ||f||f ||          d	f          }	|	&                    tN                    r|st          d           |	&                    tN                    r|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.
    Nr  z1Try to expand Meijer G function corresponding to ro   r  r  z  Found a Meijer G formula: r   Tr  z;  Could not find a direct formula. Trying Slater's theorem.c                     | D ]U}t          | |                   dk    r:d}||v rt          ||                   }|dz   t          | |                   k     r dS VdS )z Test if slater applies. rX   r   FTr   )r  r  r   r   s       r]   can_doz_meijergexpand.<locals>.can_do  so     	! 	!A3q6{{Q !8 $CFAq53s1v;;& ! 55tr_   c           
      p  %&' t          | |||          }|                                \  }}}	} (||	          st          j        dfS t	          |           t	          |          z   t	          |          t	          |          z   k     }
t	          |           t	          |          z   t	          |          t	          |          z   k    rt                    dk     }
|
du rt          j        dfS t          j        }|D ]4}t	          ||                   dk    rl||         d         'd}t          |          }|                    '           |D ]}|t          |'z
            z  }| D ]}|t          d'z   |z
            z  }|D ]}|t          d'z   |z
            z  }|D ]}|t          |'z
            z  }'fdt          |           t          |          z   D             }'fdt          |          t          |          z   D             }t          t          j
        t	          |          t	          |          z
  z            }||z  }*|z  'z  }t          t          ||          |)*|'d           }|||z  z  }||         d         &&fd||         dd          D             }t	          |          }&fd|	|         d |dz            D             }t          |          }||         D ]}|                    |           t          |          }|	|         d |         D ]}|                    |           |d	         }d
 t          ||          D             }t          d          }|z  } |D ]J}t          |d          s#|j        rt#          t%          |                    }| t          ||z
            z  } K| D ]}| t          d|z
  |z             z  } |D ]}| t          d|z
  |z             z  } |D ]}| t          ||z
            z  } t'          |           } t)          t#          t%          |                              D ]/}!t+          | |&|!z             }"t-          |")fd          }"||"z  }0&|z   %t          t          j
        t	          |          t	          |          z   dz   z            }||z  }*|z  %z  }%fdt          |           t          |          z   D             dgz   }%fdt          |          t          |          z   D             }t          t          ||          |)*|%d           }t          j
        |z  t/          |          z  }#t)          |          D ]=}$|#t          j
        ||$         z  t1          |||$         z
  dz   ||$                   z  z  }#>| D ]}|#t          d|z
  %z             z  }#|D ]}|#t          |%z
            z  }#|D ]}|#t          |%z
            z  }#|D ]}|#t          d|z
  %z             z  }#||#|z  z  }6||
fS )NFrX   r   c                      g | ]
}d z   |z
  S r-  rv   )r   rl   bhs     r]   r   z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>  !    ???aq2vz???r_   c                      g | ]
}d z   |z
  S r-  rv   )r   rm   r  s     r]   r   z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>  r  r_   r  c                     g | ]}|z
  S rv   rv   )r   r  b_s     r]   r   z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>	  s    333"b2g333r_   c                     g | ]}|z
  S rv   rv   )r   r  r  s     r]   r   z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>	  s    777"b2g777r_   rx   c                     g | ]
\  }}||z
  S rv   rv   )r   r   r  s      r]   r   z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>	  s     666Aa!e666r_   r   c                 4    |                                z  S rc   r  )rv  ro   s    r]   r   z3_meijergexpand.<locals>.do_slater.<locals>.<lambda>!	  s    !AFF1II+ r_   c                      g | ]
}d z   |z
  S r-  rv   )r   rl   aus     r]   r   z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>)	  r  r_   c                      g | ]
}d z   |z
  S r-  rv   )r   rm   r  s     r]   r   z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>*	  r  r_   )r   r#  r   r   r   r   r   rR  r#   r2   NegativeOner  re   r   r	   r   rY   introundr   r  rR   r  r7   r6   )+r   r   rh   ri   ro   zfinalrk   r7  r  r  condrj   r"  rS  bor  ajr
  r  r  hargr  hypkir   lirm   aorl   ludir   	integrandr  residrs   r   r  r  r  r  r  r   s+       `                                @@@r]   	do_slaterz!_meijergexpand.<locals>.do_slater  s    "b"b))--//3Qvc3 	!65= 2wwR 3r77SWW#44r77SWWB#b'' 11 	q66A:D5= 	!65= f T	 T	A3q6{{a SVAY"XX		" * *B5b>>)CC . .B5R"---CC . .B5R"---CC * *B5b>>)CC????488d2hh+>???????488d2hh+>???q}s2wwR/@ABBx Q3)">#s#;#;T3#$gr4A A AsSy VAY3333Aqrr
333GG7777AvAv777"XXQ ! !AIIaLLLL"XXQ ! !AIIaLLLLV66#b"++666 #JJqD	 . .Aq!99 * *aMMq1u-II 2 2Aq1uqy!1!11II 2 2Aq1uqy!1!11II . .Aq1u-II (	22	s599~~.. ! !A#Iq"q&99E+E38M8M8M8MNNE5LCC "Wq}s2wwR/@1/DEFFxQ3)????488d2hh+>???1#E????488d2hh+>???">#s#;#;T3#$gr4A A A MB'	"5q H HA1-bbeaA.G.GGGAA + +Aq1urz***AA ' 'Aq2v&AA ' 'Aq2v&AA + +Aq1urz***AAquDyr_   r   c                     d | D             S )Nc                     g | ]}d |z
  S r-  rv   r   s     r]   r   z._meijergexpand.<locals>.tr.<locals>.<listcomp>C	  s    !!!!A!!!r_   rv   )r   s    r]   r   z_meijergexpand.<locals>.trB	  s    !!q!!!!r_   rX   rx   Fnonrepr  c                     |du rd}n	|du rd}nd}|                      t          t          t           t                    rd}||                     t
                    |                                 fS )NTr   FrX   rw   rz   )r<  r   r   r   countr?   	count_ops)r   r  c0s      r]   weightz_meijergexpand.<locals>.weightr	  ss    4< 	BBU] 	BBB88BbS#&& 	 BDJJu%%t~~'7'788r_   z@  Could express using hypergeometric functions, but not allowed.)(_meijercollectionr  r   r	   r  r  rk   r  r  rs   r}  ro   r  rt   r  r   rr   rS   r   r   rh   ri   rQ   r  r*  r   r   deltar   r:   nur2   r  r   r]  r   r^  r9   r<  r?   )rk   r  allow_hyperr  placefunc0ro   rv  rs   r  r  slater1cond1r   r  slater2cond2r"  r  w1w2r  r  r   s                        @@@r]   _meijergexpandr    s     6355) E	
=tDDD 	c

A#D))ID#
 +#T****)*** 	''--A (,af555!!&$222 ACHHQS!,,c4QSXXac15E5EqIIK K KK	!%%achhqsAaDIIa$''''	
GHHH	 	 	e e e e e e eN 	c

AYtw$'1bIINGU" " "  > >q!A#rB3&788"==Yrr$'{{BBtwKKDGbbkk !B$( (NGU Q++4888GQ"--T:::GeT"" #

1ac""QAw{ 	
Aad))s14yy0XX]5(-7^^z!}}-L  	E 	E} <//'"5X66//'":];;} <//'"5X66//'":];;E e50 A: 	EC< 	EeT"" "

1b!!eT"" "

1b!!9 9 9 
		B			B
2r{{q!Rj  7 	NN
2a5"Q%A P#beRU"3"3q"8 P'5)GU+;eeBii=NOOO
 	7E"We$4uuRyy$6GHHAuuU|| "K " ! 	" 	" 	"55<< ; 599r_   c                     t          |           } fd}fd}|                     t          |                              t          |          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
    c                 n    t          t          | |          |          }|t          | ||          S |S )Nr  )r  re   r?   )rh   ri   ro   r  r  s       r]   
do_replacezhyperexpand.<locals>.do_replace	  s@    B//GDDD 	R###Hr_   c           	          t          t          | d         | d         |d         |d                   |          }|                    t          t          t
          t
                     s|S d S )Nr   rX   )r  r  )r  r   r<  r   r   r   )rh   ri   ro   r  r  r  r  s       r]   	do_meijerzhyperexpand.<locals>.do_meijer	  sk    :beRUBqE2a5AA1u> > >uuS#rB3'' 	H	 	r_   )r   r  r?   rK   )rv  r  r  r  r  r  s    ```  r]   hyperexpandr  	  st    2 	

A          
 99UJ''//CCCr_   )Fr  N)r  collectionsr   	itertoolsr   	functoolsr   mathr   sympyr   
sympy.corer   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   sympy.core.modr   sympy.core.sortingr   sympy.functionsr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   $sympy.functions.elementary.complexesr=   r>   sympy.functions.special.hyperr?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   sympy.matricesrL   rM   rN   sympy.polysrO   rP   rQ   sympy.seriesrR   sympy.simplify.powsimprS   sympy.utilities.iterablesrU   r^   r   r   r   r   re   r   r*  rg   rq  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rC  rT  r`  r  r  r  r  r  r  r  r  r  rv   r_   r]   <module>r     s	   t $ # # # # #                        @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @       / / / / / /H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H F E E E E E E E5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . - - - - - - - - - ) ) ) ) ) ) ) ) ) )             , , , , , , * * * * * *  ] ] ]@	@ @ @F    A A A A AT A A AH<H <H <H <H <H <H <H <H@ U3ZZB B B B B B B BNI I I I I I I IX&: &: &: &: &: &: &: &:R       .2 2 2 2 2 2 2 2j! ! ! ! !8 ! ! !
H 
H 
H 
H 
HX 
H 
H 
H
L 
L 
L 
L 
LX 
L 
L 
L&L &L &L &L &Lx &L &L &LR'L 'L 'L 'L 'Lx 'L 'L 'LTH H H H H8 H H HL L L L L8 L L LI I I I I8 I I IL L L L L8 L L L#N #N #N #N #NX #N #N #NL,N ,N ,N ,N ,NX ,N ,N ,N^0N 0N 0N 0N 0NX 0N 0N 0Nf.N .N .N .N .NX .N .N .Nb= = = = =( = = =@  4? ? ?87 7 7<    F F FR*- *- *-Z  8@/ @/ @/F73 73 73t# # #J   "eeDkk11"hH hH hH hHVE E EN   9B} } } }@'D 'D 'D 'D 'D 'Dr_   