
    \hI                    F   S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr  SSKJr  SS	KJ r   SS
K!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArAJBrB  SSKCJDrDJErE  SSKFJGrGJHrHJIrIJJrJJKrKJLrLJMrMJNrNJOrOJPrPJQrQJRrRJSrS  SSKTJUrUJVrVJWrW  SSKXJYrYJZrZJ[r[  SSK\J]r]  SSK^J_r_  SSK`Jara  S rbS rcS rdS reS rf " S S\5      rg " S S\5      rh\" S5      ri " S S5      rj " S S5      rk " S  S!5      rl " S" S#5      rm " S$ S%5      rn " S& S'\n5      ro " S( S)\n5      rp " S* S+\n5      rq " S, S-\n5      rr " S. S/\n5      rs " S0 S1\n5      rt " S2 S3\n5      ru " S4 S5\n5      rv " S6 S7\n5      rw " S8 S9\n5      rx " S: S;\n5      ry " S< S=\n5      rz " S> S?\n5      r{ " S@ SA\n5      r|SB r}SC r~SD rSE rSF rSG rSH rSI rSJ rSK rSL rSMq/ \" SN5      SOSSP4SQ jrSR rSMq  SUSS jrSUST jrgM)Va@  
Expand Hypergeometric (and Meijer G) functions into named
special functions.

The algorithm for doing this uses a collection of lookup tables of
hypergeometric functions, and various of their properties, to expand
many hypergeometric functions in terms of special functions.

It is based on the following paper:
      Kelly B. Roach.  Meijer G Function Representations.
      In: Proceedings of the 1997 International Symposium on Symbolic and
      Algebraic Computation, pages 205-211, New York, 1997. ACM.

It is described in great(er) detail in the Sphinx documentation.
    )defaultdict)product)reduce)prod)SYMPY_DEBUG)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                 ~    U R                   (       a  [        U S5      $ U R                  5       u  p[        US5      U -   $ N   )	is_Numberr   as_coeff_Add)xcs     R/var/www/auris/envauris/lib/python3.13/site-packages/sympy/simplify/hyperexpand.py_mod1r]   U   s5     	{{1ay>>DAq!9q=    c                 :4  ^ ^^^^	^
 [        S[        S9u  mmmm
UUUU U
4S jnUUUU U
4S jnU" SS[        T
5      5        U" T4S[        T* T
5      5        U" TT[        R
                  -
  4ST-  4[        [        TT
5      [        T[        R
                  -   T
5      S-  /5      [        SS//5      [        T[        R
                  -
  T
-  ST
-
  -  [        R
                  T-
  T
-  ST
-
  -  /TST
-
  -  TT
S-
  -  ST
-
  -  //5      5        U" S	S
[        [        T
5      S/5      [        ST
-  S//5      [        ST
T
S-
  -  /SS//5      5        U" [        R
                  S4[	        S5      4[        [        T
5      S/5      [        SS//5      [        [        SS5      SST
-
  -  S-  /SS//5      5        U" [        R
                  [        R
                  4[	        S5      4[        [        T
5      [        [        SS5      T
5      /5      [        SS//5      [        [        SS5      [        R
                  /ST
ST
-
  -  S-  //5      5        U" T[        R
                  T-   4[        R
                  4[        [        T* T
5      [        T* [        R
                  -
  T
5      * /5      [        SS//5      [        ST* /T
ST-  S-
  -  S-  ST
-
  -  [        R
                  T
ST-  S-
  -  ST
-
  -  -
  //5      5        U" TT* /[        R
                  /[        [        TT
5      [        TT
5      /5      [        SS//5      [        ST* /TT
-  ST
-
  -  SST
-
  -  S-  //5      5        U" SS/S[        R
                  -  /[        [!        T
5      S/5      [        SS//5      [        T
[        R
                  -
  ST
-
  -  SST
-
  -  S-  /SS//5      5        U" [        R
                  [        R
                  /[        R"                  /[        [%        T
5      ['        T
5      /5      [        S[(        -  S//5      [        [        SS5      SST
-  S-
  -  /[        SS5      [        R
                  //5      5        U" [        SS5      [        R
                  /[        R"                  /[        [%        T
5      ['        T
5      /5      [        SS[(        -  //5      [        [        SS5      SST
-  S-
  -  /[        SS5      [        R
                  //5      5        U" [        SS5      SS/[        R
                  S/[        T
[        T
5      -  [        T
5      S/5      [        [        SS5      [        R"                  * ST
-  -  [        SS5      //5      [        [        R
                  ST
ST
-
  -  S-  /SST
T
S-
  -  // SQ/5      5        U" [        SS5      SS/SS/[        [        [        R
                  T
5      [+        T
5      S/5      [        [        SS5      SST
-  -  -
  SST
-  -  SST
-  -  //5      [        T
S-  T
S-
  -  SS/SST
S-
  -  -  S[        R
                  // SQ/5      5        U" S/T/[        T
ST-
  -  [        T
5      -  [-        TS-
  T
5      -  S/5      [        TS-
  S//5      [        ST-
  T
-   S/SS//5      5        U" T/ST-  /[        T
[        R
                  T-
  -  [        T
S-  5      -  [/        T[        R
                  -
  T
S-  5      -  [1        T[        R
                  -   5      -  S[        R
                  T-
  -  -  T
[        R
                  T-
  -  [        T
S-  5      -  [/        T[        R
                  -   T
S-  5      -  [1        T[        R
                  -   5      -  S[        R
                  T-
  -  -  /5      [        SS//5      [        T
S-  T
S-  /T
S-  T
S-  ST-  -
  //5      5        [3        S5      T
-  nU" T/TS-   /[        UT* -  T-  [-        TU5      -  T[        T
5      -  /5      [        SS//5      [        T* S/ST
//5      5        U" [        SS5      /[        R
                  /[        T
5      [5        [(        T
-  5      [6        * -  [9        [6        [5        T
5      -  5      -  -
  5        U" S/[        SS5      [        SS5      /[        [5        [(        5      [6        [;        S[5        T
5      -  5      -  [=        S[?        T
S5      -  [        [6        [(        -  S-  5      -  [5        [(        5      -  5      -  [A        S[5        T
5      -  5      [C        S[?        T
S5      -  [        [6        [(        -  S-  5      -  [5        [(        5      -  5      -  -   -  [        [6        * [(        -  S-  5      -  S[?        T
S5      -  -  [5        [(        5      [?        T
S5      -  [;        S[5        T
5      -  5      [C        S[?        T
S5      -  [        [6        [(        -  S-  5      -  [5        [(        5      -  5      -  [6        [A        S[5        T
5      -  5      -  [=        S[?        T
S5      -  [        [6        [(        -  S-  5      -  [5        [(        5      -  5      -  -   -  [        [6        * [(        -  S-  5      -  S-  S/5      [        / SQ/5      [        [        SS5      S[        SS5      /T
[        SS5      S// SQ/5      5        U" [        R
                  T/[        SS5      TS-   /[        TST-  S-
  -  [6        * -  [5        [(        T
-  5      -  [9        [6        [5        T
5      -  5      -  TST-  S-
  -  [3        S5      T
-  T* -  -  [-        T[3        S5      T
-  5      -  TST-  S-
  -  [        T
5      -  /5      [        / SQ/5      [        [        SS5      SS/ST* S/SST
//5      5        U" SS/SS/[        [E        T
5      [G        T
5      -
  [        T
5      S[H        /5      [        ST
-  SSST
-  //5      [        / SQST
SS// SQ/ SQ/5      5        U" S[        R
                  4[A        S[5        T
5      -  5      5        U" / T/[        [1        T5      T
ST-
  S-  -  -  [/        TS-
  S[5        T
5      -  5      -  [1        T5      T
STS-  -
  -  -  [/        TS[5        T
5      -  5      -  /5      [        SS//5      [        SS/T
ST-
  //5      5        ST
[        SS5      -  -  m	U	4S jnU	4S jnU" / [        R
                  TT[        R
                  -   /[        U" ST-  S-
  T
5      U" ST-  T
5      T
[        SS5      -  -  U" ST-  S-
  T
5      [5        T
5      -  U" ST-  T
5      T
[        SS5      -  -  /5      SST-  -  -  [1        ST-  5      -  T
SST-  -
  S-  -  -  [        / SQ/5      [        / SQS[        R
                  T-
  SS/SS[        R
                  S/T
SSST-
  //5      5        SST
-  [        SS5      -  -  [K        [6        [(        -  S-  5      -  m	U" / TT[        R
                  -   ST-  /S[5        [3        S5      T
-  5      -  SST-  -
  -  [1        ST-  5      S-  -  [        [M        ST-  S-
  T	5      [/        ST-  S-
  T	5      -  T	[/        ST-  T	5      [M        ST-  S-
  T	5      -  [/        ST-  S-
  T	5      [M        ST-  T	5      -  -
  -  T	S-  [/        ST-  T	5      -  [M        ST-  T	5      -  T	S-  [/        ST-  T	5      [M        ST-  S-
  T	5      -  [/        ST-  S-
  T	5      [M        ST-  T	5      -  -   -  /5      -  [        / SQ/5      [        S[        SS5      SS/SSST-  -
  S-  [        SS5      S/SSSST-  -
  [        SS5      /ST
-  SSST-
  //5      5        U" T/T[        R
                  -
  ST-  /[        T
[        R
                  T-
  -  [/        T[        R
                  -
  [5        T
5      5      S-  -  T
ST-
  -  [/        T[        R
                  -
  [5        T
5      5      -  [/        T[        SS5      -
  [5        T
5      5      -  T
[        SS5      T-
  -  [/        T[        SS5      -
  [5        T
5      5      S-  -  /5      [        [1        T[        R
                  -   5      S-  * S[        R
                  T-
  -  -  S[1        T[        R
                  -
  5      -  [1        T[        R
                  -   5      -  SST-
  -  -  S//5      [        SST-  -
  SS/T
S-  [        R
                  T-
  [        R
                  /ST
S//5      5        U" [        R
                  /TST-
  /[(        ST-
  -  [O        [(        T-  5      -  [        [/        ST-
  [5        T
5      5      [/        TS-
  [5        T
5      5      -  [5        T
5      [/        T* [5        T
5      5      [/        TS-
  [5        T
5      5      -  [/        ST-
  [5        T
5      5      [/        T[5        T
5      5      -  -   -  [/        T* [5        T
5      5      [/        T[5        T
5      5      -  /5      -  [        / SQ/5      [        TS-
  [        R
                  S/T
ST
/S[        R
                  T* //5      5        U" [        R
                  /[        SS5      [        SS5      /[        [Q        S[5        T
5      -  5      S-  [5        T
5      -  [;        S[5        T
5      -  5      S-  [5        T
5      -  [A        S[5        T
5      -  5      /5      [        / SQ/5      [        [        SS5      [        R
                  S/S[        SS5      [        R
                  /SST
-  S//5      5        U" [        SS5      /[        SS5      [        SS5      /[        [=        [        [(        [6        -  S-  5      [?        T
S5      -  S-  [5        [(        5      -  5      [(        [        [(        [6        -  S-  5      [?        T
S5      -  S-  [5        [(        5      -  S-  -  -  [;        S[5        T
5      -  5      [5        T
5      -  [A        S[5        T
5      -  5      /5      [        / SQ/5      [        [        SS5      [        SS5      S/S[        SS5      S/ST
S//5      5        U" [        SS5      /[        R
                  [        SS5      /[        [5        [(        5      [        [6        * [(        -  S-  5      -  [C        S[?        T
S5      -  [        [6        [(        -  S-  5      -  [5        [(        5      -  5      -  S[?        T
S5      -  -  [A        S[5        T
5      -  5      [;        S[5        T
5      -  5      [5        T
5      -  /5      [        / SQ/5      [        [        SS5      [        SS5      S// S QST
[        R
                  //5      5        U" TT[        R
                  -   /ST-  TST-  T-
  S-   /[1        T5      [1        ST-  T-
  S-   5      -  [5        T
5      S-  SST-  -
  -  -  [        [/        TS-
  [5        T
5      5      [/        ST-  T-
  [5        T
5      5      -  [5        T
5      [/        T[5        T
5      5      -  [/        ST-  T-
  [5        T
5      5      -  [5        T
5      [/        TS-
  [5        T
5      5      -  [/        ST-  T-
  S-   [5        T
5      5      -  [/        T[5        T
5      5      [/        ST-  T-
  S-   [5        T
5      5      -  /5      -  [        / SQ/5      [        S[        R
                  [        R
                  S/T
S-  ST-
  ST
S-  /T
S-  STST-  -
  T
S-  /S[        R
                  [        R
                  ST-  //5      5        U" SS/SS[        SS5      /[        [S        S[5        T
5      -  5      [G        S[5        T
5      -  5      -
  [A        S[5        T
5      -  5      [5        T
5      [;        S[5        T
5      -  5      -  S[H        /5      [        ST
-  SSSST
-  //5      [        S[        R
                  S[        SS5      S// S!QST
[        R
                  SS// S"Q/ S"Q/5      5        U" SST/SSTS-   /[        T[G        T
* 5      [U        ST
* 5      -   [H        -   -  T
TS-  ST-  -
  S-   -  -  TT
* T* -  -  [1        T5      [W        TT
* 5      -
  -  TS-
  S-  -  T[        T
5      -  TS-  ST-  -
  S-   -  TT
TS-  ST-  -
  S-   -  -  /5      [        ST-
  SST
-  S//5      [        SSST
-  S/ST* SS/SST
S// S#Q/5      5        g$)%zCreate our knowledge base. za b c, z)clsc           
      \   > [        X5      nTR                  [        UTUTTT45      5        g NHyper_FunctionappendFormula)	apbqresfuncabr[   formulaezs	       r\   addadd_formulae.<locals>.addh   s*    b%aq!Qi89r^   c                 `   > [        X5      nT	R                  [        UT
S TTT4X#U5      5        g rb   rc   )rg   rh   BCMrj   rk   rl   r[   rm   rn   s         r\   addbadd_formulae.<locals>.addbl   s.    b%a1ay!BCr^       rW   r   )rW   rW   )rx   z3/2   )r   r   r      	         )rW   r   r   )rW   ry   r   )r   rW   ry   r   )r   r   r   r   c                 6   > [        U T5      [        U T5      -   $ rb   r"   r(   rk   rn   rZ   s     r\   fpadd_formulae.<locals>.fp       q!}wq!},,r^   c                 6   > [        U T5      [        U T5      -
  $ rb   r   r   s     r\   fmadd_formulae.<locals>.fm   r   r^   )rW   r   r   r   )r   rW   r   r   i   )   r   r   )r   r   rW   )r   r   rW   r   r   )r   r   r   r   r   )r   r   r   ry   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$   )rm   ro   ru   mzr   r   rk   rl   r[   rZ   rn   s   `     @@@@@r\   add_formulaer   d   s   /JAq!Q: :D D BA r?A2q)* 	!QZ1Q3'	A& QVVQ/13 
4	!Q		1qvv:q.!a%(166A:q.!a%*@AQU)QAYA./1 
2	3 		q!1%	&Aq	{(;	!QAY!Q(	)+ 	!&&!qxl	"A&	'	!Q		(2q/1a!e9Q;/!Q8	9; 	!&&!&&	AeH<	"OHROQ$GH	I	!Q		(2q/166*Q1q5	!,<=	>@ 	!QVVaZ166*	!Q'/1"qvv+q*I)IJ	K	!Q		!aRRTAX,q.!a%(!&&1bdQh<Q3G*GHJ 
KL 	!aR166(	!!Q')9!Q)?@	A	!Q		!aR1Q3A;1q5	!45	68 	!Q!AFF(	"A&	'!Q)9	1qvv:A&1q5	!4q!f=	>@
 	!&&!&&	AEE7	A
1.	/	!B$		(2q/2qs1u:.2q/166*, 
-.
 	(2q/166	"QUUG	A
1.	/	!QrT		(2q/2qs1u:.2q/166*, 
-. 	(2q/1a	 1661+	>!$$mA&6:	;	(2q/AEE61Q3<!Q@A	B	!&&!QAYq[)Q1q5	" 
 	(2q/1a	 1a&	+]1-=qA	B	(1a.2qs8+Q!Wb!A#h?@	A	!A#q1u+q!$q!QU)}a&@)L	MO 	!qc61q1u:A.AE11EEqIJ	!a%	vA	1~1v&>?A!qse	QVVaZQqS)'!aff*ac*BBQVV$%%&!_5QVVaZQqS)'!aff*ac*BBQVV$%%&!_56 
7 
!Q		!A#qsacAaC!A#I/0	13 
B	B!q1ug	qb!Jq"--qQx8	9	!Q		1"a1a&!	"$
 "aAFF8SVd2a4j1"oc!DG)n.L%LM 	!x1~x1~.	$r(Ad1T!W9o-hqa|C"QK7OPTUWPX7X.YY"1T!W9ohqa|C"QK7OPTUWPX7X.YYZ [2aL!"#DAJ,0 r(41:%tAd1gIx$q!*SQRSUQUVWQW[@XY]^`Ya@a7b'b()$qay/(9(1T!QZ<PSTUVXTXYZTZP[C[\`ac\dCd:e(e(f gr"uQw<  !"  
 
		(2q/8Aq>B !8Aq>BBD 
EF 	!&&!x1~q1u-	AaC!Gqb!$r!t*,S47^;AaC!GjnQ.1"55Az"~a/01AaC!GSV#% 
& 
		(2q/1a(1qb!*q!Qi@	AC 	!Q!Q	AQQJ7	8	!A#q!RT"#	$	Aq!lLI	JL QVVJQtAwY(aS	q!q1uai.(Q$q'	)BBq!a!A#g,&wq!DG)'<<> 
?	!Q	6Aq6AA<"89; 	
!Xa^
A-- 	affaQVV$	AaC!GQAaCAx1~,=!=AaC!GQQ'AaCAx1~4E)EG 
Hr!t9
1Q3Z
  !Q1WaK 0
1 
		QVVaZA&Q"Q1q5!# 
$% 	
1Q3!Q
	!B$q& 11AaQVVQqS!
DB!"
"a!A#g	.uQqSz1}	<	1q!$WQqS1Wa%88GAaCOGAaC!GQ$77acAgq)'!A#q/9: ;Agac1o%gac1o5AwqsAwqsQw':: 1q!,WQqS!_<= >	? 
@
@ 
		!Xa^Q*a!A#gq[(2q/15QAaC!Q0a%Aq1u%' 
() 	!q166z1Q3	QVVaZQVVT!W!=q!@@QUGAJQ88!hq!n,d1g67Xa^a'(Xa^1CT!W)Mq)PPR 
S 
5QVV$a''AFFQJ75QVV$$U1qvv:%66q1q5zA  
 
!ac'1a1Q3
AFF";aAYG	HJ 	!&&Aq1u:	QUC1I		QQ(QQ)@@a'1"d1g.wq1ud1g/FF#AE473GAtAw4GGH I!T!W%gaa&99; 
<
<
 
		!a%#QQVVaR" 
#	$ 	!&&HQNHQN3	QtAwY!$q')4$q'	?1+<T!W+DaQi" 
#			(2q/1661-8B?AFF/KaQRSTQTVW[Y	Z	\ 	(1a.	HQNHQN;	T!V!A !!%"!!#
 "$s2a46{41:'=a'?R'H1&L!LO Ad1gItAw&Ad1gI!
" 
		(2q/HQOQ78B?Q/AQ') 
*+& 	(1a.	AFFHQN3	RU1W&41:c!B$q&k1$r(:<< >?tAqz\K Ad1gIAd1gItAw&)
* 
		(2q/HQNA;+AAFF+- 
./" 	!QZ1Q31Q37Q;/	q%!a!$	$Q	Q1W'=	=	QQ(1q$q')BBaDG,,WQqS1Wd1g-FFaQQ001q1d1g1NNDG$WQqS1Wq[$q'%BBD 
E
E
 
		!QVVQVVQ'A#q1ua1%A#q!ac'1Q3'QVVQVVRT*, 
-
. 	!Q!QA'	QtAwY#aQi.0aQi$q'$qay/"91jJ 
K	!A#q!Q1%&	'	!QVVQQ3 Q1%  	" 
#	$( 	!QQ1Q3K	CGfQm+j891adQqSj1n;MNQB1":uQx*Q*;;<a!eaZG3q61a4!A#:>*Aq!taczA~&') 
* 
!A#q"Q$"#	$	"Qr!tAQBqAa 
	r^   c                   ^ ^^	^
^^ [        [        [        S5      5      u  mm	m
m[        S5      mUU	U
U UU4S jnUU4S jnU" TT-   // TTT-   // [        [	        ST-
  5      TT-  -  [        T5      -  [        TT5      -  [	        ST-
  5      TTT-   -  -  /5      [        SS//5      [        TT-   S/STT-   //5      U5        U4S jn[        S	[        T5      -  5      n[        S	[        T5      -  5      n[        S	[        T5      -  5      [        S	-  -
  n[        S	[        T5      -  5      nU" T// TTT[        R                  -
  // [        [        [        5      TT[        R                  -
  -  -  XV-  XG-  -
  -  [        [        5      TT-  -  XF-  XW-  -   -  [        [        5      TT-  -  /5      [        / S
Q/5      [        T[        R                  -
  SS/TT[        R                  /SST//5      U5        g )Nabczrhoc                 L   > TR                  [        XX#TTT	T
T/XEXg5
      5        g rb   )re   MeijerFormula)anrg   bmrh   rr   rs   rt   matcherrk   rl   r[   rm   r   rn   s           r\   ro   !add_meijerg_formulae.<locals>.add  s+    bba!Q3&'A8 	9r^   c                 $  > U R                   S   nU R                  u  p#Sn[        X-
  R                  5       5      (       d  SnX2p2[        X-
  R                  5       5      (       d  X-
  S:  a  g X!/nU(       a  X/nTUTX-
  0[	        U// U/ 5      4$ )Nr   FT)r   r   r]   simplify
G_Function)rj   rZ   yrn   swappedlrk   r   s         r\   detect_uppergamma/add_meijerg_formulae.<locals>.detect_uppergamma  s    GGAJwwae%%'((G!%!!#$$	FAQ15!:qc2q"#===r^   rW   r   ry   c           
        > U R                   S   nU R                  u  p#n[        X#-
  R                  5       5      S:X  aT  [        X4-
  R                  5       5      S:X  a  g[        R
                  [        R
                  [        R                  4nX#UpnO[        X-
  R                  5       5      S:X  a4  [        R
                  [        R                  [        R
                  4nX#UpxnO3[        R                  [        R
                  [        R
                  4nX#Upvn[        X-
  R                  5       5      S:w  d\  [        X-
  R                  5       5      S:w  d=  [        X-
  R                  5       5      [        R
                  :w  d  X-
  S:  d  X-
  S:  a  gT
U0[        U// U V	s/ s H  o[        R
                  -
  U	-   PM     sn	/ 5      4$ s  sn	f )z.https://functions.wolfram.com/07.34.03.0984.01r   N)r   r   r]   r   r   r   Zeror   )rj   rZ   uvwsigx1x2r   trk   s             r\   detect_3113)add_meijerg_formulae.<locals>.detect_3113  sg   GGAJ''a!%!!#$)ae%%'(A-66166166*CaABAae%%'(A-vvqvvqvv.!rrvvqvvqvv.!r16##%&!+16##%&!+15""$%/
afqj1vz1#rC+HCqJNC+H"MMM+Hs   $Grx   )rz   r   r   )listmapr	   rL   r#   r   r$   r'   r   r!   r+   r   r*   r   r   )rm   ro   r   r   sc_S_rs   rk   rl   r[   r   rn   s   `       @@@@@r\   add_meijerg_formulaer     s   c%()JAq!Q
,C9 9> S	2QW~ra!eQV#CF*:a+;;a!eQS\)+ 	,Axq"1s7|,-N2 	Ad1gIA	QtAwYB	Ad1gIA	B
1T!W9AR!QAFF
#RRQZ("%!#+6RAqtbd{+RA 	  	
|QVVR#aAFF^aAY?@r^   c                    ^  U 4S jnU$ )z?Create a function that simplifies rational functions in ``z``. c                    > U R                  5       u  pUR                  5       n[        UT5      R                  [        UT5      5      u  p1nX1R	                  5       -  UR	                  5       -  $ )z5Efficiently simplify the rational function ``expr``. )as_numer_denomr   rP   cancelas_expr)exprnumerdenomr[   rn   s       r\   simpmake_simp.<locals>.simp  sX    **,ua.//UA?%==?"U]]_44r^   rw   )rn   r   s   ` r\   	make_simpr     s    5 Kr^   c                  V    [         (       a  U  H  n[        USS9  M     [        5         g g )N )end)r   print)argsrk   s     r\   debugr     s%    {A!  r^   c                      ^  \ rS rSrSrU 4S jr\S 5       r\S 5       r\S 5       r	U 4S jr
S rS	 rS
 rS rSrU =r$ )rd   i  z'A generalized hypergeometric function. c                    > [         TU ]  U 5      n[        [        [	        [
        U5      5      6 Ul        [        [        [	        [
        U5      5      6 Ul        U$ rb   )super__new__r   r   r   r   rg   rh   )r`   rg   rh   obj	__class__s       r\   r   Hyper_Function.__new__  sD    goc"S_-.S_-.
r^   c                 2    U R                   U R                  4$ rb   )rg   rh   selfs    r\   r   Hyper_Function.args  s    !!r^   c                 V    [        U R                  5      [        U R                  5      4$ rb   )lenrg   rh   r   s    r\   sizesHyper_Function.sizes  s    DGGc$''l++r^   c                 :    [        S U R                   5       5      $ )z\
Number of upper parameters that are negative integers

This is a transformation invariant.
c              3   r   #    U  H-  n[        UR                  =(       a    UR                  5      v   M/     g 7frb   )bool
is_integeris_negative.0rZ   s     r\   	<genexpr>'Hyper_Function.gamma.<locals>.<genexpr>  s%     IA4677s   57)sumrg   r   s    r\   r#   Hyper_Function.gamma  s     IIIIr^   c                 R   > [         TU ]  5       U R                  U R                  4-   $ rb   )r   _hashable_contentrg   rh   r   r   s    r\   r    Hyper_Function._hashable_content  s*    w(*dgg.  	r^   c                 D    [        U R                  U R                  U5      $ rb   )r?   rg   rh   )r   args     r\   __call__Hyper_Function.__call__  s    TWWdggs++r^   c                     [        U R                  [        5      [        U R                  [        5      p!S nU R                  U" U5      U" U5      4$ )af  
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           
          [        U R                  5       5      n [        S U  5       5      (       d  U R                  S S9  [	        U  VVs/ s H  u  pU(       d  M  U[        U5      4PM     snn5      n U $ s  snnf )Nc              3   H   #    U  H  n[        US    [        5      v   M     g7f)r   N)
isinstancer   r   s     r\   r   >Hyper_Function.build_invariants.<locals>.tr.<locals>.<genexpr>$  s     =fz!A$,,fs    "c                     [        U S   5      $ Nr   r   rZ   s    r\   <lambda>=Hyper_Function.build_invariants.<locals>.tr.<locals>.<lambda>%  s    *:1Q4*@r^   key)r   itemsanysorttupler   )bucketmodvaluess      r\   tr+Hyper_Function.build_invariants.<locals>.tr"  sn    &,,.)F=f=== @A& &;3 /S#f+.&  FMs   A7
A7
)rT   rg   r]   rh   r#   )r   abucketsbbucketsr   s       r\   build_invariantsHyper_Function.build_invariants  sB    F "$''5143G(	 

BxL"X,77r^   c                    U R                   UR                   :w  a  gU R                  U R                  UR                  UR                  4 Vs/ s H  n[        U[        5      PM     snu  p4pVSnXS4Xd44 H  u  p[        [        UR                  5       5      [        U	R                  5       5      -   5       H  n
X;  d!  X;  d  [        X   5      [        X   5      :w  a      g[        X   5      n[        X   5      nUR                  5         UR                  5         [        X5       H  u  pU[        X-
  5      -  nM     M     M     U$ s  snf )zWEstimate how many steps it takes to reach ``func`` from self.
Return -1 if impossible. ry   r   )r#   rg   rh   rT   r]   setr   keysr   r   zipabs)r   rj   params	oabuckets	obbucketsr   r   diffr   obucketr   l1l2ijs                  r\   
difficultyHyper_Function.difficulty,  s     ::#77DGGTWWdgg>4@> 594G>4@0	h !) 57LMOF4.glln1EEF%3+=v{+s7</@@&+&','		KDACJ&D ( G  N !4@s   E	c                 J   U R                    H?  nU R                   H,  nX-
  R                  (       d  M  X-
  R                  SL d  M+      g   MA     U R                    H  nUS:X  d  M    g   U R                   H)  nUR                  (       d  M  UR                  (       d  M)    g   g)aA  
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)rg   rh   r   r   is_nonpositive)r   rk   rl   s      r\   _is_suitable_origin"Hyper_Function._is_suitable_originC  s      AWWE%%%15*=*=*F    AAv  A||| 0 0 0  r^   rw   )__name__
__module____qualname____firstlineno____doc__r   propertyr   r   r#   r   r   r   r  r  __static_attributes____classcell__r   s   @r\   rd   rd     sh    2 " " , , J J,-8^. r^   rd   c                   d   ^  \ rS rSrSrU 4S jr\S 5       rU 4S jrS r	S r
\S 5       rS	rU =r$ )
r   i`  zA Meijer G-function. c                 F  > [         TU ]  U 5      n[        [        [	        [
        U5      5      6 Ul        [        [        [	        [
        U5      5      6 Ul        [        [        [	        [
        U5      5      6 Ul        [        [        [	        [
        U5      5      6 Ul	        U$ rb   )
r   r   r   r   r   r   r   rg   r   rh   )r`   r   rg   r   rh   r   r   s         r\   r   G_Function.__new__c  sr    goc"S_-.S_-.S_-.S_-.
r^   c                 ^    U R                   U R                  U R                  U R                  4$ rb   )r   rg   r   rh   r   s    r\   r   G_Function.argsk  s!    $''47733r^   c                 :   > [         TU ]  5       U R                  -   $ rb   )r   r   r   r   s    r\   r   G_Function._hashable_contento  s    w(*TYY66r^   c                 p    [        U R                  U R                  U R                  U R                  U5      $ rb   )rK   r   rg   r   rh   )r   rn   s     r\   r   G_Function.__call__r  s%    tww$''1==r^   c                    ^ [        S5       Vs/ s H  n[        [        5      PM     sn=nu  p4pV[        X R                  U R
                  U R                  U R                  45       H+  u  pxU H   n	U[        U	5         R                  U	5        M"     M-     [        US5       H;  u  pzUR                  5        H"  u  pUS   mUR                  U4S jU
S9  XU'   M$     M=     [        U Vs/ s H  n[        U5      PM     sn5      $ s  snf s  snf )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]})

r|   )TFFTr   c                    > U T-
  $ rb   rw   )rZ   x0s    r\   r   ,G_Function.compute_buckets.<locals>.<lambda>  s	    Rr^   )r   reverse)ranger   r   r  r   rg   r   rh   r]   re   r   r   r   dict)r   r
  dictspanpappbmpbqdiclisrZ   flipmr   r   r&  s                 @r\   compute_bucketsG_Function.compute_bucketsu  s    0 BGq%JAk$&7%JJ"#EGGTWWdggtww#GHHCE!H$$Q'  I U$>?ICIIK1X

/
>A ( @ u-u!d1gu-.. &K .s   D*Dc                     [        U R                  5      [        U R                  5      [        U R                  5      [        U R                  5      4$ rb   )r   r   rg   r   rh   r   s    r\   	signatureG_Function.signature  s1    DGGc$''lCL#dgg,GGr^   rw   )r  r  r  r  r  r   r  r   r   r   r4  r7  r  r  r  s   @r\   r   r   `  sE      4 47>#/J H Hr^   r   rZ   c                   >    \ rS rSrSrS rS	S jr\S 5       rS r	Sr
g)
rf   i  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                 X   U R                   R                   Vs/ s H  n[        U-   PM     nnU R                   R                   Vs/ s H  n[        U-   S-
  PM     nn[        [	        U6 -  U R
                  [	        U6 -  -
  n[        U[        5      nUR                  " 5       S-
  nU/n[        U5       H=  n	UR                  U R
                  US   R                  U R
                  5      -  5        M?     [        U5      U l        [        S/S/U-  -   /5      U l        [        U5      n
U
R                  S[!        US5      5      n
UR"                  " 5       SS nUR%                  5         U
R'                  U[        U/5      * UR"                  " 5       S   -  5      U l        gs  snf s  snf )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.
rW   ry   r   N)rj   rg   _xrh   r   rn   rQ   degreer)  re   r  rL   rr   rs   rM   
col_insertrN   
all_coeffsr(  
row_insertrt   )r   closed_formrk   afactorsrl   bfactorsr   rP   n_r3  r   s               r\   _compute_basisFormula._compute_basis  sS    %)IILL1LqBFL1(,		51BFQJ5#x. 466#x.#88D"~KKMAMqAHHTVVAbEJJtvv../  !s1u&FLLE!QK(OOab!			a&!+doo.?.B!BC# 25s   F"F'Nc                    [        U5      n[        U5      n[        U5       Vs/ s H  oR                  U5      (       d  M  UPM     nnX l        X@l        XPl        X`l        Xpl        Xl        Ub  U R                  U5        g g s  snf rb   )	r   hasrn   r
   rr   rs   rt   rj   rE  )	r   rj   rn   ri   r
   rr   rs   rt   rZ   s	            r\   __init__Formula.__init__  st    AJcl%g.>.((1+1.>	
 ?$  ?s   BBc                 v    [        S [        U R                  U R                  5      [        R
                  5      $ )Nc                     XS   US   -  -   $ Nr   rW   rw   r   r3  s     r\   r   %Formula.closed_form.<locals>.<lambda>      !aD1I+r^   r   r  rs   rr   r   r   r   s    r\   r@  Formula.closed_form  %    -s466466/BAFFKKr^   c                   ^ ^! SSK Jn  UR                  nUR                  n[	        U5      [	        T R
                  R                  5      :w  d,  [	        U5      [	        T R
                  R                  5      :w  a  [        S5      e/ nT R                   H~  nUT R
                  R                  R                  ;   a  UR                  U5        M:  UT R
                  R                  R                  ;   a  UR                  U5        Mq  [        SU< 35      e   [        U6  Vs/ s H+  n[        [        [        T R                  U5      5      5      PM-     nnX44 V	s/ s H  n	[        U	[         5      PM     sn	u  pX4 VVVs/ s H2  nUR#                  5        VVs0 s H  u  pmU[	        U5      _M     snnPM4     snnnu  pT R                   Vs/ s H  nS/PM     nn/ n[%        5       nU GHW  m!T R
                  R                  T R
                  R                  4 V	s/ s H  n	[        U	U!4S j5      PM     sn	u  nnU
U4UU44 GHW  u  nn['        [        UR)                  5       5      [        UR)                  5       5      -   5       GH  nUU;  d$  UU;  d  [	        UU   5      [	        UU   5      :w  a    Mt  [        T R                  U5       H  u  pmT!U   R*                  (       a  M  UU    Vs/ s H  nUR-                  U5      (       d  M  UPM     nnT!R/                  5       nUU==   U-  ss'   U HY  nUU    HM  nU" UR1                  U5      U-
  U5      u  nUR*                  (       a  [        S5      eUR                  U5        MO     M[     M     GM     GMZ     / n[        T R                  U5       Hd  u  pmT!U   n[3        [5        U5      5      n[7        [9        U5      5      nUR                  [;        UUS-   5       V s/ s H  n UU -   PM
     sn 5        Mf     UR=                  U 4S j[        U6  5       5        GMZ     U$ s  snf s  sn	f s  snnf s  snnnf s  snf s  sn	f s  snf s  sn f )	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                 8   > [        U R                  T5      5      $ rb   )r]   xreplace)rZ   repls    r\   r   -Formula.find_instantiations.<locals>.<lambda>	  s    U1::d;K5Lr^   zValue should not be truerW   c           	   3   t   >#    U  H-  n[        [        [        TR                  U5      5      5      v   M/     g 7frb   )r*  r   r  r
   )r   r   r   s     r\   r   .Formula.find_instantiations.<locals>.<genexpr>#  s+     YHX1d4DLL!(<#=>>HXs   58)sympy.solversrU  rg   rh   r   rj   	TypeErrorr
   r   re   
ValueErrorr   r*  r   r  rT   r]   r   r	   r   r   free_symbolsrH  copyrW  r4   minr5   maxr)  extend)"r   rj   rU  rg   rh   symbol_valuesrk   r   	base_replr  r   r   r   valsa_invb_invrD  critical_valuesresult_nsymb_asymb_br  r   r   exprsrepl0targetn0a0min_max_rC  rX  s"   `                                @r\   find_instantiationsFormula.find_instantiations  s    	(WWWWr7c$)),,''3r7c$)),,6G+GKLLADIILL%%%$$R(diill'''$$R( 9:"= > >  &}575F $s4<<89:5 	 7ACIfd651I'242F 6<\\^D^'!CI^D24(,51A35WD#yy||TYY\\:<:F #6+LM:<NFF%-v$668J#KtFKKM2T',,.5IIJC6)s'/A"6#;/3ws|3DD#&t||_#E7//$29#, N,$$((1+, N $		aB$)D*0+&+DMM%,@6,I2&N#%??*45O*P$P $B	 +6 %* $F	 K $L$ "4<<AGAaB T+D"3t9-DMM5tax3H"I3Ha263H"IJ	  B
 YQWHXYY7 8 I7ID 45< !O #JsB   2QQ=QQ.QQQ".Q'Q'Q,Q)rr   rs   rt   rj   r
   rn   )NNN)r  r  r  r  r  rE  rI  r  r@  ru  r  rw   r^   r\   rf   rf     s-    .D4%$ L L:r^   rf   c                   $    \ rS rSrSrS rS rSrg)FormulaCollectioni)  z,A collection of formulae to use as origins. c                    0 U l         0 U l        / U l        [        U R                  5        U R                   H  nUR                  R
                  n[        UR                  5      S:  a-  U R                   R                  U/ 5      R                  U5        M_  UR                  R                  5       nXR                  R                  U0 5      U'   M     g)z6Doing this globally at module init time is a pain ... r   N)symbolic_formulaeconcrete_formulaerm   r   rj   r   r   r
   
setdefaultre   r   )r   fr   invs       r\   rI  FormulaCollection.__init__,  s    !#!#T]]#
 AFFLLE199~!&&11%<CCAFff--/DE&&11%<SA r^   c                 \   UR                  5       nUR                  nX0R                  ;   a$  X R                  U   ;   a  U R                  U   U   $ X0R                  ;  a  g/ nU R                  U    H{  nUR	                  U5      nU Ha  nUR
                  R                  U5      nUR                  5       (       d  M5  UR                  U5      n	U	S:X  a  MN  UR                  XXX45        Mc     M}     UR                  S S9  U H  u  ppX[        XR                  S/ UR                  R                  U5      UR                  R                  U5      UR                   R                  U5      5      n[#        S UR                  UR                   UR                  4 5       5      (       a  M  Us  $    g)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)
Nry   c                     U S   $ r   rw   r   s    r\   r   1FormulaCollection.lookup_origin.<locals>.<lambda>k  s    AaDr^   r   c              3   ~   #    U  H3  oR                  [        R                  [        [        * [        5      v   M5     g 7frb   )rH  r   NaNr   r   )r   es     r\   r   2FormulaCollection.lookup_origin.<locals>.<genexpr>o  s(     N;MauuQUUBS11;Ms   ;=)r   r   r{  rz  ru  rj   rW  r  r  re   r   rf   rn   rr   subsrs   rt   r   )r   rj   r~  r   possibler}  replsrX  func2r  rD  f2s               r\   lookup_originFormulaCollection.lookup_origin?  sn   * ##%

***--e44))%055 ...''.A))$/E-0022''-2:Q 67  / 	.)!)AQT2qssxx~CCHHTNACCHHTN4BNBDD"$$;MNNN		 "* r^   )r{  rm   rz  Nr  r  r  r  r  rI  r  r  rw   r^   r\   rx  rx  )  s    7F&3r^   rx  c                   4    \ rS rSrSrS r\S 5       rS rSr	g)r   iu  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                     XX44 Vs/ s H"  n[        [        [        [        U5      5      6 PM$     snu  pp4[	        XX45      U l        XPl        X`l        Xl        Xpl	        Xl
        Xl        g s  snf rb   )r   r   r   r   r   rj   rn   r
   _matcherrr   rs   rt   )r   r   rg   r   rh   rn   r
   rr   rs   rt   r   r   s               r\   rI  MeijerFormula.__init__  sc    AC@PQ@P1%c&!n!56@PQrr.	 Rs   )A,c                 v    [        S [        U R                  U R                  5      [        R
                  5      $ )Nc                     XS   US   -  -   $ rM  rw   rN  s     r\   r   +MeijerFormula.closed_form.<locals>.<lambda>  rP  r^   rQ  r   s    r\   r@  MeijerFormula.closed_form  rS  r^   c                    UR                   U R                  R                   :w  a  gU R                  U5      nUb  Uu  p4[        UR                  UR
                  UR                  UR                  U R                  / U R                  R                  U5      U R                  R                  U5      U R                  R                  U5      S5
      $ g)zg
Try to instantiate the current formula to (almost) match func.
This uses the _matcher passed on init.
N)r7  rj   r  r   r   rg   r   rh   rn   rr   r  rs   rt   )r   rj   ri   r  newfuncs        r\   try_instantiateMeijerFormula.try_instantiate  s    
 >>TYY000mmD!?MD WZZWZZ!%!%T!2DFFKK4E!%T!2D: : r^   )rr   rs   rt   r  rj   r
   rn   N)
r  r  r  r  r  rI  r  r@  r  r  rw   r^   r\   r   r   u  s'     L L:r^   r   c                   $    \ rS rSrSrS rS rSrg)MeijerFormulaCollectioni  z5
This class holds a collection of meijer g formulae.
c                     / n[        U5        [        [        5      U l        U H5  nU R                  UR                  R
                     R                  U5        M7     [        U R                  5      U l        g rb   )r   r   r   rm   rj   r7  re   r*  )r   rm   formulas      r\   rI   MeijerFormulaCollection.__init__  sV    X&#D)GMM',,00188A  T]]+r^   c                     UR                   U R                  ;  a  gU R                  UR                       H  nUR                  U5      nUc  M  Us  $    g)z)Try to find a formula that matches func. N)r7  rm   r  )r   rj   r  ri   s       r\   r  %MeijerFormulaCollection.lookup_origin  sF    >>.}}T^^4G))$/C
 5r^   )rm   Nr  rw   r^   r\   r  r    s    ,r^   r  c                       \ rS rSrSrS rSrg)Operatori  aL  
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                    U R                   R                  5       nUR                  5         U/nUSS  H  nUR                  U" US   5      5        M     US   US   -  n[	        USS USS 5       H  u  pWXeU-  -  nM     U$ )aX  
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
rW   Nry   r   )_polyr>  r(  re   r  )r   r   opcoeffsdiffsr[   rds           r\   applyOperator.apply  s     &&(ALLE"I' 1IeAhqr
E!"I.DA1HA /r^   rw   N)r  r  r  r  r  r  r  rw   r^   r\   r  r    s    4r^   r  c                       \ rS rSrSrS rSrg)MultOperatori  z Simply multiply by a "constant" c                 .    [        U[        5      U l        g rb   )rQ   r;  r  )r   ps     r\   rI  MultOperator.__init__  s    !R[
r^   r  N)r  r  r  r  r  rI  r  rw   r^   r\   r  r    s
    +!r^   r  c                   $    \ rS rSrSrS rS rSrg)ShiftAi  zIncrement an upper index. c                 z    [        U5      nUS:X  a  [        S5      e[        [        U-  S-   [        5      U l        g )Nr   z"Cannot increment zero upper index.rW   r   r^  rQ   r;  r  )r   ais     r\   rI  ShiftA.__init__  s4    R[7ABB"R%!)R(
r^   c                 H    SSU R                   R                  5       S   -  -  $ )Nz<Increment upper %s.>rW   r   r  r>  r   s    r\   __str__ShiftA.__str__  s$    &!DJJ,A,A,CA,F*FGGr^   r  Nr  r  r  r  r  rI  r  r  rw   r^   r\   r  r    s    %)Hr^   r  c                   $    \ rS rSrSrS rS rSrg)ShiftBi  zDecrement a lower index. c                     [        U5      nUS:X  a  [        S5      e[        [        US-
  -  S-   [        5      U l        g )NrW   z"Cannot decrement unit lower index.r  r   bis     r\   rI  ShiftB.__init__  s8    R[7ABB"b1f+/2.
r^   c                 N    SSU R                   R                  5       S   -  S-   -  $ )Nz<Decrement lower %s.>rW   r   r  r   s    r\   r  ShiftB.__str__  s)    &!DJJ,A,A,CA,F*F*JKKr^   r  Nr  rw   r^   r\   r  r    s    $/Lr^   r  c                   $    \ rS rSrSrS rS rSrg)UnShiftAi  zDecrement an upper index. c                    [        [        [        XU/5      5      u  pnXl        X l        X0l        [        U5      n[        U5      nUR                  U5      S-
  nUS:X  a  [        S5      e[        XE-  [        5      nU H  nU[        [        U-   [        5      -  nM     [        S5      n[        XX-  U-
  U5      =pU H  nXUS-
  R                  U5      -   -  n	M     U	R                  S5      * nUS:X  a  [        S5      e[        [        U	R                  5       SS U5      R                  5       R                  U[        U-  S-   5      [        5      n	[        X-
  U-  [        5      U l        g)Note: i counts from zero! rW   r   z"Cannot decrement unit upper index.Az0Cannot decrement upper index: cancels with lowerNry   r   r   r   _ap_bq_ipopr^  rQ   r;  r	   as_polynthr>  r   r  r  )r   rg   rh   r
  rn   r  r3  rk   r  rC  Drl   b0s                r\   rI  UnShiftA.__init__  sN   Wrqk23	"X"XVVAY]7ABBrNAb1fb!!A  #JRTBY""Aa!e__Q'''A  eeAhY7 2 3 3 allnSb)1-557<<Q2	JBO15"*b)
r^   c                 \    SU R                   < SU R                  < SU R                  < S3$ )Nz<Decrement upper index # of , .>r  r  r  r   s    r\   r  UnShiftA.__str__/  "    ;?778<$((L 	Lr^   r  r  r  r  Nr  rw   r^   r\   r  r    s    %*BLr^   r  c                   $    \ rS rSrSrS rS rSrg)UnShiftBi4  zIncrement a lower index. c                    [        [        [        XU/5      5      u  pnXl        X l        X0l        [        U5      n[        U5      nUR                  U5      S-   nUS:X  a  [        S5      e[        [        US-
  -  [        5      nU H   nU[        [        U-   S-
  [        5      -  nM"     [        S5      n[        US-
  U-  U-
  S-   U5      n	[        XH5      n
U H  nXUR                  U5      -   -  n
M     U
R                  S5      nUS:X  a  [        S5      e[        [        U
R                  5       SS U5      R                  5       R                  U[        US-
  -  S-   5      [        5      n
[        Xj-
  U-  [        5      U l        g)r  rW   r   z Cannot increment -1 lower index.rr   z*Cannot increment index: cancels with upperNry   r  )r   rg   rh   r
  rn   r  r3  rl   rr   r  rC  rk   r  s                r\   rI  UnShiftB.__init__7  sg   Wrqk23	"X"XVVAY]7?@@R!Vb!Ab1fqj"%%A  #J"q&!b1$a(JAaiil"#A  UU1X7IJJallnSb)1-557<<r26{Q !#% 15"*b)
r^   c                 \    SU R                   < SU R                  < SU R                  < S3$ )Nz<Increment lower index #r  r  r  r  r   s    r\   r  UnShiftB.__str__Y  r  r^   r  Nr  rw   r^   r\   r  r  4  s    $ *DLr^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerShiftAi^  zIncrement an upper b index. c                 R    [        U5      n[        U[        -
  [        5      U l        g rb   r   rQ   r;  r  r  s     r\   rI  MeijerShiftA.__init__a  s    R["r'2&
r^   c                 B    SU R                   R                  5       S   -  $ )Nz<Increment upper b=%s.>rW   r  r   s    r\   r  MeijerShiftA.__str__e  s    (DJJ,A,A,CA,FGGr^   r  Nr  rw   r^   r\   r  r  ^  s    ''Hr^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerShiftBii  zDecrement an upper a index. c                 X    [        U5      n[        SU-
  [        -   [        5      U l        g rV   r  r  s     r\   rI  MeijerShiftB.__init__l  s!    R[!b&2+r*
r^   c                 H    SSU R                   R                  5       S   -
  -  $ )Nz<Decrement upper a=%s.>rW   r  r   s    r\   r  MeijerShiftB.__str__p  s$    (A

0E0E0G0J,JKKr^   r  Nr  rw   r^   r\   r  r  i  s    '+Lr^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerShiftCit  zIncrement a lower b index. c                 T    [        U5      n[        U* [        -   [        5      U l        g rb   r  r  s     r\   rI  MeijerShiftC.__init__w  s    R[2#(B'
r^   c                 D    SU R                   R                  5       S   * -  $ )Nz<Increment lower b=%s.>rW   r  r   s    r\   r  MeijerShiftC.__str__{  s"    (TZZ-B-B-DQ-G,GHHr^   r  Nr  rw   r^   r\   r  r  t  s    &(Ir^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerShiftDi  zDecrement a lower a index. c                 X    [        U5      n[        US-
  [        -
  [        5      U l        g rV   r  r  s     r\   rI  MeijerShiftD.__init__  s!    R["q&2+r*
r^   c                 H    SU R                   R                  5       S   S-   -  $ )Nz<Decrement lower a=%s.>rW   r  r   s    r\   r  MeijerShiftD.__str__  s$    (DJJ,A,A,CA,F,JKKr^   r  Nr  rw   r^   r\   r  r    s    &+Lr^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerUnShiftAi  zDecrement an upper b index. c           
      $  ^ [        [        [        XX4U/5      5      u  pp4nXl        X l        X0l        X@l        XPl        [        U5      n[        U5      n[        U5      n[        U5      nUR                  U5      S-
  n[        S[        5      [        S U 5       5      -  [        S U 5       5      -  n[        S5      n	[        Xy-
  U	5      m[        Xi5      [        U4S jU 5       5      -  [        U4S jU 5       5      -  n
U
R                  S5      nUS:X  a  [        S5      e[        [        U
R                  5       S	S
 U	5      R!                  5       R#                  X[        -
  5      [        5      n
[        X-
  U-  [        5      U l        g	)r  rW   c              3   P   #    U  H  n[        U[        -
  [        5      v   M     g 7frb   rQ   r;  r   rl   s     r\   r   *MeijerUnShiftA.__init__.<locals>.<genexpr>  s     <AtAFB//   $&c              3   P   #    U  H  n[        [        U-
  [        5      v   M     g 7frb   r   r  s     r\   r   r    s"     Ca^`YZDaQSDTDT^`r  r  c              3   4   >#    U  H  nTS -   U-
  v   M     g7frW   Nrw   r   rk   r  s     r\   r   r    s     62aq1uqy2s   c              3   6   >#    U  H  nT* U-   S -
  v   M     g7fr  rw   r  s     r\   r   r    s     =WTVqrAvzTVs   r   z(Cannot decrement upper b index (cancels)Nry   )r   r   r   _anr  _bmr  r  r  rQ   r;  r   r	   r  r^  r>  r   r  r  )r   r   rg   r   rh   r
  rn   r  r3  r  rC  r  r  s               @r\   rI  MeijerUnShiftA.__init__  sH    Wrrq.A!BC"X"X"X"XVVAY]BK$<<<<tCa^`Ca?aa#JOJ62666=WTV=W9WWUU1X7GHHallnSb)1-557<<QRH"M15"*b)
r^   c                     SU R                   < SU R                  < SU R                  < SU R                  < SU R                  < S3$ )Nz<Decrement upper b index #r  r  r  r  r	  r  r
  r  r   s    r\   r  MeijerUnShiftA.__str__  .    EIWW&*hh$((DHHN 	Nr^   r	  r  r
  r  r  r  Nr  rw   r^   r\   r  r    s    '*<Nr^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerUnShiftBi  zIncrement an upper a index. c           
      h   [        [        [        XX4U/5      5      u  pp4nXl        X l        X0l        X@l        XPl        [        U5      n[        U5      n[        U5      n[        U5      nUR                  U5      S-   n[        U[        5      nU H   n	U[        SU	-
  [        -   [        5      -  nM"     U H   n	U[        U	S-
  [        -
  [        5      -  nM"     [        S5      n
[        X-   S-
  U
5      n[        SU
5      nU H  nX* U-   -  nM     U H
  nXU-
  -  nM     UR                  S5      nUS:X  a  [        S5      e[        [        UR                  5       SS U
5      R                  5       R!                  U
SU-
  [        -   5      [        5      n[        X-
  U-  [        5      U l        g)r  rW   rr   r   z(Cannot increment upper a index (cancels)Nry   r   r   r   r	  r  r
  r  r  r  rQ   r;  r	   r  r^  r>  r   r  r  r   r   rg   r   rh   r
  rn   r  r3  rk   rr   r  rC  rl   r  s                  r\   rI  MeijerUnShiftB.__init__  s    Wrrq.A!BC"X"X"X"XVVAY]BKAa!ebj"%%A Aa!ebj"%%A  #J!QAJA"q&MA Aa%LA  UU1X7GHHallnSb)1-557<<q2v{! 15"*b)
r^   c                     SU R                   < SU R                  < SU R                  < SU R                  < SU R                  < S3$ )Nz<Increment upper a index #r  r  r  r  r   s    r\   r  MeijerUnShiftB.__str__  r  r^   r  Nr  rw   r^   r\   r  r    s    '%*NNr^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerUnShiftCi  zDecrement a lower b index. c           
      Z   [        [        [        XX4U/5      5      u  pp4nXl        X l        X0l        X@l        XPl        [        U5      n[        U5      n[        U5      n[        U5      nUR                  U5      S-
  n[        S[        5      nU H  n	U[        U	[        -
  [        5      -  nM     U H  n	U[        [        U	-
  [        5      -  nM     [        S5      n
[        Xz-   U
5      n[        Xj5      nU H  nXS-   U-
  -  nM     U H  nX* U-   S-
  -  nM     UR                  S5      nUS:X  a  [        S5      e[        [        UR                  5       SS U
5      R                  5       R!                  U
[        U-
  5      [        5      n[        X-
  U-  [        5      U l        g)r  rW   rs   r   z(Cannot decrement lower b index (cancels)Nry   r  )r   r   rg   r   rh   r
  rn   r  r3  rl   rs   r  rC  rk   r  s                  r\   rI  MeijerUnShiftC.__init__  s    Wrrq.A!BC"X"X"X"XVVAY]BKAa"fb!!A Ab1fb!!A  #JOJAa%!)A A"q&1*A  UU1X7GHHallnSb)1-557<<QRH"M15"*b)
r^   c                     SU R                   < SU R                  < SU R                  < SU R                  < SU R                  < S3$ )Nz<Decrement lower b index #r  r  r  r  r   s    r\   r  MeijerUnShiftC.__str__  r  r^   r  Nr  rw   r^   r\   r  r    s    &$*LNr^   r  c                   $    \ rS rSrSrS rS rSrg)MeijerUnShiftDi  zIncrement a lower a index. c           
      h   [        [        [        XX4U/5      5      u  pp4nXl        X l        X0l        X@l        XPl        [        U5      n[        U5      n[        U5      n[        U5      nUR                  U5      S-   n[        U[        5      nU H   n	U[        SU	-
  [        -   [        5      -  nM"     U H   n	U[        U	S-
  [        -
  [        5      -  nM"     [        S5      n
[        US-
  U
-
  U
5      n[        SU
5      nU H  nX* U-   -  nM     U H
  nXU-
  -  nM     UR                  S5      nUS:X  a  [        S5      e[        [        UR                  5       SS U
5      R                  5       R!                  XS-
  [        -
  5      [        5      n[        X-
  U-  [        5      U l        g)r  rW   rr   r   z(Cannot increment lower a index (cancels)Nry   r  r  s                  r\   rI  MeijerUnShiftD.__init__  s    Wrrq.A!BC"X"X"X"XVVAY]BKAa!ebj"%%A Aa!ebj"%%A  #Ja!QAJA"q&MA Aa%LA  UU1X7GHHallnSb)1-557<<Av{! 15"*b)
r^   c                     SU R                   < SU R                  < SU R                  < SU R                  < SU R                  < S3$ )Nz<Increment lower a index #r  r  r  r  r   s    r\   r  MeijerUnShiftD.__str__>  r  r^   r  Nr  rw   r^   r\   r   r     s    &%*NNr^   r   c                   T    \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	S r
Srg	)
ReduceOrderiC  z7Reduce Order by cancelling an upper and a lower index. c                    [        U5      n[        U5      nX-
  nUR                  (       a  US:  a  gUR                  (       a  UR                  (       a  g[        R                  U 5      n[        R                  n[        U5       H  nU[        U-   U-   X&-   -  -  nM     [        U[        5      Ul        Xl        X$l        U$ )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)r`   r  bjrC  r   r  ks          r\   r   ReduceOrder.__new__F  s    R[R[G||q1u==R..$EEqA"r'A+''A  !R[
r^   c                    [        U5      n[        U5      nX-
  nUR                  (       d  UR                  (       d  g[        R	                  U 5      n[
        R                  n[        U5       H  nXc[        -  U-   U-   -  nM     [        U[        5      Ul
        US:X  a  Xl        X%l        U$ [        SUS-
  SS9Ul        [        SUS-
  SS9Ul        U$ )zACancel b + sign*s and a + sign*s
This is for meijer G functions. Nry   rW   F)evaluate)r   r   r(  r  r   r   r   r)  r;  rQ   r  r)  r*  r   )r`   rl   rk   signrC  r   r  r,  s           r\   _meijerReduceOrder._meijer\  s     AJAJE==$EEqAr'A+/"A  !R[
2:GG
  !QUU3DG!QUU3DGr^   c                 &    U R                  XS5      $ )Nry   r1  )r`   rl   rk   s      r\   meijer_minusReduceOrder.meijer_minusv  s    {{1$$r^   c                 4    U R                  SU-
  SU-
  S5      $ rV   r4  )r`   rk   rl   s      r\   meijer_plusReduceOrder.meijer_plusz  s    {{1q5!a%++r^   c                 @    SU R                   < SU R                  < S3$ )Nz"<Reduce order by cancelling upper z with lower r  )r)  r*  r   s    r\   r  ReduceOrder.__str__~  s    WWdgg 	r^   rw   N)r  r  r  r  r  r   classmethodr1  r5  r8  r  r  rw   r^   r\   r&  r&  C  sK    B,  2 % % , ,r^   r&  c                 V   [        U 5      n [        U5      nU R                  US9  UR                  US9  / n/ nU  Hh  nSn[        [        U5      5       H$  nU" XaU   5      nUc  M  UR	                  U5          O   Uc  UR                  U5        MW  UR                  U5        Mj     XAU4$ )z>Order reduction algorithm used in Hypergeometric and Meijer G r   N)r   r   r)  r   r  re   )	rg   rh   genr   nap	operatorsrk   r  r
  s	            r\   _reduce_orderrA    s    	bB	bBGGGGGG
CIs2wAQ1B~q		  
 :JJqMR   Ir^   c                     [        U R                  U R                  [        [        5      u  pn[        [        U6 [        U6 5      U4$ )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.>])
)rA  rg   rh   r&  r   rd   r   )rj   r?  nbqr@  s       r\   reduce_orderrD    s<    . (+GWXCi%+uc{3Y>>r^   c                     [        U R                  U R                  [        R                  S 5      u  pn[        U R
                  U R                  [        R                  [        5      u  pEn[        XXB5      X6-   4$ )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                     [        U * 5      $ rb   r   r   s    r\   r   %reduce_order_meijer.<locals>.<lambda>  s    -=qb-Ar^   )
rA  r   rh   r&  r8  r   rg   r5  r   r   )rj   r   rC  ops1nbmr?  ops2s          r\   reduce_order_meijerrK    se    , #477DGG[5L5L#ACNCd"477DGG[5M5M#35NCd c)4;66r^   c                    ^ ^ U U4S jnU$ )z>Create a derivative operator, to be passed to Operator.apply. c                 p   > TU R                  T5      -  U T-  -   nUR                  [        T5      5      nU$ rb   )r  	applyfuncr   )rs   r  rt   rn   s     r\   doit&make_derivative_operator.<locals>.doit  s4    affQiK!A#KK	!%r^   rw   )rt   rn   rO  s   `` r\   make_derivative_operatorrQ    s     Kr^   c                 P    U n[        U5       H  nUR                  X25      nM     U$ )z_
Apply the list of operators ``ops`` to object ``obj``, substituting
``op`` for the generator.
)reversedr  )r   opsr  ri   os        r\   apply_operatorsrV    s*    
 Cc]ggc Jr^   c           	      b  ^^ U R                   U R                  UR                   UR                  4 Vs/ s H  n[        U[        5      PM     snu  pEpg[	        [        UR                  5       5      5      [	        [        UR                  5       5      5      :w  dF  [	        [        UR                  5       5      5      [	        [        UR                  5       5      5      :w  a  [        U < SU< 35      e/ nS mUU4S jn	UU4S jn
[        [        UR                  5       5      [        UR                  5       5      -   [        S9 GHM  nSnSnSnSnX;   a  XK   nXk   nX;   a  X[   nX{   n[	        U5      [	        U5      :w  d  [	        U5      [	        U5      :w  a  [        U < SU< 35      eXX4 Vs/ s H  n[        U[        S9PM     snu  ppS nU" Xk5      nU" X{5      n[	        U5      S:X  a  X" / XUU5      -  nO[	        U5      S:X  a  X" U/ UUU5      -  nOkUS	   nUS	   nUS   U-
  S::  d  US   U-
  S::  a  [        S
5      eUU-
  S:  a  X" XUUU5      -  nX" XUUU5      -  nOX" XUUU5      -  nX" XUUU5      -  nXU'   XU'   GMP     UR                  5         U$ s  snf s  snf )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.>]
z not reachable from c                     / n[        [        U 5      5       HH  nX   X   -
  S:  a  UnSnOUnSnX   X   :w  d  M%  XF" X5      /-  nX==   U-  ss'   X   X   :w  a  M#  MJ     U$ )Nr   rW   ry   )r)  r   )frotoincdecrT  r
  shchs           r\   	do_shiftsdevise_plan.<locals>.do_shifts"  sw    s3xAusv~!%36/3
|#" %36/ ! 
r^   c           	      .   >^^^ T" XS UUUU4S j5      $ )z'Shift us from (nal, nbk) to (al, nbk). c                     [        X   5      $ rb   )r  r  r
  s     r\   r   2devise_plan.<locals>.do_shifts_a.<locals>.<lambda>4  s
    vad|r^   c                 ,   > [        U T-   TT-   UT5      $ rb   )r  )r  r
  aotherbothernbkrn   s     r\   r   rd  5  s    hq6z3<A&Nr^   rw   )nalrh  alrf  rg  r_  rn   s    ` ``r\   do_shifts_a devise_plan.<locals>.do_shifts_a2  s    ";NP 	Pr^   c                 .   >^ ^^ T" XUUU U4S jS 5      $ )z'Shift us from (nal, nbk) to (nal, bk). c                 ,   > [        TT-   U T-   UT5      $ rb   )r  )r  r
  rf  rg  ri  rn   s     r\   r   2devise_plan.<locals>.do_shifts_b.<locals>.<lambda>:  s    hsV|QZA&Nr^   c                     [        X   5      $ rb   )r  rc  s     r\   r   ro  ;  s
    fQTlr^   rw   )ri  rh  bkrf  rg  r_  rn   s   `  ``r\   do_shifts_b devise_plan.<locals>.do_shifts_b7  s    N24 	4r^   r   rw   c                 P    / nU  H  nX1:w  d  M
  UR                  X   5        M     U$ rb   )rc  )r0  r   r   r,  s       r\   othersdevise_plan.<locals>.othersN  s+    A8HHSV$  Hr^   r   ry   zNon-suitable parameters.)rg   rh   rT   r]   r   r   r   r^  sortedr   r(  )rp  originrn   r  r   r   	nabuckets	nbbucketsrT  rk  rr  r  rj  ri  rq  rh  r   ru  rf  rg  namaxamaxr_  s     `                   @r\   devise_planr}    s   ^ yy&))VYY		B0DBF 15VU0CB0D,H	 4 !Sinn.>)?%@@X]]_%&#d9>>3C.D*EEvvFGG
C P
4 D)D,AAGWX=B,C=B,Cr7c#h#b'SX"566JKK r')' #1*:;')	 	%	%r7a<;r3FF;;CW\;sBFF;;CGEb6D1v~"bedla&7 !;<<t|a{3R@@{2B?? {3R@@{3B??!!c Yf KKMJq0Dd)s   J'1J,c                    [        U R                  [        5      [        U R                  [        5      p2[	        U[
        R                     5      S:w  a  gU[
        R                     S   nUS::  a  g[
        R                  U;  a  g[        U[
        R                     5      nUR                  5         US   nUS::  a  g[        U R                  5      nUR                  U5        [        U R                  5      nUR                  U5        US-  nU V	s/ s H  oU-
  PM	     nn	U V	s/ s H  oU-
  PM	     nn	/ n
[        US-
  5       H   nU
R                  [        US-   5      5        M"     U
R                  5         [        U5      X-  -  nU[        U Vs/ s H  n[!        X5      PM     sn6 -  nU[        U Vs/ s H  n[!        X5      PM     sn6 -  nU
[#        U5      /-  n
Sn[        U5       Hb  nX-  [        U5      -  nU[        U Vs/ s H  n[!        X5      PM     sn6 -  nU[        U Vs/ s H  n[!        X5      PM     sn6 -  nUU-  nMd     [%        Xx5      X* 4$ s  sn	f s  sn	f s  snf s  snf s  snf s  snf )z>Try to recognise a hypergeometric sum that starts from k > 0. rW   Nr   )rT   rg   r]   rh   r   r   r   r   r   remover)  re   r  r(  r7   r   r6   r  rd   )rj   rn   r   r   r  r   r,  r?  rC  rZ   rT  rC  facrl   rk   r  r3  s                    r\   try_shifted_sumr  t  s.   dggu-tDGGU/Ch
8AFF!AAvvvXXaffAFFH	!AAv
tww-CJJqM
tww-CJJqMFA
#Qq5#C

#Qq5#C

C1q5\

6!a%=! KKM
A,qt
C33'3aA3'((C33'3aA3'((CLC	A1XD1	SS)S2a8S)**	SS)S2a8S)**	Q	  ##S",,+ 
 (' *)s$   I&(I+I0
;I5
I:4I?c           	        ^ [        U R                  [        5      [        U R                  [        5      p2U[        R
                     nU[        R
                     nUR                  5         UR                  5         U Vs/ s H  ofS::  d  M
  UPM     nnU Vs/ s H  ofS::  d  M
  UPM     snmT(       a   [        U4S jU 5       5      (       a  [        $ U(       d  gUS   nSn	[        R                  n
[        [        [        U* 5      5      6  Hb  nX-  n	XS-   -  n	U	[        U R                   Vs/ s H  oU-   PM	     sn6 -  n	U	[        U R                   Vs/ s H  oU-   PM	     sn6 -  n	X-  n
Md     U
$ s  snf s  snf s  snf s  snf )zaRecognise polynomial cases. Returns None if not such a case.
Requires order to be fully reduced. r   c              3   2   >#    U  H  oTS    :  v   M     g7f)ry   Nrw   )r   rk   bl0s     r\   r   !try_polynomial.<locals>.<genexpr>  s     ,1s2w;s   Nry   rW   )rT   rg   r]   rh   r   r   r   allr   r   r   r   r)  r   )rj   rn   r   r   rr  r  rZ   al0rk   r  ri   rC  rl   r  s                @r\   try_polynomialr    sF    dggu-tDGGU/Ch	!&&	B	!&&	BGGIGGI
#bF1bC
#
#bF1b
#C
s,,,,	BA
C
%%CDrO$1usDGG,GqUG,--sDGG,GqUG,--
 % J# $
# -,s$   ?	E7E7	E<%E<1FFc           	         [        U R                  [        5      [        U R                  [        5      p!0 nUR	                  5        H@  u  pEUS:w  a  XB;  a    gX$   n[        U5      [        U5      4X4'   UR                  US5        MB     U0 :w  a  g[        R                  U;  a  gU[        R                     u  pxXxS/-   4U[        R                  '   [        S5      n	[        R                  n
[        R                  nUR	                  5        H  u  nu  p[        U5      [        U5      :w  a    g[        X5       H`  u  pX-
  R                  (       a%  X-
  nU
[        X-   U5      -  n
U[        X5      -  nM=  X-
  nU
[        X5      -  n
U[        X-   U5      -  nMb     M     [        X-  U	5      n[         R"                  " U5      n/ n0 nU GHv  nUR%                  5       u  pUR'                  U	5      (       dG  [)        X5      nUR*                  (       d  [-        S5      eUR/                  5       u  u  pUX-  U4/-  nMs  U
R'                  U	5      (       a  [1        S5      eUR3                  U	5      u  nu  nSnUR4                  (       a  UR6                  nUR8                  nUU	:X  a  SnOrUR:                  (       aV  UR=                  U	5      u  nnSnUU	:w  a  UR=                  U	5      u  nnUX-  U-   :w  a  [1        SU-  5      eX-  nUUU-  -  nO[1        S5      eUR?                  U/ 5      RA                  U
U-  U45        GMy     0 n0 n[        S	5      nURC                  S
 S9  SSSU-
  -  0nU(       a5  [E        US   S   5       H   nUUU   RG                  U5      -  UUS-   '   M"     U H;  u  nnUR?                  [        R                  / 5      RA                  UUU   -  5        M=     UR	                  5        H  u  nnU H1  u  n nUR?                  [I        UX5      / 5      RA                  U 5        M3     URC                  S S9  [E        SUS   S   S-   5       H1  nU* [I        UX5      4S[I        UUS-
  U5      4/U[I        UX5      '   M3     U* [I        USU5      4SSU-
  -  [        R                  4/U[I        USU5      '   M     0 n![K        [        R                  /[        URM                  5       5      -   5       H  u  nnUU!U'   M     [O        U!R	                  5       S S9 VVs/ s H  u  nn[Q        U5      PM     n"nn[S        U"5      n#[S        S/[        U#5      -  /5      n$UR	                  5        H  u  nn [!        U 6 U$U!U   '   M     [U        [        U#5      5      n%UR	                  5        H  u  nnU H  u  n n&U U%U!U   U!U&   4'   M     M!     [W        U US/ U#U$U%5      $ s  snnf )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   NrW   r   zp should be monomialz<Need partial fraction decomposition with linear denominatorszunrecognised form %sz%unrecognised form of partial fractionrn   c                     U S   $ rV   rw   r   s    r\   r   try_lerchphi.<locals>.<lambda>   s    1r^   r   ry   c                     U S   $ rV   rw   r   s    r\   r   r  *  s    QqTr^   rx   c                     U S   $ rV   rw   r   s    r\   r   r  4  s    adr^   ),rT   rg   r]   rh   r   r   r  r   r   r	   r   r   r  is_positiver6   rO   r   	make_argsr   rH  rQ   is_monomialr]  LTNotImplementedErroras_coeff_mulis_Powr   baseis_Addas_independentr|  re   r   r)  r  r8   	enumerater   rw  r   rL   rN   rf   )'rj   r   r   pairedr   valuebvalueaintsbintsr   r   r   avaluerk   rl   r,  partr   	monomialstermsr   r  indepdeprC  tmprD  derivr  rn   monr   r[   transbasisrr   rs   rt   b2s'                                          r\   try_lerchphir    s    dggu-tDGGU/ChFnn&
!8+E{DL1S$ ' 2~vvX!&&>LEaS[)F166Nc
AEEEEEE!'fv;#f+% 'DA""EAE1%A!EA!AE1% ( "0( a D==DIE))+yy||UA== 677JUa17A,'I99Q<<% 'B C C))!,u::A((C!8AZZ''*FAsAax))!,1acAg~)*@3*FGGFAQTME%&MNNB&&eQ'78= L EFc
ANN~N&aQi.Cy}Q'(A3q6;;q>)CAJ )1!%%$++Ac!fH5 1DAqhq!/4;;A> 	>"q!B%(Q,'A*+Xa->(?)*HQAq,A(B(DE(1a#$ ( '(R!Q):$;%&AY$6$8hq!Q   E155'D$6671a 8*05B+D E +DA[^ +DE EuACF
|A11g%( c!fA1EAr%&AeAhb	!"   4D"aA..Es   0W/c           
         [        S5      nU R                  (       Ga  U R                   Vs/ s H  n[        U-   PM     nnU R                   Vs/ s H  n[        U-   S-
  PM     nn[        [	        U6 -  U[	        U6 -  -
  n[        U[        5      nUR                  " 5       n/ n	[        U5      n
[        U5       Hc  nU R                  S   U-   nU	[        U/[        U R                  SS 5      -   U R                  U5      /-  n	XS-
  :  d  MT  U* XU4'   X*XS-   4'   Me     [        U	5      n[        S/S/US-
  -  -   /5      n[        U5      /n[        U5       H  nUR                  XU   -  5        M     UR                  " 5       nUR                  5         S/U-  n[!        U5       H0  u  nn[!        XU   -  5       H  u  nnUU==   UU-  -  ss'   M     M2     [!        U5       H5  u  nnU* XS-
     SUS-
  4   -  UR                  " 5       S   -  XS-
  U4'   M7     [#        XS/ XU
5      $ / n	[        U R                  SS 5      n[        [%        U5      5       H!  nU	[        / UU5      /-  n	UU==   S-  ss'   M#     U	[        / UU5      /-  n	[        U	5      n[%        U5      n[        S/S/US-
  -  -   /5      n[        U5      n
U[	        U R                  6 -  U
SUS-
  4'   [        SU5       H3  nU R                  US-
     XUS-
  4'   U R                  US-
     * XU4'   M5     [#        XS/ XU
5      $ s  snf s  snf )zM
Create a formula object representing the hypergeometric function ``func``.

rn   rW   r   N)r	   rg   r;  rh   r   rQ   r<  rN   r)  r?   r   rL   rM   re   r>  r(  r  rf   r   )rj   rn   rk   rA  rl   rB  r   rP   rC  r  rt   r,  rr   rs   derivsr   ri   r[   r  r  rh   r
  s                         r\   build_hypergeometric_formular  @  s3    	c
Awww$(GG,GqBFG,(,01BFQJ0#x. 1S(^#33D"~KKM!HqA
QAeQC$twwqr{"33TWWa@AAEq5y"Q$!U(  5MQC1#q1u+%&'a&qAMM!1I+& OO			c!eaLDAq!!1I+.1A!A# / ! cNDAq"VE]1a!e844T__5Fq5IIA!eQhK #tb!22 $''!*s2wAeBA&''EqEQJE   	%B"##5MFQC1#q1u+%&'!HTWWo!QU(q!A''!a%.AQhKwwq1u~oAdG  tb!22Y -0s   L<Mc                 "   [        U 5      [        U5      pCUn[        U5      nUS:X  a  [        R                  $ SSKJn  US:X  Ga?  US:X  Ga8  X-   u  pxn	US:X  a8  [        X-
  U-
  5      [        U	5      -  [        X-
  5      -  [        X-
  5      -  $ US:X  a  U" X-
  U	-   5      S:X  a  XxpxUS:X  a  U" Xx-
  U	-   5      S:X  a  UR                  (       al  UR                  (       a[  S[        [        U-  S-  5      -  [        U* 5      -  [        X-
  S-   5      -  [        U* S-  5      -  [        US-  U-
  S-   5      -  $ [        US-  S-   5      [        X-
  S-   5      -  [        US-   5      -  [        US-  U-
  S-   5      -  $ [        XU5      $ )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   rx   rW   ry   )r   r>   r   r   sympy.simplify.simplifyr   r#   r   r   r!   r   r?   )
rg   rh   rn   r  qz_r   rk   rl   r[   s
             r\   hyperexpand_specialr  z  s    r7CGq	
B1AAvuu0Av!q&'a6#E!H,U15\9%,FF7x	*a/q7x	*a/||RT!V}UA2Y.uQUQY/??A2a4[!!&qsQw{!34 4 QqS1W~eAEAI&661q5\""'!a!"45 5 r^   Nz0rW   defaultc                   ^^^^^^ TR                   (       a  [        R                  $ SSKJn  [        TSS9mTS:X  a  SmUUUUUU4S jn[        c
  [        5       q[        SU 5        [        U 5      u  p	U	(       a  [        S	U 5        O[        S
5        [        U T5      n
U
bP  [        S5        [        XU4S j5      n[        UT-  TU4S j5      n[        U" U5      R                  TT5      5      $ [        R                  n[        U T5      n
U
b  U
u  pn[        SU 5        X-  n	[        XU4S j5      n[        UT-  TU4S j5      nU" U5      R                  TT5      n[        T5      S;   aw  [!        U R"                  5      [!        U R$                  5      4S:X  aI  ['        U 5      nU" X5      R)                  [*        [,        5      nUR/                  [*        5      (       d  X-   $ [        R1                  U 5      nUc  [3        U 5      nUc  [        SS5        ['        U 5      n[        SUR4                  SUR6                  5        U	[9        XR6                  T5      -  n	U" X5      U-   n[;        USS9R)                  [*        [,        5      $ )a  
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                   > [        U R                  R                  U R                  T
5      U[	        U R
                  R                  U R                  T
5      T
5      5      n[        UT[	        U R
                  R                  U R                  T
5      T[        U R
                  R                  S   5      -  -   T
5      5      nTS:X  a  UR                  [        T
5      5      n[        S [        X R                  R                  U R                  T
5      5      [        R                  5      T-  nUR                  T
T	5      nT(       a  UR                  T5      nU$ )Nr   rW   c                     XS   US   -  -   $ rM  rw   rN  s     r\   r   5_hyperexpand.<locals>.carryout_plan.<locals>.<lambda>  s    q1ad{r^   )rV  rs   r  rn   rQ  rt   rM   shaperN  r   r   r  rr   r   r   rewrite)r}  rT  rs   r  ri   ops0prempremultr  rn   r  s        r\   carryout_plan#_hyperexpand.<locals>.carryout_plan  s   ACCHHQSS"-s4QSSXXacc25FKMAt4QSSXXacc25F+/ACCIIaL0A+A6BCEGH a<IbM*A*C3388ACC3D,EqvvNwVffRm++g&C
r^   z)Trying to expand hypergeometric function   Reduced order to   Could not reduce order.z  Recognised polynomial.c                 ,   > TU R                  T5      -  $ rb   r  r}  r  s    r\   r   _hyperexpand.<locals>.<lambda>  s    166":r^   c                 ,   > TU R                  T5      -  $ rb   r  r  s    r\   r   r    s    r!&&*}r^   z+  Recognised shifted sum, reduced order to c                 ,   > TU R                  T5      -  $ rb   r  r  s    r\   r   r    s    "QVVBZ-r^   c                 ,   > TU R                  T5      -  $ rb   r  r  s    r\   r   r    s    2affRj=r^   )rW   ry   )rx   rW   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=   _collectionrx  r   rD  r  rV  r>   r  r   r  r   rg   rh   r  replacer?   r  rH  r  r  r@  rj   r}  rS   )rj   rn   r  r  r  r  r  r   r  rT  ri   r  nopsr}  r  r  s    ``````         r\   _hyperexpandr    sB    	yyuu0A) * ')	
5t< T"ID
#T*)* r
"C
()C&=>AgIt-DE(1+**2q122 	
A
$
#C
A;TB 	 78A'	4)@AAQA !}S\3tww<$@F$J(.!!))%1DEuuU||5L ''-G t$,2	3 /t4	
!4!4c7<<H ;t\\2..C 	g#a'AQd#++E3FGGr^   c           	        ^^^^	^
 S n[        U R                  5      m[        U R                  5      m[        U R                  5      m	[        U R                  5      m
/ nSnU(       Ga[  SnU" TUR                  UUU	U
U4S jST	T
-   5      nUb	  XF/-  nSnM7  U" TUR                  UUU	U
U4S jST	T
-   5      nUb	  XF/-  nSnMd  U" T	UR                  UUU	U
U4S jSTT-   5      nUb	  XF/-  nSnM  U" T
UR                  UUU	U
U4S	 jSTT-   5      nUb	  XF/-  nSnM  U" TUR                  U4S
 jS/ 5      nUb	  XF/-  nSnM  U" TUR                  U4S jS/ 5      nUb
  XF/-  nSnGM  U" T	UR                  U	4S jS/ 5      nUb
  XF/-  nSnGM2  U" T
UR                  U
4S jS/ 5      nUb
  XF/-  nSnGMY  U(       a  GM[  T[        UR                  5      :w  dK  T[        UR                  5      :w  d2  T	[        UR                  5      :w  d  T
[        UR                  5      :w  a  [        S5      eUR                  5         U$ )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                    ^ [        [        X5      5       H_  u  nu  mnTU-
  R                  (       d  M  UT-
  U-  S:  d  M-  [        U4S jU 5       5      (       d  MI  U" U5      nX==   U-  ss'   Us  $    g)a  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   .   >#    U  H
  nTU:g  v   M     g 7frb   rw   )r   rZ   rk   s     r\   r   8devise_plan_meijer.<locals>.try_shift.<locals>.<genexpr>R  s     01Qs   N)r  r  r   r  )	r}  r   shifterr  counteridxrl   r]  rk   s	           @r\   	try_shift%devise_plan_meijer.<locals>.try_shiftG  si     %SY/KC!QQ"""At|a'70000S\$	 0r^   TFc                 $   > [        TTTTU T5      $ rb   )r  r
  fanfapfbmfbqrn   s    r\   r   $devise_plan_meijer.<locals>.<lambda>_      S#sAq!Ir^   rW   c                 $   > [        TTTTU T5      $ rb   )r   r  s    r\   r   r  f  r  r^   c                 $   > [        TTTTU T5      $ rb   )r  r  s    r\   r   r  m  r  r^   ry   c                 $   > [        TTTTU T5      $ rb   )r  r  s    r\   r   r  t  r  r^   c                     > [        TU    5      $ rb   )r  )r
  r  s    r\   r   r  z      \#a&-Ar^   c                     > [        TU    5      $ rb   )r  )r
  r  s    r\   r   r    r  r^   c                     > [        TU    5      $ rb   )r  )r
  r  s    r\   r   r    r  r^   c                     > [        TU    5      $ rb   )r  )r
  r  s    r\   r   r    r  r^   zCould not devise plan.)r   r   rg   r   rh   r  r(  )rY  rZ  rn   r  rT  changer  r  r  r  r  s     `    @@@@r\   devise_plan_meijerr    sL   t svv,C
svv,C
svv,C
svv,C
CF
sBEEII#)% >4KCFsBEEII#)% >4KCFsBEEII39& >4KCFsBEEII39& >4KCFsBEE#A2rJ>4KCFsBEE#A2rJ>4KCFsBEE#A1bI>4KCFsBEE#A1bI>4KCFc &d d255kSDK/3$ruu+3E4;!":;;KKMJr^   c           
      0
  ^^^ [         c
  [        5       q US:X  a  SnU n[        SU 5        [        S5      n[	        U 5      u  n mT(       a  [        SU 5        O[        S5        [         R                  U 5      nUb  [        SUR                  5        T[        UR                  X5      -  m[        UR                  R                  UR                  U5      T[        UR                  R                  UR                  U5      U5      5      nUR                  [        U5      5      nXR                   R                  UR                  U5      -  n	U	S   R                  Xa5      n	[#        U	S	S
9$ [        S5        S mUUU4S jn
[        S5      mU
" U R$                  U R&                  U R(                  U R*                  Xa5      u  pS nT HA  n[-        UR.                  R                  UST-  [0        [0        * 05      [0        5      Ul        MC     U
" U" U R&                  5      U" U R$                  5      U" U R*                  5      U" U R(                  5      TSU-  5      u  nn[#        UR                  Xa5      S	S
9n[#        UR                  TSU-  5      S	S
9n[3        U[4        5      (       d  UR                  TSU-  5      nU " U5      nUR6                  S:  do  UR6                  S:X  am  [9        UR(                  5      [9        UR*                  5      :X  aA  [;        UR<                  5      S:  SLa&  [?        U5      [?        S5      :X  a  USLa  S	nUSLa  S	nUS	L a  URA                  U=(       d    S5      nOURA                  U=(       d    S5      nUS	L a  URA                  U=(       d    S5      nOURA                  U=(       d    S5      nUSLa  USLa  US:X  a  SnU[B        :X  a  Sn[3        U[4        5      (       d  UR                  Xa5      n[3        U[4        5      (       d  UR                  Xa5      nS nU" X5      nU" UU5      n[E        UU5      SS[F        4::  a
  UU:  a  U$ U$ [I        US   US   5      S::  a.  [I        US   US   5      S::  a  [K        X4UU4U" U5      S	45      $ [K        X4UU4U" U5      S	45      n	U	RM                  [N        5      (       a  U(       d  [        S5        U	RM                  [N        5      (       a  U(       a  U	$ U" U5      $ )af  
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 rn   r  r  z  Found a Meijer G formula: r   Tr  z;  Could not find a direct formula. Trying Slater's theorem.c                     U  H@  n[        X   5      S:  d  M  SnX!;   a  [        X   5      nUS-   [        X   5      :  d  M@    g   g)zTest if slater applies. rW   r   FT)r   )r.  r-  r
  r   s       r\   can_do_meijergexpand.<locals>.can_do  sH    A36{Q8CFAq53sv;&   r^   c                   >^ [        XX#5      nUR                  5       u  pxpT+" X5      (       d  [        R                  S4$ [	        U 5      [	        U5      -   [	        U5      [	        U5      -   :  n
[	        U 5      [	        U5      -   [	        U5      [	        U5      -   :X  a  [        T5      S:  n
U
SL a  [        R                  S4$ [        R                  nU GH  n[	        X   5      S:X  GaN  X   S   nSn[        U5      nUR                  U5        U H  nU[        UU-
  5      -  nM     U  H  nU[        SU-   U-
  5      -  nM     U H  nU[        SU-   U-
  5      -  nM     U H  nU[        UU-
  5      -  nM     [        U 5      [        U5      -    Vs/ s H  nSU-   U-
  PM     nn[        U5      [        U5      -    Vs/ s H  nSU-   U-
  PM     nn[        [        R                  [	        U5      [	        U5      -
  -  5      nUU-  nT-U-  U-  n[        [        UU5      UT,T-UUS S9nXU-  -  nGMd  X   S   nX   SS   Vs/ s H  nUU-
  PM
     nn[	        U5      nX   S US-     Vs/ s H  nUU-
  PM
     nn[        U5      nX    H  nUR                  U5        M     [        U5      n X   S U  H  nU R                  U5        M     US   n![        UU5       V"Vs/ s H  u  n"nU"U-
  PM     n#n"n[        S5      n$TU$-  n%U HJ  n[        US5      (       d%  UR                   (       a  [#        [%        U5      5      nU%[        UU$-
  5      -  n%ML     U  H  nU%[        SU-
  U$-   5      -  n%M     U H  nU%[        SU-
  U$-   5      -  n%M     U H  nU%[        UU$-
  5      -  n%M     ['        U%5      n%[)        [#        [%        U!5      5      5       H)  n&[+        U%U$UU&-   5      n'[-        U'T,U4S j5      n'UU'-  nM+     UU!-   n([        [        R                  [	        U 5      [	        U5      -   S-   -  5      nUU-  nT-U-  U(-  n[        U 5      [        U5      -    Vs/ s H  nSU(-   U-
  PM     snS/-   n[        U5      [        U5      -    Vs/ s H  nSU(-   U-
  PM     nn[        [        UU5      UT,T-UU(S S9n[        R                  U!-  [/        U!5      -  n)[)        U5       H5  n*U)[        R                  U#U*   -  [1        U!UU*   -
  S-   U#U*   5      -  -  n)M7     U  H  nU)[        SU-
  U(-   5      -  n)M     U H  nU)[        UU(-
  5      -  n)M     U  H  nU)[        UU(-
  5      -  n)M     U H  nU)[        SU-
  U(-   5      -  n)M     UU)U-  -  nGM     X4$ s  snf s  snf s  snf s  snf s  snn"f s  snf s  snf )NFrW   r   r  ry   r   c                 ,   > TU R                  T5      -  $ rb   r  )r}  rn   s    r\   r   3_meijergexpand.<locals>.do_slater.<locals>.<lambda>!	  s    !AFF1I+r^   )r   r4  r   r   r   r  r   r  r#   r2   NegativeOner  rd   r  r	   r   rX   introundr   r)  rR   rV  r7   r6   ).r   r   rg   rh   rn   zfinalrj   rD  r.  r-  condri   r3  bhr  bor+  ajrk   r?  rl   rC  r,  hargr  hypb_r  kir   r  liaolur   dir   	integrandr  residaurs   r
  r  rT  r   s.       `                                      r\   	do_slater!_meijergexpand.<locals>.do_slater  s    "")--/c665= 2wR 3r7SW#44r7SWB#b' 11q6A:D5=665= ffA36{aVAY"X		"B5b>)C B5R"--C B5R"--C B5b>)C +/8d2h+>?+>aq2vz+>?+/8d2h+>?+>aq2vz+>?q}}s2wR/@ABx Q3)">#s#;T3#$gr4ASy VAY(+qr
3
"b2g
3G(+vA7"b2g7"XAIIaL  "XAIIaL $V*-b"+6+Aa!e+6 #JqD	Aq!99aMq1u-I  Aq1uqy!11I Aq1uqy!11I Aq1u-I 
 (	2	s59~.A#Iq"q&9E+E38MNE5LC / "Wq}}s2wR/@1/DEFxQ3)+/8d2h+>?+>aq2vz+>?1#E+/8d2h+>?+>aq2vz+>?">#s#;T3#$gr4A MMB'	"5qA1-bbeaA.GGGA "Aq1urz**A Aq2v&A Aq2v&A Aq1urz**A  qui l yQ @? 47 7: @?s*   V&V+V03V5)V:&W Wr   c                 8    U  Vs/ s H  nSU-
  PM
     sn$ s  snf rV   rw   )r   rZ   s     r\   r   _meijergexpand.<locals>.trB	  s     !q!Aq!!!s   rW   ry   Fnonrepr  c                     USL a  SnO
USL a  SnOSnU R                  [        [        [        * [        5      (       a  SnX R	                  [
        5      U R                  5       4$ )NTr   FrW   rx   r{   )rH  r   r   r   countr?   	count_ops)r   r  c0s      r\   weight_meijergexpand.<locals>.weightr	  sX    4<BU]BB88BbS#&& BJJu%t~~'788r^   z@  Could express using hypergeometric functions, but not allowed.)(_meijercollectionr  r   r	   rK  r  rj   r  rV  rs   r  rn   rQ  rt   rN  r   rr   rS   r   r   rg   rh   rQ   r  r;  r   r   deltar   r:   nur2   r  r   ra  r   rb  r9   rH  r?   )rj   r  allow_hyperr  placefunc0rn   r}  rs   r  r	  slater1cond1r   r  slater2cond2r3  r  w1w2r  rT  r   s                        @@@r\   _meijergexpandr     sS     35)E	
=tD 	c
A#D)ID#
#T*)* 	''-A},aff5!!&&$22 ACCHHQSS!,c4QSSXXacc15EqIK KK	!%cchhqssAaDIIa$''	
GH	eN 	c
Atww$''1ING" q!A#rB3&78"= r$''{BtwwKDGGbk !B$(NGU Q+48GQ"-T:GeT""

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

1!eT""

1!9 
	B		B
2r{q!Rj 7NN
2a5"Q%A#beRU"3q"8')GU+;eBi=NOO
 	7"We$4uRy$6GHAuuU||K ! 	"55<<;9r^   c                    ^^^ [        U 5      n U4S jnUUU4S jnU R                  [        U5      R                  [        U5      $ )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   > [        [        X5      UTS9nUc  [        XU5      $ U$ )Nr  )r  rd   r?   )rg   rh   rn   r  r  s       r\   
do_replacehyperexpand.<locals>.do_replace	  s-    /GD9##Hr^   c           	         > [        [        U S   U S   US   US   5      UTTTS9nUR                  [        [        [
        [
        * 5      (       d  U$ g )Nr   rW   )r  r  )r   r   rH  r   r   r   )rg   rh   rn   r  r  r  r  s       r\   	do_meijerhyperexpand.<locals>.do_meijer	  sT    :beRUBqE2a5A1u>uuS#rB3''H (r^   )r   r  r?   rK   )r}  r  r  r  r#  r&  s    ```  r\   hyperexpandr(  	  s8    2 	
A
 99UJ'//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.iterablesrT   r]   r   r   r   r   rd   r   r;  rf   rx  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r&  rA  rD  rK  rQ  rV  r}  r  r  r  r  r  r  r  r  r  r   r(  rw   r^   r\   <module>r9     sr  t $    @ @ @ @ @  /H H H H H H H H H F5 5 5 5 . - ) )   , *]@	@FAT AH<H <H@ 3ZB BNI IX&: &:R .2 2j!8 !
HX 
H
LX 
L&Lx &LR'Lx 'LTH8 HL8 LI8 IL8 L#NX #NL,NX ,N^0NX 0Nf.NX .Nb=( =@4?87<FR*-Z8@/F73t#J   "eDk11"hHVEN   9B}@'Dr^   