
    \h'                      % S r SSKJr  SSKJrJrJrJr  SSKJ	r	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  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"  SSK#J$r$  SSK%J&r&J'r'J(r(  SSK)J*r*  SSK+J,r,J-r-J.r.  SSK/J0r0  SSK1J2r2J3r3  SSK4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<  SSK=J>r>  SSK?J@r@  SSKAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrKJLrLJMrMJNrN  SSKOJPrPJQrQ  SSKRJSrSJTrTJUrUJVrVJWrWJXrXJYrYJZrZJ[r[J\r\  SSK]J^r^  SSK_J`r`Jara  SSKbJcrcJdrdJereJfrfJgrgJhrhJiriJjrjJkrk  SSKlJmrm  S S!KnJoro  SS"KpJqrq  SS#KrJsrs  SS$KtJuruJvrvJwrwJxrx  SS%KyJzrz  SS&K{J|r|  SS'K}J~r~  SS(KJrJrJrJr  SS)KJr  SS*KJr  \ " S+ S,\	5      5       r\ " S- S.\\	5      5       r\ " S/ S0\5      5       r\ " S1 S2\5      5       r\ " S3 S4\5      5       r\ " S5 S6\5      5       r\ " S7 S8\5      5       r\ " S9 S:\5      5       r\ " S; S<\5      5       r\ " S= S>\5      5       r\ " S? S@\\	5      5       r\ " SA SB\5      5       r\ " SC SD\5      5       r\ " SE SF\5      5       r\ " SG SH\5      5       r\ " SI SJ\5      5       r\ " SK SL\5      5       r\ " SM SN\\	5      5       r\ " SO SP\5      5       r\ " SQ SR\5      5       r\ " SS ST\5      5       r\ " SU SV\5      5       r\ " SW SX\5      5       r\ " SY SZ\5      5       r\ " S[ S\\5      5       r\ " S] S^\5      5       r\ " S_ S`\5      5       r\ " Sa Sb\5      5       r\ " Sc Sd\5      5       r\ " Se Sf\5      5       r\ " Sg Sh\5      5       r\ " Si Sj\5      5       r\ " Sk Sl\5      5       r\ " Sm Sn\5      5       r\ " So Sp\5      5       r\ " Sq Sr\5      5       r\ " Ss St\5      5       r\ " Su Sv\\	5      5       r\ " Sw Sx\5      5       r\ " Sy Sz\5      5       r\ " S{ S|\5      5       r\ " S} S~\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\\	5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r " S S\5      rS rS r\K\J\I\L\M\N4rS rS rS rS rS rS rS rS rS r/ rS\S'   / r\," S5      rS rSS jrSS jrSSS jjrS rSS jrSS jrS rS rSS jrS rSS jrSSS jjrSS jr\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS rS r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      r\" S 5      rS rS rS rS rS rS rS Gr SS jGrS Gr\" S S 5      Gr\" S S 5      Gr\" S S 5      Gr\" S S 5      GrS GrS GrS Gr	0 Gr
S\S'   \" G\5      GrS\S'   \," S5      GrS GrS Grg)a/  Integration method that emulates by-hand techniques.

This module also provides functionality to get the steps used to evaluate a
particular integral, in the ``integral_steps`` function. This will return
nested ``Rule`` s representing the integration rules used.

Each ``Rule`` class represents a (maybe parametrized) integration rule, e.g.
``SinRule`` for integrating ``sin(x)`` and ``ReciprocalSqrtQuadraticRule``
for integrating ``1/sqrt(a+b*x+c*x**2)``. The ``eval`` method returns the
integration result.

The ``manualintegrate`` function computes the integral by calling ``eval``
on the rule returned by ``integral_steps``.

The integrator can be extended with new heuristics and evaluation
techniques. To do so, extend the ``Rule`` class, implement ``eval`` method,
then write a function that accepts an ``IntegralInfo`` object and returns
either a ``Rule`` instance or ``None``. If the new technique requires a new
match, add the key and call to the antiderivative function to integral_steps.
To enable simple substitutions, add the match to find_substitutions.

    )annotations)
NamedTupleTypeCallableSequence)ABCabstractmethod)	dataclass)defaultdict)Mapping)Add)cacheit)Dict)Expr)
Derivative)	fuzzy_not)Mul)IntegerNumberE)Pow)EqNeBoolean)S)DummySymbolWild)Abs)explog)HyperbolicFunctioncschcoshcothsechsinhtanhasinh)sqrt)	Piecewise)TrigonometricFunctioncossintancotcscsecacosasinatanacotacscasec)	Heaviside
DiracDelta)
erferfifresnelcfresnelsCiChiSiShiEili)
uppergamma)
elliptic_e
elliptic_f)	
chebyshevt
chebyshevulegendrehermitelaguerreassoc_laguerre
gegenbauerjacobiOrthogonalPolynomial)polylog   )Integral)And)primefactors)degreelcm_listgcd_listPoly)fraction)simplify)solve)switchdo_one	null_safe	condition)iterable)debugc                  R    \ rS rSr% S\S'   S\S'   \S
S j5       r\SS j5       rSrg	)RuleH   r   	integrandr   variablec                    g N selfs    W/var/www/auris/envauris/lib/python3.13/site-packages/sympy/integrals/manualintegrate.pyeval	Rule.evalM           c                    g ri   rj   rk   s    rm   contains_dont_knowRule.contains_dont_knowQ   rp   rq   rj   Nreturnr   rv   bool)	__name__
__module____qualname____firstlineno____annotations__r	   rn   rs   __static_attributes__rj   rq   rm   rd   rd   H   s3    O   rq   rd   c                  "    \ rS rSrSrSS jrSrg)
AtomicRuleV   z1A simple rule that does not depend on other rulesc                    g)NFrj   rk   s    rm   rs   AtomicRule.contains_dont_knowY   s    rq   rj   Nrw   )ry   rz   r{   r|   __doc__rs   r~   rj   rq   rm   r   r   V   s
    ;rq   r   c                  "    \ rS rSrSrSS jrSrg)ConstantRule]   zintegrate(a, x)  ->  a*xc                4    U R                   U R                  -  $ ri   )rf   rg   rk   s    rm   rn   ConstantRule.eval`   s    ~~--rq   rj   Nru   ry   rz   r{   r|   r   rn   r~   rj   rq   rm   r   r   ]   s
    ".rq   r   c                  L    \ rS rSr% SrS\S'   S\S'   S\S'   SS jrSS	 jrS
rg)ConstantTimesRuled   z.integrate(a*f(x), x)  ->  a*integrate(f(x), x)r   constantotherrd   substepc                P    U R                   U R                  R                  5       -  $ ri   )r   r   rn   rk   s    rm   rn   ConstantTimesRule.evalk   s    }}t||00222rq   c                6    U R                   R                  5       $ ri   r   rs   rk   s    rm   rs   $ConstantTimesRule.contains_dont_known       ||..00rq   rj   Nru   rw   	ry   rz   r{   r|   r   r}   rn   rs   r~   rj   rq   rm   r   r   d   s    8NKM31rq   r   c                  8    \ rS rSr% SrS\S'   S\S'   S	S jrSrg)
	PowerRuler   zintegrate(x**a, x)r   baser    c                    [        U R                  U R                  S-   -  U R                  S-   -  [        U R                  S5      4[	        U R                  5      S45      $ NrR   T)r+   r   r    r   r!   rk   s    rm   rn   PowerRule.evalx   sP    ii$((Q,'$((Q,7DHHb9IJ^T"
 	
rq   rj   Nru   ry   rz   r{   r|   r   r}   rn   r~   rj   rq   rm   r   r   r   s    
J	I
rq   r   c                  8    \ rS rSr% SrS\S'   S\S'   S	S jrSrg)
NestedPowRule   zintegrate((x**a)**b, x)r   r   r    c                    U R                   U R                  -  n[        XR                  S-   -  [	        U R                  S5      4U[        U R                   5      -  S45      $ r   )r   rf   r+   r    r   r!   )rl   ms     rm   rn   NestedPowRule.eval   sS    II&!xx!|,b2.>?c$))n,d35 	5rq   rj   Nru   r   rj   rq   rm   r   r      s    !
J	I5rq   r   c                  8    \ rS rSr% SrS\S'   S	S jrS
S jrSrg)AddRule   zDintegrate(f(x) + g(x), x) -> integrate(f(x), x) + integrate(g(x), x)
list[Rule]substepsc                4    [        S U R                   5       6 $ )Nc              3  @   #    U  H  oR                  5       v   M     g 7fri   )rn   .0r   s     rm   	<genexpr>AddRule.eval.<locals>.<genexpr>   s     A=\\^^=   )r   r   rk   s    rm   rn   AddRule.eval   s    A4==ABBrq   c                :    [        S U R                   5       5      $ )Nc              3  @   #    U  H  oR                  5       v   M     g 7fri   rs   r   s     rm   r   -AddRule.contains_dont_know.<locals>.<genexpr>   s     M}G--//}r   )anyr   rk   s    rm   rs   AddRule.contains_dont_know   s    Mt}}MMMrq   rj   Nru   rw   r   rj   rq   rm   r   r      s    NCNrq   r   c                  L    \ rS rSr% SrS\S'   S\S'   S\S'   SS	 jrSS
 jrSrg)URule   z;integrate(f(g(x))*g'(x), x) -> integrate(f(u), u), u = g(x)r   u_varr   u_funcrd   r   c                Z   U R                   R                  5       nU R                  R                  (       aQ  U R                  R	                  5       u  p#US:X  a/  UR                  [        U R                  5      [        U5      * 5      nUR                  U R                  U R                  5      $ )Nr   )r   rn   r   is_Powas_base_expsubsr!   r   )rl   resultr   exp_s       rm   rn   
URule.eval   ss    ""$;;002JDrzS_s4yjA{{4::t{{33rq   c                6    U R                   R                  5       $ ri   r   rk   s    rm   rs   URule.contains_dont_know   r   rq   rj   Nru   rw   r   rj   rq   rm   r   r      s    EMLM41rq   r   c                  V    \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   SS jrSS jrSrg)	PartsRule   z@integrate(u(x)*v'(x), x) -> u(x)*v(x) - integrate(u'(x)*v(x), x)r   ur   dvrd   v_stepRule | Nonesecond_stepc                    U R                   c   eU R                  R                  5       nU R                  U-  U R                   R                  5       -
  $ ri   )r   r   rn   r   )rl   vs     rm   rn   PartsRule.eval   sH    +++KKvvzD,,11333rq   c                    U R                   R                  5       =(       d/    U R                  S L=(       a    U R                  R                  5       $ ri   )r   rs   r   rk   s    rm   rs   PartsRule.contains_dont_know   s@    {{--/ TD(RT-=-=-P-P-R	Trq   rj   Nru   rw   r   rj   rq   rm   r   r      s%    JIHL4
Trq   r   c                  B    \ rS rSr% SrS\S'   S\S'   SS jrSS jrS	rg
)CyclicPartsRule   z9Apply PartsRule multiple times to integrate exp(x)*sin(x)zlist[PartsRule]parts_rulesr   coefficientc                    / nSnU R                    H@  nUR                  X#R                  -  UR                  R	                  5       -  5        US-  nMB     [        U6 SU R                  -
  -  $ )NrR   r   )r   appendr   r   rn   r   r   )rl   r   signrules       rm   rn   CyclicPartsRule.eval   se    $$DMM$-$++*:*:*<<=BJD % F|q4#3#3344rq   c                :    [        S U R                   5       5      $ )Nc              3  @   #    U  H  oR                  5       v   M     g 7fri   r   r   s     rm   r   5CyclicPartsRule.contains_dont_know.<locals>.<genexpr>   s     P?OG--//?Or   )r   r   rk   s    rm   rs   "CyclicPartsRule.contains_dont_know   s    Pt?O?OPPPrq   rj   Nru   rw   r   rj   rq   rm   r   r      s    C  5Qrq   r   c                      \ rS rSrSrg)TrigRule   rj   Nry   rz   r{   r|   r~   rj   rq   rm   r   r          rq   r   c                  "    \ rS rSrSrSS jrSrg)SinRule   zintegrate(sin(x), x) -> -cos(x)c                .    [        U R                  5      * $ ri   )r-   rg   rk   s    rm   rn   SinRule.eval       DMM"""rq   rj   Nru   r   rj   rq   rm   r   r      s
    )#rq   r   c                  "    \ rS rSrSrSS jrSrg)CosRule   zintegrate(cos(x), x) -> sin(x)c                ,    [        U R                  5      $ ri   )r.   rg   rk   s    rm   rn   CosRule.eval       4==!!rq   rj   Nru   r   rj   rq   rm   r   r      s
    ("rq   r   c                  "    \ rS rSrSrSS jrSrg)
SecTanRule   z%integrate(sec(x)*tan(x), x) -> sec(x)c                ,    [        U R                  5      $ ri   )r2   rg   rk   s    rm   rn   SecTanRule.eval   r   rq   rj   Nru   r   rj   rq   rm   r   r      s
    /"rq   r   c                  "    \ rS rSrSrSS jrSrg)
CscCotRule   z&integrate(csc(x)*cot(x), x) -> -csc(x)c                .    [        U R                  5      * $ ri   )r1   rg   rk   s    rm   rn   CscCotRule.eval   r   rq   rj   Nru   r   rj   rq   rm   r   r      s
    0#rq   r   c                  "    \ rS rSrSrSS jrSrg)Sec2Rule   z!integrate(sec(x)**2, x) -> tan(x)c                ,    [        U R                  5      $ ri   )r/   rg   rk   s    rm   rn   Sec2Rule.eval   r   rq   rj   Nru   r   rj   rq   rm   r   r      s
    +"rq   r   c                  "    \ rS rSrSrSS jrSrg)Csc2Rule   z"integrate(csc(x)**2, x) -> -cot(x)c                .    [        U R                  5      * $ ri   )r0   rg   rk   s    rm   rn   Csc2Rule.eval   r   rq   rj   Nru   r   rj   rq   rm   r  r     s
    ,#rq   r  c                      \ rS rSrSrg)HyperbolicRule   rj   Nr   rj   rq   rm   r	  r	     r   rq   r	  c                  "    \ rS rSrSrSS jrSrg)SinhRulei  z integrate(sinh(x), x) -> cosh(x)c                ,    [        U R                  5      $ ri   )r$   rg   rk   s    rm   rn   SinhRule.eval      DMM""rq   rj   Nru   r   rj   rq   rm   r  r    s
    *#rq   r  c                      \ rS rSrSrS rSrg)CoshRulei
  z integrate(cosh(x), x) -> sinh(x)c                ,    [        U R                  5      $ ri   )r'   rg   rk   s    rm   rn   CoshRule.eval  r  rq   rj   Nr   rj   rq   rm   r  r  
  s
    *#rq   r  c                  8    \ rS rSr% SrS\S'   S\S'   S	S jrSrg)
ExpRulei  z integrate(a**x, x) -> a**x/ln(a)r   r   r    c                F    U R                   [        U R                  5      -  $ ri   )rf   r!   r   rk   s    rm   rn   ExpRule.eval  s    ~~DII..rq   rj   Nru   r   rj   rq   rm   r  r    s    *
J	I/rq   r  c                  .    \ rS rSr% SrS\S'   SS jrSrg)	ReciprocalRulei  zintegrate(1/x, x) -> ln(x)r   r   c                ,    [        U R                  5      $ ri   )r!   r   rk   s    rm   rn   ReciprocalRule.eval   s    499~rq   rj   Nru   r   rj   rq   rm   r  r    s    $
Jrq   r  c                  "    \ rS rSrSrSS jrSrg)
ArcsinRulei$  z'integrate(1/sqrt(1-x**2), x) -> asin(x)c                ,    [        U R                  5      $ ri   )r4   rg   rk   s    rm   rn   ArcsinRule.eval'  r  rq   rj   Nru   r   rj   rq   rm   r  r  $  s
    1#rq   r  c                  "    \ rS rSrSrSS jrSrg)ArcsinhRulei+  z'integrate(1/sqrt(1+x**2), x) -> asin(x)c                ,    [        U R                  5      $ ri   )r)   rg   rk   s    rm   rn   ArcsinhRule.eval.  s    T]]##rq   rj   Nru   r   rj   rq   rm   r!  r!  +  s
    1$rq   r!  c                  B    \ rS rSr% SrS\S'   S\S'   S\S'   S
S jrSrg	)ReciprocalSqrtQuadraticRulei2  zWintegrate(1/sqrt(a+b*x+c*x**2), x) -> log(2*sqrt(c)*sqrt(a+b*x+c*x**2)+b+2*c*x)/sqrt(c)r   abcc           	         U R                   U R                  U R                  U R                  4u  pp4[	        S[        U5      -  [        XU-  -   X4S-  -  -   5      -  U-   SU-  U-  -   5      [        U5      -  $ )N   )r&  r'  r(  rg   r!   r*   rl   r&  r'  r(  xs        rm   rn    ReciprocalSqrtQuadraticRule.eval9  sl    VVTVVTVVT]]:
a1T!W9T!aC%Q$,//1!A#a%78a@@rq   rj   Nru   r   rj   rq   rm   r%  r%  2  s    aGGGArq   r%  c                  L    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   SS	 jrS
rg)SqrtQuadraticDenomRulei>  z(integrate(poly(x)/sqrt(a+b*x+c*x**2), x)r   r&  r'  r(  z
list[Expr]coeffsc           	       ^^^ U R                   U R                  U R                  U R                  R	                  5       U R
                  4u  pnmm/ mTR	                  5       m[        [        T5      S-
  5       Hg  n[        T5      S-
  U-
  nTU   X5-  -  nTR                  U5        TUS-   ==   SU-  S-
  U-  S-  U-  -  ss'   TUS-   ==   US-
  U-  U-  -  ss'   Mi     TS   TS   p[        XT-  -   UTS-  -  -   5      n	XrU-  SU-  -  -
  n
U
S:X  a  SnO)[        [        SU	-  T5      SS9nXR                  5       -  n[        / UUU4S j[        [        T5      5       5       QX-  P76 U	-  U-   $ )	Nr*  rR   r   r   F
degeneratec              3  X   >#    U  H  nTU   T[        T5      S -
  U-
  -  -  v   M!     g7f)r*  N)len)r   ir0  result_coeffsr,  s     rm   r   .SqrtQuadraticDenomRule.eval.<locals>.<genexpr>^  s3      97 #1%a#f+a-/&::7s   '*)r&  r'  r(  r0  copyrg   ranger6  r   r*   inverse_trig_ruleIntegralInforn   r   )rl   r&  r'  r(  r7  ncoeffdesr   I0stepr0  r8  r,  s                @@@rm   rn   SqrtQuadraticDenomRule.evalF  s   !VVTVVTVVT[[5E5E5GVa s6{1}%AFAaA1IqsOE  '1Q3KAaCE19Q;u,,K1Q3KAaC75=(K & bz6":1Q3qAvqS!A#Y;q=B$\!A#q%9eLD))+%B ? 9#C$679 ?:;#??@ACEF 	Frq   rj   Nru   r   rj   rq   rm   r/  r/  >  s     2GGGFrq   r/  c                  B    \ rS rSr% SrS\S'   S\S'   S\S'   S
S jrSrg	)SqrtQuadraticRuleib  z integrate(sqrt(a+b*x+c*x**2), x)r   r&  r'  r(  c                r    [        [        U R                  U R                  5      SS9nUR	                  5       $ )NFr3  )sqrt_quadratic_ruler=  rf   rg   rn   )rl   rD  s     rm   rn   SqrtQuadraticRule.evali  s*    "<#N[`ayy{rq   rj   Nru   r   rj   rq   rm   rG  rG  b  s    *GGGrq   rG  c                  8    \ rS rSr% SrS\S'   S	S jrS
S jrSrg)AlternativeRulein  z Multiple ways to do integration.r   alternativesc                <    U R                   S   R                  5       $ Nr   )rM  rn   rk   s    rm   rn   AlternativeRule.evals  s      #((**rq   c                :    [        S U R                   5       5      $ )Nc              3  @   #    U  H  oR                  5       v   M     g 7fri   r   r   s     rm   r   5AlternativeRule.contains_dont_know.<locals>.<genexpr>w  s     Q?PG--//?Pr   )r   rM  rk   s    rm   rs   "AlternativeRule.contains_dont_knowv  s    Qt?P?PQQQrq   rj   Nru   rw   r   rj   rq   rm   rL  rL  n  s    *+Rrq   rL  c                  ,    \ rS rSrSrSS jrSS jrSrg)	DontKnowRuleiz  zLeave the integral as is.c                B    [        U R                  U R                  5      $ ri   )rS   rf   rg   rk   s    rm   rn   DontKnowRule.eval}  s    66rq   c                    gNTrj   rk   s    rm   rs   DontKnowRule.contains_dont_know  s    rq   rj   Nru   rw   )ry   rz   r{   r|   r   rn   rs   r~   rj   rq   rm   rV  rV  z  s    #7rq   rV  c                  "    \ rS rSrSrSS jrSrg)DerivativeRulei  zintegrate(f'(x), x) -> f(x)c                "   [        U R                  [        5      (       d   e[        U R                  R                  5      n[        U5       H!  u  nu  p4X0R                  :X  d  M  X4S-
  4X'     O   [        U R                  R                  /UQ76 $ NrR   )
isinstancerf   r   listvariable_count	enumeraterg   expr)rl   rb  r7  varcounts        rm   rn   DerivativeRule.eval  sz    $..*5555dnn;;<(8OA|mm#%(!)$4!  9 $..--???rq   rj   Nru   r   rj   rq   rm   r]  r]    s    %@rq   r]  c                  B    \ rS rSr% SrS\S'   S\S'   SS jrSS jrS	rg
)RewriteRulei  z;Rewrite integrand to another form that is easier to handle.r   	rewrittenrd   r   c                6    U R                   R                  5       $ ri   )r   rn   rk   s    rm   rn   RewriteRule.eval  s    ||  ""rq   c                6    U R                   R                  5       $ ri   r   rk   s    rm   rs   RewriteRule.contains_dont_know  r   rq   rj   Nru   rw   r   rj   rq   rm   ri  ri    s    EOM#1rq   ri  c                      \ rS rSrSrSrg)CompleteSquareRulei  z7Rewrite a+b*x+c*x**2 to a-b**2/(4*c) + c*(x+b/(2*c))**2rj   N)ry   rz   r{   r|   r   r~   rj   rq   rm   rp  rp    s    Arq   rp  c                  4    \ rS rSr% S\S'   SS jrS	S jrSrg)
PiecewiseRulei  z%Sequence[tuple[Rule, bool | Boolean]]subfunctionsc                |    [        U R                   VVs/ s H  u  pUR                  5       U4PM     snn6 $ s  snnf ri   )r+   rs  rn   )rl   r   conds      rm   rn   PiecewiseRule.eval  sG    040A0AC0A}w $LLND10AC D 	D Cs   8
c                :    [        S U R                   5       5      $ )Nc              3  F   #    U  H  u  pUR                  5       v   M     g 7fri   r   )r   r   _s      rm   r   3PiecewiseRule.contains_dont_know.<locals>.<genexpr>  s      TBSJG7--//BSs   !)r   rs  rk   s    rm   rs    PiecewiseRule.contains_dont_know  s    T$BSBSTTTrq   rj   Nru   rw   ry   rz   r{   r|   r}   rn   rs   r~   rj   rq   rm   rr  rr    s    77DUrq   rr  c                  H    \ rS rSr% S\S'   S\S'   S\S'   SS jrSS jrS	rg
)HeavisideRulei  r   hargibndrd   r   c                    U R                   R                  5       n[        U R                  5      XR	                  U R
                  U R                  5      -
  -  $ ri   )r   rn   r9   r  r   rg   r  )rl   r   s     rm   rn   HeavisideRule.eval  s@    
 ""$#vDMM4990U'UVVrq   c                6    U R                   R                  5       $ ri   r   rk   s    rm   rs    HeavisideRule.contains_dont_know  r   rq   rj   Nru   rw   r|  rj   rq   rm   r~  r~    s    
J
JMW1rq   r~  c                  >    \ rS rSr% S\S'   S\S'   S\S'   S	S jrSrg)
DiracDeltaRulei  r   r>  r&  r'  c                    U R                   U R                  U R                  U R                  4u  pp4US:X  a  [	        X#U-  -   5      U-  $ [        X#U-  -   US-
  5      U-  $ Nr   rR   )r>  r&  r'  rg   r9   r:   rl   r>  r&  r'  r,  s        rm   rn   DiracDeltaRule.eval  s]    VVTVVTVVT]]:
a6QsU#A%%!aC%1%a''rq   rj   Nru   ry   rz   r{   r|   r}   rn   r~   rj   rq   rm   r  r    s    GGG(rq   r  c                  \    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S	'   SS
 jrSS jrSrg)TrigSubstitutionRulei  r   thetafuncrj  rd   r   zbool | Booleanrestrictionc                (   U R                   U R                  U R                  p2nUR                  [	        U5      S[        U5      -  5      nUR                  [        U5      S[        U5      -  5      nUR                  [        U5      S[        U5      -  5      n[        UR                  [        5      5      n[        U5      S:X  d   eUS   n[        X2-
  U5      n[        U5      S:X  d   e[        US   5      u  pg[!        U[        5      (       a'  UnUn	[#        US-  US-  -
  5      n
[%        US   5      nOb[!        U[
        5      (       a'  Un
Un	[#        US-  US-  -
  5      n['        US   5      nO&UnUn
[#        US-  US-  -   5      n	[)        US   5      n[        U5      X-  4[        U5      X-  4[        U5      X-  4X4/n[+        U R,                  R/                  5       R                  U5      R1                  5       U R2                  45      $ )NrR   r   r*  )r  r  rg   r   r2   r-   r1   r.   r0   r/   ra  findr,   r6  r\   rZ   r`  r*   r4   r3   r5   r+   r   rn   trigsimpr  )rl   r  r  r,  trig_functionrelationnumerdenomopposite
hypotenuseadjacentinversesubstitutions                rm   rn   TrigSubstitutionRule.eval  s   TYYQyyUQs5z\2yyUQs5z\2yyUQs5z\2TYY'<=>=!Q&&&%a(=18}!!!,mS))HJE1Huax/0H8A;'Gs++HJE1Huax/0H8A;'GHHeQh12J8A;'G Z,-Z,-Z*+	
 ""$)),7@@BDDTDTU
 	
rq   c                6    U R                   R                  5       $ ri   r   rk   s    rm   rs   'TrigSubstitutionRule.contains_dont_know  r   rq   rj   Nru   rw   r|  rj   rq   rm   r  r    s'    K
JOM%
N1rq   r  c                  B    \ rS rSr% SrS\S'   S\S'   S\S'   S
S jrSrg	)
ArctanRulei  zAintegrate(a/(b*x**2+c), x) -> a/b / sqrt(c/b) * atan(x/sqrt(c/b))r   r&  r'  r(  c                    U R                   U R                  U R                  U R                  4u  pp4X-  [	        X2-  5      -  [        U[	        X2-  5      -  5      -  $ ri   )r&  r'  r(  rg   r*   r5   r+  s        rm   rn   ArctanRule.eval	  sJ    VVTVVTVVT]]:
asT!#YaQS	k!222rq   rj   Nru   r   rj   rq   rm   r  r    s    KGGG3rq   r  c                       \ rS rSr% S\S'   Srg)OrthogonalPolyRulei  r   r>  rj   Nry   rz   r{   r|   r}   r~   rj   rq   rm   r  r    s    Grq   r  c                  4    \ rS rSr% S\S'   S\S'   SS jrSrg)	
JacobiRulei  r   r&  r'  c           	     B   U R                   U R                  U R                  U R                  4u  pp4[	        S[        US-   US-
  US-
  U5      -  X-   U-   -  [        X-   U-   S5      4U[        US5      4X#-   S-   US-  -  S-  X#-
  U-  S-  -   [        US5      45      $ )Nr*  rR   r      )r>  r&  r'  rg   r+   rO   r   r   r  s        rm   rn   JacobiRule.eval  s    VVTVVTVVT]]:
ava!eQUAE1--quqy92aeai;KL1aMeaiAa15!)A+-r!Qx8: 	:rq   rj   Nru   r  rj   rq   rm   r  r    s    GG:rq   r  c                  *    \ rS rSr% S\S'   SS jrSrg)GegenbauerRulei   r   r&  c                   U R                   U R                  U R                  p2n[        [	        US-   US-
  U5      SUS-
  -  -  [        US5      4[        US-   U5      US-   -  [        US5      4[        R                  S45      $ )NrR   r*  r   T)	r>  r&  rg   r+   rN   r   rH   r   Zero)rl   r>  r&  r,  s       rm   rn   GegenbauerRule.eval$  s    &&$&&$--aAq1ua(!QU)4bAh?Aq!1q5)2a95VVTN 	rq   rj   Nru   r  rj   rq   rm   r  r     s    Grq   r  c                      \ rS rSrSS jrSrg)ChebyshevTRulei,  c                    U R                   U R                  p![        [        US-   U5      US-   -  [        US-
  U5      US-
  -  -
  S-  [	        [        U5      S5      4US-  S-  S45      $ )NrR   r*  T)r>  rg   r+   rH   r   r   rl   r>  r,  s      rm   rn   ChebyshevTRule.eval.  sz    vvt}}1Q"AE*Q"AE*+,-./1#a&!}>T!VTN 	rq   rj   Nru   ry   rz   r{   r|   rn   r~   rj   rq   rm   r  r  ,  s    rq   r  c                      \ rS rSrSS jrSrg)ChebyshevURulei6  c                    U R                   U R                  p![        [        US-   U5      US-   -  [	        US5      4[
        R                  S45      $ r   )r>  rg   r+   rH   r   r   r  r  s      rm   rn   ChebyshevURule.eval8  sK    vvt}}1Aq!1q5)2a95VVTN 	rq   rj   Nru   r  rj   rq   rm   r  r  6  s    rq   r  c                      \ rS rSrSS jrSrg)LegendreRulei?  c                    U R                   U R                  p![        US-   U5      [        US-
  U5      -
  SU-  S-   -  $ NrR   r*  )r>  rg   rJ   r  s      rm   rn   LegendreRule.evalA  s?    vvt}}1Aq!HQUA$661qAArq   rj   Nru   r  rj   rq   rm   r  r  ?  s    Brq   r  c                      \ rS rSrSS jrSrg)HermiteRuleiF  c                `    U R                   U R                  p![        US-   U5      SUS-   -  -  $ r  )r>  rg   rK   r  s      rm   rn   HermiteRule.evalH  s/    vvt}}1q1ua !QU),,rq   rj   Nru   r  rj   rq   rm   r  r  F  s    -rq   r  c                      \ rS rSrSS jrSrg)LaguerreRuleiM  c                f    U R                   U R                  p![        X5      [        US-   U5      -
  $ r_  )r>  rg   rL   r  s      rm   rn   LaguerreRule.evalO  s+    vvt}}1~Q 222rq   rj   Nru   r  rj   rq   rm   r  r  M      3rq   r  c                  *    \ rS rSr% S\S'   SS jrSrg)AssocLaguerreRuleiT  r   r&  c                f    [        U R                  S-   U R                  S-
  U R                  5      * $ r_  )rM   r>  r&  rg   rk   s    rm   rn   AssocLaguerreRule.evalX  s(    tvvz466A:t}}EEErq   rj   Nru   r  rj   rq   rm   r  r  T  s    GFrq   r  c                  *    \ rS rSr% S\S'   S\S'   Srg)IRulei\  r   r&  r'  rj   Nr  rj   rq   rm   r  r  \  s    GGrq   r  c                      \ rS rSrSS jrSrg)CiRuleib  c                    U R                   U R                  U R                  p2n[        U5      [	        X-  5      -  [        U5      [        X-  5      -  -
  $ ri   )r&  r'  rg   r-   r?   r.   rA   rl   r&  r'  r,  s       rm   rn   CiRule.evald  @    &&$&&$--a1vbg~Ar!#w..rq   rj   Nru   r  rj   rq   rm   r  r  b      /rq   r  c                      \ rS rSrSS jrSrg)ChiRuleii  c                    U R                   U R                  U R                  p2n[        U5      [	        X-  5      -  [        U5      [        X-  5      -  -   $ ri   )r&  r'  rg   r$   r@   r'   rB   r  s       rm   rn   ChiRule.evalk  B    &&$&&$--aAws13x$q'#ac("222rq   rj   Nru   r  rj   rq   rm   r  r  i  r  rq   r  c                      \ rS rSrSS jrSrg)EiRuleip  c                z    U R                   U R                  U R                  p2n[        U5      [	        X-  5      -  $ ri   )r&  r'  rg   r    rC   r  s       rm   rn   EiRule.evalr  s-    &&$&&$--a1vbg~rq   rj   Nru   r  rj   rq   rm   r  r  p  s    rq   r  c                      \ rS rSrSS jrSrg)SiRuleiw  c                    U R                   U R                  U R                  p2n[        U5      [	        X-  5      -  [        U5      [        X-  5      -  -   $ ri   )r&  r'  rg   r.   r?   r-   rA   r  s       rm   rn   SiRule.evaly  r  rq   rj   Nru   r  rj   rq   rm   r  r  w  r  rq   r  c                      \ rS rSrSS jrSrg)ShiRulei~  c                    U R                   U R                  U R                  p2n[        U5      [	        X-  5      -  [        U5      [        X-  5      -  -   $ ri   )r&  r'  rg   r'   r@   r$   rB   r  s       rm   rn   ShiRule.eval  r  rq   rj   Nru   r  rj   rq   rm   r  r  ~  r  rq   r  c                      \ rS rSrSS jrSrg)LiRulei  c                n    U R                   U R                  U R                  p2n[        X-  U-   5      U-  $ ri   )r&  r'  rg   rD   r  s       rm   rn   LiRule.eval  s-    &&$&&$--a!#'{1}rq   rj   Nru   r  rj   rq   rm   r  r    s    rq   r  c                  >    \ rS rSr% S\S'   S\S'   S\S'   S	S jrSrg)
ErfRulei  r   r&  r'  r(  c                   U R                   U R                  U R                  U R                  4u  pp4UR                  (       a  [        [        [        R                  5      [        U* 5      -  S-  [        X2S-  SU-  -  -
  5      -  [        SU-  U-  U-
  S[        U* 5      -  -  5      -  US:  4[        [        R                  5      [        U5      -  S-  [        X2S-  SU-  -  -
  5      -  [        SU-  U-  U-   S[        U5      -  -  5      -  S45      $ [        [        R                  5      [        U5      -  S-  [        X2S-  SU-  -  -
  5      -  [        SU-  U-  U-   S[        U5      -  -  5      -  $ )Nr*  r  r2  r   T)r&  r'  r(  rg   is_extended_realr+   r*   r   Pir    r;   r<   r+  s        rm   rn   ErfRule.eval  s^   VVTVVTVVT]]:
aaddD!H$Q&QAqs^)<<Aa!aaRj12345E;addDG#A%A1ac
N(;;!A#a%!)aQi012379: :
 ADDz$q'!!#c!dAaCj.&99ac!eai!DG),-. 	.rq   rj   Nru   r  rj   rq   rm   r  r    s    GGG	.rq   r  c                  >    \ rS rSr% S\S'   S\S'   S\S'   S	S jrSrg)
FresnelCRulei  r   r&  r'  r(  c           
        U R                   U R                  U R                  U R                  4u  pp4[	        [
        R                  5      [	        SU-  5      -  [        US-  SU-  -  U-
  5      [        SU-  U-  U-   [	        SU-  [
        R                  -  5      -  5      -  [        US-  SU-  -  U-
  5      [        SU-  U-  U-   [	        SU-  [
        R                  -  5      -  5      -  -   -  $ Nr*  r  )r&  r'  r(  rg   r*   r   r  r-   r=   r.   r>   r+  s        rm   rn   FresnelCRule.eval      VVTVVTVVT]]:
aADDz$qs)#1ac
Q!A#a%!)T!A#add(^)C DD1ac
Q!A#a%!)T!A#add(^)C DDEF 	Frq   rj   Nru   r  rj   rq   rm   r  r        GGGFrq   r  c                  >    \ rS rSr% S\S'   S\S'   S\S'   S	S jrSrg)
FresnelSRulei  r   r&  r'  r(  c           
        U R                   U R                  U R                  U R                  4u  pp4[	        [
        R                  5      [	        SU-  5      -  [        US-  SU-  -  U-
  5      [        SU-  U-  U-   [	        SU-  [
        R                  -  5      -  5      -  [        US-  SU-  -  U-
  5      [        SU-  U-  U-   [	        SU-  [
        R                  -  5      -  5      -  -
  -  $ r  )r&  r'  r(  rg   r*   r   r  r-   r>   r.   r=   r+  s        rm   rn   FresnelSRule.eval  r  rq   rj   Nru   r  rj   rq   rm   r  r    r  rq   r  c                  4    \ rS rSr% S\S'   S\S'   SS jrSrg)	PolylogRulei  r   r&  r'  c                b    [        U R                  S-   U R                  U R                  -  5      $ r_  )rQ   r'  r&  rg   rk   s    rm   rn   PolylogRule.eval  s$    tvvz466DMM#9::rq   rj   Nru   r  rj   rq   rm   r  r    s    GG;rq   r  c                  4    \ rS rSr% S\S'   S\S'   SS jrSrg)	UpperGammaRulei  r   r&  rA  c                    U R                   U R                  U R                  p2nX2-  U* U-  U* -  -  [        US-   U* U-  5      -  U-  $ r_  )r&  rA  rg   rE   )rl   r&  rA  r,  s       rm   rn   UpperGammaRule.eval  sM    &&$&&$--atr!trl"ZAr!t%<<Q>>rq   rj   Nru   r  rj   rq   rm   r  r    s    GG?rq   r  c                  4    \ rS rSr% S\S'   S\S'   SS jrSrg)	EllipticFRulei  r   r&  r@  c                    [        U R                  U R                  U R                  -  5      [	        U R                  5      -  $ ri   )rG   rg   r@  r&  r*   rk   s    rm   rn   EllipticFRule.eval  ,    $--7TVVDDrq   rj   Nru   r  rj   rq   rm   r  r        GGErq   r  c                  4    \ rS rSr% S\S'   S\S'   SS jrSrg)	EllipticERulei  r   r&  r@  c                    [        U R                  U R                  U R                  -  5      [	        U R                  5      -  $ ri   )rF   rg   r@  r&  r*   rk   s    rm   rn   EllipticERule.eval  r  rq   rj   Nru   r  rj   rq   rm   r  r    r	  rq   r  c                  *    \ rS rSr% S\S'   S\S'   Srg)r=  i  r   rf   r   symbolrj   Nr  rj   rq   rm   r=  r=    s    ONrq   r=  c                  ^ U R                   (       Ga  U R                   S   n[        U [        5      (       a   UR                  T5      [	        U5      S-  -  $ [        U [
        5      (       a!  UR                  T5      * [        U5      S-  -  $ [        U [        5      (       a)  UR                  T5      [	        U5      -  [        U5      -  $ [        U [        5      (       a*  UR                  T5      * [        U5      -  [        U5      -  $ [        U [        5      (       a  [        U4S jU R                    5       5      $ [        U [        5      (       ad  [        U R                   5      S:X  aK  [        U R                   S   [        5      (       a)  U R                   S   [        U R                   S   T5      -  $ U R                  T5      $ )a	  Derivative of f in form expected by find_substitutions

SymPy's derivatives for some trig functions (like cot) are not in a form
that works well with finding substitutions; this replaces the
derivatives for those particular forms with something that works better.

r   r*  c              3  <   >#    U  H  n[        UT5      v   M     g 7fri   )manual_diffr   argr  s     rm   r   manual_diff.<locals>.<genexpr>  s     B6C{3//6   rR   )argsr`  r/   diffr2   r0   r1   r   sumr   r6  r   r  )fr  r  s    ` rm   r  r    sR    	vvvffQia88F#c#hk113HHV$$s3x{22388F#c#h.S993HHV$$s3x/#c(::3B166BBB3166{aJqvvay&$A$Avvay;qvvay&#AAA66&>rq   c                  ^^ [        U5      S:X  aM  US   n[        U[        [        45      (       a  UR	                  5       nO:[        U5      (       d  [        S5      eO[        U5      S:X  a  U/nO[        S5      e/ nU Hb  u  nm[        U[        5      (       d  M  UR                  S   mU R                  U4S jU4S j5      n UR                  T[        T5      45        Md     U R                  [        U5      U-   5      $ )zb
A wrapper for `expr.subs(*args)` with additional logic for substitution
of invertible functions.
rR   r   z(Expected an iterable of (old, new) pairsr*  z$subs accepts either 1 or 2 argumentsc                H   > U R                   =(       a    U R                  T:H  $ ri   )r   r   )r,  x0s    rm   <lambda>manual_subs.<locals>.<lambda>  s    !((*Cqvv|*Crq   c                4   > [        U R                   T-  5      $ ri   )r    )r,  news    rm   r  r    s    #aeeCi.rq   )r6  r`  r   r   itemsra   
ValueErrorr!   r  replacer   r    r   ra  )rd  r  sequencenew_subsoldr!  r  s        @@rm   manual_subsr(    s    
 4yA~7hw00~~'H(##GHH $	Ta6?@@HSc3
 !B<< C(*DOORSN+  99T(^h.//rq   c                ^  ^ ^^^ / nU UU4S jnSU4S jjnUU4S jm[        [        R                  T" T 5      U" T 5      -   5      5       H^  nUT:X  a  M  [        UT5      nU" Xg5      nUSLd  M&  Uu  pUT R	                  TT5      :X  a  MB  XiU4n
X;  d  MM  UR                  U
5        M`     U$ )Nc                  > US:X  a  gTU-  n[        SR                  X T5      5        [        X T5      R                  5       nUR	                  T5      (       a  gTR                  T5      (       ab  UR                  T5      (       aL  [        U4S jTR                  5        5       5      n[        U4S jUR                  5        5       5      nXC:  a  gUR                  TSS9$ )Nr   Fz!substituted: {}, u: {}, u_var: {}c              3  <   >#    U  H  n[        UT5      v   M     g 7fri   rV   )r   tr  s     rm   r   ;find_substitutions.<locals>.test_subterm.<locals>.<genexpr>-  s     S8R1VAv..8Rr  c              3  <   >#    U  H  n[        UT5      v   M     g 7fri   r,  )r   r-  r   s     rm   r   r.  .  s     S6RF1e,,6Rr  )as_Add)	rb   formatr(  cancelhas_freeis_rational_functionmaxas_numer_denomas_independent)r   u_diffsubstituted
deg_before	deg_afterrf   r  r   s        rm   test_subterm(find_substitutions.<locals>.test_subterm"  s    Q;&(188OP!+%8??A''))&11k6V6VW\6]6]S	8P8P8RSSJSk6P6P6RSSI%))%)>>rq   c                ~  > / n/ n[        SS /S9nU R                  [        5       He  nUR                  S   nTUR                  ;  a  M$  UR                  UT-  5      nU(       a  UR                  Xc   5        MT  UR                  U5        Mg     U(       a&  UR                  [        [        U5      T-  5      5        U$ )Nr>  c                    U R                   $ ri   )
is_Integerr>  s    rm   r  :find_substitutions.<locals>.exp_subterms.<locals>.<lambda>6  s    ALLrq   
propertiesr   )r   r  r    r  free_symbolsmatchr   rX   )termlinear_coeffstermsr>  r   r  rF  r  s          rm   exp_subterms(find_substitutions.<locals>.exp_subterms3  s    "8!9:IIcND))A,CS---IIah'E$$UX.T" # LLXm4V;<=rq   c           
     t  > [        U [        [        /[        Q[        P[
        P[        P75      (       a  U R                  S   /$ [        U [        [        [        [        [        45      (       a  U R                  S   /$ [        U [        [        45      (       a  U R                  S   /$ [        U [        5      (       a  U R                  S   /$ [        U [         5      (       a?  / nU R                   H+  nUR#                  U5        UR%                  T" U5      5        M-     U$ [        U [&        5      (       Ga  U R                   Vs/ s H  o3R)                  T5      (       d  M  UPM     nnU R                  R*                  (       a  UR%                  [-        U R                  5       Vs/ s H;  nSUs=:  a  [/        U R                  S   5      :  d  M(  O  M,  U R0                  U-  PM=     sn5        U R0                  R2                  (       aE  UR%                  T" U R0                  5       Vs/ s H  nUR4                  (       d  M  UPM     sn5        U$ [        U [6        5      (       a?  / nU R                   H+  nUR#                  U5        UR%                  T" U5      5        M-     U$ / $ s  snf s  snf s  snf )Nr   rR   r*     )r`  r,   r"   inverse_trig_functionsr    r!   r9   r  rH   rI   rJ   rK   rL   rN   rM   rO   r   r   extendr   hasr@  rU   absr   is_Addr   r   )rG  rr   r  r@  r-  possible_subtermsr  s         rm   rT  -find_substitutions.<locals>.possible_subtermsD  s7   d24F 242 2"%2'02 3 3 IIaL>!z: '85 6 6IIaL>!z>:;;IIaL>!f%%IIaL>!c""AYY*1-.  Hc"" $		=	WWV_	A=xx""TXX0F 20F110s499Q<00 '0 '$))Q,0F 2 399##HH):499)E %)EA88  )E % &Hc""Ayy*3/0 ! H	 >2%s*   J+%J+*'J0J0J0-J5J5F)rG  r   )ra  dictfromkeysr  r   r   )rf   r  r   resultsr<  rJ  r   r8  new_integrandr   r  rT  s   ```        @rm   find_substitutionsrZ    s    G?""!F $-- 1) <|I?V VWX;Q'$Q/%&3#H	vu ==7L*|, Y Nrq   c                   ^ ^ U U4S jnU$ )z$Strategy that rewrites an integrand.c                   > U u  p[        SR                  UTU5      5        T" U 6 (       a@  T" U 6 nX1:w  a5  [        X25      n[        U[        5      (       d  U(       a  [        XX45      $ g g g g )Nz/Integral: {} is rewritten with {} on symbol: {})rb   r1  integral_stepsr`  rV  ri  )integralrf   r  rj  r   r`   rewrites        rm   	_rewriterrewriter.<locals>._rewriterx  sv    $	?FFyRY[abch*I%(;!'<88W&y)MM >E8 &  rq   rj   )r`   r_  r`  s   `` rm   rewriterrb  v  s    N rq   c                   ^ ^ U U4S jnU$ )zAStrategy that rewrites an integrand based on some other criteria.c           	        > U u  pUu  p#[        SR                  UTX05      5        U [        U5      -   nT" U6 (       a!  T" U6 nXR:w  a  [        X#U[	        XS5      5      $ g g )Nz@Integral: {} is rewritten with {} on symbol: {} and criteria: {})rb   r1  ra  ri  r]  )criteriar^  rf   r  r  rj  r`   r_  s         rm   _proxy_rewriter'proxy_rewriter.<locals>._proxy_rewriter  sr    %$	PWWXacjlr}~$x.(dI%"9iPYAbcc & rq   rj   )r`   r_  rf  s   `` rm   proxy_rewriterrh    s    d rq   c                   ^  U 4S jnU$ )z4Apply the rule that matches the condition, else Nonec                f   > TR                  5        H  u  pU" U 5      (       d  M  U" U 5      s  $    g ri   )r"  )rd  keyr   
conditionss      rm   multiplexer_rl#multiplexer.<locals>.multiplexer_rl  s+    #))+IC4yyDz! ,rq   rj   )rl  rm  s   ` rm   multiplexerro    s    " rq   c                    ^  U 4S jnU$ )zHStrategy that makes an AlternativeRule out of multiple possible results.c                  > / nSn[        S5        T Hi  nUS-   n[        SR                  X#5      5        U" U 5      nU(       d  M3  [        U[        5      (       a  MJ  X@:w  d  MQ  XA;  d  MX  UR	                  U5        Mk     [        U5      S:X  a  US   $ U(       aI  U Vs/ s H  o3R                  5       (       a  M  UPM     nnU(       a  [        / U QUP76 $ [        / U QUP76 $ g s  snf )Nr   zList of Alternative RulesrR   Rule {}: {})rb   r1  r`  rV  r   r6  rs   rL  )r^  altsrf  r   r   doableruless         rm   _alternatives#alternatives.<locals>._alternatives  s    )*DAIE-&&u34(^Fz&,??"v'9F#  t9>7N'+Mtt3J3J3LdtFM&99&99&77$77 Ms   C%;C%rj   )ru  rv  s   ` rm   rM  rM    s    8( rq   c                    [        U 6 $ ri   )r   r^  s    rm   constant_rulerz        ""rq   c           
     "   U u  pUR                  5       u  p4X$R                  ;  a?  [        U[        5      (       a*  [	        US-   5      S:X  a  [        XU5      $ [        XX45      $ X#R                  ;  a  [        U[        5      (       a  [        XX45      n[        [        U5      R                  5      (       a  U$ [        U5      R                  (       a  [        SU5      $ [        XU[        [        U5      S5      4[        SU5      S4/5      $ g g )NrR   r   T)r   rE  r`  r   r[   r  r   r  r   r!   is_zeror   rr  r   )r^  rf   r  r   exptr   s         rm   
power_ruler    s     I&&(JD&&&:dF+C+CD1H"!)T::D77	((	(Zf-E-Ey$5SY&&''KY6**Y2c$i#$!V$d+1
  	 .F	(rq   c                    U u  p[        UR                  S   [        5      (       a  [        X[        UR                  S   5      $ g rO  )r`  r  r   r  r   r^  rf   r  s      rm   exp_ruler    s=     I)..#V,,y!Y^^A->?? -rq   c                  ^ [         [        [        [        [        [
        [        [        [        [        [        [        [        [        [        [        0n[         S[        S[        S0nU u  nmU H}  n[!        X45      (       d  M  UR#                  US5      nUR$                  U   TL d  M;  ['        U4S jUR$                  S U  5       5      (       a  Md  X   " UT/UR$                  S U Q76 s  $    g )NrM  r*  rR   c              3  D   >#    U  H  oR                  T5      v   M     g 7fri   rP  )r   r   r  s     rm   r   'orthogonal_poly_rule.<locals>.<genexpr>  s     F+EaEE&MM+Es    )rO   r  rN   r  rH   r  rI   r  rJ   r  rK   r  rL   r  rM   r  r`  getr  r   )r^  orthogonal_poly_classesorthogonal_poly_var_indexrf   klass	var_indexr  s         @rm   orthogonal_poly_ruler    s    
NNN,,)	
 	A!

 !Iv(i''155eQ?Iy)V3F9>>*9+EFFF29)Viinn]g^gNhii )rq   z/list[tuple[Type, Expr, Callable | None, tuple]]_special_function_patternsr,  c                  ^ U u  p[         (       Gd+  [        S[        /S /S9n[        S[        /S9n[        S[        /S9n[        S[        /S /S9n[        S	[        /S
 /S9n[        R	                  X4XVU45        U[        -  U-   nU[        S-  -  U[        -  -   U-   n	[         R	                  [
        [        USS9[        -  S [        4[
        [        USS9[        -  S [        4[
        [        USS9[        -  S [        4[
        [        USS9[        -  S [        4[
        [        USS9[        -  S [        4[         S[#        USS9-  S [$        4[        [        U	SS9S [&        4[        [        U	SS9S [(        4[        [        U	SS9S [*        4[
        [        U-  [        U[        -  SS9-  S [,        4[
        [/        XC[        -  SS9[        -  S [0        4[         S[3        X6[        [        SS9S-  -  -
  5      -  S [4        4[         [3        X6[        [        SS9S-  -  -
  5      S [6        445        UR9                  U[        5      n
[          Hc  u  pp[;        X5      (       d  M  U
R=                  U5      mT(       d  M2  [?        U4S j[         5       5      nUb  U" U6 (       d  MZ  U" X/UQ76 s  $    g )Nr&  c                $    U R                   (       + $ ri   r}  r,  s    rm   r  'special_function_rule.<locals>.<lambda>  
    199}rq   excluderD  r'  r  r(  r@  c                $    U R                   (       + $ ri   r  r  s    rm   r  r    r  rq   rA  c                J    U R                   =(       a    U R                  (       + $ ri   )is_nonnegative
is_integerr  s    rm   r  r    s    1++<=rq   r*  FevaluaterR   c                
    X:g  $ ri   rj   r&  r@  s     rm   r  r        QVrq   c                
    X:g  $ ri   rj   r  s     rm   r  r  
  r  rq   c              3  n   >#    U  H*  nTR                  U5      c  M  TR                  U5      v   M,     g 7fri   )r  )r   wrF  s     rm   r   (special_function_rule.<locals>.<genexpr>  s-      "?1%*YYq\ #/%))A,,s   55) r  r   _symbol_wildsrO  r   r    r  r-   r  r$   r  r.   r  r'   r  r   r!   r  r  r  r  r  rQ   r  r*   r  r  r   r`  rF  tuple)r^  rf   r  r&  r'  r(  r@  rA  linear_patternquadratic_pattern
_integrandtype_pattern
constraintr   	wild_valsrF  s                   @rm   special_function_ruler    s    I%%wi5L4MNwi(wi(wi5L4MNwi=5? @qQ1o& 7QgqjL1W94q8"))#nu5g=tVL#nu5g=tVL$~6w>gN#nu5g=tVL$~6w>gN!C77vF#'%8$H#'%8$M#'%8$M'1*S7U;;T>R'!wY7?{S!Ds7U;Q>>>??#]4$qS591<<<=#]4+
 	" 0J,F(
j(($$W-Eu! "? "? ?	%Y)?)?	>I>> -Grq   c                |   Uc  U$ [        U[        5      (       a3  UR                   VVs/ s H  u  p4X4U -  R                  5       4PM     nnnOX4/n[        U[        5      (       a  XRR                  -  nO!UR	                  U[
        R                  45        [        UR                  UR                  U5      $ s  snnf ri   )	r`  rr  rs  r[   r   r   truerf   rg   )generic_condgeneric_stepdegenerate_stepr   ru  rs  s         rm   _add_degenerate_stepr    s    ,..-9-F-FH-FMG !,#6"@"@"BC-F 	 H &45/=11444_aff56//1F1FUUHs    B8c                v  ^^^^	^
^^ U u  nm[        ST/S9m[        STS/S9m	TT	T-  -   m[        R                  m
 " S S[        5      mSUUUU	U
UU4S jjm T" U5      u  p#T
[        R                  L a  S nO[	        UR                  TS5      T5      n[        UTX#5      n[        T
XT5      $ ! T a     g f = f)	Nr&  r  r'  r   c                      \ rS rSrSrg) nested_pow_rule.<locals>.NoMatchi/  rj   Nr   rj   rq   rm   NoMatchr  /  s    rq   r  c                D  > U R                  T5      (       d   [        R                  [        R                  4$ U R                  (       a  U R                  5       u  pU(       d   [        R                  [        R                  4$ U Vs/ s H  nT" U5      PM     nnU VVs1 s H  u  pQUiM	     nnnUR                  [        R                  5        [        U5      S:X  a  UR                  5       [        S U 5       6 4$ TeU R                  (       a?  U R                  U R                  puUR                  T5      (       a  TeT" U5      u  pXU-  4$ U R                  T5      n
U
(       a.  U
T   U
T   p[TX-  -   n[        US5      mU[        R                  4$ Tes  snf s  snnf )NrR   c              3  *   #    U  H	  u  pUv   M     g 7fri   rj   )r   ry  rA  s      rm   r   9nested_pow_rule.<locals>._get_base_exp.<locals>.<genexpr>=  s     )@!s   r   )r3  r   Oner  is_Mulas_coeff_muldiscardr6  popr   r   r   r    rF  r   )rd  ry  rI  rG  rX  r'  basesrA  base_sub_exprF  r&  r  _get_base_expa_b_r  r  r,  s               rm   r  &nested_pow_rule.<locals>._get_base_exp2  sM   }}Q55!&&= ;;((*HAuuaff}$7<=ut}T*uG=#*+741Q7E+MM!%% 5zQyy{C)@)@$AAAM;;99dhhqzz!}}*1-NEA+%%

7#9eBiqGEa8L!%%<' >+s   FF)rd  r   rv   ztuple[Expr, Expr])r   r   r  	Exceptionr   r   r   r  )r^  rf   r   r   r  r  r  r  r  r  r  r  r,  s         @@@@@@@rm   nested_pow_ruler  &  s    LIq	cA3	B	cAq6	"BAgG66L)  8"9-
 qvv 'y~~a';Q? At:LlLL  s   
B/ /B87B8c                  ^^ U u  mmTR                  5       u  p#[        ST/S9n[        ST/S9n[        STS/S9nUR                  XET-  -   UTS-  -  -   5      nU(       d  gSUU4S jjnXEU4 V	s/ s H"  oR                  U	[        R
                  5      PM$     sn	u  pEn[        US5      n
U(       a  U
[        R                  L a  SnO=UR                  (       a  [        XC-  T5      nO[        [        XET-  -   U-  T5      5      n[        SU-  S	-   5      S:X  Ga  U* SU-  -  XES-  S
U-  -  -
  p[        US5      nSnU[        R                  La4  [        S	[        UTU-
  S-  -  5      -  TTU-
  [        R                  5      nU[        R                   L a  U$ [#        TTXEU5      n[%        UUU5      nUR&                  (       a  UR&                  (       a  / n[(        US	U* SU4[+        US:  US:  5      4[,        US	US	U4[+        US:  US:  5      44 HK  u  nnU[        R                  L a  U" U6 s  $ U[        R                   Ld  M5  UR/                  U" U6 U45        MM     U(       a@  UR0                  (       d!  UR/                  U[        R                  45        [3        TTU5      nOUn[%        U
UU5      $ U[        R4                  :X  a  [7        TTXEU5      n[%        U
UU5      $ gs  sn	f )za
Set degenerate=False on recursive call where coefficient of quadratic term
is assumed non-zero.
r&  r  r'  r(  r   r*  Nc                b  > [        S5      nS[        X!-  XC-  TU-
  S-  -  -   5      -  n[        X1-  5      TU-
  -  nS[        U5      -  n	S n
UTLa  Un
UnS[        X$US-  -  -   5      -  nU " X5      nU	S:w  a  [        X-  TXU5      nU
b  [        UTXjU5      nUS:w  a  [	        TTX|5      nU$ )Nr   rR   r*  r   )r   r*   r   r   rp  )	RuleClassr&  sign_ar(  sign_chr   rj  quadratic_baser   r   standard_formr   rf   r  s                rm   make_inverse_trig,inverse_trig_rule.<locals>.make_inverse_trigj  s    c
d68fhq1}&<<==	acF1H-T!W9'#F"N$v~q/@(@@AAM:q='(>ahiGIvugFG6(FIOGrq   rR   r  r   )rv   rd   )r   r   rF  r  r   r  r   r  r}  r   sqrt_linear_ruler=  r[   r   r*   NegativeOnefalser%  r  is_realr  rT   r!  r   is_positiverr  HalfrG  )r^  r4  r   r    r&  r'  r(  rF  r  r7  r  r  r  knon_square_condsquare_stepr  rD  ru  r  ru  rf   r  s                        @@rm   r<  r<  [  s   
 !Iv%%'IDS6(#AS6(#AS61+&AJJqV8|a	k12E & /0AY7YyyAFF#Y7GA!a8L/	
&qx8*<ZC8OQW+XY#	ar1Q3xT1Q3Z1Q(!&&('$q&(Q*?(?PQSTS`S`aKagg%29faAN#O\;O99EaQBA.AE1q50ABq!Q1-s1q5!a%/@A
d 166>,d33qww&LL"3T":D!AB }}LL,!78$Y>##L$HH
aff} FA!<#L$HH K 8s   2)K-c                    U u  pUR                  5        Vs/ s H  n[        X25      PM     nnS U;   a  S $ [        XU5      $ s  snf ri   )as_ordered_termsr]  r   )r^  rf   r  grX  s        rm   add_ruler    sU     I 11353! a(3  57?4K	7(KK5s   Ac                v    U u  pUR                  U5      u  p4US:w  a  [        XB5      nUb  [        XX4U5      $ g g r_  )r7  r]  r   )r^  rf   r  r?  r  	next_steps         rm   mul_ruler    sN     I ''/HEz"1-	 $Y)LL ! rq   c                z  ^ U4S jnS
S jnU" [         5      U" [        6 X#" [        [        5      U" [        5      /n[        S5      n[        U [         /[        Q75      (       a  XP-  n [        U5       GHC  u  pgU" U 5      nU(       d  M  Uu  pTU	R                  ;  a  U	R                  U5      (       d    g U	R                  US5      n	U
R                  US5      n
Xr:X  a  U	R                  T5      (       d    g [        U	[         5      (       a-  SU
-  nUR                  T5      (       a  [        UT5      S:X  a    g Xr:X  a  U
R                  (       d/  U
R                  [        5      (       d  [        U
[        5      (       aK  [!        U
T5      nUR#                  5       (       a    g U	R%                  T5      nUR'                  5       nXXU4s  $ SnUS:  a  SnOXr:X  a5  U
R(                  (       a$  [+        S U
R(                   5       5      (       a  SnOLXFS-   S   HA  nU" U 5      nU(       d  M  US	   R                  US5      R-                  U
5      (       d  M?  Sn  O   U(       d  GM  U	R%                  T5      n[!        [/        U
5      T5      nUR#                  5       (       a  GM/  UR'                  5       nXXU4s  $    g )Nc                L  > U R                  5       R                  5       n [        U [        5      (       d  U R                  (       d  / O3U R
                   Vs/ s H  oR                  T5      (       d  M  UPM     snnU(       a  [        U6 nX-  R                  5       nX44$ g s  snf ri   )r2  togetherr`  r+   r  r  is_algebraic_exprr   )rf   r  	algebraicr   r   r  s        rm   pull_out_algebraic'_parts_rule.<locals>.pull_out_algebraic  s    $$&//1	%i;;9CSCSR!*Q#3H3H3P#Q 	YA-'')B5L  Rs   B!3B!c                    ^  SU 4S jjnU$ )Nc                   >^ ^ [        U 4S jT 5       5      (       aP  T R                   V^s/ s H!  m[        U4S jT 5       5      (       d  M  TPM#     nnU(       a  [        U6 nT U-  nX44$ g s  snf )Nc              3  F   >#    U  H  nTR                  U5      v   M     g 7fri   r  r   r  rf   s     rm   r   I_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<genexpr>  s     7Y9==##Y   !c              3  <   >#    U  H  n[        TU5      v   M     g 7fri   )r`  )r   clsr  s     rm   r   r    s     Iyz#s33yr  )r   r  r   )rf   r  r  r   r   	functionss   ``   rm   pull_out_u_rl6_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl  sh    7Y777'0~~ K~IyII ~ KT
A"QB5LKs   A/A/)rf   r   rv   ztuple[Expr, Expr] | Nonerj   )r  r  s   ` rm   
pull_out_u_parts_rule.<locals>.pull_out_u  s    	 rq   	temporaryrR   Fr*  Tc              3  X   #    U  H   n[        U[        [        [        45      v   M"     g 7fri   )r`  r.   r-   r    )r   r&  s     rm   r   _parts_rule.<locals>.<genexpr>  s'      " A q3S/22 s   (*r   )rv   z*Callable[[Expr], tuple[Expr, Expr] | None])r!   rN  r.   r-   r    r   r`  rc  rE  rP  r   is_polynomialrV   is_Derivativer,   rP   r]  rs   r  rn   r  allequalsr[   )rf   r  r  r  liate_rulesdummyindexr   r   r   r   rec_dvr   dur   acceptlrulerS  s    `                rm   _parts_ruler    se    c?J0F$G%z#s';c?$K
 +E)c;$:;<<%	 -i6EA Q^^+AEE%LLua A"B )!//&2I2I!S!!2((0066*a/ )##rvv.C'D'D"2';<<+B7F0022#VVF^"KKM aV33 Fqy, "" " "!F(4Ei(AqQqTYYua077;;!%	 5 vVVF^'f=0022A!//o .p rq   c                  ^^ U u  nmUR                  5       u  p![        UT5      n/ nU(       Ga  Uu  pVpxn	[        SR                  XVXxU	5      5        UR	                  U5        [        U[        5      (       a  g [        U[        [        [        [        [        45      (       a6  UR                  T[        05      n
[        U
   S:  a  g [        U
==   S-  ss'   [        S5       H  n[        SR                  XX5      5        Xx-  U-  R!                  5       nUS:X  a    OTUR"                  ;  ah  [%        UTU VVVVV	s/ s H  u  pVpxn	['        S S XVU	S 5      PM     sn	nnnnS[)        U5      -  U-  5      nUS:w  a  U(       a  [+        X!-  TX!U5      nUs  $ Xx-  R                  5       u  p[        UT5      nU(       a$  Uu  pVpxn	X^-  nX-  nUR	                  XVXxU	45        M    O   UU4S jmU(       aC  US   u  pVpxn	['        UTXVU	T" USS  Xx-  5      5      nUS:w  a  U(       a  [+        X!-  TX!U5      nU$ g s  sn	nnnnf )	Nz,u : {}, dv : {}, v : {}, du : {}, v_step: {}r*  rR   r  z7Cyclic integration {} with v: {}, du: {}, integrand: {}r   c                r   > U (       a$  U S   u  p#pEn[        UTX#UT" U SS  XE-  5      5      $ [        UT5      $ r  )r   r]  )	stepsrf   r   r   r   r  r   make_second_stepr  s	          rm   r
  $parts_rule.<locals>.make_second_stepI  sL    #(8 A1&Yv?OPUVWVXPY[\[a?bcci00rq   r   )as_coeff_Mulr  rb   r1  r   r`  rS   r.   r-   r    r'   r$   xreplace_cache_dummy_parts_u_cacher;  r2  rE  r   r   r6  r   )r^  rf   r   r   r	  r   r   r   r  r   cachekeyry  r   r   next_constantnext_integrandr
  r  s                   @@rm   
parts_ruler    sJ    Iv#002HF+FE%qf<CCA1RXYZVa"" a#sCt455zz6<"89Hh'!+8$)$ qAKRRSTY[ghFi/779Ka[555&y&38:38/! tT1&$?38:CJ&46 Mt,X-A68`deD ./V,A,A,C)M 8F'-$qf"#aQF341 41 $QxqfFA6;KERSRTIWXW];^_Mt$X%968X\]D 3:s   >H8c           	        U u  pU[        U5      :X  a  [        X5      $ U[        U5      :X  a  [        X5      $ U[	        U5      S-  :X  a  [        X5      $ U[        U5      S-  :X  a  [        X5      $ [        U[        5      (       a'  [        UR                  6 [        UR                  6 -  nGO[        U[        5      (       a&  [        UR                  6 [        UR                  6 -  nO[        U[        5      (       aN  UR                  S   n[	        U5      S-  [        U5      [	        U5      -  -   [	        U5      [        U5      -   -  nOd[        U[        5      (       aN  UR                  S   n[        U5      S-  [        U5      [        U5      -  -   [        U5      [        U5      -   -  nOg [        XU[        X25      5      $ Nr*  r   )r.   r   r-   r   r2   r   r1   r  r`  r/   r  r0   ri  r]  )r^  rf   r  rj  r  s        rm   	trig_ruler  W  sw    ICKy))CKy))CKN"	**CKN"	**)S!!(3	+??		Is	#	#(3	+??		Is	#	#nnQ#hkCHs3x$77#hS)+		Is	#	#nnQ#hkCHs3x$77#hS)+	 	y)^I5VWWrq   c                    U u  pU[        U5      [        U5      -  :X  a  [        X5      $ U[        U5      [	        U5      -  :X  a  [        X5      $ g ri   )r2   r/   r   r1   r0   r   r  s      rm   trig_product_ruler  s  sO     ICK#f+--),,CK#f+--),, .rq   c                   U u  p[        SU/S9n[        SU/S9n[        SU/S9nUR                  X4US-  -  U-   -  5      nU(       Gan  Xc   Xd   Xe   pTn[        XX4U5      nUR                  (       Ga  UR                  (       a  XT-  S:  nU[        R
                  L a  U$ US[        U* 5      -  [        U5      -  -  n	[        U* U-  5      n
SX*-
  -  nSX*-   -  n[        XX*-
  5      [        U* USU[        XX*-   5      5      /nX-
  =p[        XU5      nU	S:w  a  [        XS	S
9n[        XXU5      n[        XUU5      nU[        R                  L a  U$ [        XXx4U[        R
                  4/5      $ [        XUS5      nUS:w  a  [        XSU-  US-  U5      n[        XU[        US5      4US4/5      $ [        SU/S9nUR                  X4US-  -  XR-  -   U-   -  5      nU(       an  UU   UU   pTUR                   (       a  g [#        S5      nX%SU-  -  -   nUR%                  UUUSU-  -  -
  5      n['        UU5      nU(       a  [)        UUUUU5      $ g [        SU/S9nUR                  X2-  U-   XRS-  -  UU-  -   U-   -  5      nU(       a  UU   UU   UU   UU   UU   4u  p4nnnUR                   (       a  g XRS-  -  UU-  -   U-   nUSU-  -  nSU-  U-  U-   nU* U-  U-   n[#        S5      n[)        XUU['        US-  U5      5      nUS:w  a  [        UU-  U-  UUUU-  U5      nUR                   (       a  U$ ['        UU-  U5      n[        XUU/5      n UU-  U-  UU-  -   n![        XU!U 5      $ g )Nr&  r  r'  r(  r*  r   rR   r   Fr  r2  Tr@  r   rA  )r   rF  r  r  r   r  r*   r  r   r   r   ri  r  rr  r   r   r}  r   r   r]  r   )"r^  rf   r  r&  r'  r(  rF  general_rulepositive_condr?  r   r1r2	log_stepsrj  subnegative_steppowerr@  match2r   r   
integrand2r  rA  match3denominatorconstnumer1numer2step1step2r   rewritens"                                     rm   quadratic_denom_ruler,  {  s    IS6(#AS6(#AS6(#AOOAVq[1!456E(EHeha!)Q1=!"4"4C!GM&##qqbz$q')*EQBqDzHFO$BFO$B'FOD*B3Br[a[j@klnI g%I#C;MzU;	 1)UQ^ _'	9mTM'$$ l5RUbdedjdjTk4lmm)VR86%i1fbj%PEY,1a1IESW=0YZZS6(#A__Qfk/AJ">"BCDFq	6!9199#JQqS'!^^FAQqS	M:
":q1	VQ	BBS6(#A__ai!maK!f*0Lq0PQRFq	6!9fQiF1IMaA99!)ma&j014AaCQ3v:a<Q#JinQWa&@BA:%eFl;&>&+VK-?HE>>Lvk16:9uen=<+F;,>>9hAA
rq   c                    U u  p[        SU/S9n[        SUS/S9nS=pV/ / / pnUR                  [        5       H  n
U
R                  U
R                  pUR
                  (       d  X+R                  ;  a  M<  UR                  (       d    gUR                  X4U-  -   5      nU(       d  Mn  X   X   pX_-  X-  :w  d  Xo-  R                  (       d    gUS:X  d  Xo-  S:  [        R                  L a  XpeUR                  U5        U	R                  U5        UR                  UR                  5        M     US:X  a  g[        U5      nXVU-  -   SU-  -  n[        S5      nUR!                  [#        XyU5       VVVs0 s H<  u  pnU[        R$                  U-  -  XF-  [        R$                  U-  -  UUU-  -  -  _M>     snnn5      R!                  UUU-  U-
  U-  5      n['        UUUS-
  -  -  U-  U-  U5      nUR)                  5       (       d  [+        XUUU5      n[-        US5      nU[        R                  LaQ  UR!                  [.        R1                  U	S5      5      n['        UU5      n[3        XUU4U[        R                  4/5      nU$ gs  snnnf )z"
Substitute common (a+b*x)**(1/n)
r&  r  r'  r   NrR   r   )r   r  r   r   r    r@  rE  is_RationalrF  r  r   r  r   qrW   r   r   zipr  r]  rs   r   r   rV  rW  rr  )r^  rf   r,  r&  r'  a0b0r  qsbspow_r   r   rF  a1b1q0u_xr   r/  r9  r   rD  r  
simplifiedr  s                             rm   r  r    sg    LIS1#AS1a&!AKBBrEs#YYd??a'8'88

1qS5!58B5BE>"%!7!77ruqyQVV+T
		"
		$&&! $" 
Qw2,B19"
Cc
A..4724F"H4Fjdq #'q/ADAEE!G3DQAY3N"N4F"H IIMaRSUWRWXZRZ\^Q^I_ [RT225b8!<G%%''9C9"ayqvv%"b!(<=J,Z;O |0DXYX^X^F_/`aD ("Hs   3AJ	c           
     f  ^^^^ U u  nm[        ST/S9m[        ST/S9m[        STS/S9m[        S5      n[        SS /S	9nUR                  U[        TTT-  -   TTS
-  -  -   5      U-  -  5      nU(       d  g UT   UT   UT   XS   XT   4u  mmmp4UR                  T5      nUc  g [	        TS5      nU(       a  U[
        R                  L a  S nOWTR                  (       a  [        U[        T5      U-  -  T5      nO*[        [        U[        TTT-  -   5      U-  -  T5      5      nSUUUU4S jjn	US:  a^  UTTT-  -   TTS
-  -  -   US-   S
-  -  -  n
U
R                  5       [        TTT-  -   TTS
-  -  -   5      -  nU	" X5      n[        UTX5      nOUS:X  a	  U	" Xb5      nOg [        X}U5      $ )Nr&  r  r'  r(  r   r  r>  c                @    U R                   =(       a    U R                  $ ri   )r@  is_oddrA  s    rm   r  %sqrt_quadratic_rule.<locals>.<lambda>  s    (A(Arq   rC  r*  c                2  > [        TTT-  -   TTS-  -  -   5      nU R                  5       nUS::  GaD  US:X  a  U R                  5       O[        R                  U R                  5       4u  pEUST-  -  nXVT-  -
  nST-  T-  T-   U-  nS n	S n
US:w  ag  [        S5      n[        S[        U5      -  X[        R                  * 5      n[        UTUTTT-  -   TTS-  -  -   U5      n
US:w  a  [        Xh-  TXhU
5      n
US:w  a1  [        [        SU-  T5      SS9n	US:w  a  [        Xr-  TUSU-  U	5      n	U
(       a2  U	(       a+  [        Xh-  Xr-  SS9n[        UTU[        UTX/5      5      nU$ U
=(       d    U	n U$ U R                  5       n[!        UTTTTU5      nU$ )Nr*  rR   r   r   Fr3  r  )r*   rV   
all_coeffsr   r  as_exprr   r   r  r   r   r<  r=  r   ri  r   r/  )
numer_polyrf   r  degrA  r@  ABpre_substituteconstant_steplinear_stepr   pow_ruleaddrD  r0  r&  r'  r(  r,  s                   rm   sqrt_quadratic_denom_rule6sqrt_quadratic_rule.<locals>.sqrt_quadratic_denom_rule  s   QqsU1QT6\"!!8.1Qh:((*QVVZEWEWEY<ZDA1Q3AA#Ac!eAgu_N)-M'+KAv#J$QtAwYqvvg>#NAq!AaC%!Q$,Q6"3A4Da\g"hKAv 1,qw2JW\ ]6$5agq!QuWm$\M}!*AGeD$/	1c73PQT_SoCp$q 	 #3m   **,F))Q1aHDrq   rR   r   )rB  rY   rf   r   )r   rF  r*   as_polyr   r   r  r}  r]  r  r=  rA  ri  r  )r^  r4  rf   r  r>  rF  f_polyr  r  rK  rB  rj  r   r  r&  r'  r(  r,  s                 @@@@rm   rI  rI    s   LIqS1#AS1#AS1a&!AS	ASABCAOOAd1QqS51a4<0!334E!HeAha%(EHDMAq!QYYq\F~a8L/	
(47A:q9*<$q1u+q.8H!+LM @ 	1uq1uQq!tV|!Qw77
&&(a!eAadFl);;	+JB"9aD	
b0COLLrq   c                   U u  p[        U[        5      (       Ga  UR                  S   U:X  Ga  UR                  [        :X  a  [        X5      $ UR                  [        :X  a  [        X5      $ [        S5      nUR                  [        :X  aF  [	        U5      [        U5      -  n[        XU[        XBU[        U5      [        SU-  X35      5      5      $ UR                  [        :X  aF  [        U5      [	        U5      -  n[        XU[        XBU[	        U5      [        SU-  X35      5      5      $ UR                  [        5      nUR                  [        :X  a`  [        XU[        XBU[        US-  5      [!        SUS-  S-   -  U[#        S5      ["        R$                  ["        R$                  5      5      5      $ UR                  [&        :X  a2  [        XU[        XBU[        US-  5      [        SU-  X35      5      5      $ g g g )Nr   r   rR   r*  )r`  r"   r  r  r'   r  r$   r  r   r(   ri  r   r  r%   r_  r&   r  r   r  r#   )r^  rf   r  r   rj  s        rm   hyperbolic_rulerP  7  s    I)/00Y^^A5F&5P>>T!I..>>T!I..#J>>T!VT&\1Iy)AtF|^AaCQR=VWY Y>>T!VT&\1Iy)AtF|^AaCQR=VWY Y "))$/I~~%"9iY4q>!!QTAX,1Q4FHI I ~~%"9iY4q>%ac1023 3 &) 6Q0rq   c                n    [        SU /S9n[        SU /S9n[        SU /S /S9n[        SU /S /S9nXX44$ )	Nr&  r  r'  r   c                "    [        U [        5      $ ri   r`  r   rA  s    rm   r  make_wilds.<locals>.<lambda>V      *Q:Prq   r  r>  c                "    [        U [        5      $ ri   rS  rA  s    rm   r  rT  W  rU  rq   )r   )r  r&  r'  r   r>  s        rm   
make_wildsrW  R  sP    S6(#AS6(#AS6(0P/QRAS6(0P/QRA:rq   c                j    [        U 5      u  pp4[        X-  5      U-  [        X -  5      U-  -  nXQX#U4$ ri   )rW  r.   r-   r  r&  r'  r   r>  r  s         rm   sincos_patternrZ  [  =    F#JA!!(mQQX!11GqQrq   c                j    [        U 5      u  pp4[        X-  5      U-  [        X -  5      U-  -  nXQX#U4$ ri   )rW  r/   r2   rY  s         rm   tansec_patternr]  b  r[  rq   c                j    [        U 5      u  pp4[        X-  5      U-  [        X -  5      U-  -  nXQX#U4$ ri   )rW  r0   r1   rY  s         rm   cotcsc_patternr_  i  r[  rq   c                r    [        SU /S9n[        SU /S9n[        S5      n[        X-  U-   5      U-  nXAX#4$ )Nr   r  r'  r  )r   r9   )r  r   r'  r  r  s        rm   heaviside_patternra  p  sG    S6(#AS6(#AS	A1%)Gqrq   c                   ^  U 4S jnU$ )Nc                   > T" U 6 $ ri   rj   )r  r  s    rm   
uncurry_rluncurry.<locals>.uncurry_rlz  s    T{rq   rj   )r  rd  s   ` rm   uncurryrf  y  s    rq   c                   ^  U 4S jnU$ )Nc           	     \   > U u  pp4pVT" XX4XV5      nXu:w  a  [        XVU[        Xv5      5      $ g ri   )ri  r]  )	r  r&  r'  r   r>  rf   r  rj  r_  s	           rm   trig_rewriter_rl'trig_rewriter.<locals>.trig_rewriter_rl  s<    (,%aIA!	:	!y)^I=^__ "rq   rj   )r_  ri  s   ` rm   trig_rewriterrk  ~  s    `
 rq   c                    UR                   =(       a2    UR                   =(       a    UR                  =(       a    UR                  $ ri   )is_evenr  r&  r'  r   r>  r7  rB  s         rm   r  r    s4    QYY *199 **))*rq   c                x    S[        SU -  U-  5      -
  S-  US-  -  S[        SU-  U-  5      -   S-  US-  -  -  $ r  )r-   r&  r'  r   r>  r7  r  s         rm   r  r    sK    q3qs6z?':a&?QU%K'(3qs6z?':a&?QU%K%Mrq   c                2    UR                   =(       a    US:  $ NrM  r=  rn  s         rm   r  r        188;NQ;Nrq   c                x    S[        X-  5      S-  -
  US-
  S-  -  [        X-  5      -  [        X-  5      U-  -  $ r  )r-   r.   rp  s         rm   r  r    B    QQX)9%9a!eq[$I$'M%2$'MQ$6%7rq   c                2    UR                   =(       a    US:  $ rr  rs  rn  s         rm   r  r    rt  rq   c                x    S[        X-  5      S-  -
  US-
  S-  -  [        X-  5      -  [        X-  5      U-  -  $ r  )r.   r-   rp  s         rm   r  r    rv  rq   c                2    UR                   =(       a    US:  $ Nr  rm  rn  s         rm   r  r        AII<P!q&<Prq   c                ~    S[        X-  5      S-  -   US-  S-
  -  [        X-  5      S-  -  [        X-  5      U-  -  $ r  )r/   r2   rp  s         rm   r  r    G    QQX)9%9qsQw$G$'M1$4%5$'MQ$6%7rq   c                    UR                   $ ri   rs  rn  s         rm   r  r        188rq   c                x    [        X-  5      S-  S-
  US-
  S-  -  [        X-  5      -  [        X-  5      U-  -  $ Nr*  rR   )r2   r/   rp  s         rm   r  r    sB    S]A%5%9A{$K%(]%3%(]a%7%8rq   c                $    US:H  =(       a    US:H  $ r  rj   rn  s         rm   r  r    s    AF<MqAv<Mrq   c                (    [        X-  5      S-  S-
  $ r  )r2   rp  s         rm   r  r    s    CM1$4q$8rq   c                2    UR                   =(       a    US:  $ rz  r{  rn  s         rm   r  r    r|  rq   c                ~    S[        X-  5      S-  -   US-  S-
  -  [        X-  5      S-  -  [        X-  5      U-  -  $ r  )r0   r1   rp  s         rm   r  r    r~  rq   c                    UR                   $ ri   rs  rn  s         rm   r  r    r  rq   c                x    [        X-  5      S-  S-
  US-
  S-  -  [        X-  5      -  [        X-  5      U-  -  $ r  )r1   r0   rp  s         rm   r  r    sB    S]A%5%9A{$K$'M%2$'MQ$6%7rq   c                  ^	 U u  m	n[        U	4S j[        [        4 5       5      (       a  [        U5      u  p#pEnT	R	                  U5      nU(       d  g [        [        [        [        [        [        [        05      " [        X4XV4 Vs/ s H"  oR                  U[        R                  5      PM$     snT	U/-   5      5      $ g s  snf )Nc              3  F   >#    U  H  nTR                  U5      v   M     g 7fri   r  r  s     rm   r   #trig_sincos_rule.<locals>.<genexpr>       
0Z9==Zr  )r   r.   r-   rZ  rF  ro  sincos_botheven_conditionsincos_bothevensincos_sinodd_conditionsincos_sinoddsincos_cosodd_conditionsincos_cosoddr  r  r   r  
r^  r  r  r&  r'  r   r>  rF  r7  rf   s
            @rm   trig_sincos_ruler    s     Iv

0c3Z
000,V4A!(%#]#]
  ,-!<8<aYYq!&&!<8 !	" 	" 1 9s   )Cc                  ^	 U u  m	nT	R                  S[        U5      -  [        U5      05      m	[        U	4S j[        [        4 5       5      (       a  [        U5      u  p#pEnT	R                  U5      nU(       d  g [        [        [        [        [        [        [        05      " [        X4XV4 Vs/ s H"  oR                  U[         R"                  5      PM$     snT	U/-   5      5      $ g s  snf )NrR   c              3  F   >#    U  H  nTR                  U5      v   M     g 7fri   r  r  s     rm   r   #trig_tansec_rule.<locals>.<genexpr>  r  r  )r   r-   r2   r   r/   r]  rF  ro  tansec_tanodd_conditiontansec_tanoddtansec_seceven_conditiontansec_seceventan_tansquared_conditiontan_tansquaredr  r  r   r  r  s
            @rm   trig_tansec_ruler    s     Iv	CKV  I 
0c3Z
000,V4A!(#]$n$n
  ,-!<8<aYYq!&&!<8 !	" 	" 1 9s   /)C)c                6  ^	 U u  m	nT	R                  S[        U5      -  [        U5      S[        U5      -  [	        U5      [        U5      [        U5      -  [	        U5      05      m	[        U	4S j[        [        4 5       5      (       a  [        U5      u  p#pEnT	R                  U5      nU(       d  g [        [        [        [        [        05      " [        X4XV4 Vs/ s H"  oR                  U[         R"                  5      PM$     snT	U/-   5      5      $ g s  snf )NrR   c              3  F   >#    U  H  nTR                  U5      v   M     g 7fri   r  r  s     rm   r   #trig_cotcsc_rule.<locals>.<genexpr>  r  r  )r   r.   r1   r/   r0   r-   r   r_  rF  ro  cotcsc_cotodd_conditioncotcsc_cotoddcotcsc_csceven_conditioncotcsc_cscevenr  r  r   r  r  s
            @rm   trig_cotcsc_ruler    s     Iv	CKV	CKVFc&k!3v;  I 
0c3Z
000,V4A!(#]$n
  ,-!<8<aYYq!&&!<8 !" 	" 1 9s   )Dc                    U u  p[        S[        SU-  5      /S9nUR                  [        SU-  5      U-  5      nU(       a7  S[        U5      -  [        U5      -  [        SU-  5      -  n[	        X-  U5      $ g )Nr&  r*  r  )r   r.   rF  r-   r]  )r^  rf   r  r&  rF  
sin_doubles         rm   trig_sindouble_ruler    su     IS3qx=/*AOOC&M!O,Es6{]3v;.s1V8}<
i4f== rq   c                    [        [        [        5      [        [        5      [        [        5      [        [
        5      5      " U 5      $ ri   )r^   r_   r  r  r  r  ry  s    rm   trig_powers_products_ruler    s<    ),-,-,-/02 3;< <rq   c           
        U u  p[        SSU/S9n[        SSU/S9n[        S5      nX4US-  -  -   nUR                  U5      nU GH  nUR                  U5      n	U	R	                  U[
        R                  5      n
U	R	                  U[
        R                  5      nU
R                  =(       a    U
S:  =(       d    U
R                  nUR                  =(       a    US:  =(       d    UR                  nU
R                  =(       a    U
S:  =(       d    U
R                  nUR                  =(       a    US:  =(       d    UR                  nS nU(       a-  U(       a&  [        U
5      [        U5      -  [        U5      -  nSnOU(       aA  U(       a:  [        U
5      [        U* 5      -  nU[        U5      -  n[        UU* :  UU:  5      nOGU(       a@  U(       a9  [        U
* 5      [        U5      -  nU[        U5      -  n[        UU* :  UU:  5      nU(       d  GM  0 n[        [        [        [        [         ["        4 H@  nU" U5      U[        U" U5      S-  5      '   SU" U5      -  U[        U" U5      S	-  5      '   MB     UR%                  UU5      R'                  5       n[)        UU5      nUR+                  U5      (       a  GM{  U[-        UU5      -  nUR'                  5       nUR                  S[        U5      -  5      nU(       a(  UR/                  S[        U5      -  [        U5      05      n[1        UU5      nUR3                  5       (       a  GM
  [5        XUUUUW5      s  $    g )
Nr&  r   r  r'  r  r*  TrR   r2  )r   r   r  rF  r  r   r  	is_numberr  is_negativer*   r/   r.   rT   r2   r-   r1   r0   r   r  r(  rP  r  r  r]  rs   r  )r^  rf   r  rD  rE  r  target_patternmatchesrd  rF  r&  r'  
a_positive
b_positive
a_negative
b_negativex_funcr  r   substitutionsr  replacedsecantsr   s                           rm   trig_substitution_ruler    s    IS1f+&AS1f+&A'NE619_Nnn^,G

>*IIa IIa {{,q1u>
{{,q1u>
{{,q1u>
{{,q1u>
*1gd1goU3F KJAwtQBx'HE
*Ffy0&82CDKJQBxQ'HE
*Ffy0&82CDK6 M33%34U8d1U8Q;/067%jd1U8b>23%
 !~~ff5>>@H"8];H<<''K66#,,."--#e*5'00#e*c%j2  H )591133/	vx+G Gc rq   c                    U u  p[        U5      u  p4pVUR                  U5      nU(       a5  SXv   :w  a,  [        Xv   U5      nXt   Xu   pT[        XXB-  U-   U* U-  U5      $ g g rO  )ra  rF  r]  r~  )	r^  rf   r  r  r   r'  r  rF  r   s	            rm   heaviside_ruler  =  so     I(0GOOG$Eeh 62x1Y1qbdGLL	 urq   c                   U u  p[        UR                  5      S:X  a  [        R                  nOUR                  S   nUR                  (       a  US:  a  g [        SU/S9[        SUS/S9pTUR                  S   R                  XEU-  -   5      nU(       d  g Xd   Xe   pT[        US5      nU[        R                  L a  S nO[        [        XC5      U5      n[        XX4U5      n	[        XyU5      $ )NrR   r   r&  r  r'  )r6  r  r   r  r@  r   rF  r   r  r   r:   r  r  )
r^  rf   r,  r>  r&  r'  rF  r  r  r  s
             rm   dirac_delta_ruler  H  s    LI
9>>aFFNN1<<1q5aS!4aV#<qNN1##AcE*E8UXqa8Lqvv&z!'7;!)a8LOLLrq   c           
        U u  p[        S5      n[        XU5      nSnU(       Ga  [        S5        / nU GHf  u  pxn	[        X5      n
US-   n[        SR	                  XZ5      5        U
R                  5       (       a  MH  [        US-
  5      S:w  a  UR                  5       u  pU
(       a  [        X-  X8X5      n
UR                  (       a  / n/ n[        U[        5      (       a  UR                  nOUR                  U5        U H[  n[        UR                  5      (       a  M  [        [!        XS5      U5      nU(       d  M>  UR                  U[#        US5      45        M]     UR                  U
S45        [%        XU5      n
UR                  ['        XX7U
5      5        GMi     [)        U5      S:  a  [+        XU5      $ U(       a  US   $ g g )Nr   r   zList of Substitution RulesrR   rr  T)r   rZ  rb   r]  r1  rs   r[   r6  r   rE  r`  r   r  r   r   r}  r(  r   rr  r   r6  rL  )r^  rf   r  r   r  rf  waysr   r(  r9  subrulery  r  	piecewisecould_be_zerord  r   s                    rm   substitution_ruler  ^  s    I#JE&y%@ME*+&3"F{$[8GAIE-&&u67))++A!#++-/;`G%% "I$&M!%--(-

%,,U3 -(66&4[RS5TV\&]G&w ) 0 0$+$&tQK2" !# !. $$gt_5+KKGKKiHIE '4H t9q="9d;;7N S rq   c                "    U R                  5       $ ri   )r4  rf   r  s     rm   r  r    s    i<<>rq   c                $    U R                  U5      $ ri   )apartr  s     rm   r  r    s    ioof5rq   c                    grZ  rj   r  s     rm   r  r    s    drq   c                "    U R                  5       $ ri   )r2  r  s     rm   r  r        i..0rq   c                |   ^ [        U [        [        45      =(       d    [        U4S jU R                   5       5      $ )Nc              3  j   >#    U  H(  oR                   =(       d    UR                  T5      v   M*     g 7fri   )r   r  r  s     rm   r   <lambda>.<locals>.<genexpr>  s*     0sdr]`1Xs?P?PQW?X1Xdrs   03)r`  r   r   r  r  r  s    `rm   r  r    s+    9sCj)sS0sdmdrdr0s-ssrq   c                "    U R                  5       $ ri   expandr  s     rm   r  r    r  rq   c                    [        U R                  [        5       Vs1 s H  o"R                  S   iM     sn5      S:  $ s  snf r  )r6  atomsr,   r  )rf   r  r&  s      rm   r  r    s3    	0E FG F1VVAY FGH1LGs   ?c                     U R                  SS9$ )NT)trigr  r  s     rm   r  r    s    i..D.9rq   c                    U S   nUR                   nUR                  nUR                  nU R                  U;   a-  U R                  U;   a  [	        U 6 $ [        XR                  5      $ [        U 6 $ rO  )	variablesrd  rE  r  r]  rV  r   )r^  rf   diff_variablesundifferentiated_functionintegrand_variabless        rm   derivative_ruler    sj    I((N )3@@--??n,!8,,	??;;X&&rq   c           	         U u  pUR                  S[        U5      -  5      (       a=  UR                  S[        U5      -  [        U5      5      n[	        XU[        X25      5      $ g r_  )rF  r-   r   r2   ri  r]  )r^  rf   r  rj  s       rm   rewrites_ruler    sV     IqV}%%NN1S[=#f+>	9i	9Z[[ &rq   c                    [        U 6 $ ri   )rV  ry  s    rm   fallback_ruler    r{  rq   zdict[Expr, Expr | None]_integral_cachezdict[Expr, int]r  zc                r  ^^ U R                  T[        05      nU[        ;   a5  [        U   c  [        U T5      $ [        U   R                  [        T5      T4$ S[        U'   [	        U T5      nU4S jmU4S jn[        [        [        5      [        [        T[        [        [        [        5      [        [        5      [        [        5      [        [        5      5      [        [        [        [         ["        [$        [&        [        [        [(        5      [        [*        5      [        [,        5      [        [        5      [        [        5      [        [.        5      5      [0        [2        [4        [6        [8        [,        [:        [<        [>        [@        [B        [D        05      5      [        [        [6        5      [        [F        5      [        [I        [J        [L        [O        U" [&        [        5      [P        5      [O        U" [&        [        5      [R        5      [O        U" [&        [T        /[V        Q76 [X        5      [O        U" [&        [        5      [Z        5      [\        [^        5      5      [        [O        U" [&        [        5      [`        5      5      [        [b        5      5      [d        5      " U5      n[        U	 U$ )a  Returns the steps needed to compute an integral.

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

This function attempts to mirror what a student would do by hand as
closely as possible.

SymPy Gamma uses this to provide a step-by-step explanation of an
integral. The code it uses to format the results of this function can be
found at
https://github.com/sympy/sympy_gamma/blob/master/app/logic/intsteps.py.

Examples
========

>>> from sympy import exp, sin
>>> from sympy.integrals.manualintegrate import integral_steps
>>> from sympy.abc import x
>>> print(repr(integral_steps(exp(x) / (1 + exp(2 * x)), x)))     # doctest: +NORMALIZE_WHITESPACE
URule(integrand=exp(x)/(exp(2*x) + 1), variable=x, u_var=_u, u_func=exp(x),
substep=ArctanRule(integrand=1/(_u**2 + 1), variable=_u, a=1, b=1, c=1))
>>> print(repr(integral_steps(sin(x), x)))     # doctest: +NORMALIZE_WHITESPACE
SinRule(integrand=sin(x), variable=x)
>>> print(repr(integral_steps((x**2 + 3)**2, x)))     # doctest: +NORMALIZE_WHITESPACE
RewriteRule(integrand=(x**2 + 3)**2, variable=x, rewritten=x**4 + 6*x**2 + 9,
substep=AddRule(integrand=x**4 + 6*x**2 + 9, variable=x,
substeps=[PowerRule(integrand=x**4, variable=x, base=x, exp=4),
ConstantTimesRule(integrand=6*x**2, variable=x, constant=6, other=x**2,
substep=PowerRule(integrand=x**2, variable=x, base=x, exp=2)),
ConstantRule(integrand=9, variable=x)]))

Returns
=======

rule : Rule
    The first step; most rules have substeps that must also be
    considered. These substeps can be evaluated using ``manualintegrate``
    to obtain a result.

Nc                   > U R                   nTUR                  ;  a  [        $ [        [        [
        4 H  n[        X5      (       d  M  Us  $    [        U5      $ ri   )rf   rE  r   r   r,   rP   r`  type)r^  rf   r  r  s      rm   rk  integral_steps.<locals>.key  sQ    &&	///M13GHC)))
 I Irq   c                    >^  UU 4S jnU$ )Nc                >   > T" U 5      nU=(       a    [        UT5      $ ri   )
issubclass)r^  r  rk  klassess     rm   _integral_is_subclassKintegral_steps.<locals>.integral_is_subclass.<locals>._integral_is_subclass  s    HA/Aw//rq   rj   )r  r  rk  s   ` rm   integral_is_subclass,integral_steps.<locals>.integral_is_subclass  s    	0 %$rq   )3r  r  r  rV  r=  r^   r_   r  r]   r   r  r<  r  r,  r   r    r  r   r  r   r  r  r  rI  r   r  r,   r  r9   r:   r  rP   r  r   rz  rP  rM  r  r  r`   partial_fractions_rulecancel_ruler!   rN  r  distribute_expand_ruler  trig_expand_ruler  r  r  )rf   r  optionsr  r^  r  r   rk  s    `     @rm   r]  r]    s$   Z !!6<"89H?"8$,	622 $H-66|VL  %)!Iv.H% '(&	*-y9J/K!"23!"679 J	(+Y7H-I!.19=Q3R!"23!"568 !9~( "6M!
  	$ 	i o&l!(c2*, (c2! (c -+-  (c2*, * # & i 4S# >PQ,-/	
2 	[-Z  [-!F\ 	!Mrq   c                   [        X5      R                  5       n[        R                  5         [	        U[
        5      (       a  [        UR                  5      S:X  a  UR                  S   S   n[	        U[        5      (       a\  UR                  S   S   S:X  aF  UR                  UR                  S   S   [        UR                  6 4UR                  S   S   S45      nU$ )a  manualintegrate(f, var)

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

Compute indefinite integral of a single variable using an algorithm that
resembles what a student would do by hand.

Unlike :func:`~.integrate`, var can only be a single symbol.

Examples
========

>>> from sympy import sin, cos, tan, exp, log, integrate
>>> from sympy.integrals.manualintegrate import manualintegrate
>>> from sympy.abc import x
>>> manualintegrate(1 / x, x)
log(x)
>>> integrate(1/x)
log(x)
>>> manualintegrate(log(x), x)
x*log(x) - x
>>> integrate(log(x))
x*log(x) - x
>>> manualintegrate(exp(x) / (1 + exp(2 * x)), x)
atan(exp(x))
>>> integrate(exp(x) / (1 + exp(2 * x)))
RootSum(4*_z**2 + 1, Lambda(_i, _i*log(2*_i + exp(x))))
>>> manualintegrate(cos(x)**4 * sin(x), x)
-cos(x)**5/5
>>> integrate(cos(x)**4 * sin(x), x)
-cos(x)**5/5
>>> manualintegrate(cos(x)**4 * sin(x)**3, x)
cos(x)**7/7 - cos(x)**5/5
>>> integrate(cos(x)**4 * sin(x)**3, x)
cos(x)**7/7 - cos(x)**5/5
>>> manualintegrate(tan(x), x)
-log(cos(x))
>>> integrate(tan(x), x)
-log(cos(x))

See Also
========

sympy.integrals.integrals.integrate
sympy.integrals.integrals.Integral.doit
sympy.integrals.integrals.Integral
r*  r   rR   T)r]  rn   r  clearr`  r+   r6  r  r   r  r   )r  re  r   ru  s       rm   manualintegrater  C  s    b A#((*F&)$$V[[)9Q)>{{1~a dBFKKN1$5$=[[Q"B		N3Q"D)+F Mrq   N)r  rd   r  r   rv   rd   )r^  r=  )T)rv   z*tuple[Expr, Expr, Expr, Expr, Rule] | None)r^  ztuple[Expr, Symbol](  r   
__future__r   typingr   r   r   r   abcr   r	   dataclassesr
   collectionsr   collections.abcr   sympy.core.addr   sympy.core.cacher   sympy.core.containersr   sympy.core.exprr   sympy.core.functionr   sympy.core.logicr   sympy.core.mulr   sympy.core.numbersr   r   r   sympy.core.powerr   sympy.core.relationalr   r   r   sympy.core.singletonr   sympy.core.symbolr   r   r   $sympy.functions.elementary.complexesr   &sympy.functions.elementary.exponentialr    r!   %sympy.functions.elementary.hyperbolicr"   r#   r$   r%   r&   r'   r(   r)   (sympy.functions.elementary.miscellaneousr*   $sympy.functions.elementary.piecewiser+   (sympy.functions.elementary.trigonometricr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   'sympy.functions.special.delta_functionsr9   r:   'sympy.functions.special.error_functionsr;   r<   r=   r>   r?   r@   rA   rB   rC   rD   'sympy.functions.special.gamma_functionsrE   *sympy.functions.special.elliptic_integralsrF   rG   #sympy.functions.special.polynomialsrH   rI   rJ   rK   rL   rM   rN   rO   rP   &sympy.functions.special.zeta_functionsrQ   	integralsrS   sympy.logic.boolalgrT   sympy.ntheory.factor_rU   sympy.polys.polytoolsrV   rW   rX   rY   sympy.simplify.radsimprZ   sympy.simplify.simplifyr[   sympy.solvers.solversr\   sympy.strategies.corer]   r^   r_   r`   sympy.utilities.iterablesra   sympy.utilities.miscrb   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  r!  r%  r/  rG  rL  rV  r]  ri  rp  rr  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r=  r  r(  rN  rZ  rb  rh  ro  rM  rz  r  r  r  r  r}   r  r  r  r  r  r<  r  r  r  r  r  r  r,  r  rI  rP  rW  rZ  r]  r_  ra  rf  rk  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  intr  r  r]  r  rj   rq   rm   <module>r     sY
  . # 7 7 # ! # #  $ &   * &  1 1   1 1 " 1 1 4 ;) ) ) 9 :F F F F I( ( ( > M   ;  # . B B + , ' F F . & 
3 
 
 s   .: . . 
1 
1 
1 	

 	
 	
 5J 5 5 Nd N N 1D 1 1& T T T" Qd Q Q" 	z3 	 	 #h # # "h " " " " " # # # "x " " #x # # 	Z 	 	 #~ # # #~ # # /j / / Z   # # # $* $ $ A* A A  FZ  F  FF 
   Rd R R 4   	@Z 	@ 	@ 	1$ 	1 	1 	 	 	
 UD U U 1D 1 1" 	(Z 	( 	( /14 /1 /1d 3 3 3 S   	:# 	: 	: '   '   '   B% B B -$ - - 3% 3 3 F* F F J  
 /U / / 3e 3 3 U   /U / / 3e 3 3 U   .j . ." 	F: 	F 	F 	F: 	F 	F ;* ; ; ?Z ? ? EJ E E EJ E E: 
20B dD$= Un0#*@j2 OQ K P	
*(?VV2MjIIXLM\~<~X8-JZ)X@MF36 	 	 	 	 	 	 	 	 	 	
 $*+   OP ""NO 89
 ""NO 89
 ##PQ 9:
 ""CD :;
 ##MN 9; ##PQ 9:
 ""CD 9:
"""*"*><:GxMM,0f ">57   #0	2 "u02 
 N9	; '\# ,.( -"-c"2 2Sz{|;rq   