
    Ed                   .   U d Z ddlmZ ddl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mZmZ ddl m!Z! ddl"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/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZMmNZN ddlOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZY ddlZm[Z[ ddl\m]Z]m^Z^ ddl_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZh ddlimjZj dd lkmlZl dd!lmmnZn dd"lompZp dd#lqmrZrmsZsmtZtmuZu dd$lvmwZw dd%lxmyZy dd&lzm{Z{ dd'l|m}Z}m~Z~mZmZ dd(lmZ dd)lmZ dd+Z ed,d-          Z ed.d/          Z ed0d1          Z ed2d3          Z ed4d5          Z ed6d7          Z ed8d9          Z ed:d;          Z ed<d;          Z ed=d1          Z ed>d?          Z ed@          Z edA          Z edBdC          Z edDdE          Z edFdC          Z edGdH          Z edI          Z edJ          Z edKdL          Z edMdL          Z edNdO          Z edPdQ          Z edRdS          Z edTdU          Z edVdC          Z edWdC          Z edXdS          Z edYdZ          Z ed[d\          Z ed]d\          Z ed^d\          Z ed_d\          Z ed`d\          Z edadZ          Z edbdc          Z edddc          Z ededc          Z edfdc          Z edgdc          Z edhdC          Z edidC          Z edjdC          Z edkdc          Z edldc          Z edmdn          Z edodp          Z edqdp          Z G dr dse          Zi Zdt Zdu Zdv Zdw ZeHeGeFeIeJeKfZdx Zdy Zdz Zd{ Zd| Zd} Zd~ Zd Zd Zg Zded<   g Z e(d          Zd Zd ZdddZd ZddZd Zd Zd Zd Zd ZddZdddZdd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 ZddZd Z ed d           Z ed d           Z ed d           Z ed d           Zd Zd Zd Zi Zded<    e	e          Z ded<    e(dæ          ZdĄ Z ee          dń             Z ee          dƄ             Z ee          dǄ             Z ee          dȄ             Z ee          dɄ             Z ee          dʄ             Z ee          d˄             Z	 ee          d̄             Z
 ee          d̈́             Z ee          d dф            Z ee          d҄             Z ee          dӄ             Z ee          dԄ             Z ee          dՄ             Z ee          dք             Z ee          dׄ             Z ee          ddڄ            Z ee          dۄ             Z ee          d܄             Z ee           ee          d݄                         Z ee          dބ             Z ee          d߄             Z ee          d             Z ee          d             Z ee          d             Z ee          d             Z ee          d             Z ee          d             Z ee          d             Z ee          d             Z  ee          d             Z! ee          d             Z" ee          d             Z# ee          d             Z$ ee          d             Z% ee          d             Z& ee          d             Z' ee          d             Z( ee          d             Z) ee          d             Z* ee          d             Z+ ee          d             Z, ee          d             Z- ee          d             Z. ee          d             Z/ ee          d             Z0 ee          d             Z1d Z2d Z3dS (  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 namedtuples representing the integration rules used. The
``manualintegrate`` function computes the integral using those steps given
an integrand; given the steps, ``_manualintegrate`` will evaluate them.

The integrator can be extended with new heuristics and evaluation
techniques. To do so, write a function that accepts an ``IntegralInfo``
object and returns either a namedtuple representing a rule or
``None``. Then, write another function that accepts the namedtuple's fields
and returns the antiderivative, and decorate it with
``@evaluates(namedtuple_type)``.  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)
namedtupledefaultdict)Mapping)reduce)Add)cacheit)Dict)Expr)
Derivative)	fuzzy_not)Mul)IntegerNumberE)Pow)EqNe)S)DummySymbolWild)Abs)explog)	HyperbolicFunctioncschcoshcothsechsinhtanhasinhatanh)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)debug c                Z    d fd}t          | |dz             }|_        ||_        |S )Nc                X    | j         |j         k    ot                              | |          S N)	__class__tuple__eq__)selfothers     ?lib/python3.11/site-packages/sympy/integrals/manualintegrate.pyrm   zRule.<locals>.__eq__E   s$    ~0NU\\$5N5NN    c                     | |           S rj    )rn   ro   rm   s     rp   <lambda>zRule.<locals>.<lambda>G   s    ffT5&9&9"9 rq   z context symbol)r   rm   __ne__)nameprops__neq__clsrm   s       @rp   Rulerz   C   sK    O O O9999G
T5#44
5
5CCJCJJrq   ConstantRuleconstantConstantTimesRulezconstant other substep	PowerRulezbase expAddRulesubstepsURulezu_var u_func constant substep	PartsRulezu dv v_step second_stepCyclicPartsRulezparts_rules coefficientTrigRulezfunc argHyperbolicRuleExpRuleReciprocalRulefunc
ArcsinRuleArcsinhRuleReciprocalSqrtQuadraticRuleza b cSqrtQuadraticDenomRuleza b c coeffsSqrtQuadraticRuleAlternativeRulealternativesDontKnowRuleDerivativeRuleRewriteRulezrewritten substepCompleteSquareRulePiecewiseRulesubfunctionsHeavisideRulezharg ibnd substepDiracDeltaRulezn a bTrigSubstitutionRulez(theta func rewritten substep restriction
ArctanRuleArctanhRule
JacobiRuleGegenbauerRulezn aChebyshevTRulenChebyshevURuleLegendreRuleHermiteRuleLaguerreRuleAssocLaguerreRuleCiRuleza bChiRuleEiRuleSiRuleShiRuleErfRuleFresnelCRuleFresnelSRuleLiRulePolylogRuleUpperGammaRuleza eEllipticFRuleza dEllipticERulec                  $    e Zd ZU ded<   ded<   dS )IntegralInfor   	integrandr   symbolN)__name__
__module____qualname____annotations__rs   rq   rp   r   r      s"         OOONNNNNrq   r   c                      fd}|S )Nc                *    | _         | t          <   | S rj   )rule
evaluators)r   r   s    rp   
_evaluateszevaluates.<locals>._evaluates   s    	
4rq   rs   )r   r   s   ` rp   	evaluatesr      s$         rq   c                   t          | t                    rdS t          | t                    sdS | D ][}t          |t                    rt          |          r dS *t          |t                    rt          d |D                       r dS \dS )NTFc              3  4   K   | ]}t          |          V  d S rj   contains_dont_know).0is     rp   	<genexpr>z%contains_dont_know.<locals>.<genexpr>   s+      66Q%a((666666rq   )
isinstancer   rl   r   listany)r   vals     rp   r   r      s    $%% tdE"" u  c5!! 	!#&& ttT"" 	66#66666 tt5rq   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      c                0    g | ]}t          |          S rs   )manual_diffr   argr   s     rp   
<listcomp>zmanual_diff.<locals>.<listcomp>   s#    CCCSC00CCCrq   rT   )argsr   r.   diffr1   r/   r0   r   sumr   lenr   r   )fr   r   s    ` rp   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CCCCAFCCCDDD3 	B16{{a BJqvay&$A$A B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.
    rT   r   z(Expected an iterable of (old, new) pairsr   z$subs accepts either 1 or 2 argumentsc                (    | j         o
| j        k    S rj   )is_Powbase)xx0s    rp   rt   zmanual_subs.<locals>.<lambda>   s    !(*Cqv| rq   c                2    t          | j         z            S rj   )r   )r   news    rp   rt   zmanual_subs.<locals>.<lambda>   s    #aeCi.. rq   )r   r   r   r	   itemsre   
ValueErrorr   r   replaceappendr   subsr   )exprr   sequencenew_subsoldr   r   s        @@rp   manual_subsr      s7   
 4yyA~ 	A7hw00 	I~~''HH(## 	IGHHH	I	Ta 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          ||                                           }|j        v 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                0    g | ]}t          |          S rs   rY   )r   tr   s     rp   r   z<find_substitutions.<locals>.test_subterm.<locals>.<listcomp>   s#    TTTAfQ//TTTrq   c                0    g | ]}t          |          S rs   r   )r   r   u_vars     rp   r   z<find_substitutions.<locals>.test_subterm.<locals>.<listcomp>   s#    TTT!VAu--TTTrq   )as_Add)	rf   formatr   cancelfree_symbolsis_rational_functionmaxas_numer_denomas_independent)uu_diffsubstituted
deg_before	deg_afterr   r   r   s        rp   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] 	TTTT9Q9Q9S9STTTUUJTTTT{7Q7Q7S7STTTUUI:% 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    rp   rt   z:find_substitutions.<locals>.exp_subterms.<locals>.<lambda>   s    AL rq   
propertiesr   )r   findr   r   r   matchr   r[   )r   linear_coeffstermsr   exp_r   r  r   s          rp   exp_subtermsz(find_substitutions.<locals>.exp_subterms   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   rT   r      c                >    g | ]}|                               |S rs   hasr   s     rp   r   zAfind_substitutions.<locals>.possible_subterms.<locals>.<listcomp>  s(    ===SWWV__====rq   c                t    g | ]4}d |cxk     rt          j        d                    k     'n n
j        |z  5S )rT   )absr   r   )r   dr   s     rp   r   zAfind_substitutions.<locals>.possible_subterms.<locals>.<listcomp>  sn     2 2 2112 2 2 2"49Q<002 2 2 2 2$)Q, 2 2 2rq   c                     g | ]}|j         	|S rs   )r   )r   r   s     rp   r   zAfind_substitutions.<locals>.possible_subterms.<locals>.<listcomp>  s.     % % %A8%a % % %rq   )r   r+   r   inverse_trig_functionsr   r   r9   r   rI   rJ   rK   rL   rM   rO   rN   rP   r   r   extendr   r   rX   r   is_Addr   )r   rr   r   possible_subtermsr   s   `   rp   r  z-find_substitutions.<locals>.possible_subterms   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   )r   r   r   resultsr   r	  r   r   new_integrandr|   substitutionr  s   ```        @rp   find_substitutionsr     s@   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: {})rf   r   integral_stepsr   r   r   )integralr   r   	rewrittensubsteprd   rewrites        rp   	_rewriterzrewriter.<locals>._rewriter3  s    $	6?FFyRY[abbccc9h 	+*II% +(F;;!'<88 +W +&!!6+ + +	+ 	++ ++ + + +rq   rs   )rd   r$  r%  s   `` rp   rewriterr&  1  s*    + + + + + + 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: {})rf   r   r   r   r   )criteriar!  r   r   r   r"  rd   r$  s         rp   _proxy_rewriterz'proxy_rewriter.<locals>._proxy_rewriterC  s    %($	6PWWXacjlrt|}}~~~$x..(9d 	'II% '""9f55v' ' '	' 	'' 'rq   rs   )rd   r$  r*  s   `` rp   proxy_rewriterr+  A  s*    ' ' ' ' ' ' 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      rp   multiplexer_rlz#multiplexer.<locals>.multiplexer_rlS  sU    #))++ 	" 	"ICs4yy "tDzz!!!"	" 	"rq   rs   )r/  r0  s   ` rp   multiplexerr1  Q  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 RulesrT   Rule {}: {}c                0    g | ]}t          |          |S rs   r   )r   r   s     rp   r   z7alternatives.<locals>._alternatives.<locals>.<listcomp>j  s&    LLLt3Ed3K3KLdLLLrq   )rf   r   r   r   r   r   r   )r!  altscountr   resultdoableruless         rp   _alternativesz#alternatives.<locals>._alternatives[  s   )*** 	$ 	$DAIE-&&ud33444T(^^F $z&,?? $("$'-T'9$F###t99> 	87N 	8LLtLLLF 8&v99999&t7h7777	8 	8rq   rs   )r:  r;  s   ` rp   r   r   Y  s$    8 8 8 8 8( rq   c                &    t          | j        g| R  S rj   )r{   r   r!  s    rp   constant_ruler>  q  s    *6X6666rq   c                b   | \  }}|                                 \  }}||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d|          S t          |t          t          |          d          ft          dd|          dfg||          S d S d S )NrT   r   T)as_base_expr   r   r   r_   r   r~   r   r   r   is_zeror{   r   r   )r!  r   r   r   exptr   s         rp   
power_rulerC  t  sT    Iv&&((JD$T&& :dF+C+C D1H" 	;!$	6:::tY777	t(	( Zf-E-E tT9f55SYY&'' 	.KYY 	.1f---2c$ii##$!Q''.
 f  	   rq   c                    | \  }}t          |j        d         t                    r"t          t          |j        d         ||          S d S Nr   )r   r   r   r   r   )r!  r   r   s      rp   exp_rulerF    sM     Iv).#V,, @q).+Y???@ @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!          ||          rn|                    |d          }|j        |         u rIt'          fd|j        d |         D                       s!|j        d |         |fz   } ||         | c S d S )Nr  r   rT   c              3  B   K   | ]}|                               V  d S rj   r  )r   vr   s     rp   r   z'orthogonal_poly_rule.<locals>.<genexpr>  s-      FFaAEE&MMFFFFFFrq   )rP   r   rO   r   rI   r   rJ   r   rK   r   rL   r   rM   r   rN   r   r   getr   r   )r!  orthogonal_poly_classesorthogonal_poly_var_indexr   klass	var_indexr   r   s          @rp   orthogonal_poly_rulerO    s   
NNN,,)	
 	A!

 !Iv( A Ai'' 	A155eQ??Iy)V3 AFFFF9>*9*+EFFFFFA$>*9*5F8KKD92594@@@@A A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 ]c\  }}}}t;          |
|          rL|
                    |          r5t?          fdt          D                       }| || r|||fz   } || c S dd S )Nac                    | j          S rj   rA  r   s    rp   rt   z'special_function_rule.<locals>.<lambda>  
    19} rq   excluder  brX  cr  c                    | j          S rj   rT  rU  s    rp   rt   z'special_function_rule.<locals>.<lambda>  rV  rq   ec                     | j         o| j         S rj   )is_nonnegative
is_integerrU  s    rp   rt   z'special_function_rule.<locals>.<lambda>  s    1+<= rq   r   FevaluaterT   c                    | |k    S rj   rs   rR  r  s     rp   rt   z'special_function_rule.<locals>.<lambda>  
    Q!V rq   c                    | |k    S rj   rs   rd  s     rp   rt   z'special_function_rule.<locals>.<lambda>  re  rq   c              3  l   K   | ].}                     |                               |          V  /d S rj   )rJ  )r   wr  s     rp   r   z(special_function_rule.<locals>.<genexpr>  sO       "? "?1%*YYq\\"?%))A,, "? "? "? "? "? "?rq   ) rP  r   _symbol_wildsr  r   r   r   r,   r   r!   r   r-   r   r$   r   r   r   r   r   r   r   r   rS   r   r(   r   r   r   r   r  rl   )r!  r   r   rR  rY  r[  r  r]  linear_patternquadratic_pattern
_integrandtype_pattern
constraintr   	wild_valsr   r  s                    @rp   special_function_rulerr    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)? '$	6'::D4;&&&' 'rq   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 rs   r^   )r   r#  condgeneric_conds      rp   r   z(_add_degenerate_step.<locals>.<listcomp>  sI     H H H)GT !4,#6"@"@"B"BC H H Hrq   )r   r   r   r   r   truecontextr   )rv  generic_stepdegenerate_stepr   s   `   rp   _add_degenerate_stepr{    s     ,.. 6H H H H-9-FH H H &|45/=11 744_af5666|';\=PQQQrq   Tr!  c                   | \                                   \  }}t          dg          }t          dg          }t          ddg          }|                    ||z  z   |dz  z  z             sdS fdfd	|||fD             \  }}}t          |d          }|r|t          j        u rd}nE|j        rt          ||z  ||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          |||          x}}|
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 ]?\  }}|t          j        u r | c S |t          j        ur|                    ||f           @|rHfd|D             }|
j        s!|                    |t          j        f           t'          |          }n|}t)          |||          S |t          j        k    r$t-          |||          }t)          |||          S dS )zm
    Set degenerate=False on recursive call where coefficient of quadratic term
    is assumed non-zero.
    rR  rZ  rY  r[  r   r   Nc                   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 ||          }|dk    rt	          ||          }|S )Nr   rT   r   r   )r   r(   r}   r   r   )	RuleClassrR  sign_ar[  sign_chr   r"  quadratic_baser|   u_funcstandard_formr#  r   r   s                rp   make_inverse_trigz,inverse_trig_rule.<locals>.make_inverse_trig  s   c

d6!8fQhq1}&<<===	acF1H-T!WW9' 	##F"N$v~q/@(@@AAA)M>::q= 	j'-(S`J`bhiiG 	ME64)VLLG6 	P(GYOOGrq   c                P    g | ]"}                     |t          j                  #S rs   rJ  r   Zeror   r   r  s     rp   r   z%inverse_trig_rule.<locals>.<listcomp>  s)    777uyyAF##777rq   rT      c                $    g | ]\  }} | |fS rs   rs   )r   r   ru  r  s      rp   r   z%inverse_trig_rule.<locals>.<listcomp>#  s+    ZZZjdD++T2D9ZZZrq   )r@  r   r  r   r   rw  rA  r{   sqrt_linear_ruler   r_   r   is_realr   rW   r   falser   is_positiver   r{  Halfr   )r!  
degenerater   r   rR  rY  r[  rv  rz  r  kstepgeneral_rulepossibilitiesr   ru  r:  r   r  r  r   s                    @@@@rp   inverse_trig_ruler    s(   
 !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	
 Z&qCxc6BB*<QZC8OQW+X+XYY#	a Ir1Q3xQT1Q3Z19!Q9fUUU|9 	$ 	$MaQBA.AE1q50A0ABq!Q1-s1q5!a%/@/@A 7 7
d 16> 4,,d3333qw& 7!(($666 $ZZZZMZZZ} 9LL,!7888$UIv>>##L$HHH
af} I Aq)V<<#L$HHHI Irq   c                |    | \  }fd|                                 D             }d |v rd nt          ||          S )Nc                0    g | ]}t          |          S rs   )r   )r   gr   s     rp   r   zadd_rule.<locals>.<listcomp>1  s3     5 5 5 a(( 5 5 5rq   )as_ordered_termsr   )r!  r   r  r   s      @rp   add_ruler  /  s`     Iv5 5 5 5 11335 5 5G7?K44F(K(KKrq   c                    | \  }}|                     |          \  }}|dk    r%t          ||          }|t          |||||          S d S d S NrT   )r   r   r}   )r!  r   r   coeffr   	next_steps         rp   mul_ruler  6  sx     Iv ''//HE1z M"1f--	 	M$UAy)VLLLM M	M 	Mrq   c                   fd}d } |t                      |t           | |t          t                     |t                    g}t          d          }t          | t           gt          R           r|| z  } t          |          D ]9\  }} ||           }|r%|\  }	}
|	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                    rOt!          |
          }t#          |          r d S |	                              }t'          |          }|	|
|||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|rY|	                              }t!          t/          |
                    }t#          |          st'          |          }|	|
|||fc S ;d S )
Nc                   |                                                                  } t          | t                    s| j        sg nfd| j        D             }|r$t          | }| |z                                   }||fS d S )Nc                >    g | ]}|                               |S rs   )is_algebraic_exprr   s     rp   r   z;_parts_rule.<locals>.pull_out_algebraic.<locals>.<listcomp>H  s,    QQQ#33H3H3P3PQ#QQQrq   )r   togetherr   r*   is_Mulr   r   )r   	algebraicr   dvr   s       rp   pull_out_algebraicz'_parts_rule.<locals>.pull_out_algebraicD  s    $$&&//11	%i;; R9CS RRRQQQQQQQ 	 	YAa-''))Bb5L	 	rq   c                       fd}|S )Nc                     t           fdD                       r/fd j        D             }|rt          d |          } |z  }||fS d S d S )Nc              3  B   K   | ]}                     |          V  d S rj   r  r   r   r   s     rp   r   zI_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<genexpr>P  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   ry   r   s     rp   r   zT_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>.<genexpr>R  s-      IIz#s33IIIIIIrq   )r   )r   r   	functionss    @rp   r   zJ_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>Q  sR     K K KIIIIyIIIIIK K K Krq   c                    | |z  S rj   rs   )rR  rY  s     rp   rt   zH_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<lambda>T  s
    1Q3 rq   )r   r   r
   )r   r   r   r  r  s   `   rp   pull_out_u_rlz6_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rlO  s    7777Y77777 !K K K Ky~ K K K !55A"QBb5L! !! !rq   rs   )r  r  s   ` rp   
pull_out_uz_parts_rule.<locals>.pull_out_uN  s$    	! 	! 	! 	! 	! rq   	temporaryrT   Fr   Tc              3  Z   K   | ]&}t          |t          t          t          f          V  'd S rj   )r   r-   r,   r   r   rR  s     rp   r   z_parts_rule.<locals>.<genexpr>  sF       " " q3S/22 " " " " " "rq   r   )r   r  r-   r,   r   r   r   	enumerater   r  r   is_polynomialrY   is_Derivativer+   rQ   r   r   r   _manualintegrater   allequalsr_   )r   r   r  r  liate_rulesdummyindexr   r8  r   r  rec_dvv_stepdurI  acceptlruler  s    `                rp   _parts_ruler  A  ss       
 
 
 :c??JJ0F$G%zz#s';';:c??$K
 +E)c;$:;;<< &I%	 -- 70 70ti 4	0EAr Q^+ AEE%LL ua  A""B )) !//&2I2I !S!! 2((00 66**a/ )) 	4# 4rvv.C'D'D 4"2';<<4+B77F)&11 4VVF^^,V44 "aV3333 Fqy ,, 	 	 " "" " " " "	 "FF(4  Ei((A QqTYYua0077;; !% 0VVF^^'f==)&11 0(00Ab!R////o70 70rq   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   rT   r  z7Cyclic integration {} with v: {}, du: {}, integrand: {}c           
     B    g | ]\  }}}}}t          |||d d d           S rj   )r   )r   r   r  rI  r  r  s         rp   r   zparts_rule.<locals>.<listcomp>  sD     : : :/!RB q"fdD$?? : : :rq   r  c           
         | r7| d         \  }}}}}t          ||| | dd          ||z            |          S t          |          S Nr   rT   )r   r   )	stepsr   r   r  rI  r  r  make_second_stepr   s	          rp   r  z$parts_rule.<locals>.make_second_step  sj     	0#(8 Ar1b&QF--eABBiR@@&0 0 0 i000rq   r   )as_coeff_Mulr  rf   r   r   r   rV   r-   r,   r   r$   r!   xreplace_cache_dummy_parts_u_cacheranger   r   r   r   r}   r   )r!  r   r|   r8  r  r   r  rI  r  r  cachekey_coefficientr   next_constantnext_integrandr  r   s                   @@rp   
parts_ruler    s8    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 
&: :38: : :CJJ&4v	  M Kt K,Xy$-5	-A6K KD ./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B))%)QV<<"F, , M 	Ct 	C$Xy$%-	%96C CD rq   c                j   | \  }}t          |t          t          f          rP|j        d         }t          |t                    sd S t          |t                    rd}nd}t          ||||          S |t          |          dz  k    rt          d|||          S |t          |          dz  k    rt          d|||          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   sec**2csc**2)r   r-   r,   r   r   r   r1   r0   r.   r/   r   r   )r!  r   r   r   r   r"  s         rp   	trig_ruler    s    Iv)c3Z(( 6nQ#v&& 	Fi%% 	DDDc9f555CKKN" =&)V<<<	c&kk1n	$ =&)V<<<)S!! (3	+??			Is	#	# (3	+??			Is	#	# 	nQ#hhkCHHs3xx$77#hhS)+			Is	#	# nQ#hhkCHHs3xx$77#hhS)+		 	y&))6  rq   c                   | \  }}t          |          t          |          z  }||z  }||j        vr/t          d|||          }|dk    r|rt	          |||||          }|S t          |           t          |          z  }||z  }||j        vr/t          d|||          }|dk    r|rt	          |||||          }|S d S )Nsec*tanrT   csc*cot)r1   r.   r   r   r}   r0   r/   )r!  r   r   sectanqr   csccots          rp   trig_product_ruler    s     Iv[[3v;;&FFAQ^# 	666::6 	Id 	I$QiHHD&kk\CKK'FFAQ^# 	666::6 	Id 	I$QiHHD 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 |S t          d|g          }|                    |||dz  z  ||z  z   |z   z            }|rz||         ||         }}|j        rd S t          d          }||d|z  z  z   }|                    |||d|z  z  z
            }t#          ||          }|rt%          ||d |||          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 )NrR  rZ  rY  r[  r   r   rT   r  Fra  r  r   r]  )r   r  r   is_extended_realr   rw  r(   r   r}   r   r   r   r  r   rA  r   r   r   r   )!r!  r   r   rR  rY  r[  r  r  positive_condr  r|   r1r2	log_stepsr"  subnegative_stepr  match2r   r  
integrand2r  r]  match3denominatorconstnumer1numer2step1step2r   rewritens!                                    rp   quadratic_denom_ruler  &  s    IvS6(###AS6(###AS6(###AOOAVq[1!4566E (E!HeAha1!!Q9f== 	n!"4 	naC!GM& $##qqbz$q'')*EQBqDzzHF8O$BF8O$B'xVDD*2r>&/SUW]3^3^ac`cekllnI 2g%I#IsF;;Mz `sU;;;	 1%mYX^ _ _'	=)VTTM' %$$ <"?-QRQWAX!Y[dflmmmS6(###A__Q!fk/AJ">"BCDDF q	6!919 	F#JJ!QqS'!^^FAQqS	M::
":q11	 	FD)ZHHH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a!$QWa00  A: 	.%e&,[&8&+&+Fl;&>&,	. .E
 > 	Lvk16::E5>9f==<+F;,>>8Xy&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            }t'          |          st)          |d|||          }t+          d          }|t          j        urP|                    d	 |D                       }t%          ||          }t-          ||f|t          j        fg||          }|S dS )
z*
    Substitute common (a+b*x)**(1/n)
    rR  rZ  rY  r   NrT   r   c                v    i | ]5\  }}}|t           j        |z  z  |z  t           j        |z  z  |z  z  z  6S rs   )r   One)r   r   rY  r  b0q0r   s       rp   
<dictcomp>z$sqrt_linear_rule.<locals>.<dictcomp>  s]     "H "H "H&0dAq #'q/AbDAE!G3DQAY3N "H "H "Hrq   c                    i | ]}|d S r   rs   )r   rY  s     rp   r  z$sqrt_linear_rule.<locals>.<dictcomp>  s    (:(:(:!A(:(:(:rq   )r   r  r   r   r   r   r   is_Rationalr  r_  r   rw  r   r  rZ   r   r   zipr   r   r   r   r   )r!  r   r   rR  rY  a0basesqsbspow_r   r  r  a1b1u_xr   r#  r  rv  
simplifiedrz  r  r  r   s                         @@@rp   r  r  u  s    LIqS1#AS1a&!!!AKBBr2Es##  Yd? 	at'88 	 	FF

1QqS5!! 	q58Bb5BrE> 	"R%!7 	FF7 	r"uqyQV+ 	FBT
		"
		$&	Qw 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g&& QT7Iq99"ayyqv% 	b"(:(:r(:(:(:;;J,Z;;O 4"6!&8Q!RT]_`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 )NrR  rZ  rY  r[  r   r   r   c                    | j         o| j        S rj   )r   is_oddr  s    rp   rt   z%sqrt_quadratic_rule.<locals>.<lambda>  s    (A rq   r  r   
numer_polyr\   r   r   c                   t          z  z   dz  z  z             }|                                 }|dk    rl|dk    r|                                 nt          j        |                                 f\  }}|dz  z  }||z  z
  }dz  z  z   |z  }d x}	}
|dk    r{t          d          }t          |t          j         dt          |          z  |          }t          |z  z   dz  z  z   d ||          }
|dk    rt          |||
||z            }
|dk    rAt          t          d|z            d          }	|dk    rt          |d|z  |	||z            }	|
r>|	r<t          ||z  ||z  d          }t          |t          |
|	g|          |          }n-|
p|	}n(|                                 }t!          ||          }|S )Nr   rT   r   r   Fr  ra  )r(   rY   
all_coeffsr   r  as_exprr   r~   r  r   r}   r  r   r   r   r   r   )r  r   denomdegr]  r  ABpre_substituteconstant_steplinear_stepr   pow_ruleaddr  coeffsrR  rY  r[  r   s                   rp   sqrt_quadratic_denom_rulez6sqrt_quadratic_rule.<locals>.sqrt_quadratic_denom_rule  s*   QqsU1QT6\""!!!8 	I.1QhZ:((***QVZEWEWEYEY<ZDAq1Q3A!A#Ac!eAgu_N*..MKAv i#JJ$Q477A>>#Aq1uQq!tV|T8^UVWW6 i"3A~{TUVdTdfg"h"hKAv ] 1,qw2J2JW\ ] ] ]6 ]$5a5-QRSXQXZ[$\$\M 4} 4!N*AeGeDDD"3m0LcST(U(UW`bcdd"3m**,,F)!Q69aHHDrq   rT   r  )r  r\   r   r   )r   r  r(   as_polyr   r   rw  rA  r   r  r   r  r   r{  )r!  r  r   r   r   r  f_polyrv  rz  r  r  r"  r#  ry  rR  rY  r[  r   s                 @@@@rp   sqrt_quadratic_ruler    sy   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	
 N(477A:q99*<$q1u++q.8H!+L+LMM        > 	1u q1uQq!tV|!Qw77
&&((a!eAadFl););;	++J	BB"9gy!DD	
b 00CClOLLLrq   tuple[Expr, Symbol]c                   | \  }}t          |t                    r8|j        d         |k    r(|j        t          k    rt          d|||          S |j        t          k    rt          d|||          S t          d          }|j        t          k    rbt	          |          t          |          z  }t          |t          |t          |          d t          |d|z  |          ||          ||          S |j        t          k    rbt          |          t	          |          z  }t          |t          |t	          |          d t          |d|z  |          ||          ||          S |                    t                    }|j        t          k    rot          |t          |t          |dz            d t          t!          d          t           j        t           j        d|dz  dz   z  |          ||          ||          S |j        t$          k    rJt          |t          |t          |dz            d t          |d|z  |          ||          ||          S d S d S d S )Nr   r$   r!   r   rT   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"  s        rp   hyperbolic_ruler!    s    Iv)/00 YY^A5F&5P Y>T! 	E!&&)VDDD>T! 	E!&&)VDDD#JJ>T! 	UVT&\\1IyDLL$!!QqS!,,iA ABKVU U U >T! 	YVT&\\1IyDLL$!!QqS!,,iA ABKVU U U "))$//I~% o"9QVAX!!A$$quaAlAFF	SY[ [\egmo o o ~% Y"9QVAX%a1a00)VE EFOQWY Y Y/Y Y Y Y,Y Yrq   c                    t          d| g          }t          d| g          }t          d| gd g          }t          d| gd g          }||||fS )	NrR  rZ  rY  mc                ,    t          | t                    S rj   r   r   r  s    rp   rt   zmake_wilds.<locals>.<lambda>      *Q:P:P rq   rW  r   c                ,    t          | t                    S rj   r%  r  s    rp   rt   zmake_wilds.<locals>.<lambda>  r&  rq   )r   )r   rR  rY  r#  r   s        rp   
make_wildsr(     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   rR  rY  r#  r   ro  s         rp   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.   r1   r*  s         rp   tansec_patternr.    r,  rq   c                    t          |           \  }}}}t          || z            |z  t          || z            |z  z  }|||||fS rj   )r(  r/   r0   r*  s         rp   cotcsc_patternr0    r,  rq   c                    t          d| g          }t          d| g          }t          d          }t          || z  |z             |z  }||||fS )Nr#  rZ  rY  r  )r   r9   )r   r#  rY  r  ro  s        rp   heaviside_patternr2    s^    S6(###AS6(###AS		A&1%%)GAq!rq   c                      fd}|S )Nc                     |  S rj   rs   )r   r   s    rp   
uncurry_rlzuncurry.<locals>.uncurry_rl(  s    tT{rq   rs   )r   r5  s   ` rp   uncurryr6  '  s"        rq   c                      fd}|S )Nc                    | \  }}}}}} ||||||          }||k    r t          |t          ||          ||          S d S rj   )r   r   )	r   rR  rY  r#  r   r   r   r"  r$  s	           rp   trig_rewriter_rlz'trig_rewriter.<locals>.trig_rewriter_rl-  sl    (,%1aIvGAq!Q	6::		! 	#y&116# # #	# 	#rq   rs   )r$  r9  s   ` rp   trig_rewriterr:  ,  s$    # # # # # rq   c                :    |j         o|j         o|j        o|j        S rj   )is_evenr_  rR  rY  r#  r   r   ss         rp   rt   rt   8  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 NrT   r   )r,   rR  rY  r#  r   r   r   s         rp   rt   rt   <  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         rp   rt   rt   ?      18;NQ rq   c                    dt          | |z            dz  z
  |dz
  dz  z  t          | |z            z  t          ||z            |z  z  S r@  )r,   r-   rA  s         rp   rt   rt   B  P    QQvX)9%9a!eq[$I$'&MM%2$'&MMQ$6%7 rq   c                    |j         o|dk    S rC  rD  r=  s         rp   rt   rt   F  rE  rq   c                    dt          ||z            dz  z
  |dz
  dz  z  t          ||z            z  t          | |z            |z  z  S r@  )r-   r,   rA  s         rp   rt   rt   I  rG  rq   c                    |j         o|dk    S Nr  r<  r=  s         rp   rt   rt   M      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 r@  )r.   r1   rA  s         rp   rt   rt   O  U    QQvX)9%9qsQw$G$'&MM1$4%5$'&MMQ$6%7 rq   c                    |j         S rj   rD  r=  s         rp   rt   rt   S      18 rq   c                    t          | |z            dz  dz
  |dz
  dz  z  t          | |z            z  t          ||z            |z  z  S Nr   rT   )r1   r.   rA  s         rp   rt   rt   U  sP    S6]]A%5%9A{$K%(6]]%3%(6]]a%7%8 rq   c                    |dk    o|dk    S )Nr   r   rs   r=  s         rp   rt   rt   Y  s    AF<MqAv rq   c                2    t          | |z            dz  dz
  S rS  )r1   rA  s         rp   rt   rt   [  s    C&MM1$4q$8 rq   c                    |j         o|dk    S rK  rL  r=  s         rp   rt   rt   ]  rM  rq   c                    dt          ||z            dz  z   |dz  dz
  z  t          ||z            dz  z  t          | |z            |z  z  S r@  )r/   r0   rA  s         rp   rt   rt   _  rO  rq   c                    |j         S rj   rD  r=  s         rp   rt   rt   c  rQ  rq   c                    t          | |z            dz  dz
  |dz
  dz  z  t          | |z            z  t          ||z            |z  z  S rS  )r0   r/   rA  s         rp   rt   rt   e  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     rp   r   z#trig_sincos_rule.<locals>.<genexpr>l  /      
0
09==
0
0
0
0
0
0rq   c                P    g | ]"}                     |t          j                  #S rs   r  r  s     rp   r   z$trig_sincos_rule.<locals>.<listcomp>w  )    888aUYYq!&!!888rq   )r   r-   r,   r+  r  r1  sincos_botheven_conditionsincos_bothevensincos_sinodd_conditionsincos_sinoddsincos_cosodd_conditionsincos_cosoddrl   	r!  r   ro  rR  rY  r#  r   r   r  s	          @@rp   trig_sincos_rulerf  i  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 )NrT   c              3  B   K   | ]}                     |          V  d S rj   r  r  s     rp   r   z#trig_tansec_rule.<locals>.<genexpr>  r\  rq   c                P    g | ]"}                     |t          j                  #S rs   r  r  s     rp   r   z$trig_tansec_rule.<locals>.<listcomp>  r^  rq   )r   r,   r1   r   r.   r.  r  r1  tansec_tanodd_conditiontansec_tanoddtansec_seceven_conditiontansec_seceventan_tansquared_conditiontan_tansquaredrl   re  s	          @@rp   trig_tansec_rulerp  z  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 )NrT   c              3  B   K   | ]}                     |          V  d S rj   r  r  s     rp   r   z#trig_cotcsc_rule.<locals>.<genexpr>  r\  rq   c                P    g | ]"}                     |t          j                  #S rs   r  r  s     rp   r   z$trig_cotcsc_rule.<locals>.<listcomp>  r^  rq   )r   r-   r0   r.   r/   r,   r   r0  r  r1  cotcsc_cotodd_conditioncotcsc_cotoddcotcsc_csceven_conditioncotcsc_cscevenrl   re  s	          @@rp   trig_cotcsc_rulerx    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 )NrR  r   rZ  )r   r-   r  r,   r   )r!  r   r   rR  r  
sin_doubles         rp   trig_sindouble_ruler{    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   )rb   rc   rf  rp  rx  r{  r=  s    rp   trig_powers_products_ruler}    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          ||          }t3          |          st5          |||||||          c S d S )
NrR  r   rZ  rY  thetar   TrT   )r   r   r  r  rJ  r   r  	is_numberr  is_negativer(   r.   r-   rW   r1   r,   r0   r/   r   trigsimpr   r  r   r  r   r   r   )r!  r   r   r  r  r  target_patternmatchesr   r  rR  rY  
a_positive
b_positive
a_negative
b_negativex_funcrestrictionr|   substitutionsr   replacedsecantsr#  s                           rp   trig_substitution_ruler    s    IvS1f+&&&AS1f+&&&A'NNE619_Nnn^,,G 3+ 3+

>**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 	+ M33% A A341U88d11U88Q;//067%jd11U88b>2233 ~~ff55>>@@H"8];;H<<'' +K666#,,.."--#e**55 '00#e**c%jj2    H )599)'22 +/vx+!6+ + + + +c3+ 3+rq   c                &   | \  }}t          |          \  }}}}|                    |          }|r^d||         k    rTt          ||         |          }t          |          }	||         ||         }}t	          ||z  |z   | |z  |	||          S d S d S rE  )r2  r  r   r  r   )
r!  r   r   ro  r#  rY  r  r  r  r8  s
             rp   heaviside_ruler    s     Iv(00GQ1OOG$$E LeAh La&11!&))Qxq1QvX\A2a4FKKKL L L L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 )NrT   r   rR  rZ  rY  )r   r   r   r  r   r   r  r   rw  r{   r:   r   r{  )
r!  r   r   r   rR  rY  r  rv  rz  ry  s
             rp   dirac_delta_ruler    s    LIq
9>a FN1< 1q5 aS!!!4aV#<#<#<qAN1##AacE**E 8U1XqAa88Lqv G&z!Q'7'7AFF!!Q9a88LlOLLLrq   c                   | \  }}t          d          }t          |||          }d}|rt          d           g }|D ]\  }}}	t          |	|          }
|dz   }t          d                    ||
                     t          |
          rOt          |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 RulesrT   r4  T)r   r  rf   r   r   r   r_   r   r}   r   r   r   r   r   r   rA  r   r   r   r   r   r   )r!  r   r   r   r  r7  waysr  r[  r   subruler  r  	piecewisecould_be_zeror   r#  s                    rp   substitution_ruler    s\    Iv#JJE&y&%@@ME ,*+++&3 $	2 $	2"FA{$[%88GAIE-&&ug66777!'** A!# L++--5 a/;[Z_``G% L "I$&M!%-- 4(-
%,,U333 - # #(66 #&4[DRS5T5TV\&]&]G& # ) 0 0$+$&tQKK2" !# !# !# $$gt_555+I{FKKGKKeVQ%'1 1 2 2 2 2 t99q= 	"4F;;; 	7NY, ,V	 	rq   c                *    |                                  S rj   )r   r   r   s     rp   rt   rt   G  s    i<<>> rq   c                ,    |                      |          S rj   )apartr  s     rp   rt   rt   H  s    ioof55 rq   c                    dS )NTrs   r  s     rp   rt   rt   M  s    d rq   c                *    |                                  S rj   )r   r  s     rp   rt   rt   N      i..00 rq   c                    t          fd| j        D                       p)t          | t                    pt          | t                    S )Nc              3  P   K   | ] }|j         p|                              V  !d S rj   )r   r  r   s     rp   r   z<lambda>.<locals>.<genexpr>R  s8      NNCJ3#++F33NNNNNNrq   )r  r   r   r   r   r  s    `rp   rt   rt   Q  sN    NNNNy~NNNNN 	&i%%	&i%% rq   c                *    |                                  S rj   expandr  s     rp   rt   rt   U  r  rq   c                l    t          d |                     t                    D                       dk    S )Nc                (    h | ]}|j         d          S r  )r   r  s     rp   	<setcomp>z<lambda>.<locals>.<setcomp>Z  s    GGG1QVAYGGGrq   rT   )r   atomsr+   r  s     rp   rt   rt   Y  s3    GG	0E F FGGGHH1L rq   c                .    |                      d          S )NT)trigr  r  s     rp   rt   rt   [  s    i..D.99 rq   c                    | d         }|j         }|j        }|j        }| j        |v r'| j        |v r	t	          |  S t          || j                  S t          | j        g| R  S rE  )	variablesr   r   r   r   r   r{   r   )r!  r   diff_variablesundifferentiated_functionintegrand_variabless        rp   derivative_ruler  ]  sy    I(N )3@-- ;?n, 	<!8,,	8?;;;H.:::::rq   c                    | \  }}|                     dt          |          z            rS|                    dt          |          z  t          |                    }t	          |t          ||          ||          S d S r  )r  r,   r   r1   r   r   )r!  r   r   r"  s       rp   rewrites_ruler  k  sy     IvqV}%% \NN1S[[=#f++>>	9nY&G&GTZ[[[\ \rq   c                    t          |  S rj   )r   r=  s    rp   fallback_ruler  r  s    ""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          t`                              tb                    |          }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(u_var=_u, u_func=exp(x), constant=1,
    substep=ArctanRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u),
    context=exp(x)/(exp(2*x) + 1), symbol=x)
    >>> print(repr(integral_steps(sin(x), x)))     # doctest: +NORMALIZE_WHITESPACE
    TrigRule(func='sin', arg=x, context=sin(x), symbol=x)
    >>> print(repr(integral_steps((x**2 + 3)**2, x)))     # doctest: +NORMALIZE_WHITESPACE
    RewriteRule(rewritten=x**4 + 6*x**2 + 9,
    substep=AddRule(substeps=[PowerRule(base=x, exp=4, context=x**4, symbol=x),
        ConstantTimesRule(constant=6, other=x**2,
            substep=PowerRule(base=x, exp=2, context=x**2, symbol=x),
                context=6*x**2, symbol=x),
        ConstantRule(constant=9, context=9, symbol=x)],
    context=x**4 + 6*x**2 + 9, symbol=x), context=(x**2 + 3)**2, symbol=x)


    Returns
    =======

    rule : namedtuple
        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   )r   r   r   r   r+   rQ   r   type)r!  r   ry   r   s      rp   r.  zintegral_steps.<locals>.key  sd    &	// 	M13GH 	 	C)S)) 


Irq   c                       fd}|S )Nc                >     |           }|ot          |          S rj   )
issubclass)r!  r  r.  klassess     rp   _integral_is_subclasszKintegral_steps.<locals>.integral_is_subclass.<locals>._integral_is_subclass  s%    HA/Aw///rq   rs   )r  r  r.  s   ` rp   integral_is_subclassz,integral_steps.<locals>.integral_is_subclass  s*    	0 	0 	0 	0 	0 	0 %$rq   )2r  r  r  r   r   rb   rc   rr  ra   r   rC  r  r  r  r   r   rF  r   r  r   r  r  r  r  r   r  r+   r  r9   r:   r  rQ   rO  r   r>  r!  r   r  r  rd   partial_fractions_rulecancel_ruler   r  r  distribute_expand_ruler}  trig_expand_ruler  r  )r   r   optionsr  r!  r  r8  r.  s    `     @rp   r   r   |  s   ` !!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*, , * #   & ,---	
 	
0 	Y, ,X  Y,! ,!FZ 	!Mrq   c                    | |z  S rj   rs   )r|   r   r   s      rp   eval_constantr    s    frq   c                &    | t          |          z  S rj   r  )r|   ro   r#  r   r   s        rp   eval_constanttimesr    s    &w////rq   c                x    t          | |dz   z  |dz   z  t          |d          ft          |           df          S NrT   r  T)r*   r   r   r   r   r   r   s       rp   
eval_powerr    sC    
q/C!G	$bbkk2	TD
 
 
rq   c                &    |t          |           z  S rj   r   r  s       rp   eval_expr  
  s    s4yy  rq   c                F    t          t          t          |                     S rj   )r   mapr  r   r   r   s      rp   eval_addr    s    s#X..///rq   c                    t          |          }|j        rA|j        dk    r6|                    t	          |           t	          |j                             }|                    | |          S )Nr  )r  r   r   r   r   r   )r   r  r|   r#  r   r   r8  s          rp   eval_ur    sa    g&&F} <r) <SZZ#fk*:*:):;;;;uf%%%rq   c                J    t          |          }| |z  t          |          z
  S rj   r  )r   r  r  second_stepr   r   rI  s          rp   
eval_partsr    s'      Aq5#K0000rq   c                    d|z
  }g }d}| D ]9}|                     ||j        z  t          |j                  z             |dz  }:t	          | |z  S )NrT   r  )r   r   r  r  r   )parts_rulesr  r   r   r8  signr   s          rp   eval_cyclicpartsr     sf    k/KFD  dTVm&6t{&C&CCDDD
<+%%rq   c                   | dk    rt          |           S | dk    rt          |          S | dk    rt          |          S | dk    rt          |          S | dk    rt	          |          S | dk    rt          |           S d S )Nr-   r,   r  r  r  r  )r,   r-   r1   r0   r.   r/   r   r   r   r   s       rp   	eval_trigr  ,  s    u} Cy	 	3xx		 3xx		 3xx		 3xx		 Cy rq   strr   r   c                Z    | dk    rt          |          S | dk    rt          |          S d S )Nr$   r!   )r!   r$   r  s       rp   eval_hyperbolicr  <  s<    v~ Cyyv~ Cyy rq   c                ~    | |z  dz  t          ||z            z  t          |t          ||z            z            z  S r  )r(   r4   rR  rY  r[  r   r   s        rp   eval_arctanr  D  s;    q519tAE{{"T&4A;;*>%?%???rq   c                    |  |z  dz  t          | |z            z  t          |t          | |z            z            z  S r  )r(   r'   r  s        rp   eval_arctanhr  I  sA    37Q;qb1f%ftQBF||.C(D(DDDrq   c                     t          |           S rj   r  )r   r   r   s      rp   eval_reciprocalr  M  s    t99rq   c                     t          |          S rj   )r3   r  s     rp   eval_arcsinr  Q  s    <<rq   c                     t          |          S rj   )r&   )r   r   s     rp   eval_arcsinhr  V  s    88Orq   c           	         t          dt          |          z  t          | ||z  z   ||dz  z  z             z  |z   d|z  |z  z             t          |          z  S )Nr   )r   r(   )rR  rY  r[  r   r   s        rp   eval_reciprocal_sqrt_quadraticr  [  sX    qaya!eAadFl+++A-ac!e344T!WW<<rq   r  
list[Expr]c           	        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}n4t          t          d|z            d          }|t          |          z  }t          g fdt          t                              D             |
|z  R  |z  |z   S )	Nr   rT   r  r  r   Fr  c              3  Z   K   | ]%}|         t                    d z
  |z
  z  z  V  &dS )r   N)r   )r   r   r  result_coeffsr   s     rp   r   z,eval_sqrt_quadratic_denom.<locals>.<genexpr>x  sT       5 5 q!!c&kk!mAo"66 5 5 5 5 5 5rq   )	copyr  r   r   r(   r  r   r  r   )rR  rY  r[  r  r   r   r   r   r  r  r]  r>  r|   I0r  r  s      ` `         @rp   eval_sqrt_quadratic_denomr  `  s    M[[]]F3v;;q=!! % %KKM!Oq	1Q3U###qs!Aqy{5((qs!Qwu}$":vbzqAQqsU1QT6\A1ac{H1} - ac1!5!5%HHH&t,,, ; 5 5 5 5 5 5M 2 2335 5 5 ;67c; ; ;;<=?AB Brq   c                ^    t          t          ||          d          }t          |          S )NFr  )r  r   r  )rR  rY  r[  r   r   r  s         rp   eval_sqrt_quadraticr  |  s,    |Iq99eLLLDD!!!rq   c                ,    t          | d                   S rE  r  )r   r   r   s      rp   eval_alternativer    s    LO,,,rq   c                     t          |          S rj   r  )r"  r#  r   r   s       rp   eval_rewriter    s     G$$$rq   c                (    t          d | D              S )Nc                6    g | ]\  }}t          |          |fS rs   r  )r   r#  ru  s      rp   r   z"eval_piecewise.<locals>.<listcomp>  s9     < < <!.$ )1148 < < <rq   r)   r  s      rp   eval_piecewiser    s+     < <2:< < < = =rq   c                   |                     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                   }nt          |t                    r2|	}|
}t          |
dz  |	dz  z
            }t!          |d                   }nFt          |t                    r1|	}|
}t          |
dz  |	dz  z             }t#          |d                   }t	          |           ||z  ft          |           ||z  ft          |           ||z  f| |fg}t%          t'          |                               |                                          |f          S )NrT   r   r   )r   r1   r,   r0   r-   r/   r.   r   r  r+   r   r`   r]   r   r(   r3   r2   r4   r*   r  r  )r  r   r"  r#  r  r   r   trig_functionrelationnumerr  opposite
hypotenuseadjacentinverser  s                   rp   eval_trigsubstitutionr
    sH   99SZZ3u::..D99SZZ3u::..D99SZZ3u::..D#899::M}""""!!$MVd]M22Hx==AHQK((LE5-%% $
q5!8+,,x{##	M3	'	' 	$
q5!8+,,x{##	M3	'	' $%(UAX-..
x{## 
UXj()	UXj()	UXh&'		L 	'	"	"	'	'	5	5	>	>	@	@+N  rq   c                    t          | j                  }t          |          D ]\  }\  }}||k    r||dz
  f||<    nt          | j        g|R  S r  )r   variable_countr  r   r   )r   r   r  r   varr7  s         rp   eval_derivativeruler    su     )233N$^44  <C&= 	!$eAgN1E	 in6~6666rq   c                T    t          |           ||                    ||          z
  z  S rj   )r9   r   )hargibndr#  r   r   s        rp   eval_heavisider    s(     T??Ggll64&@&@@AArq   c                v    | dk    rt          |||z  z             |z  S t          |||z  z   | dz
            |z  S r  r8   )r   rR  rY  r   r   s        rp   eval_dirac_deltar    sJ    Av "1Q3!!a!eQqS!!!##rq   c           	        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   rT   r   r  )r*   rP   r   r   )r   rR  rY  r   r   s        rp   eval_jacobir    s    	
6!a%QAv..	.A		:Bq1uqy!<L<LM	Aq
a%!)VQY	q	 AE6>!#3	3R1XX>@ @ @rq   c                    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 )NrT   r   r  T)r*   rO   r   rI   r   r  r   rR  r   r   s       rp   eval_gegenbauerr    su    	AE1q5&	)	)1a!e9	5r!Qxx@	AE6	"	"AE	*Bq"II6	
  rq   c                    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 )NrT   r   T)r*   rI   r   r   r   r   r   s      rp   eval_chebyshevtr    sz    z!a%00!a%81q5&!!1q5)*+,-.0Qmm=	1d  rq   c                    t          t          | dz   |          | dz   z  t          | d          ft          j        df          S r  )r*   rI   r   r   r  r  s      rp   eval_chebyshevur    sD    	AE6	"	"AE	*Bq"II6	
  rq   c                b    t          | dz   |          t          | dz
  |          z
  d| z  dz   z  S r@  )rK   r  s      rp   eval_legendrer     s6    QUF##hq1uf&=&==!aHHrq   c                :    t          | dz   |          d| dz   z  z  S r@  )rL   r  s      rp   eval_hermiter"    s#    1q5&!!1a!e9--rq   c                J    t          | |          t          | dz   |          z
  S r  )rM   r  s      rp   eval_laguerrer$    s%    Av!a%!8!888rq   c                2    t          | dz   |dz
  |           S r  )rN   r  s       rp   eval_assoclaguerrer&    s    1q5!a%0000rq   c                    t          |          t          | |z            z  t          |          t          | |z            z  z
  S rj   )r,   r?   r-   rA   rR  rY  r   r   s       rp   eval_cir)    7    q66"QvX,,Q1V8!444rq   c                    t          |          t          | |z            z  t          |          t          | |z            z  z   S rj   )r!   r@   r$   rB   r(  s       rp   eval_chir,    7    773qx== 4773qx==#888rq   c                F    t          |          t          | |z            z  S rj   )r   rC   r(  s       rp   eval_eir/    s    q66"QvX,,rq   c                    t          |          t          | |z            z  t          |          t          | |z            z  z   S rj   )r-   r?   r,   rA   r(  s       rp   eval_sir1  	  r*  rq   c                    t          |          t          | |z            z  t          |          t          | |z            z  z   S rj   )r$   r@   r!   rB   r(  s       rp   eval_shir3    r-  rq   c                   | j         rt          t          t          j        |  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        | 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        | z            dz  t          ||dz  d| z  z  z
            z  t          d| z  |z  |z   dt          |           z  z            z  S )Nr   r  r  r   T)r  r*   r(   r   Pir   r;   r<   r  s        rp   eval_erfr6    sP    3!$)__QQAqs^!4!44RT&[1_qqbz233456U<!$q&\\!^c!adAaCj.111ac&j1nqay122348:; ; 	; ADF||A~A1ac
N 3 33ac&j1nqay1223 	3rq   c           
        t          t          j        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   r  )r(   r   r5  r,   r=   r-   r>   r  s        rp   eval_fresnelcr9        ac
AqD!A#JNHac&j1nd1Q3qt8nn%DEEEAqD!A#JNHac&j1nd1Q3qt8nn%DEEE	FG Grq   c           
        t          t          j        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 r8  )r(   r   r5  r,   r>   r-   r=   r  s        rp   eval_fresnelsr<  #  r:  rq   c                2    t          | |z  |z             | z  S rj   )rD   r(  s       rp   eval_lir>  )  s    ahlArq   c                .    t          |dz   | |z            S r  rR   r(  s       rp   eval_polylogr@  -  s    1q5!F(###rq   c                X    ||z  |  |z  | z  z  t          |dz   |  |z            z  | z  S r  rE   )rR  r]  r   r   s       rp   eval_uppergammarB  1  s<    196	aR((:a!eaRY+G+GGIIrq   c                H    t          ||| z            t          |           z  S rj   )rH   r(   rR  r  r   r   s       rp   eval_elliptic_frE  5  !    fac""477**rq   c                H    t          ||| z            t          |           z  S rj   )rG   r(   rD  s       rp   eval_elliptic_erH  9  rF  rq   c                "    t          | |          S rj   rU   r  s     rp   eval_dontknowrulerJ  =  s    Iv&&&rq   c                    t                               | j                  }|st          dt	          |           z             ||  S )NzCannot evaluate rule %s)r   rJ  rk   r   repr)r   	evaluators     rp   r  r  A  sE    t~..I A2T$ZZ?@@@9drq   c                   t          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   rT   T)r  r   r  clearr   r*   r   r   r   r   r   )r   r  r8  ru  s       rp   manualintegraterP  H  s    b nQ4455F&)$$ +V[)9)9Q)> +{1~a dB 	+FKN1$5$= 	+[[Q"B	N3Q"D)+ +F Mrq   N)rg   )T)r!  r   )r!  r  )r   r  r   r   )r  r  (4  __doc__
__future__r   typingr   r   r   collectionsr   r   collections.abcr	   	functoolsr
   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   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&   r'   (sympy.functions.elementary.miscellaneousr(   $sympy.functions.elementary.piecewiser*   (sympy.functions.elementary.trigonometricr+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   'sympy.functions.special.delta_functionsr9   r:   'sympy.functions.special.error_functionsr;   r<   r=   r>   r?   r@   rA   rB   rC   rD   'sympy.functions.special.gamma_functionsrF   *sympy.functions.special.elliptic_integralsrG   rH   #sympy.functions.special.polynomialsrI   rJ   rK   rL   rM   rN   rO   rP   rQ   &sympy.functions.special.zeta_functionsrS   	integralsrV   sympy.logic.boolalgrW   sympy.ntheory.factor_rX   sympy.polys.polytoolsrY   rZ   r[   r\   sympy.simplify.radsimpr]   sympy.simplify.simplifyr_   sympy.solvers.solversr`   sympy.strategies.corera   rb   rc   rd   sympy.utilities.iterablesre   sympy.utilities.miscrf   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   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+  r1  r   r>  rC  rF  rO  rP  r   rj  ri  rr  r{  r  r  r  r  r  r  r  r  r  r  r!  r(  r+  r.  r0  r2  r6  r:  r_  r`  ra  rb  rc  rd  rl  rm  rj  rk  rn  ro  rv  rw  rt  ru  rf  rp  rx  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  intr  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r   r"  r$  r&  r)  r,  r/  r1  r3  r6  r9  r<  r>  r@  rB  rE  rH  rJ  r  rP  rs   rq   rp   <module>rz     s    & # " " " " " - - - - - - - - - - / / / / / / / / # # # # # #             $ $ $ $ $ $ & & & & & &             * * * * * * & & & & & &       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 ; ; ; ; ; ; ; ;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 . . . . . . & & & & & &    tNJ//D,.FGG Dj))	
$y*
%
%W566D788	$(*CDD4
J''&
33
$y*
%
%&//T,
d=!!"d#@'JJ 6GG D,g66 $(.99tN##&''d="566T.0CDD _n55_&9::&00t2FH H T,((
d='**T,((
&..&,,&,,tNC((d=#&&tNC((D,e44 	h		
$y%
 
 	h			h		
$y%
 
 
$y'
"
"tNG,,tNG,,	h		d=%((&.._e,,_e,,    :   
 
      20 0 0B dD$= U U Un          07 7 7  *@ @ @A A A4 OQ  P P P P	
%**)' )' )'XR R RCI CI CI CI CILL L LM M M MZ0 Z0 Z0zD D DN' ' 'R  0L L L^) ) ) )X?M ?M ?M ?M ?MDY Y Y Y: 	  	 	  	 	  	 	  	 	  	  
	 	 	 $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: :
" " """ " "*" " "*> > >< < <;+ ;+ ;+z	L 	L 	LM M M M,2 2 2j ">>557 7  h #"00	2 2 "' ' 102 2  8N N99	; ; ; ; ;\ \ \# # # ,. - - - -"-+c"2"2 2 2 2 2uSzz} } }~ <   0 0 0 9
 
 
 7! ! ! 70 0 0 5& & & 91 1 1
 ?	& 	& 	& 8   >    :@ @ @ ;E E E >   :   ;   &''= = ('= !""B B B #"B6 " " "
 ?- - - 
;% %  % == = =   $ $ ! $L >7 7 7 =B B B >$ $ $ :@ @ @ >   >  
 >  
 <I I I ;. . . <9 9 9 1 1 1 65 5 5 79 9 9 6   65 5 5 79 9 9 7	3 	3 	3 <G G G
 <G G G
 6   ;$ $ $ >J J J =+ + + =+ + + <' ' '  ; ; ; ; ;rq   