
    g'                   H   U d Z ddlmZ ddlmZmZmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN ddlOmPZPmQZQ ddlRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ ddl]m^Z^ ddl_m`Z`maZa ddlbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZk ddllmmZm d d!lnmoZo dd"lpmqZq dd#lrmsZs dd$ltmuZumvZvmwZwmxZx dd%lymzZz dd&l{m|Z| dd'l}m~Z~ dd(lmZmZmZmZ dd)lmZ dd*lmZ e G d+ d,e	                      Ze G d- d.ee	                      Ze G d/ d0e                      Ze G d1 d2e                      Ze G d3 d4e                      Ze G d5 d6e                      Ze G d7 d8e                      Ze G d9 d:e                      Ze G d; d<e                      Ze G d= d>e                      Ze G d? d@ee	                      Ze G dA dBe                      Ze G dC dDe                      Ze G dE dFe                      Ze G dG dHe                      Ze G dI dJe                      Ze G dK dLe                      Ze G dM dNee	                      Ze G dO dPe                      Ze G dQ dRe                      Ze G dS dTe                      Ze G dU dVe                      Ze G dW dXe                      Ze G dY dZe                      Ze G d[ d\e                      Ze G d] d^e                      Ze G d_ d`e                      Ze G da dbe                      Ze G dc dde                      Ze G de dfe                      Ze G dg dhe                      Ze G di dje                      Ze G dk dle                      Ze G dm dne                      Ze G do dpe                      Ze G dq dre                      Ze G ds dte                      Ze G du dvee	                      Ze G dw dxe                      Ze G dy dze                      Ze G d{ d|e                      Ze G d} d~e                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d dee	                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Ze G d de                      Z G d de          Zd Zd ZeKeJeIeLeMeNfZd Zd Zd Zd Zd Zd Zd Zd Zd Zg Zded<   g Z e,d          Zd ZddZddZdddZd ZddZddZd Zd ZddÄZdĄ ZddńZdddƄZd dȄZedɄ             Zedʄ             Zed˄             Zed̄             Zed̈́             Zd΄ Zdτ Z edЄ           Z edф           Z ed҄           Z edӄ           Z edԄ           Z edՄ           Z edք           Z edׄ           Z ed؄           Z edل           Z edڄ           Z edۄ           Z ed܄           Z ed݄           Z edބ           Z ed߄           Zd Zd Zd Zd Zd Zd Zd Z ddZd Z ed d           Z ed d           Z ed d           Z ed d           Zd Zd Zd Z	i Z
ded<    ee          Zded<    e,d          Zd Zd ZdS (  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                  T    e Zd ZU ded<   ded<   ed
d            Zedd            Zd	S )Ruler   	integrandr   variablereturnc                    d S N selfs    [/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/integrals/manualintegrate.pyevalz	Rule.evalM           boolc                    d S rj   rk   rl   s    rn   contains_dont_knowzRule.contains_dont_knowQ   rp   rq   Nrh   r   rh   rr   )__name__
__module____qualname____annotations__r	   ro   rt   rk   rq   rn   re   re   H   si         OOO   ^    ^  rq   re   c                      e Zd ZdZddZdS )
AtomicRulez1A simple rule that does not depend on other rulesrh   rr   c                    dS )NFrk   rl   s    rn   rt   zAtomicRule.contains_dont_knowY   s    urq   Nrv   )rw   rx   ry   __doc__rt   rk   rq   rn   r|   r|   V   s.        ;;     rq   r|   c                      e Zd ZdZddZdS )ConstantRulezintegrate(a, x)  ->  a*xrh   r   c                     | j         | j        z  S rj   )rf   rg   rl   s    rn   ro   zConstantRule.eval`   s    ~--rq   Nru   rw   rx   ry   r~   ro   rk   rq   rn   r   r   ]   s.        "". . . . . .rq   r   c                  B    e Zd ZU dZded<   ded<   ded<   ddZdd
ZdS )ConstantTimesRulez.integrate(a*f(x), x)  ->  a*integrate(f(x), x)r   constantotherre   substeprh   c                D    | j         | j                                        z  S rj   )r   r   ro   rl   s    rn   ro   zConstantTimesRule.evalk   s    }t|002222rq   rr   c                4    | j                                         S rj   r   rt   rl   s    rn   rt   z$ConstantTimesRule.contains_dont_known       |..000rq   Nru   rv   rw   rx   ry   r~   rz   ro   rt   rk   rq   rn   r   r   d   s_         88NNNKKKMMM3 3 3 31 1 1 1 1 1rq   r   c                  0    e Zd ZU dZded<   ded<   ddZdS )		PowerRulezintegrate(x**a, x)r   baser    rh   c                    t          | j        | j        dz   z  | j        dz   z  t          | j        d          ft	          | j                  df          S NrR   T)r+   r   r    r   r!   rl   s    rn   ro   zPowerRule.evalx   sP    i$(Q,'$(Q,7DHb9I9IJ^^T"
 
 	
rq   Nru   rw   rx   ry   r~   rz   ro   rk   rq   rn   r   r   r   sB         JJJIII
 
 
 
 
 
rq   r   c                  0    e Zd ZU dZded<   ded<   ddZdS )	NestedPowRulezintegrate((x**a)**b, x)r   r   r    rh   c                    | j         | j        z  }t          || j        dz   z  t	          | j        d          f|t          | j                   z  df          S r   )r   rf   r+   r    r   r!   )rm   ms     rn   ro   zNestedPowRule.eval   sU    I&!tx!|,b2.>.>?c$)nn,d35 5 	5rq   Nru   r   rk   rq   rn   r   r      sB         !!JJJIII5 5 5 5 5 5rq   r   c                  .    e Zd ZU dZded<   d
dZddZd	S )AddRulezDintegrate(f(x) + g(x), x) -> integrate(f(x), x) + integrate(g(x), x)
list[Rule]substepsrh   r   c                2    t          d | j        D              S )Nc              3  >   K   | ]}|                                 V  d S rj   ro   .0r   s     rn   	<genexpr>zAddRule.eval.<locals>.<genexpr>   s*      AAW\\^^AAAAAArq   )r   r   rl   s    rn   ro   zAddRule.eval   s    AA4=AAABBrq   rr   c                >    t          d | j        D                       S )Nc              3  >   K   | ]}|                                 V  d S rj   rt   r   s     rn   r   z-AddRule.contains_dont_know.<locals>.<genexpr>   s.      MMG7--//MMMMMMrq   )anyr   rl   s    rn   rt   zAddRule.contains_dont_know   s!    MMt}MMMMMMrq   Nru   rv   r   rk   rq   rn   r   r      sZ         NNC C C CN N N N N Nrq   r   c                  B    e Zd ZU dZded<   ded<   ded<   dd	ZddZdS )URulez;integrate(f(g(x))*g'(x), x) -> integrate(f(u), u), u = g(x)r   u_varr   u_funcre   r   rh   c                <   | j                                         }| j        j        rX| j                                        \  }}|dk    r6|                    t          | j                  t          |                     }|                    | j        | j                  S )Nr   )r   ro   r   is_Powas_base_expsubsr!   r   )rm   resultr   exp_s       rn   ro   z
URule.eval   s~    ""$$; 	B0022JD$rzzS__s4yyjAA{{4:t{333rq   rr   c                4    | j                                         S rj   r   rl   s    rn   rt   zURule.contains_dont_know   r   rq   Nru   rv   r   rk   rq   rn   r   r      s_         EEMMMLLLMMM4 4 4 41 1 1 1 1 1rq   r   c                  L    e Zd ZU dZded<   ded<   ded<   ded	<   ddZddZdS )	PartsRulez@integrate(u(x)*v'(x), x) -> u(x)*v(x) - integrate(u'(x)*v(x), x)r   ur   dvre   v_stepRule | Nonesecond_steprh   c                    | j         J | j                                        }| j        |z  | j                                         z
  S rj   )r   r   ro   r   )rm   vs     rn   ro   zPartsRule.eval   sD    +++KvzD,113333rq   rr   c                x    | j                                         p!| j        d uo| j                                        S rj   )r   rt   r   rl   s    rn   rt   zPartsRule.contains_dont_know   s>    {--// TD(RT-=-P-P-R-R	Trq   Nru   rv   r   rk   rq   rn   r   r      sq         JJIIIHHHLLL4 4 4 4
T T T T T Trq   r   c                  8    e Zd ZU dZded<   ded<   ddZdd	Zd
S )CyclicPartsRulez9Apply PartsRule multiple times to integrate exp(x)*sin(x)zlist[PartsRule]parts_rulesr   coefficientrh   c                    g }d}| j         D ]>}|                    ||j        z  |j                                        z             |dz  }?t          | d| j        z
  z  S )NrR   r   )r   appendr   r   ro   r   r   )rm   r   signrules       rn   ro   zCyclicPartsRule.eval   sk    $ 	 	DMM$-$+*:*:*<*<<===BJDDF|q4#3344rq   rr   c                >    t          d | j        D                       S )Nc              3  >   K   | ]}|                                 V  d S rj   r   r   s     rn   r   z5CyclicPartsRule.contains_dont_know.<locals>.<genexpr>   s.      PPG7--//PPPPPPrq   )r   r   rl   s    rn   rt   z"CyclicPartsRule.contains_dont_know   s"    PPt?OPPPPPPrq   Nru   rv   r   rk   rq   rn   r   r      sb         CC    5 5 5 5Q Q Q Q Q Qrq   r   c                      e Zd ZdS )TrigRuleNrw   rx   ry   rk   rq   rn   r   r              Drq   r   c                      e Zd ZdZddZdS )SinRulezintegrate(sin(x), x) -> -cos(x)rh   r   c                ,    t          | j                   S rj   )r-   rg   rl   s    rn   ro   zSinRule.eval       DM""""rq   Nru   r   rk   rq   rn   r   r      s.        ))# # # # # #rq   r   c                      e Zd ZdZddZdS )CosRulezintegrate(cos(x), x) -> sin(x)rh   r   c                *    t          | j                  S rj   )r.   rg   rl   s    rn   ro   zCosRule.eval       4=!!!rq   Nru   r   rk   rq   rn   r   r      s.        ((" " " " " "rq   r   c                      e Zd ZdZddZdS )
SecTanRulez%integrate(sec(x)*tan(x), x) -> sec(x)rh   r   c                *    t          | j                  S rj   )r2   rg   rl   s    rn   ro   zSecTanRule.eval   r   rq   Nru   r   rk   rq   rn   r   r      s.        //" " " " " "rq   r   c                      e Zd ZdZddZdS )
CscCotRulez&integrate(csc(x)*cot(x), x) -> -csc(x)rh   r   c                ,    t          | j                   S rj   )r1   rg   rl   s    rn   ro   zCscCotRule.eval   r   rq   Nru   r   rk   rq   rn   r   r      s.        00# # # # # #rq   r   c                      e Zd ZdZddZdS )Sec2Rulez!integrate(sec(x)**2, x) -> tan(x)rh   r   c                *    t          | j                  S rj   )r/   rg   rl   s    rn   ro   zSec2Rule.eval   r   rq   Nru   r   rk   rq   rn   r   r      s.        ++" " " " " "rq   r   c                      e Zd ZdZddZdS )Csc2Rulez"integrate(csc(x)**2, x) -> -cot(x)rh   r   c                ,    t          | j                   S rj   )r0   rg   rl   s    rn   ro   zCsc2Rule.eval   r   rq   Nru   r   rk   rq   rn   r   r      s.        ,,# # # # # #rq   r   c                      e Zd ZdS )HyperbolicRuleNr   rk   rq   rn   r   r      r   rq   r   c                      e Zd ZdZddZdS )SinhRulez integrate(sinh(x), x) -> cosh(x)rh   r   c                *    t          | j                  S rj   )r$   rg   rl   s    rn   ro   zSinhRule.eval      DM"""rq   Nru   r   rk   rq   rn   r   r     s.        **# # # # # #rq   r   c                      e Zd ZdZd ZdS )CoshRulez integrate(cosh(x), x) -> sinh(x)c                *    t          | j                  S rj   )r'   rg   rl   s    rn   ro   zCoshRule.eval  r   rq   Nr   rk   rq   rn   r   r   
  s)        **# # # # #rq   r   c                  0    e Zd ZU dZded<   ded<   ddZdS )	ExpRulez integrate(a**x, x) -> a**x/ln(a)r   r   r    rh   c                :    | j         t          | j                  z  S rj   )rf   r!   r   rl   s    rn   ro   zExpRule.eval  s    ~DI..rq   Nru   r   rk   rq   rn   r   r     sB         **JJJIII/ / / / / /rq   r   c                  &    e Zd ZU dZded<   ddZdS )ReciprocalRulezintegrate(1/x, x) -> ln(x)r   r   rh   c                *    t          | j                  S rj   )r!   r   rl   s    rn   ro   zReciprocalRule.eval   s    49~~rq   Nru   r   rk   rq   rn   r   r     s9         $$JJJ     rq   r   c                      e Zd ZdZddZdS )
ArcsinRulez'integrate(1/sqrt(1-x**2), x) -> asin(x)rh   r   c                *    t          | j                  S rj   )r4   rg   rl   s    rn   ro   zArcsinRule.eval'  r   rq   Nru   r   rk   rq   rn   r   r   $  s.        11# # # # # #rq   r   c                      e Zd ZdZddZdS )ArcsinhRulez'integrate(1/sqrt(1+x**2), x) -> asin(x)rh   r   c                *    t          | j                  S rj   )r)   rg   rl   s    rn   ro   zArcsinhRule.eval.  s    T]###rq   Nru   r   rk   rq   rn   r   r   +  s.        11$ $ $ $ $ $rq   r   c                  :    e Zd ZU dZded<   ded<   ded<   d	dZdS )
ReciprocalSqrtQuadraticRulezWintegrate(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crh   c           	         | j         | j        | j        | j        f\  }}}}t	          dt          |          z  t          |||z  z   ||dz  z  z             z  |z   d|z  |z  z             t          |          z  S )N   )r   r   r   rg   r!   r*   rm   r   r   r   xs        rn   ro   z ReciprocalSqrtQuadraticRule.eval9  sv    VTVTVT]:
1a1T!WW9T!AaC%!Q$,///1!A#a%788a@@rq   Nru   r   rk   rq   rn   r   r   2  sQ         aaGGGGGGGGGA A A A A Arq   r   c                  D    e Zd ZU dZded<   ded<   ded<   ded<   dd	Zd
S )SqrtQuadraticDenomRulez(integrate(poly(x)/sqrt(a+b*x+c*x**2), x)r   r   r   r   z
list[Expr]coeffsrh   c           	     N   | j         | j        | j        | j                                        | j        f\  }}}g                                 t          t                    dz
            D ]x}t                    dz
  |z
  }|         ||z  z  }                    |           |dz   xx         d|z  dz
  |z  dz  |z  z  cc<   |dz   xx         |dz
  |z  |z  z  cc<   yd         d         }}t          ||z  z   |dz  z  z             }	|||z  d|z  z  z
  }
|
dk    rd}n9t          t          d|	z            d          }|
|                                z  }t          g fdt          t                              D             ||z  R  |	z  |z   S )	Nr   rR   r   r   F
degeneratec              3  Z   K   | ]%}|         t                    d z
  |z
  z  z  V  &dS )r   N)len)r   ir   result_coeffsr   s     rn   r   z.SqrtQuadraticDenomRule.eval.<locals>.<genexpr>^  sT       9 9 #1%a#f++a-/&:: 9 9 9 9 9 9rq   )r   r   r   r   copyrg   ranger  r   r*   inverse_trig_ruleIntegralInforo   r   )rm   r   r   r   r  ncoeffdesr   I0stepr   r  r   s                @@@rn   ro   zSqrtQuadraticDenomRule.evalF  s   !VTVTVT[5E5E5G5GV1a s6{{1}%% 	) 	)AFAaA1IqsOE  '''1Q3KKKAaCE19Q;u,,KKK1Q3KKKAaC75=(KKKKbz6":11Q3qAvQqS!A#Y;q==BB$\!A#q%9%9eLLLD$))++%B ? 9 9 9 9 9 9#C$6$6779 9 9 ?:;A#? ? ??@ACEF 	Frq   Nru   r   rk   rq   rn   r   r   >  s]         22GGGGGGGGGF F F F F Frq   r   c                  :    e Zd ZU dZded<   ded<   ded<   d	dZdS )
SqrtQuadraticRulez integrate(sqrt(a+b*x+c*x**2), x)r   r   r   r   rh   c                |    t          t          | j        | j                  d          }|                                S )NFr   )sqrt_quadratic_ruler	  rf   rg   ro   )rm   r  s     rn   ro   zSqrtQuadraticRule.evali  s1    "<#N#N[`aaayy{{rq   Nru   r   rk   rq   rn   r  r  b  sK         **GGGGGGGGG     rq   r  c                  .    e Zd ZU dZded<   d
dZddZd	S )AlternativeRulez Multiple ways to do integration.r   alternativesrh   r   c                @    | j         d                                         S Nr   )r  ro   rl   s    rn   ro   zAlternativeRule.evals  s     #((***rq   rr   c                >    t          d | j        D                       S )Nc              3  >   K   | ]}|                                 V  d S rj   r   r   s     rn   r   z5AlternativeRule.contains_dont_know.<locals>.<genexpr>w  s.      QQG7--//QQQQQQrq   )r   r  rl   s    rn   rt   z"AlternativeRule.contains_dont_knowv  s"    QQt?PQQQQQQrq   Nru   rv   r   rk   rq   rn   r  r  n  sV         **+ + + +R R R R R Rrq   r  c                  "    e Zd ZdZddZd	dZdS )
DontKnowRulezLeave the integral as is.rh   r   c                6    t          | j        | j                  S rj   )rS   rf   rg   rl   s    rn   ro   zDontKnowRule.eval}  s    666rq   rr   c                    dS NTrk   rl   s    rn   rt   zDontKnowRule.contains_dont_know  s    trq   Nru   rv   )rw   rx   ry   r~   ro   rt   rk   rq   rn   r  r  z  sB        ##7 7 7 7     rq   r  c                      e Zd ZdZddZdS )DerivativeRulezintegrate(f'(x), x) -> f(x)rh   r   c                    t          | j        t                    sJ t          | j        j                  }t          |          D ]\  }\  }}|| j        k    r||dz
  f||<    n t          | j        j        g|R  S NrR   )
isinstancerf   r   listvariable_count	enumeraterg   expr)rm   r'  r  varcounts        rn   ro   zDerivativeRule.eval  s    $.*55555dn;<<(88 	 	OA|Udm##%(%!)$4q! $ $.-?????rq   Nru   r   rk   rq   rn   r"  r"    s4        %%@ @ @ @ @ @rq   r"  c                  8    e Zd ZU dZded<   ded<   ddZdd	Zd
S )RewriteRulez;Rewrite integrand to another form that is easier to handle.r   	rewrittenre   r   rh   c                4    | j                                         S rj   )r   ro   rl   s    rn   ro   zRewriteRule.eval  s    |  """rq   rr   c                4    | j                                         S rj   r   rl   s    rn   rt   zRewriteRule.contains_dont_know  r   rq   Nru   rv   r   rk   rq   rn   r-  r-    sV         EEOOOMMM# # # #1 1 1 1 1 1rq   r-  c                      e Zd ZdZdS )CompleteSquareRulez7Rewrite a+b*x+c*x**2 to a-b**2/(4*c) + c*(x+b/(2*c))**2N)rw   rx   ry   r~   rk   rq   rn   r2  r2    s        AADrq   r2  c                  *    e Zd ZU ded<   d	dZd
dZdS )PiecewiseRulez%Sequence[tuple[Rule, bool | Boolean]]subfunctionsrh   r   c                2    t          d | j        D              S )Nc                @    g | ]\  }}|                                 |fS rk   r   )r   r   conds      rn   
<listcomp>z&PiecewiseRule.eval.<locals>.<listcomp>  s?     C C C,w $LLNND1 C C Crq   )r+   r5  rl   s    rn   ro   zPiecewiseRule.eval  s5     C C040AC C C D 	Drq   rr   c                >    t          d | j        D                       S )Nc              3  D   K   | ]\  }}|                                 V  d S rj   r   )r   r   _s      rn   r   z3PiecewiseRule.contains_dont_know.<locals>.<genexpr>  s2      TTJGQ7--//TTTTTTrq   )r   r5  rl   s    rn   rt   z PiecewiseRule.contains_dont_know  s"    TT$BSTTTTTTrq   Nru   rv   rw   rx   ry   rz   ro   rt   rk   rq   rn   r4  r4    sT         7777D D D DU U U U U Urq   r4  c                  >    e Zd ZU ded<   ded<   ded<   ddZdd	Zd
S )HeavisideRuler   hargibndre   r   rh   c                    | j                                         }t          | j                  ||                    | j        | j                  z
  z  S rj   )r   ro   r9   r@  r   rg   rA  )rm   r   s     rn   ro   zHeavisideRule.eval  sC    
 ""$$##vDM490U0U'UVVrq   rr   c                4    | j                                         S rj   r   rl   s    rn   rt   z HeavisideRule.contains_dont_know  r   rq   Nru   rv   r=  rk   rq   rn   r?  r?    s]         JJJJJJMMMW W W W1 1 1 1 1 1rq   r?  c                  6    e Zd ZU ded<   ded<   ded<   ddZdS )	DiracDeltaRuler   r
  r   r   rh   c                    | j         | j        | j        | j        f\  }}}}|dk    rt	          |||z  z             |z  S t          |||z  z   |dz
            |z  S Nr   rR   )r
  r   r   rg   r9   r:   rm   r
  r   r   r   s        rn   ro   zDiracDeltaRule.eval  se    VTVTVT]:
1a66QqsU##A%%!AaC%1%%a''rq   Nru   rw   rx   ry   rz   ro   rk   rq   rn   rE  rE    sE         GGGGGGGGG( ( ( ( ( (rq   rE  c                  R    e Zd ZU ded<   ded<   ded<   ded<   ded<   dd
ZddZdS )TrigSubstitutionRuler   thetafuncr.  re   r   zbool | Booleanrestrictionrh   c                   | j         | j        | j        }}}|                    t	          |          dt          |          z            }|                    t          |          dt          |          z            }|                    t          |          dt          |          z            }t          |                    t                              }t          |          dk    sJ |d         }t          ||z
  |          }t          |          dk    sJ t          |d                   \  }}t!          |t                    r2|}|}	t#          |dz  |dz  z
            }
t%          |d                   }nxt!          |t
                    r2|}
|}	t#          |dz  |dz  z
            }t'          |d                   }n1|}|}
t#          |dz  |dz  z             }	t)          |d                   }t          |          ||	z  ft          |          |
|	z  ft          |          ||
z  f||fg}t+          | j                                                            |                                          | j        f          S )NrR   r   r   )rL  rM  rg   r   r2   r-   r1   r.   r0   r/   r&  findr,   r  r]   rZ   r%  r*   r4   r3   r5   r+   r   ro   trigsimprN  )rm   rL  rM  r   trig_functionrelationnumerdenomopposite
hypotenuseadjacentinversesubstitutions                rn   ro   zTrigSubstitutionRule.eval  sR   TYQtyyUQs5zz\22yyUQs5zz\22yyUQs5zz\22TYY'<==>>=!!Q&&&&%a(T=118}}!!!!,,umS)) 	(HJE1Huax/00H8A;''GGs++ 		(HJE1Huax/00H8A;''GGHHeQh122J8A;''G ZZ*,-ZZ*,-ZZ(*+G	
 \  %%l33<<>>@PQ
 
 	
rq   rr   c                4    | j                                         S rj   r   rl   s    rn   rt   z'TrigSubstitutionRule.contains_dont_know  r   rq   Nru   rv   r=  rk   rq   rn   rK  rK    so         KKKJJJOOOMMM%
 %
 %
 %
N1 1 1 1 1 1rq   rK  c                  :    e Zd ZU dZded<   ded<   ded<   d	dZdS )

ArctanRulezAintegrate(a/(b*x**2+c), x) -> a/b / sqrt(c/b) * atan(x/sqrt(c/b))r   r   r   r   rh   c                    | j         | j        | j        | j        f\  }}}}||z  t	          ||z            z  t          |t	          ||z            z            z  S rj   )r   r   r   rg   r*   r5   r   s        rn   ro   zArctanRule.eval	  sS    VTVTVT]:
1asT!A#YYaQqS		k!2!222rq   Nru   r   rk   rq   rn   r]  r]    sK         KKGGGGGGGGG3 3 3 3 3 3rq   r]  c                      e Zd ZU ded<   dS )OrthogonalPolyRuler   r
  Nrw   rx   ry   rz   rk   rq   rn   r`  r`    s         GGGGGrq   r`  c                  ,    e Zd ZU ded<   ded<   ddZdS )
JacobiRuler   r   r   rh   c           	     N   | j         | j        | j        | j        f\  }}}}t	          dt          |dz   |dz
  |dz
  |          z  ||z   |z   z  t          ||z   |z   d          f|t          |d          f||z   dz   |dz  z  dz  ||z
  |z  dz  z   t          |d          f          S )Nr   rR   r      )r
  r   r   rg   r+   rO   r   r   rH  s        rn   ro   zJacobiRule.eval  s    VTVTVT]:
1ava!eQUAE1---q1uqy92a!eai;K;KL1aM!eaiAa1q5!)A+-r!Qxx8: : 	:rq   Nru   rI  rk   rq   rn   rc  rc    s<         GGGGGG: : : : : :rq   rc  c                  "    e Zd ZU ded<   ddZdS )GegenbauerRuler   r   rh   c                   | j         | j        | j        }}}t          t	          |dz   |dz
  |          d|dz
  z  z  t          |d          ft          |dz   |          |dz   z  t          |d          ft          j        df          S )NrR   r   r   T)	r
  r   rg   r+   rN   r   rH   r   Zero)rm   r
  r   r   s       rn   ro   zGegenbauerRule.eval$  s    &$&$-a1Aq1ua((!QU)4bAhh?Aq!!1q5)2a995VTN  	rq   Nru   rI  rk   rq   rn   rg  rg     s3         GGG     rq   rg  c                      e Zd ZddZdS )ChebyshevTRulerh   r   c                    | j         | j        }}t          t          |dz   |          |dz   z  t          |dz
  |          |dz
  z  z
  dz  t	          t          |          d          f|dz  dz  df          S )NrR   r   T)r
  rg   r+   rH   r   r   rm   r
  r   s      rn   ro   zChebyshevTRule.eval.  s    vt}1Q""AE*Q""AE*+,-./1#a&&!}}>T!VTN  	rq   Nru   rw   rx   ry   ro   rk   rq   rn   rk  rk  ,  s(             rq   rk  c                      e Zd ZddZdS )ChebyshevURulerh   r   c                    | j         | j        }}t          t          |dz   |          |dz   z  t	          |d          ft
          j        df          S r   )r
  rg   r+   rH   r   r   ri  rm  s      rn   ro   zChebyshevURule.eval8  sQ    vt}1Aq!!1q5)2a995VTN  	rq   Nru   rn  rk   rq   rn   rp  rp  6  s(             rq   rp  c                      e Zd ZddZdS )LegendreRulerh   r   c                ~    | j         | j        }}t          |dz   |          t          |dz
  |          z
  d|z  dz   z  S NrR   r   )r
  rg   rJ   rm  s      rn   ro   zLegendreRule.evalA  sC    vt}1Aq!!HQUA$6$661qAArq   Nru   rn  rk   rq   rn   rs  rs  ?  s.        B B B B B Brq   rs  c                      e Zd ZddZdS )HermiteRulerh   r   c                V    | j         | j        }}t          |dz   |          d|dz   z  z  S ru  )r
  rg   rK   rm  s      rn   ro   zHermiteRule.evalH  s0    vt}1q1ua  !QU),,rq   Nru   rn  rk   rq   rn   rw  rw  F  s(        - - - - - -rq   rw  c                      e Zd ZddZdS )LaguerreRulerh   r   c                f    | j         | j        }}t          ||          t          |dz   |          z
  S r$  )r
  rg   rL   rm  s      rn   ro   zLaguerreRule.evalO  s0    vt}11~~Q 2 222rq   Nru   rn  rk   rq   rn   rz  rz  M  (        3 3 3 3 3 3rq   rz  c                  "    e Zd ZU ded<   ddZdS )AssocLaguerreRuler   r   rh   c                P    t          | j        dz   | j        dz
  | j                   S r$  )rM   r
  r   rg   rl   s    rn   ro   zAssocLaguerreRule.evalX  s%    tvz46A:t}EEEErq   Nru   rI  rk   rq   rn   r~  r~  T  s9         GGGF F F F F Frq   r~  c                  $    e Zd ZU ded<   ded<   dS )IRuler   r   r   Nra  rk   rq   rn   r  r  \  s"         GGGGGGGGrq   r  c                      e Zd ZddZdS )CiRulerh   r   c                    | j         | j        | j        }}}t          |          t	          ||z            z  t          |          t          ||z            z  z
  S rj   )r   r   rg   r-   r?   r.   rA   rm   r   r   r   s       rn   ro   zCiRule.evald  H    &$&$-a11vvb1gg~Ar!A#ww..rq   Nru   rn  rk   rq   rn   r  r  b  (        / / / / / /rq   r  c                      e Zd ZddZdS )ChiRulerh   r   c                    | j         | j        | j        }}}t          |          t	          ||z            z  t          |          t          ||z            z  z   S rj   )r   r   rg   r$   r@   r'   rB   r  s       rn   ro   zChiRule.evalk  J    &$&$-a1Awws1Q3xx$q''#ac(("222rq   Nru   rn  rk   rq   rn   r  r  i  r|  rq   r  c                      e Zd ZddZdS )EiRulerh   r   c                p    | j         | j        | j        }}}t          |          t	          ||z            z  S rj   )r   r   rg   r    rC   r  s       rn   ro   zEiRule.evalr  s/    &$&$-a11vvb1gg~rq   Nru   rn  rk   rq   rn   r  r  p  s(             rq   r  c                      e Zd ZddZdS )SiRulerh   r   c                    | j         | j        | j        }}}t          |          t	          ||z            z  t          |          t          ||z            z  z   S rj   )r   r   rg   r.   r?   r-   rA   r  s       rn   ro   zSiRule.evaly  r  rq   Nru   rn  rk   rq   rn   r  r  w  r  rq   r  c                      e Zd ZddZdS )ShiRulerh   r   c                    | j         | j        | j        }}}t          |          t	          ||z            z  t          |          t          ||z            z  z   S rj   )r   r   rg   r'   r@   r$   rB   r  s       rn   ro   zShiRule.eval  r  rq   Nru   rn  rk   rq   rn   r  r  ~  r|  rq   r  c                      e Zd ZddZdS )LiRulerh   r   c                \    | j         | j        | j        }}}t          ||z  |z             |z  S rj   )r   r   rg   rD   r  s       rn   ro   zLiRule.eval  s-    &$&$-a1!A#'{{1}rq   Nru   rn  rk   rq   rn   r  r    s(             rq   r  c                  6    e Zd ZU ded<   ded<   ded<   ddZdS )	ErfRuler   r   r   r   rh   c                2   | j         | j        | j        | j        f\  }}}}|j        rt          t          t          j                  t          |           z  dz  t          ||dz  d|z  z  z
            z  t          d|z  |z  |z
  dt          |           z  z            z  |dk     ft          t          j                  t          |          z  dz  t          ||dz  d|z  z  z
            z  t          d|z  |z  |z   dt          |          z  z            z  df          S t          t          j                  t          |          z  dz  t          ||dz  d|z  z  z
            z  t          d|z  |z  |z   dt          |          z  z            z  S )Nr   re  r   r   T)r   r   r   rg   is_extended_realr+   r*   r   Pir    r;   r<   r   s        rn   ro   zErfRule.eval  s   VTVTVT]:
1a 	:adD!HH$Q&QAqs^)<)<<Aa!aaRj122345E;adDGG#A%A1ac
N(;(;;!A#a%!)aQi0112379: : :
 ADzz$q''!!#c!adAaCj.&9&99ac!eai!DGG),--. 	.rq   Nru   rI  rk   rq   rn   r  r    sE         GGGGGGGGG	. 	. 	. 	. 	. 	.rq   r  c                  6    e Zd ZU ded<   ded<   ded<   ddZdS )	FresnelCRuler   r   r   r   rh   c           
        | j         | j        | j        | j        f\  }}}}t	          t
          j                  t	          d|z            z  t          |dz  d|z  z  |z
            t          d|z  |z  |z   t	          d|z  t
          j        z            z            z  t          |dz  d|z  z  |z
            t          d|z  |z  |z   t	          d|z  t
          j        z            z            z  z   z  S Nr   re  )r   r   r   rg   r*   r   r  r-   r=   r.   r>   r   s        rn   ro   zFresnelCRule.eval      VTVTVT]:
1aADzz$qs))#1ac
Q!A#a%!)T!A#ad(^^)C D DD1ac
Q!A#a%!)T!A#ad(^^)C D DDEF 	Frq   Nru   rI  rk   rq   rn   r  r    K         GGGGGGGGGF F F F F Frq   r  c                  6    e Zd ZU ded<   ded<   ded<   ddZdS )	FresnelSRuler   r   r   r   rh   c           
        | j         | j        | j        | j        f\  }}}}t	          t
          j                  t	          d|z            z  t          |dz  d|z  z  |z
            t          d|z  |z  |z   t	          d|z  t
          j        z            z            z  t          |dz  d|z  z  |z
            t          d|z  |z  |z   t	          d|z  t
          j        z            z            z  z
  z  S r  )r   r   r   rg   r*   r   r  r-   r>   r.   r=   r   s        rn   ro   zFresnelSRule.eval  r  rq   Nru   rI  rk   rq   rn   r  r    r  rq   r  c                  ,    e Zd ZU ded<   ded<   ddZdS )PolylogRuler   r   r   rh   c                L    t          | j        dz   | j        | j        z            S r$  )rQ   r   r   rg   rl   s    rn   ro   zPolylogRule.eval  s!    tvz46DM#9:::rq   Nru   rI  rk   rq   rn   r  r    s<         GGGGGG; ; ; ; ; ;rq   r  c                  ,    e Zd ZU ded<   ded<   ddZdS )UpperGammaRuler   r   r  rh   c                    | j         | j        | j        }}}||z  | |z  | z  z  t          |dz   | |z            z  |z  S r$  )r   r  rg   rE   )rm   r   r  r   s       rn   ro   zUpperGammaRule.eval  sN    &$&$-a1!tr!trl"ZAr!t%<%<<Q>>rq   Nru   rI  rk   rq   rn   r  r    s<         GGGGGG? ? ? ? ? ?rq   r  c                  ,    e Zd ZU ded<   ded<   ddZdS )EllipticFRuler   r   r  rh   c                p    t          | j        | j        | j        z            t	          | j                  z  S rj   )rG   rg   r  r   r*   rl   s    rn   ro   zEllipticFRule.eval  )    $-77TVDDrq   Nru   rI  rk   rq   rn   r  r    B         GGGGGGE E E E E Erq   r  c                  ,    e Zd ZU ded<   ded<   ddZdS )EllipticERuler   r   r  rh   c                p    t          | j        | j        | j        z            t	          | j                  z  S rj   )rF   rg   r  r   r*   rl   s    rn   ro   zEllipticERule.eval  r  rq   Nru   rI  rk   rq   rn   r  r    r  rq   r  c                  $    e Zd ZU ded<   ded<   dS )r	  r   rf   r   symbolNra  rk   rq   rn   r	  r	    s"         OOONNNNNrq   r	  c                   | j         r| j         d         }t          | t                    r(|                              t	          |          dz  z  S t          | t
                    r)|                               t          |          dz  z  S t          | t                    r5|                              t	          |          z  t          |          z  S t          | t                    r6|                               t          |          z  t          |          z  S t          | t                    r t          fd| j         D                       S t          | t                    rat          | j                   dk    rIt          | j         d         t                    r)| j         d         t          | j         d                   z  S |                               S )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  8   K   | ]}t          |          V  d S rj   )manual_diffr   argr  s     rn   r   zmanual_diff.<locals>.<genexpr>  s-      BBC{3//BBBBBBrq   rR   )argsr%  r/   diffr2   r0   r1   r   sumr   r  r   r  )fr  r  s    ` rn   r  r    s    	v BfQia 	B88F##c#hhk113 
	BHHV$$$s3xx{223 	B88F##c#hh.S993 	BHHV$$$s3xx/#c((::3 	BBBBB16BBBBBB3 	B16{{aJqvay&$A$Avay;qvay&#A#AAA66&>>rq   c                J   t          |          dk    rX|d         }t          |t          t          f          r|                                }nEt          |          st          d          n&t          |          dk    r|g}nt          d          g }|D ]g\  }t          |t                    rM|j        d         | 	                    fdfd          } |
                    t                    f           h|                     t          |          |z             S )zn
    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                (    | j         o
| j        k    S rj   )r   r   )r   x0s    rn   <lambda>zmanual_subs.<locals>.<lambda>  s    !(*Cqv| rq   c                2    t          | j         z            S rj   )r    )r   news    rn   r  zmanual_subs.<locals>.<lambda>  s    #aeCi.. rq   )r  r%  r   r   itemsrb   
ValueErrorr!   r  replacer   r    r   r&  )r)  r  sequencenew_subsoldr  r  s        @@rn   manual_subsr    s/   
 4yyA~~7hw00 	I~~''HH(## 	IGHHH	I	Ta6?@@@H 	, 	,Sc3 	,
 !B<< C C C C((((* *DOORSN+++99T(^^h.///rq   c                    g } fd}dfd}fdt          t                                           |           z                       D ]g}|k    r	t          |          } |||          }|dur>|\  }	}|                               k    rI||	|f}
|
|vr|                    |
           h|S )Nc                    |dk    rdS |z  }t          d                    ||                      t          ||                                           }|                              rdS                               rw|                              rbt          fd                                D                       }t          fd|                                D                       }||k    rdS |                    d          S )Nr   Fz!substituted: {}, u: {}, u_var: {}c              3  8   K   | ]}t          |          V  d S rj   rV   )r   tr  s     rn   r   z;find_substitutions.<locals>.test_subterm.<locals>.<genexpr>-  s-      SS1VAv..SSSSSSrq   c              3  8   K   | ]}t          |          V  d S rj   r  )r   r  r   s     rn   r   z;find_substitutions.<locals>.test_subterm.<locals>.<genexpr>.  s-      SSF1e,,SSSSSSrq   )as_Add)	rc   formatr  cancelhas_freeis_rational_functionmaxas_numer_denomas_independent)r   u_diffsubstituted
deg_before	deg_afterrf   r  r   s        rn   test_subtermz(find_substitutions.<locals>.test_subterm"  s%   Q;;5&(188aOOPPP!+q%88??AA'' 	5))&11 	k6V6VW\6]6] 	SSSS	8P8P8R8RSSSSSJSSSSk6P6P6R6RSSSSSI:%%u))%)>>>rq   termr   c                   g }g }t          dd g          }|                     t                    D ]d}|j        d         }|j        vr|                    |z            }|r|                    ||                    O|                    |           e|r2|                    t          t          |          z                       |S )Nr
  c                    | j         S rj   )
is_Integerr
  s    rn   r  z:find_substitutions.<locals>.exp_subterms.<locals>.<lambda>6  s    AL rq   
propertiesr   )r   rP  r    r  free_symbolsmatchr   rX   )r  linear_coeffstermsr
  r   r  r  r  s          rn   exp_subtermsz(find_substitutions.<locals>.exp_subterms3  s    "8"8!9:::IIcNN 	# 	#D)A,CS---IIah''E #$$U1X....T"""" 	>LLXm44V;<<===rq   c                F    t           t          t          gt          t          t
          t          R           r j        d         gS t           t          t          t          t          t          f          r j        d         gS t           t          t          f          r j        d         gS t           t                    r j        d         gS t           t                     rAg } j        D ]5}|                    |           |                     |                     6|S t           t&                    rfd j        D             } j        j        rl|                     fdt+           j                  D                         j        j        r-|                    d   j                  D                        |S t           t0                    rAg } j        D ]5}|                    |           |                     |                     6|S g S )Nr   rR   r      c                >    g | ]}|                               |S rk   hasr  s     rn   r9  zAfind_substitutions.<locals>.possible_subterms.<locals>.<listcomp>W  s(    ===SWWV__====rq   c                t    g | ]4}d |cxk     rt          j        d                    k     'n n
j        |z  5S )rR   )absr  r   )r   r  r  s     rn   r9  zAfind_substitutions.<locals>.possible_subterms.<locals>.<listcomp>Y  sX     2 2 2110000s49Q<0000000 )Q,000rq   c                     g | ]}|j         	|S rk   )r   )r   r  s     rn   r9  zAfind_substitutions.<locals>.possible_subterms.<locals>.<listcomp>\  s.     % % %A8%a % % %rq   )r%  r,   r"   inverse_trig_functionsr    r!   r9   r  rH   rI   rJ   rK   rL   rN   rM   rO   r   r   extendr   r  rU   r   is_Addr   )r  rr   r  possible_subtermsr  s   `   rn   r  z-find_substitutions.<locals>.possible_subtermsD  s^   d24F 242 2"%2'02 2 3 3 	 IaL>!z: '85 6 6 	IaL>!z>:;; 	IaL>!f%% 	IaL>!c"" 	AY / /**1--....Hc"" 	====	===Ax" & 2 2 2 2TX0F0F 2 2 2 3 3 39# &HH % %):):49)E)E % % % & & &Hc"" 	Ay 1 1**3//0000H	rq   F)r  r   )r&  dictfromkeysr  r   r   )rf   r  r   resultsr  r  r   r  new_integrandr   rZ  r  s   ```        @rn   find_substitutionsr    s7   G? ? ? ? ? ? ?"     "! ! ! ! ! !F $-- 1 1) < <||I?V?V VWWXX - -;;Q''$Q//%%&3#Hm	vu = ===x7L7**|,,,Nrq   c                      fd}|S )z$Strategy that rewrites an integrand.c                    | \  }}t          d                    ||                      |  rD |  }||k    r;t          ||          }t          |t                    s|rt          ||||          S d S d S d S d S )Nz/Integral: {} is rewritten with {} on symbol: {})rc   r  integral_stepsr%  r  r-  )integralrf   r  r.  r   ra   rewrites        rn   	_rewriterzrewriter.<locals>._rewriterx  s    $	6?FFyRY[abbccc9h 	N*II%%(F;;!'<88 NW N&y&)WMMM	N 	N%%N N N Nrq   rk   )ra   r  r  s   `` rn   rewriterr  v  s0    N N N N N N rq   c                      fd}|S )zAStrategy that rewrites an integrand based on some other criteria.c           	         | \  } }|\  }}t          d                    |||                      | t          |          z   } | r+ | }||k    r"t          |||t	          ||                    S d S d S )Nz@Integral: {} is rewritten with {} on symbol: {} and criteria: {})rc   r  r&  r-  r  )criteriar   rf   r  r  r.  ra   r  s         rn   _proxy_rewriterz'proxy_rewriter.<locals>._proxy_rewriter  s    %($	6PWWXacjlrt|}}~~~$x..(9d 	dII%%"9fiPY[aAbAbccc	d 	d%%rq   rk   )ra   r  r  s   `` rn   proxy_rewriterr    s0    d d d d d d rq   c                      fd}|S )z4Apply the rule that matches the condition, else Nonec                l                                     D ]\  }} ||           r ||           c S d S rj   )r  )r)  keyr   
conditionss      rn   multiplexer_rlz#multiplexer.<locals>.multiplexer_rl  sU    #))++ 	" 	"ICs4yy "tDzz!!!"	" 	"rq   rk   )r  r  s   ` rn   multiplexerr    s$    " " " " " rq   c                       fd}|S )zHStrategy that makes an AlternativeRule out of multiple possible results.c                   g }d}t          d           D ]k}|dz   }t          d                    ||                      ||           }|r4t          |t                    s|| k    r||vr|                    |           lt          |          dk    r|d         S |r*d |D             }|rt          g | |R  S t          g | |R  S d S )Nr   zList of Alternative RulesrR   Rule {}: {}c                :    g | ]}|                                 |S rk   r   )r   r   s     rn   r9  z7alternatives.<locals>._alternatives.<locals>.<listcomp>  s)    MMMt43J3J3L3LMdMMMrq   )rc   r  r%  r  r   r  r  )r   altsr+  r   r   doableruless         rn   _alternativesz#alternatives.<locals>._alternatives  s   )*** 	$ 	$DAIE-&&ud33444T(^^F $z&,?? $(""vT'9'9F###t99>>7N 	8MMtMMMF 8&99&9999&77$7777	8 	8rq   rk   )r  r  s   ` rn   r  r    s$    8 8 8 8 8( rq   c                    t          |  S rj   )r   r   s    rn   constant_ruler        ""rq   c           
     ^   | \  }}|                                 \  }}||j        vrNt          |t                    r9t	          |dz             dk    rt          |||          S t          ||||          S ||j        vrt          |t                    rt          ||||          }t          t          |          j
                  r|S t          |          j
        rt          d|          S t          |||t          t          |          d          ft          d|          dfg          S d S d S )NrR   r   T)r   r  r%  r   r\   r   r   r   r   r!   is_zeror   r4  r   )r   rf   r  r   exptr   s         rn   
power_ruler    s=    Iv&&((JD$T&&&:dF+C+C&D1H""!)VT:::FD$777	t(	(	(Zf-E-E	(y&$55SYY&'' 	+KYY 	+6***Y2c$ii##$!V$$d+1
   	 
)	(	(	(rq   c                    | \  }}t          |j        d         t                    r"t          ||t          |j        d                   S d S r  )r%  r  r   r   r   r   rf   r  s      rn   exp_ruler!    sM     Iv).#V,, @y&!Y^A->???@ @rq   c                   t           t          t          t          t          t
          t          t          t          t          t          t          t          t          t          t          i}t           dt          dt          di}| \  }|D ]~}t!          ||          rl|                    |d          }|j        |         u rGt'          fd|j        d |         D                       s ||         |g|j        d |         R  c S d S )Nr  r   rR   c              3  B   K   | ]}|                               V  d S rj   r  )r   r   r  s     rn   r   z'orthogonal_poly_rule.<locals>.<genexpr>  s-      FFaAEE&MMFFFFFFrq   )rO   rc  rN   rg  rH   rk  rI   rp  rJ   rs  rK   rw  rL   rz  rM   r~  r%  getr  r   )r   orthogonal_poly_classesorthogonal_poly_var_indexrf   klass	var_indexr  s         @rn   orthogonal_poly_ruler)    s   
NNN,,)	
 	A!

 !Iv( j ji'' 	j155eQ??Iy)V33FFFF9>*9*+EFFFFF 49259)Viin]g^g]gNhiiiiiij jrq   z/list[tuple[Type, Expr, Callable | None, tuple]]_special_function_patternsr   c                   | \  }}t           st          dt          gd g          }t          dt          g          }t          dt          g          }t          dt          gd g          }t          d	t          gd
 g          }t                              |||||f           |t          z  |z   }|t          dz  z  |t          z  z   |z   }	t                               t
          t          |d          t          z  d t          ft
          t          |d          t          z  d t          ft
          t          |d          t          z  d t          ft
          t          |d          t          z  d t          ft
          t          |d          t          z  d t          ft           dt#          |d          z  d t$          ft          t          |	d          d t&          ft          t          |	d          d t(          ft          t          |	d          d t*          ft
          t          |z  t          |t          z  d          z  d t,          ft
          t/          ||t          z  d          t          z  d t0          ft           dt3          ||t          t          d          dz  z  z
            z  d t4          ft           t3          ||t          t          d          dz  z  z
            d t6          ff           |                    |t                    }
t           D ]a\  }}}}t;          |
|          rJ|
                    |          r3t?          fdt          D                       }| || r |||g|R  c S bd S )Nr   c                    | j          S rj   r  r   s    rn   r  z'special_function_rule.<locals>.<lambda>  
    19} rq   excluder  r   r1  r   r  c                    | j          S rj   r-  r.  s    rn   r  z'special_function_rule.<locals>.<lambda>  r/  rq   r  c                     | j         o| j         S rj   )is_nonnegative
is_integerr.  s    rn   r  z'special_function_rule.<locals>.<lambda>  s    1+<= rq   r   FevaluaterR   c                    | |k    S rj   rk   r   r  s     rn   r  z'special_function_rule.<locals>.<lambda>  
    Q!V rq   c                    | |k    S rj   rk   r:  s     rn   r  z'special_function_rule.<locals>.<lambda>
  r;  rq   c              3  l   K   | ].}                     |                               |          V  /d S rj   )r$  )r   wr  s     rn   r   z(special_function_rule.<locals>.<genexpr>  sH       "? "?1%*YYq\\%= #())A,,%=%=%=%="? "?rq   ) r*  r   _symbol_wildsr  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%  r  tuple)r   rf   r  r   r   r   r  r  linear_patternquadratic_pattern
_integrandtype_pattern
constraintr   	wild_valsr  s                   @rn   special_function_rulerI    s    Iv% wi5L5L4MNNNwi(((wi(((wi5L5L4MNNNwi==5? @ @ @q!Q1o&&& 7QgqjL1W94q8"))#nu555g=tVL#nu555g=tVL$~666w>gN#nu555g=tVL$~666w>gN!C7777vF#'%888$H#'%888$M#'%888$M'1*S7U;;;;T>R'!QwY777?{S!DQs7U;;;Q>>>???##]4$q1S59991<<<==##]4+
 	 	 	" 00J,F ? ?(w
Dj%(( 	?$$W--E ?! "? "? "? "? "? "? "? ? ?	%Y)?%4	6>I>>>>>>? ?rq   generic_stepdegenerate_stepr   rh   c                     ||S t          |t                    r fd|j        D             }n| fg}t          |t                    r||j        z  }n!|                    |t          j        f           t          |j        |j        |          S )Nc                H    g | ]\  }}||z                                   fS rk   r[   )r   r   r8  generic_conds      rn   r9  z(_add_degenerate_step.<locals>.<listcomp>  sI     H H H)GT !4,#6"@"@"B"BC H H Hrq   )r%  r4  r5  r   r   truerf   rg   )rN  rJ  rK  r5  s   `   rn   _add_degenerate_steprP    s    ,.. 6H H H H-9-FH H H &|45/=11 744_af5666/1FUUUrq   r   c                  	
 | \  }t          dg          t          ddg          		z  z   t          j        
 G d dt                    d	
fd	  |          \  }}n# $ r Y d S w xY w
t          j        u rd }n$t	          |                    d                    }t          |||          }t          
||          S )Nr   r2  r   r   c                      e Zd ZdS ) nested_pow_rule.<locals>.NoMatchNr   rk   rq   rn   NoMatchrS  /  s        rq   rT  r)  r   rh   tuple[Expr, Expr]c                   |                                st          j        t          j        fS | j        r|                                 \  }}|st          j        t          j        fS fd|D             }d |D             }|                    t          j                   t          |          dk    r'|                                t          d |D              fS | j
        r:| j        | j        }}|                               r |          \  }}|||z  fS |                               }	|	r6|	         |	         }}
|
|z  z   }t          |d          |t          j        fS )Nc                &    g | ]} |          S rk   rk   )r   r  _get_base_exps     rn   r9  z:nested_pow_rule.<locals>._get_base_exp.<locals>.<listcomp>9  s#    ===t}}T**===rq   c                    h | ]\  }}|S rk   rk   )r   r   r<  s      rn   	<setcomp>z9nested_pow_rule.<locals>._get_base_exp.<locals>.<setcomp>:  s    +++41aQ+++rq   rR   c              3      K   | ]	\  }}|V  
d S rj   rk   )r   r<  r  s      rn   r   z9nested_pow_rule.<locals>._get_base_exp.<locals>.<genexpr>=  s&      )@)@1!)@)@)@)@)@)@rq   r   )r  r   Oneri  is_Mulas_coeff_muldiscardr  popr   r   r   r    r  r   )r)  r<  r  r  basesr   r  base_sub_expr  r   rT  rX  a_b_rN  rF  r   s              rn   rX  z&nested_pow_rule.<locals>._get_base_exp2  sz   }}Q 	!5!&= ; 		((**HAu %uaf}$====u===G++7+++EMM!%   5zzQyy{{C)@)@)@)@)@$AAAM; 	&9dhqAzz!}} *]1--NE7'A+%%

7## 	 9eBiqA!GEa88L!%<rq   )r)  r   rh   rU  )r   r   rO  	Exceptionr   r   r   rP  )r   rf   r   r   rK  rJ  rT  rX  rd  re  rN  rF  r   s         @@@@@@@rn   nested_pow_rulerg  &  sJ   LIq	cA3			B	cAq6	"	"	"BAgG6L    )              8"]9--
dd   qv 'y~~a';';Q?? AtT::LlOLLLs   &A5 5A>=A>Tc                   | \                                   \  }}t          dg          }t          dg          }t          ddg          }|                    ||z  z   |dz  z  z             sdS dfd
}fd|||fD             \  }}}t          |d          }|r|t          j        u rd}	nA|j        rt          ||z            }	n&t          t          ||z  z   |z                      }	t          d|z  dz             dk    r| d|z  z  ||dz  d|z  z  z
  }}
t          |d          }d}|t          j        ur8t          dt          ||
z
  dz  z            z  |
z
  t          j                  }|t          j        u r|S t          |||          }t!          |||          }|j        r|j        rg }t$          |d| d|
ft'          |dk    |dk               ft(          |d|d|
ft'          |dk    |dk              ffD ]B\  }}|t          j        u r || c S |t          j        ur|                     || |f           C|r:|j        s!|                    |t          j        f           t/          |          }n|}t!          |||	          S |t          j        k    r$t3          |||          }t!          |||	          S dS )zm
    Set degenerate=False on recursive call where coefficient of quadratic term
    is assumed non-zero.
    r   r2  r   r   r   r   Nrh   re   c                   t          d          }dt          ||z  ||z  |z
  dz  z  z             z  }t          ||z            |z
  z  }dt          |          z  }	d }
|ur|}
|}dt          |||dz  z  z             z  } | ||          }|	dk    rt          |	|z  |	||          }|
t          |||
|          }|dk    rt	          ||          }|S )Nr   rR   r   r   )r   r*   r   r   r2  )	RuleClassr   sign_ar   sign_chr   r.  quadratic_baser   r   standard_formr   rf   r  s                rn   make_inverse_trigz,inverse_trig_rule.<locals>.make_inverse_trigj  s   c

d6!8fQhq1}&<<===	acF1H-T!WW9''#F"N$v~q/@(@@AAA)M>::q=='(>R_ahiiGIvufgFFG66(FIwOOGrq   c                P    g | ]"}                     |t          j                  #S rk   r$  r   ri  r   r  r  s     rn   r9  z%inverse_trig_rule.<locals>.<listcomp>}  s)    777uyyAF##777rq   rR   re  r   )rh   re   )r   r   r  r   r   rO  r  r   sqrt_linear_ruler	  r\   r   r*   NegativeOnefalser   rP  is_realr   rT   r   r   is_positiver4  Halfr  )r   r  r   r    r   r   r   rp  rN  rK  rm  knon_square_condsquare_steprJ  r  r  r  r8  rf   r  r  s                      @@@rn   r  r  [  sv   
 !Iv%%''ID#S6(###AS6(###AS61+&&&AJJq1V8|a	k122E       & 8777aAY777GAq!a88L Z//	
 Z&qCx88*<QZC8OQW+X+XYY#	ar1Q3xQT1Q3Z1Q((!&(('$q&(Q*?*?(?PQSTS`aaKag%%29faANN#O\;OO9 	$ 	$EaQBA.AE1q50A0ABq!Q1-s1q5!a%/@/@A C C
d 16>>,,d3333qw&&LL"3"3T":D!ABBB $} 9LL,!7888$Y>>##L$HHH
af}} FAq!<<#L$HHH }rq   c                |    | \  }fd|                                 D             }d |v rd nt          ||          S )Nc                0    g | ]}t          |          S rk   )r  )r   gr  s     rn   r9  zadd_rule.<locals>.<listcomp>  s3     5 5 5 a(( 5 5 5rq   )as_ordered_termsr   )r   rf   r  r  s      @rn   add_ruler    s_     Iv5 5 5 5 11335 5 5G7??44	67(K(KKrq   c                    | \  }}|                     |          \  }}|dk    r%t          ||          }|t          |||||          S d S d S r$  )r  r  r   )r   rf   r  r  r  	next_steps         rn   mul_ruler    sf     Iv ''//HE1zz"1f--	 $Yq)LLL z  rq   *tuple[Expr, Expr, Expr, Expr, Rule] | Nonec                   fd}dd} |t                      |t           | |t          t                     |t                    g}t          d          }t          | t           gt          R           r|| z  } t          |          D ]M\  }} ||           }|r9|\  }	}
|	j        vr|		                    |          s d S |	
                    |d          }	|

                    |d          }
||k    r|	                              s d S t          |	t                     r1d|
z  }|                              rt          |          dk    r d S ||k    r|
j        s/|
	                    t                    st          |
t                    rYt!          |
          }|                                r d S |	                              }|                                }|	|
|||fc S d}|dk     rd	}n~||k    r(|
j        r!t+          d
 |
j        D                       rd	}nP||dz   d          D ]B} ||           }|r3|d         
                    |d                              |
          rd	} nC|rc|	                              }t!          t/          |
                    }|                                s|                                }|	|
|||fc S Od S )Nc                   |                                                                  } t          | t                    s| j        sg nfd| j        D             }|r$t          | }| |z                                   }||fS d S )Nc                >    g | ]}|                               |S rk   )is_algebraic_exprr  s     rn   r9  z;_parts_rule.<locals>.pull_out_algebraic.<locals>.<listcomp>  s,    QQQ#33H3H3P3PQ#QQQrq   )r  togetherr%  r+   r]  r  r   )rf   	algebraicr   r   r  s       rn   pull_out_algebraicz'_parts_rule.<locals>.pull_out_algebraic  s    $$&&//11	%i;; R9CS RRRQQQQQQQ 	 	YAa-''))Bb5L	 	rq   rh   *Callable[[Expr], tuple[Expr, Expr] | None]c                      d fd}|S )Nrf   r   rh   tuple[Expr, Expr] | Nonec                     t           fdD                       r'fd j        D             }|rt          | } |z  }||fS d S )Nc              3  B   K   | ]}                     |          V  d S rj   r  r   r  rf   s     rn   r   zI_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<genexpr>  s/      779==##777777rq   c                L    g | ]t          fd D                        S )c              3  8   K   | ]}t          |          V  d S rj   )r%  )r   clsr  s     rn   r   zT_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>.<genexpr>  s-      IIz#s33IIIIIIrq   )r   )r   r  	functionss    @rn   r9  zJ_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>  sR     K K KIIIIyIIIIIK K K Krq   )r   r  r   )rf   r  r   r   r  s   `   rn   pull_out_u_rlz6_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl  s    7777Y77777 !K K K Ky~ K K K !T
A"QBb5L4rq   )rf   r   rh   r  rk   )r  r  s   ` rn   
pull_out_uz_parts_rule.<locals>.pull_out_u  s)    	 	 	 	 	 	 rq   	temporaryrR   Fr   Tc              3  Z   K   | ]&}t          |t          t          t          f          V  'd S rj   )r%  r.   r-   r    r   r   s     rn   r   z_parts_rule.<locals>.<genexpr>  sF       " " q3S/22 " " " " " "rq   r   )rh   r  )r!   r  r.   r-   r    r   r%  r(  r  r  r   is_polynomialrV   is_Derivativer,   rP   r  rt   r  ro   r  allequalsr\   )rf   r  r  r  liate_rulesdummyindexr   r   r   r   rec_dvr   dur   acceptlruler  s    `                rn   _parts_ruler    sg           :c??JJ0F$G%zz#s';';:c??$K
 +E)c;$:;;<< &I%	 -- 70 70ti 4	0EAr Q^++AEE%LL+ttua  A""B )))!//&2I2I)tt!S!!  2((00  66**a//44 )))# 4rvv.C'D'D 4"2';<<4+B77F0022 4#ttVVF^^"KKMM "aV3333 Fqyy,,,, " "" " " " " - "FF(4  Ei((A QqTYYua0077;; !% 0VVF^^'f==0022 0Ab!R////4rq   c                   | \  }|                                 \  }}t          |          }g }|r|\  }}}}}	t          d                    |||||	                     |                    |           t          |t                    rd S t          |t          t          t          t          t          f          rD|                    t          i          }
t          |
         dk    rd S t          |
xx         dz  cc<   t          d          D ]}t          d                    ||||                     ||z  |z                                  }|dk    r n|j        vrQt%          |d |D             dt'          |          z  |z            }|dk    r|rt)          ||z  |||          }|c S ||z                                   \  }}t          |          }|r-|\  }}}}}	||z  }||z  }|                    |||||	f            fd|rW|d	         \  }}}}}	t+          ||||	 |dd          ||z                      }|dk    r|rt)          ||z  |||          }|S d S )
Nz,u : {}, dv : {}, v : {}, du : {}, v_step: {}r   rR   re  z7Cyclic integration {} with v: {}, du: {}, integrand: {}c           
     B    g | ]\  }}}}}t          d d |||d           S rj   )r   )r   r   r   r   r  r   s         rn   r9  zparts_rule.<locals>.<listcomp>6  sD     : : :/!RB tT1b&$?? : : :rq   r   c                    | r7| d         \  }}}}}t          |||| | dd          ||z                      S t          |          S rG  )r   r  )	stepsrf   r   r   r   r  r   make_second_stepr  s	          rn   r  z$parts_rule.<locals>.make_second_stepI  sj     	d#(8 Ar1b&Y2v?O?OPUVWVXVXPY[\_a[a?b?bccci000rq   r   )as_coeff_Mulr  rc   r  r   r%  rS   r.   r-   r    r'   r$   xreplace_cache_dummy_parts_u_cacher  r  r  r   r  r   r   )r   rf   r   r   r  r   r   r   r  r   cachekeyr<  r   r   next_constantnext_integrandr  r  s                   @@rn   
parts_ruler    s    Iv#0022HiF++FE (%2q"f<CCAr1bRXYYZZZVa"" 	F a#sCt455 	*zz6<"899Hh'!++8$$$)$$$ q 	 	AKRRSTVWY[]fgghhhFi/7799Ka[555&y&: :38: : :CJJ&46 6 MMtM,X	-A68U^`deeD ./V,A,A,C,C)M> 88F '-$2q"f]"m#aQF344441 1 1 1 1 1  $Qx2q"fFAr6;K;KERSRTRTIWX[]W];^;^__MMtM$X	%968YX\]]D rq   c           	        | \  }}|t          |          k    rt          ||          S |t          |          k    rt          ||          S |t	          |          dz  k    rt          ||          S |t          |          dz  k    rt          ||          S t          |t                    rt          |j
         t          |j
         z  }nt          |t                    rt          |j
         t          |j
         z  }nt          |t                    r`|j
        d         }t	          |          dz  t          |          t	          |          z  z   t	          |          t          |          z   z  }nwt          |t                    r`|j
        d         }t          |          dz  t          |          t          |          z  z   t          |          t          |          z   z  }nd S t          |||t          ||                    S Nr   r   )r.   r   r-   r   r2   r   r1   r   r%  r/   r  r0   r-  r  )r   rf   r  r.  r  s        rn   	trig_ruler  W  s    IvCKKy&)))CKKy&)))CKKN""	6***CKKN""	6***)S!! (3	+??			Is	#	# (3	+??			Is	#	# 	nQ#hhkCHHs3xx$77#hhS)+			Is	#	# nQ#hhkCHHs3xx$77#hhS)+		 	y&)^Iv5V5VWWWrq   c                    | \  }}|t          |          t          |          z  k    rt          ||          S |t          |          t	          |          z  k    rt          ||          S d S rj   )r2   r/   r   r1   r0   r   r   s      rn   trig_product_ruler  s  sl     IvCKK#f++---)V,,,CKK#f++---)V,,, .-rq   c                    | \  }}t          d|g          }t          d|g          }t          d|g          }|                    |||dz  z  |z   z            }|r||         ||         ||         }}}t          |||||          }|j        r*|j        r"||z  dk    }|t          j        u r|S |dt          |           z  t          |          z  z  }	t          | |z            }
d||
z
  z  }d||
z   z  }t          ||||
z
            t          | |d|t          ||||
z                       g}||z
  x}}t          |||          }|	dk    r%t          |	|d	
          }t          |||	||          }t          ||||          }|t          j        u r|S t          ||||f|t          j        fg          S t          |||d          }|dk    rt          ||d|z  |dz  |          }t          |||t          |d          f|dfg          S t          d|g          }|                    |||dz  z  ||z  z   |z   z            }|ry||         ||         }}|j        rd S t#          d          }||d|z  z  z   }|                    |||d|z  z  z
            }t'          ||          }|rt)          |||||          S d S t          d|g          }|                    ||z  |z   ||dz  z  ||z  z   |z   z            }|r||         ||         ||         ||         ||         f\  }}}}}|j        rd S ||dz  z  ||z  z   |z   }|d|z  z  }d|z  |z  |z   }| |z  |z   }t#          d          }t)          ||||t'          |dz  |                    }|dk    rt          ||z  |z  ||||z  |          }|j        r|S t'          ||z  |          }t          ||||g          } ||z  |z  ||z  z   }!t          |||!|           S d S )Nr   r2  r   r   r   r   rR   r   Fr7  r   Tr  r   r  )r   r  r]  r  r   rO  r*   r   r   r   r   r-  rv  r4  r   r   r  r   r   r  r   )"r   rf   r  r   r   r   r  general_rulepositive_condr  r   r1r2	log_stepsr.  subnegative_steppowerr  match2r   r   
integrand2r  r  match3denominatorconstnumer1numer2step1step2r   rewritens"                                     rn   quadratic_denom_ruler  {  s    IvS6(###AS6(###AS6(###AOOAVq[1!4566E [(E!HeAha1!)VQ1== 	n!"4 	naC!GM&&##qqbz$q'')*EQBqDzzHF8O$BF8O$B'FF8ODD*B3BrSY[abj[j@k@kllnI 2g%I#C;;MzzsU;;;	 1)VUCQ^ _ _'	69mTTM''$$ FlM5RUbdedjTk4lmmm)VVR8866%i1fbj%PPEY,1a1IESW=0YZZZS6(###A__Q!fk/AJ">"BCDDF q	6!919 	F#JJ!QqS'!^^FAQqS	M::
":q11	 	VQ	BBBFS6(###A__ai!mFaK!f*0Lq0PQRRF Bq	6!9fQiF1IM1aA9 	F&!)ma&j014AaCQ3v:a<Q#JJinQWa&@&@B BA::%eFl;&>&+VK-?H HE> 	Lvk16::9fuen==<+F;,>>9fhAAA
Frq   c                   | \  }}t          d|g          }t          d|dg          }dx}g g g }}}|                    t                    D ]}	|	j        |	j        }}
|j        s	||
j        vr!|j        s dS |
                    |||z  z             }|sI||         ||         }}||z  |z  k    s
|z  j	        s dS dk    s|z  dk    t          j        u r||c}|                    |
           |                    |           |                    |j                   ׉dk    rdS t          |          ||z  z   dz  z  }t          d          |                    fdt#          |||          D                                           |z  |z
  z            }t%          |dz
  z  z  z  z            }|                                st)          ||||          }t+          d          }|t          j        ur_|                    t,                              |d                    }t%          ||          }t1          ||||f|t          j        fg          }|S dS )	z*
    Substitute common (a+b*x)**(1/n)
    r   r2  r   r   NrR   r   c                v    i | ]5\  }}}|t           j        |z  z  |z  t           j        |z  z  |z  z  z  6S rk   )r   r\  )r   r   r   qb0q0r   s       rn   
<dictcomp>z$sqrt_linear_rule.<locals>.<dictcomp>  s]     "H "H "H&0dAq #'q/AbDAE!G3DQAY3N "H "H "Hrq   )r   rP  r   r   r    r  r  is_Rationalr  r5  r   rO  r   r  rW   r   r   zipr  rt   r   r   r  r  r4  )r   rf   r   r   r   a0ra  qsbspow_r   r   r  a1b1u_xr  r   r  rN  
simplifiedrK  r  r  r   s                         @@@rn   rt  rt    s    LIqS1#AS1a&!!!AKBBr2Es##  Yd? 	at'888 	FF

1QqS5!! 	q58Bb5BrE>>"R%!7>FF77r"uqyQV++FBT
		"
		$&	Qww2,,B19"
Cc

A.. "H "H "H "H "H "H47r24F4F"H "H "H I IIMaRSUWRWXZRZ\^Q^I_I_ [RT225b8!<<G%%'' 9aC99"ayyqv%%"b!(<(<==J,Z;;O A|0DXYX^F_/`aaD rq   c           
        | \  }t          dg          t          dg          t          ddg          t          d          }t          dd g	          }|                    |t          z  z   d
z  z  z             |z  z            }|sd S |         |         |         ||         ||         f\  }}|                              }|d S t	          d          }|r|t
          j        u rd }naj        r$t          |t                    |z  z            }n6t          t          |t          z  z             |z  z                      }dfd}	|dk    ro|z  z   d
z  z  z   |dz   d
z  z  z  }
|
                                t          z  z   d
z  z  z             z  } |	|
|          }t          |||          }n|dk    r |	||          }nd S t          |||          S )Nr   r2  r   r   r   r  r
  c                    | j         o| j        S rj   )r  is_oddr  s    rn   r  z%sqrt_quadratic_rule.<locals>.<lambda>  s    (A rq   r  r   
numer_polyrY   rf   r   c                   t          z  z   dz  z  z             }|                                 }|dk    rk|dk    r|                                 nt          j        |                                 f\  }}|dz  z  }||z  z
  }dz  z  z   |z  }d }	d }
|dk    rzt          d          }t          dt          |          z  ||t          j                   }t          ||z  z   dz  z  z   |          }
|dk    rt          ||z  |||
          }
|dk    rAt          t          d|z            d          }	|dk    rt          ||z  |d|z  |	          }	|
r>|	r<t          ||z  ||z  d          }t          ||t          ||
|	g                    }n-|
p|	}n(|                                 }t!          ||          }|S )Nr   rR   r   r   Fr   r7  )r*   rV   
all_coeffsr   ri  as_exprr   r   ry  r   r   r  r	  r   r-  r   r   )r  rf   rU  degr  r  ABpre_substituteconstant_steplinear_stepr   pow_ruleaddr  r   r   r   r   r   s                   rn   sqrt_quadratic_denom_rulez6sqrt_quadratic_rule.<locals>.sqrt_quadratic_denom_rule  s   QqsU1QT6\""!!!88.1Qhh:((***QVZEWEWEYEY<ZDAq1Q3A!A#Ac!eAgu_N)-M'+KAvv#JJ$QtAwwY1qvg>>#NAq!AaC%!Q$,QQ66"3An4DaN\g"h"hKAvv 1,qw2J2JW\ ] ] ]66$5agq!QuWm$\$\M 4} 4!N*AeGeDDD$/	1c73PQT_anSoCpCp$q$q"3m**,,F))Q1aHHDrq   rR   r   )r  rY   rf   r   )r   r  r*   as_polyr   r   rO  r  r  rt  r	  r  r-  rP  )r   r  rf   r  r
  r  f_polyrN  rK  r  r  r.  r   rJ  r   r   r   r   s                 @@@@rn   r  r    sn   LIqS1#AS1#AS1a&!!!AS		ASAABCCCAOOAd1QqS51a4<00!3344E !HeAha%(E!HDMAq!QYYq\\F~a88L N//	
 N(477A:q99*<$q1u++q.8H!+L+LMM        @ 	1uuq1uQq!tV|!Qw77
&&((a!eAadFl););;	++J	BB"9aGDD	
b00CClOLLLrq   tuple[Expr, Symbol]c                   | \  }}t          |t                    r0|j        d         |k    r |j        t          k    rt          ||          S |j        t          k    rt          ||          S t          d          }|j        t          k    rat	          |          t          |          z  }t          |||t          |||t          |          t          d|z  ||                              S |j        t          k    rat          |          t	          |          z  }t          |||t          |||t	          |          t          d|z  ||                              S |                    t                    }|j        t          k    rnt          |||t          |||t          |dz            t!          d|dz  dz   z  |t#          d          t"          j        t"          j                                      S |j        t&          k    rIt          |||t          |||t          |dz            t          d|z  ||                              S d S d S d S )Nr   r   rR   r   )r%  r"   r  rM  r'   r   r$   r   r   r(   r-  r   r   r%   r  r&   r]  r   r\  r#   )r   rf   r  r   r.  s        rn   hyperbolic_ruler  7  s?    Iv)/00 3Y^A5F&5P5P>T!!Iv...>T!!Iv...#JJ>T!!VT&\\1Iy&)FAtF||^AaCQRTU=V=VWWY Y Y>T!!VT&\\1Iy&)FAtF||^AaCQRTU=V=VWWY Y Y "))$//I~%%"9fiY4q>>!!QTAX,1Q44FFH HI I I ~%%"9fiY4q>>%ac1a002 23 3 3+3 35P5P( &%rq   c                    t          d| g          }t          d| g          }t          d| gd g          }t          d| gd g          }||||fS )	Nr   r2  r   r   c                ,    t          | t                    S rj   r%  r   r  s    rn   r  zmake_wilds.<locals>.<lambda>V      *Q:P:P rq   r0  r
  c                ,    t          | t                    S rj   r  r  s    rn   r  zmake_wilds.<locals>.<lambda>W  r  rq   )r   )r  r   r   r   r
  s        rn   
make_wildsr  R  sr    S6(###AS6(###AS6(0P0P/QRRRAS6(0P0P/QRRRAaA:rq   c                    t          |           \  }}}}t          || z            |z  t          || z            |z  z  }|||||fS rj   )r  r.   r-   r  r   r   r   r
  rF  s         rn   sincos_patternr  [  P    F##JAq!Q!F(mmQQvX!11GAq!Qrq   c                    t          |           \  }}}}t          || z            |z  t          || z            |z  z  }|||||fS rj   )r  r/   r2   r  s         rn   tansec_patternr  b  r  rq   c                    t          |           \  }}}}t          || z            |z  t          || z            |z  z  }|||||fS rj   )r  r0   r1   r  s         rn   cotcsc_patternr   i  r  rq   c                    t          d| g          }t          d| g          }t          d          }t          || z  |z             |z  }||||fS )Nr   r2  r   r  )r   r9   )r  r   r   r  rF  s        rn   heaviside_patternr  p  s^    S6(###AS6(###AS		A&1%%)GAq!rq   c                      fd}|S )Nc                     |  S rj   rk   )r  rM  s    rn   
uncurry_rlzuncurry.<locals>.uncurry_rlz  s    tT{rq   rk   )rM  r  s   ` rn   uncurryr  y  s"        rq   c                      fd}|S )Nc           	         | \  }}}}}} ||||||          }||k    r t          |||t          ||                    S d S rj   )r-  r  )	r  r   r   r   r
  rf   r  r.  r  s	           rn   trig_rewriter_rlz'trig_rewriter.<locals>.trig_rewriter_rl  s`    (,%1aIvGAq!Q	6::		!!y&)^IW]=^=^___ "!rq   rk   )r  r	  s   ` rn   trig_rewriterr
  ~  s)    ` ` ` ` `
 rq   c                :    |j         o|j         o|j        o|j        S rj   )is_evenr5  r   r   r   r
  r  r  s         rn   r  r    s*    QY *19 **) rq   c                    dt          d| z  |z            z
  dz  |dz  z  dt          d|z  |z            z   dz  |dz  z  z  S ru  )r-   r   r   r   r
  r  r  s         rn   r  r    sQ    q3qs6z??':a&?QU%K'(3qs6z??':a&?QU%K%M rq   c                    |j         o|dk    S Nr  r  r  s         rn   r  r        18;NQ rq   c                    dt          | |z            dz  z
  |dz
  dz  z  t          | |z            z  t          ||z            |z  z  S ru  )r-   r.   r  s         rn   r  r    P    QQvX)9%9a!eq[$I$'&MM%2$'&MMQ$6%7 rq   c                    |j         o|dk    S r  r  r  s         rn   r  r    r  rq   c                    dt          ||z            dz  z
  |dz
  dz  z  t          ||z            z  t          | |z            |z  z  S ru  )r.   r-   r  s         rn   r  r    r  rq   c                    |j         o|dk    S Nre  r  r  s         rn   r  r        AI<P!q& rq   c                    dt          ||z            dz  z   |dz  dz
  z  t          ||z            dz  z  t          | |z            |z  z  S ru  )r/   r2   r  s         rn   r  r    U    QQvX)9%9qsQw$G$'&MM1$4%5$'&MMQ$6%7 rq   c                    |j         S rj   r  r  s         rn   r  r        18 rq   c                    t          | |z            dz  dz
  |dz
  dz  z  t          | |z            z  t          ||z            |z  z  S Nr   rR   )r2   r/   r  s         rn   r  r    sP    S6]]A%5%9A{$K%(6]]%3%(6]]a%7%8 rq   c                    |dk    o|dk    S r  rk   r  s         rn   r  r    s    AF<MqAv rq   c                2    t          | |z            dz  dz
  S r!  )r2   r  s         rn   r  r    s    C&MM1$4q$8 rq   c                    |j         o|dk    S r  r  r  s         rn   r  r    r  rq   c                    dt          ||z            dz  z   |dz  dz
  z  t          ||z            dz  z  t          | |z            |z  z  S ru  )r0   r1   r  s         rn   r  r    r  rq   c                    |j         S rj   r  r  s         rn   r  r    r  rq   c                    t          | |z            dz  dz
  |dz
  dz  z  t          | |z            z  t          ||z            |z  z  S r!  )r1   r0   r  s         rn   r  r    sP    S6]]A%5%9A{$K$'&MM%2$'&MMQ$6%7 rq   c           	     z   | \  }t          fdt          t          fD                       rt          |          \  }}}}}                    |          sd S  t          t          t          t          t          t          t          i          t          fd||||fD             |gz                       S d S )Nc              3  B   K   | ]}                     |          V  d S rj   r  r  s     rn   r   z#trig_sincos_rule.<locals>.<genexpr>  /      
0
09==
0
0
0
0
0
0rq   c                P    g | ]"}                     |t          j                  #S rk   rr  rs  s     rn   r9  z$trig_sincos_rule.<locals>.<listcomp>  )    888aUYYq!&!!888rq   )r   r.   r-   r  r  r  sincos_botheven_conditionsincos_bothevensincos_sinodd_conditionsincos_sinoddsincos_cosodd_conditionsincos_cosoddrA  	r   r  rF  r   r   r   r
  rf   r  s	          @@rn   trig_sincos_ruler4    s     Iv

0
0
0
0c3Z
0
0
000 ",V44Aq!(( 	F{%#]#]
   8888Aq!Q<888 ! !	" " 	"" "rq   c           	        | \  }                     dt          |          z  t          |          i          t          fdt          t          fD                       rt          |          \  }}}}}                    |          sd S  t          t          t          t          t          t          t          i          t          fd||||fD             |gz                       S d S )NrR   c              3  B   K   | ]}                     |          V  d S rj   r  r  s     rn   r   z#trig_tansec_rule.<locals>.<genexpr>  r*  rq   c                P    g | ]"}                     |t          j                  #S rk   rr  rs  s     rn   r9  z$trig_tansec_rule.<locals>.<listcomp>  r,  rq   )r   r-   r2   r   r/   r  r  r  tansec_tanodd_conditiontansec_tanoddtansec_seceven_conditiontansec_seceventan_tansquared_conditiontan_tansquaredrA  r3  s	          @@rn   trig_tansec_ruler>    s    Iv	CKKV   I 
0
0
0
0c3Z
0
0
000 ",V44Aq!(( 	F{#]$n$n
   8888Aq!Q<888 ! !	" " 	"" "rq   c           
     `   | \  }                     dt          |          z  t          |          dt          |          z  t	          |          t          |          t          |          z  t	          |          i          t          fdt          t          fD                       rt          |          \  }}}}}                    |          sd S  t          t          t          t          t          i          t          fd||||fD             |gz                       S d S )NrR   c              3  B   K   | ]}                     |          V  d S rj   r  r  s     rn   r   z#trig_cotcsc_rule.<locals>.<genexpr>  r*  rq   c                P    g | ]"}                     |t          j                  #S rk   rr  rs  s     rn   r9  z$trig_cotcsc_rule.<locals>.<listcomp>  r,  rq   )r   r.   r1   r/   r0   r-   r   r   r  r  cotcsc_cotodd_conditioncotcsc_cotoddcotcsc_csceven_conditioncotcsc_cscevenrA  r3  s	          @@rn   trig_cotcsc_rulerF    sA    Iv	CKKV	CKKVFc&kk!3v;;   I 
0
0
0
0c3Z
0
0
000 ",V44Aq!(( 	F{#]$n
   8888Aq!Q<888 ! !" " 	"" "rq   c                8   | \  }}t          dt          d|z            g          }|                    t          d|z            |z            }|rHdt          |          z  t          |          z  t          d|z            z  }t	          ||z  |          S d S )Nr   r   r2  )r   r.   r  r-   r  )r   rf   r  r   r  
sin_doubles         rn   trig_sindouble_rulerI    s     IvS3qx==/***AOOC&MM!O,,E >s6{{]3v;;.s1V8}}<
i*4f===> >rq   c           	          t          t          t                    t          t                    t          t                    t          t
                              |           S rj   )r_   r`   r4  r>  rF  rI  r  s    rn   trig_powers_products_rulerK    sV    26),--,--,--/002 2 3;< < <rq   c           
        | \  }}t          dd|g          }t          dd|g          }t          d          }|||dz  z  z   }|                    |          }|D ]}|                    |          }	|	                    |t
          j                  }
|	                    |t
          j                  }|
j        r|
dk    p|
j        }|j        r|dk    p|j        }|
j        r|
dk     p|
j	        }|j        r|dk     p|j	        }d }|r4|r2t          |
          t          |          z  t          |          z  }d}n|rN|rLt          |
          t          |           z  }|t          |          z  }t          || k    ||k               }nO|rM|rKt          |
           t          |          z  }|t          |          z  }t          || k    ||k               }|ri }t          t          t          t          t           t"          fD ]S} ||          |t           ||          dz            <   d ||          z  |t           ||          d	z            <   T|                    ||                                          }t)          ||          }|                    |          s|t-          ||          z  }|                                }|                    dt          |          z            }|r4|                    dt          |          z  t          |          i          }t1          ||          }|                                st5          |||||||          c S 
d S )
Nr   r   r2  r   rL  r   TrR   r   )r   r   rP  r  r$  r   ri  	is_numberrx  is_negativer*   r/   r.   rT   r2   r-   r1   r0   r   rQ  r  r  r  r  r  rt   rK  )r   rf   r  r  r  rL  target_patternmatchesr)  r  r   r   
a_positive
b_positive
a_negative
b_negativex_funcrN  r   substitutionsr  replacedsecantsr   s                           rn   trig_substitution_rulerY    s    IvS1f+&&&AS1f+&&&A'NNE619_Nnn^,,G 2G 2G

>**IIa  IIa  {,q1u>
{,q1u>
{,q1u>
{,q1u>
 	E* 	E1ggd1ggoU3F KK 		EJ 		EAwwtQBxx'HE

*Ffy0&82CDDKK 	EJ 	EQBxxQ'HE

*Ffy0&82CDDK 	G M33% A A341U88d11U88Q;//067%jd11U88b>2233 ~~ff55>>@@H"8];;H<<'' GK666#,,.."--#e**55 '00#e**c%jj2    H )5991133 G/	6vx+G G G G Gc2G 2Grq   c                   | \  }}t          |          \  }}}}|                    |          }|rOd||         k    rEt          ||         |          }||         ||         }}t          ||||z  |z   | |z  |          S d S d S r  )r  r  r  r?  )	r   rf   r  rF  r   r   r  r  r   s	            rn   heaviside_ruler[  =  s     Iv(00GQ1OOG$$E MeAh q622Qxq1Y&1qbdGLLL	M Mrq   c                   | \  }}t          |j                  dk    rt          j        }n|j        d         }|j        r|dk     rd S t          d|g          t          d|dg          }}|j        d                             |||z  z             }|sd S ||         ||         }}t          |d          }|t          j        u rd }nt          t          ||          |          }t          |||||          }	t          ||	|          S )NrR   r   r   r2  r   )r  r  r   ri  r  r   r  r   rO  r   r:   rE  rP  )
r   rf   r   r
  r   r   r  rN  rK  rJ  s
             rn   dirac_delta_ruler]  H  s   LIq
9>aFN1< 1q55aS!!!4aV#<#<#<qAN1##AacE**E 8U1XqAa88Lqv&z!Q'7'7;;!)Q1a88LlOLLLrq   c           
        | \  }}t          d          }t          |||          }d}|rt          d           g }|D ]\  }}}	t          |	|          }
|dz   }t          d                    ||
                     |
                                rTt          |dz
            dk    r|                                \  }}|
rt          ||	z  |||	|
          }
|j	        rg }g }t          |t                    r|j        }n|                    |           |D ]\}t          |j                  sFt          t!          ||d          |          }|r%|                    |t#          |d          f           ]|                    |
df           t%          |	||          }
|                    t'          |||||
                     t)          |          dk    rt+          |||          S |r
|d         S d S d S )Nr   r   zList of Substitution RulesrR   r  T)r   r  rc   r  r  rt   r\   r  r   r  r%  r   r  r   r   r  r  r   r4  r   r  r  )r   rf   r  r   rV  r+  waysr   r   r  subruler<  rU  	piecewisecould_be_zeror)  r   s                    rn   substitution_rulerc  ^  sJ    Iv#JJE&y&%@@ME **+++&3 "	J "	J"FA{$[%88GAIE-&&ug66777))++ A!##++--5 a/K;X_``G% L "I$&M!%-- 4(-
%,,U333 - # #(66 #&4[DRS5T5TV\&]&]G& # ) 0 0$+$&tQKK2" !# !# !# $$gt_555+KKKGKKiHHIIIIt99q=="9fd;;; 	7NU* *R	 	rq   c                *    |                                  S rj   )r  rf   r  s     rn   r  r    s    i<<>> rq   c                ,    |                      |          S rj   )apartre  s     rn   r  r    s    ioof55 rq   c                    dS r   rk   re  s     rn   r  r    s    d rq   c                *    |                                  S rj   )r  re  s     rn   r  r        i..00 rq   c                |    t          | t          t          f          pt          fd| j        D                       S )Nc              3  P   K   | ] }|j         p|                              V  !d S rj   )r   r  r  s     rn   r   z<lambda>.<locals>.<genexpr>  s:      0s0s]`1Xs?P?PQW?X?X0s0s0s0s0s0srq   )r%  r   r   r  r  re  s    `rn   r  r    s?    9sCj))sS0s0s0s0sdmdr0s0s0s-s-s rq   c                *    |                                  S rj   expandre  s     rn   r  r    rj  rq   c                l    t          d |                     t                    D                       dk    S )Nc                (    h | ]}|j         d          S )r   )r  r  s     rn   rZ  z<lambda>.<locals>.<setcomp>  s    GGG1QVAYGGGrq   rR   )r  atomsr,   re  s     rn   r  r    s3    GG	0E F FGGGHH1L rq   c                .    |                      d          S )NT)trigrn  re  s     rn   r  r    s    i..D.99 rq   c                    | d         }|j         }|j        }|j        }| j        |v r'| j        |v r	t	          |  S t          || j                  S t          |  S r  )	variablesr)  r  r  r"  r  r   )r   rf   diff_variablesundifferentiated_functionintegrand_variabless        rn   derivative_rulerz    sg    I(N )3@---?n,,!8,,	8?;;;X&&rq   c           	         | \  }}|                     dt          |          z            rS|                    dt          |          z  t          |                    }t	          |||t          ||                    S d S r$  )r  r-   r   r2   r-  r  )r   rf   r  r.  s       rn   rewrites_ruler|    sy     IvqV}%% \NN1S[[=#f++>>	9fi	SY9Z9Z[[[\ \rq   c                    t          |  S rj   )r  r  s    rn   fallback_ruler~    r  rq   zdict[Expr, Expr | None]_integral_cachezdict[Expr, int]r  zc                   |                      t          i          }|t          v rEt          |         t          |           S t          |                              t                    fS dt          |<   t	          |           }fdfd} t          t          t                    t          t          t          t          t          t                    t          t                    t          t                    t          t                              t          t          t          t           t"          t$          t&          t          t          t(                    t          t*                    t          t,                    t          t                    t          t                    t          t.                              t0          t2          t4          t6          t8          t,          t:          t<          t>          t@          tB          tD          i                    t          t          t6                    t          tF                    t          tI          tJ          tL          tO           |t&          t                    tP                    tO           |t&          t                    tR                    tO           |t&          tT          gtV          R  tX                    tO           |t&          t                    tZ                    t\          t^                              t          tO           |t&          t                    t`                              t          tb                              td                    |          }t          |= |S )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                    | j         }|j        vrt          S t          t          t
          fD ]}t          ||          r|c S t          |          S rj   )rf   r  r   r   r,   rP   r%  type)r   rf   r  r  s      rn   r  zintegral_steps.<locals>.key  sb    &	///M13GH 	 	C)S)) 


Irq   c                       fd}|S )Nc                >     |           }|ot          |          S rj   )
issubclass)r   rz  r  klassess     rn   _integral_is_subclasszKintegral_steps.<locals>.integral_is_subclass.<locals>._integral_is_subclass  s%    HA/Aw///rq   rk   )r  r  r  s   ` rn   integral_is_subclassz,integral_steps.<locals>.integral_is_subclass  s*    	0 	0 	0 	0 	0 	0 %$rq   )3r  r  r  r  r	  r_   r`   rI  r^   r   r  r  rt  r  r   r    r!  r   r  r   r  r  r[  r  r   rz  r,   r  r9   r:   r]  rP   r)  r   r  r  r  r|  rc  ra   partial_fractions_rulecancel_ruler!   r  r  distribute_expand_rulerK  trig_expand_rulerg  rY  r~  )rf   r  optionsr  r   r  r   r  s    `     @rn   r  r    s   Z !!6<"899H?""8$,	6222 $H-66|VLL  %)!Iv..H    % % % % %-V'((&	*--y9J/K/K!"233!"6779 9 J	(++Y7H-I-I!.119=Q3R3R!"233!"5668 8 !9~( "6M!
   	 	$ 	i  o&&l!((c22*, , ((c22! ! ((c -+- - -    ((c22*, , * #   & i 4 4S# > >PPQQ,--/	
 	
2 	[- -Z  [-! -!F\ 	!Mrq   c                   t          | |                                          }t                                           t	          |t
                    rt          |j                  dk    r|j        d         d         }t	          |t                    r_|j        d         d         dk    rH|	                    |j        d         d         t          |j         f|j        d         d         df          }|S )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  ro   r  clearr%  r+   r  r  r   rM  r   )r  r*  r   r8  s       rn   manualintegrater  C  s    b As##((**F&)$$ +V[)9)9Q)>)>{1~a dB 	+FKN1$5$=$=[[Q"B	N3Q"D)+ +F Mrq   N)rJ  re   rK  r   rh   re   )r   r	  )T)rh   r  )r   r  (  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`   ra   sympy.utilities.iterablesrb   sympy.utilities.miscrc   re   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-  r2  r4  r?  rE  rK  r]  r`  rc  rg  rk  rp  rs  rw  rz  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*  rz   r@  r?  rI  rP  rg  r  r  r  r  r  r  r  r  rt  r  r  r  r  r  r   r  r  r
  r-  r.  r/  r0  r1  r2  r:  r;  r8  r9  r<  r=  rD  rE  rB  rC  r4  r>  rF  rI  rK  rY  r[  r]  rc  r  r  r  r  rz  r|  r~  r  intr  r  r  r  rk   rq   rn   <module>r     s    . # " " " " " 7 7 7 7 7 7 7 7 7 7 7 7 # # # # # # # # ! ! ! ! ! ! # # # # # # # # # # # #       $ $ $ $ $ $ & & & & & &             * * * * * * & & & & & &       1 1 1 1 1 1 1 1 1 1             1 1 1 1 1 1 1 1 1 1 " " " " " " 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 4 ; ; ; ; ; ; ; ;) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 9 9 9 9 9 9 : : : : : :F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F I I I I I I I I( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( > > > > > > M M M M M M M M                      ; : : : : :       # # # # # # . . . . . . B B B B B B B B B B B B + + + + + + , , , , , , ' ' ' ' ' ' F F F F F F F F F F F F . . . . . . & & & & & & 
 
 
 
 
3 
 
 
     s    . . . . .: . . . 
1 
1 
1 
1 
1 
1 
1 
1 	
 	
 	
 	
 	

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