o
    *ήc                    @   s  d Z ddlmZ edZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z8m9Z:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZH ddlImJZJmKZK ddlLmMZMmNZNmOZO ddlPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z] ddl^m_Z_m`Z`maZa ddlbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZn ddlompZpmqZqmrZrmsZsmtZt ddlumvZvmwZwmxZx ddlymzZzm{Z{ ddl|m}Z} dd l~mZmZ dd!lmZmZ dd"lmZ dd#lmZmZmZ dd$lmZmZmZmZmZmZmZmZmZmZmZmZ dd%lmZ dd&lmZ dd'lmZ dd(lmZmZmZmZmZ dd)lmZ dd*lmZ dd+lmZ G d,d- d-eZeeZG d.d/ d/eZG d0d1 d1eZerdd2lmZmZmZmZmZmZ dd3lmZ dd4lmZmZ G d5d6 d6eZee ee d7d8 d9D \ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZe*d:\ZZZZZe}Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZddHdIZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Zdpdq Zdrds Zdtdu Zdvdw Zdxdy Zdzd{ Zd|d} Zd~d Zdd Zdd Zdd Z dddZdd Zdd Zdd Zdd Zdd Zdd ZG dd deZdddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZddĄ ZddƄ Z ddȄ Z!ddʄ Z"dd̄ Z#dd΄ Z$ddЄ Z%dd҄ Z&ddԄ Z'ddք Z(dd؄ Z)eZ*ddڄ Z+dd܄ Z,ddބ Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dd Z;dd Z<dd Z=dd  Z>dd Z?dd Z@dd ZAdd ZBd	d
 ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd  ZNd!d" ZOd#d$ ZPd%d& ZQd'd( ZRd)d* ZSd+d, ZTd-d. ZUd/d0 ZVd1d2 ZWd3d4 ZXd5d6 ZYd7d8 ZZd9d: Z[d;d< Z\dd=d>Z]d?d@ Z^dAdB Z_dCdD Z`dEdF ZadGdH ZbdIdJ ZcdKdL ZddMdN ZeddOdPZfdQdR ZgdSdT ZhdUdV ZidWdX ZjdYdZ Zkd[d\ Zld]d^ Zmd_d` Zndadb Zodcdd Zpdedf Zqdgdh Zrdidj Zsdkdl Ztdmdn ZuddodpZvddqdrZwdsdt Zxdudv Zydwdx Zzdydz Z{d{d| Z|d}d~ Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZddÄ ZdĐdń ZdƐdǄ ZddȐdɄZdʐd˄ Zd̐d̈́ Zdΐdτ ZdАdф ZdҐdӄ ZdԐdՄ Zd֐dׄ Zdؐdل Zdڐdۄ Zdܐd݄ Zdސd߄ Zdd Zdd Zedddd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d Zdd Zdd Zdd Zdd	 Zd
d Zdd ZÐdddZĐdd ZŐdd ZƐdd Zǐdd ZȐdd ZɐdddZʐdd Zːdd Z̐d d! Z͐d"d# Zΐd$d% Zϐd&d' ZАd(d) Zѐdd*d+ZҐd,d- ZӐd.d/ ZԐd0d1 ZՐd2d3 Z֐d4d5 Zאd6d7 Zؐd8d9 Zِd:d; Zڐd<d= Zېd>d? Zܐd@dA ZݐdBdC ZސdDdE ZߐdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZddRdSZdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Zdpdq Zdrds Zdtdu Zdvdw Zdxdy Zdzd{ Zd|d} Zd~d Zdd Zdd Zdd Zdd Z dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZddÄ ZdĐdń ZdƐdǄ Z dȐdɄ Z!dʐd˄ Z"d̐d̈́ Z#dΐdτ Z$dАdф Z%dҐdӄ Z&dԐdՄ Z'd֐dׄ Z(dؐdل Z)dڐdۄ Z*dܐd݄ Z+dސd߄ Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dd Z;dd Z<d d Z=dd Z>dd Z?dd Z@dd	 ZAd
d ZBdddZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLd d! ZMd"d# ZNd$d% ZOd&d' ZPd(d) ZQd*d+ ZRd,d- ZSd.d/ ZTd0d1 ZUd2d3 ZVd4d5 ZWd6d7 ZXd8d9 ZYd:d; ZZd<d= Z[d>d? Z\d@dA Z]dBdC Z^dDdE Z_dFdG Z`dHdI ZadJdK ZbdLdM ZcdNdO ZddPdQ ZedRdS ZfdTdU ZgdVdW ZhdXdY ZidZd[ Zjd\d] Zkd^d_ Zld`\amandaodadb Zpdcdd Zqdedf Zrdgdh Zsdidj Ztdkdl Zudmdn ZvddodpZwdqdr Zxdsdt Zydudv Zzdwdx Z{dydz Z|d{d| Z}d}d~ Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd deZdd Zdd Zdd Zdd Zedddd Zedddd Zedddd Zedddd Zedddd Zedddd Zedddd Zedddd Zedddd Zedddd Zdd ZG dd deZdd ZdddZdd Zdd Zdd Zdd ZdÐdĄ ZdŐdƄ ZdǐdȄ Zdɐdʄ Zdːd̄ Zd͐d΄ ZdϐdЄ ZG dѐd҄ deZdӐdԄ ZG dՐdք deZdאd؄ Zdِdڄ Zdېd܄ Zdݐdބ Zdߐd Zdd ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeېZeZdGZeree  Ze Ze Ze Ze ZÐe ZĐe ZdGS dGS (  z
Utility functions for Rubi integration.

See: http://www.apmaths.uwo.ca/~arich/IntegrationRules/PortableDocumentFiles/Integration%20utility%20functions.pdf
    )import_modulematchpy)SumAdd)Basic)Dict)N)UnevaluatedExprfactor_terms)FunctionWildFunctionexpandexpand_trig)Mul)EFloatIIntegerRationaloopizoo)PowS)DummySymbolWildsymbols)sympify)postorder_traversal	factorial)imreAbssign)explogLambertW)acoshasinhatanhacothacschasechcoshsinhtanhcothsechcsch)floorfrac)MaxMinsqrt)atanacscasinacotacosasecatan2sincostancotcscsec)
elliptic_f
elliptic_eelliptic_pi)erffresnelcfresnelserfcerfiEiexpintliSiCiShiChi)digammagammaloggamma	polygamma
uppergamma)appellf1hyperTupleArg)polylogzetaIntegral)AndOr)	factorint	factorrat)apart)PolynomialDivisionFailedPolynomialErrorUnificationFailed)discriminantfactorgcdlcmpolysqfsqf_listPolydegreequoremtotal_degree)	FiniteSet)	powdenest)collect)fractionsimplifycancelpowsimp	nsimplify)doctest_depends_onflatten)randintc                   @      e Zd ZdZedd ZdS )rubi_unevaluated_exprzs
    This is needed to convert `exp` as `Pow`.
    SymPy's UnevaluatedExpr has an issue with `is_commutative`.
    c                 C   s    ddl m} |dd | jD S )Nr   )	fuzzy_andc                 s       | ]}|j V  qd S N)is_commutative).0a r   L/tmp/pip-target-vg8gfxp4/lib/python/sympy/integrals/rubi/utility_function.py	<genexpr>:       z7rubi_unevaluated_expr.is_commutative.<locals>.<genexpr>)sympy.core.logicr   args)selfr   r   r   r   r   7   s   z$rubi_unevaluated_expr.is_commutativeN)__name__
__module____qualname____doc__propertyr   r   r   r   r   r   2   s    r   c                   @   r   )rubi_expa  
    SymPy's exp is not identified as `Pow`. So it is not matched with `Pow`.
    Like `a = exp(2)` is not identified as `Pow(E, 2)`. Rubi rules need it.
    So, another exp has been created only for rubi module.

    Examples
    ========

    >>> from sympy import Pow, exp as sym_exp
    >>> isinstance(sym_exp(2), Pow)
    False
    >>> from sympy.integrals.rubi.utility_function import rubi_exp
    >>> isinstance(rubi_exp(2), Pow)
    True

    c                 G   s   t t|d S Nr   )r   _Eclsr   r   r   r   evalP      zrubi_exp.evalNr   r   r   r   classmethodr   r   r   r   r   r   ?   s    r   c                   @   r   )rubi_logaY  
    For rule matching different `exp` has been used. So for proper results,
    `log` is modified little only for case when it encounters rubi's `exp`.
    For other cases it is same.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import rubi_exp, rubi_log
    >>> a = rubi_exp(2)
    >>> rubi_log(a)
    2

    c                 G   s*   |d  trt|d  S t|d S r   )hasr   sym_logdoitr   r   r   r   r   c   s   zrubi_log.evalNr   r   r   r   r   r   T   s    r   )Arity	OperationCustomConstraintPatternReplacementRuleManyToOneReplacerWC)is_matchreplace_allc                   @   s   e Zd Zd ZejZdZdZdS )UtilityOperatorFTN)	r   r   r   namer   variadicaritycommutativeassociativer   r   r   r   r   o   s
    r   c                 C      g | ]}t |qS r   r   r   ir   r   r   
<listcomp>y       r   ABCFGabcdefghijklmnpqrtuvswxzz	a b c d ec                 C   s"   t | } | tr| tt} | S )a  
    This function converts back rubi's `exp` to general SymPy's `exp`.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import rubi_exp, replace_pow_exp
    >>> expr = rubi_exp(5)
    >>> expr
    E**5
    >>> replace_pow_exp(expr)
    exp(5)

    )r   r   r   replacer   zr   r   r   replace_pow_exp   s   
r   c                 C   s   t | } | S r   )r}   exprr   r   r   Simplify      r   c                 C      | |iS r   r   )r   valuer   r   r   Set      r   c                 C   s`   t | trt|  d }||| | i}|S | D ]}t| d }|||| i}q|S r   )
isinstancedictlistkeysxreplace)subsr   kr   r   r   r   With   s   
r   c                 C   
   t | |S r   )r   )r   r   r   r   r   Module      
r   c                 c   s    |D ]}| |V  qd S r   r   )fr   r   r   r   r   Scan   s   r   Nc                 C   sF   |r|D ]}| ||dkr dS qdS |D ]}| |dkr  dS qdS NFTr   )r   lxr   r   r   r   MapAnd   s   r   c                 C   s&   t | ttfrtt|   S | dkS NF)r   r   r   FalseQr   valuesur   r   r   r      s   r   c                  G   sR   t | dkr t| d trtdd | d D S t| d dkS tdd | D S )N   r   c                 s       | ]}t |V  qd S r   ZeroQr   r   r   r   r          zZeroQ.<locals>.<genexpr>c                 s   r   r   r   r   r   r   r   r      r   )lenr   r   r   allr   r   r   r   r      s
   r   c                 C   s   | t dkrdS dS Nr   TFr   r   r   r   r   OneQ   s   r   c                 C   s4   t | } | ttfv rdS | jr| dk }|js|S dS NFr   r   r   r   is_comparableis_Relational)r   resr   r   r   	NegativeQ      r   c                 C   s   t | dkS r   r   r   r   r   r   NonzeroQ      r   c                    s6   t | trt fdd| D  S t| } |   S )Nc                 3   s    | ]
}t | V  qd S r   )r   r   )r   r   varr   r   r          zFreeQ.<locals>.<genexpr>)r   r   anyr   r   nodesr   r   r   r   FreeQ   s   
r   c                 C      dS )z Note that in rubi 4.10.8 this function was not defined in `Integration Utility Functions.m`,
    but was used in rules. So explicitly its returning `False`
    Fr   r   r   r   r   NFreeQ   s   r   c                  G      t | S r   )r   r   r   r   r   List   r   r   c                 C   s4   t | } | ttfv rdS | jr| dk}|js|S dS r   r   )r   r   r   r   r   	PositiveQ   r   r   c                  G      t dd | D S )Nc                 s       | ]
}|j o
t|V  qd S r   )
is_Integerr   r   r   r   r   r   r      r   z#PositiveIntegerQ.<locals>.<genexpr>r   r   r   r   r   PositiveIntegerQ      r  c                  G   r   )Nc                 s   r   r   )r   r   r  r   r   r   r      r   z#NegativeIntegerQ.<locals>.<genexpr>r  r  r   r   r   NegativeIntegerQ   r  r  c                 C   s    t | } t| ttfrdS | jS NT)r   r   intr   r   r   r   r   r   IntegerQ   s   r	  c                  G   r   )Nc                 s   r   r   r	  r   r   r   r   r     r   zIntegersQ.<locals>.<genexpr>r  r   r   r   r   	IntegersQ  r  r  c                 C   s&   t t| }t|ttfr|dkS dS Nr   F)r   r%   r   r   r   )r   r   r   r   r   _ComplexNumberQ  s   r  c                  G   r   )aJ  
    ComplexNumberQ(m, n,...) returns True if m, n, ... are all explicit complex numbers, else it returns False.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import ComplexNumberQ
    >>> from sympy import I
    >>> ComplexNumberQ(1 + I*2, I)
    True
    >>> ComplexNumberQ(2, I)
    False

    c                 s   r   r   )r  r   r   r   r   r     r   z!ComplexNumberQ.<locals>.<genexpr>r  r   r   r   r   ComplexNumberQ  s   r  c                  G   r   )Nc                 s   s$    | ]}t |ot|d kV  qdS r   N)r  r&   r   r   r   r   r   !  s   " z%PureComplexNumberQ.<locals>.<genexpr>r  r   r   r   r   PureComplexNumberQ   r  r  c                 C      | j S r   is_realr   r   r   r   RealNumericQ#     r  c                 C   s   | j o| dkS r   r  r   r   r   r   PositiveOrZeroQ&     r  c                 C   s   | j o| dkS r   r  r   r   r   r   NegativeOrZeroQ)  r  r  c                 C   s   t | pt| S r   )	FractionQr   r   r   r   r   FractionOrNegativeQ,     r  c                 C      t t| o	t| S r   )NotPosQr   r   r   r   r   NegQ/     r  c                 C   s   | |kS r   r   r   br   r   r   Equal3  r   r#  c                 C      | |kS r   r   r!  r   r   r   Unequal6  r   r%  c                 C   st   t | rtt| rt| tt|  S dS t| r| S t| r$t| S t| r8d}| jD ]}|t|7 }q-|S dS r   )	ProductQr	  FirstIntPartRestr  IntegerPartSumQr   r   r   r   r   r   r   r(  9  s   

r(  c                 C   sp   t | rtt| rt| tt|  S t| rdS t| r"t| S t| r6d}| jD ]}|t|7 }q+|S | S r   )	r&  r	  r'  FracPartr)  r  FractionalPartr+  r   r,  r   r   r   r-  I  s   
r-  c                  G   r   )Nc                 s   r   r   is_Rationalr  r   r   r   r   \  r   zRationalQ.<locals>.<genexpr>r  )r   r   r   r   	RationalQ[  r  r1  c                 C   
   t | jS r   )r   is_Mulr   r   r   r   r&  ^  r   r&  c                 C   r  r   )is_Addr   r   r   r   r+  a  r  r+  c                 C   s
   t |  S r   )r+  r   r   r   r   NonsumQd  r   r5  c                 C   s<   d | ||fv r	d S |  tdr| tdt} | ||S )N	Integrate)r   r   r   rd   r   )r   r   yr   r   r   Substg  s
   r8  c                 C   sL   t | tr	| d S t | tr| S t| st| r!t| j}|d S | jd S )z
    Gives the first element if it exists, or d otherwise.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import First
    >>> from sympy.abc import a, b, c
    >>> First(a + b + c)
    a
    >>> First(a*b*c)
    a

    r   )r   r   r   r+  r&  Sortr   )r   dr   r   r   r   r'  p  s   



r'  c                 C   sL   t | tr| dd S t| st| r!t| j}| j|dd  S | jd S )z
    Gives rest of the elements if it exists

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import Rest
    >>> from sympy.abc import a, b, c
    >>> Rest(a + b + c)
    b + c
    >>> Rest(a*b*c)
    b*c

    r   N)r   r   r+  r&  r9  r   func)r   r   r   r   r   r)    s   


r)  c                 C   sj   t | r | j}| j}t|rt|pt|tdd  ot|S | jr-tdd | j	D S t| p4| t
kS )Nr      c                 s   r   r   )SqrtNumberQr   r   r   r   r     r   zSqrtNumberQ.<locals>.<genexpr>)PowerQbaser)   r	  r=  r   r1  r3  r   r   r   )r   mnr   r   r   r=    s   ,r=  c                 C   s@   t | rtt| rtt| pt| ott| ott| S r   )r+  r=  r'  r)  r&  SqrtNumberSumQr   r   r   r   rB       @rB  c                    sH   t | trt fdd| D S |  r"tt|   ddkr"dS dS )a@  
    LinearQ(expr, x) returns True iff u is a polynomial of degree 1.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import LinearQ
    >>> from sympy.abc import x, y, a
    >>> LinearQ(a, x)
    False
    >>> LinearQ(3*x + y**2, x)
    True
    >>> LinearQ(3*x + y**2, y)
    False

    c                 3       | ]}t | V  qd S r   )LinearQr   r   r   r   r         zLinearQ.<locals>.<genexpr>genr   TF)r   r   r   is_polynomialru   rt   r   r   r   rF  r   rE    s   

rE  c                 C   r   r   )r<   r   r   r   r   Sqrt  r   rL  c                 C   r   r   )r,   r   r   r   r   ArcCosh  r   rM  c                   @      e Zd Zdd ZdS )Util_Coefficientc                 C   sp   t | jdkr
d}nt| jd }t|r6t| jd }t|ttfr,|| jd |S || jd | S | S Nr<  r   r   )	r   r   r   NumericQr   r   r  r   coeff)r   rA  r   r   r   r   r     s   zUtil_Coefficient.doitNr   r   r   r   r   r   r   r   rO        rO  r   c                 C   s\   t |r(| dks|ttfv rdS t| } t|ttfr!| ||S | || S t| ||S )a  
    Coefficient(expr, var) gives the coefficient of form in the polynomial expr.
    Coefficient(expr, var, n) gives the coefficient of var**n in expr.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import Coefficient
    >>> from sympy.abc import x, a, b, c
    >>> Coefficient(7 + 2*x + 4*x**3, x, 1)
    2
    >>> Coefficient(a + b*x + c*x**3, x, 0)
    a
    >>> Coefficient(a + b*x + c*x**3, x, 4)
    0
    >>> Coefficient(b*x + c*x**3, x, 3)
    c

    r   )	rQ  r   r   r   r   r  r   rR  rO  )r   r   rA  r   r   r   Coefficient  s   rU  c                 C   sz   t | } t| tr.t| jtr-| jdkrtt| j| jS | jdk r-tt| jd| j S n	t| tr7t	| } t
| d S Nr   r   )r   r   r   r)   r   Denominatorr?  	Numeratorr   rn   r|   r   r   r   r   rX       



rX  c                 C   s   t | |g|g|S r   r_   )r   r"  cr   r   r   r   Hypergeometric2F1	  r  r]  c                 C   s    t | tr|  S | jrd} |  S r   )r   boolr   r   r   r   r   r    s
   
r  c                 C   r   r   )r9   r   r   r   r   r.    r   r.  c                 C   r   r   r8   r   r   r   r   r*    r   r*  c                 C   s   t | |||||S r   )r^   )r   b1b2r\  r   r7  r   r   r   AppellF1  r  rb  c                  G      t |  S r   )rL   r  r   r   r   
EllipticPi  r   rd  c                  G   rc  r   )rK   r  r   r   r   	EllipticE   r   re  c                 C   r   r   )rJ   )Phir@  r   r   r   	EllipticF#  r   rg  c                 C   s   |d u rt | S t| |S r   )r=   rC   r!  r   r   r   ArcTan&  s   
rh  c                 C   r   r   )r@   r   r   r   r   ArcCot,  r   ri  c                 C   r   r   )r/   r   r   r   r   ArcCoth/  r   rj  c                 C   r   r   )r.   r   r   r   r   ArcTanh2  r   rk  c                 C   r   r   )r?   r   r   r   r   ArcSin5  r   rl  c                 C   r   r   )r-   r   r   r   r   ArcSinh8  r   rm  c                 C   r   r   )rA   r   r   r   r   ArcCos;  r   rn  c                 C   r   r   )r>   r   r   r   r   ArcCsc>  r   ro  c                 C   r   r   )rB   r   r   r   r   ArcSecA  r   rp  c                 C   r   r   )r0   r   r   r   r   ArcCschD  r   rq  c                 C   r   r   )r1   r   r   r   r   ArcSechG  r   rr  c                 C   r   r   )r3   r   r   r   r   SinhJ  r   rs  c                 C   r   r   )r4   r   r   r   r   TanhM  r   rt  c                 C   r   r   )r2   r   r   r   r   CoshP  r   ru  c                 C   r   r   )r6   r   r   r   r   SechS  r   rv  c                 C   r   r   )r7   r   r   r   r   CschV  r   rw  c                 C   r   r   )r5   r   r   r   r   CothY  r   rx  c               
   G   sV   t dt| d D ]}z| | | |d  krW  dS W q	 ttfy(   Y  dS w dS Nr   r   FTranger   
IndexErrorNotImplementedErrorr   r   r   r   r   	LessEqual\     r  c               
   G   sV   t dt| d D ]}z| | | |d  krW  dS W q	 ttfy(   Y  dS w dS ry  rz  r~  r   r   r   Lesse  r  r  c               
   G   sV   t dt| d D ]}z| | | |d  krW  dS W q	 ttfy(   Y  dS w dS ry  rz  r~  r   r   r   Greatern  r  r  c               
   G   sV   t dt| d D ]}z| | | |d  k rW  dS W q	 ttfy(   Y  dS w dS ry  rz  r~  r   r   r   GreaterEqualw  r  r  c                  G   s$   t dd | D ot dd | D S )a5  
    FractionQ(m, n,...) returns True if m, n, ... are all explicit fractions, else it returns False.

    Examples
    ========

    >>> from sympy import S
    >>> from sympy.integrals.rubi.utility_function import FractionQ
    >>> FractionQ(S('3'))
    False
    >>> FractionQ(S('3')/S('2'))
    True

    c                 s   r   r   r/  r   r   r   r   r     r   zFractionQ.<locals>.<genexpr>c                 s   s     | ]}t |td kV  qdS r   N)rX  r   r   r   r   r   r     s    r  r  r   r   r   r    s   $r  c                 C   s   t |pAt |pAttd| td| pAttd| td| pAttd| td| pAttd| td| pAt || S )N      r<     )r	  r  r   )r   r"  r\  r:  r@  rA  r   r   r   r   IntLinearcQ  s   r  c                 C      |   S r   )r   r   r   r   r   Expand  r   r  c                 C   r   )a&  
    If u is free from x IndependentQ(u, x) returns True else False.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import IndependentQ
    >>> from sympy.abc import x, a, b
    >>> IndependentQ(a + b*x, x)
    False
    >>> IndependentQ(a + b, x)
    True

    r   r   r   r   r   r   IndependentQ  s   
r  c                 C   s   | j pt| S r   )is_PowExpQr   r   r   r   r>    r  r>  c                 C   .   t | trt| jd S t| ot| jd S Nr   r   )r   sym_expr	  r   r>  r   r   r   r   IntegerPowerQ     
r  c                 C   sJ   t | trt| jd ot| jd S t| o$t| jd o$t| jd S r  )r   r  r	  r   r   r>  r   r   r   r   PositiveIntegerPowerQ  s   
$r  c                 C   r  r  )r   r  r  r   r>  r   r   r   r   FractionalPowerQ  r  r  c                 C   s0   t | } t| trdS | d ddtfv rdS | jS r   )r!   r   r   r   is_Atomr   r   r   r   AtomQ  s   
r  c                 C   s   t | } t| ttfv S r   )r   Headr  r   r   r   r   r   r    s   r  c                 C   s   | j ttfv S r   )r;  r   Logr   r   r   r   LogQ  r  r  c                 C   r  r   )r;  r   r   r   r   r    r  r  c                 C   s   t | tr	|| v S || jv S r   )r   r   r   )r   r   r   r   r   MemberQ  s   

r  c                 C   ,   t | r| }nt| }tttttttg|S r   )	r  r  r  rD   rE   rF   rG   rI   rH   r  r   r   r   TrigQ     r  c                 C      t | tkS r   )r  rD   r   r   r   r   SinQ  r   r  c                 C   r  r   )r  rE   r   r   r   r   CosQ  r   r  c                 C   r  r   )r  rF   r   r   r   r   TanQ  r   r  c                 C   r  r   )r  rG   r   r   r   r   CotQ  r   r  c                 C   r  r   )r  rI   r   r   r   r   SecQ  r   r  c                 C   r  r   )r  rH   r   r   r   r   CscQ  r   r  c                 C   r   r   )rD   r   r   r   r   Sin  r   r  c                 C   r   r   )rE   r   r   r   r   Cos  r   r  c                 C   r   r   )rF   r   r   r   r   Tan  r   r  c                 C   r   r   )rG   r   r   r   r   Cot  r   r  c                 C   r   r   )rI   r   r   r   r   Sec  r   r  c                 C   r   r   )rH   r   r   r   r   Csc   r   r  c                 C   r  r   )	r  r  r  r3   r2   r4   r5   r6   r7   r  r   r   r   HyperbolicQ  r  r  c                 C   r  r   )r  r3   r   r   r   r   SinhQ
  r   r  c                 C   r  r   )r  r2   r   r   r   r   CoshQ  r   r  c                 C   r  r   )r  r4   r   r   r   r   TanhQ  r   r  c                 C   r  r   )r  r5   r   r   r   r   CothQ  r   r  c                 C   r  r   )r  r6   r   r   r   r   SechQ  r   r  c                 C   r  r   )r  r7   r   r   r   r   CschQ  r   r  c                 C   r  r   )	r  r  r  r?   rA   r=   r@   rB   r>   r  r   r   r   InverseTrigQ  r  r  c                 C      t ttttgt| S r   )r  rD   rE   rI   rH   r  r   r   r   r   SinCosQ#     r  c                 C   r  r   )r  r3   r2   r6   r7   r  r  r   r   r   	SinhCoshQ&  r  r  c                 C   s   t tt| S r   )r   r   r"   r   r   r   r   	LeafCount)  r  r  c                 C   sz   t | } t| tr.t| jtr-| jdkrtt| j| jS | jdk r-tt| jd| j S n	t| tr7t	| } t
| d S )Nr   rW  )r   r   r   r)   r   rY  r?  rX  r   rn   r|   r   r   r   r   rY  ,  rZ  rY  c                 C   s   t | ttfr	dS | jS r  )r   r  float	is_numberr   r   r   r   NumberQ8  s   r  c                 C   r2  r   )r	   r  r   r   r   r   rQ  =  r   rQ  c                 C   s   t | tr	t| S t| jS )a2  
    Returns number of elements in the expression just as SymPy's len.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import Length
    >>> from sympy.abc import x, a, b
    >>> from sympy import cos, sin
    >>> Length(a + b)
    2
    >>> Length(sin(a)*cos(a))
    2

    )r   r   r   r   r   r   r   r   Length@  s   

r  c                 C   
   t | tS r   r   r   r   r   r   r   ListQT  r   r  c                 C      t | } t|  S r   )r   r%   r   r   r   r   r   ImW     r  c                 C   r  r   )r   r&   r   r   r   r   r   Re[  r  r  c                 C   s"   | j st| } | ttttttfv S r   )r  r  r,   r-   r.   r/   r0   r   r   r   r   InverseHyperbolicQ_  s   r  c                 C   s.   t | pt| rt| dkpt| p| jtkS Nr   )r  r  r  r  r;  ra   r   r   r   r   InverseFunctionQd  s   .r  c                 C   sN   t | rdS t| t| B t| B rt| |S | jD ]
}t||s$ dS qdS NTF)r  r  r  	CalculusQr   r   TrigHyperbolicFreeQr   r   r   r   r   r   r  h  s   


r  c                 C   sR   t | rdS t| st| s| jttfv rt| |S | jD ]	}t|s& dS qdS r  )	r  r  r  r;  r_   r^   r   r   ElementaryFunctionQr  r   r   r   InverseFunctionFreeQu  s   

r  c              
   C   s   t | r	tt| S t| rttt| S t| r/| j} | j	}t| t|@ t
|t| B @ S | jr<tdd | jD S | jrItdd | jD S | jr{| j}| jd } |tttttttttf	v ret| S |ttfv rqtd| dS |tkryt| S dS dS )Nc                 s   r   r   RealQr   r   r   r   r     r   zRealQ.<locals>.<genexpr>c                 s   r   r   r  r   r   r   r   r     r   r   rW  r   F)r  r   r  rQ  r   r  r	   r>  r?  r)   r	  r  r3  r   r   r4  is_Functionr;  rD   rE   rF   rG   rI   rH   r=   r@   rM   r?   rA   r  r   )r   vr   r   r   r   r    s.   
 
r  c                 C   s   t | | S r   r   r   r  r   r   r   EqQ  r   r  c                 C   s   t | rdS t| rdS d S r  )r  r  r   r   r   r   FractionalPowerFreeQ  s
   r  c                 C   s   t | rtt| rdS dS r  )r  r  r  r   r   r   r   ComplexFreeQ  s   r  c                    sV  |d u r   S t|trt|jtrnt |j}  |rl||j dkr'dS zt |j}W n
 ty9   Y dS w |	 }|d d|j }||d g7 }|D ]}|dks^|
|}d||< qOtdd |D rjdS dS dS t|jttfrtt |jrt |jdkrt fdd|jjD sdS t|trt fdd|jD S   |S )	Nr   FrW  c                 s       | ]}|d kV  qdS r  r   r   r   r   r   r     r   zPolynomialQ.<locals>.<genexpr>Tc                 3       | ]}t  |V  qd S r   r  r   r   r   r   r     rG  c                 3   r  r   )PolynomialQr   r   r   r   r     rG  )rJ  r   r   r)   r   ru   r?  rt   rk   
all_coeffsindexr   r   r   r   r}   Exponentfree_symbolsr   r   )r   r   degpc_list
coeff_listr   r  r   r   r   r    s@   


 

r  c                 C   r   r   )rr   r   r   r   r   FactorSquareFree  r   r  c                 C   s   t d}t d}t d}t d}| || }t|| |rOt|| |rOt|| rHt|| || }t|| |rFt|| |rFdS dS t|| |S dS )Nr   wr@  rA  TF)r   matchr  r   r	  r  rE  )r   r   r   r  r@  rA  Matcher   r   r   PowerOfLinearQ  s   r  c                 C   sX   t t| } t| js| |sdS t| |r*t|tr$tt| ||S t| |dS dS )Nr   rH  )	r  r   r  r   r  r   r   ru   rt   rK  r   r   r   r    s   

r  c                 C   s   t t| } t| js| |sdgS | jrXt| |} g }d}| jD ]/}||rDt|tr:|t	t
|||g7 }q"|t	||dg7 }q"|dkrQ|dg7 }|d7 }q"|  |S t|trft	t
| ||gS t	| |dgS )Nr   r   rH  )r  r   r  r   r4  r{   r   r   r   ru   rt   sort)r   r   lstr   tr   r   r   ExponentList  s*   





r  c                 C   s   t | r(| D ]}tt||do tt||ddkot||ddkr% dS qdS t| |do?tt| |ddko>t| |ddkS )Nr<  r   r   FT)r  r  PolyQrU  )r   r   r   r   r   r   
QuadraticQ  s   40r  c                 C   sT   t | |o)t ||o)t| | o)tt| |dt||d t| |dt||d  S r  )rE  r   r   rU  r   r  r   r   r   r   LinearPairQ  s   Tr  c                 C   s  t | |rIt| |dkrGt| |}t|dkr&dt| |t| |t| |gS t|dkrE|d dkrEt| |dt| |t| |t| |gS dS dS t| r`| j|kr^t| j|r^dd| jgS dS t	| r>tt
| |rtt| |}t|rydS t
| |d  t
| |d  |d gS tt| |rtt
| |}t|rdS t| |d  t| |d  |d gS tt
| |}t|rdS tt| |}t|rdS |d }|d }|d }|d }|d }	|d }
t|r	t|rd||	 ||
 gS t||
 r||	 || |gS dS t|r t||
 r||	 ||	 |
gS dS t||
r<t||	 ||  r<|| ||	 d| gS dS t| rtt
| |rhtt| |}t|rYdS t
| |d  |d |d gS tt| |rtt
| |}t|r~dS t| |d  |d |d gS tt
| |}t|rdS tt| |}t|rdS t|d |d r|d |d  |d |d  |d gS dS dS )Nr   r   r<  F)r  r  r  r   rU  r>  r?  r   r)   r&  r'  BinomialPartsr)  r  r   r  r+  )r   r   r  lst2lst1r   r"  r@  r\  r:  rA  r   r   r   r    s   

&
&&

"




&r  c                 C   s  t | } t| |r(t| |}t|dk s&tt t|s&tt|d d r(dS t| r\t| jdrZt	| j
|}|r@t|d rBdS |d d d|d  |d  |d d |d gS dS t| r
tt| |rtt| |}|ssdS t| |d  t| |d  t| |d  |d gS tt| |rtt| |}|sdS t| |d  t| |d  t| |d  |d gS t	t| |}|sdS t	t| |}|sdS |d }|d }|d }|d }|d }	|d }
t||
rt||	 ||  r|| ||	 ||  ||	 |gS dS t| rtt| |r5tt| |}|s#dS t| |d  |d |d |d gS tt| |r[tt| |}|sIdS t| |d  |d |d |d gS tt| |}|st	t| |}|sqdS tt| |}|st	t| |}|sdS t|d d|d  r|d |d  |d |d |d gS t|d d|d  r|d |d  |d |d |d gS dS t|d |d rt|d |d  r|d |d  |d |d  |d |d gS t|d d|d  rt|d |d  r|d |d  |d |d |d  |d gS dS tt| |}t|rt	t| |}|s7dS t|d |d rbt|d |d  rb|d |d  |d |d  |d |d gS t|d d|d  rt|d |d  r|d |d  |d |d |d  |d gS dS t|d |d rt|d |d  rt|d |d  r|d |d  |d |d  |d |d  |d gS dS dS )Nr  r   r<  Fr   )r!   r  CoefficientListr   EvenQr   r>  r  r)   r  r?  r&  r   r'  TrinomialPartsr)  r   r+  r  )r   r   r  r  r  r   r"  r@  r\  r:  rA  lst3lst4r   r   r   r  r  s   

00
44" 
$$$$*,.,
*,.,@4r  c                    s   t | rt fdd| D S |d u r]|  krdS t trQ j} j}t||rQt|r>t| |o=t	|  p=t	t
|  S t|rOt	|  oNtt|  |S dS t	|  p\t	| t
 S t	|  opt|  |dkopt|  |kS )Nc                 3   rD  r   )r  r   rF  r   r   r     rG  zPolyQ.<locals>.<genexpr>Fr   )r  r   r   r   r)   r?  r   r  r  r  Togetherr  r  rU  r  )r   r   rA  x_baser   rF  r   r    s    

"(r  c                 C      t | ttfo| d dkS )Nr<  r   r   r   r  r   r   r   r   r    s   r  c                 C   r  )Nr<  r   r  r   r   r   r   OddQ  s   r  c                 C   sx   t | rt| dot t| S t| rt| jS t| r(tt| o'tt	| S t
| r:t| }t|r8t|S dS dS r  )r1  r  rL  r>  r  r)   r&  PerfectSquareQr'  r)  r+  r   r5  r   sr   r   r   r    s   
r  c                 C   sf   t | r| dkS t| rt| jS t| r!tt| o tt| S t| r1t	| }t
|o0t|S dS r  )r1  r>  r  r)   r&  NiceSqrtAuxQr'  r)  r+  r   r5  r  r   r   r   r   
  s   
r   c                 C   r  r   )r  r   r   r   r   r   r   	NiceSqrtQ  r   r  c                 C   r   r   rn   r   r   r   r   r    r   r  c                 C   s   t | r| dkS t| rtt| rt| dkS t| dkS t| r8t| }tt|r2t|dkS t|dkS t| rHt| j	rFt
| jS dS t| r_t
t| rXt
t| S t
t|  S t| rit
t| S | dk}|dv rs|S dS )Nr   T)TF)r1  r  r   r  r  rQ  r	   r>  r  r)   PosAuxr?  r&  r'  r)  r+  )r   r  r   r   r   r   r    s2   

r  c                 C      t t| S r   )r  TogetherSimplifyr   r   r   r   r  =     r  c                 C   s$   t | |rttt| | S g S r   )r  r   reversedrt   r  r  r   r   r   r  A  s   
r  c                 C   s6   t |tri }|D ]}|| q	| |S | |S r   )r   r   updater   )r   r   n_argsr   r   r   r   
ReplaceAllG  s   


r
  c                    s   t ||g rIt| rItt|  | | i } fdd|D }d}tdt|d D ]}|t| ||d   ||   |d    }q.|S ||  S )Nc                       g | ]}t | qS r   SimplifyTermr   rF  r   r   r   S      z'ExpandLinearProduct.<locals>.<listcomp>r   r   )r   r  r  r
  r{  r   r   )r  r   r   r"  r   r  r   r   r   rF  r   ExpandLinearProductO  s   .r  c                  G   s>   t | } t| dkrt| d ttfr| d S t dS t|  S Nr   r   )r   r   r   r  r   ro   r  r   r   r   GCDZ  s   r  c                 C   r   r   r   )expnr   r   r   ContentFactorc  r   r  c                 C   s  t | rtt| r| S tt| rt| S tdS t| rAt| jr=t| jr=| jdkr4dt	| j S ddt	| j  S tdS t
| rOtdd | jD  S t| rt| dk rit| }t|retdS t|S tt| }tt| }|dk r|dk rt| |  S t||S tdS )Nr   r   c                 S   r   r   NumericFactorr   r   r   r   r   x  r   z!NumericFactor.<locals>.<listcomp>2   )r  r   r  r  r   r>  r1  r?  r)   rX  r&  r   r   r+  r  r  r  r'  r)  r  )r   r\  r@  rA  r   r   r   r  f  s4   

r  c                 C   s   t | rtt| rtdS tt| rtS | S t| r.t| jr,t	| j
r,| t|  S | S t| rBd}| jD ]}|t|9 }q7|S t| rnt| dk rZt| }t|rV| S t|S t| }d}| jD ]}||| 7 }qc|S | S )Nr   r  r   )r  r   r  r   r  r   r>  r1  r?  r  r)   r  r&  r   NonnumericFactorsr+  r  r  )r   resultr   rA  r   r   r   r    s6   

r  c                 C   s   |d u rg }t | } t |}t| r|S t| rt| j||S t| s't| r5tt| |tt| ||S t	| |rrg }|D ](}t
|rQ|j| krP||  nq>t|jdkrf|jd | krf||  nq>|g krp||  |S |S r  )r   r  r  MakeAssocListr?  r&  r+  r)  r'  r   r>  r)   appendr   r   r   r   alsttmpr   r   r   r   r    s6   




r  c                    s    d u rg  t | } t t| r| S t| r"t| j | j S t| s*t| r8| j fdd| j	D  S t
| rvg } D ](}t|rT|j| krS||  nqAt|j	dkri|j	d | kri||  nqA|g krp| S |d d S | S )Nc                       g | ]}t | qS r   )GensymSubstr   r  r   r   r   r         zGensymSubst.<locals>.<listcomp>r   r   )r   r  r  r  r?  r)   r&  r+  r;  r   r   r>  r  r   r  r   r   r   r    s6   



r  c                    s   t | r1g } D ]}|jd | kr||  nq|g kr| S t|d jdkr/|d jd S | S t| rLt| j }| jdk rGt|rGdS || j S t	| sTt
| rb| j fdd| jD  S | S )Nr   r   Indeterminatec                    r  r   )KernelSubstr   r   r   r   r     r!  zKernelSubst.<locals>.<listcomp>)r  r   r  r   r  r#  r?  r)   r   r&  r+  r;  r  r   r   r   r#    s(   
	
r#  c                    s   t | |rtt| |rt| |}ntd}t|rt||S t| |}t|r-t||S tt| |||}t|rOt	| | t|j
 fdd|jD  |S t| }t|r\t||S t| }t|rit||S t| |S )Nr   c                       g | ]}|  qS r   r   r   r  r   r   r     r   z$ExpandExpression.<locals>.<listcomp>)AlgebraicFunctionQr  RationalFunctionQExpandAlgebraicFunctionr   r+  ExpandCleanup
SmartApartRationalFunctionFactorsNonrationalFunctionFactorsr;  r   r  r  r   r   r  r   r%  r   ExpandExpression  s&   



 


r.  c                 C   s   t | |r
t| |S | S r   )r'  ri   r  r   r   r   Apart  s   

r/  c                  G   s   t | dkr$| \}}t||}ttt||||||}|dkr"|S |S | \}}}t||}ttt||||||}|dkrA|S |S )Nr<  r"  )r   r  r#  r/  r  )r   r   r   r  r  r  r   r   r   r*    s   


r*  c                    s(   |  |  rt fdd|D S d S )Nc                 3       | ]} | V  qd S r   r   r   r  r   r   r   '  r   zMatchQ.<locals>.<genexpr>)r  tuple)r   patternr   r   r1  r   MatchQ#  s   
r4  c                 C   s   t | ||t| ||gS r   )PolynomialQuotientPolynomialRemainderr  qr   r   r   r   PolynomialQuotientRemainder+     r9  c                 C   D   t | rd}| jD ]}t||r||9 }q	|S t| |r| S tdS r  )r&  r   r   r   r   r   r  r   r   r   r   FreeFactors.  s   


r=  c                 C   @   t | rd}| jD ]}t||s||9 }q	|S t| |rdS | S )aA  
    Returns the product of the factors of u not free of x.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import NonfreeFactors
    >>> from sympy.abc import x, a, b
    >>> NonfreeFactors(a, x)
    1
    >>> NonfreeFactors(x + a, x)
    a + x
    >>> NonfreeFactors(a*b*x, x)
    x

    r   )r&  r   r   r<  r   r   r   NonfreeFactors;     


r?  c                 C   s   t t| |S r   )RemoveContentAux_replacerr   r   rK  r   r   r   RemoveContentAuxW  r  rB  c                 C   s<   t | |}t|}tt||drt||S tt |||S r  )r?  r  r  r=  rB  r   r   r  r  r   r   r   RemoveContentZ  s
   

rD  c                 C   s@   t | rd}| jD ]}t||r||7 }q	|S t| |r| S dS )a  
    Returns the sum of the terms of u free of x.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import FreeTerms
    >>> from sympy.abc import x, a, b
    >>> FreeTerms(a, x)
    a
    >>> FreeTerms(x*a, x)
    0
    >>> FreeTerms(a*x + b, x)
    b

    r   )r+  r   r   r<  r   r   r   	FreeTermsd  r@  rE  c                 C   sH   t | rtd}| jD ]}t||s||7 }q|S t| |s | S tdS r   )r+  r   r   r   r<  r   r   r   NonfreeTerms  s   


rF  c                    sH  t | rtd|gd}td|gd}td}|| }| |  r\||g}t|t kr\t fdd|D \}}t|rC||}}t||s\t|r\d}	|jD ]}
|	|
| 7 }	qQ|	S || | }| |  r|||g}t|t krt fdd|D \}}}t|rt|rt	|| }d}	|jD ]}
|	|
| 7 }	q|	S | S )	Nr   excluderA  r  c                       g | ]} | qS r   r   r   r1  r   r   r     r   z+ExpandAlgebraicFunction.<locals>.<listcomp>r   c                    rI  r   r   r   r1  r   r   r     r   )
r&  r   r  r   r2  r+  r   r   r  r  )r   r   u_n_v_r3  r   r   r  r  r   rA  r  r   r1  r   r(    s<   





r(  c                    s  t | rtd}td|gd}td|gd}td|gd}td|gd}td|gd}td|gd}|||||    ||||    }	| |	  rz||||||||g}
t fd	d
|
D \}}}}}}}t|| ||  t|| ||  @ rt||| ||  || || |d     |W S t|| ||  t|| ||  @ rt||| ||  | || || |d     |W S W | S    Y | S | S )Nr   r   rG  r"  r\  r:  r  r   c                    rI  r   r   r   r1  r   r   r     r   z&CollectReciprocals.<locals>.<listcomp>r<  )r+  r   r  r2  r   CollectReciprocals)r   r   rJ  a_b_c_d_e_f_r3  r   r   r   r"  r\  r:  r  r   r   r1  r   rM    s.   $
$(4(8rM  c                 C   sN   t | |}t|r%d}|jD ]	}|t||7 }q|}t|r#t||S |S |S r   )rM  r+  r   r  UnifySum)r   r   r  r   r   r   r   r   r)    s   


r)  Fc                 C   s   t | r| g kr
dS tt| ||rtt| ||S dS t| s%t| |r'dS t| rAt| j|t| j|@ B r?t| j	||S dS t
| t| B rZ| jD ]}t|||sW dS qLdS dS r  )r  r&  r'  r)  r  r   r>  r1  r)   r?  r&  r+  r   )r   r   flagr   r   r   r   r&    s&   
r&  c                 C   sL   |dkrt t| ||S t | ||}t t| ||}t|| dkr$|S |S r  )rU  r  r   )r   formrA  coef1coef2r   r   r   Coeff  s   rY  c                 C      t | rt| S | S r   )r+  r'  r   r   r   r   LeadTerm     r[  c                 C   rZ  r   )r+  r)  r   r   r   r   RemainingTerms  r\  r]  c                 C   sL   t | rt| dkrt| tdkr| S tt| S t| r$tt| S | S r  )r  r  r  r   
LeadFactorr&  r'  r   r   r   r   r^     s   r^  c                 C   s\   t | rt| dkrt| dkrtdS ttt|  S t| r*tt| t|  S tdS r  )	r  r  r  r   r   RemainingFactorsr&  r'  r)  r   r   r   r   r_    s   r_  c                 C      t | }t|r|jS |S )z
    returns the base of the leading factor of u.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import LeadBase
    >>> from sympy.abc import a, b, c
    >>> LeadBase(a**b)
    a
    >>> LeadBase(a**b*c)
    a
    )r^  r>  r?  r  r   r   r   LeadBase  s   ra  c                 C   r`  r   )r^  r>  r)   r  r   r   r   
LeadDegree)  s   rb  c                 C   s:   t | r| jdk rdS t| rtdd | jD  S t| S )Nr   r   c                 S   r   r   )Numerr   r   r   r   r   6  r   zNumer.<locals>.<listcomp>)r>  r)   r&  r   r   rY  r   r   r   r   rc  0  s   
rc  c                 C   sT   t | r| jdk r| jd | jd   S t| S t| r&tdd | jD  S t| S )Nr   r   c                 S   r   r   )Denomr   r   r   r   r   ?  r   zDenom.<locals>.<listcomp>)r>  r)   r   r&  r   rX  r   r   r   r   rd  9  s   
rd  c                 C      t | ||S r   r[  )rA  r:  r   r   r   r   	hypergeomB  r   rf  c                 C      t t| |S r   )r  r  )r   rV  r   r   r   ExponE  r  rh  c                    sd  t d}t d|ddgd}t d|gd}t d|dgd}t d|gd}t d	|dgd}t d
|gd}t d|gd}	||||  |	  ||||  |  |  }
| |
  r||||	|||g}t|t krt fdd|D \}}}}}}}t|| r|||||  |  || |   |||   tju r| S |||||  |  || |   |||   S ||||  |	  |||  |  }
| |
  r0||||	|||g}t|t kr0t fdd|D \}}}}}}}t|r0t|| ||  r0|||  ||  |||  ||   tju r| S |||  ||  |||  ||   S | S )Nr   r  r   r   rG  r   r"  r\  r:  rA  r@  c                    rI  r   r   r   r1  r   r   r   X  r   z"MergeMonomials.<locals>.<listcomp>c                    rI  r   r   r   r1  r   r   r   f  r   )r   r  r   r2  r	  r   NaNr   )r   r   rJ  p_rN  rO  rP  rQ  rK  m_r3  r   r   r   r"  r@  r\  rA  r  r:  r   r1  r   MergeMonomialsH  s:   ,
$60$
$ 0(rl  c           	      C   s  t | ||}t| ||}d}t||D ]}|ttt|||||  |7 }q|}t|}t||}t||}|tt||  }t	t||drK| }d}t||D ]}|ttt|||||  | |7 }qR|}t
||r|||| | t||  S ||| | |  S r   )r5  r6  r  Simpr  rU  r=  r?  r;   r  	BinomialQExpandToSum)	r   r  r   rv   rw   r  r   freemonomialr   r   r   PolynomialDividen  s&   $

(
rr  c                 C   sF   t | r| D ]}tt|||r dS qdS t|rdS t t| |S )aM  
    If u is equivalent to an expression of the form a + b*x**n, BinomialQ(u, x, n) returns True, else it returns False.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import BinomialQ
    >>> from sympy.abc import x
    >>> BinomialQ(x**9, x)
    True
    >>> BinomialQ((1 + x)**3, x)
    False

    FT)r  r  rn  r  r  r   r   rA  r   r   r   r   rn    s   rn  c                 C   s~   t | r| jD ]}tt||r dS qdS d}t| } t| r-| jdkr-t| j|r-d}t t	| |o>tt
| |o>t|S )a  
    If u is equivalent to an expression of the form a + b*x**n + c*x**(2*n) where n, b and c are not 0,
    TrinomialQ(u, x) returns True, else it returns False.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import TrinomialQ
    >>> from sympy.abc import x
    >>> TrinomialQ((7 + 2*x**6 + 3*x**12), x)
    True
    >>> TrinomialQ(x**2, x)
    False

    FTr<  )r  r   r  
TrinomialQr   r>  r)   rn  r?  r  r  )r   r   r   checkr   r   r   rt    s   
$rt  c                    ,   t | rt fdd| D S t t|  S )aq  
    If u is equivalent to an expression of the form a*x**q+b*x**n where n, q and b are not 0,
    GeneralizedBinomialQ(u, x) returns True, else it returns False.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import GeneralizedBinomialQ
    >>> from sympy.abc import a, x, q, b, n
    >>> GeneralizedBinomialQ(a*x**q, x)
    False

    c                 3   rD  r   )GeneralizedBinomialQr   rF  r   r   r     rG  z'GeneralizedBinomialQ.<locals>.<genexpr>)r  r   GeneralizedBinomialPartsr  r   rF  r   rw       rw  c                    rv  )a  
    If u is equivalent to an expression of the form a*x**q+b*x**n+c*x**(2*n-q) where n, q, b and c are not 0,
    GeneralizedTrinomialQ(u, x) returns True, else it returns False.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import GeneralizedTrinomialQ
    >>> from sympy.abc import x
    >>> GeneralizedTrinomialQ(7 + 2*x**6 + 3*x**12, x)
    False

    c                 3   rD  r   )GeneralizedTrinomialQr   rF  r   r   r     rG  z(GeneralizedTrinomialQ.<locals>.<genexpr>)r  r   GeneralizedTrinomialPartsr  r   rF  r   rz    ry  rz  c                 C   s2   t | }ddgg}|d D ]	}|t| q|S r  )rs   r  r   )rq   rr  r   r   r   r   FactorSquareFreeList  s
   
r}  c                 C   s   t | |rBt| }d}d}|d ddgkrt|}|D ]	}t||d }q|dkr@|D ]}||d |d |   }q+t|| S dS dS )Nr   r   F)r  r}  r)  r  r  )r   r   r  ro   r  r   r   r   r   PerfectPowerTest  s   
r~  c                 C   s.   t | |rt| }t|st|r|S dS dS r   )r  r  r>  r&  r-  r   r   r   SquareFreeFactorTest  s   
r  c                 C   sb   t | s	t| |rdS t| rt| j|S t| st| r/| jD ]}tt||r, dS q dS dS r  )	r  r   r  r'  r?  r&  r+  r   r  r  r   r   r   r'    s   
r'  c                 C   r;  r  r&  r   r'  r   r   r   r   r   r   r   r   r+    s   


r+  c                 C   sD   t | rd}| jD ]}t||s||9 }q	|S t| |r tdS | S r  r  r  r   r   r   r,     s   


r,  c                 C   s2   t | trtt| S t| j}| jtt| S r   )r   r   r  r   r;  )r   r   r   r   r   Reverse+  s   

r  c                 C   s  t | |rt| |dgS t| r*t| jr| jt| j| S | j tt| j| S t| rLtt	| |}tt
| |}|d |d  |d |d  gS t| rt| }t|rtt	| |}tt
| |}t|d |d  |d |d  |d |d  gS t||S ddgS )a  
    u is a polynomial or rational function of x.
    RationalFunctionExponents(u, x) returns a list of the exponent of the
    numerator of u and the exponent of the denominator of u.

    Examples
    ========
    >>> from sympy.integrals.rubi.utility_function import RationalFunctionExponents
    >>> from sympy.abc import x, a
    >>> RationalFunctionExponents(x, x)
    [1, 0]
    >>> RationalFunctionExponents(x**(-1), x)
    [0, 1]
    >>> RationalFunctionExponents(x**(-1)*a, x)
    [0, 1]

    r   r   )r  r  r  r   r)   RationalFunctionExponentsr?  r  r&  r'  r)  r+  r  r:   )r   r   r  r  r  r   r   r   r  2  s$   

 2
r  c                 C   s   dd }t |}dd }t |}dd }ttttt  t||}t||}dd }	tttt}
t|
|	}| t	t
} tt| |||g}t|S )	Nc                 S   r   r   r  rA  r   r   r   cons_f1[  r   z'RationalFunctionExpand.<locals>.cons_f1c                 S      t | tsdS t|| S r   )r   r   UnsameQ)r   r  r   r   r   cons_f2_     

z'RationalFunctionExpand.<locals>.cons_f2c                    s8   t ||}tt|t fdd|jD    | S )Nc                    s   g | ]}|   qS r   r   r   rA  r  r   r   r   g  r!  z9RationalFunctionExpand.<locals>.With1.<locals>.<listcomp>)RationalFunctionExpandIfr+  r   r   )rA  r   r   r  r  r   r  r   With1e  s   
.z%RationalFunctionExpand.<locals>.With1c                    s   t | |}dd }t|}ttttdtd ttdtd t t  tt	 tdtd t
  t|}tt| ||}t|| rG|sG|S t t| ||}t| | t|rdt fdd|jD  S |  S )	Nc              	   S   s4   t tt| |||||t||t|t|tdS NrW  )re   r   r   r  r#  r   r   )r   r"  r\  r:  r  r@  rA  r   r   r   r   _consf_um     4z7RationalFunctionExpand.<locals>.With2.<locals>._consf_ur@  r   r:  r"  c                    r$  r   r   r   r%  r   r   r   x  r   z9RationalFunctionExpand.<locals>.With2.<locals>.<listcomp>)ExpandIntegrandr   r   r   x_r   r   rP  rj  rK  rN  r   r  r+  r,  r+  r   r   )r   r   r  r  cons_upatresult_matchqr   r%  r   With2j  s   
R
z%RationalFunctionExpand.<locals>.With2)r   r   r   rJ  rL  rK  r  r   r   r  r   r   r   )r   r   r  cons1r  cons2r  pattern1rule1r  pattern2rule2r   r   r   r   r  X  s   

r  c                    s  t | } |d urF||}}t||}t||}t|r8| t|| g}|jD ]}|t| | | q&|j| S | t|| t| | | S t	dddgd}t	d|gd}t	d|dgd}	t	ddgd}
t	d|gd}t	d	|dgd}t	d
ddgd}|||	|
  |  }| 
|  rtttttg |
 jr|||	|
|g}t t|krt fdd|D \}}}}}|jd 
|||    r||f}t|t krt fdd|D \}}t||r|j}t||||||    | ||||S | tt} tt| |tdd}t |S )Nr   r   r   rG  r   r"  Fr\  r:  rA  c                    rI  r   r   r   r1  r   r   r     r   z#ExpandIntegrand.<locals>.<listcomp>c                    rI  r   r   r   r1  r   r   r     r   )	max_count)r   r  rF  r+  rE  r   r  rl  r;  r   r  r  r?   rA   r-   r,   r   r2  r  r  r   r  r   r   r   ExpandIntegrand_rules)r   r   extrar  r|  r  r   rJ  rN  rO  F_rP  rQ  rK  r3  r   r   r   r"  r  rA  r\  r:  r   r   r1  r   r    sH   





 
(r  c                 C   s|  t | rt |rt| t|kr|dk S t| t|k S dS t |r$dS t| rGt|rEt| t|kr=tt| t|S t| t|k S dS t|rMdS t| dksYt| dkrnt|dkset|dkrntt| t|S t| rt|rt| t|krtt| t|S tt| t|S dS t	| rt	|rt
| |gS dS t	|rdS t| st| tkst| tkrt|st| tkst| tkrt
| |gS dS t|st| tkst| tkrdS t| t|kr t| t|krtt| jD ]}| j| |j| kst| j| |j|   S qdS t| t|k S t| t|k r+dS t|t| k r6dS tt
|| gS )Nr   TF)r	  r'   r  rX  SimplerQrY  r  r  r  r  OrderedQr  r  r&   r%   r  r{  r   r   r  r  )r   r  r   r   r   r   r    sb   0   r  c                 C   s  t |rtt | rdS t | rtt |rdS t| td}t|td}t|r4t|r2||k S dS t|r:dS t|rHt|rF||k S dS t|rNdS t| r`t|r^t|t|k S dS t|rfdS t|t|k rpdS t|t|k rzdS tt|| gS )NTFr<  )	r   r  Rtr   r	  r1  r  r  r  )r   r  sqrtusqrtvr   r   r   SimplerSqrtQ  s:   r  c                 C   sP   t | |r|tdkrdS |tdkr| td k S | | kS tt| t|S )a  
    If u + v is simpler than u, SumSimplerQ(u, v) returns True, else it returns False.
    If for every term w of v there is a term of u equal to n*w where n<-1/2, u + v will be simpler than u.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import SumSimplerQ
    >>> from sympy.abc import x
    >>> from sympy import S
    >>> SumSimplerQ(S(4 + x),S(3 + x**3))
    False

    r   Fr   )r1  r   SumSimplerAuxQr  r  r   r   r   SumSimplerQ	  s   

r  c                 C   s   t | |}|dkr|S |d S NFr<  )r  )r   r   bpr   r   r   BinomialDegree%	  s   
r  c                 C   s   t | |}|r|d S |S )Nr  )r  r   r   r  r   r   r   TrinomialDegree,	  s   
r  c                 C   s   dd }t | rBt |r2t|t| rtt| ||t| S tt| |}t| |d  |d gS t| |r>|| |dgS | |gS t |rVt|| rRd||| gS | |gS | |gS )Nc                 S   s:   g }d}| j D ]}||kr|sd}q|| q| j| S r   )r   r  r;  )r   r"  r  deletedr   r   r   r   _delete_cases4	  s   

z*CancelCommonFactors.<locals>._delete_casesr   r   )r&  r  r'  CancelCommonFactorsr)  )r   r  r  r  r   r   r   r  3	  s   

r  c           	      C   s   t | |}|d }|d }t|t|kr-t|dkr-t|dkr-t|jd |jd |S dt| dt| k r;dS t||rgt||red}d}t||D ]}||7 }qNt||D ]}||7 }qZ||k S dS dS )Nr   r   r  r  TF)r  r  r  SimplerIntegrandQr   r  r'  r  )	r   r  r   r  u1v1t1t2r   r   r   r   r  S	  s$   
(



r  c                 C   "   t | |}|r|d |d  S d S )Nr<  r  )rx  )r   r   r"  r   r   r   GeneralizedBinomialDegreei	     
r  c                 C   s   t | } t| |rRtd|gd}td|gd}td|gd}td|gd}| |||  |||   }|rNt|| ||  rP|| || || || gS d S d S dS )Nr   rG  r"  rA  r8  F)r  GeneralizedBinomialMatchQr   r  r  )r   r   r   r"  rA  r8  r  r   r   r   rx  n	  s   
rx  c                 C   r  )Nr  r  )r{  r  r   r   r   GeneralizedTrinomialDegree{	  r  r  c                 C   s   t | } t| |rhtd|dgd}td|dgd}td|gd}td|dgd}td|gd}| |||  |||   ||d| |    }|rd| jrf|| || || || d||  ||  gS d S d S d	S )
Nr   r   rG  r"  r\  rA  r8  r<  F)r  GeneralizedTrinomialMatchQr   r  r4  )r   r   r   r"  r\  rA  r8  r  r   r   r   r{  	  s   
2
.r{  c                    sZ   t | trt fdd| D S td gd}td gd}| | |  }|r+dS dS )Nc                 3   rD  r   	MonomialQr   rF  r   r   r   	  rG  zMonomialQ.<locals>.<genexpr>r   rG  r"  TFr   r   r   r   r  r   r   r   r"  r&   r   rF  r   r  	     
r  c                 C   s:   t | r| jD ]}tt||pt||r dS qdS d S r   )r+  r   r  r   r  r  r   r   r   MonomialSumQ	  s   
r  )r   )modulesc                 C   s:   t t| |}| jD ]}t|t || rt ||}q
|S )a  
    u is sum whose terms are monomials.  MinimumMonomialExponent(u, x) returns the exponent of the term having the smallest exponent

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import MinimumMonomialExponent
    >>> from sympy.abc import x
    >>> MinimumMonomialExponent(x**2 + 5*x**2 + 3*x**5, x)
    2
    >>> MinimumMonomialExponent(x**2 + 5*x**2 + 1, x)
    0
    )MonomialExponentr'  r   r  rs  r   r   r   MinimumMonomialExponent	  s   

r  c                 C   s>   t d|gd}t d|gd}| |||  }|r|| S d S )Nr   rG  r"  )r   r  r  r   r   r   r  	  s   r  c                    sZ   t | trt fdd| D S td gd}td gd}| ||   }|r+dS dS )Nc                 3   rD  r   )LinearMatchQr   rF  r   r   r   	  rG  zLinearMatchQ.<locals>.<genexpr>r   rG  r"  TFr  r  r   rF  r   r  	  r  r  c                 C   sx   t | tr| D ]
}t||s dS qdS td|gd}td|dgd}td|dgd}| |||  | }|r:dS dS )NFTr   rG  r"  r   r@  )r   r   PowerOfLinearMatchQr   r  )r   r   r   r   r"  r@  r  r   r   r   r  	  s   

r  c                    s   t | rt fdd| D S tttd tdd ttdd  tdd ttd	d
 }tttd tdd tdd ttdd
 }t|  }t||pTt||S )Nc                 3   rD  r   )QuadraticMatchQr   rF  r   r   r   	  rG  z"QuadraticMatchQ.<locals>.<genexpr>r<  r\  r   r"  r   r   c                 S      t | ||g|S r   r  )r   r"  r\  r   r   r   r   <lambda>	      z!QuadraticMatchQ.<locals>.<lambda>c                 S      t | |g|S r   r  )r   r\  r   r   r   r   r  	      )r  r   r   r   r  r   r   r   )r   r   r  r  r  r   rF  r   r  	  s   >0
r  c                    sZ  t | trt fdd| D S tttd tdd td tdd  ttdd  td	d
 ttdd }tttd tdd ttdd  td	d
 ttdd }tttd tdd td tdd  td	d
 ttdd }tttd tdd td	d
 ttdd }t|  }t||st||st||st||rdS dS )Nc                 3   rD  r   )CubicMatchQr   rF  r   r   r   	  rG  zCubicMatchQ.<locals>.<genexpr>r  r:  r   r<  r\  r"  r   r   c                 S      t | |||g|S r   r  )r   r"  r\  r:  r   r   r   r   r  	      zCubicMatchQ.<locals>.<lambda>c                 S   r  r   r  )r   r"  r:  r   r   r   r   r  	  r  c                 S   r  r   r  )r   r\  r:  r   r   r   r   r  	  r  c                 S   r  r   r  )r   r:  r   r   r   r   r  	  r  TF)	r   r   r   r   r   r  r   r   r   )r   r   r  r  pattern3pattern4r  r   rF  r   r  	  s   
P>B0
(r  c                    sv   t | trt fdd| D S ttttdtd tdtd tdtd ttdd	 }t|  } t	| |S )
Nc                 3   rD  r   )BinomialMatchQr   rF  r   r   r   	  rG  z!BinomialMatchQ.<locals>.<genexpr>rA  r   r"  r   r   c                 S   r  r   r  )r   r"  rA  r   r   r   r   r  	  r  z BinomialMatchQ.<locals>.<lambda>
r   r   r   r   r   r  r   r   r   r   r   r   r3  r   rF  r   r  	  s
   
B

r  c                    s   t | trt fdd| D S ttttdtd tdtd ttdtd tdtd  tdtd	 ttd
d tdd }t|  } t	| |S )Nc                 3   rD  r   )TrinomialMatchQr   rF  r   r   r   	  rG  z"TrinomialMatchQ.<locals>.<genexpr>jr   r\  rA  r"  r   r   c                 S   r  r   r  )r   r"  r\  rA  r   r   r   r   r  	  r  z!TrinomialMatchQ.<locals>.<lambda>c                 S   s   t | d|  S Nr<  r   r  rA  r   r   r   r  	  r  r  r  r   rF  r   r  	  s
   
l

r  c                    s   t | trt fdd| D S td dgd}td dgd}td dgd}td dgd}| | |  | |   }|rUt|d	krU|| dkrU|| dkrUd
S dS )Nc                 3   rD  r   )r  r   rF  r   r   r   
  rG  z,GeneralizedBinomialMatchQ.<locals>.<genexpr>r   r   rG  r"  rA  r8  r  TFr   r   r   r   r  r   )r   r   r   r"  rA  r8  r  r   rF  r   r  
  s   
(r  c                    s   t | trt fdd| D S td dgd}td dgd}td dgd}td dgd}td	 dgd}| | |  | |   | d
| |    }|rmt|dkrmd
||  ||  dkrm|| dkrmdS dS )Nc                 3   rD  r   )r  r   rF  r   r   r   
  rG  z-GeneralizedTrinomialMatchQ.<locals>.<genexpr>r   r   rG  r"  rA  r\  r8  r<     TFr  )r   r   r   r"  rA  r\  r8  r  r   rF  r   r  
  s   
24r  c                    s   t | trt fdd| D S td gd}td gd}td gd}td gd}td}| |||    ||    }|rKt|d	krKd
S dS )Nc                 3   rD  r   )QuotientOfLinearsMatchQr   rF  r   r   r   "
  rG  z*QuotientOfLinearsMatchQ.<locals>.<genexpr>r   rG  r"  r:  r\  r  r  TFr  )r   r   r   r"  r:  r\  r  r  r   rF  r   r   
  s   
"r  c                 C   sX   t d|gd}t d|gd}| |||  }|r*t|| r*t|| tdr*dS dS )Nr   rG  rA  r   TF)r   r  r	  r  r   )r   r   r   rA  r  r   r   r   PolynomialTermQ/
  s   "r  c                 C   s&   d}| j D ]}t||r|| }q|S r   r   r  r   r   r  r   r   r   r   PolynomialTerms8
     

r  c                 C   s&   d}| j D ]}t||s|| }q|S r   r  r  r   r   r   NonpolynomialTerms?
  r  r  c                 C   s   t | |rRtt| |tdrRt| |}tt| |||}|| td  t| ||td  | }t| |||  |  }t|rPt||rP|td|||gS dS dS )Nr<  r   rW  F)	r  r  rh  r   r  rU  r   r   r   )r   r   rA  r:  r\  r   r   r   r   PseudoBinomialPartsF
  s   
*r  c                 C   s>   t | |}|r|d |d |d |d |  |d    S d S )Nr   r   r<  r  r  r  r   r   r  r   r   r   NormalizePseudoBinomialS
  s   
,r  c                 C   s@   t | |}t|rdS t ||}t|rdS t|dt|dkS r  )r  r  Drop)r   r  r   r  r  r   r   r   PseudoBinomialPairQX
  s   

r  c                 C   s   t | |}|r	dS dS r  r  r  r   r   r   PseudoBinomialQc
  s   
r  c                 C   r   r   )ro   r   gr   r   r   PolynomialGCDj
  r   r  c                 C   s   t t| ||S r   )r?  r  r  r   r   r   PolyGCDm
     r  c                 C   sD   t | rd}| jD ]}t|||r||9 }q	|S t| ||r | S dS r  r&  r   r&  )r   r   rU  r  r   r   r   r   AlgebraicFunctionFactorsr
  s   
r  c                 C   r>  )a  
    NonalgebraicFunctionFactors[u,x] returns the product of the factors of u that are not algebraic functions of x.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import NonalgebraicFunctionFactors
    >>> from sympy.abc import x
    >>> from sympy import sin
    >>> NonalgebraicFunctionFactors(sin(x), x)
    sin(x)
    >>> NonalgebraicFunctionFactors(x, x)
    1

    r   r  r<  r   r   r   NonalgebraicFunctionFactors~
  s   


r  c                 C   s   t | |rdS t| rt| jd |rtt| |S n4t t| |r+t t| |r+dS t| r>tt	| |r=tt| |S nt| dkrOt
| rOtt| |S | |kpWt| |S )NTr   r   )rE  r+  r   r   QuotientOfLinearsPr)  rY  rX  r&  r'  r>  r  r   r   r   r  
  s   
r  c                 C   s  t | |rt| |dt| |dddgS t| r5t| dkr4t| } t| |}|d |d |d |d gS nt| rft| }t||ret	| } t| |}|d ||d   |d ||d   |d |d gS nbt
| rt| }t||rtt	| |}||d  ||d  |d |d gS t| }t| }t ||rt ||rt||dt||dt||dt||dgS n| |krg dS t| |r| dddgS | dddgS )Nr   r   r<  r  )r   r   r   r   )rE  rU  r>  rY  rX  QuotientOfLinearsPartsr+  r'  r   r)  r&  )r   r   r|  r   r:  r   r   r   r  
  s<   



4
$,
r  c                 C   sR   t | r| D ]
}t||s dS qdS t| |}t| |o(t|d o(t|d S )NFTr   r  )r  QuotientOfLinearsQr  r  r   )r   r   r   r8  r   r   r   r  
  s   

"r  c                 C   r   r   r   r   r   r   r   Flatten
  r   r  c                 C   s   t | dd |dS )Nc                 S   r  r   sort_keyrF  r   r   r   r  
      zSort.<locals>.<lambda>)keyreverse)sorted)r   r|  r   r   r   r9  
  r  r9  c                 C   sP   t | r| j}| j} t| o| dkot|S t| r$tdd | jD S t| S )Nr   c                 s   r   r   )AbsurdNumberQr   r   r   r   r   
  r   z AbsurdNumberQ.<locals>.<genexpr>)r>  r)   r?  r1  r  r&  r   r   r  r   r   r   r  
  s   r  c                 C   sD   t | r| S t| rtd}| jD ]
}t |r||9 }q|S t| S r  )r  r&  r   r   r  r   r  r   r   r   r   AbsurdNumberFactors
  s   
r   c                 C   s@   t | rtdS t| rd}| jD ]}|t|9 }q|S t| S r  )r  r   r&  r   NonabsurdNumberFactorsr  r  r   r   r   r  
  s   
r  c                 C   s   t |rtt|st| t|ott|pt| t|S t | r0tt| |p/tt| |S |dkoUt| t|koUt| t| dk pUt| t| dkoUt| dk S )Nr   g      )r+  r1  r'  r  r)  r  r  r  r   r   r   r  
  s
   4Lr  c                 C   s   t |ts
|g|  S ||  S r   r  )l1l2r   r   r   Prepend   s   

r  c                 C   s   t | tr9t |tr| d |d d  | |d d   } | S |dkr*| |d  } | S |dk r7| d |  } | S | S | jdd tt| j|D  S )Nr   r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r     r  zDrop.<locals>.<listcomp>)r   r   r;  r  r   )r  rA  r   r   r   r    s   

$ r  c                 C   sr   t | dk r| S | d d | d d kr.ttt| d| d d | d d | d d  gS ttt| t| S Nr<  r   r   )r  CombineExponentsr  r  r)  r'  )r  r   r   r   r    s
   4r  c                 C   s6   t | ttfrtt| |d S tt| |d S )N)limit)r   r  r   r  rg   itemsrh   )rA  r   r   r   r   FactorInteger  s   r	  c                 C   sF   t | rt| S t| rt| j}|d |d | j gS t|  fS r  )r1  r	  r>  r?  r)   r   as_base_exp)r@  r|  r   r   r   FactorAbsurdNumber  s   
r  c                     s  t | dkr4| d | d | d } t| t jd d tt  t jd d S t | dkr| d | d | d | d f\} t|rX|krVS |S t|t krnt|jd  jd  rnS  fdd|jD }|j| S dS )	a  
    SubstForInverseFunction(u, v, w, x) returns u with subexpressions equal to v replaced by x and x replaced by w.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import SubstForInverseFunction
    >>> from sympy.abc import x, a, b
    >>> SubstForInverseFunction(a, a, b, x)
    a
    >>> SubstForInverseFunction(x**a, x**a, b, x)
    x
    >>> SubstForInverseFunction(a*x**a, a, b, x)
    a*b**a

    r  r   r   r<  r  c                       g | ]	}t | qS r   )SubstForInverseFunctionr   r  r  r   r   r   r   G      z+SubstForInverseFunction.<locals>.<listcomp>N)	r   r  rU  r   InverseFunctionr  r  r   r;  )r   r   r   r   r  r   r  +  s   @$(
r  c                    s`   t | r| kr
S | S t| rt| j r | j  S  fdd| jD }| j| S )Nc                       g | ]
}t | qS r   )SubstForFractionalPowerr   rA  r  r  r   r   r   r   T      z+SubstForFractionalPower.<locals>.<listcomp>)r  r  r   r?  r)   r   r;  )r   r  rA  r  r   r   r   r  r   r  J  s   
r  c           	      C   s   t | dd|}t|st|d rdS |d }|d }t||}|d |d |d |d f\}}}}t|r8dS t||d  t| ||| |||   ||||    | ||||   d  }t||||t|||| ||   gS )Nr   Fr   r<  r  )"FractionalPowerOfQuotientOfLinearsr  r  r   r   r  r?  r=  )	r   r   r  rA  r  r   r"  r\  r:  r   r   r   *SubstForFractionalPowerOfQuotientOfLinearsW  s   
$R(r  c                 C   s   t | s	t| |r||gS t| rdS t| r;t| j|r;tt| j|r;t|s0t	| j| r;t
t| j|| jgS ||g}| jD ]}t||d |d |}t |rV dS qB|S NFr   r   )r  r   r  r  r  r?  r  rE  r   r   LCMrX  r)   r   r  r   rA  r  r   r  r   r   r   r   r  g  s   2
r  c                    sD   t | s	t| rdS t| rt|  S t fdd| jD S )NTc                 3       | ]	}t | V  qd S r   )SubstForFractionalPowerQr   r  r   r   r   r         z+SubstForFractionalPowerQ.<locals>.<genexpr>)r  r   r  SubstForFractionalPowerAuxQr   r   r  r   r  r   r  x  s
   r  c                    s@   t | rdS t| rt| j  rdS t fdd| jD S )NFTc                 3   r  r   )r  r   r  r   r   r     r  z.SubstForFractionalPowerAuxQ.<locals>.<genexpr>)r  r  r   r?  r   r   r  r   r  r   r    s   r  c           
         s   t | rdS t| rVtddgd}tddgd}tddgd}| j||| td    rV|||g}t|t krVt fdd	|D \}}}t|rV|| td S | j	D ]}t
|}	tt|	ri|	  S qYdS )
NFr   r   rG  r"  r\  r<  c                 3   r0  r   r   r   r1  r   r   r     r   z+FractionalPowerOfSquareQ.<locals>.<genexpr>)r  r  r   r?  r  r   r   r2  r5  r   FractionalPowerOfSquareQr  r   )
r   rN  rO  rP  r   r   r"  r\  r   r  r   r1  r   r    s&   

r  c                 C   sf   t | rdS t| r"t| j| r"t| j|ko!t|dt| k S | jD ]}t|||r0 dS q%dS )NFr  T)r  r  r   r?  r  r  r   FractionalPowerSubexpressionQ)r   r  r  r   r   r   r   r     s   "
r   c                 C   s   | | S r   r   )r   r  r   r   r   Apply  r   r!  c                    s   t | rt| jrt| j| j S | S t| r#dd | jD }t| S t| rAt	dd | jD  t
 fdd| jD  } | S | S )Nc                 S   r   r   )FactorNumericGcdr   r   r   r   r     r   z$FactorNumericGcd.<locals>.<listcomp>c                 S   r   r   r  r   r   r   r   r     r   c                       g | ]}|  qS r   r   r   r  r   r   r     r   )r>  r1  r)   r"  r?  r&  r   r   r+  r  r   )r   r   r|  r   r$  r   r"    s   
r"  c                 C   s  | |krt |td o|d dkpt |o|dkS t|rZ| |jkr9t ||j o8||j dkp8t |o8|dkS t|joYt|joYtt|pNt||j oYt| ||j |jS t	|rnt| |t
|pmt| |t|S t|ot| |t
|ot| |t|S r  )r1  r   r>  r?  r)   r+  r	  r  MergeableFactorQr&  r'  r)  basr  r  r   r   r   r%    s   ,
,B (r%  c                 C   s   | |kr
| |d  S t |r'| |jkr| ||j  S t| ||j |j|j S t|rKt| |t|r?t| |t|t| S t|t| |t| S t| |t|t| |t| S r  )r>  r?  r)   MergeFactorr&  r%  r'  r)  r&  r   r   r   r(    s   
 r(  c                 C   s   t | rtt| tt| |S t| rOt| j| j|r$t| j| j|S t	| jrK| jdk rKt| jt
d |rKt| j| jd  t| jt
d |S | | S t| t
d|r_t| t
d|S | | S )NrW  r   )r&  MergeFactorsr)  r'  r>  r%  r?  r)   r(  r1  r   r  r   r   r   r)    s   (&r)  c                 C   s   t | t| kS r   )ActivateTrigTrigSimplifyr   r   r   r   TrigSimplifyQ     r,  c                 C   r  r   )r*  TrigSimplifyRecurr   r   r   r   r+    r  r+  c                 C   s&   t | r| S t| jdd | jD  S )Nc                 S   r   r   )r.  r   r   r   r   r     r   z%TrigSimplifyRecur.<locals>.<listcomp>)r  TrigSimplifyAuxr;  r   r   r   r   r   r.    s   r.  c                 C   s$   | |krdS |   |  krdS dS rV  r  )expr1expr2r   r   r   Order  s
   r2  c                 C   s.   | dkr|dkr
dS dS |dkrdS t | |S )Nr   r   rW  )r2  r  r   r   r   FactorOrder  s   
r3  c                 C   s:   |d u r| }|d }t |D ]}t||}q|S t| |S r   )r)  Smallestr;   )num1num2r  numr   r   r   r   r4    s   
r4  c                 C   s   | t | kS r   )r9  r  r   r   r   r    r   r  c                 C   sb   t | rt |rt| |S | S t |r|S t| | }t |r'|dkr%|S | S t| |gr/| S |S r   )r1  r;   r   r  )deg1deg2r  r   r   r   MinimumDegree  s   
r:  c                 C   sX   t | rtdS t| rt| S t| r| S t| r*d}| jD ]}|t|9 }q|S dS r  )r   r   r1  r'   r   r&  r   PositiveFactorsr,  r   r   r   r;  !  s   
r;  c                 C   r   r   )r(   r   r   r   r   Sign0  r   r<  c                 C   s\   t | r| S t| rt| S t| rtdS t| r,td}| jD ]}|t|9 }q!|S | S r  )r   r1  r<  r   r   r&  r   NonpositiveFactorsr,  r   r   r   r=  3  s   
r=  c                 C   s   | |krdS t | r| |kS t| r0t|r$| j|jkr$t| j|j S t| jo/t| j||S t| s8t| rK| jD ]}t	t|||rH dS q;dS dS r  )
r  r>  r?  r  r)   PolynomialInAuxQr+  r&  r   r  r   r  r   r   r   r   r   r>  B  s    
r>  c                 C      t | tt||||S )a  
    If u is a polynomial in v(x), PolynomialInQ(u, v, x) returns True, else it returns False.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import PolynomialInQ
    >>> from sympy.abc import x
    >>> from sympy import log, S
    >>> PolynomialInQ(S(1), log(x), x)
    True
    >>> PolynomialInQ(log(x), log(x), x)
    True
    >>> PolynomialInQ(1 + log(x)**2, log(x), x)
    True

    )r>  r?  rF  r  r   r   r   PolynomialInQS  s   rA  c                    s   |  krt dS t| rt dS t| r.t r$| j jkr$| j j S | jt| j  S t| r?t fdd| jD  S t	 fdd| jD  S )Nr   r   c                       g | ]}t | qS r   ExponentInAuxr   r  r   r   r   r  r!  z!ExponentInAux.<locals>.<listcomp>c                    rB  r   rC  r   r  r   r   r   s  r!  )
r   r  r>  r?  r)   rD  r&  r   r   r:   r  r   r  r   rD  g  s   rD  c                 C   r@  r   )rD  r?  rF  r  r   r   r   
ExponentInu  r:  rE  c                    st   |  krS t | r| S t| r,t r"| j jkr"| j j  S t| j | j S | j fdd| jD  S )Nc                    rB  r   )PolynomialInSubstAuxr   r  r   r   r     r!  z(PolynomialInSubstAux.<locals>.<listcomp>)r  r>  r?  r)   rF  r;  r   r  r   r  r   rF  x  s   rF  c                 C   s:   t ||}tt| t|||||t||t||  iS r   )rF  r
  rF  r?  rE  r=  r   r  r   r  r   r   r   PolynomialInSubst  s   
0rH  c                    s(   t |rt fdd|jD  S  | S )Nc                       g | ]} | qS r   r   r   r   r   r   r     r   zDistrib.<locals>.<listcomp>)r+  r   r   r  r   r   r   Distrib  s   rJ  c                    sP   t | r|   S t| r| j| j   S t| r$t fdd| jD  S |   S )Nc                    r  r   )DistributeDegreer   r@  r   r   r     r  z$DistributeDegree.<locals>.<listcomp>)r  r>  r?  r)   r&  r   r   )r   r@  r   rL  r   rK    s   rK  c                  G   s   t | dkrt| d d| d S | \}}}t||r|S ||kr$tdS t|r?|j|kr?t|jr?|du r9|jS t||jS |}|j	D ]}t|||}qD|S )a"  
    FunctionOfPower[u,x] returns the gcd of the integer degrees of x in u.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import FunctionOfPower
    >>> from sympy.abc import x
    >>> FunctionOfPower(x, x)
    1
    >>> FunctionOfPower(x**3, x)
    3

    r<  r   Nr   )
r   FunctionOfPowerr   r   r>  r?  r	  r)   r  r   )r   r   rA  r   r  r   r   r   r   rM    s    


rM  c                    s4   t | rt fdd| jD  S t| t|    S )ap  
    DivideDegreesOfFactors[u,n] returns the product of the base of the factors of u raised to the degree of the factors divided by n.

    Examples
    ========

    >>> from sympy import S
    >>> from sympy.integrals.rubi.utility_function import DivideDegreesOfFactors
    >>> from sympy.abc import a, b
    >>> DivideDegreesOfFactors(a**b, S(3))
    a**(b/3)

    c                    s    g | ]}t |t|   qS r   )ra  rb  r   r  r   r   r          z*DivideDegreesOfFactors.<locals>.<listcomp>)r&  r   r   ra  rb  r   rA  r   r  r   DivideDegreesOfFactors  s   rP  c                    sj  t | r| krtdtdgS td| gS t| rKt| jr3t| j}|d | j |d | j gS | jkrEt| jrE| jtdgS td| gS t| rmtt	| }tt
| }|d |d  |d |d  gS t| rfdd| jD }|d d  t
|D ]	}t |d  qt st r dk rtd| gS  t fdd|D  gS td| gS )Nr   r   c                    r  r   )MonomialFactorr   rF  r   r   r     r  z"MonomialFactor.<locals>.<listcomp>c                    s$   g | ]}|d     |d  qS r   r   r   r   r  r   r   r   r        $ )r  r   r>  r	  r)   rQ  r?  r   r&  r'  r)  r+  r   r:  r   r1  r   )r   r   r  r  r  r   r   rS  r   rQ    s0   
 rQ  c                 C   r   r   r   r   r   r   r   FullSimplify  r   rU  c                    sD  t | r| S t| r/t| d}|krtd}n| }t| td |  |  S t| rJt | jrJtttt	| j| j
   S t| }t| rt|d rtt|d rt|d dk rtt|d  |d   |d   S tt|d |d   |d  S | j fdd| jD  S )Nr   r   c                    r  r   )FunctionOfLinearSubstr   r   r"  r   r   r   r     r  z)FunctionOfLinearSubst.<locals>.<listcomp>)r   rE  rU  r   r>  r?  r   rU  rV  r  r)   rQ  r&  r   r1  r^  rP  r;  r   )r   r   r"  r   r  r  r   rW  r   rV    s"   


 "
 ,(rV  c                  G   s  t | dkr<| \}}t|dd|d}t|s(t|d s(|d dkr*|d dkr*dS t||d |d ||d |d gS | \}}}}}t||rL||gS t|rRdS t||rt|rgt||dt||dgS t	|t||dg}t
t||drt|rd|d gS t
|t||d |t||d  r||d  |d gS ddgS t|rt|j|rtt|j|j |||dS t||}t|rt|d r	 dS ||g}|jD ]}t||d |d |t|}t|r dS q|S )Nr<  Fr   r   )r   FunctionOfLinearr  r   rV  r   r  rE  rU  CommonFactorsr   r  r>  r?  r  r)   rQ  r&  r   r	  r1  r^  rP  r   r+  )r   r   r   r  r   r"  rU  r   r   r   r   rX     sD   ,$

$

rX  c                 C   s"   t t| |}|t | kr| S |S r   )NormalizeLeadTermSignsNormalizeIntegrandAuxr-  r   r   r   NormalizeIntegrand(  s   r\  c                 C   sp   t | rd}| jD ]	}|t||7 }q	|S tt| |r0d}t| |jD ]	}|t||9 }q$|S tt| ||S r  )r+  r   r[  r&  rl  NormalizeIntegrandFactor)r   r   r   r   r   r   r   r[  /  s   
r[  c           	         s.  t | rPt| j rPt| j }| j}t|rLt|rLt fdd|jD rHt	| }d}|jD ]}|t
| |  7 }q1 ||  ||  S || S || S t | rct| j rc| jt| j  S t|  }t|rt fdd|jD rt	| }d}|jD ]
}|| |  7 }q | | S |S |S )Nc                 3   rD  r   r  r   rF  r   r   r   C  rG  z+NormalizeIntegrandFactor.<locals>.<genexpr>r   c                 3   rD  r   r  r   rF  r   r   r   R  rG  )r>  r   r)   NormalizeIntegrandFactorBaser?  r	  r+  r   r   r  r   )	r   r   r'  r  mir8  r   r   r  r   rF  r   r]  =  s4   




r]  c           	      C   sb  t d|gd}t d}| || | }|r/t|r/d}|jD ]}|t|| | |7 }q|S t| |r@t| |r;| S t| |S t| |rQt	| |rL| S t| |S t
| rfd}| jD ]	}|t||9 }qZ|S t| |rwt| |dkrwt| |S t| rt d}t d|gd}t| }t|s||| | rt|st|t| d krt| |S t||S | S )	Nr@  rG  r   r   r   r  r  r<  )r   r  r+  r   r^  rn  r  ro  rt  r  r&  r]  r  r  r  r  rT  )	r   r   r@  r   r  r   r   r  r  r   r   r   r^  ]  s>   








6

r^  c                 C   r  r   )rZ  r  r   r   r   r   NormalizeTogether  r   r`  c                 C   sv   t | r'd}| jD ]}t|}|d dkr||d 9 }q	|t|d 9 }q	|S t| }|d dkr5|d S t|d S r  )r&  r   SignOfFactorAbsorbMinusSign)r   r  r   r  r   r   r   rZ    s   
rZ  c                 G   sx   t d|gd}t d}t d}| |||  }|r9t|dkr9t|| r9t|| r9|| ||  ||   S |  S )Nr@  rG  r   r  r  )r   r  r   r+  r  )r   r   r@  r   r  r  r   r   r   rb    s   rb  c                 C   st   t | r| S t| r$d}| jD ]}|t|9 }qt|d t|d  S t| r8d}| jD ]}|t|7 }q-|S | S r  )r  r&  r   NormalizeSumFactorsra  r+  )r   r   r   r   r   r   rc    s   

rc  c                 C   s   t | r| dk st| rtt| dk rd|  gS t| r;t| jr7tt| jdk r7d| j | j | j gS d| gS t| r]d}d}| jD ]}|t	|d 9 }|t	|d 9 }qF||gS d| gS rV  )
r1  r+  r  r'  r  r?  r)   r&  r   ra  )r   r   hr   r   r   r   ra    s   (

ra  c                 C   sD   t | }t|rt|j|rt|j|rt|j||j S t||S r   )r  r>  rE  r?  r   r)   ro  r-  r   r   r   NormalizePowerOfLinear  s
   
re  c                 C   sB   t tt| |}dt| dt|  k r|S |t | kr|S | S )Nr  r  )rZ  r[  r   r  r-  r   r   r   SimplifyIntegrand  s   rf  c                 C   s4   t | }t|}t|t|k rt||S t||S r   )r   r  r  r\  rC  r   r   r   r    s
   

r  c                 C   s   t tt | }t|S r   )r  r   FixSimplifyr  r   r   r   r    s   r  c                 C   sp   t | }t|}t|t|k r|}tt|t|kr0t| |t|r0t||t|}t
|S t	|}t
|S r   )r   rn   r  r  r   r  r   r  SubstForExpnr"  rg  )r   r  r  r   r   r   SmartSimplify  s   $ri  c                 C   s<   | |kr|S t | r| S d}| jD ]
}|t|||7 }q|S r   )r  r   rh  )r   r  r  r   r   r   r   r   rh    s   
rh  c           	      G   s  t |dkr|d }d}tt| |r)t| |D ]}|t| ||||  7 }q|S t| |rEt| |}||d |d ||d    7 }|S t| |rmt| |}||d |d ||d    |d |d|d     7 }|S t	| |rt
| |}||d ||d   |d ||d    7 }|S t| |rt| |}||d ||d   |d ||d    |d |d|d  |d     7 }|S t| S |d }|d }t||}t||}t|r| t|| }|jD ]}|t| | |7 }q|S | t|| t| | | S )Nr   r   r<  r  r  )r   r  r   r  rY  rn  r  rt  r  r  rx  r  r{  r  ro  rF  r+  rE  r   rl  )	r   r   r   r  r   r  r  r|  r   r   r   r   ro    sD   

 

8

,

L


ro  c                 C   sL   t | r!d}g }| jD ]}||g7 }qt||D ]}||7 }q|S t| |S r   )r+  r   
UnifyTermsr  )r   r   r  r  r   r  r   r   r   rT    s   


rT  c                 C   s&   | g kr| S t t| tt| ||S r   )	UnifyTermr'  rj  r)  )r  r   r   r   r   rj  '  s   rj  c                 C   s\   |g kr| gS t t||  }t||r tt|d| |  gS tt| t||t|gS r  )r   r'  r   r  r)  rk  )termr  r   r  r   r   r   rk  -  s   
rk  c                 C   r   r   r   r   r   r   r   r  6     r  c                  G   s   t | dkr| \}}t|d |S | \}}}t||r|S ||kr"dS t||rStt||d}|d dkr7dS |d u r=|S t|d |d  |d |d   rQ|S dS t|rYdS |}|jD ]}t|||}t	|rm dS q^|S )Nr<  Fr   r   )
r   FunctionOfInverseLinearr   r  r  r  r   r  r   r  )r   r   r   r  r  r   r   r   r   rn  9  s4   


$
rn  c                 C   l   t | r| |kS t| rdS t| r#t| jd | r#t| p"t| S | jD ]}tt|||r3 dS q&dS NFr   T)	r  r  r  r   r   r  r  r  PureFunctionOfSinhQr?  r   r   r   rq  W     
rq  c                 C   ro  rp  )	r  r  r  r   r   r  r  r  PureFunctionOfTanhQr?  r   r   r   rs  e  rr  rs  c                 C   ro  rp  )	r  r  r  r   r   r  r  r  PureFunctionOfCoshQr?  r   r   r   rt  s  rr  rt  c                 C      t t| | S r   )r	  r   r  r   r   r   IntegerQuotientQ  r-  rv  c                 C   ru  r   )r  r   r  r   r   r   OddQuotientQ  r-  rw  c                 C   ru  r   )r  r   r  r   r   r   EvenQuotientQ  r-  rx  c                 C   s   |dkrdS t t|| kst t||kr>tt|r>tt|jd |r>|s3tt|jd | r>t| jd t|gS t| |t|||}t	|rNdS |d t
||d  gS Nr   Fr   )r  ra  r  rb  rv  r   r   r_  FindTrigFactorr  r^  )func1func2r   r  rU  r  r   r   r   rz    s   Zrz  c                    s  t | r| kS t| rdS t| r2t| jd  r2t| jd  r*t| p)t| S t| p1t	| S t
| rSt| jrRt| jjd  rRt| jrKdS t| j S nt| rt| jd rt| jd rt| jd jd  d  rt| jd jd  d  rtt| d S ttt|  d}t|rt|d  rtt |d   S ttt|  d}t|rt|d  rtt |d   S ttt|  d}t|rtt |d   S t fdd| jD S t fdd| jD S )	NFr   Tr   r<  c                 3   r  r   FunctionOfSinhQr   r  r   r   r     r  z"FunctionOfSinhQ.<locals>.<genexpr>c                 3   r  r   r}  r   r  r   r   r     r  )r  r  r  rv  r   rw  r  r  r  r  r  r?  r  r)   r~  r&  r   r  rz  rs  rw  r  rx  ru  rv  rt  rx  r   r   r  r   r  r   r  r   r~    8   
Tr~  c                    s"  t | r| kS t| rdS t| r"t| jd  r"t| p!t| S t| rCt| jrBt| jjd  rBt	| j
r;dS t| j S nAt| rttt|  d}t|r_tt |d   S ttt|  d}t|rwtt |d   S t fdd| jD S t fdd| jD S )NFr   Tr   c                 3   r  r   FunctionOfCoshQr   r  r   r   r     r  z"FunctionOfCoshQ.<locals>.<genexpr>c                 3   r  r   r  r   r  r   r   r     r  )r  r  r  rv  r   r  r  r  r?  r  r)   r  r&  rz  rs  rw  r  rt  rx  r   r  r   r  r   r    *   
r  c                    s   t | st| st| st| rt| jd  S t| r(t| jo't	| j
 S t| rhttt| dr?t	t|  S g }| jD ]}tt| rS|| qD|g krZdS t|dkogt	|d  S t| ryt fdd| jD S dS )Nr   r   Tc                 3   r  r   )OddHyperbolicPowerQr   r  r   r   r     r  z&OddHyperbolicPowerQ.<locals>.<genexpr>F)r  r  r  r  rw  r   r>  r  r)   r  r?  r&  r  r  r=  r?  FunctionOfTanhQr  r  r+  r   r   r  r   r  r   r   r  r   r    s$    

r  c                    s@  t | r| kS t| rdS t| r*t| jd  r*t| p)t| p)t| jd  S t| r^t	| j
rCt| jrCt| jjd  rCdS t	| jd r^t| jd r^tt| jd d  S t| rg }| jD ]}tt| rv|| qg|g kr}dS t|dkot|d  ot|d  S t fdd| jD S )NFr   Tr   r<  c                 3   r  r   r  r   r  r   r   r     r  z"FunctionOfTanhQ.<locals>.<genexpr>)r  r  r  rv  r   r  r  rx  r>  r  r)   r?  r+  r  r  r&  r  r  r  r  r   r  r   r  r   r    s*    &

,r  c                    >  t | rtdS t| rtdS t| rBt| jd  rBt| r-t| jd   r-tdS t| r>t| jd   r>tdS tdS t	| rpt
| jrpt| jrpt| jjd  rpt| jsht| jsht| jrltdS tdS t| rt fdd| jD rt fdd| jD  S tdS t fdd| jD  S )	aF  
    u is a function of the form f(tanh(v), coth(v)) where f is independent of x.
    FunctionOfTanhWeight(u, v, x) returns a nonnegative number if u is best considered a function of tanh(v), else it returns a negative number.

    Examples
    ========

    >>> from sympy import sinh, log, tanh
    >>> from sympy.abc import x
    >>> from sympy.integrals.rubi.utility_function import FunctionOfTanhWeight
    >>> FunctionOfTanhWeight(x, log(x), x)
    0
    >>> FunctionOfTanhWeight(sinh(log(x)), log(x), x)
    0
    >>> FunctionOfTanhWeight(tanh(log(x)), log(x), x)
    1

    r   r   rW  c                 3   r  r   r  r   r  r   r   r   (  r  z'FunctionOfTanhWeight.<locals>.<genexpr>c                    rB  r   FunctionOfTanhWeightr   r  r   r   r   )  r!  z(FunctionOfTanhWeight.<locals>.<listcomp>c                    rB  r   r  r   r  r   r   r   +  r!  )r  r   r  r  rv  r   r  r   r  r>  r  r)   r?  r  r  r&  r   r   r  r   r  r   r    s(   &r  c                    R   t | r| kS t| rdS t| rt| jd  rdS t fdd| jD S )NFr   Tc                 3   r  r   )FunctionOfHyperbolicQr   r  r   r   r   6  r  z(FunctionOfHyperbolicQ.<locals>.<genexpr>)r  r  r  rv  r   r   r  r   r  r   r  -  s   r  c                 C   s^   t | r| j}| j}t|r|dk rt||  S t| S t| r+tdd | jD  S t| S )Nr   c                 S   r   r   )SmartNumeratorr   r   r   r   r   ?  r   z"SmartNumerator.<locals>.<listcomp>)	r>  r)   r?  r1  SmartDenominatorr&  r   r   rY  )r   rA  r   r   r   r   r  8     r  c                 C   s^   t | r| j}| j}t|r|dk rt||  S t| S t| r+tdd | jD  S t| S )Nr   c                 S   r   r   )r  r   r   r   r   r   I  r   z$SmartDenominator.<locals>.<listcomp>)	r>  r?  r)   r1  r  r&  r   r   rX  )r   r   rA  r   r   r   r  B  r  r  c                 C      | S r   r   r   r   r   r   r*  L  rm  r*  c                     sh   t | dkr| \}}tt||S | \}}}t||}t| t|r0|j fdd|jD  S  | S )Nr<  c                    rI  r   r   r   r   r   r   r   W  r   zExpandTrig.<locals>.<listcomp>)r   r*  r  
ExpandTrigr+  r;  r   )r   r   r   r  r  r   r   r   r  O  s   

r  c                 C   r   r   )r   r   r   r   r   
TrigExpandZ  r   r  c                    s~  t | r| S t| rpt| jd rp| jd ks"t| jd  rJt| r(S t| r. S t| r6  S t| r>  S t	| rFd  S d S t
tt| t| jd   i}|j fdd|jD  S t| rt| jd rt| jd rt| jd jd d  rt| jd jd d  rtd tt| d  S | j fdd| jD  S )Nr   r   c                    r  r   SubstForTrigr   cos_sin_r  r   r   r   r     r  z SubstForTrig.<locals>.<listcomp>r<  c                    r  r   r  r   r  r   r   r     r  )r  r  rv  r   r   r  r  r  r  r  r
  r  r  r   r;  r&  rD   r  r  )r   r  r  r  r   r|  r   r  r   r  t  s(    , \" r  c                    s~  t | r| S t| rpt| jd rp| jd ks"t| jd  rJt| r(S t| r. S t| r6  S t| r>  S t	| rFd  S d S t
tt| t| jd   i}|j fdd|jD  S t| rt| jd rt| jd rt| jd jd d  rt| jd jd d  rtd tt| d  S | j fdd| jD  S )Nr   r   c                    r  r   SubstForHyperbolicr   cosh_sinh_r  r   r   r   r     r  z&SubstForHyperbolic.<locals>.<listcomp>r<  c                    r  r   r  r   r  r   r   r     r  )r  r  rv  r   r   r  r  r  r  r  r
  r  r  r   r;  r&  r3   r  r  )r   r  r  r  r   r|  r   r  r   r    s(    , \" r  c                 C   s<   t | tot | tot | tot | tot | tot | tS r   )r   rD   rE   rF   rG   rI   rH   r   r   r   r   InertTrigFreeQ     <r  c                 C   r   r   )rp   r!  r   r   r   r    r   r  c              	   C   s   t | tdd|}t|st|d rdS |d }t|d |d}t|d |d}t||d  t| |d || | || |  | }t||||d t||| gS ry  )	FractionalPowerOfLinearr   r  r   rU  r   r  r?  r=  )r   r   r  rA  r   r"  r  r   r   r   SubstForFractionalPowerOfLinear  s   6 r  c                 C   s   t | s	t| |r||gS t| rdS t| r3t| j|r3t|s(t| j| r3tt	| j
|| jgS ||g}| jD ]}t||d |d |}t |rN dS q:|S r  )r  r   r  r  rE  r?  r   r   r  rX  r)   r   r  r  r   r   r   r    s   "
r  c                 C   sh   t | st| st| |rdS t| rt| jd |r| S | jD ]}t||}tt |r1|  S q dS r   )r  r  r   r  rE  r   InverseFunctionOfLinearr  )r   r   r   r  r   r   r   r    s   

r  c                     s   t | dkr| d  ttttttg}t fdd|D S t | dkr9| \ } |kr/t S t	 |p8t	| S | \ }}t| oGt||S )Nr   r   c                 3   s    | ]	}t  |kV  qd S r   )r  r   r  r   r   r     r  zInertTrigQ.<locals>.<genexpr>r<  )
r   rD   rE   rF   rG   rI   rH   r   
InertTrigQInertReciprocalQ)r   r   r  rd  r   r  r   r    s   
r  c                 C   s<   | j tkr
|j tkp| j tkr|j tkp| j tko|j tkS r   )r;  rD   rH   rE   rI   rF   rG   r  r   r   r   r    r  r  c                 C   s   t t| ||S r   )FixInertTrigFunctionDeactivateTrigAuxr  r   r   r   DeactivateTrig  r  r  c                 C   r  r   r   r  r   r   r   r    rm  r  c                    s@  t | r| S t| rFt| jd  rFt| jd  }t| r"t|S t| r*t|S t	| r2t
| S t| r:t|S t| rBt|S t|S t| rt| jd  rtt| jd   }t| rgt t| S t| rot|S t| rzt t
| S t| rtt|  nt| rt|S tt| S | j fdd| jD  S )Nr   c                    r  r   )r  r   rF  r   r   r     r  z%DeactivateTrigAux.<locals>.<listcomp>)r  r  rE  r   ro  r  rD   r  rE   r  rF   r  rG   r  rI   rH   r  r   r  r  r  r  r  r;  r-  r   rF  r   r    s:   r  c                 C   s"  t d|gd}t d|gd}t d|gd}t d|gd}t d|gd}t d|gd}t d|gd}	t d	}
|||||
 |   |	 }| |}|r\||||	||
g}t|t|kr\d
S |||||
 |   ||||
 |   |	 }| |}|r|||||	|||
g}t|t|krd
S dS )Nr  rG  r8  r   r"  r\  r:  rA  r  TF)r   r  r   )r   r;  r   rj  q_rN  rO  rP  rQ  rK  w_r3  r  r   r   r   r   PowerOfInertTrigSumQ  s*   
0
r  c            
   
   G   s*  t | dkr| \}}}t||ot||S | \}}t||r dS td|gd}td|gd}td}|t|||  }|rNt |dkrNt|| |rNdS z@t|}t|jd }	|jd jd }t||rtt	t
gt	tgttgtt
gttgttgttgttgg||	grW dS W dS W dS    Y dS )	Nr  Tr\  rG  r  r  r   F)r   PiecewiseLinearQrE  r   r  r  typer   r  r.   r4   r5   r/   r=   rF   rG   r@   )
r   r   r  r   rP  r  rL  r  r  Gr   r   r   r  '  s8   


>r  c                 C   s@  |dkrdS t d|gd}t d|dgd}td}t d|gd}t d	|gd}t d
|dgd}t d|dgd}	||||  | }
|
rX|
| }t|jd |rXt| |jrXdS ||||  | |||   }
|
r|
| }t|jd |rt| |jrdS |||	|d   }
|
r|
| }t|jd |rt| |jrdS ||||  |	|d   }
|
r|
| }t|jd |rt| |jrdS ||||  | ||	|d    }
|
r|
| }t|jd |rt| |jrdS ||||  | |||  |	|d    }
|
r|
| }t|jd |rt| |jrdS dS )Nr   Tr   rG  r"  r   r;  r@  ABCr<  F)r   r   r  rE  r   r  r;  )r  r   r   rN  rO  func_rk  A_B_C_r  r;  r   r   r   KnownTrigIntegrandQE  sP   "&. r  c                 C      t ttg| |S r   )r  rD   rE   r  r   r   r   KnownSineIntegrandQv  r  r  c                 C      t tg| |S r   )r  rF   r  r   r   r   KnownTangentIntegrandQy  r  r  c                 C   r  r   )r  rG   r  r   r   r   KnownCotangentIntegrandQ|  r  r  c                 C   r  r   )r  rI   rH   r  r   r   r   KnownSecantIntegrandQ  r  r  c           	      C   s   t d|gd}t d|gd}t d|gd}t d}| j}zGtttttg|rU| jd ||||   }|rXt	|dkr[|| }tt
tttg|jr^t|jd |raW dS W d	S W d	S W d	S W d	S W d	S    Y d	S )
Nr   rG  r"  r\  r  r   r  TF)r   r;  r  r=   r@   r.   r/   r   r  r   rF   rG   r4   r5   rE  )	r   r   rN  rO  rP  G_r  r  r  r   r   r   TryPureTanSubst  s6   	r  c                    s  t | rdS tt| |sdS td|gd}td|gd}td|gd}ttd\}}}}}	}
}| ||| |    r^t dkr^ fdd	||||fD \}}}}t|r^t|r^dS | d
||	|
|      rt dkr fdd	||	|
|fD \}}}}t	|rt|r|dkrdS | |
|   rt dkrÈ |
  | }}t	|rt	|rt
|jd | |jd | rdS | ||||  |    rt dkr fdd	|||||fD \}}}}}t|dko|t|kp|t|krdS | t| |kr	dS dS )NFr   rG  r@  r  rstnbfgr  c                    rI  r   r   r   r1  r   r   r     r   z TryTanhSubst.<locals>.<listcomp>r   c                    rI  r   r   r   r1  r   r   r     r   r<  r   r  c                    rI  r   r   r   r1  r   r   r     r   T)r  r   rX  r   mapr  r   r	  r   r  r  r   r  rv  rw  r  )r   r   rN  rk  rj  r_s_t_rK  rO  rS  g_r|  r  r  rA  r   r"  r   r  r@  r  r   r1  r   TryTanhSubst  sH   ""&$r  c                 C   s   | j }td|gd}td}|tkrdS | jd || }|r;t|dkr;|| j }tttg|r;tt	t
g|r;dS | t| |krDdS dS )Nr   rG  r  Fr   r<  T)r;  r   r   r   r  r   r  r.   r/   r4   r5   r  )r   r   r  rN  r  r  r  r   r   r   TryPureTanhSubst  s   
r  c                  G   s:   t | }t|dkrt|S ttt|ttt| S r  )r   r  r'  AbsurdNumberGCDListr  AbsurdNumberGCDr)  )seqr  r   r   r   r    s   r  c                 C   sX  | g krt dd |D  S |g krt dd | D  S | d d |d d kr\| d d |d d krG| d d | d d  tt| t| S | d d |d d  tt| t| S | d d |d d k r| d d dk r| d d | d d  tt| | S tt| |S |d d dk r|d d |d d  t| t| S t| t|S )Nc                 S   "   g | ]}|d  t |d d  qS rR  r;   r   r   r   r   r        " z'AbsurdNumberGCDList.<locals>.<listcomp>c                 S   r  rR  r  r   r   r   r   r     r  r   r   )r   r  r)  )r  r  r   r   r   r    s   **&&r  c           	      C   sX   t t|||| i| ||i}t|r(d}|jD ]}|| | 7 }q|S | | S r   )r  r  r   r+  r   )	r   r  r  r@  rA  r   r  r  r   r   r   r   ExpandTrigExpand  s   (
r  c                  G   sx   t | dkr/| d }| d }| d }t||}t|r+d}|jD ]}||| 7 }q |S || S | d }| d }t||S )Nr  r   r   r<  )r   ExpandTrigReducer+  r   ExpandTrigReduceAux)r   r   r  r   r  r  r   r   r   r   r    s   


r  c                 C   s@   t |  }t|rd}|jD ]	}|t||7 }q|S t||S r   )
TrigReducer   r+  r   NormalizeTrig)r   r   r  r  r   r   r   r   r    s   

r  c                 C   s   t d|gd}t d|dgd}t d}|||  }| |}|rZt|| jdkrZt|| jd |rZt|| jd |dkrZ|| jd }|| || |t||i||   S | S )Nr   rG  rA  r   r  r   )r   r  r   r   r  r  r   ro  )r  r   r   rA  r  r   Mr   r   r   r   r    s   
B(r  c                 C   s@   |  tt tt tt tt tt tt}|tt	S r   )
rewriterD   r  rE   rF   rI   rH   rG   r   r   )r   exr   r   r   	TrigToExp"  s   4r  c                 G   s   t |dkr|d }td| |S |d }|d }t|}d}t|r4|jD ]}|t| | |7 }q%|}nt| | |}tt||t|||S r  )	r   ExpandTrigToExpr  r+  r   rf  r  r=  r?  )r   r   r   r  r  r   r   r   r   r   r  &  s   
r  c                 C   s  t | rd}| jD ]}|t|7 }q	|S t| rtdd | jD rf| ttftt	t
ft tttt
trR| ttftt	t
ft tt S | ttftt	t
ft ttS td}td}td}| |t| t	| }|r|| }|| }|| }| |t| t	| |td d t|| t||   S | |t| t| }|r|| }|| }|| }| |t| t| |td d t	||  t	||  S | |t	| t	| }|r$|| }|| }|| }| |t	| t	| |td d t	||  t	||  S | |t| t
| }|r`|| }|| }|| }| |t| t
| |td d t|| t||   S | |t| t| }|r|| }|| }|| }| |t| t| |td d t
||  t
||  S | |t
| t
| }|r|| }|| }|| }| |t
| t
| |td d t
||  t
||  S t| rO| ttr| ttft tttt
tr| ttft tt S | ttft ttS | t	t
rO| t	t
ft tt	tt
trA| t	t
ft tt	 S | t	t
ft tt	S | S )	a  
    TrigReduce(expr) rewrites products and powers of trigonometric functions in expr in terms of trigonometric functions with combined arguments.

    Examples
    ========

    >>> from sympy import sin, cos
    >>> from sympy.integrals.rubi.utility_function import TrigReduce
    >>> from sympy.abc import x
    >>> TrigReduce(cos(x)**2)
    cos(2*x)/2 + 1/2
    >>> TrigReduce(cos(x)**2*sin(x))
    sin(x)/4 + sin(3*x)/4
    >>> TrigReduce(cos(x)**2+sin(x))
    sin(x) + cos(2*x)/2 + 1/2

    r   c                 s   r   r   )r>  )r   r   r   r   r   r   O  r   zTrigReduce.<locals>.<genexpr>r   r"  r  r   r<  )r+  r   r  r&  r   r  rD   r3   r  rE   r2   r   r   r   r}   r   r  r   r   r>  )r   r  r   r   r"  r  r  r   r   r   r  7  sv   

2,(@@@@@@
( ( r  c           
      G   s  t |dkr|d }t| d |}|r|S dS |\}}t| r&| |kr$dS |S t| r}t| jd |r}|d u r;| jd S t||d}t||d}t| jd |d}t| jd |d}t|| ||  r{t|| r{|t	||  || t	||   S dS t
| rt| jd |r|d u rt| jd  S t||d}t||d}tt| jd |d }tt| jd |d }t|| ||  rt|| r|t	||  || t	||   S dS t| rdS |}| jD ]}	t|	||}t|r dS q|S Nr   r   F)r   FunctionOfTrigr  r  rE  r   rU  r   r1  rY  r  r   r  r   )
r   r   r   r  r   r"  r\  r:  r  r   r   r   r   r    sP   
 $ $
r  c                 C   s   t | rdS t| rt| jd |rdS t| r"t| jd |r"dS t| r4t| j|r2t| j	|S dS t
| s<t| rL| jD ]
}t||sI dS q?dS dS )NTr   F)r  r  rE  r   r  r>  r   r)   AlgebraicTrigFunctionQr?  r&  r+  r  r   r   r   r    s"   

r  c           	      G   s<  t |dkr|d }t| d |}|d u rdS |S |d }|d }t| r,| |kr*dS |S t| rt| jd |r|d u rA| jd S t||d}t||d}t| jd |d}t| jd |d}t|| ||  rt|| r|t	||  || t	||   S dS t
| rdS |}| jD ]}|t|||kr dS q|S r  )r   FunctionOfHyperbolicr  r  rE  r   rU  r   r1  rY  r  )	r   r   r  r   r"  r\  r:  r  r   r   r   r   r    s<   
 $
r  c                 C   s0  t ||rdS t| rdS t| r%ttt| |dr%tt| ||||S |rt| s/t	| r8t
|| jd |S t| s@t| rIt|| jd |S t| rVt|| jd |S t| rct|| jd |S t| skt| rtt|| jd |S t| s|t| rt|| jd |S t| rt|| jd |S t| rt|| jd |S t|| |dkS t| st	| rt|| jd |S t| st| rt|| jd |S t| st| rt || jd | n5t| st| rt!|| jd |S t| st| rt"|| jd |S t| st| rt#|| jd |S t|| |dkS )NFTr   r   )$r   r  r&  r  r  r=  FunctionOfQr?  r  r  PureFunctionOfSinQr   r  r  PureFunctionOfCosQr  PureFunctionOfTanQr  PureFunctionOfCotQr  r  rq  r  r  rt  r  rs  r  PureFunctionOfCothQFunctionOfExpnQFunctionOfSinQFunctionOfCosQFunctionOfTanQr~  r  r  )r  r   r   PureFlagr   r   r   r    sJ   
r  c                 C   s  | |krdS t | r| |krdS dS t| rdS t| rt| j|rt| j| r3t| jr1| jS dS t|r}t|j|r}t| j|j r}t|jrit| jrgt| j|j rg|jdksa| jdk rg| j|j S dS tt	| j|j r{t	| j|j S dS t
| j||S t| rttt| |drt
t| |||S t| rt|rt
t| t||}|dkrdS t
t| t||}||krtt	| | |A |r|S dS g }| jD ]}t
|||du r dS |t
||| qtt|S ry  )r  r  r>  r   r)   r   r?  r	  r1  r   r  r&  r  r  r=  r?  r'  r)  r   r  r!  r  )r   r  r   r8  r9  r  r   r   r   r   r    sP   

.

r  c                 C   ro  rp  )	r  r  r  r   r   r  r  r  r  r?  r   r   r   r  M     
r  c                 C   ro  rp  )	r  r  r  r   r   r  r  r  r  r?  r   r   r   r  Z  r  r  c                 C   ro  rp  )	r  r  r  r   r   r  r  r  r  r?  r   r   r   r  g  r  r  c                 C   sd   t | r| |kS t| rdS t| rt| jd | rt| S | jD ]}tt|||r/ dS q"dS rp  )r  r  r  r   r   r  r  r  r?  r   r   r   r  t  s   
r  c                    s"  t | r| kS t| rdS t| r"t| jd  r"t| p!t| S t| rCt| jrBt| jjd  rBt	| j
r;dS t| j S nAt| rttt|  d}t|r_tt |d   S ttt|  d}t|rwtt |d   S t fdd| jD S t fdd| jD S )NFr   Tr   c                 3   r  r   r  r   r  r   r   r     r  z!FunctionOfCosQ.<locals>.<genexpr>c                 3   r  r   r  r   r  r   r   r     r  )r  r  r  rv  r   r  r  r  r?  r  r)   r  r&  rz  rD   rH   r  r  rF   rG   r   r  r   r  r   r    r  r  c                    s  t | r| kS t| rdS t| r2t| jd  r2t| jd  r*t| p)t| S t| p1t	| S t
| rSt| jrRt| jjd  rRt| jrKdS t| j S nt| rt| jd rt| jd rt| jd jd  d  rt| jd jd  d  rtt| d S ttt|  d}t|rt|d  rtt |d   S ttt|  d}t|rt|d  rtt |d   S ttt|  d}t|rtt |d   S t fdd| jD S t fdd| jD S )	NFr   Tr   r<  c                 3   r  r   r  r   r  r   r   r     r  z!FunctionOfSinQ.<locals>.<genexpr>c                 3   r  r   r  r   r  r   r   r     r  )r  r  r  rv  r   rw  r  r  r  r  r  r?  r  r)   r  r&  r   r  rz  rD   r7   r  rx  r  rE   rI   rF   rG   r   r  r   r  r   r    r  r  c                    s   t | st| st| st| rt| jd  S t| r(t| jo't	| j
 S t| ret| dks<t	t|  S g }| jD ]}tt| rP|| qA|g krWdS t|dkodt	|d  S t| rvt fdd| jD S dS )Nr   r   Tc                 3   r  r   )OddTrigPowerQr   r  r   r   r     r  z OddTrigPowerQ.<locals>.<genexpr>F)r  r  r  r  rw  r   r>  r  r)   r  r?  r&  r=  r?  r  r  r  r  r+  r   r  r   r  r   r    s$    

r  c                    s4  t | r| kS t| rdS t| r*t| jd  r*t| p)t| p)t| jd  S t| rXt	| j
rCt| jrCt| jjd  rCdS t	| j
rXt| jrXtt| jd  S t| rg }| jD ]}tt| rp|| qa|g krwdS t|dkot|d  ot|d  S t fdd| jD S )NFr   Tr<  r   c                 3   r  r   r  r   r  r   r   r     r  z!FunctionOfTanQ.<locals>.<genexpr>)r  r  r  rv  r   r  r  rx  r>  r  r)   r?  r+  r  r  r&  r  r  r  r  r   r  r   r  r   r    s*    &

,r  c                    r  )	Nr   r   rW  c                 3   r  r   r  r   r  r   r   r     r  z&FunctionOfTanWeight.<locals>.<genexpr>c                    rB  r   FunctionOfTanWeightr   r  r   r   r      r!  z'FunctionOfTanWeight.<locals>.<listcomp>c                    rB  r   r  r   r  r   r   r     r!  )r  r   r  r  rv  r   r  r   r  r>  r  r)   r?  r  r  r&  r   r   r  r   r  r   r    s(   &r  c                    r  )NFr   Tc                 3   r  r   )FunctionOfTrigQr   r  r   r   r     r  z"FunctionOfTrigQ.<locals>.<genexpr>)r  r  r  rv  r   r   r  r   r  r   r    s   r  c                    sB   t |  rdS t|  rtt|  dkS t fdd| jD S )NTr   c                 3   rD  r   )FunctionOfDensePolynomialsQr   rF  r   r   r     rG  z.FunctionOfDensePolynomialsQ.<locals>.<genexpr>)r   r  r  r  r   r   r  r   rF  r   r    s
   

r  c                 G   sH  t |dkr$|d }t| dd|}t|s t|d s t|ts"dS |S |d }|d }|d }t| r?| |kr:dS | ||gS t| rEdS t| jd |}t	| rrt
|rrt|d rrt|sf| jd |krp|| jd |d gS dS d||g}g }| jD ]}t||d |d |}t|r dS ||d  q|| j| |d |d gS )Nr   r   Fr<  )r   FunctionOfLogr  r   r   r   r  r  r   r  r  r   r  r;  )r   r   r   r  r  rA  r   r   r   r   r   r    s8   


r  c                 C   sP   t |r&t| |d|}|sdS |||d   t| |d | |d |d gS dS ry  )r	  PowerVariableDegreePowerVariableSubst)r   r@  r   r  r   r   r   PowerVariableExpn<  s   .r  c                 C   s  t | |r	||gS t| st| rdS t| rYt | j| |rYt|s/|| jkr7|| j| kr7| j| j| gS t| jrWt|rWt|| jdkrW|| j| krWt|| j|gS dS ||g}| j	D ]}t
||d |d |dkrr dS t
||d |d |}q`|sdS |S )NFr   r   )r   r  r  r>  r?  r   r)   r	  r  r   r  )r   r@  r\  r   r  r   r  r   r   r   r  H  s&   
 0
r  c                 C   s   t | |st| st| r| S t| r"t | j| |r"|| j|  S t| r8d}| jD ]
}|t|||9 }q+|S t	| rNd}| jD ]
}|t|||7 }qA|S | S r  )
r   r  r  r>  r?  r)   r&  r   r  r+  )r   r@  r   r   r   r   r   r   r  _  s    

r  c           
      C   sH  t d|gd}t d|gd}t d|dgd}t d|dgd}t d|dgd}t d}t d	}| || |||   | }	|	rxt|	d
krgt|	| |	| g|rgt|	| d rgt|	| |rgtt|	| svt|	| rxtt	|	| |rxdS | || || |||   |  }	|	rt|	dkrt|	| |	| g|rt
|	| |	|  rtd|	|  |	| d rt|	| |rtt|	| st|	| rtt	|	| |rdS | || ||  }	|	r"t|	dkrt|	| rt|	| d rt|	| |rt|	| |rtt	|	| |r dS d S d S d S d S d S d S dS )Nr   rG  r"  rA  r   r@  r  r   r  r  g      ?Tr  r<  r  F)r   r  r   r   r	  r  r  r1  r  rn  r   r  )
r   r   r   r"  rA  r@  r  r   r  r  r   r   r   EulerIntegrandQq  s*   n&br  c              	   G   s  t |dkrY|d }ttttdd t|tdd tdd  t  |tdd }tt| |d |}|r:dS t	| d|}t
|sJt|d rLdS |d }t||d}t||d}t||d	}t|rjt|svt|d	 d
| |  rxdS t|rt|td	}	||	 ||  |	|d	   }
|d	|	 |  }tt| |
| | |d	  | ||
 |d	  t|	| t| d	gS t|rt|td	}	||	 ||  |	|d	   }
||d	  }tt| |
| | d	|	 |  | ||
 |d	  t|	 t| | dgS t|d	 d
| |  td	}	||d	  }t|	 t| |	 | | || ||	  | |	 |d	    d	| |  | | |d	  td	| t| ||	 d	| |   dgS |d }|d }t
| slt| |ro|gS t| rt| j|rt| jrt| jd	krt| j|rt| j|d	krt|s| j|kr| jgS dS t	| j||S t| st| r|g}g }| jD ]}t	||d |dkr dS t	||d |}q|S dS )Nr   r   r@  rA  r"  c                 S   s   t | ||||g|S r   r  )r   r"  r@  rA  r  r   r   r   r   r    r   z1FunctionOfSquareRootOfQuadratic.<locals>.<lambda>Fr<  r  r  ) r   r   r   r  r   rN  rj  r   r   FunctionOfSquareRootOfQuadraticr  r   rU  r   r  r  r   r   SquareRootOfQuadraticSubstrL  rU  r   r>  r)   r  rX  r  r?  r  r&  r+  r   )r   r   r   r3  r  r  r   r"  r\  r<   r8  r|  r  r  r  r   r   r   r   r    s`   B(F
L
<
r  c                 C   s   t | s	t| |r| |kr|S | S t| rIt| j|rGt| jr<t| jdkr<t| j|r<t| j|dkr<|t	| j S t
| j|||| j S d S t| r`d}| jD ]}|t
||||7 }qR|S t| rwd}| jD ]}|t
||||9 }qi|S d S r  )r  r   r>  r)   r  rX  r  r?  r  rY  r  r+  r   r&  )r   vvxxr   r  r   r   r   r   r    s*   4

r  c                 C   s   t ||  }t||r|S dS r   )r   r   )r7  r   r   r  r   r   r   Divides  s   
r  c                 C   s   ddl m} tttttdd }dd }|| |rdS || ||r>t| |}t|dr/dS t	|| }t
||r<|S dS dS )z
    If y not equal to x, y is easy to differentiate wrt x, and u divided by the derivative of y
    is free of x, DerivativeDivides[y,u,x] returns the quotient; else it returns False.
    r   )r   c                 S   r   r   r  r!  r   r   r   r       
 z#DerivativeDivides.<locals>.<lambda>c                 S   s6   t | |rt ||ot||t| |d kS t| |S r  )r  r  EasyDQ)r7  r   r   r   r   r   f1  s   
"
zDerivativeDivides.<locals>.f1F)r   r   r   r   r   rO  r   Dr  r   r   )r7  r   r   r   pattern0r  r  r   r   r   DerivativeDivides  s   



r  c                 C   s  t ddgd}t d|dgd}| |||  }|r!t|| |S t| s0t| |s0t| dkr2dS t| r8dS t| dkrFt| jd |S t| |sPt	| |rRdS t
| |rbt| |ddgkrbdS t| rtt| |rttt| |S tt| |rtt| |S dS t| rtt| |ott| |S t| dkrt| jd |rt| jd | dS t| jd |rt| jd |S dS dS )	Nr   r   rG  r@  r   TFr<  )r   r  r  r  r   r  r  r   rn  ProductOfLinearPowersQr'  r  r&  r'  r)  r+  )r   r   r   r@  r  r   r   r   r    s>   r  c                 C   sd   t d}t d|gd}| || }t| |p1|r t|| |p1t| o1tt| |o1tt| |S )Nr  rA  rG  )r   r  r   rE  r&  r  r'  r)  )r   r   r  rA  r  r   r   r   r    s   @r  c                 C   rg  r   )RtAuxr  rO  r   r   r   r  &  r  r  c                 C   s   t | td|  S r  )r   r   rO  r   r   r   NthRoot)  r   r  c                 C   ,   t | pt| ot| jd ot| jd S r  )r  r>  r  r   	AtomBaseQr   r   r   r   r  ,     ,r  c                 C   r   r  )r+  r>  r  r   SumBaseQr   r   r   r   r  0  r  r  c                 C   s8   t | r
tt| pt| ot| jd ot| jd S r  )r+  r  r'  r>  r  r   NegSumBaseQr   r   r   r   r  4  s   8r  c                 C   sD   t | rt| jrt| jS t| rtt| ott| S t| S r   )	r>  r  r)   AllNegTermQr?  r+  r  r'  r)  r   r   r   r   r  8     

r  c                 C   sD   t | rt| jrt| jS t| rtt| ptt| S t| S r   )	r>  r  r)   SomeNegTermQr?  r+  r  r'  r)  r   r   r   r   r  A  r  r  c                 C   s0   t | ot| jd dotttgt| jd S Nr   r<  r   )r>  r  r   r  rD   rE   r  r   r   r   r   TrigSquareQJ  s   0r	  c                    s  t | r| j| j   S t| r\t| }t| }tt|o t|rWt||d |d   rWt||d |d   rWtdt	||d |d   ||d |d   t
    S t|  S t| rtt| }t|rxt	|d  t	|d   S tt| }t|rUt|d drE|d }t |rt|jrdt	|j|j     S t|r5ttt|rtt|}t|rt	|d   t	|d   S tt|}t|rt	|d   t	|d   S tt|}t|rt	|d   t	|d   S tt|}t	|d   t	|d   S tt|}t|r&t	|d   t	|d   S t	t|  t	t|  S t r@t	|  S t|  S t	|d   t	|d    S tt| }t|ryttt|d ryt	|d   t	|d    S tt| }t|rttt|d rt	|d   t	|d    S | j fdd| jD  S t| }tt|rt	| S t rt| rt	|    S t rt| rt|  rt	|    S t|  S )Nr<  r   r   rW  c                    r  r   )r  r   r  r   r   r     r  zRtAux.<locals>.<listcomp>) r>  r?  r)   r  r  r  r  r	  r   r  r   r  r&  SplitProductr   r  r   r  r  r  r  r  r  r'  r)  r  r;  r   
TrigSquarer  r  r  )r   rA  r   r"  r  r  r   r  r   r  N  sn   D:














 
 
 
 
r  c                 C   s   t | re| jD ]}tt|}|dkst|| dkr dS ttt|}q|rct|d d |d  rct|d d jd tkrQ|d t|d d d d d  S |d t|d d d d d  S dS dS )NFr   r<  r   )	r+  r   r
  r	  SplitSumr   r  rD   rE   )r   r   r  r  r   r   r   r    s   

$$r  c                    s   t  fdd| jD  S )Nc                    r  r   rc   r   rF  r   r   r     r  zIntSum.<locals>.<listcomp>)r   r   r  r   rF  r   IntSum  s   r  c           	      C   sZ  t d|gd}t d|dgd}t d}| || }|rHt|dkrHt|| |rHt|| |rHt|| tt|| | t|| |d |S | |||  }|rt|dkrt	|| d rt|| |rt|| || || d   t|| |d|| d   |S t
| rd}| jD ]	}|t||7 }q|S | }tt||tt||||S )	Nr\  rG  r@  r   r  r<  r   r  )r   r  r   r   rE  rm  r  rD  rU  r   r+  r   IntTermDistr=  rd   r?  )	r   r   r\  r@  r  r  r  r   r   r   r   r   r    s    ,0.>
r  c                 C   s4   g }t dt|D ]}|| || ||  q	|S r   )r{  r   r  )r   r  r  r  r   r   r   r   Map2  s   r  c                    s  t |  r| tdgS t| rtd| gS t| r[t | j rZt| j }t| jr8|d | j |d | j gS t|d }|dkrHtd| gS || j t	|d |d  | j gS nbt
| r{ fdd| jD }tdd |D  tdd |D  gS t| r fdd| jD }tdd |D  rtd	d |D  |d d gS td
d |D }t|tttt|dd |D  gS td| gS )Nr   r   c                    r  r   ConstantFactorr   rF  r   r   r     r  z"ConstantFactor.<locals>.<listcomp>c                 S   r   r   r'  r   r   r   r   r     r   c                 S      g | ]}|d  qS r   r   r   r   r   r   r     r   c                    r  r   r  r   rF  r   r   r     r  c                 S   r  r  r   r   r   r   r   r     r   c                 S   r  )r   r   r   r   r   r   r     r   c                 S   r   r   r  r   r   r   r   r     r   c                 S   r  r  r   r   r   r   r   r     r   )r   r   r  r>  r)   r  r?  r	  r;  r=  r&  r   r   r+  SameQr   rY  r'  r  r)  )r   r   r  r  r  r  r   rF  r   r    s0   

$$&r  c                  G   s6   t dt| d D ]}| | | |d  kr dS q	dS ry  )r{  r   r~  r   r   r   r    s
   r  c                 C   s   || |< | S r   r   )r  r   r"  r   r   r   ReplacePart  r   r  c                    sv  dd | D }dd | D t  }fddD 	 dd |D t r7|d  }dd |D }nItd	d
 D rtdd
 fddD D rfddD t |ttd   }fddtdtD dd |D }dd |D tdd |D  rt rt	t
|d  dkr|   } fddtdtD dd |D }nt|dkr*tt
|d t
|d  r*t|d d r*td r*td r*t t
|d  dkr|   }d dd   d g fddtdtD dd |D }nt|dkrt|d t
|d  rt|d d rt|d rtd rt t
|d  dkrj|   }d d dd   g fddtdtD dd |D }ntt   t|t| }tdd
 |D rt|S q)Nc                 S   r   r   )r  r   r   r   r   r     r   z!CommonFactors.<locals>.<listcomp>c                 S   r   r   )r   r   r   r   r   r     r   c                    r#  r   r   r   )r7  r   r   r     r   Tc                 S   r   r   )r^  r   r   r   r   r     r   r   c                 S   r   r   r_  r   r   r   r   r     r   c                 s   s0    | ]}t |ott|ot|d kV  qdS r  )r  r	  r'  r   r   r   r   r     s   . z CommonFactors.<locals>.<genexpr>c                 s   r   r   r1  r   r   r   r   r     r   c                       g | ]
}t |t  qS r   rU  r'  r   r  r  r   r   r     r  c                    r  r   r  r  r  r   r   r     r  c                    s    g | ]} | |   qS r   r   r   )r  r  r7  r   r   r     rN  c                 S   r   r   r  r   r   r   r   r     r   c                 S   r   r   )rb  r   r   r   r   r     r   c                 S   r   r   )ra  r   r   r   r   r     r   c                    $   g | ]}|  |    qS r   r   r   r?  r  r  r7  r   r   r      rT  c                 S   r   r   r  r   r   r   r   r     r   r<  r   rW  c                    r  r   r   r   r  r   r   r   	  rT  c                 S   r   r   r  r   r   r   r   r   
  r   c                    r  r   r   r   r  r   r   r     rT  c                 S   r   r   r  r   r   r   r   r     r   c                 s   r  r  r   r   r   r   r   r     r   )r  r  r   r  r  r'  r{  r   r1  r4  ra  r  r   r   r	  r  r;   MostMainFactorPositionr  r_  r  )r  r  commonr   )r?  r  r  r  r7  r   rY    sx    ",


"(


"
rY  c                 C   sB   t d}d}tdt| D ]}t| | |dkr| | }|}q|S r  )r   r{  r  r3  )r  rn   r7  r   r   r   r   r     s   r   NNc                 C   s   d\a adat| |}|otS Nr"  FSbaseSSexponSSexponFlagSFunctionOfExponentialTest)r   r   r   r   r   r   FunctionOfExponentialQ&  s   
r)  c                 C   s   d\a adat| | t t S r#  r$  r  r   r   r   FunctionOfExponential/  s   
r*  c                 C   s&   d\a adat| | tt| ||S r#  )r%  r&  r'  r(  rf   FunctionOfExponentialFunctionAuxr  r   r   r   FunctionOfExponentialFunction7  s   
r,  c              	      s  t | r| S t| r]t| j r\t| j r\ttt drB| jt| j d  t	t
| jt| j d t
ttt d    S  t	t
| jt| j d t
ttt d   S nst| rt| jd  rЈ t	t| jd  dt
ttt d   }t| r|d dd|   S t| r|d dd|   S t| r|d|  |d|   S t| r|d|  |d|   S t| rd|d|   S d|d|   S t| rt| j rt| jrt| jt| j  t| jt| j   S | j fdd| jD  S )Nr   r   r<  c                    r  r   )r+  r   rF  r   r   r   Z  r  z4FunctionOfExponentialFunctionAux.<locals>.<listcomp>)r  r>  r   r?  rE  r)   r   rU  r&  rU  r  r%  r  r   r  r  r  r  r  r+  r+  r'  r)  r;  )r   r   r  r   rF  r   r+  ?  s2   H4.,r+  c                    s   t |  rdS |  kst| rdS t| r,t | j r+t| j r+dat| j| j S nt| rAt| j	d  rAtt
| j	d  S t| rft | j rft| jrft| jt| j  oet| jt| j  S t fdd| j	D S )NTFr   c                 3   rD  r   )r(  r   rF  r   r   r   o  rG  z,FunctionOfExponentialTest.<locals>.<genexpr>)r   r  r>  r?  rE  r)   r'  FunctionOfExponentialTestAuxr  r   r   r+  r(  r'  r)  r   r  r   rF  r   r(  \  s   
,r(  c              	   C   s  t d u r
| a |adS tt| t||d tt tt|d  }tt|r(dS ttt|dsJt|tt| t||d tt tt|d   rxt	| t r[| t k r[| a |ad| }tt|d| t
| a|dk rvttt|drvt adS tt
| a|dk rttt|drt adS )NTr   Fr   )r%  r&  rU  r  rU  r  r1  r   r   r  rX  r  )r?  exponr   r  r   r   r   r-  q  s(   ,Dr-  c                    sP   t | }t| |   fdd| D }dd |D }t|}|| }t|}|S )z8Calculates the standard deviation for a list of numbers.c                    s   g | ]}|  qS r   r   )r   r   meanr   r   r     r   zstdev.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r<  r   )r   r:  r   r   r   r     r   )r   sumr<   )r  	num_itemsdifferencessq_differencesssdvariancesdr   r/  r   stdev  s   r8  c                    s  ddl m} | ttttttst	|}| |krdS t
| t
|kr$dS || ||kr.dS | trItt| dd} t
| t
t|ddkrIdS | | }|r|j}	g }
z2tddD ]}tdd  fdd	|	D }|
tt||  qZt|
td
dk rW dS W n   Y ||}|r|j}	g }
z2tddD ]}tdd  fdd	|	D }|
tt||  qt|
td
dk rW dS W n   Y t||}|dks||sdS |r|dkrdS t|dkrdS |r| }t|dks||sdS dS )Nr   )r   T)forcer  r   (   c                       i | ]}| qS r   r   r   r  rand_xr   r   
<dictcomp>  r  zrubi_test.<locals>.<dictcomp>
   c                    r;  r   r   r<  r=  r   r   r?    r  F)sympy.simplify.simplifyr   r   rH   rI   rG   r7   r6   r5   process_trigr}   r  r   rz   r  r{  r   r  r  absr   rA  r8  r   diffr   r   )r   r   optimal_outputr   _hyper_check_diff
_numericalr   r   r   rand_valr   substitutionsdresr|  r  r   r=  r   	rubi_test  sl   



rM  c                 C   s   | r|S |S r   r   )condr  r   r   r   r   r    s   r  c                 C   s   t |plt|pltd| d| plt|d| plt||tdd  olt|d |d  || | |  |d |d   d|  | |d   plt|d |d  || | |  d|d  |d   d|  | |d   S )Nr<  r  r   r  	   )r	  r  r  r   r   )r   r"  r\  r:  r  r@  r  r   r   r   r   IntQuadraticQ  s   rP  c               
   G   s   t | dkrl| \}}}}}}}}t||pkt|pkt|pkt|d s)t|d r7t|d| pktd| |pkt|d oktd| d| pktd| |rYt|| d| |  pkt|d| oktd| | ||  S t | dkr| \}}}}}	}}td| pt|	d | | pt|d st|d rtd|	 d| pt|d otd| ot|	pt|	| S t | dkr| \
}}}}}
}	}}}}t||pt|pt|pt|d rt|	rtd| d| pt|d ot|	|d| pt|	d| |S d S )	N   r<  r  r     r   r  r@  )r   r  r  r   r	  )r   r   r"  r\  r:  rA  r  r8  r   r@  r  r   r   r   IntBinomialQ  s   vlrS  c               
   G   s  t | dkr| \}}}}}t|}t|}t|s*t|rQtdd |jD rQt|s>t|rQtdd |jD rQ|t }|t }	t|	rUt|| | | |S t	t||	|  }
||
 }|	|
 }	t
ttt|rt| ttt||
 d |	d  t||
 d |	d  td|   td||
  |	 td|   | d t| ttt||
 d |	d  t||
 d |	d  td|   td||
  |	 td|   | d  S t| ttt||
 d td||
  |	 t| t|  t||
 d |	d  t|d   | d t| ttt||
 d td||
  |	 t| t|  t||
 d |	d  t|d   | d  S t|rat|| | | |S t
ttt|r|t|| |ttd| | td|  d|d  |d  td|   |d d| d  d|d  |d  td|   d| | td|      S |t|| |ttt|| d| | t|d   d|d  |d  t| t|  |d|  d|d  |d  t|d   d| | t| t|     S | \}}}}t|}t|s/t|rtdd |jD r|t }t|rAt|| | |S t|d rst
ttt|rat| ttd|  d S t| tdt| t|  d S t	|}
||
 }t| tt|
t| |t|  | d t| tt|
t| |t|  | d  S t|rt|| | |S t|d r|t|| S t
ttt|rtd| d|  }t|}t	|}|t|| |tt|td|  ||td|      fS t|d r;td|d  }t|}t	|}|t|| |tt|t| t| ||t|d      fS t|d|  }t|}t	|}|t|| |tt|t| t| ||t|d      S )Nr  c                 s   r   r   r  r   r   r   r   r     r   z!RectifyTangent.<locals>.<genexpr>r<  r  r   c                 s   r   r   rT  r   r   r   r   r     r   )r   r  r  r&  r   r   r   r   RectifyTangentr  r  rX  r  r  rD  r   r  r  SimplifyAntiderivativerh  r*  rE   rD   r   rk  r  rZ  r   r   r   r   r"  r|  r   r  r  r\  r:  r  r  numrdenrr   r   r   rU    sf   P
*
$\
@DBrU  c               
   G   sj  t | dkr| \}}}}}t|}t|}t|s*t|rQtdd |jD rQt|s>t|rQtdd |jD rQ|t }|t }	t|	rUt|| | | |S t	t||	|  }
||
 }|	|
 }	t
ttt|rt| ttt||
 d |	d  t||
 d |	d  td|   td||
  |	 td|   | d t| ttt||
 d |	d  t||
 d |	d  td|   td||
  |	 td|   | d  S t| ttt||
 d t||
 d |	d  t|d   td||
  |	 t| t|  | d t| ttt||
 d t||
 d |	d  t|d   td||
  |	 t| t|  | d  S t|rat|| | | |S t
ttt|r| t|| |ttd| | td|  d|d  |d  td|   |d d| d  d|d  |d  td|   d| | td|      S | t|| |ttt|| d| | t|d   d|d  |d  t| t|  |d|  d|d  |d  t|d   d| | t| t|     S | \}}}}t|}t|s1t|rtdd |jD r|t }t|rCt|| | |S t|d rwt
ttt|rdt | ttd|  d S t | tdt| t|  d S t	|}
||
 }t | tt|t| |
t|  | d t| tt|t| |
t|  | d  S t|rt|| | |S t|d r|t|| S t
ttt|rt|d }t|}t	|}|t|| |tt|t| t| ||t|d      S t|d|  }t|}t	|}|t|| |tt|t| t| ||t|d      S )Nr  c                 s   r   r   rT  r   r   r   r   r   3  r   z#RectifyCotangent.<locals>.<genexpr>r<  r  r   c                 s   r   r   rT  r   r   r   r   r   F  r   )r   r  r  r&  r   r   r   r   rU  r  r  rX  r  r  rD  r   r  r  RectifyCotangentrV  rh  r*  rD   rE   r   rk  r  rZ  rW  r   r   r   rZ  -  s\   P
*
&^
BBrZ  c                  G   s\   | dd d }| dd d }g }t dt|D ]}||| || ||d   qt|S r  )r{  r   r  r   )r   r   r  r|  r   r   r   r   
Inequality_  s   "r[  c                 C   s   |r| S t d)NzIn Condition())r}  )r|  r\  r   r   r   	Conditiong  s   r\  c                 C   s   t | } tt| |S r   )r   rc  SimpHelpr  r   r   r   rm  n  s   rm  c                    sX  t | r| S t|  rt| }t|t| kr|S | S t| rlt|  }t|  }t|tt| d    d  }t|rLt	 fdd|j
D  }nt| }t|}t||}t|rjt	 fdd|j
D  S |S t| rt}td gd}td dgd}td	 ddgd}|||  |   }| |}	d
}
|	rt|	| d tdd rd}
|
r| S t|  rt|  dkrtt|  d S t|  rt|  dkrt|  ddkrtt|  d   S d}d}| j
D ]}t| r|| }q|| }qt|}t|rt fdd|j
D  }|| S t| }|| S | j fdd| j
D  S )Nr<  c                    r  r   r]  r   rF  r   r   r     r  zSimpHelp.<locals>.<listcomp>c                    r  r   )SimpFixFactorr   rF  r   r   r     r  r   rG  r"  r   rA  Fr  r      Tc                    r  r   r^  r   rF  r   r   r     r  c                    r  r   r^  r   rF  r   r   r     r  )r  r   ri  r  r&  r=  r?  r  r  r   r   r]  r"  r)  r+  r   r   r  r  r   r  r  rU  r   r;  )r   r   r  r  PirN  rO  rK  r3  r  r@  r   r   rF  r   r]  r  sb   


$



(





r]  c                 C   sj   t |r+| t|rt|t|gS t| t|}t|rdS |d t||d  gS | |r3|dgS dS r  )r&  r'  r)  r
  r  r;  r   r  r   r   r   r
    s   r
  c                 C   s   t |r1tt| t|r| t|t|gS t| t|}t|r%dS |d t||d  gS tt| |r?| |dgS dS r  )r+  r  r  r'  r)  r  rb  r   r   r   r    s   r  c                  G   s  t | dkr| \}}}}t|t||| |S | \}}}t|r&t|||S ttt||dr>tt||||t|| S t	|rSt
||td|d  |jd |S t|rht
|td|d  ||jd |S t|rt
||td|d   dtd|d   |jd |S t|rt
|dtd|d   |td|d   |jd |S t|rt
|dtd|d   d| |jd |S t|rt
|d| dtd|d   |jd |S t|rt||td|d  |jd |S t|rt|td|d  ||jd |S t|r#t||td|d   dtd|d   |jd |S t|rCt|dtd|d   |td|d   |jd |S t|r]t|dtd|d   d| |jd |S t|rwt|d| dtd|d   |jd |S t|||S )Nr  r   r<  r   rW  )r   rf  SubstForr  r8  r  r  r=  r?  r  r  rL  r   r  r  r  r  r  r  r  r  r  r  r  r  SubstForAux)r   r  r  r   r   r   r   r   rc    sB   
""66**"
"
6
6
*
*rc  c                    s>  |  krS t | r&t r$t jr$t|  j r$td j  S | S t| rct| jrbt| j  r<| j S t rXt jrXt| j j rXt| j j  S t| j | j S n.t| rt	t
t| drt| tt|   S t| rt rtt| t S | j fdd| jD  S )Nr   c                    rB  r   )rd  r   r  r   r   r     r!  zSubstForAux.<locals>.<listcomp>)r  r>  r   r)   r   r?  r   rd  r&  r  r  r=  r?  r'  r;  r   r  r   r  r   rd    s*   
rd  c                 C   r   r   )rO   rF  r   r   r   FresnelS
  r   re  c                 C   r   r   )rN   rF  r   r   r   FresnelC  r   rf  c                 C   r   r   )rM   rF  r   r   r   Erf  r   rg  c                 C   r   r   )rP   rF  r   r   r   Erfc  r   rh  c                 C   r   r   )rQ   rF  r   r   r   Erfi  r   ri  c                   @      e Zd Zedd ZdS )Gammac                 G   sJ   |d }t |dkrt|S |d }t|rt|s|dkr#t||S d S r  )r   rZ   rQ  r]   )r   r   r   r"  r   r   r   r     s   
z
Gamma.evalNr   r   r   r   r   r   r   r   r   rk        rk  c                 C   s0   t | d |rt| |rtt | d ||rdS dS r  )r  r  rX  r  r   r   r   FunctionOfTrigOfLinearQ$  s   (rn  c                 C   s^   t | rdS t| st| st| st| st| st| r-| jD ]	}t|s* dS q!dS dS r  )	r  r+  r&  r>  r  r  r  r   r  )r   r   r   r   r   r  ,  s   0
r  c                 C   s   | t |  S r   )r   r!  r   r   r   Complex9  r   ro  c                 C   r$  r   r   r!  r   r   r   r  <  r   r  c                  C   s.  t  } tttttttdtt	dtdtttdt
t	dtdt	dtdttdd }t|dd }| | tttttttdt
t	dtdtttdtt	dtdtttdtt	d	tdt	dtdttd
d }t|dd }| | tttttt	dtdttttt	dtdttt	dtdt	dtdttdd tdd tdd tdd tdd tdd tdd }t|dd }| | ttttt	dtdtt	dtdtttttt	dtdt	dtdttdd tdd tdd tdd tdd tdd tdd }t|dd }| | tttttt	dtdttt	dtdtt	dtdttt	dtdttt	dtdt	dtdttdd td d td!d td"d td#d td$d td%d }	t|	d&d }
| |
 tttttt	dtdttt	dtdtt	dtdttt	dtdttt	dtdt	dtdttd'd td(d td)d td*d td+d td,d td-d }t|d.d }| | | S )/Nr   r   r   r"  r  c                 S   r   r   r
  r  r   r   r   r  C  r  z _SimpFixFactor.<locals>.<lambda>c              	   S   s.   t tt|tttt ||t | |||S r   r   r   r   r_  r   )r"  r\  r   r   r  r:  r   r   r   r  D  s   . r\  c                 S   r   r   r
  rp  r   r   r   r  G  r  c              
   S   s6   t tt|tttt ||t | |t ||||S r   rq  )r"  r\  r   r   r   r  r  r:  r   r   r   r  H     6 rA  c                 S   r   r   r  r   r   r   r   r   r  K  r  c                 S   r   r   r  r"  r   r   r   r   r  K  r  c                 S   r   r   r  r\  r   r   r   r   r  K  r  c                 S   r   r   r  rA  r  r   r   r   r  K  r  c                 S   r   r   r  r\  r   r   r   r  K  r  c                 S   r   r   r  r|  r   r   r   r  K  r  c                 S      t | tdS r   r  r   rz  r   r   r   r  K  r  c                 S   sJ   t t|t ||ttt|t t | tt||tdt||||S r  r   r   r_  r   r   r"  r\  r|  rA  r   r   r  r   r   r   r  L     J c                 S   r   r   r  rs  r   r   r   r  O  r  c                 S   r   r   r  rt  r   r   r   r  O  r  c                 S   r   r   r  ru  r   r   r   r  O  r  c                 S   r   r   rv  rw  r   r   r   r  O  r  c                 S   r   r   rx  ry  r   r   r   r  O  r  c                 S   r   r   r  rz  r   r   r   r  O  r  c                 S   r{  r   r|  rz  r   r   r   r  O  r  c                 S   sJ   t t|t ||tttt |tt||tdt | t||||S r  r}  r~  r   r   r   r  P  r  r  r|  c                 S   r   r   r  rs  r   r   r   r  S  r  c                 S   r   r   r  rt  r   r   r   r  S  r  c                 S   r   r   r  ru  r   r   r   r  S  r  c                 S   r   r   rv  rw  r   r   r   r  S  r  c                 S   
   t || S r   r  r|  r  r   r   r   r  S  r  c                 S      t tdt|t| S r   r[  r   r  r  r  r   r   r   r  S  r   c                 S      t t|t|| tdS r  r  r   r   r   )r  r\  r  r   r   r   r  S  r  c                 S   sL   t t|t ||ttt|t | t|t|t td|t||||S r  r}  r"  r\  r|  rA  r   r   r  r  r   r   r   r  T  s   L c                 S   r   r   r  rs  r   r   r   r  W  r  c                 S   r   r   r  rt  r   r   r   r  W  r  c                 S   r   r   r  ru  r   r   r   r  W  r  c                 S   r   r   rv  rw  r   r   r   r  W  r  c                 S   r  r   r  r  r   r   r   r  W  r  c                 S      t td|| S r   r|  )r  r|  r   r   r   r  W  r  c                 S   r  r  r  )r  r\  r|  r   r   r   r  W  r  c                 S   sP   t t|t ||tttt |t|t|t td|t | t||||S r  r}  r  r   r   r   r  X     P )r   r   r   r   r   r   ro  r   rP  r   rQ  r  r   r   addrR  rS  r  replacerr  r  r  r  r  rule3r  rule4pattern5rule5pattern6rule6r   r   r   _SimpFixFactor?  s(   b
~




r  c                 C   "   t t| |}t|tr| S |S r   )SimpFixFactor_replacerr   r   r   r   r   r|  r   r   r   r_  ]     
r_  c                     sH  t  dd } t| }dd }t|}dd }t|}dd }t|}d	d
 }t|}	dd }
t|
}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd  }t|}d!d" } t| }!d#d$ }"t|"}#d%d& }$t|$}%d'd( }&t|&}'d)d* }(t|(})d+d, }*t|*}+d-d. },t|,}-d/d0 }.t|.}/d1d2 }0t|0}1d3d4 }2t|2}3d5d6 }4t|4}5d7d8 }6t|6}7d9d: }8t|8}9d;d< }:t|:};d=d> }<t|<}=d?d@ }>t|>}?dAdB }@t|@}AdCdD }Bt|B}CdEdF }Dt|D}EdGdH }Ft|F}GtttttdIttdJtdK  tdLtdK ttdIt	 tdMtdK |}HdNdO }It
|H|I}JdPdQ }KttttdRtdK tt  tdStdK ||||	||t|K}LdTdU }Mt
|L|M}NdVdW }OttttdRtdK tt  tdStdK ||||||t|O}PdXdY }Qt
|P|Q}RdZd[ }SttttdRtdK tt  tdStdK ||||	||t|S}Td\d] }Ut
|T|U}Vd^d_ }WttttdRtdK tt  tdStdK ||||||t|W}Xd`da }Yt
|X|Y}Zdbdc }[ttt	t tt tdJtdK t tddtdK  tdStdK ||||t|[}\dedf }]t
|\|]}^ttt	tdRtdK t	t tdMtdK ttddtdK tdJtdK   tdStdK |||||!}_dgdh }`t
|_|`}a fdidj}bttt	t tdRtdK tt t  tdStdK ||#|%t|b}cdkdl }dt
|c|d}ettt	tdRtdK tdMtdK t	tdLtdK tdJtdK  tdmtdK tdStdK |'|)|+|-}fdndo }gt
|f|g}httt	tdRtdK tdMtdK t	tdLtdK tdJtdK  t	tddtdK tdptdK  tdmtdK tdStdK |'|)|/|1}idqdr }jt
|i|j}kttt	tdRtdK tdMtdK t	tdLtdK tdJtdK  t	tddtdK tdptdK  t	tdstdK tdttdK  tdmtdK tdStdK |'|)|/|3}ldudv }mt
|l|m}ntttttdwtdK tttdxtdK  tttdytdK  tttdztdK  tdMtdI tdStdK }od{d| }pt
|o|p}qtttttdwtdK tttdxtdK  tttdztdK  tdMtdI tdStdK }rd}d~ }st
|r|s}ttttttdwtdK tttdztdK  tdMtdI tdStdK }udd }vt
|u|v}wtttt tt  tdMtdK ||5||7|9}xdd }yt
|x|y}ztttt ttdLtdK  tdMtdK ||5|;|=}{dd }|t
|{||}}ttttdLtdK ttddtdK  t  tdMtdK ||5|?|A}~dd }t
|~|}ttttdLtdK ttddtdK  t  tdMtdK ||5|C|=}dd }t
||}ttt	t tdRtdK t	t tdRtdK  tdMtdK ||E|G}dd }t
||}tttdt ttd t td   tdRtdK tdMtdK |}dd }t
||}tttdt ttdt td   tdRtdK tdMtdK |}dd }t
||}ttt}dd }t
||}|J|N|R|V|Z|^|a|e|h|k|n|q|t|w|z|}||||||gS )Nc                 S   r   r   )r  r  r   r   r   r  g  r   z_FixSimplify.<locals>.cons_f1c                 S   r   r   r  rL  r   r   r   r  k  r   z_FixSimplify.<locals>.cons_f2c                 S   r   r   r  r  r   r   r   cons_f3o  r   z_FixSimplify.<locals>.cons_f3c                 S   r   r   rB  r   r   r   r   cons_f4s  r   z_FixSimplify.<locals>.cons_f4c                 S   r   r   r  r  r   r   r   cons_f5w  r   z_FixSimplify.<locals>.cons_f5c                 S   r   r   r   r   r   r   r   cons_f6{  r   z_FixSimplify.<locals>.cons_f6c                 S   r   r   r  r  r   r   r   cons_f7  r   z_FixSimplify.<locals>.cons_f7c                 S   s   t td|  S r  )rB  r   r  r   r   r   cons_f8  r  z_FixSimplify.<locals>.cons_f8c                 S   r   r   r
  rL  r   r   r   cons_f9  r   z_FixSimplify.<locals>.cons_f9c                 S   r   r   )r   r   r   r   r   cons_f10  r   z_FixSimplify.<locals>.cons_f10c                 S   s   t |||| S r   r  )rA  r@  r   r"  r   r   r   cons_f11  r  z_FixSimplify.<locals>.cons_f11c                 S   r{  r   r  r   r   r   r   r   cons_f12  r  z_FixSimplify.<locals>.cons_f12c                 S   r{  r   r  r"  r   r   r   cons_f13  r  z_FixSimplify.<locals>.cons_f13c                 S   r   r   r  rp  r   r   r   cons_f14  r   z_FixSimplify.<locals>.cons_f14c                 S   r   r   r
  rp  r   r   r   cons_f15  r   z_FixSimplify.<locals>.cons_f15c                 S   s   t | |  tdS r   r  r  rA  r   r   r   cons_f16  r   z_FixSimplify.<locals>.cons_f16c                 S   s   t | | tdS r   r  r   r!  r   r   r   cons_f17  r  z_FixSimplify.<locals>.cons_f17c                 S   r  r   r  r	  r  r   r   r   cons_f18  r   z_FixSimplify.<locals>.cons_f18c                 S   s   t | | ||   S r   r   )r\  r   r"  r:  r   r   r   cons_f19  r  z_FixSimplify.<locals>.cons_f19c                 S   r  r   r  r1  r   r   r   r   cons_f20  r   z_FixSimplify.<locals>.cons_f20c                 S   r   r   r
  )r  r   r   r   cons_f21  r   z_FixSimplify.<locals>.cons_f21c                 S   r  r   r  rA  r@  r   r   r   cons_f22  r   z_FixSimplify.<locals>.cons_f22c                 S   r  r   r  r  r   r   r   cons_f23  r   z_FixSimplify.<locals>.cons_f23c                 S      t ||| S r   r  r  rA  r@  r   r   r   cons_f24  r   z_FixSimplify.<locals>.cons_f24c                 S   s   t tdt|t|t| S r   r  r  r   r   r   cons_f25  r:  z_FixSimplify.<locals>.cons_f25c              
   S   s   t tdt|t|t| t|	S r   r  )r  rA  r@  r8  r   r   r   cons_f26     z_FixSimplify.<locals>.cons_f26c                 S   r  r   r  r%  r   r   r   cons_f27  r   z_FixSimplify.<locals>.cons_f27c                 S   r{  r   r|  r  r   r   r   cons_f28  r  z_FixSimplify.<locals>.cons_f28c                 S   s   t |||    S r   r   )rA  r  r  r   r   r   cons_f29  r  z_FixSimplify.<locals>.cons_f29c                 S   r   r   r
  r  r   r   r   cons_f30  r   z_FixSimplify.<locals>.cons_f30c                 S   s   t ||  S r   r   r  r  r   r   r   cons_f31  r   z_FixSimplify.<locals>.cons_f31c                 S   s   t ||  S r   r
  r  r   r   r   cons_f32  r   z_FixSimplify.<locals>.cons_f32c                 S   s   t ||  S r   r   r  r   r   r   cons_f33  r   z_FixSimplify.<locals>.cons_f33c                 S   s   t |||  S r   rv  r  r   r   r   cons_f34  r  z_FixSimplify.<locals>.cons_f34c                 S   r   r   rx  r   r   r   r   cons_f35  r   z_FixSimplify.<locals>.cons_f35c                 S   r   r   rx  r  r   r   r   cons_f36  r   z_FixSimplify.<locals>.cons_f36r   r  r   rA  r   c                 S   sN   t d| t d t dd   | | t|| |tt dt d  |   S )NrW  r<  r   r   )r   rg  ro  )rA  r   r  r  r   r"  r   r   r   replacement1     Nz"_FixSimplify.<locals>.replacement1c                 S   s>   || t | |  ||t | |   }tt|t|rdS dS r  r  rf   r  rB  r@  rA  r   r  r  r   r   r   r   r    s   $z_FixSimplify.<locals>.With2r@  r  c                 S   s:   || t | |  ||t | |   }t||t | |  S r   r  rg  r  r   r   r   replacement2  s   $z"_FixSimplify.<locals>.replacement2c                 S   sB   || t | |   ||t | |    }tt|t|rdS dS r  r  r  r   r   r   With3  s   (z_FixSimplify.<locals>.With3c                 S   s@   || t | |   ||t | |    }t||t | |   S r   r  r  r   r   r   replacement3  s   (z"_FixSimplify.<locals>.replacement3c                 S   s@   ||t | |  | | t | |   }tt|t|rdS dS r  r  r  r   r   r   With4  s   &z_FixSimplify.<locals>.With4c                 S   s>   ||t | |  | | t | |   }t| |t | |  S r   r  r  r   r   r   replacement4  s   &z"_FixSimplify.<locals>.replacement4c                 S   sD   ||t | |   | | t | |    }tt|t|r dS dS r  r  r  r   r   r   With5  s   *z_FixSimplify.<locals>.With5c                 S   sD   ||t | |   | | t | |    }t| |t | |   S r   r  r  r   r   r   replacement5  s   *z"_FixSimplify.<locals>.replacement5c           	      S   s$   |||   ||  }t |rdS dS r  r  	r  r@  rA  r   r  r  r   r"  r\  r   r   r   With6#  s   z_FixSimplify.<locals>.With6r  c           	      S   s8   |||   ||  }t ||||   | ||  |   S r   rg  r  r   r   r   replacement6)  s   $z"_FixSimplify.<locals>.replacement6c                 S   s6   t |||  | td|  || |    | |  S r  rg  r   )r  r@  rA  r   r  r  r   r"  r   r   r   replacement7.  s   6z"_FixSimplify.<locals>.replacement7c                    s   || }t | rdS dS r  r  r@  r:  rA  r  r\  r   r"  r8  Plusr   r   With81  s   
z_FixSimplify.<locals>.With8c                 S   s(   || }t ||  | || | |   S r   r  r  r   r   r   replacement87  s    z"_FixSimplify.<locals>.replacement8r  c                 S   s.   t || |  | ||  |  | | |  S r   r  )r@  rA  r   r  r  r   r  r   r   r   replacement9<     .z"_FixSimplify.<locals>.replacement9r   c	           	      S   s@   t |||  | || |  | || |   |  | |  S r   r  )	r  r@  rA  r   r  r  r   r   r  r   r   r   replacement10@  rC  z#_FixSimplify.<locals>.replacement10r8  r7  c                 S   sR   t |||
  | || |  | || |   |  || |  |	  | |
  S r   r  )r  r@  rA  r   r8  r  r  r   r   r7  r  r   r   r   replacement11D     Rz#_FixSimplify.<locals>.replacement11r"  r\  r:  r   c                 S   s(   t ||t|t || | |     S r   rg  r<   )r:  r   r  r  r\  r   r"  r   r   r   replacement12H  s   (z#_FixSimplify.<locals>.replacement12c                 S   s$   t || t|t || |    S r   r  )r   r  r  r\  r   r"  r   r   r   replacement13L  s   $z#_FixSimplify.<locals>.replacement13c                 S   s    t || t|t ||    S r   r  )r   r  r  r   r"  r   r   r   replacement14P      z#_FixSimplify.<locals>.replacement14c                 S   s   t ||| td    S r  r  r@  rA  r   r  r  r   r   r   replacement15T     z#_FixSimplify.<locals>.replacement15c                 S   s    t d| t||| |    S r  r   rg  r  r   r   r   replacement16X  r  z#_FixSimplify.<locals>.replacement16c                 S   s.   t d||   t|||   |||      S r  r  r  r@  rA  r   r  r  r   r   r   replacement17\  r  z#_FixSimplify.<locals>.replacement17c                 S   s2   t d|||    t|||   |||      S r  r  r  r   r   r   replacement18`  s   2z#_FixSimplify.<locals>.replacement18c                 S   s    ||t d |t d  |   S r  r   )r@  r   r   r"  r   r   r   replacement19d  r  z#_FixSimplify.<locals>.replacement19i     i  c                 S   4   |t ttd  tt t  tttd   |   S r  r   r  r   r"  r:  r\  r@  r   r   r   r   replacement20h  r  z#_FixSimplify.<locals>.replacement20ic                 S   r  r  r  r  r   r   r   replacement21l  r  z#_FixSimplify.<locals>.replacement21c                 S   r  r   r   r   r   r   r   replacement22p  rm  z#_FixSimplify.<locals>.replacement22)r   r   r   r   r  ro  r   rO  r   rN  r   rJ  rL  rK  rk  rP  rQ  r<   r\  r  )r  r  r  r  r  cons3r  cons4r  cons5r  cons6r  cons7r  cons8r  cons9r  cons10r  cons11r  cons12r  cons13r  cons14r  cons15r  cons16r  cons17r  cons18r  cons19r  cons20r  cons21r  cons22r  cons23r  cons24r  cons25r  cons26r  cons27r  cons28r  cons29r  cons30r  cons31r  cons32r  cons33r  cons34r  cons35r  cons36r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  pattern7r  rule7r  pattern8r  rule8pattern9r  rule9	pattern10r  rule10	pattern11r  rule11	pattern12r  rule12	pattern13r  rule13	pattern14r  rule14	pattern15r  rule15	pattern16r  rule16	pattern17r  rule17	pattern18r  rule18	pattern19r  rule19	pattern20r  rule20	pattern21r  rule21	pattern22r  rule22r   r  r   _FixSimplifyd  s$  T
B
B
B
B
T
h
D
l


|
f
P
0
8
H
H
H
L
J

0r;  c                 C   s,   t | tttfrdd | D S tt| tS )Nc                 S   s   g | ]	}t t|tqS r   )r   r   FixSimplify_rulesr   r   r   r   r   x  r  zFixSimplify.<locals>.<listcomp>)r   r   r2  r`   r   r   r<  r   r   r   r   rg  u  s   rg  c                  C   sj  t  } tttttttttdtdt	t
ttdtdtdtdtttttdtdtdtdttdd	 td
d	 tdd	 tdd	 tdd	 tdd	 }t|dd	 }| | tttttttt	tttdtdtdtdttdtdtttttdtdtdtdttdd	 tdd	 tdd	 tdd	 tdd	 tdd	 }t|dd	 }| | tttttttttdtdt	t
ttdtdtdtdttttttdtdt	t
ttdtdtdtdtdtdttdd	 tdd	 tdd	 tdd	 tdd	 tdd	 tdd	 tdd	 	}t|d d	 }| | tttttttt	tttdtdtdtdttdtdttttt	tttdtdtdtdttdtdtdtdttd!d	 td"d	 td#d	 td$d	 td%d	 td&d	 td'd	 td(d	 	}t|d)d	 }| | tttttttttdtdt	t
ttdtdtdtdttttttdtdt	t
ttdtdtdtdttttttd*tdt	t
ttdtdtd+tdtdtdttd,d	 td-d	 td.d	 td/d	 td0d	 td1d	 td2d	 td3d	 td4d	 td5d	 td6d	 }	t|	d7d	 }
| |
 tttttttt	tttdtdtdtdttdtdttttt	tttdtdtdtdttdtdttttt	tttdtdtd*tdttd+tdtdtdttd8d	 td9d	 td:d	 td;d	 td<d	 td=d	 td>d	 td?d	 td@d	 tdAd	 tdBd	 }t|dCd	 }| | | S )DNr"  r   rA  r  r  r  r   c                 S   r   r   r  rs  r   r   r   r    r  z,_SimplifyAntiderivativeSum.<locals>.<lambda>c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  r  r   r   r   r   r    r  c                 S   r   r   r  r  r   r   r   r   r    r  c                 S   r   r   r
  r  r   r   r   r    r  c                 S      t tt||ttd| S r  r   r   r   r   r  r  rA  r   r   r   r        c                 S   sF   t t||t|ttt t|tt|| t|tt|| |S r   r   SimplifyAntiderivativeSumr   r  rD  r   r  r  )rA  r   r  r"  r  r  r   r   r   r   r   r       F c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  r=  r   r   r   r    r  c                 S   r   r   r  r>  r   r   r   r    r  c                 S   r   r   r
  r  r   r   r   r    r  c                 S   r?  r  r@  rA  r   r   r   r    rB  c                 S   sF   t t||t|ttt t|tt|| t|tt|| |S r   )r   rD  r   r  rD  r   r  r  )rA  r   r  r"  r  r  r   r   r   r   r   r    rE  r:  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   r  r:  r   r   r   r   r    r  c                 S   r   r   r  r=  r   r   r   r    r  c                 S   r   r   r  r>  r   r   r   r    r  c                 S   r   r   r
  r  r   r   r   r    r  c                 S      t t|| S r   r   r   r  r  r   r   r   r    r  c
           
      S   s~   t t||t|ttt t|	tt|| t|tt|| |t|ttt t|tt|| t|tt|| |S r   rC  )
rA  r   r  r"  r  r  r   r\  r:  r   r   r   r   r       ~ c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   r  rF  r   r   r   r    r  c                 S   r   r   r  r=  r   r   r   r    r  c                 S   r   r   r  r>  r   r   r   r    r  c                 S   r   r   r
  r  r   r   r   r    r  c                 S   rG  r   rH  rI  r   r   r   r    r  c
           
      S   s~   t t||t|ttt t|tt|	| t|tt|	| |t|ttt t|tt|	| t|tt|	| |S r   rC  )
rA  r   r  r"  r  r  r\  r   r:  r   r   r   r   r    rJ  r   r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   r  rF  r   r   r   r    r  c                 S   r   r   r  r  r   r   r   r   r    r  c                 S   r   r   r  r   r   r   r   r   r    r  c                 S   r   r   r  r=  r   r   r   r    r  c                 S   r   r   r  r>  r   r   r   r    r  c                 S   r   r   r  r  r   r   r   r   r    r  c                 S   r   r   r
  r  r   r   r   r    r  c                 S      t t|| |S r   rH  r  r  r  r   r   r   r    r  c                 S   s   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|| |S r   rC  )rA  r  r   r  r"  r  r  r   r\  r   r:  r   r  r   r   r   r        c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   r  rF  r   r   r   r    r  c                 S   r   r   r  rK  r   r   r   r    r  c                 S   r   r   r  rL  r   r   r   r    r  c                 S   r   r   r  r=  r   r   r   r    r  c                 S   r   r   r  r>  r   r   r   r    r  c                 S   r   r   r  rM  r   r   r   r    r  c                 S   r   r   r
  r  r   r   r   r    r  c                 S   rN  r   rH  rO  r   r   r   r    r  c                 S   s   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|| |S r   rC  )rA  r  r   r  r"  r  r  r\  r   r   r:  r   r  r   r   r   r    rP  )r   r   r   r   r   r  rN  r   r   r   r  rJ  r  r  r   r   r  r  r  rP  rR  r  r   r   r   _SimplifyAntiderivativeSum{  s,   



L 
L 
rQ  c                 C   r  r   )"SimplifyAntiderivativeSum_replacerr   r   r   r  r   r   r   rD    r  rD  c            9      C   s
  t  } ttttttttdd }t	|dd }| 
| ttttttttdd }t	|dd }| 
| ttttttttdd }t	|dd }| 
| tttttttdtd	ttttd
d tdd tdd }t	|dd }| 
| ttttttttdtd	tttdd tdd tdd }	t	|	dd }
| 
|
 tttttdtd	ttttdd tdd tdd }t	|dd }| 
| tttttdtd	ttttdd tdd tdd }t	|dd }| 
| tttttdtd	ttttdd tdd }t	|dd }| 
| tttttdtd	ttttdd tdd td d }t	|d!d }| 
| tttttdtd	ttttd"d td#d td$d }t	|d%d }| 
| tttttt}t	|d&d }| 
| tttttt}t	|d'd }| 
| tttttttdtd	ttd(d td)d td*d }t	|d+d }| 
| tttttttdtd	ttd,d td-d td.d }t	|d/d }| 
| tttttttdtd	ttd0d td1d }t	|d2d }| 
| tttttttdtd	ttd3d td4d td5d }t	|d6d } | 
|  tttttttdtd	ttd7d td8d td9d }!t	|!d:d }"| 
|" tttttt}#t	|#d;d }$| 
|$ tttttttdtd	ttd<d td=d }%t	|%d>d }&| 
|& tttttt}'t	|'d?d }(| 
|( tttttd@td	ttttdtd	ttttdAd tdBd tdCd tdDd tdEd tdFd })t	|)dGd }*| 
|* tttttd@td	ttttdtd	ttttdHd tdId tdJd tdKd tdLd tdMd }+t	|+dNd },| 
|, tttttd@td	tttttdtd	tttdOd tdPd tdQd tdRd tdSd tdTd }-t	|-dUd }.| 
|. tttttd@td	tttttdtd	tttdVd tdWd tdXd tdYd tdZd td[d }/t	|/d\d }0| 
|0 tttttdtd]ttdtd	ttttd@td	ttttd^ttd_d td`d tdad tdbd }1t	|1dcd }2| 
|2 tttttdtd]ttdtd	ttddtd]ttdetd	ttttd@td	tttdftd]ttdgtd	tttd^ttdhd tdid tdjd tdkd }3t	|3dld }4| 
|4 tttttdtd]ttd@td	ttttd^ttdmd tdnd tdod }5t	|5dpd }6| 
|6 tttttdtd]ttd@td	tttdftd]ttdgtd	tttd^ttdqd tdrd tdsd }7t	|7dtd }8| 
|8 | S )uNc                 S   r   r   r  ru  r   r   r   r    r  z)_SimplifyAntiderivative.<locals>.<lambda>c                 S   s   t t|| S r   )rV  r  )r   r\  r   r   r   r   r    r  c                 S   r   r   r  rA  r   r   r   r   r    r  c                 S   s   t |tt|| S r   )r   rV  r  )r   rA  r   r   r   r   r    r   c                 S   r   r   r  rL  r   r   r   r    r  c                 S   s   t t|t|| S r   )r   r  rV  )r   r   r   r   r   r   r    r   r"  r   c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   "   t tt|tdt| tdS r  r   r   r   r   r"  r   r   r   r   r    r  c                 S   s>   t tt|t|tdt|| ttdttt|| S r  )r   r   r   r   rV  r  r  r   r"  r   r   r   r   r   r    s   > c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   rT  r  rU  rV  r   r   r   r    r  c                 S   sH   t ttttd|t|tdt|| ttdttt|| S r  )r   r   r   r   rV  r  r  rW  r   r   r   r    s   H r   c                 S   r   r   r  rs  r   r   r   r    r  c                 S      t t| tdS r  r   r   r   r   r   r   r   r    r  c                 S   r   r   r  r   r   r   r   r    r  c                 S      t ||td| S r  rU  r   r   r   r   r   r   r   r    r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   rX  r  rY  r   r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   r[  r  r\  r]  r   r   r   r    r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   s"   t tdttt |t|| S r  )r   r   rV  rh  rt  r]  r   r   r   r    r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   rX  r  rY  r   r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S      t |tt|ttdt| S r  rU  r   r   r   r]  r   r   r   r    rB  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   rX  r  rY  r   r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   r^  r  r_  r]  r   r   r   r    rB  c                 S   r  r   rV  r   r   r   r   r   r    r  c                 S   r  r   r`  ra  r   r   r   r    r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   rX  r  rY  r   r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   r[  r  rZ  r   r]  r   r   r   r    r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   rX  r  rY  r   r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   r[  r  rb  r]  r   r   r   r    r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c              
   S   s,   t tdttt t|t|td| S r  )r   r   rV  rh  rt  r   r]  r   r   r   r       , c                 S   r   r   r  rs  r   r   r   r    r  c                 S   rX  r  rY  r   r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S      t |tt|t| S r   rZ  r   r   r]  r   r   r   r    r   c                 S   r   r   r  rs  r   r   r   r    r  c                 S   rX  r  rY  r   r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   rd  r   re  r]  r   r   r   r    r   c                 S   r  r   r`  ra  r   r   r   r    r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   s"   t ttt|t|td| S r  )rV  rk  r   rt  r   r   r]  r   r   r   r    r  c                 S   r  r   r`  ra  r   r   r   r    r  r\  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   rT  r  r   r   r   r   r\  r   r   r   r   r    r  c                 S   rT  r  rf  r\  r"  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S       t |t||t||td| S r  )rU  r   r   r   r   r"  r   r\  r   r   r   r    rN  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   rT  r  rf  rg  r   r   r   r    r  c                 S   rT  r  rf  rh  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   *   t |tt||tt||ttdt| S r  r_  rj  r   r   r   r       * c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   rT  r  rf  rg  r   r   r   r    r  c                 S   rT  r  rf  rh  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   ri  r  )rZ  r   r   rj  r   r   r   r    rN  c                 S   r   r   r  rs  r   r   r   r     r  c                 S   r   r   r  rt  r   r   r   r     r  c                 S   r   r   r  ru  r   r   r   r     r  c                 S   rT  r  rf  rg  r   r   r   r     r  c                 S   rT  r  rf  rh  r   r   r   r     r  c                 S   r   r   rZ  r   r   r   r   r     r  c                 S   rk  r  )rZ  r   r   r   rj  r   r   r   r    rl  r   r<  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   sl  t tttt|tttt||t	dtt|tt	d|t	dt
tt	d|t|ttt	d|tt||t	dtt|tt	d|t	dt
tt	d|t|ttt	d|t	dtttt|tt|tt	d|t	dtt
|t	dt|t
|t|tt|tt|tt	d|t	dtt
|t	dt|t
|t|t	dS Nr   r<  )r  r  rX  r  r  rh  r`  r   r   r   r  r  r   rj  r   r   r   r    s    n r:  r  r   r  c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  rt  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c	           	      S   st   t tt|t||t|t|tdttt||ttd|||t|t|t|tdtt|td| S r  rV  rh  r   r   r   r   r  )	r   r:  r   r  r   r"  r   r\  r  r   r   r   r  	  s   t c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   s  t tttt|tttt||t	dtt|tt	d|t	dt
tt	d|tt||t	dtt|tt	d|t	dt
tt	d|t	dtttt|tt|tt	d|t	dtt
|t	dtt|tt|tt	d|t	dtt
|t	dt	dS rm  )r  r  rX  r  r  rh  r`  r   r   r   r  r   )r   r\  r   r   r   r   r   r    s     c                 S   r   r   r  rs  r   r   r   r    r  c                 S   r   r   r  ru  r   r   r   r    r  c                 S   r   r   rZ  r   r   r   r   r    r  c                 S   s`   t tt|t|t|tdtttd|||t|t|t|tdtt|td| S r  rn  )r   r   r   r   r\  r  r   r   r   r    s   ` )r   r   r   r  r   rP  rJ  r  r   r   r  r   rK  rS  r   rN  r   r   r  r  rh  ri  rt  rk  rj  rx  )9r  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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  	pattern23rule23	pattern24rule24	pattern25rule25	pattern26rule26	pattern27rule27	pattern28rule28	pattern29rule29	pattern30rule30	pattern31rule31	pattern32rule32r   r   r   _SimplifyAntiderivative  s   "
"
"
J
J
D
D
:
D
D


D
D
:
D
D

:

x
x
x
x
~

^
~
r  c                    s  t t| }t|trt| rWtdtd} | jD ]}t|r) |9  q||9 }qt rV tdkrVt|}t	|rRt
|rRt fdd|jD  S  | S n t| rw| jd }tttttttgt|rwttd|  S ttttgt| rt| }| jd }tttttttgt|rt|d|  S tttgt| rt| }| jd }tttttttgt|rt|d| S | }t|rtdS t|rtt|jd S t	|rttfdd|jD  S |S |S )Nr   c                    rI  r   r   r   ry  r   r   r   $  r   z*SimplifyAntiderivative.<locals>.<listcomp>r   c                    r  r   r`  r   rF  r   r   r   :  r  )SimplifyAntiderivative_replacerr   r   r   r&  r   r   r   rV  r+  r5  r   r  r  rG   rI   rH   r5   r6   r7   r  r  r=   r@   r.   r/   rD  rD  )r   r   r|  r   r   r  r  r  r   ru  r   rV    sJ   









rV  c            =      C   s  t  } ttttdtdttttdtdtttdtdttdtdtttdtdt	t
dd t
d	d t
d
d t
dd }t|dd }| | ttttttttdtdtdtdtdttdtdttttdt
dd }t|dd }| | ttttdtdttdtdttttdttdtdttttdt
dd }t|dd }| | ttttttttdtdtdtttttdtdtdtdtdt
dd }t|dd }| | tttttttttdtdtdtdtdttdtdttttdt}	t|	dd }
| |
 ttttdtdtttdtdttttdt
dd }t|dd }| | ttttttttdtdtdtdtdtt
dd }t|dd }| | ttttdtdtttdtdttttdt
dd }t|dd }| | ttttttttdtdtdtdtdtt
dd }t|dd }| | ttttdtdtttdtdttttdt
d d }t|d!d }| | ttttttttdtdtdtdtdtt
d"d }t|d#d }| | ttttdtdttttttdtdttd$ttttdt
d%d }t|d&d }| | tttttttdtdtdtttttdtdtttd$t
d'd }t|d(d }| | ttttdtdttttdtdtttttdtdttttdtdtd$t
d)d t
d*d }t|d+d }| | tttttttdtdtdtdtttttttdtdtdtdttd$t
d,d t
d-d }t|d.d }| | ttttdtdttttdtdtttttdtdttttdtdtd$t
d/d t
d0d }t|d1d } | |  tttttttdtdtdtdtttttttdtdtdtdttd$t
d2d t
d3d }!t|!d4d }"| |" ttttdtdtttttdtdttttdtdtd$ttttdtdt
d5d t
d6d }#t|#d7d }$| |$ tttttttdtdtdtdtttttttdtdtdtdttd$t
d8d t
d9d }%t|%d:d }&| |& ttttdtdttttdtdttttdtdttdtdttttdtdtd;tdt
d<d }'t|'d=d }(| |( ttttttttttdtdtdtdtttttdtdtdtdtd;tdtdtdt
d>d })t|)d?d }*| |* ttttdtdttttdtdttttdtdttdtdttttdtdtd;tdt
d@d }+t|+dAd },| |, ttttttttttdtdtdtdtttttdtdtdtdtd;tdtdtdt
dBd }-t|-dCd }.| |. tttttttdtdtdtdtttdtdttdDtdttttdtdttdtdttttdtdtd;tdt
dEd }/t|/dFd }0| |0 ttttdtdttttdtdtttdtdttdDtdttttdtdttdtdttttdtdtd;tdt
dGd }1t|1dHd }2| |2 ttttttdtdtttttdtdtdtdtttttdtdtdDtdtd;tdtdtdttttdtdt
dId }3t|3dJd }4| |4 tttttttdtdtttdtdtttttdtdtdtdtttttdtdtdDtdtd;tdtdtdt
dKd }5t|5dLd }6| |6 ttttdtdtttttttdtdtdtdttdtdttttdtdtd;tdt
dMd }7t|7dNd }8| |8 ttttdtdtttttttdtdtdtdttdtdttttdtdtd;tdt
dOd }9t|9dPd }:| |: ttt};t|;dQd }<| |< | S )RNr   r   r   r@  r"  rA  c                 S   r   r   )r  r  r   r   r   r  C  r  z"_TrigSimplifyAux.<locals>.<lambda>c                 S   r   r   r
  rp  r   r   r   r  C  r  c                 S   r  r   r  r  r   r   r   r  C  r  c                 S   r  r   )r  r  r   r   r   r  C  r  c                 S   sD   t |t|t ||ttt|t |t|t| t td||S r  )r   r   r/  r   r   rA  r   r  r@  r   r  r"  r   r   r   r  D  s   D 2r  r   c                 S   r  r   r  rV  r   r   r   r  G  r  c                 S   
   t ||S r   r   r   r  r"  r   r   r   r   r  H  r  c                 S      t |ttd| S r  r  r   r   rV  r   r   r   r  K  r   c                 S   r  r   r   r  r   r   r   r  L  r  c                 S   r  r  r  rV  r   r   r   r  O  r   c                 S   r  r   r   r  r   r   r   r  P  r  c                 S   s6   t ttt|ttd|t t|td||| S )NrW  r  )r   r   r   r   r  rA  r   r   r  r"  r   r   r   r  T  rr  r  c                 S      t | ttd|S r  r  r  r   r   r   r  W  r   c                 S      t t| tt|td|S Nr  )r   r   r   r  r   r   r  r   r  r   r   r   r  X  rB  c                 S   r  r  r  r  r   r   r   r  [  r   c                 S      t t|tt| td|S r  )r   r   r   r  r   r   r  r  r   r   r   r   r  \  rB  c                 S   r   r   r  r  r   r   r   r  _  r  c                 S   r  r  )r   r   r   r  r   r  r   r   r   r  `  rB  c                 S   r   r   r  r  r   r   r   r  c  r  c                 S   r  r  )r   r   r   r  r   r  r   r   r   r  d  rB  c                 S   r  r  r  r  r   r   r   r  g  r   c                 S   s   t t|tt|td|S r  )r   r   r   r  r   r  r   r   r   r  h  rB  c                 S   r  r  r  r  r   r   r   r  k  r   c                 S   s   t t|tt| td|S r  )r   r   r   r  r   r  r   r   r   r  l  rB  rW  c              	   S   ,   t tt|tdttdt| tdS Nr  rW  r   r   r   r   r   rV  r   r   r   r  o  rc  c                 S   B   t | tt tdt|tdt tdt t|t|tdS Nr   rW  )r   r   r   r   r  r  r   r   r   r  p     B c              	   S   r  r  r  rV  r   r   r   r  s  rc  c                 S   r  r  )r   r   r   r   r  r  r   r   r   r  t  r  c                 S   r   r   r  r  r   r   r   r  w  r  c                 S   r   r   r5  r   r   r   r   r  w  r  c              
   S   *   t |tt|t |tt|| tdS r  )r   r   r   r  r   r  r   r   r   r  x  rl  c                 S   r   r   r  r  r   r   r   r  {  r  c                 S   r   r   r  r   r   r   r   r  {  r  c              
   S   r  r  )r   r   r   r  r   r  r   r   r   r  |  rl  c                 S   r   r   r  r  r   r   r   r    r  c                 S   r   r   r  r   r   r   r   r    r  c              
   S   r  r  )r   r   r   r  r   r  r   r   r   r    rl  c                 S   r   r   r  r  r   r   r   r    r  c                 S   r   r   r  r   r   r   r   r    r  c              
   S   r  r  )r   r   r   r  r   r  r   r   r   r    rl  c                 S   r   r   r  r  r   r   r   r    r  c                 S   r   r   r  r   r   r   r   r    r  c                 S   :   t |t tt|| tt|t |tt|| tdS r  )r   r   r  r   r  r   r  r   r   r   r       : c                 S   r   r   r  r  r   r   r   r    r  c                 S   r   r   r  r   r   r   r   r    r  c                 S   r  r  )r   r   r  r   r  r   r  r   r   r   r    r  r  c                 S   r   r   rv  rw  r   r   r   r    r  c                 S   8   t |tt|t | |tt|t |tt|| |S r   )r   r   r  r   r  rA  r   r  r   r  r"  r   r   r   r       8 c                 S   r   r   rv  rw  r   r   r   r    r  c                 S   r  r   )r   r   r  r   r  r  r   r   r   r    r  c                 S   r   r   rv  rw  r   r   r   r    r  c                 S   r  r   )r   r   r  r   r  r  r   r   r   r    r  c                 S   r   r   rv  rw  r   r   r   r    r  c                 S   r  r   )r   r   r  r   r  r  r   r   r   r    r  r\  c                 S      t || |S r   rv  rA  r  r@  r   r   r   r        c                 S   Z   t |tt|t|t tdt | |tt|t |tt|| t |tt|| |S r  )r   r   r  r   r   r  rA  r   r\  r  r@  r   r  r"  r   r   r   r       Z c                 S   r  r   rv  r  r   r   r   r    r  c                 S   P   t |tt|t|t | |tt|t |tt|| t |tt|| |S r   )r   r   r  r   r  r  r  r   r   r   r    r  c                 S   r  r   rv  r  r   r   r   r    r  c                 S   r  r  )r   r   r  r   r   r  r  r   r   r   r    r  c                 S   r  r   rv  r  r   r   r   r    r  c                 S   r  r   )r   r   r  r   r  r  r  r   r   r   r    r  c                 S   r  r   rv  r  r   r   r   r    r  c                 S      t ttt|| tdtt||t|tt|ttt|tdttt||td|t|ttt|t|tt|t|| ttt||td|S Nr  rW  )	r  re   r   r   r   r   r   r  r  r  r   r   r   r        c                 S   r  r   rv  r  r   r   r   r    r  c                 S   r  r  )	r  re   r   r   r   r   r   r  r  r  r   r   r   r    r  c                 S   r  r   r   r   r   r   r   r    s    )r   r   r   r   r   r   r   r   rL  rj  r   r   r  rE   rJ  rD   rI   rF   rH   rG   rK  z_rN  )=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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r   r   r   _TrigSimplifyAux?  s   
d
d
d
`
F
F
F
F
F
F
Z
Z
z
z
z
z
z
z











r  c                 C   s   t t| S r   )TrigSimplifyAux_replacerr   r   r   r   r   r   r/    r   r/  c                 C   r   r   )r~   r   r   r   r   Cancel  r   r  c                   @   rN  )	Util_Partc                 C   s|   t | jd }t| jdkrt| jdd  }n| jd }t|ttfr<t|tr/||d  S t|r5|S |j|d  S | S )Nr   r<  r   )r   r   r   r   r   r  r   r  )r   r   r  r   r   r   r     s   

zUtil_Part.doitNrS  r   r   r   r   r    rT  r  c                 C   s,   t | trt|g| R   S t||  S r   )r   r   r  r   )r  r   r   r   r   Part  s   
r  c                 C   r   r   )ra   )rA  r  r   r   r   r   PolyLog  r   r  c                 C   s.   z|  |W S  ty   td| | Y S w )Nr  )rE  
ValueErrorr   rL  r   r   r   r    
   r  c                 C   r  r   )r   rd   r   r   r   r   IntegralFreeQ  r   r  c                    s   t   t |}t d  d  } dkr|S  dkr!dS t dk r6t  dkr6t  | S t|rGt fdd|jD  S t|rRt | S | krwt|rw|t|krw|t|d  d  krwt||S t | S )Nr<  r   r   c                    s   g | ]}t  |qS r   )r  r   r  r   r   r     r!  zDist.<locals>.<listcomp>)	r   rm  r  r  r+  r   r   r  r   rG  r   r  r   r    s    >r  c                    sX   t | r| kS t| rdS t| rt| jd   rt| S t fdd| jD S )NFr   c                 3   r  r   )r  r   r  r   r   r     r  z&PureFunctionOfCothQ.<locals>.<genexpr>)r  r  r  r   r   r  r   r  r   r  r   r    s   r  c                 C   r   r   )rT   r   r   r   r   LogIntegral  r   r  c                 C   r   r   )rR   r   r   r   r   ExpIntegralEi  r   r  c                 C   s   t | | S r   )rS   evalfr!  r   r   r   ExpIntegralE	  r  r  c                 C   r   r   )rU   r   r   r   r   SinIntegral  r   r  c                 C   r   r   )rV   r   r   r   r   CosIntegral  r   r  c                 C   r   r   )rW   r   r   r   r   SinhIntegral  r   r  c                 C   r   r   )rX   r   r   r   r   CoshIntegral  r   r  c                   @   rj  )	PolyGammac                 G   s*   t |dkrt|d |d S t|d S r  )r   r\   rY   r   r   r   r   r     s   zPolyGamma.evalNrl  r   r   r   r   r    rm  r  c                 C   r   r   )r[   r   r   r   r   LogGamma  r   r  c                   @   rj  )
ProductLogc                 G   s2   t |dkrt|d |d  S t|d  S rP  )r   r+   r  r   r   r   r   r   #  s   zProductLog.evalNrl  r   r   r   r   r  "  rm  r  c                 C   r   r   r#   r   r   r   r   	Factorial)  r   r  c                  G   rc  r   )rb   r  r   r   r   Zeta,  r   r  c                 C   re  r   r[  )r   r"  r\  r   r   r   HypergeometricPFQ/  r   r  c                 C   sP   t | } t|d ttfs!|d |d t|d g}t| | S t| | S )z
    This function perform summation using SymPy's `Sum`.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import Sum_doit
    >>> from sympy.abc import x
    >>> Sum_doit(2*x + 2, [x, 0, 1.7])
    6

    r<  r   r   )r   r   r  r   Floorr   r   )r)   r   new_argsr   r   r   Sum_doit2  s
   r  c              	   C   sb   zt | |} t ||}W n   t | } t |}Y zt| | W S  ttfy0   | |  Y S w r   )rq   rv   as_exprrj   rl   r7  r   r   r   r5  F     

r5  c              	   C   sb   zt | |} t ||}W n   t | } t |}Y zt| | W S  ttfy0   td Y S w r   )rq   rw   r  rj   rl   r   r7  r   r   r   r6  S  r  r6  c                 C   s    |d u rt | S |t | |  S r   r_  )r   r   r   r   r   r  `  s   r  c                 C   r   r   r  r   r   r   r   Factore  r   r  c                 C   r   r   r   r!  r   r   r   Ruleh  r   r  c                 G   sT   t |dkrt| |d r| S |  S t |dkr&t| |d r$|  S | S |  S )Nr   r   r<  )r   r   r   )r   r   r   r   r   
Distributek  s   r  c                  G   s    t | } t|  }|dkrdS dS r   )r   ro   )r   r  r   r   r   CoprimeQx  s
   r  c                 C   s.   zt | |W S  ty   td| | Y S w )NDiscriminant)rm   rk   r   r!  r   r   r   r    r  r  c                 C   s   | t dk S r   r   rF  r   r   r   Negative  r   r  c                 C      t | | S r   )r  r@  rA  r   r   r   Quotient  r   r  c                 C   s|   |  dd dd } |  dd dd } |  dd dd } |  dd d	d } |  d
d dd } |  dd dd } | S )a  
    This function processes trigonometric expressions such that all `cot` is
    rewritten in terms of `tan`, `sec` in terms of `cos`, `csc` in terms of `sin` and
    similarly for `coth`, `sech` and `csch`.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import process_trig
    >>> from sympy.abc import x
    >>> from sympy import coth, cot, csc
    >>> process_trig(x*cot(x))
    x/tan(x)
    >>> process_trig(coth(x)*csc(x))
    1/(sin(x)*tanh(x))

    c                 S   r  r   )r   rG   rF  r   r   r   r    r  zprocess_trig.<locals>.<lambda>c                 S      dt | jd  S r  )rF   r   rF  r   r   r   r    r  c                 S   r  r   )r   rI   rF  r   r   r   r    r  c                 S   r  r  )rE   r   rF  r   r   r   r    r  c                 S   r  r   )r   rH   rF  r   r   r   r    r  c                 S   r  r  )rD   r   rF  r   r   r   r    r  c                 S   r  r   )r   r5   rF  r   r   r   r    r  c                 S   r  r  )r4   r   rF  r   r   r   r    r  c                 S   r  r   )r   r6   rF  r   r   r   r    r  c                 S   r  r  )r2   r   rF  r   r   r   r    r  c                 S   r  r   )r   r7   rF  r   r   r   r    r  c                 S   r  r  )r3   r   rF  r   r   r   r    r  )r   r   r   r   r   rC    s   rC  c                     s  t  tdd } t| }dd }t|}dd }t|}dd }t|}d	d
 }t|}	dd }
t|
}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd }t|}dd  }t|}d!d" } t| }!d#d$ }"t|"}#d%d& }$t|$}%d'd( }&t|&}'d)d* }(t|(})d+d, }*t|*}+d-d. },t|,}-d/d0 }.t|.}/d1d2 }0t|0}1d3d4 }2t|2}3d5d6 }4t|4}5d7d8 }6t|6}7d9d: }8t|8}9d;d< }:t|:};d=d> }<t|<}=d?d@ }>t|>}?dAdB }@t|@}AdCdD }Bt|B}CdEdF }Dt|D}EdGdH }Ft|F}GdIdJ }Ht|H}IdKdL }Jt|J}KdMdN }Lt|L}MdOdP }Nt|N}OdQdR }Pt|P}QdSdT }Rt|R}SdUdV }Tt|T}UdWdX }Vt|V}WdYdZ }Xt|X}Yd[d\ }Zt|Z}[d]d^ }\t|\}]d_d` }^t|^}_dadb }`t|`}adcdd }bt|b}cdedf }dt|d}edgdh }ftttttditdj tdktdl tdmtdj tdntdj  ttdotdj tdptdl tdqtdj  ttdrtdj tdstdl  t|||	|||||||}gt	|g|f}httt
ttditdj tdktdl tdmtdj tdotdj  ttdqtdj  tttdttdj  tdutdj  t|||	|||||||}i fdvdw}jt	|i|j}kttt
ttditdj tdktdl tdmtdj tdotdj tdptdl  ttdqtdj  tttdttdj  tdutdj  t||||	|||||||}l fdxdy}mt	|l|m}ndzd{ }ottt
t tdotdj t tdqtdj t
t tditdj t t  td|tdj t||||	||!|#t|o	}pd}d~ }qt	|p|q}rdd }stttttditdj tdktdl tdmtdj tdntdj  t ttdotdj tdptdl tdqtdj  t|||	||||||%t|s}t fdd}ut	|t|u}vtttttdotdj tdptdl tdqtdj  tttdmtdj tdntdj tditdl tdutdj tdktdj  t|||	||||||%
}wdd }xt	|w|x}ytttttditdj tdktdl tdmtdj tdntdj  t t|	|||||%}zdd }{t	|z|{}|ttttdptdltdotdjtttdttdj tdntdl tdutdj tditdj tdtdj tdktdj   t  t|||	||||||)|%}}dd }~t	|}|~}tttd|tdjtt tdptdj tttt tditdj  tdotdj   t|||	|||-}dd }t	||}tttttdotdj  t tttditdj   t|||	||}dd }t	||}tttttdtdj  tttdotdj  tdqtdj  tttditdj   t|||	||/|1|}dd }t	||}dd }ttttttdotdj  t  t||||%|3}t	||}ttttt  tttdotdj  t  t|5}dd }t	||}ttttt  tttdotdj  t  t|7}dd }t	||}dd }tttdjttt tdotdj   t|||9}t	||}dd }tttdjttt tdotdj   t|||;|=}t	||}dd }ttttdqtdj ttt tdotdj   t|||!|?|A|C}t	||}dd }ttttdqtdj ttt tdotdj   t|||!|?}t	||}dd }tttttdqtdj tditdj  ttt tdotdj   t|||	||!|?}t	||}dd }tttt tdntdj ttdqtdj tditdj  tdktdl ttt tdotdj   t|||	|||E|G}t	||}dd }tttt tdntdj tt tdttdj  ttdqtdj tditdj  tdktdl ttt tdotdj   t|||	||||I|K	}t	||}dd }tttttdmtdj tdktdj  t t||	|M|O}t	||}dd }ttttdqtdj ttdmtdj tdktdj tdptdl t  t||	|Q|O|?|S}t	||}dd }ttttdtdj tdktdj ttdmtdj tdotdj  tdptdl t t|||	|;|-|O|U}t	||}dd }ttttdqtdj ttdtdj tdktdj ttdmtdj tdotdj  tdptdl t  t|||	|W|-|O|Y|[|U
}t	||}dd }ttttdmtdj tditdj tdktdl tttdtdj tdotdj   t|||	|||-}t	||}dd }ttttdmtdj tdstdj tdttdl tdntdj tditdl ttdtdj tdktdj ttdmtdj tdotdj  tdptdl  t|||	||||||-|U}t	||}dd }tttt t|%|]|_|a}t	||}tttt t|%|]|c}dd }t	||}tttttdptdj t  t|e|%}dd }t	||}tttt td|tdj t|e}dd }t	||Ã}tttt}dd }t	||ƃ}g |h|k|n|r|v|y||||||||||||||||||||||||||đ|ǑS )Nc                 S   r   r   r  rL  r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f1c                 S   s   t | |  ||  S r   r   )r:  r\  r"  r   r   r   r   r    r  z!_ExpandIntegrand.<locals>.cons_f2c                 S   r   r   r  rs  r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f3c                 S   r   r   r  rt  r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f4c                 S   r   r   r  ru  r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f5c                 S   r   r   r  rF  r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f6c                 S   r   r   r  rK  r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f7c                 S   r   r   r  rL  r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f8c                 S   r   r   r  )r  r   r   r   r   r    r   z!_ExpandIntegrand.<locals>.cons_f9c                 S   r   r   r  )rd  r   r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f10c
           
      S   s,   t |tsdS tt||||| ||	||	|S r   r   r   r   r   
r  r"  r\  r   rA  r  r  r   r:  r@  r   r   r   r    s   
z"_ExpandIntegrand.<locals>.cons_f11c                 S   r   r   r  )r  r   r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f12c                 S   r   r   r  )r@  r   r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f13c                 S   r   r   r  rS  r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f14c                 S   r   r   r  )r  r   r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f15c                 S   s.   t |tsdS tt|||||	| ||
||
|S r   r  r  r"  r\  r   rA  r   r  r  r   r:  r@  r   r   r   r    s   
 z"_ExpandIntegrand.<locals>.cons_f16c                 S   r  r   rv  r  r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f17c                 S   r{  r   r|  r  r   r   r   r    r  z"_ExpandIntegrand.<locals>.cons_f18c                 S   r  r   r   r   r  ra  r   r   r   r    r  z"_ExpandIntegrand.<locals>.cons_f19c                 S   s   t ||| | tdS r  r  )r  r  r   r   r   r   r    r  z"_ExpandIntegrand.<locals>.cons_f20c                 S   r   r   r  )r8  r   r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f21c                 S   s   t ttttt| S r   )r  r   rl  rn  rm  rM  )r  r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f22c                 S   s   t | td|  S r  )r   r   r  r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f23c                 S   r   r   r  r=  r   r   r   r  
  r   z"_ExpandIntegrand.<locals>.cons_f24c                 S   r   r   r  r>  r   r   r   r    r   z"_ExpandIntegrand.<locals>.cons_f25c                    sx   t |tsdS  fdd}t|}tttttdtd  t	 tdtd t|}t
t|||}ttt |S )NFc                    s"   t tt|| |t|t| S r   )re   r   r   r	  r  )r:  r  r\  r  r   rL  r   r   	_cons_f_u     "z5_ExpandIntegrand.<locals>.cons_f26.<locals>._cons_f_ur:  r   r  )r   r   r   r   r   rP  r  r   r   rj  r   r  re   r  )r@  r   r   r  r  r  r  r   rL  r   r    s   
4z"_ExpandIntegrand.<locals>.cons_f26c                 S   st   t |tsdS ttt|| ||t|tt|t||t||t	|t
|dtt||| t| t|| S )NFrW  )r   r   re   r   r   r  r  r	  r  r1  r  r  r  r*  )r"  r  rA  r   r   r   r@  r   r   r   r    s
   
20z"_ExpandIntegrand.<locals>.cons_f27c                 S   s^   t |tsdS ttttt||t|tt	|t
||t
| |tt||| t| | S r   )r   r   re   r   r   r   r"  r  r  r	  r  r  r  )r  rA  r   r   r@  r   r   r   r  #  s
   
*"z"_ExpandIntegrand.<locals>.cons_f28c                 S      t | td S )Nr  )r  r   r  r   r   r   r  )  r  z"_ExpandIntegrand.<locals>.cons_f29c                 S   r   r   r
  r  r   r   r   r  -  r   z"_ExpandIntegrand.<locals>.cons_f30c                 S   r{  r  r  r  r   r   r   r  1  r  z"_ExpandIntegrand.<locals>.cons_f31c                 S   r  r   r|  r  r   r   r   r  5  r  z"_ExpandIntegrand.<locals>.cons_f32c                 S   s   t | t||  S r   )r  r  r  r   r   r   r  9  r  z"_ExpandIntegrand.<locals>.cons_f33c                 S   r  r   )r  r!  r   r   r   r  =  r   z"_ExpandIntegrand.<locals>.cons_f34c                 S   s   t || |S r   rv  rA  r@  r  r   r   r   r  A  r   z"_ExpandIntegrand.<locals>.cons_f35c                 S   s   t td||| S r   r|  r  r   r   r   r  E  r  z"_ExpandIntegrand.<locals>.cons_f36c                 S   s   t |||| S r   rv  )r8  rA  r@  r  r   r   r   cons_f37I  r  z"_ExpandIntegrand.<locals>.cons_f37c                 S   s   t td|||| S r   r|  )rA  r8  r@  r  r   r   r   cons_f38M  r   z"_ExpandIntegrand.<locals>.cons_f38c                 S   r  r  )r	  r   r  r   r   r   cons_f39Q  r  z"_ExpandIntegrand.<locals>.cons_f39c                 S   r   r   )r  rp  r   r   r   cons_f40U  r   z"_ExpandIntegrand.<locals>.cons_f40c                 S      t || td S r  )r  r   r  r   r   r   cons_f41Y  r  z"_ExpandIntegrand.<locals>.cons_f41c                 S   r  r  )r%  r   r  r   r   r   cons_f42]  r  z"_ExpandIntegrand.<locals>.cons_f42c                 S   s"   t td | |  |td  S Nr  r<  )r   r   )r\  r"  r   r   r   r   cons_f43a  r  z"_ExpandIntegrand.<locals>.cons_f43c                 S   r  r   rv  )r  rA  r@  r   r   r   cons_f44e  r   z"_ExpandIntegrand.<locals>.cons_f44c                 S   s   t td|td|  S )Nr   r<  r|  r  r   r   r   cons_f45i  r:  z"_ExpandIntegrand.<locals>.cons_f45c                 S   s   t tt|| t|tdS r  )r  re   r#  r   r  r   r   r   cons_f46m  s   z"_ExpandIntegrand.<locals>.cons_f46c                 S      t |tsdS t| |S r   r  r  r   r   r   cons_f47q  r  z"_ExpandIntegrand.<locals>.cons_f47c                 S   r  r   )r   r   rn  r  r   r   r   cons_f48w  r  z"_ExpandIntegrand.<locals>.cons_f48c                 S   s6   t |tsdS tt||tt| |td ttdS )NFrW  r<  )r   r   r[  r  r#  r   r  r  r   r   r   r   r   cons_f49}  s   
(z"_ExpandIntegrand.<locals>.cons_f49c                 S   s$   t |tsdS tt||t| |S r   )r   r   r  r  r  r   r   r   cons_f50  s   
z"_ExpandIntegrand.<locals>.cons_f50c                 S   r  r   r  rp  r   r   r   cons_f51  r   z"_ExpandIntegrand.<locals>.cons_f51c                 S   s   || ||  }t d}|| ||	|  |   t||
  ||
  | |||   t|| ||	|  |   |||  | |
   t|||   ||d   | t|d|
 S )Nr   r   )r   r  r  r   )r  r"  r\  r   rA  r   r  rd  r   r:  r@  r  r   r   r   r   r    s   z_ExpandIntegrand.<locals>.With2r:  r   r\  r   rA  r  r"  r   r@  rd  r  r   r  c
           
         s   t tt|	|t|	|tt|tdt| | ||   t|||||  |   | ||  |  ||	 | ||t t|t	|||||  |   ||	  | ||  |   t
|||||  |   ||	 | ||  |  |S r  r  re   r  r  rf   r  r   r   r  r  r  r  r  Timesr   r   r    s   z&_ExpandIntegrand.<locals>.replacement3c                    s   t tt|
|t|
|tt|tdt| | |	|   t|||||	|  |    | ||  |  ||
 | ||t t|t	|||||	|  |    ||
  | ||  |   t
|||||	|  |    ||
 | ||  |  |S r  r  r  r  r   r   r    s   z&_ExpandIntegrand.<locals>.replacement4c
                 S   s~   t |trt||| ||g|rt|	|r|dk sdS t|| |  |	 |||  |  |}
t|
t||| }
t|
r=dS dS )Nr   FT)r   r   r   r  r  r
  r  r+  r"  r  r\  rA  r   r  r   r   r:  r@  r  r   r   r   r    s   0&z_ExpandIntegrand.<locals>.With5r   c
                    sP   t t|| |  |	 |||  |  |t||| }
|
j fdd|
jD  S )Nc                    rI  r   r   r   r   r   r   r     r   z:_ExpandIntegrand.<locals>.replacement5.<locals>.<listcomp>)r
  r  r  r;  r   r  r   r   r   r    s   6z&_ExpandIntegrand.<locals>.replacement5c
              	   S   s\   t |trt||||| ||	|g|rt||sdS t||||  |	  |}
t|
r,dS dS r   )r   r   r   r  r  r+  r  r"  r\  r   rA  r   r   r   r:  r@  r  r   r   r   r    s   .z_ExpandIntegrand.<locals>.With6c
                    s>   t ||||  |	  |}
t|| |||  |   |
  S r   )r  r  r  r  r   r   r    s   $z&_ExpandIntegrand.<locals>.replacement6c
           
      S   s4   t t||| ||   |  ||||  |	  |S r   )r  r  )
r  r"  r\  rA  r   r  r   r   r:  r@  r   r   r   r    r  z&_ExpandIntegrand.<locals>.replacement7c              	   S   sR   t t|tdt|| |||  |   ||t|| |||  |   ||||S r  )r  r  r   r  r  )r  r\  r   rA  r   r   r:  r   r   r   r    r  z&_ExpandIntegrand.<locals>.replacement8r8  c              	   S   s8   t ||t||	| ||  |  |
    | || ||S r   )r  r  )r  r"  r\  r   rA  r   r  r   r   r:  r8  r   r   r   r    s   8z'_ExpandIntegrand.<locals>.replacement10c              
   S   st   t ||||  | t|||td|       | td  | |td|  |td | td |     |S r  )r  r<   r   )r"  r\  rA  r   r   r   r:  r  r   r   r   r    s   tz'_ExpandIntegrand.<locals>.replacement12c                 S   s   t || ||rt|| |  | |||   |S || | |  }td}t|| |  | |  t| ||   ||td   | t|td|t||  ||  ||||    S )Nr   rW  r   )r1  r.  r   r  r  r   r   )r"  r\  r   r   r:  r@  r  r   r   r   r   r    s
   "pz'_ExpandIntegrand.<locals>.replacement13r  c           	         s   t || ||||r t||  ||   |  ||   S || ||  |  t||   | ||   }tt||j fdd|jD  t | }t|| ||   |  | S )Nc                    s   g | ]	}t  | qS r   r  r   tmp1r   r   r   r     r  z;_ExpandIntegrand.<locals>.replacement14.<locals>.<listcomp>)r1  r.  r  r  r+  r;  r   r  )	r"  r  r  r\  r   r   r:  r@  tmp2r   r  r   r    s   ."2"z'_ExpandIntegrand.<locals>.replacement14c                 S   sl   t || |  | ||| |}t|s|S t||| |  |  |}t|r4tt|t|td r4|S |S r  )r  r	  r.  r+  r  r  r   )r"  r   r   r   r@  r  r  r   r   r   With15  s   "z _ExpandIntegrand.<locals>.With15c                 S   sp   t |||  || |  t|   |}t|| |  t| |d  |t|| || |  |  |d  | S r  )r9  r*  r  r.  r"  r  rA  r   r   r   r@  r  r   r   r   r    s   (Hz'_ExpandIntegrand.<locals>.replacement16c                 S   sV   t |||  |}t|| |  | |d  |t|| || |  |  |d  | S r  )r9  r  r  r   r   r   r    s   Dz'_ExpandIntegrand.<locals>.replacement17c              	   S   s   t t| |  td}tt| |  td}|td| ||||td      |td| ||||td       S r  )rY  r  r   rX  )r"  rA  r   r   r   r|  r  r   r   r   With18  s   Pz _ExpandIntegrand.<locals>.With18c                 S   sh   t d}tt| |  |}tt| |  |}t||| dd| |   | | |   t|d|S )Nr   rW  r<  r   r   rY  r  rX  r  r   )r"  rA  r   r   r   r   r|  r  r   r   r   With19   s   8z _ExpandIntegrand.<locals>.With19c           
   
   S   s,  t d}t||}tt||  |t|| }tt||  |t|| }	tt|| |tdd| | |  | | |	 ||   || dd| | |  |	 ||  |   t|d|| tdd| ||  |  | | |	 ||   || dd| | |  | |	||     t|d|| S Nr   rW  r  r<  r   )	r   r  rY  r  rX  r  r  r  r   
r"  rA  r   r   r   r@  r   r  r|  r  r   r   r   With20  s
   
z _ExpandIntegrand.<locals>.With20c           
      S   s  t d}t||}tt| |  |t|| }tt| |  |t|| }	tt|| td|	td|  ||	||     |	td|  ||	||      tt|| |t	tdtd | | |  | ||	 ||   || tdtd| | |   |	 ||  |   t
|td|| t	tdtd| ||  |  | ||	 ||   || tdtd| | |  | |	||     t
|td|| S )Nr   r<  rW  r   )r   r  rY  r  rX  r  r#  r   r  r  r   r  r   r   r   With21  s   
^ z _ExpandIntegrand.<locals>.With21c                 S   s   t d}tt| |  |}	tt| |  |}
t||	 dd| | |  | |	 |	|
 |   || dd| |   |
 | |	   t|d|S r  r  )r"  r\  rA  r   r   r   r:  r@  r   r|  r  r   r   r   With22  s   dz _ExpandIntegrand.<locals>.With22c
                 S   s   t d}
tt| | |}tt| | |}t|| dd|
 | |  |  | || |   dd|
 |	 |  | | || |	   || dd|
 |   | | |   t|
d|S r  r  )r  r"  r\  rA  r   r  r   r   r:  r@  r   r|  r  r   r   r   With23  s   z _ExpandIntegrand.<locals>.With23c                 S   s   t d}tt| | |}tt| | |}t|| dd| |
 |  | | || |
   dd| | |  |  | || |   dd| | |  |	 | || |   || dd| |   | | |   t|d|S r  r  )r  r"  r\  r   rA  r   r  r   r   r:  r8  r@  r   r|  r  r   r   r   With24%  s   z _ExpandIntegrand.<locals>.With24c              
   S   sj   t d}tt| |  | | | | | | | |  |tt|t| |  tdt|||td  S Nr8  r<  )r   r
  r  r   r  r  r   )r\  rA  r   r  r   r   r8  r   r   r   With25,  s   bz _ExpandIntegrand.<locals>.With25c              	   S   s~   t d}tt| |  || | ||td   | |  | ||td   | |  |tt|t| |  tdt||S r  r   r
  r  r   r   r  r  )r\  rA  r   r  r   r   r@  r8  r   r   r   With261  s   vz _ExpandIntegrand.<locals>.With26c           	   
   S   s   t d}tttd|  ||   | td| |  | | | td| |  | |  |tt|ttd | | | td  tdt||| S Nr8  r  r<  r  )	r"  r\  rA  r   r  r   r   r  r8  r   r   r   With276  s   z _ExpandIntegrand.<locals>.With27r  c	           
   
   S   s   t d}	tttd|  ||   || | td| ||   |	 |  | td| ||   |	 |  |tt|	ttd | | | td  tdt||S r  r  )
r"  r\  rA  r   r  r   r   r  r@  r8  r   r   r   With28;  s   z _ExpandIntegrand.<locals>.With28c           	      S   sf   t | |  td}|||   td|  | |||    |||  td|  | |||     S r  )r  r   )	r"  r\  rA  r   r   r   r:  r  r8  r   r   r   With29@  s   Rz _ExpandIntegrand.<locals>.With29c                 S   s   t td | | |td  td}t| |  | td| |	| |    | }| | | |d| ||   |  | | | |d| ||   |   S r  )r  r   r  )r  r"  r\  r   rA  r   r  r   r   r:  r  r8  r|  r   r   r   With30E  s   (.Hz _ExpandIntegrand.<locals>.With30c              	   S   sZ   t ||}td}|t|| |d  |  t||d  t|| t|dt|||   S )Nr   rW  r   )r  r   r  r  r  r   )r  r   r   r  r   r   r   r   With31K  s   
Hz _ExpandIntegrand.<locals>.With31c                 S   r  r   )rr  r  r   r   r   replacement32R  r   z'_ExpandIntegrand.<locals>.replacement32c                 S   s   t ||  | || S r   )ro  )r   r   r   r  r   r   r   replacement33V  r   z'_ExpandIntegrand.<locals>.replacement33c                 S   s   t t| | |||S r   )r  r\  )r  r   r   r  r   r   r   replacement34Z  r  z'_ExpandIntegrand.<locals>.replacement34c                 S   r  r   )r.  ra  r   r   r   replacement35^  r   z'_ExpandIntegrand.<locals>.replacement35)r   r   r   r   r   rS  r  r   r   r   r  rR  rL  rN  rP  rK  rJ  r  r<   j_rk  r  rj  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  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  cons37r  cons38r  cons39r  cons40r  cons41r  cons42r  cons43r  cons44r  cons45r  cons46r  cons47r  cons48r  cons49r  cons50r  cons51r  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  r0  r  r1  r2  r  r3  r4  r  r5  r6  r  r7  r8  r  r9  r:  r  ro  rp  r   rq  rr  r  rs  rt  r  ru  rv  r  rw  rx  r  ry  rz  r  r{  r|  r	  r}  r~  r
  r  r  r  r  r  	pattern33r  rule33	pattern34r  rule34	pattern35r  rule35r   r  r   _ExpandIntegrand  s  



r


Z

f
D
h
2

2
2
2
4
B
>
T
v

:
Z
j

h



(
"

r%  c                  C   s  dd } t | }dd }t |}dd }t |}dd }t |}d	d
 }t |}	dd }
t |
}dd }t |}dd }t |}tttt tdtd ttdtd  t|||}dd }t	||}ttttdtd tdtd ttdtd tdtd  t|||	}dd }t	||}ttttdtd tdtd ttdtd tdtd  ttdtd tdtd  t|||	|}dd }t	||}ttt
t}dd }t	||}||||gS ) Nc                 S   r  r   rv  rV  r   r   r   r  d  r   z"_RemoveContentAux.<locals>.cons_f1c                 S   s   t ||  tdS r   )r#  r   rV  r   r   r   r  i  r  z"_RemoveContentAux.<locals>.cons_f2c                 S   r   r   r  rL  r   r   r   r  n  r   z"_RemoveContentAux.<locals>.cons_f3c                 S   r   r   r  r  r   r   r   r  s  r   z"_RemoveContentAux.<locals>.cons_f4c                 S      t |  | tdS r   r  r   r  r   r   r   r  x  r   z"_RemoveContentAux.<locals>.cons_f5c                 S   r   r   r  rs  r   r   r   r  }  r   z"_RemoveContentAux.<locals>.cons_f6c                 S   re  r   r  )r@  rA  r  r   r   r   r    r   z"_RemoveContentAux.<locals>.cons_f7c                 S   r&  r   r'  )r@  r  r   r   r   r    r   z"_RemoveContentAux.<locals>.cons_f8r   r   r  c                 S   sN   t t|tdt||td  | |  |t|| td   |  | |S r  )r  r  r   rB  )r  r   r   r   r@  r"  r   r   r   r    r  z'_RemoveContentAux.<locals>.replacement1r@  rA  c                 S   s   t || |   | | |S r   rB  )rA  r  r   r   r@  r   r   r   r   r    r  z'_RemoveContentAux.<locals>.replacement2r  r  c                 S   s.   t || |   | || |  |  | |S r   r(  )rA  r  r   r  r   r  r@  r   r   r   r   r    r  z'_RemoveContentAux.<locals>.replacement3c                 S   s    t tt| tt| |  | S r   )r  re   r+  r  r'  r  r   r   r   r    r  z'_RemoveContentAux.<locals>.replacement4)r   r   r   rN  rk  r   r   rO  r  r   rJ  )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   _RemoveContentAuxc  s:   8
P
r

r)  r   r  )F)FFFF(  r   sympy.externalr   r   sympy.concrete.summationsr   sympy.core.addr   sympy.core.basicr   sympy.core.containersr   sympy.core.evalfr	   sympy.core.exprr
   sympy.core.exprtoolsr   sympy.core.functionr   r   r   r   sympy.core.mulr   sympy.core.numbersr   r   r   r   r   r   r   r   sympy.core.powerr   sympy.core.singletonr   sympy.core.symbolr   r   r   r    sympy.core.sympifyr!   sympy.core.traversalr"   (sympy.functions.combinatorial.factorialsr$   $sympy.functions.elementary.complexesr%   r&   r'   r(   &sympy.functions.elementary.exponentialr)   r  r*   r   r+   %sympy.functions.elementary.hyperbolicr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   #sympy.functions.elementary.integersr8   r9   (sympy.functions.elementary.miscellaneousr:   r;   r<   (sympy.functions.elementary.trigonometricr=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   *sympy.functions.special.elliptic_integralsrJ   rK   rL   'sympy.functions.special.error_functionsrM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   'sympy.functions.special.gamma_functionsrY   rZ   r[   r\   r]   sympy.functions.special.hyperr^   r_   r`   &sympy.functions.special.zeta_functionsra   rb   sympy.integrals.integralsrd   sympy.logic.boolalgre   rf   sympy.ntheory.factor_rg   rh   sympy.polys.partfracri   sympy.polys.polyerrorsrj   rk   rl   sympy.polys.polytoolsrm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   sympy.sets.setsry   sympy.simplify.powsimprz   sympy.simplify.radsimpr{   rB  r|   r}   r~   r   r   sympy.utilities.decoratorr   sympy.utilities.iterablesr   sympy.core.randomr   r   r   r   r   r   r   r   r   r   r   sympy.integrals.rubi.symbolr   r   r   r   registerr  r  r  r  r  rN  rO  rP  rQ  rR  rS  r  h_i_r  k_l_rk  rK  rj  r  r  r  rJ  rL  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-  r1  r&  r+  r5  r8  r'  r)  r=  rB  rE  rL  rM  rO  rU  rX  r]  r  r.  r*  rb  rd  re  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  r  r  r  r  r  r  Deferr  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  rY  r  rQ  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*  r4  r9  r=  r?  rB  rD  rE  rF  r(  rM  r)  r&  rY  r[  r]  r^  r_  ra  rb  rc  rd  rf  rh  rl  rr  rn  rt  rw  rz  r}  r~  r  r'  r+  r,  r  r  r  r  r  r  r  r  r  r  r  r  rx  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  r9  r  r   r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r   r!  r"  r%  r(  r)  r,  r+  r.  r2  r3  r4  r  r:  r;  r<  r=  r>  rA  rD  rE  rF  rH  rJ  rK  rM  rP  rQ  rU  rV  rX  r\  r[  r]  r^  r`  rZ  rb  rc  ra  re  rf  r  r  ri  rh  ro  rT  rj  rk  r  rn  rq  rs  rt  rv  rw  rx  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  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  rY  r   r%  r&  r'  r)  r*  r,  r+  r(  r-  r8  rM  r  rP  rS  rU  rZ  r[  r\  rm  r]  r
  r  rc  rd  re  rf  rg  rh  ri  rk  rn  r  ro  r  r  r_  r;  rg  rQ  rD  r  rV  r  r/  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r5  r6  r  r  r  r  r  r  r  r  rC  r%  r)  IntHider  NullrA  r  r  r  rR  r<  r  r   r   r   r   <module>   sl   (8<88
 

&




	
































	
	
	
	



















(
Te 	#
"		&
&*+;$ 	

			
"( %	'	$(

1-
	S2$+/$
&5#		?7		L72@&  u(}
   A;




