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

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

    Examples
    ========

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

    c                 G   s   t t|d S Nr   )r   _Eclsr   r   r   r   evalP   s    zrubi_exp.evalNr   r   r   r   classmethodr   r   r   r   r   r   ?   s   r   c                   @   s   e Zd ZdZedd ZdS )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 d S r   )hasr   sym_logdoitr   r   r   r   r   c   s    zrubi_log.evalNr   r   r   r   r   r   T   s   r   )Arity	OperationCustomConstraintPatternReplacementRuleManyToOneReplacerWC)is_matchreplace_allc                   @   s   e Zd Zd ZejZdZdZdS )UtilityOperatorFTN)	r   r   r   namer   ZvariadicZarityZcommutativeZassociativer   r   r   r   r   o   s   r   c                 C   s   g | ]}t |qS r   r   r   ir   r   r   
<listcomp>y   r   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_exp   s    
r   c                 C   s   t | } | S r   )r}   exprr   r   r   Simplify   s    r   c                 C   s   | |iS r   r   )r   valuer   r   r   Set   s    r   c                 C   s^   t | tr.t|  d }||| | i}n,| D ]&}t| d }|||| i}q2|S r   )
isinstancedictlistkeysxreplace)subsr   kr   r   r   r   With   s    
r   c                 C   s
   t | |S r   )r   )r   r   r   r   r   Module   s    r   c                 c   s   |D ]}| |V  qd S r   r   )fr   r   r   r   r   Scan   s    r   Nc                 C   sJ   |r&|D ]}| ||dkr dS qdS |D ]}| |dkr* dS q*dS 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   sX   t | dkrBt| d tr0tdd | d D S t| d dkS ntdd | D S d S )N   r   c                 s   s   | ]}t |V  qd S r   ZeroQr   r   r   r   r      r   zZeroQ.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r   r   r   r   r   r   r      r   )lenr   r   r   allr   r   r   r   r      s
    r   c                 C   s   | t dkrdS dS Nr   TFr   r   r   r   r   OneQ   s    r   c                 C   s4   t | } | ttfv rdS | jr0| dk }|js0|S dS NFr   r   r   r   Zis_comparableis_Relational)r   resr   r   r   	NegativeQ   s    r   c                 C   s   t | dkS r   r   r   r   r   r   NonzeroQ   s    r   c                    s:   t | tr"t fdd| D  S t| } |   S d S )Nc                 3   s   | ]}t | V  qd S r   )r   r   )r   r   varr   r   r      r   zFreeQ.<locals>.<genexpr>)r   r   anyr   r   nodesr   r   r   r   FreeQ   s    
r   c                 C   s   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   s   t | S r   )r   r   r   r   r   List   s    r   c                 C   s4   t | } | ttfv rdS | jr0| dk}|js0|S dS r   r   )r   r   r   r   r   	PositiveQ   s    r   c                  G   s   t dd | D S )Nc                 s   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   s    r   c                  G   s   t dd | D S )Nc                 s   s   | ]}|j ot|V  qd S r   )r   r   r   r   r   r   r      r   z#NegativeIntegerQ.<locals>.<genexpr>r   r   r   r   r   NegativeIntegerQ   s    r   c                 C   s$   t | } t| ttfrdS | jS d S NT)r   r   intr   r   r   r   r   r   IntegerQ   s    r   c                  G   s   t dd | D S )Nc                 s   s   | ]}t |V  qd S r   r   r   r   r   r   r     r   zIntegersQ.<locals>.<genexpr>r   r   r   r   r   	IntegersQ  s    r   c                 C   s*   t t| }t|ttfr"|dkS dS d S Nr   F)r   r%   r   r   r   )r   r   r   r   r   _ComplexNumberQ  s    r   c                  G   s   t dd | D S )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   s   | ]}t |V  qd S r   )r   r   r   r   r   r     r   z!ComplexNumberQ.<locals>.<genexpr>r   r   r   r   r   ComplexNumberQ  s    r   c                  G   s   t dd | D S )Nc                 s   s"   | ]}t |ot|d kV  qdS r   N)r   r&   r   r   r   r   r   !  r   z%PureComplexNumberQ.<locals>.<genexpr>r   r   r   r   r   PureComplexNumberQ   s    r   c                 C   s   | j S r   Zis_realr   r   r   r   RealNumericQ#  s    r   c                 C   s   | j o| dkS r   r   r   r   r   r   PositiveOrZeroQ&  s    r   c                 C   s   | j o| dkS r   r   r   r   r   r   NegativeOrZeroQ)  s    r   c                 C   s   t | pt| S r   )	FractionQr   r   r   r   r   FractionOrNegativeQ,  s    r   c                 C   s   t t| ot| S r   )NotPosQr   r   r   r   r   NegQ/  s    r   c                 C   s   | |kS r   r   r   br   r   r   Equal3  s    r  c                 C   s   | |kS r   r   r   r   r   r   Unequal6  s    r  c                 C   sr   t | r*tt| rnt| tt|  S nDt| r6| S t| rFt| S t| rnd}| jD ]}|t|7 }qX|S dS r   )	ProductQr   FirstIntPartRestr   IntegerPartSumQr   r   r   r   r   r   r   r  9  s    
r  c                 C   st   t | r(tt| r(t| tt|  S t| r4dS t| rDt| S t| rld}| jD ]}|t|7 }qV|S | S d S r   )	r  r   r  FracPartr  r   FractionalPartr  r   r	  r   r   r   r
  I  s    
r
  c                  G   s   t dd | D S )Nc                 s   s   | ]}|j V  qd S r   Zis_Rationalr   r   r   r   r   \  r   zRationalQ.<locals>.<genexpr>r   )r   r   r   r   	RationalQ[  s    r  c                 C   s
   t | jS r   )r   is_Mulr   r   r   r   r  ^  s    r  c                 C   s   | j S r   )is_Addr   r   r   r   r  a  s    r  c                 C   s
   t |  S r   )r  r   r   r   r   NonsumQd  s    r  c                 C   s<   d | ||fv rd S |  tdr0| tdt} | ||S )NZ	Integrate)r   r   r   rd   r   )r   r   yr   r   r   Substg  s
    r  c                 C   sP   t | tr| d S t | tr | S t| s0t| rBt| j}|d S | jd S 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   N)r   r   r   r  r  Sortr   )r   dr   r   r   r   r  p  s    


r  c                 C   sP   t | tr| dd S t| s&t| rBt| j}| j|dd  S | jd S 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    s    

r  c                 C   sn   t | r@| j}| j}t|r$t|p>t|tdd  o>t|S | jrZtdd | j	D S t| ph| t
kS d S )Nr      c                 s   s   | ]}t |V  qd S r   )SqrtNumberQr   r   r   r   r     r   zSqrtNumberQ.<locals>.<genexpr>)PowerQbaser)   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   r    s    r  c                    sH   t | tr t fdd| D S |  rDtt|   ddkrDdS dS )a@  
    LinearQ(expr, x) returns True iff u is a polynomial of degree 1.

    Examples
    ========

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

    c                 3   s   | ]}t | V  qd S r   )LinearQr   r   r   r   r     r   zLinearQ.<locals>.<genexpr>genr   TF)r   r   r   is_polynomialru   rt   r   r   r   r  r   r    s    

r  c                 C   s   t | S r   )r<   r   r   r   r   Sqrt  s    r#  c                 C   s   t | S r   )r,   r   r   r   r   ArcCosh  s    r$  c                   @   s   e Zd Zdd ZdS )Util_Coefficientc                 C   sv   t | jdkrd}nt| jd }t|rnt| jd }t|ttfrX|| jd |S || jd | S n| S d S Nr  r   r   )	r   r   r   NumericQr   r   r   r   coeff)r   r  r   r   r   r   r     s    zUtil_Coefficient.doitNr   r   r   r   r   r   r   r   r%    s   r%  r   c                 C   s\   t |rP| dks|ttfv r dS t| } t|ttfrB| ||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   )	r'  r   r   r   r   r   r   r(  r%  )r   r   r  r   r   r   Coefficient  s    r*  c                 C   sz   t | } t| tr\t| jtrn| jdkr:tt| j| jS | jdk rntt| jd| j S nt| trnt	| } t
| d S Nr   r   )r   r   r   r)   r   Denominatorr  	Numeratorr   rn   r|   r   r   r   r   r-    s    



r-  c                 C   s   t | |g|g|S r   r_   )r   r   cr   r   r   r   Hypergeometric2F1	  s    r1  c                 C   s    t | tr|  S | jrd} |  S r   )r   boolr   r   r   r   r   r     s
    
r   c                 C   s   t | S r   )r9   r   r   r   r   r    s    r  c                 C   s   t | S r   r8   r   r   r   r   r    s    r  c                 C   s   t | |||||S r   )r^   )r   Zb1Zb2r0  r   r  r   r   r   AppellF1  s    r4  c                  G   s   t |  S r   )rL   r   r   r   r   
EllipticPi  s    r5  c                  G   s   t |  S r   )rK   r   r   r   r   	EllipticE   s    r6  c                 C   s
   t | |S r   )rJ   )ZPhir  r   r   r   	EllipticF#  s    r7  c                 C   s   |d u rt | S t| |S d S r   )r=   rC   r   r   r   r   ArcTan&  s    r8  c                 C   s   t | S r   )r@   r   r   r   r   ArcCot,  s    r9  c                 C   s   t | S r   )r/   r   r   r   r   ArcCoth/  s    r:  c                 C   s   t | S r   )r.   r   r   r   r   ArcTanh2  s    r;  c                 C   s   t | S r   )r?   r   r   r   r   ArcSin5  s    r<  c                 C   s   t | S r   )r-   r   r   r   r   ArcSinh8  s    r=  c                 C   s   t | S r   )rA   r   r   r   r   ArcCos;  s    r>  c                 C   s   t | S r   )r>   r   r   r   r   ArcCsc>  s    r?  c                 C   s   t | S r   )rB   r   r   r   r   ArcSecA  s    r@  c                 C   s   t | S r   )r0   r   r   r   r   ArcCschD  s    rA  c                 C   s   t | S r   )r1   r   r   r   r   ArcSechG  s    rB  c                 C   s   t | S r   )r3   r   r   r   r   SinhJ  s    rC  c                 C   s   t | S r   )r4   r   r   r   r   TanhM  s    rD  c                 C   s   t | S r   )r2   r   r   r   r   CoshP  s    rE  c                 C   s   t | S r   )r6   r   r   r   r   SechS  s    rF  c                 C   s   t | S r   )r7   r   r   r   r   CschV  s    rG  c                 C   s   t | S r   )r5   r   r   r   r   CothY  s    rH  c               
   G   sX   t dt| d D ]@}z | | | |d  kr4W  dS W q ttfyP   Y  dS 0 qdS Nr   r   FTranger   
IndexErrorNotImplementedErrorr   r   r   r   r   	LessEqual\  s    rO  c               
   G   sX   t dt| d D ]@}z | | | |d  kr4W  dS W q ttfyP   Y  dS 0 qdS rI  rJ  rN  r   r   r   Lesse  s    rP  c               
   G   sX   t dt| d D ]@}z | | | |d  kr4W  dS W q ttfyP   Y  dS 0 qdS rI  rJ  rN  r   r   r   Greatern  s    rQ  c               
   G   sX   t dt| d D ]@}z | | | |d  k r4W  dS W q ttfyP   Y  dS 0 qdS rI  rJ  rN  r   r   r   GreaterEqualw  s    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   s   | ]}|j V  qd S 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)r-  r   r   r   r   r   r     r   r   r   r   r   r   r     s    r   c                 C   s   t |pt |pttd| td| pttd| td| pttd| td| pttd| td| pt || S )N      r     )r   r   r   )r   r   r0  r  r  r  r   r   r   r   IntLinearcQ  s    rW  c                 C   s   |   S r   )r   r   r   r   r   Expand  s    rX  c                 C   s
   t | |S )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   r    s    r  c                 C   s.   t | trt| jd S t| o,t| jd S Nr   r   )r   sym_expr   r   r  r   r   r   r   IntegerPowerQ  s    
r_  c                 C   sJ   t | tr&t| jd o$t| jd S t| oHt| jd oHt| jd S r]  )r   r^  r   r   r   r  r   r   r   r   PositiveIntegerPowerQ  s    
r`  c                 C   s.   t | trt| jd S t| o,t| jd S r]  )r   r^  r   r   r  r   r   r   r   FractionalPowerQ  s    
ra  c                 C   s4   t | } t| trdS | d ddtfv r*dS | jS d S r   )r!   r   r   r   is_Atomr   r   r   r   AtomQ  s    
rc  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  s    rf  c                 C   s   | j S r   )r  r   r   r   r   rd    s    rd  c                 C   s    t | tr|| v S || jv S d S r   )r   r   r   )r   r   r   r   r   MemberQ  s    
rg  c                 C   s,   t | r| }nt| }tttttttg|S r   )	rc  rd  rg  rD   rE   rF   rG   rI   rH   rZ  r   r   r   TrigQ  s    rh  c                 C   s   t | tkS r   )rd  rD   r   r   r   r   SinQ  s    ri  c                 C   s   t | tkS r   )rd  rE   r   r   r   r   CosQ  s    rj  c                 C   s   t | tkS r   )rd  rF   r   r   r   r   TanQ  s    rk  c                 C   s   t | tkS r   )rd  rG   r   r   r   r   CotQ  s    rl  c                 C   s   t | tkS r   )rd  rI   r   r   r   r   SecQ  s    rm  c                 C   s   t | tkS r   )rd  rH   r   r   r   r   CscQ  s    rn  c                 C   s   t | S r   )rD   r   r   r   r   Sin  s    ro  c                 C   s   t | S r   )rE   r   r   r   r   Cos  s    rp  c                 C   s   t | S r   )rF   r   r   r   r   Tan  s    rq  c                 C   s   t | S r   )rG   r   r   r   r   Cot  s    rr  c                 C   s   t | S r   )rI   r   r   r   r   Sec  s    rs  c                 C   s   t | S r   )rH   r   r   r   r   Csc   s    rt  c                 C   s,   t | r| }nt| }tttttttg|S r   )	rc  rd  rg  r3   r2   r4   r5   r6   r7   rZ  r   r   r   HyperbolicQ  s    ru  c                 C   s   t | tkS r   )rd  r3   r   r   r   r   SinhQ
  s    rv  c                 C   s   t | tkS r   )rd  r2   r   r   r   r   CoshQ  s    rw  c                 C   s   t | tkS r   )rd  r4   r   r   r   r   TanhQ  s    rx  c                 C   s   t | tkS r   )rd  r5   r   r   r   r   CothQ  s    ry  c                 C   s   t | tkS r   )rd  r6   r   r   r   r   SechQ  s    rz  c                 C   s   t | tkS r   )rd  r7   r   r   r   r   CschQ  s    r{  c                 C   s,   t | r| }nt| }tttttttg|S r   )	rc  rd  rg  r?   rA   r=   r@   rB   r>   rZ  r   r   r   InverseTrigQ  s    r|  c                 C   s   t ttttgt| S r   )rg  rD   rE   rI   rH   rd  r   r   r   r   SinCosQ#  s    r~  c                 C   s   t ttttgt| S r   )rg  r3   r2   r6   r7   rd  r}  r   r   r   	SinhCoshQ&  s    r  c                 C   s   t tt| S r   )r   r   r"   r   r   r   r   	LeafCount)  s    r  c                 C   sz   t | } t| tr\t| jtrn| jdkr:tt| j| jS | jdk rntt| jd| j S nt| trnt	| } t
| d S )Nr   r,  )r   r   r   r)   r   r.  r  r-  r   rn   r|   r   r   r   r   r.  ,  s    



r.  c                 C   s   t | ttfrdS | jS r   )r   r   float	is_numberr   r   r   r   NumberQ8  s    r  c                 C   s
   t | jS r   )r	   r  r   r   r   r   r'  =  s    r'  c                 C   s   t | trt| S t| jS )a2  
    Returns number of elements in the expression just as SymPy's len.

    Examples
    ========

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

    )r   r   r   r   r   r   r   r   Length@  s    
r  c                 C   s
   t | tS r   r   r   r   r   r   r   ListQT  s    r  c                 C   s   t | } t|  S r   )r   r%   r   r   r   r   r   ImW  s    r  c                 C   s   t | } t|  S r   )r   r&   r   r   r   r   r   Re[  s    r  c                 C   s"   | j st| } | ttttttfv S r   )rb  rd  r,   r-   r.   r/   r0   r   r   r   r   InverseHyperbolicQ_  s    r  c                 C   s.   t | p,t| rt| dkp,t| p,| jtkS Nr   )rf  r|  r  r  r  ra   r   r   r   r   InverseFunctionQd  s    r  c                 C   sR   t | rdS t| t| B t| B r.t| |S | jD ]}t||s4 dS q4dS d S NTF)rc  rh  ru  	CalculusQr   r   TrigHyperbolicFreeQr   r   r   r   r   r   r  h  s    


r  c                 C   sV   t | rdS t| s*t| s*| jttfv r4t| |S | jD ]}t|s: dS q:dS d S r  )	rc  r  r  r  r_   r^   r   r   ElementaryFunctionQr  r   r   r   InverseFunctionFreeQu  s    

r  c              
   C   s  t | rtt| S t| r*ttt| S t| r^| j} | j	}t| t|@ t
|t| B @ S | jrxtdd | jD S | jrtdd | jD S | j r| j}| jd } |tttttttttf	v rt| S |ttfv rtd| dS |tk rt| S dS ndS d S )Nc                 s   s   | ]}t |V  qd S r   RealQr   r   r   r   r     r   zRealQ.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r   r  r   r   r   r   r     r   r   r,  r   F)r  r   r  r'  r   r  r	   r  r  r)   r   r   r  r   r   r  Zis_Functionr  rD   rE   rF   rG   rI   rH   r=   r@   rM   r?   rA   rO  r   )r   vr   r   r   r   r    s.    
 

r  c                 C   s   t | | S r   r   r   r  r   r   r   EqQ  s    r  c                 C   s   t | rdS t| rdS d S r  )rc  ra  r   r   r   r   FractionalPowerFreeQ  s    r  c                 C   s    t | rtt| rdS dS d S r  )rc  r   r   r   r   r   r   ComplexFreeQ  s    r  c                    sf  |d u r   S t|tr8t|jtrt |j}  |r||j dkrPdS zt |j}W n tyt   Y dS 0 |	 }|d d|j }||d g7 }|D ]}|dks|
|}d||< qtdd |D rdS dS ndS nVt|jttfr8tt |jr8t |jdkr8t fdd|jjD s8dS t|tr\t fdd|jD S   |S )	Nr   Fr,  c                 s   s   | ]}|d kV  qdS r   r   r   r   r   r   r     r   zPolynomialQ.<locals>.<genexpr>Tc                 3   s   | ]}t  |V  qd S r   rY  r   r   r   r   r     r   c                 3   s   | ]}t  |V  qd S r   )PolynomialQr   r   r   r   r     r   )r!  r   r   r)   r   ru   r  rt   rk   
all_coeffsindexr   r   r   r   r}   Exponentfree_symbolsr   r   )r   r   degpZc_listZ
coeff_listr   r  r   r   r   r    s<    


$r  c                 C   s   t | S r   )rr   r   r   r   r   FactorSquareFree  s    r  c                 C   s   t d}t d}t d}t d}| || }t|| |rt|| |rt|| rt|| || }t|| |rt|| |rdS dS qt|| |S ndS d S )Nr   wr  r  TF)r   matchr  r   r   r  r  )r   r   r   r  r  r  Matcher   r   r   PowerOfLinearQ  s    r  c                 C   s\   t t| } t| js | |s$dS t| |rTt|trHtt| ||S t| |dS dS d S )Nr   r  )	rX  r   r  r   r  r   r   ru   rt   r"  r   r   r   r    s    

r  c                 C   s   t t| } t| js | |s&dgS | jrt| |} g }d}| jD ]^}||rt|trt|t	t
|||g7 }q|t	||dg7 }qD|dkrD|dg7 }|d7 }qD|  |S t|trt	t
| ||gS t	| |dgS d S )Nr   r   r  )rX  r   r  r   r  r{   r   r   r   ru   rt   sort)r   r   lstr   tr   r   r   ExponentList  s(    






r  c                 C   s   t | rP| 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 d S )Nr  r   r   FT)r  r   PolyQr*  )r   r   r   r   r   r   
QuadraticQ  s    4r  c                 C   sT   t | |oRt ||oRt| | oRtt| |dt||d t| |dt||d  S r]  )r  r   r   r*  r   r  r   r   r   r   LinearPairQ  s    r  c                 C   s  t | |rt| |dkrt| |}t|dkrLdt| |t| |t| |gS t|dkr|d dkrt| |dt| |t| |t| |gS dS ndS nt| r| j|krt| j|rdd| jgS dS nt	| rtt
| |r(tt| |}t|r dS t
| |d  t
| |d  |d gS nRtt| |rztt
| |}t|rTd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|rd||	 ||
 gS t||
 r(||	 || |gS dS t|rZt||
 rV||	 ||	 |
gS dS t||
rt||	 ||  r|| ||	 d| gS dS nt| rtt
| |rtt| |}t|rdS t
| |d  |d |d gS nJtt| |r:tt
| |}t|rdS t| |d  |d |d gS tt
| |}t|rVdS tt| |}t|rrdS t|d |d r|d |d  |d |d  |d gS dS ndS d S )Nr   r   r  F)r  r  r  r   r*  r  r  r   r)   r  r  BinomialPartsr  rc  r   r  r  )r   r   r  lst2lst1r   r   r  r0  r  r  r   r   r   r    s    

&

(
&




"

 


&r  c                 C   s  t | } t| |rPt| |}t|dk sLtt t|sLtt|d d rPdS t| rt| jdrt	| j
|}|rt|d rdS |d d d|d  |d  |d d |d gS ndS t| r tt| |rtt| |}|sdS t| |d  t| |d  t| |d  |d gS tt| |rztt| |}|sFd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| |rvtt| |}|sRdS t| |d  |d |d |d gS tt| |rtt| |}|sdS t| |d  |d |d |d gS tt| |}|sJt	t| |}|sdS tt| |}|st	t| |}|sdS t|d d|d  rV|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  rFt|d |d  rF|d |d  |d |d |d  |d gS dS tt| |}t|r.t	t| |}|szd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|d |d rt|d |d  rt|d |d  r|d |d  |d |d  |d |d  |d gS dS ndS d S )NrT  r   r  Fr   )r!   r  CoefficientListr   EvenQr   r  r  r)   r  r  r  r   r  TrinomialPartsr  r   r  rc  )r   r   r  r  r  r   r   r  r0  r  r  lst3lst4r   r   r   r  r  s    

02
44" 
$$$$*,.,
*,.,@4r  c                    s   t | rt fdd| D S |d u r|  kr2dS t tr j} j}t||rt|r|t| |ozt	|  pzt	t
|  S t|rt	|  ott|  |S dS t	|  pt	| t
 S t	|  ot|  |dkot|  |kS d S )Nc                 3   s   | ]}t | V  qd S r   )r  r   r  r   r   r     r   zPolyQ.<locals>.<genexpr>Fr   )r  r   r   r   r)   r  r   r   r  r  Togetherrc  r  r*  r  )r   r   r  Zx_baser   r  r   r    s     

"r  c                 C   s   t | ttfo| d dkS )Nr  r   r   r   r   r   r   r   r   r    s    r  c                 C   s   t | ttfo| d dkS )Nr  r   r  r   r   r   r   OddQ  s    r  c                 C   s|   t | rt| dot t| S t| r0t| jS t| rPtt| oNtt	| S t
| rtt| }t|rpt|S dS dS d S r   )r  rQ  r#  r  r  r)   r  PerfectSquareQr  r  r  r   r  r   sr   r   r   r    s    
r  c                 C   sj   t | r| dkS t| r"t| jS t| rBtt| o@tt| S t| rbt	| }t
|o`t|S dS d S r   )r  r  r  r)   r  NiceSqrtAuxQr  r  r  r   r  r  r   r   r   r  
  s    
r  c                 C   s   t t| ot| S r   )r   r   r  r   r   r   r   	NiceSqrtQ  s    r  c                 C   s   t | S r   rn   r   r   r   r   r    s    r  c                 C   s   t | r| dkS t| r>tt| r0t| dkS t| dkS nt| rtt| }tt|rft|dkS t|dkS n~t| rt| j	rt
| jS dS n\t| rt
t| rt
t| S t
t|  S n,t| rt
t| S | dk}|dv r|S dS d S )Nr   T)TF)r  r  r   r  r  r'  r	   r  r  r)   PosAuxr  r  r  r  r  )r   r  r   r   r   r   r    s2    

r  c                 C   s   t t| S r   )r  TogetherSimplifyr   r   r   r   r   =  s    r   c                 C   s(   t | |r ttt| | S g S d S r   )r  r   reversedrt   r  rZ  r   r   r   r  A  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   
ReplaceAllG  s    

r  c                    s   t ||g rt| rtt|  | | i } fdd|D }d}tdt|d D ]0}|t| ||d   ||   |d    }q\|S ||  S )Nc                    s   g | ]}t | qS r   SimplifyTermr   r  r   r   r   S  r   z'ExpandLinearProduct.<locals>.<listcomp>r   r   )r   r  r  r  rK  r   r   )r  r   r   r   r   r  r   r   r   r  r   ExpandLinearProductO  s    .r  c                  G   s>   t | } t| dkr6t| d ttfr.| d S t dS t|  S Nr   r   )r   r   r   r   r   ro   r   r   r   r   GCDZ  s    r  c                 C   s   t | S r   r   )Zexpnr   r   r   ContentFactorc  s    r  c                 C   s*  t | r6tt| r| S tt| r,t| S tdS nt| rt| jr~t| jr~| jdkrjdt	| j S ddt	| j  S ntdS nt
| rtdd | jD  S t| r"t| dk rt| }t|rtdS t|S nFtt| }tt| }|dk r|dk rt| |  S t||S tdS )Nr   r   c                 S   s   g | ]}t |qS r   NumericFactorr   r   r   r   r   x  r   z!NumericFactor.<locals>.<listcomp>2   )r  r   r  r  r   r  r  r  r)   r-  r  r   r   r  r  r  r  r  r  r  )r   r0  r  r  r   r   r   r  f  s4    





r  c                 C   s   t | r0tt| rtdS tt| r,tS | S t| r\t| jrXt	| j
rX| t|  S | S t| rd}| jD ]}|t|9 }qn|S t| rt| dk rt| }t|r| S t|S t| }d}| jD ]}||| 7 }q|S | S )Nr   r  r   )r  r   r  r   r  r   r  r  r  r   r)   r  r  r   NonnumericFactorsr  r  r  )r   resultr   r  r   r   r   r    s6    

r  c                 C   s   |d u rg }t | } t |}t| r(|S t| r>t| j||S t| sNt| rjtt| |tt| ||S t	| |rg }|D ]P}t
|r|j| kr||  qq|t|jdkr||jd | kr|||  qq||g kr||  |S |S r  )r   rc  r_  MakeAssocListr  r  r  r  r  r   r  r)   appendr   r   r   r   alsttmpr   r   r   r   r    s2    




r  c                    s    d u rg  t | } t t| r(| S t| rDt| j | j S t| sTt| rp| j fdd| j	D  S t
| rg } D ]P}t|r|j| kr||  qqt|j	dkr|j	d | kr||  qq|g kr| S |d d S | S )Nc                    s   g | ]}t | qS r   )GensymSubstr   r  r   r   r   r     r   zGensymSubst.<locals>.<listcomp>r   r   )r   rc  r_  r  r  r)   r  r  r  r   r   r  r  r   r  r   r  r   r    s2    



r  c                    s   t | r`g } D ] }|jd | kr||  q2q|g kr>| S t|d jdkr|d jd S nbt| rt| j }| jdk rt|rdS || j S t	| st
| r| j fdd| jD  S | S )Nr   r   Indeterminatec                    s   g | ]}t | qS r   )KernelSubstr   r  r   r   r     r   zKernelSubst.<locals>.<listcomp>)rc  r   r  r   r_  r  r  r)   r   r  r  r  r  r   r  r   r    s$    

r  c                    s   t | |r$tt| |r$t| |}ntd}t|r>t||S t| |}t|rZt||S tt| |||}t|rt	| | t|j
 fdd|jD  |S t| }t|rt||S t| }t|rt||S t| |S )Nr   c                    s   g | ]}|  qS r   r   r   r  r   r   r     r   z$ExpandExpression.<locals>.<listcomp>)AlgebraicFunctionQr   RationalFunctionQExpandAlgebraicFunctionr   r  ExpandCleanup
SmartApartRationalFunctionFactorsNonrationalFunctionFactorsr  r   rX  r  r   r   r  r   r  r   ExpandExpression  s&    



 

r  c                 C   s   t | |rt| |S | S r   )r  ri   rZ  r   r   r   Apart  s    

r  c                  G   s   t | dkrH| \}}t||}ttt||||||}|dkrD|S |S | \}}}t||}ttt||||||}|dkr|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 d S )Nc                 3   s   | ]} | 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+  s    r  c                 C   sH   t | r.d}| jD ]}t||r||9 }q|S t| |r<| S tdS d S r  )r  r   r   r   r   r   r  r   r   r   r   FreeFactors.  s    



r  c                 C   sD   t | r.d}| jD ]}t||s||9 }q|S t| |r<dS | S dS )aA  
    Returns the product of the factors of u not free of x.

    Examples
    ========

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

    r   N)r  r   r   r  r   r   r   NonfreeFactors;  s    



r  c                 C   s   t t| |S r   )RemoveContentAux_replacerr   r   r"  r   r   r   RemoveContentAuxW  s    r  c                 C   s@   t | |}t|}tt||dr,t||S tt |||S d S r  )r  r  r  r  r  r   r   r  r  r   r   r   RemoveContentZ  s
    

r  c                 C   sD   t | r.d}| jD ]}t||r||7 }q|S t| |r<| S d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   N)r  r   r   r  r   r   r   	FreeTermsd  s    



r  c                 C   sL   t | r2td}| jD ]}t||s||7 }q|S t| |s@| S tdS d S r   )r  r   r   r   r  r   r   r   NonfreeTerms  s    



r  c                    sT  t | rPtd|gd}td|gd}td}|| }| |  r||g}t|t krt fdd|D \}}t|r|| }}t||st|rd}	|jD ]}
|	|
| 7 }	q|	S || | }| |  rP|||g}t|t krPt fdd|D \}}}t|rPt|rPt	|| }d}	|jD ]}
|	|
| 7 }	q8|	S | S )	Nr   Zexcluder  r  c                    s   g | ]} | qS r   r   r   r  r   r   r     r   z+ExpandAlgebraicFunction.<locals>.<listcomp>r   c                    s   g | ]} | qS r   r   r   r  r   r   r     r   )
r  r   r  r   r  r  r   r   r   rX  )r   r   u_n_v_r  r   r   r  r  r   r  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|| ||  @ r0t||| ||  || || |d     |W S t|| ||  t|| ||  @ rt||| ||  | || || |d     |W S W n   Y n0 | S )Nr   r   r  r   r0  r  r  r   c                    s   g | ]} | qS r   r   r   r  r   r   r     r   z&CollectReciprocals.<locals>.<listcomp>r  )r  r   r  r  r   CollectReciprocals)r   r   r  a_b_c_d_e_f_r  r   r   r   r   r0  r  r  r   r   r  r   r    s*    
$
$*4*<r  c                 C   sT   t | |}t|rLd}|jD ]}|t||7 }q|}t|rFt||S |S n|S d S r   )r  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| ||r4tt| ||S dS nzt| sLt| |rPdS t| rt| j|t| j|@ B rt| j	||S n2t
| t| B r| jD ]}t|||s dS qdS dS r  )r  r  r  r  rc  r   r  r  r)   r  r  r  r   )r   r   flagr   r   r   r   r    s"    
r  c                 C   sP   |dkrt t| ||S t | ||}t t| ||}t|| dkrH|S |S d S r  )r*  r  r   )r   formr  Zcoef1Zcoef2r   r   r   Coeff  s    r  c                 C   s   t | rt| S | S r   )r  r  r   r   r   r   LeadTerm  s    r  c                 C   s   t | rt| S | S r   )r  r  r   r   r   r   RemainingTerms  s    r  c                 C   sN   t | r6t| dkr6t| tdkr(| S tt| S nt| rJtt| S | S r]  )r   r  r  r   
LeadFactorr  r  r   r   r   r   r     s    r  c                 C   s^   t | r:t| dkr:t| dkr(tdS ttt|  S nt| rVtt| t|  S tdS r]  )	r   r  r  r   r   RemainingFactorsr  r  r  r   r   r   r   r    s    r  c                 C   s   t | }t|r|jS |S )z
    returns the base of the leading factor of u.

    Examples
    ========

    >>> from sympy.integrals.rubi.utility_function import LeadBase
    >>> from sympy.abc import a, b, c
    >>> LeadBase(a**b)
    a
    >>> LeadBase(a**b*c)
    a
    )r  r  r  r  r   r   r   LeadBase  s    r  c                 C   s   t | }t|r|jS |S r   )r  r  r)   r  r   r   r   
LeadDegree)  s    r	  c                 C   s:   t | r| jdk rdS t| r2tdd | jD  S t| S )Nr   r   c                 S   s   g | ]}t |qS r   )Numerr   r   r   r   r   6  r   zNumer.<locals>.<listcomp>)r  r)   r  r   r   r.  r   r   r   r   r
  0  s    
r
  c                 C   sN   t | r*| jdk rF| jd | jd   S nt| rFtdd | jD  S t| S )Nr   r   c                 S   s   g | ]}t |qS r   )Denomr   r   r   r   r   ?  r   zDenom.<locals>.<listcomp>)r  r)   r   r  r   r-  r   r   r   r   r  9  s    
r  c                 C   s   t | ||S r   r/  )r  r  r   r   r   r   	hypergeomB  s    r  c                 C   s   t t| |S r   )r  r  )r   r  r   r   r   ExponE  s    r  c                    sl  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}	||||  |	  ||||  |  |  }
| |
  rp||||	|||g}t|t krpt fdd|D \}}}}}}}t|| rp|||||  |  || |   |||   tju r@| S |||||  |  || |   |||   S ||||  |	  |||  |  }
| |
  rh||||	|||g}t|t krht fdd|D \}}}}}}}t|rht|| ||  rh|||  ||  |||  ||   tju r@| S |||  ||  |||  ||   S | S )Nr   r  r   r   r  r   r   r0  r  r  r  c                    s   g | ]} | qS r   r   r   r  r   r   r   X  r   z"MergeMonomials.<locals>.<listcomp>c                    s   g | ]} | qS r   r   r   r  r   r   r   f  r   )r   r  r   r  r   r   ZNaNr   )r   r   r  p_r  r  r  r  r  m_r  r   r   r   r   r  r0  r  r  r  r   r  r   MergeMonomialsH  s:    ,
$80$
$ 0(r  c           	      C   s  t | ||}t| ||}d}t||D ]&}|ttt|||||  |7 }q&|}t|}t||}t||}|tt||  }t	t||dr| }d}t||D ]*}|ttt|||||  | |7 }q|}t
||r||| | t||  S ||| | |  S d S r   )r  r  r  Simpr  r*  r  r  r;   r   	BinomialQExpandToSum)	r   r  r   rv   rw   r  r   ZfreeZmonomialr   r   r   PolynomialDividen  s&    $

(
r  c                 C   sF   t | r,| D ]}tt|||r dS qdS t|r8dS t t| |S )aM  
    If u is equivalent to an expression of the form a + b*x**n, BinomialQ(u, x, n) returns True, else it returns False.

    Examples
    ========

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

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

    Examples
    ========

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

    FTr  )r  r   r   
TrinomialQr   r  r)   r  r  r  r  )r   r   r   Zcheckr   r   r   r    s    
r  c                    s,   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   s   | ]}t | V  qd S r   )GeneralizedBinomialQr   r  r   r   r     r   z'GeneralizedBinomialQ.<locals>.<genexpr>)r  r   GeneralizedBinomialPartsrZ  r   r  r   r    s    r  c                    s,   t | rt fdd| D S t t|  S )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   s   | ]}t | V  qd S r   )GeneralizedTrinomialQr   r  r   r   r     r   z(GeneralizedTrinomialQ.<locals>.<genexpr>)r  r   GeneralizedTrinomialPartsrZ  r   r  r   r    s    r  c                 C   s2   t | }ddgg}|d D ]}|t| q|S r  )rs   r  r   )rq   rr  r   r   r   r   FactorSquareFreeList  s
    
r  c                 C   s   t | |rt| }d}d}|d ddgkr2t|}|D ]}t||d }q6|dkr|D ]}||d |d |   }qVt|| S dS dS )Nr   r   F)r  r  r  r  rX  )r   r   r  ro   r  r   r   r   r   PerfectPowerTest  s    
r  c                 C   s.   t | |r*t| }t|s"t|r&|S dS dS r   )r  r  r  r  r  r   r   r   SquareFreeFactorTest  s    
r  c                 C   sb   t | st| |rdS t| r*t| j|S t| s:t| r^| jD ]}tt||r@ dS q@dS dS r  )	rc  r   r_  r  r  r  r  r   r   r  r   r   r   r    s    
r  c                 C   sD   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   r    s    



r  c                 C   sD   t | r.d}| jD ]}t||s||9 }q|S t| |r@tdS | S r  r  r   r   r   r   r     s    



r  c                 C   s6   t | trtt| S t| j}| jtt| S d S r   )r   r   r  r   r  )r   r   r   r   r   Reverse+  s    

r!  c                 C   s  t | |rt| |dgS t| rTt| jr<| jt| j| S | j tt| j| S t| rtt	| |}tt
| |}|d |d  |d |d  gS t| rt| }t|rtt	| |}tt
| |}t|d |d  |d |d  |d |d  gS t||S ddgS )a  
    u is a polynomial or rational function of x.
    RationalFunctionExponents(u, x) returns a list of the exponent of the
    numerator of u and the exponent of the denominator of u.

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

    r   r   )r  r  r_  r   r)   RationalFunctionExponentsr  r!  r  r  r  r  r  r:   )r   r   r  r  r  r   r   r   r"  2  s$    

 

2
r"  c                 C   s   dd }t |}dd }t |}dd }ttttt  t||}t||}dd }	tttt}
t|
|	}| t	t
} tt| |||g}t|S )	Nc                 S   s   t | S r   r   r  r   r   r   cons_f1[  s    z'RationalFunctionExpand.<locals>.cons_f1c                 S   s   t | tsdS t|| S r   )r   r   UnsameQ)r   r  r   r   r   cons_f2_  s    
z'RationalFunctionExpand.<locals>.cons_f2c                    s8   t ||}tt|t fdd|jD    | S )Nc                    s   g | ]}|   qS r   r   r   r  r  r   r   r   g  r   z9RationalFunctionExpand.<locals>.With1.<locals>.<listcomp>)RationalFunctionExpandIfr  r   r   )r  r   r   r  r  r   r(  r   With1e  s    
z%RationalFunctionExpand.<locals>.With1c                    s   t | |}dd }t|}ttttdtd ttdtd t t  tt	 tdtd t
  t|}tt| ||}t|| r|s|S t t| ||}t| | t|rt fdd|jD  S |  S d S )	Nc              	   S   s4   t tt| |||||t||t|t|tdS Nr,  )re   r   r   r   r  r   r   )r   r   r0  r  r  r  r  r   r   r   r   _consf_um  s    z7RationalFunctionExpand.<locals>.With2.<locals>._consf_ur  r   r  r   c                    s   g | ]}|  qS r   r   r   r  r   r   r   x  r   z9RationalFunctionExpand.<locals>.With2.<locals>.<listcomp>)ExpandIntegrandr   r   r   x_r   r   r  r  r  r  r   r&  r  r  r  r   r   )r   r   r  r-  cons_upatresult_matchqr   r  r   With2j  s    
R
z%RationalFunctionExpand.<locals>.With2)r   r   r   r  r  r  r/  r   r   r^  r   r   r   )r   r   r%  cons1r'  cons2r+  pattern1rule1r3  pattern2rule2r   r   r   r   r)  X  s    

r)  c                    s0  t | } |d ur|| }}t||}t||}t|rp| t|| g}|jD ]}|t| | | qL|j| S | t|| t| | | S nt	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}|||	|
  |  }| 
|  rtttttg |
 jr|||	|
|g}t t|krt fdd|D \}}}}}|jd 
|||    r||f}t|t krt fdd|D \}}t||r|j}t||||||    | ||||S | tt} tt| |tdd}t |S d S )Nr   r   r   r  r   r   Fr0  r  r  c                    s   g | ]} | qS r   r   r   r  r   r   r     r   z#ExpandIntegrand.<locals>.<listcomp>c                    s   g | ]} | qS r   r   r   r  r   r   r     r   )Z	max_count)r   r.  r  r  r  r   r  r  r  r   r  rg  r?   rA   r-   r,   r   r  r  r  r   r^  r   r   r   ExpandIntegrand_rules)r   r   Zextrar  r  r  r   r  r  r  F_r  r  r  r  r   r   r   r   r:  r  r0  r  r   r   r  r   r.    sH    




 
 (r.  c                 C   s  t | rBt |r:t| t|kr(|dk S t| t|k S ndS nbt |rNdS t| rt|rt| t|krtt| t|S t| t|k S ndS n
t|rdS t| dkst| dkrt|dkst|dkrtt| t|S t| r<t|r4t| t|kr tt| t|S tt| t|S ndS nht	| rdt	|r\t
| |gS dS n@t	|rrdS t| st| tkst| tkrt|st| tkst| tkrt
| |gS dS nt|st| tkst| tkrdS t| t|krxt| t|krhtt| jD ]6}| j| |j| ks,t| j| |j|   S q,dS t| t|k S t| t|k rdS t|t| k rdS tt
|| gS )Nr   TF)r   r'   r   r-  SimplerQr.  r  r  r   r  OrderedQrc  rd  r&   r%   r  rK  r   r   r  r   )r   r  r   r   r   r   r=    s`    0




&&&r=  c                 C   s  t |rtt | rdS t | r0tt |r0dS t| td}t|td}t|rht|rd||k S dS t|rtdS t|rt|r||k S dS t|rdS t| rt|rt|t|k S dS t|rdS t|t|k rdS t|t|k rdS tt|| gS d S )NTFr  )	r   r   Rtr   r   r  r   r  r>  )r   r  ZsqrtuZsqrtvr   r   r   SimplerSqrtQ  s:    r@  c                 C   sV   t | |r@|tdkrdS |tdkr4| td k S | | kS ntt| t|S d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   N)r  r   SumSimplerAuxQrX  r  r   r   r   SumSimplerQ	  s    
rB  c                 C   s   t | |}|dkr|S |d S NFr  )r  )r   r   Zbpr   r   r   BinomialDegree%	  s    
rD  c                 C   s   t | |}|r|d S |S )NrT  )r  r   r   r  r   r   r   TrinomialDegree,	  s    
rF  c                 C   s   dd }t | rt |rft|t| r>tt| ||t| S tt| |}t| |d  |d gS qt| |r~|| |dgS | |gS n(t |rt|| rd||| 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_cases4	  s    
z*CancelCommonFactors.<locals>._delete_casesr   r   )r  rg  r  CancelCommonFactorsr  )r   r  rG  r  r   r   r   rH  3	  s    


rH  c           	      C   s   t | |}|d }|d }t|t|krZt|dkrZt|dkrZt|jd |jd |S dt| dt| k rvdS t||rt||rd}d}t||D ]}||7 }qt||D ]}||7 }q||k S dS ndS d S )Nr   r   rU  rT  TF)rH  rd  r  SimplerIntegrandQr   r  r  r"  )	r   r  r   r  u1Zv1t1t2r   r   r   r   rI  S	  s$    
(



rI  c                 C   s"   t | |}|r|d |d  S d S )Nr  rT  )r  )r   r   r   r   r   r   GeneralizedBinomialDegreei	  s    
rM  c                 C   s   t | } t| |rtd|gd}td|gd}td|gd}td|gd}| |||  |||   }|rt|| ||  r|| || || || gS ndS d S )Nr   r  r   r  r  F)rX  GeneralizedBinomialMatchQr   r  r   )r   r   r   r   r  r  r  r   r   r   r  n	  s    
r  c                 C   s"   t | |}|r|d |d  S d S )NrT  rU  )r  rE  r   r   r   GeneralizedTrinomialDegree{	  s    
rO  c                 C   s   t | } t| |rtd|dgd}td|dgd}td|gd}td|dgd}td|gd}| |||  |||   ||d| |    }|r| jr|| || || || d||  ||  gS nd	S d S )
Nr   r   r  r   r0  r  r  r  F)rX  GeneralizedTrinomialMatchQr   r  r  )r   r   r   r   r0  r  r  r  r   r   r   r  	  s    
2
0r  c                    sZ   t | tr t fdd| D S td gd}td gd}| | |  }|rVdS dS )Nc                 3   s   | ]}t | V  qd S r   	MonomialQr   r  r   r   r   	  r   zMonomialQ.<locals>.<genexpr>r   r  r   TFr   r   r   r   r  r   r   r   r   r&   r   r  r   rR  	  s    
rR  c                 C   s:   t | r6| jD ]"}tt||p&t||r dS qdS d S r   )r  r   r   r   rR  r  r   r   r   MonomialSumQ	  s
    
rU  )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   r  r   r   r   MinimumMonomialExponent	  s
    
rX  c                 C   s>   t d|gd}t d|gd}| |||  }|r:|| S d S )Nr   r  r   )r   r  rT  r   r   r   rW  	  s
    rW  c                    sZ   t | tr t fdd| D S td gd}td gd}| ||   }|rVdS dS )Nc                 3   s   | ]}t | V  qd S r   )LinearMatchQr   r  r   r   r   	  r   zLinearMatchQ.<locals>.<genexpr>r   r  r   TFrS  rT  r   r  r   rY  	  s    
rY  c                 C   s|   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}| |||  | }|rtdS dS d S )NFTr   r  r   r   r  )r   r   PowerOfLinearMatchQr   r  )r   r   r   r   r   r  r  r   r   r   rZ  	  s    

rZ  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||pt||S )Nc                 3   s   | ]}t | V  qd S r   )QuadraticMatchQr   r  r   r   r   	  r   z"QuadraticMatchQ.<locals>.<genexpr>r  r0  r   r   r   r   c                 S   s   t | ||g|S r   rY  )r   r   r0  r   r   r   r   <lambda>	  r   z!QuadraticMatchQ.<locals>.<lambda>c                 S   s   t | |g|S r   rY  )r   r0  r   r   r   r   r\  	  r   )r  r   r   r   r/  r   r   r   )r   r   r6  r8  rJ  r   r  r   r[  	  s    >0
r[  c                    sf  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||sZt||sZt||sZt||r^dS dS d S )Nc                 3   s   | ]}t | V  qd S r   )CubicMatchQr   r  r   r   r   	  r   zCubicMatchQ.<locals>.<genexpr>rT  r  r   r  r0  r   r   r   c                 S   s   t | |||g|S r   rY  )r   r   r0  r  r   r   r   r   r\  	  r   zCubicMatchQ.<locals>.<lambda>c                 S   s   t | ||g|S r   rY  )r   r   r  r   r   r   r   r\  	  r   c                 S   s   t | ||g|S r   rY  )r   r0  r  r   r   r   r   r\  	  r   c                 S   s   t | |g|S r   rY  )r   r  r   r   r   r   r\  	  r   TF)	r   r   r   r   r   r/  r   r   r   )r   r   r6  r8  pattern3pattern4rJ  r   r  r   r]  	  s    
P>B0
0r]  c                    sz   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 d S )
Nc                 3   s   | ]}t | V  qd S r   )BinomialMatchQr   r  r   r   r   	  r   z!BinomialMatchQ.<locals>.<genexpr>r  r   r   r   r   c                 S   s   t | ||g|S r   rY  )r   r   r  r   r   r   r   r\  	  r   z BinomialMatchQ.<locals>.<lambda>
r   r   r   r   r   r/  r   r   r   r   r   r   r  r   r  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 d S )Nc                 3   s   | ]}t | V  qd S r   )TrinomialMatchQr   r  r   r   r   	  r   z"TrinomialMatchQ.<locals>.<genexpr>jr   r0  r  r   r   r   c                 S   s   t | |||g|S r   rY  )r   r   r0  r  r   r   r   r   r\  	  r   z!TrinomialMatchQ.<locals>.<lambda>c                 S   s   t | d|  S Nr  r   rd  r  r   r   r   r\  	  r   ra  rb  r   r  r   rc  	  s
    
l
rc  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}| | |  | |   }|rt|d	kr|| dkr|| dkrd
S dS d S )Nc                 3   s   | ]}t | V  qd S r   )rN  r   r  r   r   r   
  r   z,GeneralizedBinomialMatchQ.<locals>.<genexpr>r   r   r  r   r  r  rU  TFr   r   r   r   r  r   )r   r   r   r   r  r  r  r   r  r   rN  
  s    
(rN  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
| |    }|rt|dkrd
||  ||  dkr|| dkrdS dS d S )Nc                 3   s   | ]}t | V  qd S r   )rP  r   r  r   r   r   
  r   z-GeneralizedTrinomialMatchQ.<locals>.<genexpr>r   r   r  r   r  r0  r  r     TFrg  )r   r   r   r   r  r0  r  r  r   r  r   rP  
  s    
24rP  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}| |||    ||    }|rt|d	krd
S dS d S )Nc                 3   s   | ]}t | V  qd S r   )QuotientOfLinearsMatchQr   r  r   r   r   "
  r   z*QuotientOfLinearsMatchQ.<locals>.<genexpr>r   r  r   r  r0  r  rh  TFrg  )r   r   r   r   r  r0  r  r  r   r  r   ri   
  s    
"ri  c                 C   s\   t d|gd}t d|gd}| |||  }|rTt|| rTt|| tdrTdS dS d S )Nr   r  r  r   TF)r   r  r   rQ  r   )r   r   r   r  r  r   r   r   PolynomialTermQ/
  s    "rj  c                 C   s&   d}| j D ]}t||r
|| }q
|S r   r   rj  r   r   r  r   r   r   r   PolynomialTerms8
  s
    


rm  c                 C   s&   d}| j D ]}t||s
|| }q
|S r   rk  rl  r   r   r   NonpolynomialTerms?
  s
    


rn  c                 C   s   t | |rtt| |tdrt| |}tt| |||}|| td  t| ||td  | }t| |||  |  }t|rt||r|td|||gS dS ndS d S )Nr  r   r,  F)	r  rQ  r  r   r?  r*  r   r   r   )r   r   r  r  r0  r   r   r   r   PseudoBinomialPartsF
  s    
*ro  c                 C   s>   t | |}|r:|d |d |d |d |  |d    S d S )Nr   r   r  rT  rU  ro  r   r   r  r   r   r   NormalizePseudoBinomialS
  s    
rr  c                 C   sD   t | |}t|rdS t ||}t|r,dS t|dt|dkS d S rC  )ro  rc  Drop)r   r  r   r  r  r   r   r   PseudoBinomialPairQX
  s    

rt  c                 C   s   t | |}|rdS dS d S r  rp  rq  r   r   r   PseudoBinomialQc
  s    
ru  c                 C   s
   t | |S r   )ro   r   gr   r   r   PolynomialGCDj
  s    rx  c                 C   s   t t| ||S r   )r  rx  r  r   r   r   PolyGCDm
  s    ry  c                 C   sD   t | r0d}| jD ]}t|||r||9 }q|S t| ||r@| S dS r  r  r   r  )r   r   r  r  r   r   r   r   AlgebraicFunctionFactorsr
  s    

r{  c                 C   s@   t | r.d}| jD ]}t||s||9 }q|S t| |r<dS | S )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   rz  r  r   r   r   NonalgebraicFunctionFactors~
  s    



r|  c                 C   s   t | |rdS t| r6t| jd |rtt| |S nht t| |rVt t| |rVdS t| r|tt	| |rtt| |S n"t| dkrt
| rtt| |S | |kpt| |S )NTr   r   )r  r  r   r   QuotientOfLinearsPr  r.  r-  r  r  r  rZ  r   r   r   r}  
  s    
r}  c                 C   s  t | |r&t| |dt| |dddgS t| rlt| dkrht| } t| |}|d |d |d |d gS n2t| rt| }t||rt	| } t| |}|d ||d   |d ||d   |d |d gS nt
| rtt| }t||rt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   )r  r*  r  r.  r-  QuotientOfLinearsPartsr  r  r   r  r  )r   r   r  r   r  r   r   r   r~  
  s6    

 

6
$.
r~  c                 C   sR   t | r&| D ]}t||s dS qdS t| |}t| |oPt|d oPt|d S )NFTr   rT  )r  QuotientOfLinearsQr~  r}  r   )r   r   r   r  r   r   r   r  
  s    

r  c                 C   s   t | S r   r   r   r   r   r   Flatten
  s    r  c                 C   s   t | dd |dS )Nc                 S   s   |   S r   Zsort_keyr  r   r   r   r\  
  r   zSort.<locals>.<lambda>)keyreverse)sorted)r   r  r   r   r   r  
  s    r  c                 C   sP   t | r,| j}| j} t| o*| dko*t|S t| rHtdd | jD S t| S )Nr   c                 s   s   | ]}t |V  qd S r   )AbsurdNumberQr   r   r   r   r   
  r   z AbsurdNumberQ.<locals>.<genexpr>)r  r)   r  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| r8d}| 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 | r`tt| |p^tt| |S |dkot| t|kot| t| dk pt| t| dkot| dk S d S )Nr   g      )r  r  r  rA  r  r  r  r  r   r   r   rA  
  s
    4rA  c                 C   s   t |ts|g|  S ||  S r   r  )l1l2r   r   r   Prepend   s    

r  c                 C   s   t | trpt |tr:| d |d d  | |d d   } n2|dkrP| |d  } n|dk rh| d |  } n| 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  rs  r   )r  r  r   r   r   rs    s    

&rs  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  rs  r  r  )r  r   r   r   r    s
    4r  c                 C   s:   t | ttfr"tt| |d S tt| |d S d S )N)limit)r   r   r   r  rg   itemsrh   )r  r   r   r   r   FactorInteger  s    r  c                 C   sF   t | rt| S t| r8t| j}|d |d | j gS t|  fS r]  )r  r  r  r  r)   r   Zas_base_exp)r  r  r   r   r   FactorAbsurdNumber  s    
r  c                     s  t | dkrh| 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|r|krS |S t|t krt|jd  jd  rވ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                    s   g | ]}t | qS r   )SubstForInverseFunctionr   r  r  r   r   r   r   G  r   z+SubstForInverseFunction.<locals>.<listcomp>N)	r   r  r*  r   ZInverseFunctionrd  rc  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                    s   g | ]}t | qS r   )SubstForFractionalPowerr   r  r  r  r   r   r   r   T  r   z+SubstForFractionalPower.<locals>.<listcomp>)rc  ra  r   r  r)   r   r  )r   r  r  r  r   r   r   r  r   r  J  s    r  c           	      C   s   t | dd|}t|s"t|d r&dS |d }|d }t||}|d |d |d |d f\}}}}t|rpdS t||d  t| ||| |||   ||||    | ||||   d  }t||||t|||| ||   gS )Nr   Fr   r  rT  )"FractionalPowerOfQuotientOfLinearsrc  r~  r   r   r  r  r  )	r   r   r  r  r  r   r   r0  r  r   r   r   *SubstForFractionalPowerOfQuotientOfLinearsW  s    
$Rr  c                 C   s   t | st| |r||gS t| r&dS t| rvt| j|rvtt| j|rvt|s`t	| j| rvt
t| j|| jgS ||g}| jD ](}t||d |d |}t |r dS q|S NFr   r   )rc  r   r  ra  r  r  r   r  r   r   LCMr-  r)   r   r  r   r  r  r   r  r   r   r   r   r  g  s    2
r  c                    sD   t | st| rdS t| r*t|  S t fdd| jD S )NTc                 3   s   | ]}t | V  qd S r   )SubstForFractionalPowerQr   r  r   r   r   r     r   z+SubstForFractionalPowerQ.<locals>.<genexpr>)rc  r   ra  SubstForFractionalPowerAuxQr   r   r  r   r  r   r  x  s
    r  c                    s@   t | rdS t| r&t| j  r&dS t fdd| jD S )NFTc                 3   s   | ]}t | V  qd S r   )r  r   r  r   r   r     r   z.SubstForFractionalPowerAuxQ.<locals>.<genexpr>)rc  ra  r   r  r   r   r  r   r  r   r    s    r  c           
         s   t | rdS t| rtddgd}tddgd}tddgd}| j||| td    r|||g}t|t krt fdd	|D \}}}t|r|| td S | j	D ] }t
|}	tt|	r|	  S qdS )
NFr   r   r  r   r0  r  c                 3   s   | ]} | V  qd S r   r   r   r  r   r   r     r   z+FractionalPowerOfSquareQ.<locals>.<genexpr>)rc  ra  r   r  r  r   r   r  r  r   FractionalPowerOfSquareQr   r   )
r   r  r  r  r   r   r   r0  r   r  r   r  r   r    s$    


r  c                 C   sf   t | rdS t| rDt| j| rDt| j|koBt|dt| k S | jD ]}t|||rJ dS qJdS )NFrT  T)rc  ra  r   r  r   r  r   FractionalPowerSubexpressionQ)r   r  r  r   r   r   r   r    s    "
r  c                 C   s   | | S r   r   )r   r  r   r   r   Apply  s    r  c                    s   t | r$t| jrt| j| j S n\t| rDdd | jD }t| S t| rt	dd | jD  t
 fdd| jD  } | S | S )Nc                 S   s   g | ]}t |qS r   )FactorNumericGcdr   r   r   r   r     r   z$FactorNumericGcd.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r  r   r   r   r   r     r   c                    s   g | ]}|  qS r   r   r   rw  r   r   r     r   )r  r  r)   r  r  r  r   r   r  r  r   )r   r   r  r   r  r   r    s    
r  c                 C   s  | |kr4t |td o2|d dkp2t |o2|dkS t|r| |jkrrt ||j op||j dkppt |op|dkS t|jot|jott|pt||j ot| ||j |jS t	|rt| |t
|pt| |t|S t|ot| |t
|ot| |t|S r  )r  r   r  r  r)   r  r   r   MergeableFactorQr  r  r  basr  r  r   r   r   r    s    ,
,B r  c                 C   s   | |kr| |d  S t |rN| |jkr4| ||j  S t| ||j |j|j S t|rt| |t|r~t| |t|t| S t|t| |t| S t| |t|t| |t| S r  )r  r  r)   MergeFactorr  r  r  r  r  r   r   r   r    s    
r  c                 C   s   t | r tt| tt| |S t| rt| j| j|rHt| j| j|S t	| jr| jdk rt| jt
d |rt| j| jd  t| jt
d |S | | S t| t
d|rt| t
d|S | | S )Nr,  r   )r  MergeFactorsr  r  r  r  r  r)   r  r  r   r  r   r   r   r    s    (&r  c                 C   s   t | t| kS r   )ActivateTrigTrigSimplifyr   r   r   r   TrigSimplifyQ  s    r  c                 C   s   t t| S r   )r  TrigSimplifyRecurr   r   r   r   r    s    r  c                 C   s&   t | r| S t| jdd | jD  S )Nc                 S   s   g | ]}t |qS r   )r  r   r   r   r   r     r   z%TrigSimplifyRecur.<locals>.<listcomp>)rc  TrigSimplifyAuxr  r   r   r   r   r   r    s    r  c                 C   s$   | |krdS |   |  kr dS dS r+  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   r,  )r  r  r   r   r   FactorOrder  s    r  c                 C   s:   |d u r0| }|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>    s    r>  c                 C   sb   t | rt |rt| |S | S t |r*|S t| | }t |rN|dkrJ|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| rTd}| jD ]}|t|9 }q>|S dS r  )r   r   r  r'   r   r  r   PositiveFactorsr	  r   r   r   r  !  s    
r  c                 C   s   t | S r   )r(   r   r   r   r   Sign0  s    r  c                 C   s\   t | r| S t| rt| S t| r,tdS t| rXtd}| jD ]}|t|9 }qB|S | S r  )r   r  r  r   r   r  r   NonpositiveFactorsr	  r   r   r   r  3  s    
r  c                 C   s   | |krdS t | r| |kS t| r`t|rH| j|jkrHt| j|j S t| jo^t| j||S t| spt| r| jD ]}t	t|||rv dS qvdS dS r  )
rc  r  r  r   r)   PolynomialInAuxQr  r  r   r   r   r  r   r   r   r   r   r  B  s    
r  c                 C   s   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   PolynomialInQS  s    r  c                    s   |  krt dS t| r t dS t| r\t rH| j jkrH| 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                    s   g | ]}t | qS r   ExponentInAuxr   r  r   r   r   r  r   z!ExponentInAux.<locals>.<listcomp>c                    s   g | ]}t | qS r   r  r   r  r   r   r   s  r   )
r   rc  r  r  r)   r  r  r   r   r:   r  r   r  r   r  g  s    r  c                 C   s   t | tt||||S r   )r  r  r  r  r   r   r   
ExponentInu  s    r  c                    st   |  krS t | r| S t| rXt rD| j jkrD| j j  S t| j | j S | j fdd| jD  S )Nc                    s   g | ]}t | qS r   )PolynomialInSubstAuxr   r  r   r   r     r   z(PolynomialInSubstAux.<locals>.<listcomp>)rc  r  r  r)   r  r  r   r  r   r  r   r  x  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   PolynomialInSubst  s    
r  c                    s(   t |r t fdd|jD  S  | S )Nc                    s   g | ]} | qS r   r   r   r   r   r   r     r   zDistrib.<locals>.<listcomp>)r  r   r   r  r   r   r   Distrib  s    r  c                    sP   t | r|   S t| r(| j| j   S t| rHt fdd| jD  S |   S )Nc                    s   g | ]}t | qS r   )DistributeDegreer   r  r   r   r     r   z$DistributeDegree.<locals>.<listcomp>)rc  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 S | \}}}t||r8|S ||krHtdS t|r~|j|kr~t|jr~|du rr|jS t||jS |}|j	D ]}t|||}q|S )a"  
    FunctionOfPower[u,x] returns the gcd of the integer degrees of x in u.

    Examples
    ========

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

    r  r   Nr   )
r   FunctionOfPowerr   r   r  r  r   r)   r  r   )r   r   r  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   )r  r	  r   r$  r   r   r     r   z*DivideDegreesOfFactors.<locals>.<listcomp>)r  r   r   r  r	  r   r  r   r$  r   DivideDegreesOfFactors  s    r  c                    st  t | r,| kr tdtdgS td| gS t| rt| jrft| j}|d | j |d | j gS | jkrt| jr| jtdgS td| gS t| rtt	| }tt
| }|d |d  |d |d  gS t| rhfdd| jD }|d d  t
|D ]}t |d  qt s@t rL dk rLtd| gS  t fdd|D  gS td| gS )Nr   r   c                    s   g | ]}t | qS r   )MonomialFactorr   r  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   )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    s0    
 
r  c                 C   s   t | S r   r   r   r   r   r   FullSimplify  s    r  c                    sL  t | r| S t| r^t| d}|kr6td}n| }t| td |  |  S t| rt | jrtttt	| j| j
   S t| }t| r.t|d r.t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                    s   g | ]}t | qS r   )FunctionOfLinearSubstr   r   r   r   r   r   r     r   z)FunctionOfLinearSubst.<locals>.<listcomp>)r   r  r*  r   r  r  r   r  r  re  r)   r  r  r   r  r  r  r  r   )r   r   r   r   r  r  r   r  r   r    s"    


 "
$,(r  c                  G   s  t | dkrx| \}}t|dd|d}t|sPt|d sP|d dkrT|d dkrTdS t||d |d ||d |d gS | \}}}}}t||r||gS t|rdS t||rNt|rt||dt||dgS t	|t||dg}t
t||drt|rd|d gS t
|t||d |t||d  rF||d  |d gS ddgS t|rt|j|rtt|j|j |||dS t||}t|rDt|d rDdr@t|d r@|d dkr@t|d |r@tt|d rt|d dk rtt|d  |d | |||dS tt|d |d | |||dS dS ||g}|jD ]2}t||d |d |t|}t|rR dS qR|S )Nr  Fr   r   r,  )r   FunctionOfLinearrc  r   r  r   r  r  r*  CommonFactorsr   r   r  r  re  r)   r  r  r   r   r  r  r  r   r  )r   r   r   r  r   r   r  r   r   r   r   r     sH    ,$
&

2$$"


r  c                 C   s&   t t| |}|t | kr| S |S d S r   )NormalizeLeadTermSignsNormalizeIntegrandAuxr  r   r   r   NormalizeIntegrand(  s    r  c                 C   st   t | r*d}| jD ]}|t||7 }q|S tt| |r`d}t| |jD ]}|t||9 }qH|S tt| ||S d S r]  )r  r   r  r  r  NormalizeIntegrandFactor)r   r   r   r   r   r   r   r  /  s    
r  c           	         s<  t | rt| j rt| j }| j}t|rt|rt fdd|jD rt	| }d}|jD ]}|t
| |  7 }qb ||  ||  S || S n|| S t | rt| j r| jt| j  S t|  }t|r4t fdd|jD r.t	| }d}|jD ]}|| |  7 }q
 | | S |S n|S d S )Nc                 3   s   | ]}t | V  qd S r   rQ  r   r  r   r   r   C  r   z+NormalizeIntegrandFactor.<locals>.<genexpr>r   c                 3   s   | ]}t | V  qd S r   rQ  r   r  r   r   r   R  r   )r  r   r)   NormalizeIntegrandFactorBaser  r   r  r   r   rX  r   )	r   r   r  r  mir  r   r   rd  r   r  r   r  =  s4    






r  c           	      C   sv  t d|gd}t d}| || | }|r^t|r^d}|jD ]}|t|| | |7 }q>|S t| |rt| |rv| S t| |S nt| |rt	| |r| S t| |S nt
| rd}| jD ]}|t||9 }q|S t| |rt| |dkrt| |S t| rnt d}t d|gd}t| }t|sX||| | rBt|sXt|t| d krbt| |S t||S n| S d S )	Nr  r  r   r   r   rU  r  r  )r   r  r  r   r  r  r`  r  r  rc  r  r  r  r  r  r  r   )	r   r   r  r   r  r   r   r  r  r   r   r   r  ]  s>    







>
r  c                 C   s   t t| S r   )r  r  r   r   r   r   NormalizeTogether  s    r  c                 C   sz   t | rNd}| jD ]6}t|}|d dkr8||d 9 }q|t|d 9 }q|S t| }|d dkrj|d S t|d S d S r  )r  r   SignOfFactorAbsorbMinusSign)r   r  r   r  r   r   r   r    s    
r  c                 G   sx   t d|gd}t d}t d}| |||  }|rrt|dkrrt|| rrt|| rr|| ||  ||   S |  S )Nr  r  r   r  rT  )r   r  r   r  r  )r   r   r  r   r  r  r   r   r   r    s    r  c                 C   sx   t | r| S t| rHd}| jD ]}|t|9 }qt|d t|d  S t| rpd}| jD ]}|t|7 }qZ|S | S d S r  )rc  r  r   NormalizeSumFactorsr  r  )r   r   r   r   r   r   r    s    

r  c                 C   s   t | r| dk s(t| r2tt| dk r2d|  gS t| rpt| jrtt| jdk rd| j | j | j gS nDt| rd}d}| jD ]$}|t	|d 9 }|t	|d 9 }q||gS d| gS r+  )
r  r  r  r  r_  r  r)   r  r   r  )r   r   hr   r   r   r   r    s    (

r  c                 C   sD   t | }t|r:t|j|r:t|j|r:t|j||j S t||S r   )r  r  r  r  r   r)   r  r  r   r   r   NormalizePowerOfLinear  s
    r  c                 C   sF   t tt| |}dt| dt|  k r.|S |t | kr>|S | S d S )Nrh  rU  )r  r  r   r  r  r   r   r   SimplifyIntegrand  s    r  c                 C   s8   t | }t|}t|t|k r*t||S t||S d S r   )r   r  r  r  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   sj   t | }t|}t|t|k r$|}tt|t|krZt| |t|rZt||t|}nt	|}t
|S r   )r   rn   r  r   r   r  r  rX  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 d S r   )rc  r   r  )r   r  r  r   r   r   r   r   r    s    
r  c           	      G   s  t |dkr|d }d}tt| |rTt| |D ]}|t| ||||  7 }q2|S t| |rt| |}||d |d ||d    7 }|S t| |rt| |}||d |d ||d    |d |d|d     7 }|S t	| |r"t
| |}||d ||d   |d ||d    7 }|S t| |rt| |}||d ||d   |d ||d    |d |d|d  |d     7 }|S t| S n||d }|d }t||}t||}t|r| t|| }|jD ]}|t| | |7 }q|S | t|| t| | | S d S )Nr   r   r  rT  rU  )r   r  r   r  r  r  r  r  r  rN  r  rP  r  rX  r  r  r  r  r   r  )	r   r   r   r  r   r  r  r  r   r   r   r   r    sD    

 

8
,
L




r  c                 C   sP   t | rBd}g }| jD ]}||g7 }qt||D ]}||7 }q0|S t| |S d S r   )r  r   
UnifyTermsr  )r   r   r  r  r   rd  r   r   r   r     s    

r   c                 C   s*   | g kr| S t t| tt| ||S d 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 d S r  )r   r  r   r  r  r  )Ztermr  r   r  r   r   r   r  -  s    
r  c                 C   s   dS r   r   r   r   r   r   r  6  s    r  c                  G   s   t | dkr | \}}t|d |S | \}}}t||r8|S ||krDdS t||rtt||d}|d dkrndS |d u rz|S t|d |d  |d |d   r|S dS t|rdS |}|jD ]}t|||}t	|r dS q|S )Nr  Fr   r   )
r   FunctionOfInverseLinearr   r  rs  r~  r   r  r   rc  )r   r   r   r  r  r   r   r   r   r  9  s2    


$
r  c                 C   sl   t | r| |kS t| rdS t| rFt| jd | rFt| pDt| S | jD ]}tt|||rL dS qLdS NFr   T)	rc  r  ru  r   r   rv  r{  r   PureFunctionOfSinhQr  r   r   r   r  W  s    
r  c                 C   sl   t | r| |kS t| rdS t| rFt| jd | rFt| pDt| S | jD ]}tt|||rL dS qLdS r  )	rc  r  ru  r   r   rx  ry  r   PureFunctionOfTanhQr  r   r   r   r  e  s    
r  c                 C   sl   t | r| |kS t| rdS t| rFt| jd | rFt| pDt| S | jD ]}tt|||rL dS qLdS r  )	rc  r  ru  r   r   rw  rz  r   PureFunctionOfCoshQr  r   r   r   r  s  s    
r  c                 C   s   t t| | S r   )r   r   r  r   r   r   IntegerQuotientQ  s    r  c                 C   s   t t| | S r   )r  r   r  r   r   r   OddQuotientQ  s    r  c                 C   s   t t| | S r   )r  r   r  r   r   r   EvenQuotientQ  s    r  c                 C   s   |dkrdS t t|| ks,t t||kr|tt|r|tt|jd |r||sftt|jd | r|t| jd t|gS t| |t|||}t	|rdS |d t
||d  gS Nr   Fr   )rd  r  r  r	  r  r   r   r  FindTrigFactorrc  r  )Zfunc1Zfunc2r   r  r  r  r   r   r   r    s    Zr  c                    s
  t | r| kS t| rdS t| rdt| jd  rdt| jd  rTt| pRt| S t| pbt	| S t
| rt| jrt| jjd  rt| jrdS t| j S nHt| rt| jd r t| jd r t| jd jd  d  r t| jd jd  d  r tt| d S ttt|  d}t|rbt|d  rbt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   s   | ]}t | V  qd S r   FunctionOfSinhQr   r  r   r   r     r   z"FunctionOfSinhQ.<locals>.<genexpr>c                 3   s   | ]}t | V  qd S r   r  r   r  r   r   r     r   )rc  r  ru  r  r   r  rv  r{  rw  rz  r_  r  r  r)   r  r  r   rs  r  rC  rG  r  r  rE  rF  rD  rH  r   r   r  r   r  r   r  r   r    s6    

\
r  c                    s$  t | r| kS t| rdS t| rDt| jd  rDt| pBt| S t| rt| jrt| jjd  rt	| j
rvdS t| j S nt| r
ttt|  d}t|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   c                 3   s   | ]}t | V  qd S r   FunctionOfCoshQr   r  r   r   r     r   z"FunctionOfCoshQ.<locals>.<genexpr>c                 3   s   | ]}t | V  qd S r   r  r   r  r   r   r     r   )rc  r  ru  r  r   rw  rz  r_  r  r  r)   r  r  r  rC  rG  r  rD  rH  r   r  r   r  r   r    s(    

r  c                    s   t | s t| s t| s t| r0t| jd  S t| rPt| joNt	| j
 S t| rttt| dr~t	t|  S g }| jD ]}tt| r|| q|g krdS t|dkot	|d  S t| rt fdd| jD S dS )Nr   r   Tc                 3   s   | ]}t | V  qd S r   )OddHyperbolicPowerQr   r  r   r   r     r   z&OddHyperbolicPowerQ.<locals>.<genexpr>F)rv  rw  rz  r{  r  r   r  r  r)   r  r  r  r   r  r  r  FunctionOfTanhQr  r  r  r   r   r  r   r  r   r   r  r   r    s"     
r  c                    sH  t | r| kS t| rdS t| rTt| jd  rTt| pRt| pRt| jd  S t| rt	| j
rt| jrt| jjd  rdS t	| jd rt| jd rtt| jd d  S t| r.g }| jD ]}tt| r|| q|g k rdS t|dko,t|d  o,t|d  S t fdd| jD S )NFr   Tr   r  c                 3   s   | ]}t | V  qd S r   r  r   r  r   r   r     r   z"FunctionOfTanhQ.<locals>.<genexpr>)rc  r  ru  r  r   rx  ry  r  r  r  r)   r  r  r  rX  r  r   r  r  r  r   r  r   r  r   r    s(     &


0r  c                    sB  t | rtdS t| r tdS t| rt| jd  rt| rZt| jd   rZtdS t| r|t| jd   r|tdS tdS t	| rt
| jrt| jrt| jjd  rt| jst| jst| jrtdS tdS t| r(t fdd| jD r t 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   r,  c                 3   s   | ]}t | V  qd S r   r  r   r  r   r   r   (  r   z'FunctionOfTanhWeight.<locals>.<genexpr>c                    s   g | ]}t | qS r   FunctionOfTanhWeightr   r  r   r   r   )  r   z(FunctionOfTanhWeight.<locals>.<listcomp>c                    s   g | ]}t | qS r   r  r   r  r   r   r   +  r   )rc  r   r  ru  r  r   rx  r   ry  r  r  r)   r  rw  rz  r  r   r   r  r   r  r   r    s(    &
r  c                    sR   t | r| kS t| rdS t| r8t| jd  r8dS t fdd| jD S )NFr   Tc                 3   s   | ]}t | V  qd S r   )FunctionOfHyperbolicQr   r  r   r   r   6  r   z(FunctionOfHyperbolicQ.<locals>.<genexpr>)rc  r  ru  r  r   r   r  r   r  r   r  -  s    r  c                 C   sX   t | r4| j}| j}t|rP|dk rPt||  S nt| rPtdd | jD  S t| S )Nr   c                 S   s   g | ]}t |qS r   )SmartNumeratorr   r   r   r   r   ?  r   z"SmartNumerator.<locals>.<listcomp>)	r  r)   r  r  SmartDenominatorr  r   r   r.  )r   r  r   r   r   r   r  8  s    r  c                 C   sX   t | r4| j}| j}t|rP|dk rPt||  S nt| rPtdd | jD  S t| S )Nr   c                 S   s   g | ]}t |qS r   )r  r   r   r   r   r   I  r   z$SmartDenominator.<locals>.<listcomp>)	r  r  r)   r  r  r  r   r   r-  )r   r   r  r   r   r   r  B  s    r  c                 C   s   | S r   r   r   r   r   r   r  L  s    r  c                     sh   t | dkr"| \}}tt||S | \}}}t||}t| t|r`|j fdd|jD  S  | S )Nr  c                    s   g | ]} | qS r   r   r   r   r   r   r   W  r   zExpandTrig.<locals>.<listcomp>)r   r  r.  
ExpandTrigr  r  r   )r   r   r   r  r  r   r   r   r  O  s    

r  c                 C   s   t | S r   )r   r   r   r   r   
TrigExpandZ  s    r  c                    s  t | r| S t| rt| jd r| jd ksDt| jd  rt| rPS t| r\ S t| rl  S t| r|  S t	| rd  S d S t
tt| t| jd   i}|j fdd|jD  S t| rht| jd rht| jd rht| jd jd d  rht| jd jd d  rhtd tt| d  S | j fdd| jD  S )Nr   r   c                    s   g | ]}t | qS r   SubstForTrigr   cos_sin_r  r   r   r   r     r   z SubstForTrig.<locals>.<listcomp>r  c                    s   g | ]}t | qS r   r  r   r  r   r   r     r   )rc  rh  r  r   r   ri  rj  rk  rl  rm  r  r  rd  r   r  r  rD   r  rs  )r   r  r  r  r   r  r   r  r   r  t  s(     , f"r  c                    s  t | r| S t| rt| jd r| jd ksDt| jd  rt| rPS t| r\ S t| rl  S t| r|  S t	| rd  S d S t
tt| t| jd   i}|j fdd|jD  S t| rht| jd rht| jd rht| jd jd d  rht| jd jd d  rhtd tt| d  S | j fdd| jD  S )Nr   r   c                    s   g | ]}t | qS r   SubstForHyperbolicr   cosh_sinh_r  r   r   r   r     r   z&SubstForHyperbolic.<locals>.<listcomp>r  c                    s   g | ]}t | qS r   r   r   r  r   r   r     r   )rc  ru  r  r   r   rv  rw  rx  ry  rz  r  r  rd  r   r  r  r3   r  rs  )r   r  r  r  r   r  r   r  r   r    s(     , f"r  c                 C   s<   t | to:t | to:t | to:t | to:t | to:t | tS r   )r   rD   rE   rF   rG   rI   rH   r   r   r   r   InertTrigFreeQ  s    r  c                 C   s
   t | |S r   )rp   r   r   r   r   r    s    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 r  )	FractionalPowerOfLinearr   rc  r   r*  r   r  r  r  )r   r   r  r  r   r   r  r   r   r   SubstForFractionalPowerOfLinear  s    6r  c                 C   s   t | st| |r||gS t| r&dS t| rft| j|rft|sPt| j| rftt	| j
|| jgS ||g}| jD ](}t||d |d |}t |rt dS qt|S r  )rc  r   r  ra  r  r  r   r   r  r-  r)   r   r  r  r   r   r   r    s    "
r  c                 C   sh   t | st| st| |rdS t| r:t| jd |r:| S | jD ]"}t||}tt |r@|  S q@dS r   )rc  r  r   r  r  r   InverseFunctionOfLinearr   )r   r   r   r  r   r   r   r    s    


r  c                     s   t | dkr:| d  ttttttg}t fdd|D S t | dkrr| \ } |kr^t S t	 |ppt	| S | \ }}t| ot||S d S )Nr   r   c                 3   s   | ]}t  |kV  qd S r   )rd  r   r}  r   r   r     r   zInertTrigQ.<locals>.<genexpr>r  )
r   rD   rE   rF   rG   rI   rH   r   
InertTrigQInertReciprocalQ)r   r   rw  r  r   r}  r   r	    s    
r	  c                 C   s<   | j tkr|j tkp:| j tkr(|j tkp:| j tko:|j tkS r   )r  rD   rH   rE   rI   rF   rG   rv  r   r   r   r
    s    r
  c                 C   s   t t| ||S r   )FixInertTrigFunctionDeactivateTrigAuxrZ  r   r   r   DeactivateTrig  s    r  c                 C   s   | S r   r   rZ  r   r   r   r    s    r  c                    sJ  t | r| S t| rt| jd  rt| jd  }t| rDt|S t| rTt|S t	| rdt
| S t| rtt|S t| rt|S t|S t| r0t| jd  r0tt| jd   }t| rt t| S t| rt|S t|  rt t
| S t| rtt|  nt| r$t|S tt| S | j fdd| jD  S )Nr   c                    s   g | ]}t | qS r   )r  r   r  r   r   r     r   z%DeactivateTrigAux.<locals>.<listcomp>)rc  rh  r  r   r  ri  rD   rj  rE   rk  rF   rl  rG   rm  rI   rH   ru  r   rv  rw  rx  ry  rz  r  r  r   r  r   r    s:    


r  c                 C   s&  t d|gd}t d|gd}t d|gd}t d|gd}t d|gd}t d|gd}t d|gd}	t d	}
|||||
 |   |	 }| |}|r||||	||
g}t|t|krd
S |||||
 |   ||||
 |   |	 }| |}|r"|||||	|||
g}t|t|kr"d
S dS )Nr  r  r  r   r   r0  r  r  r  TF)r   r  r   )r   r  r   r  q_r  r  r  r  r  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|||  }|rt |dkrt|| |rdS z|t|}t|jd }	|jd jd }t||rt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rW dS W n   Y n0 dS )	NrT  Tr0  r  r:  r  r   F)r   PiecewiseLinearQr  r   r  re  typer   rg  r.   r4   r5   r/   r=   rF   rG   r@   )
r   r   r  r   r  r<  r  r  r:  Gr   r   r   r  '  s0    

@
r  c                 C   sR  |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}	||||  | }
|
r|
| }t|jd |rt| |jrdS ||||  | |||   }
|
r|
| }t|jd |rt| |jrdS |||	|d   }
|
rF|
| }t|jd |rFt| |jrFdS ||||  |	|d   }
|
r|
| }t|jd |rt| |jrdS ||||  | ||	|d    }
|
r|
| }t|jd |rt| |jrdS ||||  | |||  |	|d    }
|
rN|
| }t|jd |rNt| |jrNdS dS )Nr   Tr   r  r   r   r  r  ABCr  F)r   r   r  r  r   rg  r  )r  r   r   r  r  Zfunc_r  A_B_C_r  r  r   r   r   KnownTrigIntegrandQE  sP    "  & . r  c                 C   s   t ttg| |S r   )r  rD   rE   rZ  r   r   r   KnownSineIntegrandQv  s    r  c                 C   s   t tg| |S r   )r  rF   rZ  r   r   r   KnownTangentIntegrandQy  s    r  c                 C   s   t tg| |S r   )r  rG   rZ  r   r   r   KnownCotangentIntegrandQ|  s    r  c                 C   s   t ttg| |S r   )r  rI   rH   rZ  r   r   r   KnownSecantIntegrandQ  s    r  c           	      C   s   t d|gd}t d|gd}t d|gd}t d}| j}zttttttg|r| jd ||||   }|rt	|dkr|| }tt
tttg|jrt|jd |rW dS W n   Y n0 d	S )
Nr   r  r   r0  r  r   rU  TF)r   r  rg  r=   r@   r.   r/   r   r  r   rF   rG   r4   r5   r  )	r   r   r  r  r  G_r:  r  r  r   r   r   TryPureTanSubst  s"    
r   c                    s4  t | rdS tt| |sdS td|gd}td|gd}td|gd}ttd\}}}}}	}
}| ||| |    rt dkr fdd	||||fD \}}}}t|rt|rdS | d
||	|
|      r.t dkr. fdd	||	|
|fD \}}}}t	|r.t|r.|dkr.dS | |
|   rt dkr |
  |  }}t	|rt	|rt
|jd | |jd | rdS | ||||  |    rt dkr fdd	|||||fD \}}}}}t|dko|t|kp|t|krdS | t| |kr0dS dS )NFr   r  r  r  ZrstnbfgrU  c                    s   g | ]} | qS r   r   r   r  r   r   r     r   z TryTanhSubst.<locals>.<listcomp>r   c                    s   g | ]} | qS r   r   r   r  r   r   r     r   r  r   rh  c                    s   g | ]} | qS r   r   r   r  r   r   r     r   T)rf  r   r  r   mapr  r   r   r   r  r   r   r   rF  rG  r.  )r   r   r  r  r  r_s_t_r  r  r  g_r  r  r  r  r   r   r   rw  r  r  r   r  r   TryTanhSubst  sH    "" &*r&  c                 C   s   | j }td|gd}td}|tkr(dS | jd || }|rvt|dkrv|| j }tttg|rvtt	t
g|rvdS | t| |krdS dS )Nr   r  r  Fr   r  T)r  r   r   r   r  r   rg  r.   r/   r4   r5   r.  )r   r   r:  r  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   s^  | g krt dd |D  S |g kr4t dd | D  S | d d |d d kr| d d |d d kr| 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 rP|d d |d d  t| t| S t| t|S )Nc                 S   s"   g | ]}|d  t |d d  qS r  r;   r   r   r   r   r     r   z'AbsurdNumberGCDList.<locals>.<listcomp>c                 S   s"   g | ]}|d  t |d d  qS r  r+  r   r   r   r   r     r   r   r   )r   r(  r  )r  r  r   r   r   r(    s    **&&r(  c           	      C   s\   t t|||| i| ||i}t|rPd}|jD ]}|| | 7 }q:|S | | S d S r   )rX  r  r   r  r   )	r   r:  r  r  r  r   r  r  r   r   r   r   ExpandTrigExpand  s    (
r,  c                  G   s~   t | dkr`| d }| d }| d }t||}t|rVd}|jD ]}||| 7 }q@|S || S n| d }| d }t||S d 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|r6d}|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}|||  }| |}|rt|| jdkrt|| jd |rt|| jd |dkr|| jd }|| || |t||i||   S | S d S )Nr   r  r  r   r:  r   )r   r  r   r   r  r  r   r  )r  r   r   r  r:  r   Mr   r   r   r   r0    s    
B(r0  c                 C   s@   |  tt tt tt tt tt tt}|tt	S r   )
rewriterD   r^  rE   rF   rI   rH   rG   r   r   )r   exr   r   r   	TrigToExp"  s    4r4  c                 G   s   t |dkr |d }td| |S |d }|d }t|}d}t|rh|jD ]}|t| | |7 }qJ|}nt| | |}tt||t|||S d S r  )	r   ExpandTrigToExpr4  r  r   r  r.  r  r  )r   r   r   r  r  r   r   r   r   r   r5  &  s    
r5  c                 C   s  t | r(d}| jD ]}|t|7 }q|S t| rtdd | jD r| ttftt	t
ft tttt
tr| ttftt	t
ft tt S | ttftt	t
ft ttS nt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	| }|rP|| }|| }|| }| |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| r| ttr4| 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
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 | 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   s   | ]}t |V  qd S r   )r  )r   r   r   r   r   r   O  r   zTrigReduce.<locals>.<genexpr>r   r   r  r   r  )r  r   r/  r  r   r2  rD   r3   r^  rE   r2   r   r   r   r}   r   r  r   r   r  )r   r  r   r   r   r  r  r   r   r   r/  7  sv    

2,,@@@@@@
( ( r/  c           
      G   s  t |dkr0|d }t| d |}|r(|S dS n|\}}t| rP| |krLd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 r:t| 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 d S Nr   r   F)r   FunctionOfTrigrc  rh  r  r   r*  r   r  r.  ru  r   r  r   )
r   r   r   r  r   r   r0  r  r  r   r   r   r   r7    sN    
$$
$$



r7  c                 C   s   t | rdS t| r(t| jd |r(dS t| rDt| jd |rDdS t| rft| j|rt| j	|S n0t
| svt| r| jD ]}t||s| dS q|dS dS )NTr   F)rc  rh  r  r   ru  r  r   r)   AlgebraicTrigFunctionQr  r  r  r  r   r   r   r8    s    

r8  c           	      G   sR  t |dkr4|d }t| d |}|d u r,dS |S n|d }|d }t| r\| |krXd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
| r dS |}| jD ]}|t|||kr* dS q*|S d S r6  )r   FunctionOfHyperbolicrc  ru  r  r   r*  r   r  r.  r  )	r   r   r  r   r   r0  r  r  r   r   r   r   r9    s:    
$$


r9  c                 C   sR  t ||rdS t| rdS t| rJttt| |drJtt| ||||S |r\t| s`t	| rrt
|| jd |S t| st| rt|| jd |S t| rt|| jd |S t| rt|| jd |S t| st|  rt|| jd |S t| s t| rt|| jd |S t| r.t|| jd |S t| rJt|| jd |S t|| |dkS nt| spt	| rt|| jd |S t| st| rt|| jd |S t| st| rt || jd | nrt| st| rt!|| jd |S t| s
t| rt"|| jd |S t| s0t| rBt#|| jd |S t|| |dkS )NFTr   r   )$r   rc  r  r   r  r  FunctionOfQr  ri  rn  PureFunctionOfSinQr   rj  rm  PureFunctionOfCosQrk  PureFunctionOfTanQrl  PureFunctionOfCotQrv  r{  r  rw  rz  r  rx  r  ry  PureFunctionOfCothQFunctionOfExpnQFunctionOfSinQFunctionOfCosQFunctionOfTanQr  r  r  )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| r0dS t| rt| j|rt| j| rjt| jrf| jS dS t|rt|j|rt| j|j rt|jrt| jrt| j|j r|jdks| jdk r| j|j S dS tt	| j|j rt	| j|j S dS t
| j||S t| rFttt| |drFt
t| |||S t| rt|rt
t| t||}|dkr|dS t
t| t||}||krtt	| | |A |r|S dS g }| jD ]0}t
|||du r dS |t
||| qtt|S 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@    sP    


 
. 
"
r@  c                 C   sl   t | r| |kS t| rdS t| rFt| jd | rFt| pDt| S | jD ]}tt|||rL dS qLdS r  )	rc  r  rh  r   r   ri  rn  r   r;  r  r   r   r   r;  M  s    
r;  c                 C   sl   t | r| |kS t| rdS t| rFt| jd | rFt| pDt| S | jD ]}tt|||rL dS qLdS r  )	rc  r  rh  r   r   rj  rm  r   r<  r  r   r   r   r<  Z  s    
r<  c                 C   sl   t | r| |kS t| rdS t| rFt| jd | rFt| pDt| S | jD ]}tt|||rL dS qLdS r  )	rc  r  rh  r   r   rk  rl  r   r=  r  r   r   r   r=  g  s    
r=  c                 C   sd   t | r| |kS t| rdS t| r>t| jd | r>t| S | jD ]}tt|||rD dS qDdS r  )rc  r  rh  r   r   rl  r   r>  r  r   r   r   r>  t  s    
r>  c                    s$  t | r| kS t| rdS t| rDt| jd  rDt| pBt| S t| rt| jrt| jjd  rt	| j
rvdS t| j S nt| r
ttt|  d}t|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   c                 3   s   | ]}t | V  qd S r   rB  r   r  r   r   r     r   z!FunctionOfCosQ.<locals>.<genexpr>c                 3   s   | ]}t | V  qd S r   rD  r   r  r   r   r     r   )rc  r  rh  r  r   rj  rm  r_  r  r  r)   rB  r  r  rD   rH   r  ro  rF   rG   r   r  r   r  r   rB    s(    

rB  c                    s
  t | r| kS t| rdS t| rdt| jd  rdt| jd  rTt| pRt| S t| pbt	| S t
| rt| jrt| jjd  rt| jrdS t| j S nHt| rt| jd r t| jd r t| jd jd  d  r t| jd jd  d  r tt| d S ttt|  d}t|rbt|d  rbt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   s   | ]}t | V  qd S r   rA  r   r  r   r   r     r   z!FunctionOfSinQ.<locals>.<genexpr>c                 3   s   | ]}t | V  qd S r   rE  r   r  r   r   r     r   )rc  r  rh  r  r   r  ri  rn  rj  rm  r_  r  r  r)   rA  r  r   rs  r  rD   r7   r  r  rp  rE   rI   rF   rG   r   r  r   r  r   rA    s6    

\
rA  c                    s   t | s t| s t| s t| r0t| jd  S t| rPt| joNt	| j
 S t| rt| dksxt	t|  S g }| jD ]}tt| r|| q|g krdS t|dkot	|d  S t| rt fdd| jD S dS )Nr   r   Tc                 3   s   | ]}t | V  qd S r   )OddTrigPowerQr   r  r   r   r     r   z OddTrigPowerQ.<locals>.<genexpr>F)ri  rj  rm  rn  r  r   r  r  r)   rF  r  r  r  r  r   rC  r  r  r  r   r  r   r  r   rF    s"     
rF  c                    s:  t | r| kS t| rdS t| rTt| jd  rTt| pRt| pRt| jd  S t| rt	| j
rt| jrt| jjd  rdS t	| j
rt| jrtt| jd  S t| r g }| jD ]}tt| r|| q|g krdS t|dkot|d  ot|d  S t fdd| jD S )NFr   Tr  r   c                 3   s   | ]}t | V  qd S r   rC  r   r  r   r   r     r   z!FunctionOfTanQ.<locals>.<genexpr>)rc  r  rh  r  r   rk  rl  r  r  r  r)   r  r  rC  rX  r  r   r  r  rF  r   r  r   r  r   rC    s(     &

0rC  c                    sB  t | rtdS t| r tdS t| rt| jd  rt| rZt| jd   rZtdS t| r|t| jd   r|tdS tdS t	| rt
| jrt| jrt| jjd  rt| jst| jst| jrtdS tdS t| r(t fdd| jD r t fdd| jD  S tdS t fdd| jD  S )	Nr   r   r,  c                 3   s   | ]}t | V  qd S r   rG  r   r  r   r   r     r   z&FunctionOfTanWeight.<locals>.<genexpr>c                    s   g | ]}t | qS r   FunctionOfTanWeightr   r  r   r   r      r   z'FunctionOfTanWeight.<locals>.<listcomp>c                    s   g | ]}t | qS r   rH  r   r  r   r   r     r   )rc  r   r  rh  r  r   rk  r   rl  r  r  r)   r  rj  rm  r  r   r   r  r   r  r   rI    s(    &
rI  c                    sR   t | r| kS t| rdS t| r8t| jd  r8dS t fdd| jD S )NFr   Tc                 3   s   | ]}t | V  qd S r   )FunctionOfTrigQr   r  r   r   r     r   z"FunctionOfTrigQ.<locals>.<genexpr>)rc  r  rh  r  r   r   r  r   r  r   rJ    s    rJ  c                    sB   t |  rdS t|  r*tt|  dkS t fdd| jD S )NTr   c                 3   s   | ]}t | V  qd S r   )FunctionOfDensePolynomialsQr   r  r   r   r     r   z.FunctionOfDensePolynomialsQ.<locals>.<genexpr>)r   r  r  r  r   r   rZ  r   r  r   rK    s
    

rK  c                 G   sT  t |dkrL|d }t| dd|}t|s@t|d s@t|tsDdS |S n|d }|d }|d }t| r| |krxdS | ||gS t| rdS t| jd |}t	| rt
|rt|d rt|s| jd |kr|| 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 d S )Nr   r   Fr  )r   FunctionOfLogrc  r   r   r   r  r  r   rf  r  r   r  r  )r   r   r   r  r  r  r   r   r   r   r   rL    s8    



rL  c                 C   sV   t |rNt| |d|}|sdS |||d   t| |d | |d |d gS ndS d S r  )r   PowerVariableDegreePowerVariableSubst)r   r  r   r  r   r   r   PowerVariableExpn<  s    0rO  c                 C   s  t | |r||gS t| s"t| r&dS t| rt | j| |rt|s^|| jkrn|| j| krn| j| j| gS t| jrt|rt|| jdkr|| j| krt|| j|gS dS ||g}| j	D ]:}t
||d |d |dkr dS t
||d |d |}q|sdS |S d S )NFr   r   )r   rc  r  r  r  r   r)   r   r  r   rM  )r   r  r0  r   r  r   r  r   r   r   rM  H  s&    
 0
rM  c                 C   s   t | |st| st| r| S t| rDt | j| |rD|| j|  S t| rpd}| jD ]}|t|||9 }qV|S t	| rd}| jD ]}|t|||7 }q|S | S r  )
r   rc  r  r  r  r)   r  r   rN  r  )r   r  r   r   r   r   r   r   rN  _  s     

rN  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	}| || |||   | }	|	rt|	d
krt|	| |	| g|rt|	| d rt|	| |rtt|	| st|	| rtt	|	| |rdS | || || |||   |  }	|	rt|	dkrt|	| |	| g|rt
|	| |	|  rtd|	|  |	| d rt|	| |rtt|	| st|	| rtt	|	| |rdS | || ||  }	|	r@t|	dkrDt|	| rDt|	| d rDt|	| |rDt|	| |rDtt	|	| |rDdS ndS d S )Nr   r  r   r  r   r  r  r   r  rh  g      ?TrV  r  rT  F)r   r  r   r   r   r  r   r  r   r  r   r   )
r   r   r   r   r  r  r  r   r  r1  r   r   r   EulerIntegrandQq  s(    n&brP  c              	   G   s  t |dkr|d }ttttdd t|tdd tdd  t  |tdd }tt| |d |}|rtdS t	| d|}t
|st|d rdS |d }t||d}t||d}t||d	}t|rt|st|d	 d
| |  rdS t|rzt|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
| st| |r|gS t| rdt| j|rdt| jrVt| jd	krVt| j|rVt| j|d	krVt|sJ| j|krR| jgS dS t	| j||S t| sxt| r|g}g }| jD ]2}t	||d |dkr dS t	||d |}q|S dS d S )Nr   r   r  r  r   c                 S   s   t | ||||g|S r   rY  )r   r   r  r  r  r   r   r   r   r\    r   z1FunctionOfSquareRootOfQuadratic.<locals>.<lambda>Fr  rU  rT  ) r   r   r   r/  r   r  r  r   r   FunctionOfSquareRootOfQuadraticrc  r   r*  r   r   r?  r   r   SquareRootOfQuadraticSubstr#  r  r   r  r)   r   r-  r  r  r  r  r  r   )r   r   r   r  r1  r  r   r   r0  r<   r  r  r  r  r  r   r   r   r   rQ    s`    B(
F
L
<
rQ  c                 C   s   t | st| |r"| |kr|S | S t| rt| j|rt| jrxt| jdkrxt| j|rxt| j|dkrx|t	| j S t
| j|||| j S n\t| rd}| jD ]}|t
||||7 }q|S t| rd}| jD ]}|t
||||9 }q|S d S r  )rc  r   r  r)   r   r-  r  r  r  r.  rR  r  r   r  )r   ZvvZxxr   r  r   r   r   r   rR    s&    4

rR  c                 C   s"   t ||  }t||r|S dS d S r   )r   r   )r  r   r   r  r   r   r   Divides  s    
rS  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
||rx|S dS n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   s
   t | |S r   rY  r   r   r   r   r\    r   z#DerivativeDivides.<locals>.<lambda>c                 S   s:   t | |r,t ||o*t||t| |d kS t| |S d S r  )r  r  EasyDQ)r  r   r   r   r   r   f1  s    
"zDerivativeDivides.<locals>.f1FN)r   r   r   r   r   r  r   Dr  r   r   )r  r   r   r   Zpattern0rU  r  r   r   r   DerivativeDivides  s    



rW  c                 C   s  t ddgd}t d|dgd}| |||  }|rBt|| |S t| s`t| |s`t| dkrddS t| rpdS t| dkrt| jd |S t| |st	| |rdS t
| |rt| |ddgkrdS t| rtt| |rtt| |S tt| |rtt| |S dS nt| r6tt| |o4tt| |S t| dkrt| jd |rht| jd | n&t| jd |rt| jd |S dS dS )	Nr   r   r  r  r   TFr  )r   r  rT  rc  r   r  r  r   r  ProductOfLinearPowersQr  r"  r  r  r  r  )r   r   r   r  r1  r   r   r   rT    s<    

rT  c                 C   sd   t d}t d|gd}| || }t| |pb|r@t|| |pbt| obtt| |obtt| |S )Nr  r  r  )r   r  r   r  r  rX  r  r  )r   r   r  r  r1  r   r   r   rX    s    rX  c                 C   s   t t| |S r   )RtAuxr  r  r   r   r   r?  &  s    r?  c                 C   s   t | td|  S r  )r   r   r  r   r   r   NthRoot)  s    rZ  c                 C   s,   t | p*t| o*t| jd o*t| jd S r  )rc  r  r  r   	AtomBaseQr   r   r   r   r[  ,  s    r[  c                 C   s,   t | p*t| o*t| jd o*t| jd S r  )r  r  r  r   SumBaseQr   r   r   r   r\  0  s    r\  c                 C   s8   t | rtt| p6t| o6t| jd o6t| jd S r  )r  r   r  r  r  r   NegSumBaseQr   r   r   r   r]  4  s    r]  c                 C   sD   t | rt| jrt| jS t| r<tt| o:tt| S t| S r   )	r  r  r)   AllNegTermQr  r  r   r  r  r   r   r   r   r^  8  s    

r^  c                 C   sD   t | rt| jrt| jS t| r<tt| p:tt| S t| S r   )	r  r  r)   SomeNegTermQr  r  r   r  r  r   r   r   r   r_  A  s    

r_  c                 C   s0   t | o.t| jd do.tttgt| jd S Nr   r  r   )r  r  r   rg  rD   rE   rd  r   r   r   r   TrigSquareQJ  s    ra  c                    s  t | r| j| j   S t| rt| }t| }tt|o@t|rt||d |d   rt||d |d   rtdt	||d |d   ||d |d   t
    S t|  S t| r`tt| }t|rt	|d  t	|d   S tt| }t|rt|d dr|d }t |rLt|jrLdt	|j|j     S t|rtt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|rVt	|d   t	|d   S t	t|  t	t|  S t rt	|  S t|  S n t	|d   t	|d    S tt| }t|rttt|d rt	|d   t	|d    S tt| }t|rFttt|d rFt	|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 d S )Nr  r   r   r,  c                    s   g | ]}t | qS r   )rY  r   r$  r   r   r     r   zRtAux.<locals>.<listcomp>) r  r  r)   r   r  r  r   r   r   rY  r   rZ  r  SplitProductr   r  r   r  r\  r^  r]  r_  r[  r  r  r  r  r   
TrigSquarerc  r   r   )r   r  r   r   r  r  r   r$  r   rY  N  sn    D:
















 
 
 
 rY  c                 C   s   t | r| jD ]8}tt|}|dks2t|| dkr8 dS ttt|}q|rt|d d |d  rt|d d jd tkr|d t|d d d d d  S |d t|d d d d d  S dS ndS d S )NFr   r  r   )	r  r   rb  ra  SplitSumr   rd  rD   rE   )r   r   r  r  r   r   r   rc    s    

$$rc  c                    s   t  fdd| jD  S )Nc                    s   g | ]}t | qS r   rc   r   r  r   r   r     r   zIntSum.<locals>.<listcomp>)r   r   rZ  r   r  r   IntSum  s    re  c           	      C   sj  t d|gd}t d|dgd}t d}| || }|rt|dkrt|| |rt|| |rt|| tt|| | t|| |d |S | |||  }|rt|dkrt	|| d rt|| |rt|| || || d   t|| |d|| d   |S t
| rDd}| jD ]}|t||7 }q*|S | }tt||tt||||S d S )	Nr0  r  r  r   r  r  r   rT  )r   r  r   r   r  r  re  r  r*  r   r  r   IntTermDistr  rd   r  )	r   r   r0  r  r  r1  r  r   r   r   r   r   rf    s     ,06>

rf  c                 C   s4   g }t dt|D ]}|| || ||  q|S r   )rK  r   r  )r   r  r  r  r   r   r   r   Map2  s    rh  c                    s  t |  r| tdgS t| r*td| gS t| rt | j rt| j }t| jrp|d | j |d | j gS t|d }|dkrtd| gS || j t	|d |d  | j gS nt
|  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  rHt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                    s   g | ]}t | qS r   ConstantFactorr   r  r   r   r     r   z"ConstantFactor.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r  r   r   r   r   r     r   c                 S   s   g | ]}|d  qS r   r   r   r   r   r   r     r   c                    s   g | ]}t | qS r   ri  r   r  r   r   r     r   c                 S   s   g | ]}|d  qS rl  r   r   r   r   r   r     r   c                 S   s   g | ]}|d  qS )r   r   r   r   r   r   r     r   c                 S   s   g | ]}t |qS r   rk  r   r   r   r   r     r   c                 S   s   g | ]}|d  qS rl  r   r   r   r   r   r     r   )r   r   rc  r  r)   rj  r  r   r  r  r  r   r   r  SameQr   r  r  rh  r  )r   r   r  r  r  r  r   r  r   rj    s.    

&
$
&rj  c                  G   s6   t dt| d D ]}| | | |d  kr dS qdS rI  )rK  r   rN  r   r   r   rm    s    rm  c                 C   s   || |< | S r   r   )r  r   r   r   r   r   ReplacePart  s    rn  c                    s  dd | D }dd | D t  }fddD dd |D t rl|d  }dd |D }nt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rT|   } 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 }nt|dkr*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 }n4tt   t|t| }tdd	 |D r:t|S q:d S )Nc                 S   s   g | ]}t |qS r   )r  r   r   r   r   r     r   z!CommonFactors.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )r  r   r   r   r   r     r   c                    s   g | ]}|  qS r   r   r   )r  r   r   r     r   c                 S   s   g | ]}t |qS r   )r  r   r   r   r   r     r   r   c                 S   s   g | ]}t |qS r   r  r   r   r   r   r     r   c                 s   s.   | ]&}t |o$tt|o$t|d kV  qdS r   )rf  r   r  r   r   r   r   r     r   z CommonFactors.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r   r  r   r   r   r   r     r   c                    s   g | ]}t |t  qS r   r  r  r   rd  r  r   r   r     r   c                    s   g | ]}t |t  qS r   rq  rr  rs  r   r   r     r   c                    s    g | ]} | |   qS r   r   r   )r  r  r  r   r   r     r   c                 S   s   g | ]}t |qS r   ro  r   r   r   r   r     r   c                 S   s   g | ]}t |qS r   )r	  r   r   r   r   r     r   c                 S   s   g | ]}t |qS r   )r  r   r   r   r   r     r   c                    s$   g | ]}|  |    qS r   r   r   r  r  r  r  r   r   r      r   c                 S   s   g | ]}t |qS r   ro  r   r   r   r   r     r   r  r   r,  c                    s$   g | ]}|  |    qS r   r   r   rt  r   r   r   	  r   c                 S   s   g | ]}t |qS r   ro  r   r   r   r   r   
  r   c                    s$   g | ]}|  |    qS r   r   r   rt  r   r   r     r   c                 S   s   g | ]}t |qS r   ro  r   r   r   r   r     r   c                 s   s   | ]}|d kV  qdS rS  r   r   r   r   r   r     r   )r)  rm  r   r  re  r  rK  r   r  r  r  r  r   r   r   r   r;   MostMainFactorPositionrn  r  r  )r  r  commonr   )r  r  r  r  r  r   r    st     
",


"(


"r  c                 C   sB   t d}d}tdt| D ]"}t| | |dkr| | }|}q|S r  )r   rK  r  r  )r  rn   r  r   r   r   r   ru    s    ru  NNc                 C   s   d\a adat| |}|otS Nrw  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 rx  ry  rZ  r   r   r   FunctionOfExponential/  s    
r  c                 C   s&   d\a adat| | tt| ||S rx  )rz  r{  r|  r}  r   FunctionOfExponentialFunctionAuxrZ  r   r   r   FunctionOfExponentialFunction7  s    
r  c              	      s  t | r| S t| rt| j rt| j rttt dr| 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 nt| 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| rb|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                    s   g | ]}t | qS r   )r  r   r  r   r   r   Z  r   z4FunctionOfExponentialFunctionAux.<locals>.<listcomp>)rc  r  r   r  r  r)   r   r*  r{  r  re  rz  ru  r   rv  rw  rx  ry  rz  r  r  r  r  r  )r   r   r  r   r  r   r  ?  s0    H6.





,r  c                    s   t |  rdS |  kst| r"dS t| rXt | j rt| j rdat| j| j S n*t| rt| j	d  rtt
| j	d  S t| rt | j rt| jrt| jt| j  ot| jt| j  S t fdd| j	D S )NTFr   c                 3   s   | ]}t | V  qd S r   )r}  r   r  r   r   r   o  r   z,FunctionOfExponentialTest.<locals>.<genexpr>)r   r  r  r  r  r)   r|  FunctionOfExponentialTestAuxru  r   r   r  r}  r  r  r   rZ  r   r  r   r}  \  s    
,r}  c              	   C   s"  t d u r| a |adS tt| t||d tt tt|d  }tt|rPdS ttt|dst|tt| t||d tt tt|d   rt	| t r| t k r| a |ad| }tt|d| t
| a|dk rttt|drt adS tt
| a|dk rttt|drt adS )NTr   Fr   )rz  r{  r  re  r*  r   r  r   r   r   r-  r   )r  Zexponr   r  r   r   r   r  q  s(    ,Dr  c                    sP   t | }t| |   fdd| D }dd |D }t|}|| }t|}|S )z8Calculates the standard deviation for a list of numbers.c                    s   g | ]}|  qS r   r   )r   r   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   sumr<   )r  Z	num_itemsZdifferencesZsq_differencesZssdZvarianceZsdr   r  r   stdev  s    r  c                    s*  ddl m} | tttttts(t	|}| |kr4dS t
| t
|krHdS || ||kr\dS | trtt| dd} t
| t
t|ddkrdS | | }|r|j}	g }
zftddD ]<}tdd  fdd	|	D }|
tt||  qt|
td
dk rW dS W n   Y n0 ||}|r|j}	g }
zhtddD ]>}tdd  fdd	|	D }|
tt||  qDt|
td
dk rW dS W n   Y n0 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forcerh  r   (   c                    s   i | ]
}| qS r   r   r   r  Zrand_xr   r   
<dictcomp>  r   zrubi_test.<locals>.<dictcomp>
   c                    s   i | ]
}| qS r   r   r  r  r   r   r    r   F)sympy.simplify.simplifyr   r   rH   rI   rG   r7   r6   r5   process_trigr}   r^  r   rz   r  rK  r   r  r  absr   r  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  sh    




 

r  c                 C   s   | r|S |S r   r   )Zcondr  r   r   r   r   r*    s    r*  c                 C   s   t |pt|ptd| d| pt|d| pt||tdd  ot|d |d  || | |  |d |d   d|  | |d   pt|d |d  || | |  d|d  |d   d|  | |d   S )Nr  rU  r   rT  	   )r   r   r   r   r   )r   r   r0  r  r  r  r  r   r   r   r   IntQuadraticQ  s    r  c               
   G   s$  t | dkr| \}}}}}}}}t||pt|pt|pt|d sRt|d rnt|d| ptd| |pt|d otd| d| ptd| |rt|| d| |  pt|d| otd| | ||  S t | dkr~| \}}}}}	}}td| p|t|	d | | p|t|d s8t|d rLtd|	 d| p|t|d o|td| o|t|	p|t|	| S t | dkr | \
}}}}}
}	}}}}t||pt|pt|pt|d rt|	rtd| d| pt|d ot|	|d| pt|	d| |S d S )	N   r  rU  rT     r   rV  r  )r   r   r   r   r   )r   r   r   r0  r  r  r  r  r   r  r  r   r   r   IntBinomialQ  s    r  c               
   G   s  t | dkr"| \}}}}}t|}t|}t|sTt|rtdd |jD rt|s|t|rtdd |jD r|t }|t }	t|	rt|| | | |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|rt|| | | |S t
ttt|rx|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|rTtdd |jD rT|t }t|rt|| | |S t|d rt
ttt|rt| 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|rpt|| | |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 rxt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 )Nrh  c                 s   s   | ]}t |V  qd S r   r   r   r   r   r   r     r   z!RectifyTangent.<locals>.<genexpr>r  rU  r   c                 s   s   | ]}t |V  qd S r   r  r   r   r   r   r     r   )r   r  r   r  r   r   r   r   RectifyTangentr  r  r-  r  re  r  r   rp  ro  SimplifyAntiderivativer8  r  rE   rD   r   r;  r  r  r   r   r   r   r   r  r   rK  rL  r0  r  r  r  ZnumrZdenrr   r   r   r    sf    P
*
$\
@Dr  c               
   G   sl  t | dkr&| \}}}}}t|}t|}t|sTt|rtdd |jD rt|s|t|rtdd |jD r|t }|t }	t|	rt|| | | |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|rt|| | | |S t
ttt|rz| 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|sdt|r^tdd |jD r^|t }t|rt|| | |S t|d rt
ttt|rt | 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|rzt|| | |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 )Nrh  c                 s   s   | ]}t |V  qd S r   r  r   r   r   r   r   3  r   z#RectifyCotangent.<locals>.<genexpr>r  rU  r   c                 s   s   | ]}t |V  qd S r   r  r   r   r   r   r   F  r   )r   r  r   r  r   r   r   r   r  r  r  r-  r  re  r  r   rp  ro  RectifyCotangentr  r8  r  rD   rE   r   r;  r  r  r  r   r   r   r  -  s\    P
*
&^
Br  c                  G   s\   | dd d }| dd d }g }t dt|D ]$}||| || ||d   q.t|S r`  )rK  r   r  r   )r   r   r  r  r   r   r   r   
Inequality_  s    "r  c                 C   s   |r| S t dd S )NzIn Condition())rM  )r  r0  r   r   r   	Conditiong  s    r  c                 C   s   t | } tt| |S r   )r   r  SimpHelprZ  r   r   r   r  n  s    r  c                    sf  t | r| S t|  r6t| }t|t| kr2|S | S t| rt|  }t|  }t|tt| d    d  }t|rt	 fdd|j
D  }n
t| }t|}t||}t|rt	 fdd|j
D  S |S t| rLt}td gd}td dgd}td	 ddgd}|||  |   }| |}	d
}
|	r^t|	| d tdd r^d}
|
rh| 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|| }n|| }qt|}t|r:t fdd|j
D  }n
t| }|| S | j fdd| j
D  S )Nr  c                    s   g | ]}t | qS r   r  r   r  r   r   r     r   zSimpHelp.<locals>.<listcomp>c                    s   g | ]}t | qS r   )SimpFixFactorr   r  r   r   r     r   r   r  r   r   r  FrT  r      Tc                    s   g | ]}t | qS r   r  r   r  r   r   r     r   c                    s   g | ]}t | qS r   r  r   r  r   r   r     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  ZPir  r  r  r  r  r  r   r   r  r   r  r  s`    


$



.



r  c                 C   sj   t |rV| t|r$t|t|gS t| t|}t|r>dS |d t||d  gS | |rf|dgS dS r  )r  r  r  rb  rc  r  r   r  r   r   r   rb    s    rb  c                 C   s   t |rbtt| t|r0| t|t|gS t| t|}t|rJdS |d t||d  gS tt| |r~| |dgS dS r  )r  r   rc  r  r  rd  r  r   r   r   rd    s    rd  c                  G   s  t | dkr.| \}}}}t|t||| |S | \}}}t|rLt|||S ttt||dr|tt||||t|| S t	|rt
||td|d  |jd |S t|rt
|td|d  ||jd |S t|rt
||td|d   dtd|d   |jd |S t|rPt
|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|rPt||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|||S d S )NrU  r   r  r   r,  )r   r  SubstForrc  r  r   r  r  r  ri  r  r#  r   rj  rk  rl  rm  rn  rv  r  rw  rx  ry  rz  r{  SubstForAux)r   r  r  r   r   r   r   r   r    sB    
""
6
6
*
*
"
"
6
6
*
*r  c                    sF  |  krS t | rLt rHt jrHt|  j rHtd j  S | S t| rt| jrt| j  rx| j S t rt jrt| j j rt| j j  S t| j | j S ndt| rt	t
t| drt| tt|   S t| r*t r*tt| t S | j fdd| jD  S )Nr   c                    s   g | ]}t | qS r   )r  r   r  r   r   r     r   zSubstForAux.<locals>.<listcomp>)rc  r  r   r)   r   r  r   r  r  r   r  r  r  r  r  r   r  r   r  r   r    s(    
 r  c                 C   s   t | S r   )rO   r  r   r   r   FresnelS
  s    r  c                 C   s   t | S r   )rN   r  r   r   r   FresnelC  s    r  c                 C   s   t | S r   )rM   r  r   r   r   Erf  s    r  c                 C   s   t | S r   )rP   r  r   r   r   Erfc  s    r  c                 C   s   t | S r   )rQ   r  r   r   r   Erfi  s    r  c                   @   s   e Zd Zedd ZdS )Gammac                 G   sJ   |d }t |dkrt|S |d }t|r4t|s<|dkrFt||S d S r]  )r   rZ   r'  r]   )r   r   r   r   r   r   r   r     s    z
Gamma.evalNr   r   r   r   r   r   r   r   r   r    s   r  c                 C   s4   t | d |r,t| |r,tt | d ||r,dS dS d S r  )r7  r8  r  rZ  r   r   r   FunctionOfTrigOfLinearQ$  s    (r  c                 C   s^   t | rdS t| s<t| s<t| s<t| s<t| s<t| rZ| jD ]}t|sB dS qBdS dS r  )	rc  r  r  r  rh  ru  r  r   r  )r   r   r   r   r   r  ,  s    0
r  c                 C   s   | t |  S r   )r   r   r   r   r   Complex9  s    r  c                 C   s   | |kS r   r   r   r   r   r   r&  <  s    r&  c                  C   s.  t  } tttttttdtt	dtdtttdt
t	dtdt	dtdttdd }t|dd }| | tttttttdt
t	dtdtttdtt	dtdtttdtt	d	tdt	dtdttd
d }t|dd }| | tttttt	dtdttttt	dtdttt	dtdt	dtdttdd tdd tdd tdd tdd tdd tdd }t|dd }| | ttttt	dtdtt	dtdtttttt	dtdt	dtdttdd tdd tdd tdd tdd tdd tdd }t|dd }| | tttttt	dtdttt	dtdtt	dtdttt	dtdttt	dtdt	dtdttdd td d td!d td"d td#d td$d td%d }	t|	d&d }
| |
 tttttt	dtdttt	dtdtt	dtdttt	dtdttt	dtdt	dtdttd'd td(d td)d td*d td+d td,d td-d }t|d.d }| | | S )/Nr   r   r   r   r  c                 S   s   t | S r   r   r  r   r   r   r\  C  r   z _SimpFixFactor.<locals>.<lambda>c              	   S   s.   t tt|tttt ||t | |||S r   r   r   r   r  r   )r   r0  r   r   r  r  r   r   r   r\  D  r   r0  c                 S   s   t | S r   r   r  r   r   r   r\  G  r   c              
   S   s6   t tt|tttt ||t | |t ||||S r   r  )r   r0  r   r   r   r  r  r  r   r   r   r\  H  r   r  c                 S   s
   t | |S r   rY  r   r   r   r   r   r\  K  r   c                 S   s
   t | |S r   rY  r   r   r   r   r   r\  K  r   c                 S   s
   t | |S r   rY  r0  r   r   r   r   r\  K  r   c                 S   s
   t | |S r   r   r  r  r   r   r   r\  K  r   c                 S   s   t | S r   rc  r0  r   r   r   r\  K  r   c                 S   s   t | S r   rp  r  r   r   r   r\  K  r   c                 S   s   t | tdS r   rP  r   r  r   r   r   r\  K  r   c                 S   sJ   t t|t ||ttt|t t | tt||tdt||||S r,  r   r   r  r   r   r   r0  r  r  r   r   r  r   r   r   r\  L  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  O  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  O  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  O  r   c                 S   s
   t | |S r   r  r  r   r   r   r\  O  r   c                 S   s   t | S r   r  r  r   r   r   r\  O  r   c                 S   s   t | S r   rp  r  r   r   r   r\  O  r   c                 S   s   t | tdS r   r  r  r   r   r   r\  O  r   c                 S   sJ   t t|t ||tttt |tt||tdt | t||||S r,  r  r  r   r   r   r\  P  r   r  r  c                 S   s
   t | |S r   rY  r  r   r   r   r\  S  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  S  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  S  r   c                 S   s
   t | |S r   r  r  r   r   r   r\  S  r   c                 S   s
   t || S r   rp  r  r  r   r   r   r\  S  r   c                 S   s   t tdt|t| S r   r  r   rP  rO  r  r   r   r   r\  S  r   c                 S   s   t t|t|| tdS r,  r&  r   r   r   )r  r0  r  r   r   r   r\  S  r   c                 S   sL   t t|t ||ttt|t | t|t|t td|t||||S r,  r  r   r0  r  r  r   r   r  r  r   r   r   r\  T  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  W  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  W  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\  W  r   c                 S   s
   t | |S r   r  r  r   r   r   r\  W  r   c                 S   s
   t || S r   rp  r  r   r   r   r\  W  r   c                 S   s   t td|| S r   r  )r  r  r   r   r   r\  W  r   c                 S   s   t t|t|| tdS r,  r  )r  r0  r  r   r   r   r\  W  r   c                 S   sP   t t|t ||tttt |t|t|t td|t | t||||S r,  r  r  r   r   r   r\  X  r   )r   r   r   r   r   r   r  r   r  r   r  r/  r   r   addr  r  r"  replacerr6  r7  r8  r9  r^  rule3r_  rule4pattern5rule5pattern6rule6r   r   r   _SimpFixFactor?  s(    b
~




r  c                 C   s"   t t| |}t|tr| S |S r   )SimpFixFactor_replacerr   r   r   r   r   r  r   r   r   r  ]  s    
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   s   t | S r   )r  r$  r   r   r   r%  g  s    z_FixSimplify.<locals>.cons_f1c                 S   s   t | S r   rp  r  r   r   r   r'  k  s    z_FixSimplify.<locals>.cons_f2c                 S   s   t | S r   r#  r$  r   r   r   cons_f3o  s    z_FixSimplify.<locals>.cons_f3c                 S   s   t | S r   r  r   r   r   r   cons_f4s  s    z_FixSimplify.<locals>.cons_f4c                 S   s   t | S r   r  r  r   r   r   cons_f5w  s    z_FixSimplify.<locals>.cons_f5c                 S   s   t | S r   r   r   r   r   r   cons_f6{  s    z_FixSimplify.<locals>.cons_f6c                 S   s   t | S r   r  r  r   r   r   cons_f7  s    z_FixSimplify.<locals>.cons_f7c                 S   s   t td|  S r  )r  r   r  r   r   r   cons_f8  s    z_FixSimplify.<locals>.cons_f8c                 S   s   t | S r   r   r  r   r   r   cons_f9  s    z_FixSimplify.<locals>.cons_f9c                 S   s   t | S r   )r   r   r   r   r   cons_f10  s    z_FixSimplify.<locals>.cons_f10c                 S   s   t |||| S r   rp  )r  r  r   r   r   r   r   cons_f11  s    z_FixSimplify.<locals>.cons_f11c                 S   s   t | tdS r   rQ  r   r   r   r   r   cons_f12  s    z_FixSimplify.<locals>.cons_f12c                 S   s   t | tdS r   r  r   r   r   r   cons_f13  s    z_FixSimplify.<locals>.cons_f13c                 S   s   t | S r   r   r  r   r   r   cons_f14  s    z_FixSimplify.<locals>.cons_f14c                 S   s   t | S r   r   r  r   r   r   cons_f15  s    z_FixSimplify.<locals>.cons_f15c                 S   s   t | |  tdS r   r  r  r  r   r   r   cons_f16  s    z_FixSimplify.<locals>.cons_f16c                 S   s   t | | tdS r   rm  r   r   r   r   r   cons_f17  s    z_FixSimplify.<locals>.cons_f17c                 S   s   t t| S r   r   r   r$  r   r   r   cons_f18  s    z_FixSimplify.<locals>.cons_f18c                 S   s   t | | ||   S r   r   )r0  r   r   r  r   r   r   cons_f19  s    z_FixSimplify.<locals>.cons_f19c                 S   s   t t| S r   r   r  r   r   r   r   cons_f20  s    z_FixSimplify.<locals>.cons_f20c                 S   s   t | S r   r   )r  r   r   r   cons_f21  s    z_FixSimplify.<locals>.cons_f21c                 S   s
   t || S r   rp  r  r  r   r   r   cons_f22  s    z_FixSimplify.<locals>.cons_f22c                 S   s   t tdt|t| S r   r  r  r   r   r   cons_f23  s    z_FixSimplify.<locals>.cons_f23c                 S   s   t ||| S r   rp  r  r  r  r   r   r   cons_f24  s    z_FixSimplify.<locals>.cons_f24c                 S   s   t tdt|t|t| S r   r  r  r   r   r   cons_f25  s    z_FixSimplify.<locals>.cons_f25c              
   S   s   t tdt|t|t| t|	S r   r  )r  r  r  r  r   r   r   cons_f26  s    z_FixSimplify.<locals>.cons_f26c                 S   s   t t| S r   r  r  r   r   r   cons_f27  s    z_FixSimplify.<locals>.cons_f27c                 S   s   t | tdS r   r  r$  r   r   r   cons_f28  s    z_FixSimplify.<locals>.cons_f28c                 S   s   t |||    S r   r   )r  r  r  r   r   r   cons_f29  s    z_FixSimplify.<locals>.cons_f29c                 S   s   t | S r   r   r$  r   r   r   cons_f30  s    z_FixSimplify.<locals>.cons_f30c                 S   s   t ||  S r   r   r  r  r   r   r   cons_f31  s    z_FixSimplify.<locals>.cons_f31c                 S   s   t ||  S r   r   r  r   r   r   cons_f32  s    z_FixSimplify.<locals>.cons_f32c                 S   s   t ||  S r   r   r  r   r   r   cons_f33  s    z_FixSimplify.<locals>.cons_f33c                 S   s   t |||  S r   r  r  r   r   r   cons_f34  s    z_FixSimplify.<locals>.cons_f34c                 S   s   t | S r   r  r   r   r   r   cons_f35  s    z_FixSimplify.<locals>.cons_f35c                 S   s   t | S r   r  r  r   r   r   cons_f36  s    z_FixSimplify.<locals>.cons_f36r   r  r   r  r   c                 S   sN   t d| t d t dd   | | t|| |tt dt d  |   S )Nr,  r  r   r   )r   r  r  )r  r   r  r  r   r   r   r   r   replacement1  s    z"_FixSimplify.<locals>.replacement1c                 S   s>   || t | |  ||t | |   }tt|t|r:dS dS r  r  rf   r  r  r  r  r   r  r  r   r   r   r   r3    s    $z_FixSimplify.<locals>.With2r  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  rp  	r  r  r  r   r  r  r   r   r0  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 r,  r  r   )r  r  r  r   r  r  r   r   r   r   r   replacement7.  s    z"_FixSimplify.<locals>.replacement7c                    s   || }t | rdS dS r  rY  r  r  r  r  r0  r   r   r  Plusr   r   With81  s    
z_FixSimplify.<locals>.With8c                 S   s(   || }t ||  | || | |   S r   r  r
  r   r   r   replacement87  s    z"_FixSimplify.<locals>.replacement8r  c                 S   s.   t || |  | ||  |  | | |  S r   r  )r  r  r   r  r  r   r  r   r   r   replacement9<  s    z"_FixSimplify.<locals>.replacement9r   c	           	      S   s@   t |||  | || |  | || |   |  | |  S r   r  )	r  r  r  r   r  r  r   r   r  r   r   r   replacement10@  s    z#_FixSimplify.<locals>.replacement10r  r  c                 S   sR   t |||
  | || |  | || |   |  || |  |	  | |
  S r   r  )r  r  r  r   r  r  r  r   r   r  r  r   r   r   replacement11D  s    z#_FixSimplify.<locals>.replacement11r   r0  r  r   c                 S   s(   t ||t|t || | |     S r   r  r<   )r  r   r  r  r0  r   r   r   r   r   replacement12H  s    z#_FixSimplify.<locals>.replacement12c                 S   s$   t || t|t || |    S r   r  )r   r  r  r0  r   r   r   r   r   replacement13L  s    z#_FixSimplify.<locals>.replacement13c                 S   s    t || t|t ||    S r   r  )r   r  r  r   r   r   r   r   replacement14P  s    z#_FixSimplify.<locals>.replacement14c                 S   s   t ||| td    S r,  r  r  r  r   r  r  r   r   r   replacement15T  s    z#_FixSimplify.<locals>.replacement15c                 S   s    t d| t||| |    S r,  r   r  r  r   r   r   replacement16X  s    z#_FixSimplify.<locals>.replacement16c                 S   s.   t d||   t|||   |||      S r,  r  r  r  r  r   r  r  r   r   r   replacement17\  s    z#_FixSimplify.<locals>.replacement17c                 S   s2   t d|||    t|||   |||      S r,  r  r  r   r   r   replacement18`  s    z#_FixSimplify.<locals>.replacement18c                 S   s    ||t d |t d  |   S re  r   )r  r   r   r   r   r   r   replacement19d  s    z#_FixSimplify.<locals>.replacement19i     i  c                 S   s4   |t ttd  tt t  tttd   |   S re  r   r  r   r   r  r0  r  r   r   r   r   replacement20h  s    z#_FixSimplify.<locals>.replacement20ic                 S   s4   |t ttd  tt t  tttd   |   S re  r  r   r   r   r   replacement21l  s    z#_FixSimplify.<locals>.replacement21c                 S   s   | S r   r   r   r   r   r   replacement22p  s    z#_FixSimplify.<locals>.replacement22)r   r   r   r   r  r  r   r  r   r  r   r  r  r  r  r  r  r<   r0  r  )r%  r4  r'  r5  r  cons3r  cons4r  cons5r  cons6r  cons7r  cons8r  cons9r  cons10r  cons11r  cons12r  cons13r  cons14r  cons15r  cons16r  cons17r  cons18r  cons19r  cons20r  cons21r  cons22r  cons23r  cons24r  cons25r  cons26r  cons27r  cons28r  cons29r  cons30r  cons31r  cons32r  cons33r  cons34r  cons35r  cons36r6  r  r7  r3  r8  r  r9  r  r^  r  r  r   r_  r  r  r  r  r  r  r  r  r  r  pattern7r	  rule7r  pattern8r  rule8pattern9r  rule9	pattern10r  rule10	pattern11r  rule11	pattern12r  rule12	pattern13r  rule13	pattern14r  rule14	pattern15r  rule15	pattern16r  rule16	pattern17r  rule17	pattern18r  rule18	pattern19r  rule19	pattern20r!  rule20	pattern21r"  rule21	pattern22r#  rule22r   r  r   _FixSimplifyd  s$   T
B
B
B
B
T
h
D
l


|
f
P
0
8
H
H
H
L
J

rf  c                 C   s,   t | tttfrdd | D S tt| tS )Nc                 S   s   g | ]}t t|tqS r   )r   r   FixSimplify_rulesr   r   r   r   r   x  r   zFixSimplify.<locals>.<listcomp>)r   r   r  r`   r   r   rg  r   r   r   r   r  u  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   r  r  r  r  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   z,_SimplifyAntiderivativeSum.<locals>.<lambda>c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r   r\    r   c                 S   s   t | S r   r   r$  r   r   r   r\    r   c                 S   s   t tt||ttd| S r  r   r   r   r   r  r  r  r   r   r   r\    r   c                 S   sF   t t||t|ttt t|tt|| t|tt|| |S r   r   SimplifyAntiderivativeSumr   re  r  r   rp  ro  )r  r   r  r   r  r  r   r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rh  r   r   r   r\    r   c                 S   s
   t | |S r   rY  ri  r   r   r   r\    r   c                 S   s   t | S r   r   r$  r   r   r   r\    r   c                 S   s   t tt||ttd| S r  rj  rk  r   r   r   r\    r   c                 S   sF   t t||t|ttt t|tt|| t|tt|| |S r   )r   rm  r   re  r  r   ro  rp  )r  r   r  r   r  r  r   r   r   r   r   r\    r   r  c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  rh  r   r   r   r\    r   c                 S   s
   t | |S r   rY  ri  r   r   r   r\    r   c                 S   s   t | S r   r   r$  r   r   r   r\    r   c                 S   s   t t|| S r   r   r   r  r  r   r   r   r\    r   c
           
      S   s~   t t||t|ttt t|	tt|| t|tt|| |t|ttt t|tt|| t|tt|| |S r   rl  )
r  r   r  r   r  r  r   r0  r  r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rn  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rh  r   r   r   r\    r   c                 S   s
   t | |S r   rY  ri  r   r   r   r\    r   c                 S   s   t | S r   r   r$  r   r   r   r\    r   c                 S   s   t t|| S r   ro  rp  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   rl  )
r  r   r  r   r  r  r0  r   r  r   r   r   r   r\    r   r   r  c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rn  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r   r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  rh  r   r   r   r\    r   c                 S   s
   t | |S r   rY  ri  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r   r\    r   c                 S   s   t | S r   r   r$  r   r   r   r\    r   c                 S   s   t t|| |S r   ro  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   rl  )r  r  r   r  r   r  r  r   r0  r   r  r   r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rn  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rq  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rr  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rh  r   r   r   r\    r   c                 S   s
   t | |S r   rY  ri  r   r   r   r\    r   c                 S   s
   t | |S r   rY  rs  r   r   r   r\    r   c                 S   s   t | S r   r   r$  r   r   r   r\    r   c                 S   s   t t|| |S r   ro  rt  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   rl  )r  r  r   r  r   r  r  r0  r   r   r  r   r  r   r   r   r\    r   )r   r   r   r   r   re  r  r   r   r   rq  r  rp  r/  r   r   r  rr  ro  r  r  r  r   r   r   _SimplifyAntiderivativeSum{  s,    



 K
 K
ru  c                 C   s"   t t| |}t|tr| S |S r   )"SimplifyAntiderivativeSum_replacerr   r   r   r  r   r   r   rm    s    
rm  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   s
   t | |S r   rY  r  r   r   r   r\    r   z)_SimplifyAntiderivative.<locals>.<lambda>c                 S   s   t t|| S r   )r  re  )r   r0  r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r   r\    r   c                 S   s   t |tt|| S r   )r   r  re  )r   r  r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  rr  r   r   r   r\    r   c                 S   s   t t|t|| S r   )r   re  r  )r   r   r   r   r   r   r\    r   r   r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  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  re  rp  r   r   r   r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  rx  ry  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  re  ro  rz  r   r   r   r\    r   r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r   r   r   r   r   r   r   r\    r   c                 S   s   t | S r   r  r   r   r   r   r\    r   c                 S   s   t ||td| S r  r  r   r   r   r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r{  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s   t ||td| S r  r}  r~  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s"   t tdttt |t|| S r  )r   r   r  r8  rD  r~  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r{  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s   t |tt|ttdt| S r  r  r   r   r   r~  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r{  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s   t |tt|ttdt| S r  r  r~  r   r   r   r\    r   c                 S   s
   t || S r   r  r   r   r   r   r   r\    r   c                 S   s
   t || S r   r  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r{  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s   t ||td| S r  r  r   r~  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r{  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s   t ||td| S r  r  r~  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t | S 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  r8  rD  r   r~  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r{  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s   t |tt|t| S r   r  r   r   r~  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t t| tdS re  r{  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s   t |tt|t| S r   r  r~  r   r   r   r\    r   c                 S   s
   t || S r   r  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s"   t ttt|t|td| S r  )r  r;  r   rD  r   r   r~  r   r   r   r\    r   c                 S   s
   t || S r   r  r  r   r   r   r\    r   r0  c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  r   r   r   r   r0  r   r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  r  r0  r   r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s    t |t||t||td| S r  )r  r   r   r   r   r   r   r0  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  r  r  r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  r  r  r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s*   t |tt||tt||ttdt| S r  r  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  r  r  r   r   r   r\    r   c                 S   s"   t tt|tdt| tdS re  r  r  r   r   r   r\    r   c                 S   s   t | S r   r|  r   r   r   r   r\    r   c                 S   s    t |t||t||td| S r  )r  r   r   r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\     r   c                 S   s
   t | |S r   rY  r  r   r   r   r\     r   c                 S   s
   t | |S r   rY  r  r   r   r   r\     r   c                 S   s"   t tt|tdt| tdS re  r  r  r   r   r   r\     r   c                 S   s"   t tt|tdt| tdS re  r  r  r   r   r   r\     r   c                 S   s   t | S r   r|  r   r   r   r   r\     r   c                 S   s*   t |tt||tt||ttdt| S r  )r  r   r   r   r  r   r   r   r\    r   r   r  c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t | S 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  )r*  r  r-  r  r  r8  r  r   r   r   rp  ro  r   r  r   r   r   r\    r   r  r  r   rw  c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t | S 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 re  r  r8  r   r   r   r   rq  )	r   r  r   r  r   r   r   r0  rw  r   r   r   r\  	  r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t | S 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  )r*  r  r-  r  r  r8  r  r   r   r   rp  r   )r   r0  r   r   r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s
   t | |S r   rY  r  r   r   r   r\    r   c                 S   s   t | S 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 re  r  )r   r   r   r   r0  rw  r   r   r   r\    r   )r   r   r   re  r   r  r  r/  r   r   r  r   r  r  r   r  r   r   rq  rr  r8  r9  rD  r;  r:  rH  )9r  r8  r9  r^  r  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  	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| rtdtd } | jD ] }t|rT |9  q<||9 }q<t r tdkrt|}t	|rt
|rt fdd|jD  S  | S n@t| r| jd }tttttttgt|rttd|  S ttttgt| rHt| }| jd }tttttttgt|rHt|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 d S )Nr   c                    s   g | ]} | qS r   r   r   r  r   r   r   $  r   z*SimplifyAntiderivative.<locals>.<listcomp>r   c                    s   g | ]}t | qS r   r  r   r  r   r   r   :  r   )SimplifyAntiderivative_replacerr   r   r   r  r   r   r   r  r  r  r   rf  rg  rG   rI   rH   r5   r6   r7   rd  re  r=   r@   r.   r/   r  rm  )r   r   r  r   r   r  r:  r  r   r  r   r    sH    










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   r  r   r  c                 S   s   t | S r   )r	  r  r   r   r   r\  C  r   z"_TrigSimplifyAux.<locals>.<lambda>c                 S   s   t | S r   r   r  r   r   r   r\  C  r   c                 S   s
   t || S r   rp  r  r   r   r   r\  C  r   c                 S   s
   t || S r   )rP  r  r   r   r   r\  C  r   c                 S   sD   t |t|t ||ttt|t |t|t| t td||S r,  )r   r   r  r   r   r  r   r  r  r   r  r   r   r   r   r\  D  r   2r  r   c                 S   s
   t || S r   rm  ry  r   r   r   r\  G  r   c                 S   s
   t ||S r   r   r   r  r   r   r   r   r   r\  H  r   c                 S   s   t |ttd| S r,  rm  r   r   ry  r   r   r   r\  K  r   c                 S   s
   t ||S r   r   r  r   r   r   r\  L  r   c                 S   s   t |ttd| S r,  r  ry  r   r   r   r\  O  r   c                 S   s
   t ||S r   r   r  r   r   r   r\  P  r   c                 S   s6   t ttt|ttd|t t|td||| S )Nr,  r  )r   r   r   r   ro  r  r   r   r  r   r   r   r   r\  T  r   r  c                 S   s   t | ttd|S r,  r  r  r   r   r   r\  W  r   c                 S   s   t t| tt|td|S Nr  )r   r   r   rp  r   r   r  r   r  r   r   r   r\  X  r   c                 S   s   t | ttd|S r,  r  r  r   r   r   r\  [  r   c                 S   s   t t|tt| td|S r  )r   r   r   ro  r   r   r  r  r   r   r   r   r\  \  r   c                 S   s
   t | |S r   r  r  r   r   r   r\  _  r   c                 S   s   t t| tt|td|S r  )r   r   r   rs  r   r  r   r   r   r\  `  r   c                 S   s
   t | |S r   r  r  r   r   r   r\  c  r   c                 S   s   t t|tt| td|S r  )r   r   r   rt  r   r  r   r   r   r\  d  r   c                 S   s   t | ttd|S r,  r  r  r   r   r   r\  g  r   c                 S   s   t t|tt|td|S r  )r   r   r   rq  r   r  r   r   r   r\  h  r   c                 S   s   t | ttd|S r,  r  r  r   r   r   r\  k  r   c                 S   s   t t|tt| td|S r  )r   r   r   rr  r   r  r   r   r   r\  l  r   r,  c              	   S   s,   t tt|tdttdt| tdS Nr  r,  r   r   r   r   r   ry  r   r   r   r\  o  r   c                 S   sB   t | tt tdt|tdt tdt t|t|tdS Nr   r,  )r   r   r   r   rp  r  r   r   r   r\  p  r   c              	   S   s,   t tt|tdttdt| tdS r  r  ry  r   r   r   r\  s  r   c                 S   sB   t | tt tdt|tdt tdt t|t|tdS r  )r   r   r   r   ro  r  r   r   r   r\  t  r   c                 S   s   t | S r   r  r$  r   r   r   r\  w  r   c                 S   s   t | S r   r  r   r   r   r   r\  w  r   c              
   S   s*   t |tt|t |tt|| tdS r,  )r   r   r   rr  r   r  r   r   r   r\  x  r   c                 S   s   t | S r   r  r$  r   r   r   r\  {  r   c                 S   s   t | S r   r  r   r   r   r   r\  {  r   c              
   S   s*   t |tt|t |tt|| tdS r,  )r   r   r   rq  r   r  r   r   r   r\  |  r   c                 S   s   t | S r   r  r$  r   r   r   r\    r   c                 S   s   t | S r   r  r   r   r   r   r\    r   c              
   S   s*   t |tt|t |tt|| tdS r,  )r   r   r   rp  r   r  r   r   r   r\    r   c                 S   s   t | S r   r  r$  r   r   r   r\    r   c                 S   s   t | S r   r  r   r   r   r   r\    r   c              
   S   s*   t |tt|t |tt|| tdS r,  )r   r   r   ro  r   r  r   r   r   r\    r   c                 S   s   t | S r   r  r$  r   r   r   r\    r   c                 S   s   t | S r   r  r   r   r   r   r\    r   c                 S   s:   t |t tt|| tt|t |tt|| tdS r,  )r   r   ro  r   rp  r   r  r   r   r   r\    r   c                 S   s   t | S r   r  r$  r   r   r   r\    r   c                 S   s   t | S r   r  r   r   r   r   r\    r   c                 S   s:   t |t tt|| tt|t |tt|| tdS r,  )r   r   rp  r   ro  r   r  r   r   r   r\    r   r  c                 S   s
   t | |S r   r  r  r   r   r   r\    r   c                 S   s8   t |tt|t | |tt|t |tt|| |S r   )r   r   rs  r   ro  r  r   r  r   r  r   r   r   r   r\    r   c                 S   s
   t | |S r   r  r  r   r   r   r\    r   c                 S   s8   t |tt|t | |tt|t |tt|| |S r   )r   r   rt  r   rp  r  r   r   r   r\    r   c                 S   s
   t | |S r   r  r  r   r   r   r\    r   c                 S   s8   t |tt|t | |tt|t |tt|| |S r   )r   r   rq  r   rp  r  r   r   r   r\    r   c                 S   s
   t | |S r   r  r  r   r   r   r\    r   c                 S   s8   t |tt|t | |tt|t |tt|| |S r   )r   r   rr  r   ro  r  r   r   r   r\    r   r0  c                 S   s   t || |S r   r  r  r  r  r   r   r   r\    r   c                 S   sZ   t |tt|t|t tdt | |tt|t |tt|| t |tt|| |S r,  )r   r   rp  r   r   ro  r  r   r0  r  r  r   r  r   r   r   r   r\    r   c                 S   s   t || |S r   r  r  r   r   r   r\    r   c                 S   sP   t |tt|t|t | |tt|t |tt|| t |tt|| |S r   )r   r   rs  r   ro  rp  r  r   r   r   r\    r   c                 S   s   t || |S r   r  r  r   r   r   r\    r   c                 S   sZ   t |tt|t|t tdt | |tt|t |tt|| t |tt|| |S r,  )r   r   ro  r   r   rp  r  r   r   r   r\    r   c                 S   s   t || |S r   r  r  r   r   r   r\    r   c                 S   sP   t |tt|t|t | |tt|t |tt|| t |tt|| |S r   )r   r   rt  r   rp  ro  r  r   r   r   r\    r   c                 S   s
   t || S r   r  r  r   r   r   r\    r   c                 S   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  r,  )	r*  re   r   r   r   r   r   rp  ro  r  r   r   r   r\    r   c                 S   s
   t || S r   r  r  r   r   r   r\    r   c                 S   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 r  )	r*  re   r   r   r   r   r   ro  rp  r  r   r   r   r\    r   c                 S   s   | S r   r   r   r   r   r   r\    r   )r   r   r   r   r   r   r   r   r  r  r   r   r  rE   r  rD   rI   rF   rH   rG   r  z_r  )=r  r6  r7  r8  r9  r^  r  r_  r  r  r  r  r  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   _TrigSimplifyAux?  s    
d
d
d
`
F
F
F
F
F
F
Z
Z
z
z
z
z
z
z











r  c                 C   s   t t| S r   )TrigSimplifyAux_replacerr   r   r   r   r   r   r    s    r  c                 C   s   t | S r   )r~   r   r   r   r   Cancel  s    r  c                   @   s   e Zd Zdd ZdS )	Util_Partc                 C   s   t | jd }t| jdkr0t| jdd  }n
| jd }t|ttfrxt|tr^||d  S t|rj|S |j|d  S | S d S )Nr   r  r   )r   r   r   r   r   r   r   rc  )r   r   r  r   r   r   r     s    

zUtil_Part.doitNr)  r   r   r   r   r    s   r  c                 C   s,   t | trt|g| R   S t||  S r   )r   r   r  r   )r  r   r   r   r   Part  s    
r  c                 C   s
   t | |S r   )ra   )r  r  r   r   r   r   PolyLog  s    r  c                 C   s2   z|  |W S  ty,   td| | Y S 0 d S )NrV  )r  
ValueErrorr   rr  r   r   r   rV    s    rV  c                 C   s
   t | tS r   )r   rd   r   r   r   r   IntegralFreeQ  s    r  c                    s   t   t |}t d  d  } dkr6|S  dkrBdS t dk rlt  dkrlt  | S t|rt fdd|jD  S t|rt | S | krt|r|t|kr|t|d  d  krt||S t | S d S )Nr  r   r   c                    s   g | ]}t  |qS r   )rg  r   rZ  r   r   r     r   zDist.<locals>.<listcomp>)	r   r  r  rg  r  r   r   r  r   r  r   rZ  r   rg    s     >rg  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   s   | ]}t | V  qd S r   )r?  r   r  r   r   r     r   z&PureFunctionOfCothQ.<locals>.<genexpr>)rc  r  ru  r   r   ry  r   r  r   r  r   r?    s    r?  c                 C   s   t | S r   )rT   r   r   r   r   LogIntegral  s    r  c                 C   s   t | S r   )rR   r   r   r   r   ExpIntegralEi  s    r  c                 C   s   t | | S r   )rS   evalfr   r   r   r   ExpIntegralE	  s    r  c                 C   s   t | S r   )rU   r   r   r   r   SinIntegral  s    r  c                 C   s   t | S r   )rV   r   r   r   r   CosIntegral  s    r  c                 C   s   t | S r   )rW   r   r   r   r   SinhIntegral  s    r  c                 C   s   t | S r   )rX   r   r   r   r   CoshIntegral  s    r  c                   @   s   e Zd Zedd ZdS )	PolyGammac                 G   s*   t |dkrt|d |d S t|d S r  )r   r\   rY   r   r   r   r   r     s    zPolyGamma.evalNr  r   r   r   r   r    s   r  c                 C   s   t | S r   )r[   r   r   r   r   LogGamma  s    r  c                   @   s   e Zd Zedd ZdS )
ProductLogc                 G   s2   t |dkr"t|d |d  S t|d  S r&  )r   r+   r  r   r   r   r   r   #  s    zProductLog.evalNr  r   r   r   r   r  "  s   r  c                 C   s   t | S r   r#   r   r   r   r   	Factorial)  s    r  c                  G   s   t |  S r   )rb   r   r   r   r   Zeta,  s    r  c                 C   s   t | ||S r   r/  )r   r   r0  r   r   r   HypergeometricPFQ/  s    r  c                 C   sP   t | } t|d ttfsB|d |d t|d g}t| | S t| | S )z
    This function perform summation using SymPy's `Sum`.

    Examples
    ========

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

    r  r   r   )r   r   r   r   Floorr   r   )r)   r   new_argsr   r   r   Sum_doit2  s
    r  c              	   C   sj   zt | |} t ||}W n   t | } t |}Y n0 zt| | W S  ttfyd   | |  Y S 0 d S r   )rq   rv   as_exprrj   rl   r  r   r   r   r  F  s    
r  c              	   C   sj   zt | |} t ||}W n   t | } t |}Y n0 zt| | W S  ttfyd   td Y S 0 d S r   )rq   rw   r  rj   rl   r   r  r   r   r   r  S  s    
r  c                 C   s    |d u rt | S |t | |  S r   r3  )r   r   r   r   r   r  `  s    r  c                 C   s   t | S r   r  r   r   r   r   Factore  s    r  c                 C   s   | |iS r   r   r   r   r   r   Ruleh  s    r  c                 G   sT   t |dkr&t| |d r| S |  S t |dkrLt| |d rH|  S | S |  S )Nr   r   r  )r   r   r   )r   r   r   r   r   
Distributek  s    r  c                  G   s    t | } t|  }|dkrdS dS r   )r   ro   )r   rw  r   r   r   CoprimeQx  s
    r  c                 C   s2   zt | |W S  ty,   td| | Y S 0 d S )NDiscriminant)rm   rk   r   r   r   r   r   r    s    r  c                 C   s   | t dk S r   r   r  r   r   r   Negative  s    r  c                 C   s   t | | S r   )r  r  r  r   r   r   Quotient  s    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   s
   t | tS r   )r   rG   r  r   r   r   r\    r   zprocess_trig.<locals>.<lambda>c                 S   s   dt | jd  S r  )rF   r   r  r   r   r   r\    r   c                 S   s
   t | tS r   )r   rI   r  r   r   r   r\    r   c                 S   s   dt | jd  S r  )rE   r   r  r   r   r   r\    r   c                 S   s
   t | tS r   )r   rH   r  r   r   r   r\    r   c                 S   s   dt | jd  S r  )rD   r   r  r   r   r   r\    r   c                 S   s
   t | tS r   )r   r5   r  r   r   r   r\    r   c                 S   s   dt | jd  S r  )r4   r   r  r   r   r   r\    r   c                 S   s
   t | tS r   )r   r6   r  r   r   r   r\    r   c                 S   s   dt | jd  S r  )r2   r   r  r   r   r   r\    r   c                 S   s
   t | tS r   )r   r7   r  r   r   r   r\    r   c                 S   s   dt | jd  S r  )r3   r   r  r   r   r   r\    r   )r   r   r   r   r   r    s    r  c                      sh  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	||ƃ}|h|k|n|r|v|y|||||||||||||||||||||||||||g S )Nc                 S   s   t | S r   r  r  r   r   r   r%    s    z!_ExpandIntegrand.<locals>.cons_f1c                 S   s   t | |  ||  S r   r   )r  r0  r   r   r   r   r   r'    s    z!_ExpandIntegrand.<locals>.cons_f2c                 S   s
   t | |S r   rY  r  r   r   r   r    s    z!_ExpandIntegrand.<locals>.cons_f3c                 S   s
   t | |S r   rY  r  r   r   r   r    s    z!_ExpandIntegrand.<locals>.cons_f4c                 S   s
   t | |S r   rY  r  r   r   r   r    s    z!_ExpandIntegrand.<locals>.cons_f5c                 S   s
   t | |S r   rY  rn  r   r   r   r    s    z!_ExpandIntegrand.<locals>.cons_f6c                 S   s
   t | |S r   rY  rq  r   r   r   r    s    z!_ExpandIntegrand.<locals>.cons_f7c                 S   s
   t | |S r   rY  rr  r   r   r   r    s    z!_ExpandIntegrand.<locals>.cons_f8c                 S   s
   t | |S r   rY  )rw  r   r   r   r   r    s    z!_ExpandIntegrand.<locals>.cons_f9c                 S   s
   t | |S r   rY  )r  r   r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f10c
           
      S   s,   t |tsdS tt||||| ||	||	|S r   r   r   r   r   
r  r   r0  r   r  r  r:  r   r  r  r   r   r   r    s    
z"_ExpandIntegrand.<locals>.cons_f11c                 S   s
   t | |S r   rY  )r:  r   r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f12c                 S   s
   t | |S r   rY  )r  r   r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f13c                 S   s
   t | |S r   rY  rw  r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f14c                 S   s
   t | |S r   rY  )r  r   r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f15c                 S   s.   t |tsdS tt|||||	| ||
||
|S r   r  r  r   r0  r   r  r   r  r:  r   r  r  r   r   r   r    s    
z"_ExpandIntegrand.<locals>.cons_f16c                 S   s
   t || S r   r  r  r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f17c                 S   s   t | tdS r   r  r$  r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f18c                 S   s   t | tsdS t|| S r   r   r   r  r  r   r   r   r    s    
z"_ExpandIntegrand.<locals>.cons_f19c                 S   s   t ||| | tdS r  r  )r  r:  r   r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f20c                 S   s
   t | |S r   rY  )r  r   r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f21c                 S   s   t ttttt| S r   )rg  r   r<  r>  r=  r$  )r:  r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f22c                 S   s   t | td|  S re  )r   r   rf  r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f23c                 S   s
   t | |S r   rY  rh  r   r   r   r  
  s    z"_ExpandIntegrand.<locals>.cons_f24c                 S   s
   t | |S r   rY  ri  r   r   r   r    s    z"_ExpandIntegrand.<locals>.cons_f25c                    sx   t |tsdS  fdd}t|}tttttdtd  t	 tdtd t|}t
t|||}ttt |S )NFc                    s"   t tt|| |t|t| S r   )re   r   r   r   rQ  )r  r  r0  r  r   r  r   r   	_cons_f_u  s    z5_ExpandIntegrand.<locals>.cons_f26.<locals>._cons_f_ur  r   r  )r   r   r   r   r   r  r/  r   r   r  r   r   re   r   )r  r   r   r  r0  r1  r2  r   r  r   r    s    
4z"_ExpandIntegrand.<locals>.cons_f26c                 S   st   t |tsdS ttt|| ||t|tt|t||t||t	|t
|dtt||| t| t|| S )NFr,  )r   r   re   r   r   r   r   r   r  r  rP  rR  r  r  )r   r  r  r   r   r   r  r   r   r   r    s
    
20z"_ExpandIntegrand.<locals>.cons_f27c                 S   s^   t |tsdS ttttt||t|tt	|t
||t
| |tt||| t| | S r   )r   r   re   r   r   r   r   r   r   r   r  rR  r  )r  r  r   r   r  r   r   r   r  #  s
    
*"z"_ExpandIntegrand.<locals>.cons_f28c                 S   s   t | td S )NrU  )r   r   r$  r   r   r   r  )  s    z"_ExpandIntegrand.<locals>.cons_f29c                 S   s   t | S r   r   r$  r   r   r   r  -  s    z"_ExpandIntegrand.<locals>.cons_f30c                 S   s   t | tdS r  r  r$  r   r   r   r  1  s    z"_ExpandIntegrand.<locals>.cons_f31c                 S   s   t td|| S r   r  r  r   r   r   r  5  s    z"_ExpandIntegrand.<locals>.cons_f32c                 S   s   t | t||  S r   )r  r  r  r   r   r   r  9  s    z"_ExpandIntegrand.<locals>.cons_f33c                 S   s   t | | S r   )r   r   r   r   r   r  =  s    z"_ExpandIntegrand.<locals>.cons_f34c                 S   s   t || |S r   r  r  r  r  r   r   r   r  A  s    z"_ExpandIntegrand.<locals>.cons_f35c                 S   s   t td||| S r   r  r  r   r   r   r  E  s    z"_ExpandIntegrand.<locals>.cons_f36c                 S   s   t |||| S r   r  )r  r  r  r  r   r   r   cons_f37I  s    z"_ExpandIntegrand.<locals>.cons_f37c                 S   s   t td|||| S r   r  )r  r  r  r  r   r   r   cons_f38M  s    z"_ExpandIntegrand.<locals>.cons_f38c                 S   s   t | td S re  )r   r   r$  r   r   r   cons_f39Q  s    z"_ExpandIntegrand.<locals>.cons_f39c                 S   s   t | S r   )r   r  r   r   r   cons_f40U  s    z"_ExpandIntegrand.<locals>.cons_f40c                 S   s   t || td S re  )r   r   r  r   r   r   cons_f41Y  s    z"_ExpandIntegrand.<locals>.cons_f41c                 S   s   t || td S re  )r  r   r  r   r   r   cons_f42]  s    z"_ExpandIntegrand.<locals>.cons_f42c                 S   s"   t td | |  |td  S NrU  r  )r   r   )r0  r   r   r   r   r   cons_f43a  s    z"_ExpandIntegrand.<locals>.cons_f43c                 S   s   t ||| S r   r  )rd  r  r  r   r   r   cons_f44e  s    z"_ExpandIntegrand.<locals>.cons_f44c                 S   s   t td|td|  S )Nr   r  r  r  r   r   r   cons_f45i  s    z"_ExpandIntegrand.<locals>.cons_f45c                 S   s   t tt|| t|tdS r,  )r   re   r  r   r  r   r   r   cons_f46m  s    z"_ExpandIntegrand.<locals>.cons_f46c                 S   s   t |tsdS t| |S r   r  r  r   r   r   cons_f47q  s    
z"_ExpandIntegrand.<locals>.cons_f47c                 S   s   t |tsdS t| |S r   )r   r   r  r  r   r   r   cons_f48w  s    
z"_ExpandIntegrand.<locals>.cons_f48c                 S   s6   t |tsdS tt||tt| |td ttdS )NFr,  r  )r   r   r  r  r  r   rR  r  r   r   r   r   r   cons_f49}  s    
z"_ExpandIntegrand.<locals>.cons_f49c                 S   s$   t |tsdS tt||t| |S r   )r   r   rR  r  r  r   r   r   cons_f50  s    
z"_ExpandIntegrand.<locals>.cons_f50c                 S   s   t t| S r   r  r  r   r   r   cons_f51  s    z"_ExpandIntegrand.<locals>.cons_f51c                 S   s   || ||  }t d}|| ||	|  |   t||
  ||
  | |||   t|| ||	|  |   |||  | |
   t|||   ||d   | t|d|
 S )Nr   r   )r   r  r  r   )r  r   r0  r   r  r   rw  r  r   r  r  r  r   r   r   r   r3    s    z_ExpandIntegrand.<locals>.With2r  r   r0  r   r  r  r   r   r  r  rw  r   r  c
           
         s   t tt|	|t|	|tt|tdt| | ||   t|||||  |   | ||  |  ||	 | ||t t|t	|||||  |   ||	  | ||  |   t
|||||  |   ||	 | ||  |  |S r  r*  re   r   rO  rf   r  r   r   r  r  r.  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r0t||| ||g|r0t|	|r0|dk s4dS t|| |  |	 |||  |  |}
t|
t||| }
t|
rzdS dS )Nr   FT)r   r   r   r   r.  r  r  r  r   r  r0  r  r   r:  r   r   r  r  r  r   r   r   r    s    0&z_ExpandIntegrand.<locals>.With5r   c
                    sP   t t|| |  |	 |||  |  |t||| }
|
j fdd|
jD  S )Nc                    s   g | ]} | qS r   r   r   r   r   r   r     r   z:_ExpandIntegrand.<locals>.replacement5.<locals>.<listcomp>)r  r.  r  r  r   r  r   r   r   r    s    6z&_ExpandIntegrand.<locals>.replacement5c
              	   S   s\   t |tr.t||||| ||	|g|r.t||s2dS t||||  |	  |}
t|
rXdS dS r   )r   r   r   r  r.  r  r  r   r0  r   r  r   r   r   r  r  r  r   r   r   r    s    .z_ExpandIntegrand.<locals>.With6c
                    s>   t ||||  |	  |}
t|| |||  |   |
  S r   )r.  r  r  r  r   r   r    s    z&_ExpandIntegrand.<locals>.replacement6c
           
      S   s4   t t||| ||   |  ||||  |	  |S r   )r.  re  )
r  r   r0  r  r   r  r   r   r  r  r   r   r   r	    s    z&_ExpandIntegrand.<locals>.replacement7c              	   S   sR   t t|tdt|| |||  |   ||t|| |||  |   ||||S r  )r*  r  r   r.  r  )r  r0  r   r  r   r   r  r   r   r   r    s    z&_ExpandIntegrand.<locals>.replacement8r  c              	   S   s8   t ||t||	| ||  |  |
    | || ||S r   )r  re  )r  r   r0  r   r  r   r  r   r   r  r  r   r   r   r    s    z'_ExpandIntegrand.<locals>.replacement10c              
   S   st   t ||||  | t|||td|       | td  | |td|  |td | td |     |S re  )r.  r<   r   )r   r0  r  r   r   r   r  rd  r   r   r   r    s    z'_ExpandIntegrand.<locals>.replacement12c                 S   s   t || ||r0t|| |  | |||   |S || | |  }td}t|| |  | |  t| ||   ||td   | t|td|t||  ||  ||||    S d S )Nr   r,  r   )r  r  r   r  r  r   r   )r   r0  r   r   r  r  r  r   r   r   r   r    s
    "z'_ExpandIntegrand.<locals>.replacement13r  c           	         s   t || ||||r@t||  ||   |  ||   S || ||  |  t||   | ||   }tt||j fdd|jD  t | }t|| ||   |  | S d S )Nc                    s   g | ]}t  | qS r   r  r   tmp1r   r   r   r     r   z;_ExpandIntegrand.<locals>.replacement14.<locals>.<listcomp>)r  r  r.  r*  r  r  r   r  )	r   r  r  r0  r   r   r  r  tmp2r   r  r   r    s    ."2z'_ExpandIntegrand.<locals>.replacement14c                 S   sp   t || |  | ||| |}t|s(|S t||| |  |  |}t|rhtt|t|td rh|S |S d S re  )r  r   r  r  rO  r  r   )r   r   r   r   r  r  r  r   r   r   With15  s    "z _ExpandIntegrand.<locals>.With15c                 S   sp   t |||  || |  t|   |}t|| |  t| |d  |t|| || |  |  |d  | S r]  )r  r  r.  r  r   r  r  r   r   r   r  r  r   r   r   r    s    (z'_ExpandIntegrand.<locals>.replacement16c                 S   sV   t |||  |}t|| |  | |d  |t|| || |  |  |d  | S r]  )r  r.  r  r   r   r   r    s    z'_ExpandIntegrand.<locals>.replacement17c              	   S   s   t t| |  td}tt| |  td}|td| ||||td      |td| ||||td       S re  )r.  r?  r   r-  )r   r  r   r   r   r  r  r   r   r   With18  s    z _ExpandIntegrand.<locals>.With18c                 S   sh   t d}tt| |  |}tt| |  |}t||| dd| |   | | |   t|d|S )Nr   r,  r  r   r   r.  r?  r-  r  r   )r   r  r   r   r   r   r  r  r   r   r   With19   s    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   r,  r  r  r   )	r   r  r.  r?  r-  r*  r  r  r   
r   r  r   r   r   r  r   rw  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  r,  r   )r   r  r.  r?  r-  r*  r  r   r  r  r   r  r   r   r   With21  s
    
z _ExpandIntegrand.<locals>.With21c                 S   s   t d}tt| |  |}	tt| |  |}
t||	 dd| | |  | |	 |	|
 |   || dd| |   |
 | |	   t|d|S r  r  )r   r0  r  r   r   r   r  r  r   r  r  r   r   r   With22  s    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   r0  r  r   r  r   r   r  r  r   r  r  r   r   r   With23  s    z _ExpandIntegrand.<locals>.With23c                 S   s   t d}tt| | |}tt| | |}t|| dd| |
 |  | | || |
   dd| | |  |  | || |   dd| | |  |	 | || |   || dd| |   | | |   t|d|S r  r  )r  r   r0  r   r  r   r  r   r   r  r  r  r   r  r  r   r   r   With24%  s    z _ExpandIntegrand.<locals>.With24c              
   S   sj   t d}tt| |  | | | | | | | |  |tt|t| |  tdt|||td  S Nr  r  )r   r  r.  r   r  r?  r   )r0  r  r   r  r   r   r  r   r   r   With25,  s    z _ExpandIntegrand.<locals>.With25c              	   S   s~   t d}tt| |  || | ||td   | |  | ||td   | |  |tt|t| |  tdt||S r  r   r  r.  r   r   r  r?  )r0  r  r   r  r   r   r  r  r   r   r   With261  s    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   r0  r  r   r  r   r   rd  r  r   r   r   With276  s    z _ExpandIntegrand.<locals>.With27rd  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   r0  r  r   r  r   r   rd  r  r  r   r   r   With28;  s    z _ExpandIntegrand.<locals>.With28c           	      S   sf   t | |  td}|||   td|  | |||    |||  td|  | |||     S re  )r?  r   )	r   r0  r  r   r   r   r  rd  r  r   r   r   With29@  s    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   r0  r   r  r   rw  r   r   r  rd  r  r  r   r   r   With30E  s    (.z _ExpandIntegrand.<locals>.With30c              	   S   sZ   t ||}td}|t|| |d  |  t||d  t|| t|dt|||   S )Nr   r,  r   )r  r   r  r  r  r   )r  r   r   r  r   r   r   r   With31K  s    
z _ExpandIntegrand.<locals>.With31c                 S   s   t || |S r   )r  r  r   r   r   replacement32R  s    z'_ExpandIntegrand.<locals>.replacement32c                 S   s   t ||  | || S r   )r  )r   r   r   r  r   r   r   replacement33V  s    z'_ExpandIntegrand.<locals>.replacement33c                 S   s   t t| | |||S r   )r.  r  )r  r   r   r  r   r   r   replacement34Z  s    z'_ExpandIntegrand.<locals>.replacement34c                 S   s
   t || S r   )r  r  r   r   r   replacement35^  s    z'_ExpandIntegrand.<locals>.replacement35)r   r   r   r   r   r  r/  r   r   r   r<  r  r  r  r  r  r  re  r<   j_r  r  r  r  )r%  r4  r'  r5  r  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  r  r2  r  r3  r  r4  r  r5  r  r6  r  r7  r  r8  r  r9  r  r:  r  r;  r  r<  r  r=  r  r>  r  r?  r  r@  r  rA  r  rB  r  rC  r  rD  r  rE  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cons51r3  r8  r9  r^  r  r  r_  r  r  r  r  r  r  r  r  r  r  rF  r	  rG  rH  r  rI  rL  r  rM  rP  r  rQ  rR  r  rS  rT  r  rU  r  rV  rW  rX  r  rY  rZ  r  r[  r  r\  r]  r  r^  r_  r  r`  ra  r  rb  rc  r  rd  re  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  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   s
   t || S r   r  ry  r   r   r   r%  d  s    z"_RemoveContentAux.<locals>.cons_f1c                 S   s   t ||  tdS r   )r  r   ry  r   r   r   r'  i  s    z"_RemoveContentAux.<locals>.cons_f2c                 S   s   t | S r   rp  r  r   r   r   r  n  s    z"_RemoveContentAux.<locals>.cons_f3c                 S   s
   t | |S r   rp  r  r   r   r   r  s  s    z"_RemoveContentAux.<locals>.cons_f4c                 S   s   t |  | tdS r   rR  r   r  r   r   r   r  x  s    z"_RemoveContentAux.<locals>.cons_f5c                 S   s
   t | |S r   rY  r  r   r   r   r  }  s    z"_RemoveContentAux.<locals>.cons_f6c                 S   s   t | ||S r   rp  )r  r  r  r   r   r   r    s    z"_RemoveContentAux.<locals>.cons_f7c                 S   s   t |  | tdS r   r  )r  r  r   r   r   r    s    z"_RemoveContentAux.<locals>.cons_f8r   r   r  c                 S   sN   t t|tdt||td  | |  |t|| td   |  | |S r  )r*  rQ  r   r  )r  r   r   r   r  r   r   r   r   r    s    z'_RemoveContentAux.<locals>.replacement1r  r  c                 S   s   t || |   | | |S r   r  )r  r  r   r   r  r   r   r   r   r    s    z'_RemoveContentAux.<locals>.replacement2r  r  c                 S   s.   t || |   | || |  |  | |S r   r  )r  r  r   r  r   r  r  r   r   r   r   r    s    z'_RemoveContentAux.<locals>.replacement3c                 S   s    t tt| tt| |  | S r   )r*  re   r  r   r  rZ  r   r   r   r    s    z'_RemoveContentAux.<locals>.replacement4)r   r   r   r  r  r   r   r  r/  r   r  )r%  r4  r'  r5  r  r$  r  r%  r  r&  r  r'  r  r(  r  r)  r6  r  r7  r8  r  r9  r^  r  r  r_  r  r  r   r   r   _RemoveContentAuxc  s:    8
P
r

r  )N)N)r   )N)N)N)N)N)F)r   )N)N)F)F)N)N)F)FFFF)N)N(  r   Zsympy.externalr   r   Zsympy.concrete.summationsr   Zsympy.core.addr   Zsympy.core.basicr   Zsympy.core.containersr   Zsympy.core.evalfr	   Zsympy.core.exprr
   Zsympy.core.exprtoolsr   Zsympy.core.functionr   r   r   r   Zsympy.core.mulr   Zsympy.core.numbersr   r   r   r   r   r   r   r   Zsympy.core.powerr   Zsympy.core.singletonr   Zsympy.core.symbolr   r   r   r    Zsympy.core.sympifyr!   Zsympy.core.traversalr"   Z(sympy.functions.combinatorial.factorialsr$   Z$sympy.functions.elementary.complexesr%   r&   r'   r(   Z&sympy.functions.elementary.exponentialr)   r^  r*   r   r+   Z%sympy.functions.elementary.hyperbolicr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   Z#sympy.functions.elementary.integersr8   r9   Z(sympy.functions.elementary.miscellaneousr:   r;   r<   Z(sympy.functions.elementary.trigonometricr=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   Z*sympy.functions.special.elliptic_integralsrJ   rK   rL   Z'sympy.functions.special.error_functionsrM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   Z'sympy.functions.special.gamma_functionsrY   rZ   r[   r\   r]   Zsympy.functions.special.hyperr^   r_   r`   Z&sympy.functions.special.zeta_functionsra   rb   Zsympy.integrals.integralsrd   Zsympy.logic.boolalgre   rf   Zsympy.ntheory.factor_rg   rh   Zsympy.polys.partfracri   Zsympy.polys.polyerrorsrj   rk   rl   Zsympy.polys.polytoolsrm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   Zsympy.sets.setsry   Zsympy.simplify.powsimprz   Zsympy.simplify.radsimpr{   r  r|   r}   r~   r   r   Zsympy.utilities.decoratorr   Zsympy.utilities.iterablesr   Zsympy.core.randomr   r   r   r   r   r   r   r   r   r   r   Zsympy.integrals.rubi.symbolr   r   r   r   registerr  r  r  r<  r  r  r  r  r  r  r  r%  Zh_Zi_r  Zk_Zl_r  r  r  r  r"  r$  r  r  r#  r  r/  r  r   r   r0  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  r  r  r#  r$  r%  r*  r-  r1  r   r  r  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rO  rP  rQ  rR  r   rW  ZDeferrX  r[  r  r_  r`  ra  rc  r\  rf  rd  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  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  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r"  r)  r.  r=  r@  rB  rD  rF  rH  rI  rM  r  rO  r  rR  rU  rX  rW  rY  rZ  r[  r]  r`  rc  rN  rP  ri  rj  rm  rn  ro  rr  rt  ru  rx  ry  r{  r|  r}  r~  r  r  r  r  r  r  rA  r  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  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  r4  r5  r/  r7  r8  r9  r:  r@  r;  r<  r=  r>  rB  rA  rF  rC  rI  rJ  rK  rL  rO  rM  rN  rP  rQ  rR  rS  rW  rT  rX  r?  rZ  r[  r\  r]  r^  r_  ra  rY  rc  re  rf  rh  rj  rm  rn  r  ru  rz  r{  r|  r~  r  r  r  r}  r  r  r  r*  r  r  r  r  r  r  r  r  rb  rd  r  r  r  r  r  r  r  r  r  r  r  r&  r  r  rf  r  ru  rm  r  r  r  r  r  r  r  r  rV  r  rg  r?  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ZIntHidere  ZNullr  r;  r  r  rv  rg  r  r   r   r   r   <module>   sh  (8<88
 

&




	































	
	
	
	




















(
Te 	#
"		&
&*+;$ 	

			
"( %	'	$(

1-
	S2$+/$
&5#		?7		L72@&  u(}
   A;




