o
    8Va                    @   s
  d Z ddlmZ edZddlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO ddlPmQZQmRZRmSZS dd	lTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` dd
lambZbmcZc ddldmeZemfZfmgZgmhZhmiZimjZjmkZk ddllmmZmmnZnmoZo ddlpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{ ddl|m}Z} ddl~mZ ddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZ ddlmZmZ ddlmZ G dd de/ZeeZG dd de ZG dd de ZerddlmZmZmZmZmZmZ ddlmZ ddlmZmZ G dd deZee ee d d! d"D \ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZed#\ZZZZZe.Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zʐdd1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN ZdOdP ZdQdR ZdSdT ZdUdV ZdWdX ZdYdZ Zd[d\ Zd]d^ Zd_d` Zdadb Zdcdd Zdedf Zdgdh Zdidj Zdkdl Zdmdn ZddodpZdqdr Zdsdt Zdudv Zdwdx Zdydz Zd{d| ZG d}d~ d~e ZdddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdd Zdd Zdd Zdd 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̈́ 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/dd Z0dd Z1dd 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! ZCd"d# ZDd$d% ZEdd&d'ZFd(d) ZGd*d+ ZHd,d- ZId.d/ ZJd0d1 ZKd2d3 ZLd4d5 ZMd6d7 ZNdd8d9ZOd:d; ZPd<d= ZQd>d? ZRd@dA ZSdBdC ZTdDdE ZUdFdG ZVdHdI ZWdJdK ZXdLdM ZYdNdO ZZdPdQ Z[dRdS Z\dTdU Z]dVdW Z^ddXdYZ_ddZd[Z`d\d] Zad^d_ Zbd`da Zcdbdc Zdddde Zedfdg Zfdhdi Zgdjdk Zhdldm Zidndo Zjdpdq Zkdrds Zldtdu Zmdvdw Zndxdy Zodd{d|Zpdd}d~Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zz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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/d0 Zɐd1d2 Zʐd3d4 Zːd5d6 Z̐d7d8 Z͐d9d: Zΐdd;d<Zϐd=d> ZАd?d@ ZѐdAdB ZҐdCdD ZӐdEdF ZԐdGdH ZՐdIdJ Z֐dKdL ZאdMdN ZؐdOdP ZِdQdR ZڐdSdT ZېdUdV ZܐdWdX ZݐdYdZ Zސd[d\ Zߐd]d^ Zd_d` Zdadb Zdcdd Zdedf Zdgdh Zdidj Zdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv Z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 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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$ ZCd%d& ZDd'd( ZEd)d* ZFd+d, ZGd-d. ZHd/d0 ZId1d2 ZJd3d4 ZKd5d6 ZLd7d8 ZMd9d: ZNd;d< ZOd=d> ZPd?d@ ZQdAdB ZRdCdD ZSdEdF ZTdGdH ZUdI\aVaWdzaXdJdK ZYdLdM ZZdNdO Z[dPdQ Z\dRdS Z]dTdU Z^dVdW Z_ddXdYZ`dZd[ Zad\d] Zbd^d_ Zcd`da Zddbdc Zeddde Zfdfdg Zgdhdi Zhdjdk Zidldm Zjdndo Zkdpdq Zldrds Zmdtdu Zndvdw Zodxdy Zpdzd{ Zqd|d} ZrG d~d de Zsdd Ztdd Zudd Zvdd Zwed͐d΍dd Zxed͐d΍dd Zyed͐d΍dd Zzed͐d΍dd Z{ed͐d΍dd Z|ed͐d΍dd Z}ed͐d΍dd Z~ed͐d΍dd Ze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Zd0Zeree  Ze Ze Ze~ Ze| Zez Zex Zd0S d0S (  z
Utility functions for Rubi integration.

See: http://www.apmaths.uwo.ca/~arich/IntegrationRules/PortableDocumentFiles/Integration%20utility%20functions.pdf
    )import_modulematchpy)4BasicEpolylogNWildWildFunctionfactorgcdSumSIMulIntegerFloatDictSymbolRationalAddhypersymbolssqf_listsqfMax	factorint	factorratMinsignr   Functioncollect	FiniteSet	nsimplifyexpand_trigexpandpolyapartlcmAndPowpizooooIntegralUnevaluatedExprPolynomialErrorDummyexp	powdenestPolynomialDivisionFaileddiscriminantUnificationFailedappellf1factor_terms)sympify)logsincostancotcscsecsqrterfgamma
uppergamma	polygammadigammaloggamma	factorialzetaLambertW)imreAbs)acoshasinhatanhacothacschasechcoshsinhtanhcothsechcsch)floorfrac)atanacscasinacotacosasecatan2)
elliptic_f
elliptic_eelliptic_pi)fresnelcfresnelserfcerfiEiexpintliSiCiShiChi)TupleArg)Or)Polyquoremtotal_degreedegree)fractionsimplifycancelpowsimp)doctest_depends_on)flattenpostorder_traversal)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   G/usr/lib/python3/dist-packages/sympy/integrals/rubi/utility_function.py	<genexpr>*       z7rubi_unevaluated_expr.is_commutative.<locals>.<genexpr>)Zsympy.core.logicr   args)selfr   r   r   r   r   '   s   z$rubi_unevaluated_expr.is_commutativeN)__name__
__module____qualname____doc__propertyr   r   r   r   r   r   "   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   eval@      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   S   s   zrubi_log.evalNr   r   r   r   r   r   D   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   ZvariadicZarityZcommutativeZassociativer   r   r   r   r   _   s
    r   c                 C      g | ]}t |qS r   r   r   ir   r   r   
<listcomp>i       r   Z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_expp   s   
r   c                 C   s   t | } | S r   )ry   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   TFr   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,   Z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   rK   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  rL   r   r   r   r   r     s   " z%PureComplexNumberQ.<locals>.<genexpr>r   r   r   r   r   PureComplexNumberQ  r   r  c                 C      | j S r   Z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   Equal#  r   r  c                 C      | |kS r   r   r  r   r   r   Unequal&  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  )  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!  9  s   
r!  c                  G   r   )Nc                 s   r   r   Zis_Rationalr   r   r   r   r   L  r   zRationalQ.<locals>.<genexpr>r   )r   r   r   r   	RationalQK  r   r$  c                 C   
   t | jS r   )r   is_Mulr   r   r   r   r  N  r   r  c                 C   r  r   )is_Addr   r   r   r   r  Q  r	  r  c                 C   s
   t |  S r   )r  r   r   r   r   NonsumQT  r   r(  c                 C   s<   d | ||fv r	d S |  tdr| tdt} | ||S )NZ	Integrate)r   r   r   r-   r   )r   r   yr   r   r   SubstW  s
   r*  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  `  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  r+  r   func)r   r   r   r   r   r  z  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baser1   r   r/  r   r$  r&  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   r4       @r4  c                    sH   t | trt fdd| D S |  r"tt|   ddkr"dS dS )aA  
    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_polynomialrw   rs   r   r   r   r8  r   r7    s   

r7  c                 C   r   r   )rA   r   r   r   r   Sqrt  r   r>  c                 C   r   r   )rN   r   r   r   r   ArcCosh  r   r?  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   r3  r   r   r   r   r     s   zUtil_Coefficient.doitNr   r   r   r   r   r   r   r   rA        rA  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   )	rC  r+   r,   r$   r   r   r   rD  rA  )r   r   r3  r   r   r   Coefficient  s   rG  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)   r1   r   Denominatorr1  	Numeratorr   r
   rx   r   r   r   r   rJ       



rJ  c                 C   s   t | |g|g|S r   r   )r   r  cr   r   r   r   Hypergeometric2F1  r   rO  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   )r[   r   r   r   r   r"    r   r"  c                 C   r   r   rZ   r   r   r   r   r    r   r  c                 C   s   t | |||||S r   )r6   )r   Zb1Zb2rN  r   r)  r   r   r   AppellF1
  r   rR  c                  G      t |  S r   )re   r   r   r   r   
EllipticPi  r   rT  c                  G   rS  r   )rd   r   r   r   r   	EllipticE  r   rU  c                 C   r   r   )rc   )ZPhir2  r   r   r   	EllipticF  r   rV  c                 C   s   |d u rt | S t| |S r   )r\   rb   r  r   r   r   ArcTan  s   
rW  c                 C   r   r   )r_   r   r   r   r   ArcCot  r   rX  c                 C   r   r   )rQ   r   r   r   r   ArcCoth  r   rY  c                 C   r   r   )rP   r   r   r   r   ArcTanh"  r   rZ  c                 C   r   r   )r^   r   r   r   r   ArcSin%  r   r[  c                 C   r   r   )rO   r   r   r   r   ArcSinh(  r   r\  c                 C   r   r   )r`   r   r   r   r   ArcCos+  r   r]  c                 C   r   r   )r]   r   r   r   r   ArcCsc.  r   r^  c                 C   r   r   )ra   r   r   r   r   ArcSec1  r   r_  c                 C   r   r   )rR   r   r   r   r   ArcCsch4  r   r`  c                 C   r   r   )rS   r   r   r   r   ArcSech7  r   ra  c                 C   r   r   )rU   r   r   r   r   Sinh:  r   rb  c                 C   r   r   )rV   r   r   r   r   Tanh=  r   rc  c                 C   r   r   )rT   r   r   r   r   Cosh@  r   rd  c                 C   r   r   )rX   r   r   r   r   SechC  r   re  c                 C   r   r   )rY   r   r   r   r   CschF  r   rf  c                 C   r   r   )rW   r   r   r   r   CothI  r   rg  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   	LessEqualL     rn  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 rh  ri  rm  r   r   r   LessU  ro  rp  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 rh  ri  rm  r   r   r   Greater^  ro  rq  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 rh  ri  rm  r   r   r   GreaterEqualg  ro  rr  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)rJ  r   r   r   r   r   r     s    r   r   r   r   r   r  p  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  rN  r,  r2  r3  r   r   r   r   IntLinearcQ  s   rw  c                 C      |   S r   )r$   r   r   r   r   Expand  r   ry  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   )Zis_PowExpQr   r   r   r   r0    r  r0  c                 C   .   t | trt| jd S t| ot| jd S Nr   r   )r   sym_expr   r   r0  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   r0  r   r   r   r   PositiveIntegerPowerQ  s   
$r  c                 C   r~  r  )r   r  r  r   r0  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   )r9   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  r;   r<   r=   r>   r@   r?   r{  r   r   r   TrigQ     r  c                 C      t | tkS r   )r  r;   r   r   r   r   SinQ  r   r  c                 C   r  r   )r  r<   r   r   r   r   CosQ  r   r  c                 C   r  r   )r  r=   r   r   r   r   TanQ  r   r  c                 C   r  r   )r  r>   r   r   r   r   CotQ  r   r  c                 C   r  r   )r  r@   r   r   r   r   SecQ  r   r  c                 C   r  r   )r  r?   r   r   r   r   CscQ  r   r  c                 C   r   r   )r;   r   r   r   r   Sin  r   r  c                 C   r   r   )r<   r   r   r   r   Cos  r   r  c                 C   r   r   )r=   r   r   r   r   Tan  r   r  c                 C   r   r   )r>   r   r   r   r   Cot  r   r  c                 C   r   r   )r@   r   r   r   r   Sec  r   r  c                 C   r   r   )r?   r   r   r   r   Csc  r   r  c                 C   r  r   )	r  r  r  rU   rT   rV   rW   rX   rY   r{  r   r   r   HyperbolicQ  r  r  c                 C   r  r   )r  rU   r   r   r   r   SinhQ  r   r  c                 C   r  r   )r  rT   r   r   r   r   CoshQ  r   r  c                 C   r  r   )r  rV   r   r   r   r   TanhQ   r   r  c                 C   r  r   )r  rW   r   r   r   r   CothQ  r   r  c                 C   r  r   )r  rX   r   r   r   r   SechQ  r   r  c                 C   r  r   )r  rY   r   r   r   r   CschQ	  r   r  c                 C   r  r   )	r  r  r  r^   r`   r\   r_   ra   r]   r{  r   r   r   InverseTrigQ  r  r  c                 C      t ttttgt| S r   )r  r;   r<   r@   r?   r  r   r   r   r   SinCosQ     r  c                 C   r  r   )r  rU   rT   rX   rY   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   rI  )r   r   r)   r1   r   rK  r1  rJ  r   r
   rx   r   r   r   r   rK    rL  rK  c                 C   s   t | ttfr	dS | jS r   )r   r   float	is_numberr   r   r   r   NumberQ(  s   r  c                 C   r%  r   )r   r  r   r   r   r   rC  -  r   rC  c                 C   s   t | tr	t| S t| jS )a3  
    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   Length0  s   

r  c                 C   
   t | tS r   r   r   r   r   r   r   ListQD  r   r  c                 C      t | } t|  S r   )r   rK   r   r   r   r   r   ImG     r  c                 C   r  r   )r   rL   r   r   r   r   r   ReK  r  r  c                 C   s"   | j st| } | ttttttfv S r   )r  r  rN   rO   rP   rQ   rR   r   r   r   r   InverseHyperbolicQO  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-  r   r   r   r   r   InverseFunctionQT  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  X  s   


r  c                 C   sX   t | rdS t| st| s| jtks| jtkrt| |S | jD ]	}t|s) dS q dS r  )	r  r  r  r-  r   r6   r   r   ElementaryFunctionQr  r   r   r   InverseFunctionFreeQe  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   rI  r   F)r  r   r  rC  r   r  r   r0  r1  r1   r   r
  r&  r   r   r'  Zis_Functionr-  r;   r<   r=   r>   r@   r?   r\   r_   rB   r^   r`   ZLEr   )r   vr   r   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   FrI  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   rz  r   r   r   r   r     r9  c                 3   r  r   )PolynomialQr   r   r   r   r     r9  )r<  r   r)   r1   r   rw   r1  rs   r/   
all_coeffsindexr   r   r   r   ry   Exponentfree_symbolsr   r   )r   r   degpZc_listZ
coeff_listr   r  r   r   r   r    s@   


 

r  c                 C   r   r   )r   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   wr2  r3  TF)r   matchr  r   r   r  r7  )r   r   r   r  r2  r3  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   r:  )	ry  r   r  r   r  r   r   rw   rs   r=  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   r:  )ry  r   r  r   r'  r    r   r   r   rw   rs   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  PolyQrG  )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  )r7  r   r   rG  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   rG  r0  r1  r   r1   r  r  BinomialPartsr  r  r   r  r  )r   r   r  lst2lst1r   r  r2  rN  r,  r3  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 )Nrt  r   r.  Fr   )r9   r  CoefficientListr   EvenQr   r0  r  r1   r  r1  r  r   r  TrinomialPartsr  r   r  r  )r   r   r  r  r  r   r  r2  rN  r,  r3  lst3lst4r   r   r   r  b  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   r6  r   )r  r   r8  r   r   r     r9  zPolyQ.<locals>.<genexpr>Fr   )r  r   r   r)   r1   r1  r   r   r  r  Togetherr  r  rG  r  )r   r   r3  Zx_baser   r8  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  )r$  rq  r>  r0  r  r1   r  PerfectSquareQr  r  r  r   r(  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  )r$  r0  r  r1   r  NiceSqrtAuxQr  r  r  r   r(  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   r
   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)r$  r  r   r  r  rC  r   r0  r  r1   PosAuxr1  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   reversedrs   r  r{  r   r   r   r  1  s   
r  c                 C   s6   t |tri }|D ]}|| q	| |S | |S r   )r   r   updater   )r   r   Zn_argsr   r   r   r   
ReplaceAll7  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   r8  r   r   r   C      z'ExpandLinearProduct.<locals>.<listcomp>r   r   )r   r  r  r  rj  r   r   )r  r   r   r  r   r  r   r   r   r8  r   ExpandLinearProduct?  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   r   r   r   r   r   GCDJ  s   r  c                 C   r   r   r7   )Zexpnr   r   r   ContentFactorS  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   h  r   z!NumericFactor.<locals>.<listcomp>2   )r  r   r  r  r   r0  r$  r1  r1   rJ  r  r   r   r  r  r  r  r  r  r  )r   rN  r2  r3  r   r   r   r  V  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   r0  r$  r1  r  r1   r  r  r   NonnumericFactorsr  r  r  )r   resultr   r3  r   r   r   r  y  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  MakeAssocListr1  r  r  r  r  r   r0  r1   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  r1  r1   r  r  r-  r   r   r0  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  r1  r1   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   ry  r  r   r   r  r   r  r   ExpandExpression  s&   



 


r  c                 C   s   t | |r
t| |S | S r   )r  r&   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   r  r   MatchQ  s   
r  c                 C   s   t | ||t| ||gS r   )PolynomialQuotientPolynomialRemainderr  qr   r   r   r   PolynomialQuotientRemainder     r!  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 )aB  
    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   r=  r   r   r   RemoveContentAuxG  r  r*  c                 C   s<   t | |}t|}tt||drt||S tt |||S r  )r'  r  r  r%  r*  r   r   r  r  r   r   r   RemoveContentJ  s
   

r,  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   	FreeTermsT  r(  r-  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   NonfreeTermsp  s   


r.  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   Zexcluder3  r  c                       g | ]} | qS r   r   r   r  r   r   r     r   z+ExpandAlgebraicFunction.<locals>.<listcomp>r   c                    r0  r   r   r   r  r   r   r     r   )
r  r   r  r   r  r  r   r   r   ry  )r   r   u_n_v_r  r   r   r  r   r   r3  r  r   r  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   r/  r  rN  r,  r  r   c                    r0  r   r   r   r  r   r   r     r   z&CollectReciprocals.<locals>.<listcomp>r.  )r  r   r  r  r   CollectReciprocals)r   r   r1  a_b_c_d_e_f_r  r   r   r   r  rN  r,  r  r   r   r  r   r4    s.   $
$(4(8r4  c                 C   sN   t | |}t|r%d}|jD ]	}|t||7 }q|}t|r#t||S |S |S r   )r4  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   r0  r$  r1   r1  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  )rG  r  r   )r   formr3  Zcoef1Zcoef2r   r   r   Coeff  s   r>  c                 C      t | rt| S | S r   )r  r  r   r   r   r   LeadTerm     r@  c                 C   r?  r   )r  r  r   r   r   r   RemainingTerms  rA  rB  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   rC    s   rC  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   rD    s   rD  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
    )rC  r0  r1  r  r   r   r   LeadBase  s   rF  c                 C   rE  r   )rC  r0  r1   r  r   r   r   
LeadDegree  s   rG  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   &  r   zNumer.<locals>.<listcomp>)r0  r1   r  r   r   rK  r   r   r   r   rH     s   
rH  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>)r0  r1   r   r  r   rJ  r   r   r   r   rI  )  s   
rI  c                 C      t | ||S r   rM  )r3  r,  r   r   r   r   	hypergeom2  r   rK  c                 C      t t| |S r   )r  r  )r   r=  r   r   r   Expon5  r  rM  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   r/  r   r  rN  r,  r3  r2  c                    r0  r   r   r   r  r   r   r   H  r   z"MergeMonomials.<locals>.<listcomp>c                    r0  r   r   r   r  r   r   r   V  r   )r   r  r   r  r   r   ZNaNr   )r   r   r1  p_r5  r6  r7  r8  r2  m_r  r   r   r   r  r2  rN  r3  r  r,  r   r  r   MergeMonomials8  s:   ,
$60$
$ 0(rP  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   )r  r  r  Simpr  rG  r%  r'  r   r  	BinomialQExpandToSum)	r   r  r   rt   ru   r  r   freeZmonomialr   r   r   PolynomialDivide^  s&   $

(
rU  c                 C   sF   t | r| D ]}tt|||r dS qdS t|rdS t t| |S )aN  
    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  rR  r  r  r   r   r3  r   r   r   r   rR  x  s   rR  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   r0  r1   rR  r1  r  r  )r   r   r   checkr   r   r   rW    s   
$rW  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   r6  r   )GeneralizedBinomialQr   r8  r   r   r     r9  z'GeneralizedBinomialQ.<locals>.<genexpr>)r  r   GeneralizedBinomialPartsr{  r   r8  r   rZ       rZ  c                    rY  )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   r6  r   )GeneralizedTrinomialQr   r8  r   r   r     r9  z(GeneralizedTrinomialQ.<locals>.<genexpr>)r  r   GeneralizedTrinomialPartsr{  r   r8  r   r]    r\  r]  c                 C   s2   t | }ddgg}|d D ]	}|t| q|S r  )r   r  r   )r%   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  ry  )r   r   r  r   r  r   r   r   r   PerfectPowerTest  s   
ra  c                 C   s.   t | |rt| }t|st|r|S dS dS r   )r  r  r0  r  r  r   r   r   SquareFreeFactorTest  s   
rb  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  r1  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  rc  rd  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   

re  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   r1   RationalFunctionExponentsr1  re  r  r  r  r  r  r   )r   r   r  r  r  r   r   r   rf  "  s$   

 2
rf  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  r3  r   r   r   cons_f1K  r   z'RationalFunctionExpand.<locals>.cons_f1c                 S      t | tsdS t|| S r   )r   r   UnsameQ)r   r  r   r   r   cons_f2O     

z'RationalFunctionExpand.<locals>.cons_f2c                    s8   t ||}tt|t fdd|jD    | S )Nc                    s   g | ]}|   qS r   r   r   r3  r  r   r   r   W  r	  z9RationalFunctionExpand.<locals>.With1.<locals>.<listcomp>)RationalFunctionExpandIfr  r   r   )r3  r   r   r  r  r   rn  r   With1U  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 NrI  )r(   r   r   r   r  r   r   )r   r  rN  r,  r  r2  r3  r   r   r   r   _consf_u]     4z7RationalFunctionExpand.<locals>.With2.<locals>._consf_ur2  r   r,  r  c                    r  r   r   r   r  r   r   r   h  r   z9RationalFunctionExpand.<locals>.With2.<locals>.<listcomp>)ExpandIntegrandr   r   r   x_r   r   r7  rN  r2  r5  r   rk  r  r  r  r   r   )r   r   r  rs  cons_upatresult_matchqr   r  r   With2Z  s   
R
z%RationalFunctionExpand.<locals>.With2)r   r   r   r1  r3  r2  rv  r   r   r  r   r   r   )r   r   ri  cons1rl  cons2rq  pattern1rule1rz  pattern2rule2r   r   r   r   ro  H  s   

ro  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   r/  r   r  FrN  r,  r3  c                    r0  r   r   r   r  r   r   r     r   z#ExpandIntegrand.<locals>.<listcomp>c                    r0  r   r   r   r  r   r   r     r   )Z	max_count)r   ru  r.  r  r-  r   r  rP  r-  r   r  r  r^   r`   rO   rN   r   r  r  r  r   r  r   r   r   ExpandIntegrand_rules)r   r   Zextrar  r_  r   r   r1  r5  r6  F_r7  r8  r2  r  r   r   r   r  r  r3  rN  r,  r   r   r  r   ru  r  sH   





 
(ru  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   rM   r  rJ  SimplerQrK  r  r  r  r  OrderedQr  r  rL   rK   r  rj  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   r$  r  r  r  )r   r  ZsqrtuZ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   )r$  r   SumSimplerAuxQry  r  r   r   r   SumSimplerQ  s   

r  c                 C   s   t | |}|dkr|S |d S NFr.  )r  )r   r   Zbpr   r   r   BinomialDegree	  s   
r  c                 C   s   t | |}|r|d S |S )Nrt  )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  Zdeletedr   r   r   r   _delete_cases$	  s   

z*CancelCommonFactors.<locals>._delete_casesr   r   )r  r  r  CancelCommonFactorsr  )r   r  r  r  r   r   r   r  #	  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   ru  rt  TF)r  r  r  SimplerIntegrandQr   r  r  rf  )	r   r  r   r  u1Zv1t1t2r   r   r   r   r  C	  s$   
(



r  c                 C   "   t | |}|r|d |d  S d S )Nr.  rt  )r[  )r   r   r  r   r   r   GeneralizedBinomialDegreeY	     
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   r/  r  r3  r   F)ry  GeneralizedBinomialMatchQr   r  r  )r   r   r   r  r3  r   r  r   r   r   r[  ^	  s   
r[  c                 C   r  )Nrt  ru  )r^  r  r   r   r   GeneralizedTrinomialDegreek	  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   r/  r  rN  r3  r   r.  F)ry  GeneralizedTrinomialMatchQr   r  r'  )r   r   r   r  rN  r3  r   r  r   r   r   r^  p	  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   r6  r   	MonomialQr   r8  r   r   r   	  r9  zMonomialQ.<locals>.<genexpr>r   r/  r  TFr   r   r   r   r  r   r   r   r  rL   r   r8  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  rV  r   r   r   MinimumMonomialExponent	  s   

r  c                 C   s>   t d|gd}t d|gd}| |||  }|r|| S d S )Nr   r/  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   r6  r   )LinearMatchQr   r8  r   r   r   	  r9  zLinearMatchQ.<locals>.<genexpr>r   r/  r  TFr  r  r   r8  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   r/  r  r   r2  )r   r   PowerOfLinearMatchQr   r  )r   r   r   r   r  r2  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   r6  r   )QuadraticMatchQr   r8  r   r   r   	  r9  z"QuadraticMatchQ.<locals>.<genexpr>r.  rN  r   r  r   r   c                 S      t | ||g|S r   rz  )r   r  rN  r   r   r   r   <lambda>	      z!QuadraticMatchQ.<locals>.<lambda>c                 S      t | |g|S r   rz  )r   rN  r   r   r   r   r  	      )r  r   r   r   rv  r   r   r   )r   r   r}  r  r  r   r8  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   r6  r   )CubicMatchQr   r8  r   r   r   	  r9  zCubicMatchQ.<locals>.<genexpr>rt  r,  r   r.  rN  r  r   r   c                 S      t | |||g|S r   rz  )r   r  rN  r,  r   r   r   r   r  	      zCubicMatchQ.<locals>.<lambda>c                 S   r  r   rz  )r   r  r,  r   r   r   r   r  	  r  c                 S   r  r   rz  )r   rN  r,  r   r   r   r   r  	  r  c                 S   r  r   rz  )r   r,  r   r   r   r   r  	  r  TF)	r   r   r   r   r   rv  r   r   r   )r   r   r}  r  pattern3pattern4r  r   r8  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   r6  r   )BinomialMatchQr   r8  r   r   r   	  r9  z!BinomialMatchQ.<locals>.<genexpr>r3  r   r  r   r   c                 S   r  r   rz  )r   r  r3  r   r   r   r   r  	  r  z BinomialMatchQ.<locals>.<lambda>
r   r   r   r   r   rv  r   r   r   r   r   r   r  r   r8  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   r6  r   )TrinomialMatchQr   r8  r   r   r   	  r9  z"TrinomialMatchQ.<locals>.<genexpr>jr   rN  r3  r  r   r   c                 S   r  r   rz  )r   r  rN  r3  r   r   r   r   r  	  r  z!TrinomialMatchQ.<locals>.<lambda>c                 S   s   t | d|  S Nr.  r   r  r3  r   r   r   r  	  r  r  r  r   r8  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   r6  r   )r  r   r8  r   r   r   	  r9  z,GeneralizedBinomialMatchQ.<locals>.<genexpr>r   r   r/  r  r3  r   ru  TFr   r   r   r   r  r   )r   r   r   r  r3  r   r  r   r8  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   r6  r   )r  r   r8  r   r   r   
  r9  z-GeneralizedTrinomialMatchQ.<locals>.<genexpr>r   r   r/  r  r3  rN  r   r.     TFr  )r   r   r   r  r3  rN  r   r  r   r8  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   r6  r   )QuotientOfLinearsMatchQr   r8  r   r   r   
  r9  z*QuotientOfLinearsMatchQ.<locals>.<genexpr>r   r/  r  r,  rN  r  r  TFr  )r   r   r   r  r,  rN  r  r  r   r8  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   r/  r3  r   TF)r   r  r   rq  r   )r   r   r   r3  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   PolynomialTerms(
     

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   rI  F)	r  rq  rM  r   r  rG  r   r   r   )r   r   r3  r,  rN  r   r   r   r   PseudoBinomialParts6
  s   
*r  c                 C   s>   t | |}|r|d |d |d |d |  |d    S d S )Nr   r   r.  rt  ru  r  r   r   r  r   r   r   NormalizePseudoBinomialC
  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   PseudoBinomialPairQH
  s   

r  c                 C   s   t | |}|r	dS dS r  r  r  r   r   r   PseudoBinomialQS
  s   
r  c                 C   r   r   )r   r   gr   r   r   PolynomialGCDZ
  r   r  c                 C   s   t t| ||S r   )r'  r  r  r   r   r   PolyGCD]
     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   r<  r   r   r   r   r   AlgebraicFunctionFactorsb
  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   NonalgebraicFunctionFactorsn
  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   )r7  r  r   r   QuotientOfLinearsPr  rK  rJ  r  r  r0  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.  rt  )r   r   r   r   )r7  rG  r0  rK  rJ  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   rt  )r  QuotientOfLinearsQr  r  r   )r   r   r   r   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   rx  r   Zsort_keyr8  r   r   r   r  
      zSort.<locals>.<lambda>)keyreverse)sorted)r   r_  r   r   r   r+  
  r   r+  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>)r0  r1   r1  r$  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  r$  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  r3  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  r   itemsr   )r3  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  )r$  r  r0  r1  r1   r   Zas_base_exp)r2  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

    rt  r   r   r.  ru  c                       g | ]	}t | qS r   )SubstForInverseFunctionr   r  r  r   r   r   r   7      z+SubstForInverseFunction.<locals>.<listcomp>N)	r   r  rG  r   Z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   r3  r  r  r   r   r   r   D      z+SubstForFractionalPower.<locals>.<listcomp>)r  r  r   r1  r1   r   r-  )r   r  r3  r  r   r   r   r  r   r  :  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.  rt  )"FractionalPowerOfQuotientOfLinearsr  r  r   r   r  r'  r%  )	r   r   r  r3  r  r   r  rN  r,  r   r   r   *SubstForFractionalPowerOfQuotientOfLinearsG  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  r1  r  r7  r   r   LCMrJ  r1   r   r  r   r3  r  r   r  r   r   r   r   r  W  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   o      z+SubstForFractionalPowerQ.<locals>.<genexpr>)r  r   r  SubstForFractionalPowerAuxQr   r   r  r   r  r   r  h  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   w  r  z.SubstForFractionalPowerAuxQ.<locals>.<genexpr>)r  r  r   r1  r   r   r  r   r  r   r  q  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   r/  r  rN  r.  c                 3   r  r   r   r   r  r   r   r     r   z+FractionalPowerOfSquareQ.<locals>.<genexpr>)r  r  r   r1  r  r   r   r  r(  r   FractionalPowerOfSquareQr  r   )
r   r5  r6  r7  r   r   r  rN  r   r  r   r  r   r  y  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 )NFrt  T)r  r  r   r1  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   )r0  r$  r1   r  r1  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  )r$  r   r0  r1  r1   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  )r0  r1  r1   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 )NrI  r   )r  MergeFactorsr  r  r0  r  r1  r1   r  r$  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 rH  r  )Zexpr1Zexpr2r   r   r   Order  s
   r	  c                 C   s.   | dkr|dkr
dS dS |dkrdS t | |S )Nr   r   rI  )r	  r  r   r   r   FactorOrder  s   
r
  c                 C   s:   |d u r| }|d }t |D ]}t||}q|S t| |S r   )r  Smallestr   )Znum1Znum2r  numr   r   r   r   r    s   
r  c                 C   s   | t | kS r   )r+  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   )r$  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   r$  rM   r   r  r   PositiveFactorsr   r   r   r   r    s   
r  c                 C   r   r   )r   r   r   r   r   Sign   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   r$  r  r   r   r  r   NonpositiveFactorsr   r   r   r   r  #  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  r0  r1  r   r1   PolynomialInAuxQr  r  r   r  r   r  r   r   r   r   r   r  2  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'  r.  r  r   r   r   PolynomialInQC  s   r  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   b  r	  z!ExponentInAux.<locals>.<listcomp>c                    r  r   r  r   r  r   r   r   c  r	  )
r   r  r0  r1  r1   r  r  r   r   r   r  r   r  r   r  W  s   r  c                 C   r  r   )r  r'  r.  r  r   r   r   
ExponentIne  r"  r  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                    r  r   )PolynomialInSubstAuxr   r  r   r   r   r  r	  z(PolynomialInSubstAux.<locals>.<listcomp>)r  r0  r1  r1   r  r-  r   r  r   r  r   r  h  s   r  c                 C   s:   t ||}tt| t|||||t||t||  iS r   )r.  r  r  r'  r-  r%  r   r  r   r  r   r   r   PolynomialInSubstt  s   
0r  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   Distriby  s   r  c                    sP   t | r|   S t| r| j| j   S t| r$t fdd| jD  S |   S )Nc                    r  r   )DistributeDegreer   r2  r   r   r     r  z$DistributeDegree.<locals>.<listcomp>)r  r0  r1  r1   r  r   r   )r   r2  r   r!  r   r     s   r   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   r0  r1  r   r1   r  r   )r   r   r3  r   r  r   r   r   r   r"    s    


r"  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   )rF  rG  r   rh  r   r   r          z*DivideDegreesOfFactors.<locals>.<listcomp>)r  r   r   rF  rG  r   r3  r   rh  r   DivideDegreesOfFactors  s   r%  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   r8  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   r0  r   r1   r&  r1  r   r  r  r  r  r   r  r   r$  r   )r   r   r  r  r  r   r   r(  r   r&    s0   
 r&  c                 C   r   r   r   r   r   r   r   FullSimplify  r   r*  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   r7  rG  r   r0  r1  r   r*  r+  r  r1   r&  r  r   r$  rC  r%  r-  r   )r   r   r  r   r  r  r   r,  r   r+    s"   


 "
 ,(r+  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   r+  r   r  r7  rG  CommonFactorsr   r  r0  r1  r  r1   r&  r  r   r   r$  rC  r%  r   r  )r   r   r   r  r   r  r<  r   r   r   r   r-    sD   ,$

$

r-  c                 C   s"   t t| |}|t | kr| S |S r   )NormalizeLeadTermSignsNormalizeIntegrandAuxr  r   r   r   NormalizeIntegrand  s   r1  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   r0  r  rP  NormalizeIntegrandFactor)r   r   r   r   r   r   r   r0    s   
r0  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   r6  r   r  r   r8  r   r   r   3  r9  z+NormalizeIntegrandFactor.<locals>.<genexpr>r   c                 3   r6  r   r  r   r8  r   r   r   B  r9  )r0  r   r1   NormalizeIntegrandFactorBaser1  r   r  r   r   r  r   )	r   r   r   r  mir   r   r   r  r   r8  r   r2  -  s4   




r2  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 )	Nr2  r/  r   r   r   ru  r  r.  )r   r  r  r   r3  rR  r  rS  rW  r  r  r2  r  r  r  r  r;  )	r   r   r2  r   r  r   r   r  r  r   r   r   r3  M  s>   








6

r3  c                 C   r  r   )r/  r  r   r   r   r   NormalizeTogetherr  r   r5  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   r/  u  s   
r/  c                 G   sx   t d|gd}t d}t d}| |||  }|r9t|dkr9t|| r9t|| r9|| ||  ||   S |  S )Nr2  r/  r   r  rt  )r   r  r   r  r  )r   r   r2  r   r  r  r   r   r   r7    s   r7  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   NormalizeSumFactorsr6  r  )r   r   r   r   r   r   r8    s   

r8  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 rH  )
r$  r  r  r  r  r1  r1   r  r   r6  )r   r   hr   r   r   r   r6    s   (

r6  c                 C   sD   t | }t|rt|j|rt|j|rt|j||j S t||S r   )r  r0  r7  r1  r   r1   rS  r  r   r   r   NormalizePowerOfLinear  s
   
r:  c                 C   sB   t tt| |}dt| dt|  k r|S |t | kr|S | S )Nr  ru  )r/  r0  r   r  r  r   r   r   SimplifyIntegrand  s   r;  c                 C   s4   t | }t|}t|t|k rt||S t||S r   )r   r  r  r1  r+  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   r
   r  r  r   r  r  ry  SubstForExpnr  r<  )r   r  r  r   r   r   SmartSimplify  s   $r>  c                 C   s<   | |kr|S t | r| S d}| jD ]
}|t|||7 }q|S r   )r  r   r=  )r   r  r  r   r   r   r   r   r=    s   
r=  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.  rt  ru  )r   r  r   r  r>  rR  r  rW  r  r  r[  r  r^  ry  rS  r.  r  r-  r   rP  )	r   r   r   r  r   r  r  r_  r   r   r   r   rS    sD   

 

8

,

L


rS  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   r;    s   


r;  c                 C   s&   | g kr| S t t| tt| ||S r   )	UnifyTermr  r?  r  )r  r   r   r   r   r?    s   r?  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  r@  )Ztermr  r   r  r   r   r   r@    s   
r@  c                 C   r   r   r   r   r   r   r   r  &     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   rB  )  s4   


$
rB  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   rE  G     
rE  c                 C   rC  rD  )	r  r  r  r   r   r  r  r  PureFunctionOfTanhQr  r   r   r   rG  U  rF  rG  c                 C   rC  rD  )	r  r  r  r   r   r  r  r  PureFunctionOfCoshQr  r   r   r   rH  c  rF  rH  c                 C      t t| | S r   )r   r   r  r   r   r   IntegerQuotientQq  r  rJ  c                 C   rI  r   )r  r   r  r   r   r   OddQuotientQu  r  rK  c                 C   rI  r   )r  r   r  r   r   r   EvenQuotientQy  r  rL  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  rF  r  rG  rJ  r   r   rD  FindTrigFactorr  rC  )Zfunc1Zfunc2r   r  r<  r  r   r   r   rN  }  s   ZrN  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   rO  r   r  r   r   r     r  )r  r  r  rJ  r   rK  r  r  r  r  r  r1  r  r1   rP  r  r   r  rN  rb  rf  r  rL  rd  re  rc  rg  r   r   r  r   r  r   r  r   rP    8   
TrP  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   rS  r   r  r   r   r     r  )r  r  r  rJ  r   r  r  r  r1  r  r1   rT  r  rN  rb  rf  r  rc  rg  r   rQ  r   r  r   rT    *   
rT  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  rK  r   r0  r  r1   rV  r1  r  r  r  r%  r'  FunctionOfTanhQr  r  r  r   r   r  r   r  r   r   r  r   rV    s$    

rV  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   rW  r   r  r   r   r     r  z"FunctionOfTanhQ.<locals>.<genexpr>)r  r  r  rJ  r   r  r  rL  r0  r  r1   r1  r  rW  ry  r  r  r  r  rV  r   rX  r   r  r   rW    s*    &

,rW  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   rI  c                 3   r  r   rY  r   r  r   r   r     r  z'FunctionOfTanhWeight.<locals>.<genexpr>c                    r  r   FunctionOfTanhWeightr   r  r   r   r     r	  z(FunctionOfTanhWeight.<locals>.<listcomp>c                    r  r   r[  r   r  r   r   r     r	  )r  r   r  r  rJ  r   r  r   r  r0  r  r1   r1  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   &  r  z(FunctionOfHyperbolicQ.<locals>.<genexpr>)r  r  r  rJ  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>)	r0  r1   r1  r$  SmartDenominatorr  r   r   rK  )r   r3  r   r   r   r   r_  (     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   9  r   z$SmartDenominator.<locals>.<listcomp>)	r0  r1  r1   r$  r_  r  r   r   rJ  )r   r   r3  r   r   r   r`  2  ra  r`  c                 C      | S r   r   r   r   r   r   r  <  rA  r  c                     sh   t | dkr| \}}tt||S | \}}}t||}t| t|r0|j fdd|jD  S  | S )Nr.  c                    r  r   r   r   r   r   r   r   G  r   zExpandTrig.<locals>.<listcomp>)r   r  ru  
ExpandTrigr  r-  r   )r   r   r   r  r  r   r   r   rc  ?  s   

rc  c                 C   r   r   )r#   r   r   r   r   
TrigExpandJ  r   rd  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   w  r  z SubstForTrig.<locals>.<listcomp>r.  c                    r  r   re  r   rg  r   r   r   z  r  )r  r  rJ  r   r   r  r  r  r  r  r  rd  r  r   r-  r  r;   rf  r  )r   ri  rh  r  r   r_  r   rg  r   rf  d  s(    , \" rf  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   rj  r   rl  r   r   r     r  )r  r  rJ  r   r   r  r  r  r  r  r  rd  r  r   r-  r  rU   rk  r  )r   rn  rm  r  r   r_  r   rl  r   rk  |  s(    , \" rk  c                 C   s<   t | tot | tot | tot | tot | tot | tS r   )r   r;   r<   r=   r>   r@   r?   r   r   r   r   InertTrigFreeQ     <ro  c                 C   r   r   )r'   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 rM  )	FractionalPowerOfLinearr   r  r   rG  r   r  r'  r%  )r   r   r  r3  r   r  r  r   r   r   SubstForFractionalPowerOfLinear  s   6 rr  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  r7  r1  r   r   r  rJ  r1   r   rq  r  r   r   r   rq    s   "
rq  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  r7  r   InverseFunctionOfLinearr  )r   r   r   r  r   r   r   rs    s   

rs  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   r;   r<   r=   r>   r@   r?   r   
InertTrigQInertReciprocalQ)r   r   r  r9  r   r  r   rt    s   
rt  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-  r;   r?   r<   r@   r=   r>   r  r   r   r   ru    rp  ru  c                 C   s   t t| ||S r   )FixInertTrigFunctionDeactivateTrigAuxr{  r   r   r   DeactivateTrig  r  rx  c                 C   rb  r   r   r{  r   r   r   rv    rA  rv  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   )rw  r   r8  r   r   r     r  z%DeactivateTrigAux.<locals>.<listcomp>)r  r  r7  r   rS  r  r;   r  r<   r  r=   r  r>   r  r@   r?   r  r   r  r  r  r  r  r-  r  r   r8  r   rw    s:   rw  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  r/  r   r   r  rN  r,  r3  r  TF)r   r  r   )r   r-  r   rN  q_r5  r6  r7  r8  r2  w_r  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 )	Nrt  TrN  r/  r  r  r   F)r   PiecewiseLinearQr7  r   r  r  typer   r  rP   rV   rW   rQ   r\   r=   r>   r_   )
r   r   r  r   r7  r  r3  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   r/  r  r   r-  r2  ABCr.  F)r   r	   r  r7  r   r  r-  )r  r   r   r5  r6  Zfunc_rO  A_B_C_r  r-  r   r   r   KnownTrigIntegrandQ5  sP   "&. r  c                 C      t ttg| |S r   )r  r;   r<   r{  r   r   r   KnownSineIntegrandQf  r  r  c                 C      t tg| |S r   )r  r=   r{  r   r   r   KnownTangentIntegrandQi  r  r  c                 C   r  r   )r  r>   r{  r   r   r   KnownCotangentIntegrandQl  r  r  c                 C   r  r   )r  r@   r?   r{  r   r   r   KnownSecantIntegrandQo  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   r/  r  rN  r~  r   ru  TF)r   r-  r  r\   r_   rP   rQ   r   r  r   r=   r>   rV   rW   r7  )	r   r   r5  r6  r7  G_r  r  r~  r   r   r   TryPureTanSubstr  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   r/  r2  r  Zrstnbfgru  c                    r0  r   r   r   r  r   r   r     r   z TryTanhSubst.<locals>.<listcomp>r   c                    r0  r   r   r   r  r   r   r     r   r.  r   r  c                    r0  r   r   r   r  r   r   r     r   T)r  r   r-  r   mapr  r   r   r   r  r   r   r  re  rf  ru  )r   r   r5  rO  rN  r_s_t_r2  r6  r:  g_r_  r  r  r3  r   r  r   r  r2  r  r   r  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   r/  r~  Fr   r.  T)r-  r   r   r   r  r   r  rP   rQ   rV   rW   ru  )r   r   r  r5  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 r'  r   r   r   r   r   r        " z'AbsurdNumberGCDList.<locals>.<listcomp>c                 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   sX   t t|||| i| ||i}t|r(d}|jD ]}|| | 7 }q|S | | S r   )ry  rd  r   r  r   )	r   r  r  r2  r3  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 )Nrt  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   r/  r3  r   r  r   )r   r  r   r   r  r  r   rS  )r  r   r   r3  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   )
rewriter;   r  r<   r=   r@   r?   r>   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   r;  ru  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   )r0  )r   r   r   r   r   r   ?  r   zTrigReduce.<locals>.<genexpr>r   r  r  r   r.  )r  r   r  r  r   r  r;   rU   r  r<   rT   r$   r   r   ry   r   r  r   r   r0  )r   r  r   r   r  r  r  r   r   r   r  '  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  r7  r   rG  r   r$  rK  r  r   r  r   )
r   r   r   r  r   r  rN  r,  r  r   r   r   r   r  z  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  r7  r   r  r0  r   r1   AlgebraicTrigFunctionQr1  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  r7  r   rG  r   r$  rK  r  )	r   r   r  r   r  rN  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  rE  r  r  rH  r  rG  r  PureFunctionOfCothQFunctionOfExpnQFunctionOfSinQFunctionOfCosQFunctionOfTanQrP  rT  rW  )r  r   r   Z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 rM  )r  r  r0  r   r1   r   r1  r   r$  r   r  r  r  r  r%  r'  r  r  r   r  r  r  )r   r  r   r  r  r  r   r   r   r   r    sP   

.

r  c                 C   rC  rD  )	r  r  r  r   r   r  r  r  r  r  r   r   r   r  =     
r  c                 C   rC  rD  )	r  r  r  r   r   r  r  r  r  r  r   r   r   r  J  r  r  c                 C   rC  rD  )	r  r  r  r   r   r  r  r  r  r  r   r   r   r  W  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 rD  )r  r  r  r   r   r  r  r  r  r   r   r   r  d  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  rJ  r   r  r  r  r1  r  r1   r  r  rN  r;   r?   r  r  r=   r>   r   rQ  r   r  r   r  q  rU  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  rJ  r   rK  r  r  r  r  r  r1  r  r1   r  r  r   r  rN  r;   rY   r  rL  r  r<   r@   r=   r>   r   rQ  r   r  r   r    rR  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  rK  r   r0  r  r1   r  r1  r  r%  r'  r  r  r  r  r  r   rX  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  rJ  r   r  r  rL  r0  r  r1   r1  r  r  ry  r  r  r  r  r  r   rX  r   r  r   r    s*    &

,r  c                    rZ  )	Nr   r   rI  c                 3   r  r   r  r   r  r   r   r     r  z&FunctionOfTanWeight.<locals>.<genexpr>c                    r  r   FunctionOfTanWeightr   r  r   r   r     r	  z'FunctionOfTanWeight.<locals>.<listcomp>c                    r  r   r  r   r  r   r   r     r	  )r  r   r  r  rJ  r   r  r   r  r0  r  r1   r1  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  rJ  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   r6  r   )FunctionOfDensePolynomialsQr   r8  r   r   r     r9  z.FunctionOfDensePolynomialsQ.<locals>.<genexpr>)r   r  r  r  r   r   r{  r   r8  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  r3  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 rM  )r   PowerVariableDegreePowerVariableSubst)r   r2  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  r0  r1  r   r1   r   r  r   r  )r   r2  rN  r   r  r   r  r   r   r   r  8  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  r0  r1  r1   r  r   r  r  )r   r2  r   r   r   r   r   r   r  O  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   r/  r  r3  r   r2  r  r   r  r  g      ?Trv  r.  rt  F)r   r  r   r   r   r  r  r$  r   rR  r   r   )
r   r   r   r  r3  r2  r  r   r  r  r   r   r   EulerIntegrandQa  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   r2  r3  r  c                 S   s   t | ||||g|S r   rz  )r   r  r2  r3  r  r   r   r   r   r  ~  r   z1FunctionOfSquareRootOfQuadratic.<locals>.<lambda>Fr.  ru  rt  ) r   r   r   rv  r   r5  rN  r   r   FunctionOfSquareRootOfQuadraticr  r   rG  r   r  r  r   r   SquareRootOfQuadraticSubstr>  r*  r   r0  r1   r  rJ  r  r1  r  r  r  r   )r   r   r   r  r  r  r   r  rN  rA   r   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   r0  r1   r  rJ  r  r1  r  rK  r  r  r   r  )r   ZvvZxxr   r  r   r   r   r   r    s*   4

r  c                 C   s   t ||  }t||r|S dS r   )r   r   )r)  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   rz  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)r)  r   r   r   r   r   f1  s   
"
zDerivativeDivides.<locals>.f1F)r   r   r   r   r   r6  r   Dr  r   r   )r)  r   r   r   Z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   r/  r2  r   TFr.  )r   r  r  r  r   r  r  r   rR  ProductOfLinearPowersQr  rf  r  r  r  r  )r   r   r   r2  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  r3  r/  )r   r  r   r7  r  r  r  r  )r   r   r  r3  r  r   r   r   r    s   @r  c                 C   rL  r   )RtAuxr  r$  r   r   r   r    r  r  c                 C   s   t | td|  S r  )r"   r   r$  r   r   r   NthRoot  r  r  c                 C   ,   t | pt| ot| jd ot| jd S r  )r  r0  r  r   	AtomBaseQr   r   r   r   r       ,r  c                 C   r  r  )r  r0  r  r   SumBaseQr   r   r   r   r     r  r  c                 C   s8   t | r
tt| pt| ot| jd ot| jd S r  )r  r  r  r0  r  r   NegSumBaseQr   r   r   r   r  $  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   )	r0  r  r1   AllNegTermQr1  r  r  r  r  r   r   r   r   r  (     

r  c                 C   sD   t | rt| jrt| jS t| rtt| ptt| S t| S r   )	r0  r  r1   SomeNegTermQr1  r  r  r  r  r   r   r   r   r  1  r  r  c                 C   s0   t | ot| jd dotttgt| jd S Nr   r.  r   )r0  r  r   r  r;   r<   r  r   r   r   r   TrigSquareQ:  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   rI  c                    r  r   )r  r   rh  r   r   r   r  r  zRtAux.<locals>.<listcomp>) r0  r1  r1   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   r3  r   r  r  r  r   rh  r   r  >  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  r;   r<   )r   r   r  r  r   r   r   r  }  s   

$$r  c                    s   t  fdd| jD  S )Nc                    r  r   )r-   r   r8  r   r   r     r  zIntSum.<locals>.<listcomp>)r   r   r{  r   r8  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 )	NrN  r/  r2  r   r  r.  r   rt  )r   r  r   r   r7  rQ  r  r,  rG  r   r  r   IntTermDistr%  r-   r'  )	r   r   rN  r2  r  r  r  r   r   r   r   r   r    s    ,0.>
r  c                 C   s4   g }t dt|D ]}|| || ||  q	|S r   )rj  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   r8  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   r8  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  r0  r1   r  r1  r   r  r  r  r   r   r  SameQr   r.  r  r  r  )r   r   r  r  r  r  r   r8  r   r    s0   

$$&r  c                  G   s6   t dt| d D ]}| | | |d  kr dS q	dS rh  )rj  r   rm  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   )r  r   r   r     r   Tc                 S   r   r   )rC  r   r   r   r   r     r   r   c                 S   r   r   rD  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   r$  r   r   r   r   r     r   c                       g | ]
}t |t  qS r   r*  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  r  r   r   r     r#  c                 S   r   r   r  r   r   r   r   r     r   c                 S   r   r   )rG  r   r   r   r   r     r   c                 S   r   r   )rF  r   r   r   r   r     r   c                    $   g | ]}|  |    qS r   r   r   r1  r  r  r  r   r   r     r)  c                 S   r   r   r  r   r   r   r   r     r   r.  r   rI  c                    r  r   r   r   r  r   r   r     r)  c                 S   r   r   r  r   r   r   r   r     r   c                    r  r   r   r   r  r   r   r     r)  c                 S   r   r   r  r   r   r   r   r     r   c                 s   r  rs  r   r   r   r   r   r     r   )r  r  r   r  r  r  rj  r   r$  r  rF  r  r   r   r   r  r   MostMainFactorPositionr  rD  r  )r  r  commonr   )r1  r  r  r  r  r   r.    sx    ",


"(


"
r.  c                 C   sB   t d}d}tdt| D ]}t| | |dkr| | }|}q|S r  )r   rj  r  r
  )r  r
   r  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  r;   FunctionOfExponentialFunctionAuxr{  r   r   r   FunctionOfExponentialFunction'  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   r8  r   r   r   J  r  z4FunctionOfExponentialFunctionAux.<locals>.<listcomp>)r  r0  r   r1  r7  r1   r   rG  r  r*  r  r  r  r   r  r  r  r  r  r  r  r  r  r-  )r   r   r  r   r8  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   r6  r   )r  r   r8  r   r   r   _  r9  z,FunctionOfExponentialTest.<locals>.<genexpr>)r   r  r0  r1  r7  r1   r  FunctionOfExponentialTestAuxr  r   r   r  r  r  r  r   r{  r   r8  r   r  L  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  r*  r  rG  r  r$  r   r   r   rJ  r  )r1  Zexponr   r  r   r   r   r  a  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   Z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   sumrA   )r  Z	num_itemsZdifferencesZsq_differencesZssdZvariancesdr   r  r   stdevx  s   r  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)Zforcer  r   (   c                       i | ]}| qS r   r   r   r  Zrand_xr   r   
<dictcomp>  r  zrubi_test.<locals>.<dictcomp>
   c                    r  r   r   r   r  r   r   r    r  F)sympyr"   r   r?   r@   r>   rY   rX   rW   process_trigry   r  r{   r2   r  rj  r   r  r  absr   r3  r  r)   diffr   r$   )r   r   Zoptimal_outputr$   Z_hyper_checkZ_diffZ
_numericalr"   r   r   Zrand_valr   ZsubstitutionsZdresr_  r  r   r  r   	rubi_test  sl   



r	  c                 C   s   | r|S |S r   r   )Zcondr  r   r   r   r   rp    s   rp  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.  ru  r   rt  	   )r   r   r   r   r   )r   r  rN  r,  r  r2  r  r   r   r   r   IntQuadraticQ  s   r  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.  ru  rt     r   rv  r  )r   r   r   r   r   )r   r   r  rN  r,  r3  r  r   r   r2  r  r   r   r   IntBinomialQ  s   vlr  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.  ru  r   c                 s   r   r   r  r   r   r   r   r     r   )r   r  r  r  r   r   r   r   RectifyTangentr`  r  rJ  r  r  r,  r   r  r  SimplifyAntiderivativerW  r  r<   r;   r   rZ  r_  r/  r   r   r   r   r  r_  r   r  r  rN  r,  r  r  ZnumrZdenrr   r   r   r    sf   P
*
$\
@DBr  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   r  r   r   r   r   r   #  r   z#RectifyCotangent.<locals>.<genexpr>r.  ru  r   c                 s   r   r   r  r   r   r   r   r   6  r   )r   r  r  r  r   r   r   r   r  r`  r  rJ  r  r  r,  r   r  r  RectifyCotangentr  rW  r  r;   r<   r   rZ  r_  r/  r  r   r   r   r    s\   P
*
&^
BBr  c                  G   s\   | dd d }| dd d }g }t dt|D ]}||| || ||d   qt|S r  )rj  r   r  r   )r   r   r  r_  r   r   r   r   
InequalityO  s   "r  c                 C   s   |r| S t d)NzIn Condition())rl  )r_  rN  r   r   r   	ConditionW  s   r  c                 C   s   t | } tt| |S r   )r   r8  SimpHelpr{  r   r   r   rQ  ^  s   rQ  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   r8  r   r   r   y  r  zSimpHelp.<locals>.<listcomp>c                    r  r   )SimpFixFactorr   r8  r   r   r     r  r   r/  r  r   r3  Frt  r      Tc                    r  r   r  r   r8  r   r   r     r  c                    r  r   r  r   r8  r   r   r     r  )r  r   r>  r  r  r%  r'  r  r  r   r   r  r  r  r  r*   r   r  r  r   r  r  rG  r   r-  )r   r   r  r  ZPir5  r6  r2  r  r  r2  r   r   r8  r   r  b  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  r  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 )Nru  r   r.  r   rI  )r   r;  SubstForr  r*  r  r  r%  r'  r  rf  r>  r   r  r  r  r  r  r  rk  r  r  r  r  r  SubstForAux)r   r  r  r   r   r   r   r   r    sB   
""66**"
"
6
6
*
*r  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                    r  r   )r  r   r  r   r   r     r	  zSubstForAux.<locals>.<listcomp>)r  r0  r   r1   r   r1  r   r  r  r  r  r%  r'  r  r-  r   r  r   r  r   r    s*   
r  c                 C   r   r   )rg   r8  r   r   r   FresnelS  r   r  c                 C   r   r   )rf   r8  r   r   r   FresnelC  r   r  c                 C   r   r   )rB   r8  r   r   r   Erf   r   r  c                 C   r   r   )rh   r8  r   r   r   Erfc  r   r   c                 C   r   r   )ri   r8  r   r   r   Erfi  r   r!  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   rC   rC  rD   )r   r   r   r  r   r   r   r   
  s   
z
Gamma.evalNr   r   r   r   r   r   r   r   r   r#  	      r#  c                 C   s0   t | d |rt| |rtt | d ||rdS dS r  )r  r  r-  r{  r   r   r   FunctionOfTrigOfLinearQ  s   (r&  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  r0  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   Complex)  r   r'  c                 C   r  r   r   r  r   r   r   rk  ,  r   rk  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  3  r  z _SimpFixFactor.<locals>.<lambda>c              	   S   s.   t tt|tttt ||t | |||S r   r   r)   r   r  r   )r  rN  r   r   r  r,  r   r   r   r  4  s   . rN  c                 S   r   r   r   r(  r   r   r   r  7  r  c              
   S   s6   t tt|tttt ||t | |t ||||S r   r)  )r  rN  r   r   r   r  r  r,  r   r   r   r  8     6 r3  c                 S   r   r   rz  r   r   r   r   r   r  ;  r  c                 S   r   r   rz  r  r   r   r   r   r  ;  r  c                 S   r   r   rz  rN  r   r   r   r   r  ;  r  c                 S   r   r   r   r3  r  r   r   r   r  ;  r  c                 S   r   r   r  rN  r   r   r   r  ;  r  c                 S   r   r   r  r_  r   r   r   r  ;  r  c                 S      t | tdS r   rp  r   r2  r   r   r   r  ;  r  c                 S   sJ   t t|t ||ttt|t t | tt||tdt||||S rr  r   r)   r  r   r   r  rN  r_  r3  r   r   r  r   r   r   r  <     J c                 S   r   r   rz  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  c                 S   r   r   r.  r/  r   r   r   r  ?  r  c                 S   r   r   r0  r1  r   r   r   r  ?  r  c                 S   r   r   r  r2  r   r   r   r  ?  r  c                 S   r3  r   r4  r2  r   r   r   r  ?  r  c                 S   sJ   t t|t ||tttt |tt||tdt | t||||S rr  r5  r6  r   r   r   r  @  r7  r  r_  c                 S   r   r   rz  r+  r   r   r   r  C  r  c                 S   r   r   rz  r,  r   r   r   r  C  r  c                 S   r   r   rz  r-  r   r   r   r  C  r  c                 S   r   r   r.  r/  r   r   r   r  C  r  c                 S   
   t || S r   r  r_  r  r   r   r   r  C  r  c                 S      t tdt|t| S r   r  r   rp  rn  r9  r   r   r   r  C  r   c                 S      t t|t|| tdS rr  rk  r)   r   r   )r  rN  r  r   r   r   r  C  r  c                 S   sL   t t|t ||ttt|t | t|t|t td|t||||S rr  r5  r  rN  r_  r3  r   r   r  r  r   r   r   r  D  s   L c                 S   r   r   rz  r+  r   r   r   r  G  r  c                 S   r   r   rz  r,  r   r   r   r  G  r  c                 S   r   r   rz  r-  r   r   r   r  G  r  c                 S   r   r   r.  r/  r   r   r   r  G  r  c                 S   r8  r   r  r9  r   r   r   r  G  r  c                 S      t td|| S r   r4  )r  r_  r   r   r   r  G  r  c                 S   r<  rr  r=  )r  rN  r_  r   r   r   r  G  r  c                 S   sP   t t|t ||tttt |t|t|t td|t | t||||S rr  r5  r>  r   r   r   r  H     P )r   r   r   r)   r   r   r'  r   r7  r   r8  rv  r   r   addr9  r:  r  replacerr}  r~  r  r  r  rule3r  rule4pattern5rule5pattern6rule6r   r   r   _SimpFixFactor/  s(   b
~




rJ  c                 C   "   t t| |}t|tr| S |S r   )SimpFixFactor_replacerr   r   r   r   r   r_  r   r   r   r  M     
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  rh  r   r   r   ri  W  r   z_FixSimplify.<locals>.cons_f1c                 S   r   r   r  r!  r   r   r   rl  [  r   z_FixSimplify.<locals>.cons_f2c                 S   r   r   rg  rh  r   r   r   cons_f3_  r   z_FixSimplify.<locals>.cons_f3c                 S   r   r   r4  r   r   r   r   cons_f4c  r   z_FixSimplify.<locals>.cons_f4c                 S   r   r   rP  r  r   r   r   cons_f5g  r   z_FixSimplify.<locals>.cons_f5c                 S   r   r   r   r   r   r   r   cons_f6k  r   z_FixSimplify.<locals>.cons_f6c                 S   r   r   rT  rR  r   r   r   cons_f7o  r   z_FixSimplify.<locals>.cons_f7c                 S   s   t td|  S r  )r4  r   rR  r   r   r   cons_f8s  r  z_FixSimplify.<locals>.cons_f8c                 S   r   r   r   r!  r   r   r   cons_f9w  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  )r3  r2  r   r  r   r   r   cons_f11  r  z_FixSimplify.<locals>.cons_f11c                 S   r3  r   rq  r   r   r   r   r   cons_f12  r  z_FixSimplify.<locals>.cons_f12c                 S   r3  r   r[  r  r   r   r   cons_f13  r  z_FixSimplify.<locals>.cons_f13c                 S   r   r   r   r(  r   r   r   cons_f14  r   z_FixSimplify.<locals>.cons_f14c                 S   r   r   r   r(  r   r   r   cons_f15  r   z_FixSimplify.<locals>.cons_f15c                 S   s   t | |  tdS r   r[  r  r3  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   rh  r   r   r   cons_f18  r   z_FixSimplify.<locals>.cons_f18c                 S   s   t | | ||   S r   r   )rN  r   r  r,  r   r   r   cons_f19  r  z_FixSimplify.<locals>.cons_f19c                 S   r  r   r  r$  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   r8  r   r  r3  r2  r   r   r   cons_f22  r   z_FixSimplify.<locals>.cons_f22c                 S   r:  r   r;  rl  r   r   r   cons_f23  r  z_FixSimplify.<locals>.cons_f23c                 S      t ||| S r   r  r  r3  r2  r   r   r   cons_f24  r   z_FixSimplify.<locals>.cons_f24c                 S   s   t tdt|t|t| S r   r;  rp  r   r   r   cons_f25  r"  z_FixSimplify.<locals>.cons_f25c              
   S   s   t tdt|t|t| t|	S r   r;  )r  r3  r2  r   r   r   r   cons_f26     z_FixSimplify.<locals>.cons_f26c                 S   r  r   ri  r  r   r   r   cons_f27  r   z_FixSimplify.<locals>.cons_f27c                 S   r3  r   r4  rh  r   r   r   cons_f28  r  z_FixSimplify.<locals>.cons_f28c                 S   s   t |||    S r   r   )r3  r  r  r   r   r   cons_f29  r   z_FixSimplify.<locals>.cons_f29c                 S   r   r   r   rh  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   rb  r   r   r   cons_f32  r   z_FixSimplify.<locals>.cons_f32c                 S   s   t ||  S r   r   ry  r   r   r   cons_f33  r   z_FixSimplify.<locals>.cons_f33c                 S   s   t |||  S r   r.  rb  r   r   r   cons_f34  r  z_FixSimplify.<locals>.cons_f34c                 S   r   r   r0  r   r   r   r   cons_f35  r   z_FixSimplify.<locals>.cons_f35c                 S   r   r   r0  r]  r   r   r   cons_f36  r   z_FixSimplify.<locals>.cons_f36r   r  r   r3  r   c                 S   sN   t d| t d t dd   | | t|| |tt dt d  |   S )NrI  r.  r   r   )r   r<  r'  )r3  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  rr   r  r4  r2  r3  r   r  r  r   r   r   r   rz    s   $z_FixSimplify.<locals>.With2r2  r  c                 S   s:   || t | |  ||t | |   }t||t | |  S r   r  r<  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  r2  r3  r   r  r  r   r  rN  r   r   r   With6  s   z_FixSimplify.<locals>.With6r  c           	      S   s8   |||   ||  }t ||||   | ||  |   S r   r<  r  r   r   r   replacement6  s   $z"_FixSimplify.<locals>.replacement6c                 S   s6   t |||  | td|  || |    | |  S rr  r<  r   )r  r2  r3  r   r  r  r   r  r   r   r   replacement7  s   6z"_FixSimplify.<locals>.replacement7c                    s   || }t | rdS dS r  rz  r2  r,  r3  r  rN  r   r  r   Plusr   r   With8!  s   
z_FixSimplify.<locals>.With8c                 S   s(   || }t ||  | || | |   S r   r  r  r   r   r   replacement8'  s    z"_FixSimplify.<locals>.replacement8r  c                 S   s.   t || |  | ||  |  | | |  S r   r  )r2  r3  r   r  r  r   r  r   r   r   replacement9,     .z"_FixSimplify.<locals>.replacement9r   c	           	      S   s@   t |||  | || |  | || |   |  | |  S r   r  )	r  r2  r3  r   r  r  r   r   r  r   r   r   replacement100  r5  z#_FixSimplify.<locals>.replacement10r   r)  c                 S   sR   t |||
  | || |  | || |   |  || |  |	  | |
  S r   r  )r  r2  r3  r   r   r  r  r   r   r)  r  r   r   r   replacement114     Rz#_FixSimplify.<locals>.replacement11r  rN  r,  r   c                 S   s(   t ||t|t || | |     S r   r<  rA   )r,  r   r  r  rN  r   r  r   r   r   replacement128  s   (z#_FixSimplify.<locals>.replacement12c                 S   s$   t || t|t || |    S r   r  )r   r  r  rN  r   r  r   r   r   replacement13<  s   $z#_FixSimplify.<locals>.replacement13c                 S   s    t || t|t ||    S r   r  )r   r  r  r   r  r   r   r   replacement14@      z#_FixSimplify.<locals>.replacement14c                 S   s   t ||| td    S rr  r  r2  r3  r   r  r  r   r   r   replacement15D     z#_FixSimplify.<locals>.replacement15c                 S   s    t d| t||| |    S rr  r   r<  r  r   r   r   replacement16H  r  z#_FixSimplify.<locals>.replacement16c                 S   s.   t d||   t|||   |||      S rr  r  r  r2  r3  r   r  r  r   r   r   replacement17L  r  z#_FixSimplify.<locals>.replacement17c                 S   s2   t d|||    t|||   |||      S rr  r  r  r   r   r   replacement18P  s   2z#_FixSimplify.<locals>.replacement18c                 S   s    ||t d |t d  |   S r  r   )r2  r   r   r  r   r   r   replacement19T  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,  rN  r2  r   r   r   r   replacement20X  rt  z#_FixSimplify.<locals>.replacement20ic                 S   r  r  r  r  r   r   r   replacement21\  rt  z#_FixSimplify.<locals>.replacement21c                 S   rb  r   r   r   r   r   r   replacement22`  rA  z#_FixSimplify.<locals>.replacement22)r   r   r   r   rz  r'  r   r6  r   r5  r   r1  r3  r2  rO  r7  r8  rA   rN  r  )ri  r{  rl  r|  rO  cons3rQ  cons4rS  cons5rU  cons6rV  cons7rW  cons8rX  cons9rY  cons10rZ  cons11r\  cons12r^  cons13r`  cons14ra  cons15rc  cons16re  cons17rg  cons18rh  cons19rj  cons20rk  cons21rm  cons22rn  cons23rq  cons24rr  cons25rs  cons26ru  cons27rv  cons28rw  cons29rx  cons30rz  cons31r{  cons32r|  cons33r}  cons34r~  cons35r  cons36r}  r  r~  rz  r  r  r  r  r  r  rD  r  r  r  rE  r  rF  r  rG  r  rH  r  rI  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   _FixSimplifyT  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   h  r  zFixSimplify.<locals>.<listcomp>)r   r   r  rq   r   r   r  r   r   r   r   r<  e  s   r<  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   r3  r  r  r  r   c                 S   r   r   rz  r+  r   r   r   r  o  r  z,_SimplifyAntiderivativeSum.<locals>.<lambda>c                 S   r   r   rz  r,  r   r   r   r  o  r  c                 S   r   r   rz  r  r   r   r   r   r  o  r  c                 S   r   r   rz  r  r   r   r   r   r  o  r  c                 S   r   r   r   rh  r   r   r   r  o  r  c                 S      t tt||ttd| S r  r   r   r   r   r  r  r3  r   r   r   r  o      c                 S   sF   t t||t|ttt t|tt|| t|tt|| |S r   r   SimplifyAntiderivativeSumr   r  r,  r)   r  r  )r3  r   r  r  r  r  r   r   r   r   r   r  p     F c                 S   r   r   rz  r+  r   r   r   r  s  r  c                 S   r   r   rz  r,  r   r   r   r  s  r  c                 S   r   r   rz  r  r   r   r   r  s  r  c                 S   r   r   rz  r  r   r   r   r  s  r  c                 S   r   r   r   rh  r   r   r   r  s  r  c                 S   r  r  r  r  r   r   r   r  s  r  c                 S   sF   t t||t|ttt t|tt|| t|tt|| |S r   )r   r  r   r  r,  r)   r  r  )r3  r   r  r  r  r  r   r   r   r   r   r  t  r  r,  c                 S   r   r   rz  r+  r   r   r   r  w  r  c                 S   r   r   rz  r,  r   r   r   r  w  r  c                 S   r   r   rz  r-  r   r   r   r  w  r  c                 S   r   r   rz  r,  r   r   r   r   r  w  r  c                 S   r   r   rz  r  r   r   r   r  w  r  c                 S   r   r   rz  r  r   r   r   r  w  r  c                 S   r   r   r   rh  r   r   r   r  w  r  c                 S      t t|| S r   r   r   r  r  r   r   r   r  w  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   r  )
r3  r   r  r  r  r  r   rN  r,  r   r   r   r   r  x     ~ c                 S   r   r   rz  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  c                 S   r   r   rz  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  c                 S   r   r   r   rh  r   r   r   r  {  r  c                 S   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   r  )
r3  r   r  r  r  r  rN  r   r,  r   r   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  c                 S   r   r   rz  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   rz  r   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  c                 S   r   r   rz  r  r   r   r   r   r    r  c                 S   r   r   r   rh  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|| |t|ttt t|tt|| t|	tt|| |S r   r  )r3  r  r   r  r  r  r  r   rN  r   r,  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  c                 S   r   r   rz  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  c                 S   r   r   rz  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  c                 S   r   r   rz  r  r   r   r   r    r  c                 S   r   r   r   rh  r   r   r   r    r  c                 S   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|| |t|ttt t|	tt|| t|tt|| |S r   r  )r3  r  r   r  r  r  r  rN  r   r   r,  r   r  r   r   r   r    r  )r   r   r   r   r   r  r5  r   r   r)   r  r1  r  rv  r   r   rA  r  r  r7  r9  rB  r   r   r   _SimplifyAntiderivativeSumk  s,   



L 
L 
r	  c                 C   rK  r   )"SimplifyAntiderivativeSum_replacerr   r   r   rM  r   r   r   r    rN  r  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   rz  r-  r   r   r   r    r  z)_SimplifyAntiderivative.<locals>.<lambda>c                 S   s   t t|| S r   )r  r  )r   rN  r   r   r   r   r    r  c                 S   r   r   rz  r3  r   r   r   r   r    r  c                 S   s   t |tt|| S r   )r   r  r  )r   r3  r   r   r   r   r    r   c                 S   r   r   rz  r  r   r   r   r    r  c                 S   s   t t|t|| S r   )r   r  r  )r   r   r   r   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  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   r  r  r  r   r  r   r   r   r   r   r    s   > c                 S   r   r   rz  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   sH   t ttttd|t|tdt|| ttdttt|| S r  )r   r   r   r)   r  r  r  r  r   r   r   r    s   H r   c                 S   r   r   rz  r+  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  r  r   r   r   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  r   r   r   r   r    r  c                 S   r  r  r  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   s"   t tdttt |t|| S r  )r   r   r  rW  rc  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  r   r   r   r   r    r  c                 S      t |tt|ttdt| S r  r  r   r   r   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  r   r   r   r   r    r  c                 S   r  r  r  r  r   r   r   r    r  c                 S   r8  r   r  r   r   r   r   r   r    r  c                 S   r8  r   r  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  r   r   r   r   r    r  c                 S   r  r  r  r   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  r   r   r   r   r    r  c                 S   r  r  r  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   s,   t tdttt t|t|td| S r  )r   r   r  rW  rc  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  r   r   r   r   r    r  c                 S      t |tt|t| S r   r  r   r   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  r   r   r   r   r    r  c                 S   r  r   r  r  r   r   r   r    r   c                 S   r8  r   r  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   s"   t ttt|t|td| S r  )r  rZ  r   rc  r)   r   r  r   r   r   r    r  c                 S   r8  r   r  r  r   r   r   r    r  rN  c                 S   r   r   rz  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  c                 S   r  r  r   r   r)   r   rN  r   r   r   r   r    r  c                 S   r  r  r  rN  r  r   r   r   r    r  c                 S   r   r   r  r   r   r   r   r    r  c                 S       t |t||t||td| S r  )r  r   r   r   r   r  r   rN  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  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  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dt| S r  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  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  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#  c                 S   r   r   rz  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  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.  c                 S   r   r   rz  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  c                 S   r   r   r  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.  )rp  r  rJ  r  r  rW  r5  r   r   r   r  r  r)   r"  r   r   r   r    s    n 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  c                 S   r   r   rz  r-  r   r   r   r    r  c                 S   r   r   r  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  r  rW  r   r   r)   r   r  )	r   r,  r   r  r   r  r   rN  r  r   r   r   r    s   t c                 S   r   r   rz  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   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 r%  )rp  r  rJ  r  r  rW  r5  r   r   r   r  r)   )r   rN  r   r   r   r   r   r    s     c                 S   r   r   rz  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   s`   t tt|t|t|tdtttd|||t|t|t|tdtt|td| S r  r&  )r   r   r   r   rN  r  r   r   r   r    s   ` )r   r   r   r  r   r7  r1  rv  r   r   rA  r)   r2  r:  r   r5  r   r   r  r  rW  rX  rc  rZ  rY  rg  )9rC  r  r  r  rD  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  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                    r  r   r   r   r1  r   r   r     r   z*SimplifyAntiderivative.<locals>.<listcomp>r   c                    r  r   r  r   r8  r   r   r   *  r  )SimplifyAntiderivative_replacerr   r   r   r  r   r   r   r  r  r(  r   r  r  r>   r@   r?   rW   rX   rY   r  r  r\   r_   rP   rQ   r,  r  )r   r   r_  r   r   r  r  r~  r   r-  r   r    sJ   









r  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   r2  r  r3  c                 S   r   r   )rt  rR  r   r   r   r  3  r  z"_TrigSimplifyAux.<locals>.<lambda>c                 S   r   r   r   r(  r   r   r   r  3  r  c                 S   r8  r   r  rl  r   r   r   r  3  r  c                 S   r8  r   )rp  rl  r   r   r   r  3  r  c                 S   sD   t |t|t ||ttt|t |t|t| t td||S rr  )r   r)   r  r   r   r3  r   r  r2  r   r  r  r   r   r   r  4  s   D 2r  r   c                 S   r8  r   r  r  r   r   r   r  7  r  c                 S   
   t ||S r   r   r   r  r  r   r   r   r   r  8  r  c                 S      t |ttd| S rr  r  r   r   r  r   r   r   r  ;  r   c                 S   r@  r   rA  rB  r   r   r   r  <  r  c                 S   rC  rr  rD  r  r   r   r   r  ?  r   c                 S   r@  r   rA  rB  r   r   r   r  @  r  c                 S   s6   t ttt|ttd|t t|td||| S )NrI  r>  )r)   r   r   r   r  r3  r   r   r  r  r   r   r   r  D  r*  r  c                 S      t | ttd|S rr  rD  r  r   r   r   r  G  r   c                 S      t t| tt|td|S Nr>  )r   r   r)   r  r   r   r  r   r  r   r   r   r  H  r  c                 S   rF  rr  rD  r  r   r   r   r  K  r   c                 S      t t|tt| td|S rH  )r   r   r)   r  r   r   r  r  r   r   r   r   r  L  r  c                 S   r   r   r?  r  r   r   r   r  O  r  c                 S   rG  rH  )r   r   r)   r  r   rI  r   r   r   r  P  r  c                 S   r   r   r?  r  r   r   r   r  S  r  c                 S   rJ  rH  )r   r   r)   r  r   rK  r   r   r   r  T  r  c                 S   rF  rr  rD  r  r   r   r   r  W  r   c                 S   s   t t|tt|td|S rH  )r   r   r)   r  r   rI  r   r   r   r  X  r  c                 S   rF  rr  rD  r  r   r   r   r  [  r   c                 S   s   t t|tt| td|S rH  )r   r   r)   r  r   rK  r   r   r   r  \  r  rI  c              	   S   ,   t tt|tdttdt| tdS Nr>  rI  r   r   r)   r   r   r  r   r   r   r  _  r  c                 S   B   t | tt tdt|tdt tdt t|t|tdS Nr   rI  )r   r   r   r)   r  rB  r   r   r   r  `     B c              	   S   rL  rM  rN  r  r   r   r   r  c  r  c                 S   rO  rP  )r   r   r   r)   r  rB  r   r   r   r  d  rQ  c                 S   r   r   r_  rh  r   r   r   r  g  r  c                 S   r   r   r(  r   r   r   r   r  g  r  c              
   S   *   t |tt|t |tt|| tdS rr  )r   r)   r   r  r   rE  r   r   r   r  h  r$  c                 S   r   r   r_  rh  r   r   r   r  k  r  c                 S   r   r   rR  r   r   r   r   r  k  r  c              
   S   rS  rr  )r   r)   r   r  r   rE  r   r   r   r  l  r$  c                 S   r   r   r_  rh  r   r   r   r  o  r  c                 S   r   r   rR  r   r   r   r   r  o  r  c              
   S   rS  rr  )r   r)   r   r  r   rE  r   r   r   r  p  r$  c                 S   r   r   r_  rh  r   r   r   r  s  r  c                 S   r   r   rR  r   r   r   r   r  s  r  c              
   S   rS  rr  )r   r)   r   r  r   rE  r   r   r   r  t  r$  c                 S   r   r   r_  rh  r   r   r   r  w  r  c                 S   r   r   rR  r   r   r   r   r  w  r  c                 S   :   t |t tt|| tt|t |tt|| tdS rr  )r   r)   r  r   r  r   rE  r   r   r   r  x     : c                 S   r   r   r_  rh  r   r   r   r  {  r  c                 S   r   r   rR  r   r   r   r   r  {  r  c                 S   rT  rr  )r   r)   r  r   r  r   rE  r   r   r   r  |  rU  r  c                 S   r   r   r.  r/  r   r   r   r    r  c                 S   8   t |tt|t | |tt|t |tt|| |S r   )r   r)   r  r   r  r3  r   r  r   r  r  r   r   r   r       8 c                 S   r   r   r.  r/  r   r   r   r    r  c                 S   rV  r   )r   r)   r  r   r  rW  r   r   r   r    rX  c                 S   r   r   r.  r/  r   r   r   r    r  c                 S   rV  r   )r   r)   r  r   r  rW  r   r   r   r    rX  c                 S   r   r   r.  r/  r   r   r   r    r  c                 S   rV  r   )r   r)   r  r   r  rW  r   r   r   r    rX  rN  c                 S      t || |S r   r.  r3  r  r2  r   r   r   r        c                 S   Z   t |tt|t|t tdt | |tt|t |tt|| t |tt|| |S rr  )r   r)   r  r   r   r  r3  r   rN  r  r2  r   r  r  r   r   r   r       Z c                 S   rY  r   r.  rZ  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   rY  r   r.  rZ  r   r   r   r    r[  c                 S   r\  rr  )r   r)   r  r   r   r  r]  r   r   r   r    r^  c                 S   rY  r   r.  rZ  r   r   r   r    r[  c                 S   r_  r   )r   r)   r  r   r  r  r]  r   r   r   r    r@  c                 S   r8  r   r.  rl  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>  rI  )	rp  r(   r   r   r   r   r)   r  r  r=  r   r   r   r        c                 S   r8  r   r.  rl  r   r   r   r    r  c                 S   r`  ra  )	rp  r(   r   r   r   r   r)   r  r  r=  r   r   r   r    rc  c                 S   rb  r   r   r   r   r   r   r    s    )r   r   r   r   r   r   r)   r   r3  rN  r   r   rA  r<   r1  r;   r@   r=   r?   r>   r2  z_r5  )=rC  r}  r~  r  r  r  rD  r  rE  rF  rG  rH  rI  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  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  r   r   r   _TrigSimplifyAux/  s   
d
d
d
`
F
F
F
F
F
F
Z
Z
z
z
z
z
z
z











re  c                 C   s   t t| S r   )TrigSimplifyAux_replacerr   r   r   r   r   r   r    r   r  c                 C   r   r   )rz   r   r   r   r   Cancel  r   rg  c                   @   r@  )	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.doitNrE  r   r   r   r   rh    rF  rh  c                 C   s,   t | trt|g| R   S t||  S r   )r   r   rh  r   )r  r   r   r   r   Part  s   
ri  c                 C   r   r   )r   )r3  r  r   r   r   r   PolyLog  r   rj  c                 C   s.   z|  |W S  ty   td| | Y S w )Nr  )r  
ValueErrorr   r  r   r   r   r    
   r  c                 C   r  r   )r   r-   r   r   r   r   IntegralFreeQ  r   rm  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   rQ  r  r  r  r   r   rm  r   r  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   )rl   r   r   r   r   LogIntegral  r   rn  c                 C   r   r   )rj   r   r   r   r   ExpIntegralEi  r   ro  c                 C   s   t | | S r   )rk   evalfr  r   r   r   ExpIntegralE  r  rq  c                 C   r   r   )rm   r   r   r   r   SinIntegral  r   rr  c                 C   r   r   )rn   r   r   r   r   CosIntegral  r   rs  c                 C   r   r   )ro   r   r   r   r   SinhIntegral  r   rt  c                 C   r   r   )rp   r   r   r   r   CoshIntegral  r   ru  c                   @   r"  )	PolyGammac                 G   s*   t |dkrt|d |d S t|d S r  )r   rE   rF   r   r   r   r   r   	  s   zPolyGamma.evalNr$  r   r   r   r   rv    r%  rv  c                 C   r   r   )rG   r   r   r   r   LogGamma  r   rw  c                   @   r"  )
ProductLogc                 G   s2   t |dkrt|d |d  S t|d  S rB  )r   rJ   rp  r   r   r   r   r     s   zProductLog.evalNr$  r   r   r   r   rx    r%  rx  c                 C   r   r   )rH   r   r   r   r   	Factorial  r   ry  c                  G   rS  r   )rI   r   r   r   r   Zeta  r   rz  c                 C   rJ  r   rM  )r   r  rN  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   )r1   r   new_argsr   r   r   Sum_doit"  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   )r%   rt   as_exprr3   r5   r  r   r   r   r  6     

r  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   )r%   ru   r  r3   r5   r   r  r   r   r   r  C  r  r  c                 C   s    |d u rt | S |t | |  S r   rQ  )r   r   r   r   r   r|  P  s   r|  c                 C   r   r   r  r   r   r   r   FactorU  r   r  c                 C   r   r   r   r  r   r   r   RuleX  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   
Distribute[  s   r  c                  G   s    t | } t|  }|dkrdS dS r   )r   r   )r   r  r   r   r   CoprimeQh  s
   r  c                 C   s.   zt | |W S  ty   td| | Y S w )NDiscriminant)r4   r/   r   r  r   r   r   r  o  rl  r  c                 C   s   | t dk S r   r   r8  r   r   r   Negativeu  r   r  c                 C      t | | S r   )r|  r2  r3  r   r   r   Quotientx  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   r>   r8  r   r   r   r    r  zprocess_trig.<locals>.<lambda>c                 S      dt | jd  S r  )r=   r   r8  r   r   r   r    r  c                 S   r  r   )r   r@   r8  r   r   r   r    r  c                 S   r  r  )r<   r   r8  r   r   r   r    r  c                 S   r  r   )r   r?   r8  r   r   r   r    r  c                 S   r  r  )r;   r   r8  r   r   r   r    r  c                 S   r  r   )r   rW   r8  r   r   r   r    r  c                 S   r  r  )rV   r   r8  r   r   r   r    r  c                 S   r  r   )r   rX   r8  r   r   r   r    r  c                 S   r  r  )rT   r   r8  r   r   r   r    r  c                 S   r  r   )r   rY   r8  r   r   r   r    r  c                 S   r  r  )rU   r   r8  r   r   r   r    r  )r   r   r   r   r   r  {  s   r  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_  r!  r   r   r   ri    r   z!_ExpandIntegrand.<locals>.cons_f1c                 S   s   t | |  ||  S r   r   )r,  rN  r  r   r   r   r   rl    r  z!_ExpandIntegrand.<locals>.cons_f2c                 S   r   r   rz  r+  r   r   r   rO    r   z!_ExpandIntegrand.<locals>.cons_f3c                 S   r   r   rz  r,  r   r   r   rQ    r   z!_ExpandIntegrand.<locals>.cons_f4c                 S   r   r   rz  r-  r   r   r   rS    r   z!_ExpandIntegrand.<locals>.cons_f5c                 S   r   r   rz  r  r   r   r   rU    r   z!_ExpandIntegrand.<locals>.cons_f6c                 S   r   r   rz  r  r   r   r   rV    r   z!_ExpandIntegrand.<locals>.cons_f7c                 S   r   r   rz  r  r   r   r   rW    r   z!_ExpandIntegrand.<locals>.cons_f8c                 S   r   r   rz  )r  r   r   r   r   rX    r   z!_ExpandIntegrand.<locals>.cons_f9c                 S   r   r   rz  )r9  r   r   r   r   rY    r   z"_ExpandIntegrand.<locals>.cons_f10c
           
      S   s,   t |tsdS tt||||| ||	||	|S r   r   r   r   r   
r  r  rN  r   r3  r  r  r   r,  r2  r   r   r   rZ    s   
z"_ExpandIntegrand.<locals>.cons_f11c                 S   r   r   rz  )r  r   r   r   r   r\    r   z"_ExpandIntegrand.<locals>.cons_f12c                 S   r   r   rz  )r2  r   r   r   r   r^    r   z"_ExpandIntegrand.<locals>.cons_f13c                 S   r   r   rz  r  r   r   r   r`    r   z"_ExpandIntegrand.<locals>.cons_f14c                 S   r   r   rz  )r  r   r   r   r   ra    r   z"_ExpandIntegrand.<locals>.cons_f15c                 S   s.   t |tsdS tt|||||	| ||
||
|S r   r  r  r  rN  r   r3  r   r  r  r   r,  r2  r   r   r   rc    s   
 z"_ExpandIntegrand.<locals>.cons_f16c                 S   r8  r   r.  rl  r   r   r   re    r   z"_ExpandIntegrand.<locals>.cons_f17c                 S   r3  r   r4  rh  r   r   r   rg    r  z"_ExpandIntegrand.<locals>.cons_f18c                 S   rj  r   r   r   r  r  r   r   r   rh    rm  z"_ExpandIntegrand.<locals>.cons_f19c                 S   s   t ||| | tdS r  rd  )r~  r  r   r   r   r   rj    r  z"_ExpandIntegrand.<locals>.cons_f20c                 S   r   r   rz  )r   r   r   r   r   rk    r   z"_ExpandIntegrand.<locals>.cons_f21c                 S   s   t ttttt| S r   )r  r   r[  r]  r\  r?  )r  r   r   r   rm    r  z"_ExpandIntegrand.<locals>.cons_f22c                 S   s   t | td|  S r  )r   r   r  r   r   r   rn    r  z"_ExpandIntegrand.<locals>.cons_f23c                 S   r   r   rz  r  r   r   r   rq    r   z"_ExpandIntegrand.<locals>.cons_f24c                 S   r   r   rz  r  r   r   r   rr    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   )r(   r   r   r   rq  )r,  r  rN  r  r   r!  r   r   	_cons_f_u     "z5_ExpandIntegrand.<locals>.cons_f26.<locals>._cons_f_ur,  r   r  )r   r   r   r   r   r7  rv  r   r   rN  r   r  r(   r   )r2  r   r   r  rw  rx  ry  r   r!  r   rs    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 )NFrI  )r   r   r(   r   r   r   r  r   r  r$  rp  rr  r  r  )r  r  r3  r   r   r   r2  r   r   r   ru    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   r(   r   r   r   r  r   r  r   r  rr  r  )r  r3  r   r   r2  r   r   r   rv    s
   
*"z"_ExpandIntegrand.<locals>.cons_f28c                 S      t | td S )Nru  )r   r   rh  r   r   r   rw    r  z"_ExpandIntegrand.<locals>.cons_f29c                 S   r   r   r   rh  r   r   r   rx    r   z"_ExpandIntegrand.<locals>.cons_f30c                 S   r3  r  r[  rh  r   r   r   rz  !  r  z"_ExpandIntegrand.<locals>.cons_f31c                 S   r?  r   r4  rl  r   r   r   r{  %  r  z"_ExpandIntegrand.<locals>.cons_f32c                 S   s   t | t||  S r   )r  r  rl  r   r   r   r|  )  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   r.  r3  r2  r  r   r   r   r~  1  r   z"_ExpandIntegrand.<locals>.cons_f35c                 S   s   t td||| S r   r4  r  r   r   r   r  5  r   z"_ExpandIntegrand.<locals>.cons_f36c                 S   s   t |||| S r   r.  )r   r3  r2  r  r   r   r   cons_f379  r  z"_ExpandIntegrand.<locals>.cons_f37c                 S   s   t td|||| S r   r4  )r3  r   r2  r  r   r   r   cons_f38=  r  z"_ExpandIntegrand.<locals>.cons_f38c                 S   r  r  )r   r   rh  r   r   r   cons_f39A  r  z"_ExpandIntegrand.<locals>.cons_f39c                 S   r   r   )r   r(  r   r   r   cons_f40E  r   z"_ExpandIntegrand.<locals>.cons_f40c                 S      t || td S r  )r   r   rl  r   r   r   cons_f41I  r   z"_ExpandIntegrand.<locals>.cons_f41c                 S   r  r  )r  r   rl  r   r   r   cons_f42M  r   z"_ExpandIntegrand.<locals>.cons_f42c                 S   s"   t td | |  |td  S Nru  r.  )r   r   )rN  r  r   r   r   r   cons_f43Q  r  z"_ExpandIntegrand.<locals>.cons_f43c                 S   ro  r   r.  )r  r3  r2  r   r   r   cons_f44U  r   z"_ExpandIntegrand.<locals>.cons_f44c                 S   s   t td|td|  S )Nr   r.  r4  rl  r   r   r   cons_f45Y  r"  z"_ExpandIntegrand.<locals>.cons_f45c                 S   s   t tt|| t|tdS rr  )r  r(   r  r   r  r   r   r   cons_f46]  s   z"_ExpandIntegrand.<locals>.cons_f46c                 S      t |tsdS t| |S r   r  r  r   r   r   cons_f47a  rm  z"_ExpandIntegrand.<locals>.cons_f47c                 S   r  r   )r   r   rR  r  r   r   r   cons_f48g  rm  z"_ExpandIntegrand.<locals>.cons_f48c                 S   s6   t |tsdS tt||tt| |td ttdS )NFrI  r.  )r   r   r  r  r  r   rr  r  r   r   r   r   r   cons_f49m  s   
(z"_ExpandIntegrand.<locals>.cons_f49c                 S   s$   t |tsdS tt||t| |S r   )r   r   rr  r  r  r   r   r   cons_f50s  s   
z"_ExpandIntegrand.<locals>.cons_f50c                 S   r  r   rf  r(  r   r   r   cons_f51y  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  rN  r   r3  r   r  r9  r   r,  r2  r  r   r   r   r   rz  ~  s   z_ExpandIntegrand.<locals>.With2r,  r   rN  r   r3  r  r  r   r2  r9  r  r   r  c
           
         s   t tt|	|t|	|tt|tdt| | ||   t|||||  |   | ||  |  ||	 | ||t t|t	|||||  |   ||	  | ||  |   t
|||||  |   ||	 | ||  |  |S r  rp  r(   r   rn  rr   r  r   r   r  r  ru  r  r  Z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   ru  r  r  r  r  r  rN  r3  r   r  r   r   r,  r2  r  r   r   r   r    s   0&z_ExpandIntegrand.<locals>.With5r   c
                    sP   t t|| |  |	 |||  |  |t||| }
|
j fdd|
jD  S )Nc                    r  r   r   r   r   r   r   r     r   z:_ExpandIntegrand.<locals>.replacement5.<locals>.<listcomp>)r  ru  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  ru  r  r  r  rN  r   r3  r   r   r   r,  r2  r  r   r   r   r    s   .z_ExpandIntegrand.<locals>.With6c
                    s>   t ||||  |	  |}
t|| |||  |   |
  S r   )ru  r  r  r  r   r   r    s   $z&_ExpandIntegrand.<locals>.replacement6c
           
      S   s4   t t||| ||   |  ||||  |	  |S r   )ru  r  )
r  r  rN  r3  r   r  r   r   r,  r2  r   r   r   r    rt  z&_ExpandIntegrand.<locals>.replacement7c              	   S   sR   t t|tdt|| |||  |   ||t|| |||  |   ||||S r  )rp  r  r   ru  r  )r  rN  r   r3  r   r   r,  r   r   r   r    r  z&_ExpandIntegrand.<locals>.replacement8r   c              	   S   s8   t ||t||	| ||  |  |
    | || ||S r   )r  r  )r  r  rN  r   r3  r   r  r   r   r,  r   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  )ru  rA   r   )r  rN  r3  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   rI  r   )r$  r  r   r~  r  r   r   )r  rN  r   r   r,  r2  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>)r$  r  ru  rp  r  r-  r   r  )	r  r  r  rN  r   r   r,  r2  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  rn  r  r   )r  r   r   r   r2  r  r  r   r   r   With15  s   "z _ExpandIntegrand.<locals>.With15c                 S   sp   t |||  || |  t|   |}t|| |  t| |d  |t|| || |  |  |d  | S r  )r!  r  ru  r"  r  r  r3  r   r   r   r2  r  r   r   r   r    s   (Hz'_ExpandIntegrand.<locals>.replacement16c                 S   sV   t |||  |}t|| |  | |d  |t|| || |  |  |d  | S r  )r!  ru  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  )rK  r  r   rJ  )r  r3  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   rI  r.  r   r   rK  r  rJ  r~  r   )r  r3  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   rI  rb  r.  r   )	r   r  rK  r  rJ  rp  r  r~  r   
r  r3  r   r   r   r2  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.  rI  r   )r   r  rK  r  rJ  rp  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  rN  r3  r   r   r   r,  r2  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  rN  r3  r   r  r   r   r,  r2  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  rN  r   r3  r   r  r   r   r,  r   r2  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 Nr   r.  )r   r  ru  r   r  r  r   )rN  r3  r   r  r   r   r   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  ru  r   r   r  r  )rN  r3  r   r  r   r   r2  r   r   r   r   With26!  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 Nr   ru  r.  r  )	r  rN  r3  r   r  r   r   r  r   r   r   r   With27&  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  rN  r3  r   r  r   r   r  r2  r   r   r   r   With28+  s   z _ExpandIntegrand.<locals>.With28c           	      S   sf   t | |  td}|||   td|  | |||    |||  td|  | |||     S r  )r  r   )	r  rN  r3  r   r   r   r,  r  r   r   r   r   With290  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  rN  r   r3  r   r  r   r   r,  r  r   r_  r   r   r   With305  s   (.Hz _ExpandIntegrand.<locals>.With30c              	   S   sZ   t ||}td}|t|| |d  |  t||d  t|| t|dt|||   S )Nr   rI  r   )r  r   r  r~  ri  r   )r  r   r   r  r   r   r   r   With31;  s   
Hz _ExpandIntegrand.<locals>.With31c                 S   rY  r   )rU  r  r   r   r   replacement32B  r   z'_ExpandIntegrand.<locals>.replacement32c                 S   s   t ||  | || S r   )rS  )r   r   r   r  r   r   r   replacement33F  r  z'_ExpandIntegrand.<locals>.replacement33c                 S   s   t t| | |||S r   )ru  r1  )r  r   r   r  r   r   r   replacement34J  r  z'_ExpandIntegrand.<locals>.replacement34c                 S   r8  r   )r  r  r   r   r   replacement35N  r   z'_ExpandIntegrand.<locals>.replacement35)r   r   r   r   r   r:  rv  r   r   r   r  r9  r3  r5  r7  r2  r1  r  rA   j_rO  r  rN  ry  )ri  r{  rl  r|  rO  r  rQ  r  rS  r  rU  r  rV  r  rW  r  rX  r  rY  r  rZ  r  r\  r  r^  r  r`  r  ra  r  rc  r  re  r  rg  r  rh  r  rj  r  rk  r  rm  r  rn  r  rq  r  rr  r  rs  r  ru  r  rv  r  rw  r  rx  r  rz  r  r{  r  r|  r  r}  r  r~  r  r  r  r  Zcons37r  Zcons38r  Zcons39r  Zcons40r  Zcons41r  Zcons42r  Zcons43r  Zcons44r  Zcons45r  Zcons46r  Zcons47r  Zcons48r  Zcons49r  Zcons50r  Zcons51rz  r  r  r  r  rD  r  r  rE  r  rF  r  rG  r  rH  r  rI  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  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  r9  r  r:  Z	pattern33r  Zrule33Z	pattern34r  Zrule34Z	pattern35r  Z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   r8  r   r.  r  r   r   r   ri  T  r   z"_RemoveContentAux.<locals>.cons_f1c                 S   s   t ||  tdS r   )r  r   r  r   r   r   rl  Y  r   z"_RemoveContentAux.<locals>.cons_f2c                 S   r   r   r  r!  r   r   r   rO  ^  r   z"_RemoveContentAux.<locals>.cons_f3c                 S   r   r   r  r  r   r   r   rQ  c  r   z"_RemoveContentAux.<locals>.cons_f4c                 S      t |  | tdS r   rr  r   r  r   r   r   rS  h  r  z"_RemoveContentAux.<locals>.cons_f5c                 S   r   r   rz  r+  r   r   r   rU  m  r   z"_RemoveContentAux.<locals>.cons_f6c                 S   rJ  r   r  )r2  r3  r  r   r   r   rV  r  r   z"_RemoveContentAux.<locals>.cons_f7c                 S   r  r   r  )r2  r  r   r   r   rW  w  r  z"_RemoveContentAux.<locals>.cons_f8r   r   r  c                 S   sN   t t|tdt||td  | |  |t|| td   |  | |S rP  )rp  rq  r   r*  )r  r   r   r   r2  r  r   r   r   r  }  r  z'_RemoveContentAux.<locals>.replacement1r2  r3  c                 S   s   t || |   | | |S r   r*  )r3  r  r   r   r2  r   r   r   r   r    rt  z'_RemoveContentAux.<locals>.replacement2r  r  c                 S   s.   t || |   | || |  |  | |S r   r  )r3  r  r   r  r   r  r2  r   r   r   r   r    r  z'_RemoveContentAux.<locals>.replacement3c                 S   s    t tt| tt| |  | S r   )rp  r(   r  r  r  r{  r   r   r   r    r  z'_RemoveContentAux.<locals>.replacement4)r   r   r   r5  rO  r   r   r6  rv  r   r1  )ri  r{  rl  r|  rO  r  rQ  r  rS  r  rU  r  rV  r  rW  r  r}  r  r~  r  r  r  r  r  rD  r  r  rE  r   r   r   _RemoveContentAuxS  s:   8
P
r

r  r   r  )F)FFFF(  r   Zsympy.externalr   r   r  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   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   r  r2   r3   r4   r5   r6   Zsympy.core.exprtoolsr8   Zsympy.core.sympifyr9   Zsympy.functionsr:   r   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   Z$sympy.functions.elementary.complexesrK   rL   rM   Z%sympy.functions.elementary.hyperbolicrN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   Z#sympy.functions.elementary.integersrZ   r[   Z(sympy.functions.elementary.trigonometricr\   r]   r^   r_   r`   ra   rb   Z*sympy.functions.special.elliptic_integralsrc   rd   re   Z'sympy.functions.special.error_functionsrf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   Zsympy.functions.special.hyperrq   Zsympy.logic.boolalgrr   Zsympy.polys.polytoolsrs   rt   ru   rv   rw   Zsympy.simplify.simplifyrx   ry   rz   r{   Zsympy.utilities.decoratorr|   Zsympy.utilities.iterablesr}   r~   Zrandomr   r   r   r   r   r   r   r   r   r   r   Zsympy.integrals.rubi.symbolr   r   r   r   registerr  r  r  r  r  r5  r6  r7  r8  r9  r:  r  Zh_Zi_r  Zk_Zl_rO  r2  rN  ry  r  r  r1  r3  r  rz  rv  rd  r   r  rN  r,  r  ZIntr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r
  r  r  r  r  r  r  r!  r$  r  r  r(  r*  r  r  r/  r4  r7  r>  r?  rA  rG  rJ  rO  r  r"  r  rR  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rn  rp  rq  rr  r  rw  ZDeferry  r|  r0  r  r  r  r  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rK  r  rC  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  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  r  r  r>  r@  rB  rC  rD  rF  rG  rH  rI  rK  rM  rP  rU  rR  rW  rZ  r]  r`  ra  rb  r  r  r  re  rf  ro  ru  r  r  r  r  r  r  r  r  r[  r  r^  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  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  r0  r2  r3  r5  r/  r7  r8  r6  r:  r;  r  r  r>  r=  rS  r;  r?  r@  r  rB  rE  rG  rH  rJ  rK  rL  rN  rP  rT  rV  rW  r\  r^  r_  r`  r  rc  rd  rf  rk  ro  r  rr  rq  rs  rt  ru  rx  rv  rw  r{  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  r  r  r  r  r  r  r  r  r  r  r  r	  rp  r  r  r  r  r  r  rQ  r  r  r  r  r  r  r  r  r   r!  r#  r&  r  r'  rk  rJ  r  r  r<  r	  r  r;  r  re  r  rg  rh  ri  rj  r  rm  r  r  rn  ro  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r~  r  r  r|  r  r  r  r  r  r  r  r  r  r  ZIntHider  ZNullr)  r  rf  r<  r
  r  rL  r   r   r   r   <module>   s>   L8$4
 

&



	














	
	
	
	































(
Te 	#
"		&
&*+;$ 	

			
"( %	'	$(

1-
	S2$+/$
&5#		?7		L72@&  u(}
   A;




