
    g2                    v   d dl mZ d dlmZ d dlmZ d dlmZ d dl	Z	ddl
m
Z
 ddlmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" d dl#m$Z$  G d d          Z%d Z&d Z' G d dee          Z( ed          Z)d"dZ*d#dZ+d Z,ddl-m.Z. dd l/m0Z0 dd!l1m2Z2m3Z3 dS )$    )Tuple)defaultdict)reduce)productN   )sympify)Basic_args_sortkey)S)AssocOpAssocOpDispatcher)cacheit)integer_nthroottrailing)	fuzzy_not_fuzzy_group)Expr)global_parameters)KindDispatcher	bottom_up)siftc                   "    e Zd ZdZdZdZdZdZdS )	NC_MarkerFN)__name__
__module____qualname__is_Orderis_Mul	is_Numberis_Polyis_commutative     J/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/core/mul.pyr   r      s'        HFIGNNNr$   r   c                 <    |                      t                     d S )Nkey)sortr
   argss    r%   _mulsortr,       s    II-I     r$   c                  r   t          |           } g }g }t          j        }| r|                                 }|j        r\|                                \  }}|                     |           |r-|                    t          	                    |                     n"|j
        r||z  }n|                    |           | t          |           |t          j        ur|                    d|           |r-|                    t          	                    |                     t          	                    |          S )a   Return a well-formed unevaluated Mul: Numbers are collected and
    put in slot 0, any arguments that are Muls will be flattened, and args
    are sorted. Use this when args have changed but you still want to return
    an unevaluated Mul.

    Examples
    ========

    >>> from sympy.core.mul import _unevaluated_Mul as uMul
    >>> from sympy import S, sqrt, Mul
    >>> from sympy.abc import x
    >>> a = uMul(*[S(3.0), x, S(2)])
    >>> a.args[0]
    6.00000000000000
    >>> a.args[1]
    x

    Two unevaluated Muls with the same arguments will
    always compare as equal during testing:

    >>> m = uMul(sqrt(2), sqrt(3))
    >>> m == uMul(sqrt(3), sqrt(2))
    True
    >>> u = Mul(sqrt(3), sqrt(2), evaluate=False)
    >>> m == uMul(u)
    True
    >>> m == Mul(*m.args)
    False

    r   )listr   Onepopr   args_cncextendappendMul
_from_argsr    r,   insert)r+   newargsncargscoacncs          r%   _unevaluated_Mulr=   %   s   > ::DGF	
B
 
HHJJ8 	JJLLEArKKNNN 2cnnR00111[ 	!GBBNN1  
 W	q" /s~~f--...>>'"""r$   c                       e Zd ZU dZdZeedf         ed<   dZeZ	 e
dd          Zed             Zd	 Zd
 Zed             Zd Zed             Zd Zed             Zed             Zeddd            ZdLdZdMdZed             Zd Zed             Ze fd            Zd Z d Z!dNdZ"ed             Z#edOd            Z$ed              Z%ed!             Z&ed"             Z'ed#             Z(ed$             Z)d% Z*d& Z+d' Z,d( Z-d) Z.d* Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5d1 Z6d2 Z7d3 Z8d4 Z9d5 Z:d6 Z;d7 Z<d8 Z=d9 Z>d: Z?d; Z@d< ZAd= ZBd> ZCd? ZDd@ ZEdA ZFdB ZGdPdDZHdQdEZIdF ZJdG ZKdH ZLdRdIZMdOdJZNedK             ZO xZPS )Sr4   aB  
    Expression representing multiplication operation for algebraic field.

    .. deprecated:: 1.7

       Using arguments that aren't subclasses of :class:`~.Expr` in core
       operators (:class:`~.Mul`, :class:`~.Add`, and :class:`~.Pow`) is
       deprecated. See :ref:`non-expr-args-deprecated` for details.

    Every argument of ``Mul()`` must be ``Expr``. Infix operator ``*``
    on most scalar objects in SymPy calls this class.

    Another use of ``Mul()`` is to represent the structure of abstract
    multiplication so that its arguments can be substituted to return
    different class. Refer to examples section for this.

    ``Mul()`` evaluates the argument unless ``evaluate=False`` is passed.
    The evaluation logic includes:

    1. Flattening
        ``Mul(x, Mul(y, z))`` -> ``Mul(x, y, z)``

    2. Identity removing
        ``Mul(x, 1, y)`` -> ``Mul(x, y)``

    3. Exponent collecting by ``.as_base_exp()``
        ``Mul(x, x**2)`` -> ``Pow(x, 3)``

    4. Term sorting
        ``Mul(y, x, 2)`` -> ``Mul(2, x, y)``

    Since multiplication can be vector space operation, arguments may
    have the different :obj:`sympy.core.kind.Kind()`. Kind of the
    resulting object is automatically inferred.

    Examples
    ========

    >>> from sympy import Mul
    >>> from sympy.abc import x, y
    >>> Mul(x, 1)
    x
    >>> Mul(x, x)
    x**2

    If ``evaluate=False`` is passed, result is not evaluated.

    >>> Mul(1, 2, evaluate=False)
    1*2
    >>> Mul(x, x, evaluate=False)
    x*x

    ``Mul()`` also represents the general structure of multiplication
    operation.

    >>> from sympy import MatrixSymbol
    >>> A = MatrixSymbol('A', 2,2)
    >>> expr = Mul(x,y).subs({y:A})
    >>> expr
    x*A
    >>> type(expr)
    <class 'sympy.matrices.expressions.matmul.MatMul'>

    See Also
    ========

    MatMul

    r#   .r+   TMul_kind_dispatcher)commutativec                 8    d | j         D             } | j        | S )Nc              3   $   K   | ]}|j         V  d S N)kind.0r:   s     r%   	<genexpr>zMul.kind.<locals>.<genexpr>   s$      //QV//////r$   )r+   _kind_dispatcher)self	arg_kindss     r%   rD   zMul.kind   s'    //TY///	$t$i00r$   c                 J    | |  k    rdS | j         d         }|j        o|j        S )NFr   )r+   r    is_extended_negative)rI   r;   s     r%   could_extract_minus_signzMul.could_extract_minus_sign   s-    TE??5IaL{5q55r$   c                 L   |                                  \  }}|d         t          j        ur| }|t          j        urN|d         j        r;t          |          }|t          j        u r|d          |d<   n|dxx         |z  cc<   n|f|z   }|                     || j                  S Nr   )	as_coeff_mulr   ComplexInfinityr/   r    r.   NegativeOner5   r"   )rI   r;   r+   s      r%   __neg__zMul.__neg__   s    ##%%47!+++AAE>>Aw  #Dzz%%#AwhDGGGGGqLGGGGtd{tT%8999r$   c                 `  1234 ddl m} ddlm1 d}t	          |          dk    r|\  233j        r	32c2323g}2t          j        usJ 2j        r2j        s3	                                \  }33j
        ro|t          j        ur.2|z  }|t          j        u r3}n | 2|z  3d          }|gg df}n3t          j        r'3j        r t          2fd3j        D              }|gg df}|r|S g }g }	g }
t          j        4g }g }t          j        }i }d}|D ]}|j        r|                    |          \  }}|j        ry|j        r|                    |j                   nV|j        D ]4}|j        r|                    |           |
                    |           5|                    t,                     |j        rs|t          j        u s4t          j        u r|j        rt          j        gg dfc S 4j        st5          4|          r%4|z  44t          j        u rt          j        gg dfc S t5          ||          r|                    4          4C|t          j        u r"4st          j        gg dfc S t          j        4s|t          j        u r|t          j        z  }|j        r|                                \  3}|j        rŉ3j        r|j        r|j         r4tC          3|          z  4|j"        r%|                    tC          3|                     3j"        r||z  }3 33t          j        ur)|#                    3g                               |           U3j$        s|j%        r|                    3|f           ||                    3|f           |t,          ur|
                    |           |
r|
&                    d          }|	s|	                    |           /|	&                                }|                                \  }}|                                \  }}||z   }||k    r@|j
        s9||z  }|j        r|                    |           |
'                    d|           n|	                    ||g           |
Ӑd	 } ||          } ||          }tQ          d          D ]G}g }d}|D ]\  3}|j        r_3j
        s3j        rPtS          3fd
t          j        t          j*        t          j+        fD                       rt          j        gg dfc c S l|t          j        u r3j        r43z  43}|t          j        ur?tC          3|          }|j        r(3j        s!3}|                                \  3}3|k    rd}|                    |           |                    3|f           |r9t	          d |D                       t	          |          k    rg } ||          }H i } |D ].\  3}| #                    |g                               3           /| ,                                D ]\  }3 | 3 | |<   |                    d | ,                                D                        i }!|,                                D ]5\  3}|!#                    t          | g                               3           6~g }"|!,                                D ]\  }3 | 3 3|j-        dk    r4tC          3|          z  4)|j.        |j-        k    rEt_          |j.        |j-                  \  }#}$4tC          3|#          z  4ta          |$|j-                  }|"                    3|f           ~!tc          td                    }%d}|t	          |"          k     r|"|         \  }}&|dk    r|dz  }+g }'tQ          |dz   t	          |"                    D ]}(|"|(         \  })}*|3                    |)          }+|+t          j        ur|&|*z   }|j-        dk    r4tC          |+|          z  4nl|j.        |j-        k    rEt_          |j.        |j-                  \  }#}$4tC          |+|#          z  4ta          |$|j-                  }|'                    |+|f           |)|+z  |*f|"|(<   ||+z  }|t          j        u r n|t          j        urutC          ||&          },|,j        r4|,z  4nXth          5                    |,          D ]=},|,j        r4|,z  4|,j        sJ |,j        \  }}&|%|&                             |           >|"                    |'           |dz  }|t	          |"          k     |%,                                D ]\  }3 | 3 |%|<   |r|6                                \  }}t_          ||          \  }-}|-dz  r4 4|dk    r |                    t          j                   np|rnta          ||          }|%,                                D ]\  }3||k    r3j$        r3 |%|<    n0|                    tC          t          j7        |d                     |                    d |%,                                D                        4t          j*        t          j+        fv r&d }. |.|d          \  }}/ |.|	|/          \  }	}/4|/z  44t          j        u rd |D             }d |	D             }	nW4j        rPtS          1fd|	D                       r4g|	|fS tS          d |D                       rt          j        gg |fS 4gg |fS g }0|D ]$}|j        r4|z  4|0                    |           %|0}tq          |           4t          j        ur|'                    d4           t          j        re|	sct	          |          dk    rP|d         j        rC|d         j9        r6|d         j
        r)|d         4t          4fd|d         j        D              g}||	|fS )a.  Return commutative, noncommutative and order arguments by
        combining related terms.

        Notes
        =====
            * In an expression like ``a*b*c``, Python process this through SymPy
              as ``Mul(Mul(a, b), c)``. This can have undesirable consequences.

              -  Sometimes terms are not combined as one would like:
                 {c.f. https://github.com/sympy/sympy/issues/4596}

                >>> from sympy import Mul, sqrt
                >>> from sympy.abc import x, y, z
                >>> 2*(x + 1) # this is the 2-arg Mul behavior
                2*x + 2
                >>> y*(x + 1)*2
                2*y*(x + 1)
                >>> 2*(x + 1)*y # 2-arg result will be obtained first
                y*(2*x + 2)
                >>> Mul(2, x + 1, y) # all 3 args simultaneously processed
                2*y*(x + 1)
                >>> 2*((x + 1)*y) # parentheses can control this behavior
                2*y*(x + 1)

                Powers with compound bases may not find a single base to
                combine with unless all arguments are processed at once.
                Post-processing may be necessary in such cases.
                {c.f. https://github.com/sympy/sympy/issues/5728}

                >>> a = sqrt(x*sqrt(y))
                >>> a**3
                (x*sqrt(y))**(3/2)
                >>> Mul(a,a,a)
                (x*sqrt(y))**(3/2)
                >>> a*a*a
                x*sqrt(y)*sqrt(x*sqrt(y))
                >>> _.subs(a.base, z).subs(z, a.base)
                (x*sqrt(y))**(3/2)

              -  If more than two terms are being multiplied then all the
                 previous terms will be re-processed for each new argument.
                 So if each of ``a``, ``b`` and ``c`` were :class:`Mul`
                 expression, then ``a*b*c`` (or building up the product
                 with ``*=``) will process all the arguments of ``a`` and
                 ``b`` twice: once when ``a*b`` is computed and again when
                 ``c`` is multiplied.

                 Using ``Mul(a, b, c)`` will process all arguments once.

            * The results of Mul are cached according to arguments, so flatten
              will only be called once for ``Mul(a, b, c)``. If you can
              structure a calculation so the arguments are most likely to be
              repeats then this can save time in computing the answer. For
              example, say you had a Mul, M, that you wished to divide by ``d[i]``
              and multiply by ``n[i]`` and you suspect there are many repeats
              in ``n``. It would be better to compute ``M*n[i]/d[i]`` rather
              than ``M/d[i]*n[i]`` since every time n[i] is a repeat, the
              product, ``M*n[i]`` will be returned without flattening -- the
              cached value will be returned. If you divide by the ``d[i]``
              first (and those are more unique than the ``n[i]``) then that will
              create a new Mul, ``M/d[i]`` the args of which will be traversed
              again when it is multiplied by ``n[i]``.

              {c.f. https://github.com/sympy/sympy/issues/5706}

              This consideration is moot if the cache is turned off.

            NB
            --
              The validity of the above notes depends on the implementation
              details of Mul and flatten which may change at any time. Therefore,
              you should only consider them when your code is highly performance
              sensitive.

              Removal of 1 from the sequence is already handled by AssocOp.__new__.
        r   )AccumBounds)
MatrixExprN   Fevaluatec                 0    g | ]}t          |          S r#   _keep_coeff)rF   bir:   s     r%   
<listcomp>zMul.flatten.<locals>.<listcomp>'  s#    $I$I$IB[B%7%7$I$I$Ir$   c                    i }| D ]b\  }|                                 }|                    i                               |d         g                               |d                    c|                                D ]+\  }|                                D ]\  }}t	          | ||<   ,g }|                                D ]8\  }|                    fd|                                D                        9|S )Nr   r   c                 $    g | ]\  }}||z  fS r#   r#   )rF   tr;   bs      r%   r^   z0Mul.flatten.<locals>._gather.<locals>.<listcomp>  s%    $D$D$D$!Qa1X$D$D$Dr$   )as_coeff_Mul
setdefaultr3   itemsAddr2   )	c_powerscommon_ber9   ddilinew_c_powersrb   s	           @r%   _gatherzMul.flatten.<locals>._gather  s   H  - -1^^%%##Ar**55qE2 %vbe}}}} (( % %1ggii % %FBHAbEE%L (( F F1##$D$D$D$D!''))$D$D$DEEEEr$   c              3   *   K   | ]}|j         v V  d S rC   r*   )rF   inftyrb   s     r%   rG   zMul.flatten.<locals>.<genexpr>  s=       6; 6;! 7<qvo 6; 6; 6; 6; 6; 6;r$   Tc                     h | ]\  }}|S r#   r#   rF   rb   ri   s      r%   	<setcomp>zMul.flatten.<locals>.<setcomp>  s)      0  0  0!QA 0  0  0r$   c                 8    g | ]\  }}|t          ||          S r#   PowrF   ri   rb   s      r%   r^   zMul.flatten.<locals>.<listcomp>)  s)    GGGTQQGs1ayyGGGr$   r   c                 4    g | ]\  }}t          ||          S r#   ru   rw   s      r%   r^   zMul.flatten.<locals>.<listcomp>  s$    :::TQs1ayy:::r$   c                 l    g }| D ],}|j         r
|j        r|dz  }|                    |           -||fS N)is_extended_positiverL   r3   )c_part
coeff_sign
new_c_partra   s       r%   _handle_for_ooz#Mul.flatten.<locals>._handle_for_oo  s^    
 ) )A- ! - !"b(
 %%a((((!:--r$   c                 H    g | ]}t          |j                  r|j        | S rC   r   is_zerois_extended_realrF   r;   s     r%   r^   zMul.flatten.<locals>.<listcomp>  s?     Q Q QA	!)0D0D Q010B0N 0N0N0Nr$   c                 H    g | ]}t          |j                  r|j        | S rC   r   r   s     r%   r^   zMul.flatten.<locals>.<listcomp>  s?     S S SQ)AI2F2F S232D2P 2P2P2Pr$   c              3   8   K   | ]}t          |          V  d S rC   )
isinstance)rF   r;   rV   s     r%   rG   zMul.flatten.<locals>.<genexpr>  s-      >>:a,,>>>>>>r$   c              3   ,   K   | ]}|j         d k    V  dS FN	is_finiter   s     r%   rG   zMul.flatten.<locals>.<genexpr>  s)      88A1;%'888888r$   c                     g | ]}|z  S r#   r#   )rF   fcoeffs     r%   r^   zMul.flatten.<locals>.<listcomp>  s    <<<E!G<<<r$   ):!sympy.calculus.accumulationboundsrU   sympy.matrices.expressionsrV   lenis_Rationalr   r/   r   rc   is_Addr   
distributer"   rf   r+   Zeror   as_expr_variablesr   r2   r3   r   r    NaNrQ   r   __mul__ImaginaryUnitHalfas_base_expis_Pow
is_Integerrv   is_negativerd   is_positive
is_integerr0   r6   rangeanyInfinityNegativeInfinityre   qpdivmodRationalr   r.   gcdr4   	make_argsas_numer_denomrR   r,   r   )5clsseqrU   rvrararbnewbr}   nc_partnc_seqrg   num_expneg1epnum_ratorder_symbolsor   ri   o1b1e1b2e2new_expo12rn   irm   changedr   r]   inv_exp_dictcomb_enum_rate_ieppneweigrowjbjejgobjnr   r~   _newrV   r:   rb   r   s5                                                    @@@@r%   flattenzMul.flatten   sx   ^ 	BAAAAA999999s88q==DAq} !1!fAE>>>>} .QY .~~''18 .~~qS;;"#CC"%#ac1u"="="=C!UB_*5 .!:J ."$I$I$I$I!&$I$I$IJ"VR- 	       u	0 u	0Az F#$#6#6}#E#E = x o0# *JJqv&&&& V - -+ -JJqMMMM"MM!,,,, JJy)))  \0::!*;!;!;	!;E7B,,,,_ 1
5+(F(F 1QJE~~ !wD0000A{++ Q0		%((a''' -E7B,,,,)ao%%! B0 }}1 8 %{ %
 = % | ' %Q 2 (!" ' #

3q!99 5 5 5 (!" ' %
%&B ~~ ( 3 3Ar : : A A! D D D$] %al %#NNAq6222$A''''
 I%%MM!$$$  0

1A" !q)))  !B^^--FB]]__FB 2gG
 Rxxx Gm - 2JJsOOO$"MM!S1111  Aw///7  0T	  	  	  78$$ ''""0 q $	 $	ALG  , ,19  1AH 1# 6; 6; 6; 6;&'&7&'&8&:6; 6; 6; 3; 3; 1 !"wD000000::{ !
 AAE>>Aq		A x + + }}177&*Ga   ##QF++++  3  0  0". 0  0  0 1 1474E4EF F "7<00  	5 	5DAq##Ar**11!4444 &&(( 	& 	&DAq!c1gLOOGG\-?-?-A-AGGGHHH NN$$ 	5 	5DAqc1gr**11!4444 LLNN 		# 		#DAqQAsaxxQ"sQSyy ac**RQ$R%%NNAq6"""" 4  #g,,QZFBQwwQD1q5#g,,//   BFF2JJAE>> RAsaxxQ*399&,QS!#&6&6GC!SC[[0E (QS 1 1AQF+++"$Q$GAJABQU{{"bkk= 
0SLEE  #}}S11 0 0= 0!SLEE#&:---%(XFB HOOB////NN4   FAU #g,,Z JJLL 	 	DAqc1gDGG  	M((**DAq!Q<<DAq1u Avvao.... M !A JJLL M MDAqEzzamz#$"Q MM#amUU"K"K"KLLL 	::TZZ\\:::;;; QZ!3444	. 	. 	. "0!:!:FJ"0.*"E"EGZZE A%%%Q Q Q Q QFS S' S S SGG ] 	. >>>>g>>>>> 7w668888888 2wM117B--  	 	A{ 
A 	 MM!U### ( 	? 	?S[[A=M=Mq	# >N(.q	(; >N@Fq	@P >N 1IE<<<<VAY^<<<=>Fw--r$   c                    |                      d          \  }}j        r@t          fd|D              t          t                              |          d          z  S j        rՉj        dk    r| j        r|                                 d         }|j        rt          |dz            
                                \  }}t          |d          \  }}|rft          |d          \  }}|rQddlm} t          |          |z  }	t          |	j        z  d ||          t"          j        z  z   j        z            S t          | d          }
j        sj        r|
                                S |
S )	NF)split_1c                 4    g | ]}t          |d           S )FrX   ru   rr   s     r%   r^   z#Mul._eval_power.<locals>.<listcomp>  s(    BBBqQE222BBBr$   rX   rW   r   r   sign)r1   r   r4   rv   r5   r   r   is_imaginaryas_real_imagabsr   r   $sympy.functions.elementary.complexesr   r   r=   r   r   r   is_Float_eval_expand_power_base)rI   ri   cargsr<   r:   r   rj   ra   r   r   r   s    `         r%   _eval_powerzMul._eval_power  s    MM%M00	r< 	;BBBBEBBBCCNN2&&E:::; ;= 	`QSAXX  
`%%''*= `qs882244DAq*1a00DAq `.q!441 `QQQQQQ '

1A#3AqsFQaAX=X[\[^<^#_#__a%(((= 	/AJ 	/,,...r$   c                     dd| j         fS )N   r   )r   r   s    r%   	class_keyzMul.class_key  s    !S\!!r$   c                 &   |                                  \  }}|t          j        u r;|j        rt	          j        ||           }n2|                    |          }||}| }nt	          j        | |          }|j        r|                                S |S rC   )rc   r   rR   r   r   _eval_evalf	is_numberexpand)rI   precr;   mr   mnews         r%   r   zMul._eval_evalf  s      ""1x )!T222}}T**#AR$T400B< 	99;;	r$   c                     ddl m} |                                 \  }}|t          j        urt          d           |d          j         ||          j        fS )z;
        Convert self to an mpmath mpc if possible
        r   )Floatz7Cannot convert Mul to mpc. Must be of the form Number*Ir   )numbersr   rc   r   r   AttributeError_mpf_)rI   r   im_part	imag_units       r%   _mpc_z	Mul._mpc_  sj    
 	#"""""!..00AO++ !!Z[[[ag 455r$   c                     | j         }t          |          dk    rt          j        | fS t          |          dk    r|S |d          | j        |dd          fS )ao  Return head and tail of self.

        This is the most efficient way to get the head and tail of an
        expression.

        - if you want only the head, use self.args[0];
        - if you want to process the arguments of the tail then use
          self.as_coef_mul() which gives the head and a tuple containing
          the arguments of the tail when treated as a Mul.
        - if you want the coefficient when self is treated as an Add
          then use self.as_coeff_add()[0]

        Examples
        ========

        >>> from sympy.abc import x, y
        >>> (3*x*y).as_two_terms()
        (3, x*y)
        r   rW   r   N)r+   r   r   r/   _new_rawargs)rI   r+   s     r%   as_two_termszMul.as_two_terms  s^    * yt99>>5$;YY!^^K 7-D-tABBx888r$   )rationalc                V   r6t          | j        fdd          \  }} | j        | t          |          fS | j        }|d         j        rO|r|d         j        r|d         |dd          fS |d         j        r!t          j        |d          f|dd          z   fS t          j	        |fS )Nc                      | j          S rC   )has)xdepss    r%   <lambda>z"Mul.as_coeff_mul.<locals>.<lambda>0  s    uqud| r$   T)binaryr   r   )
r   r+   r   tupler    r   rL   r   rR   r/   )rI   r   r   kwargsl1l2r+   s     `    r%   rP   zMul.as_coeff_mul-  s     	5$)%;%;%;%;DIIIFB$4$b)59944y7 	= =tAw2 =AwQRR((a- =}QxkDH&<<<ud{r$   Fc                    | j         d         | j         dd         }}|j        rT|r|j        r)t          |          dk    r
||d         fS | | j        | fS |j        rt          j         | j        | f|z    fS t          j        | fS )zC
        Efficiently extract the coefficient of a product.
        r   r   N)	r+   r    r   r   r   rL   r   rR   r/   )rI   r   r   r+   s       r%   rc   zMul.as_coeff_Mul:  s     ilDIabbMt? 	M Mu0 Mt99>> $q'>) "3$"3T":::+ M}&7d&7E6)d:J&LLLud{r$   c                    ddl m}m}m} g }g }g }t          j        }	| j        D ]}
|
                                \  }}|j        r|	                    |           6|j        r#|	                    |t          j
        z             `|
j        r||r|
                                nd }t          |          D ]1\  }}||k    r&|	                     ||          dz             ||=  n#2|
j        r|	|
z  }	|	                    |
           |	                    |
            | j        | }|                    d          |k    rd S t#          |          dz  r ||                    d                    }nt          j        } | j        ||z    }| ||          z  | ||          z  }}|	dk    rI|dk    r&|j        r|t          j        fS t          j        ||z  fS |t          j        u r||fS | |z  ||z  fS ddlm}  ||	d                                          \  }}|t          j        u r||z  ||z  z
  ||z  ||z  z   fS | |z  ||z  }}||z  ||z  z
  ||z  ||z  z   fS )	Nr   )AbsimrerW   ignorer   )
expand_mulF)deep)r   r  r  r  r   r/   r+   r   r   r3   r   r"   	conjugate	enumerater   funcgetr   r0   r   functionr	  )rI   r
  hintsr  r  r  othercoeffrcoeffiaddtermsr:   r   r   aconjr   r   imcorecor	  addreaddims                        r%   r   zMul.as_real_imagJ  s   DDDDDDDDDD5 	  	 A>>##DAqy  a      a/0000!  ).8D%e,, 	( 	(DAqEzzcc!ffai000!!H "
 x ( AQQDIu99X!##Fv;;? 	2fjjmm$$DD 6Dty6F?,RRUU
DAJ1q==Avv< / !&>)FDI..qv~~1vE!GT!V$$((((((!z(777DDFFu16>>eGag%qw5'89957DFqAeGag%qw5'899r$   c                 6   t          |           }|dk    r| d         j        S g }t                              | d|dz                     }t                              | |dz  d                   fd|D             }t	          | }t	          j        |          S )zk
        Helper function for _eval_expand_mul.

        sums must be a list of instances of Basic.
        r   r   NrW   c                 :    g | ]}D ]}t          ||          S r#   )r4   )rF   r:   rb   rights      r%   r^   z#Mul._expandsums.<locals>.<listcomp>  s.    888q%88QQ8888r$   )r   r+   r4   _expandsumsrf   r   )sumsLtermsleftaddedr  s        @r%   r  zMul._expandsums  s     II667<tEQTE{++QTUU,,8888D888U}U###r$   c                    ddl m} | } ||                    dd                    \  }}|j        rfd||fD             \  }}||z  }|j        s|S g g d}}}|j        D ]`}	|	j        r|                    |	           d}!|	j        r|                    |	           >|                    t          |	                     a|s|S  | j	        | }|r                    dd          }
| j	        
                    |          }g }|D ]h}| 	                    ||          }|j        r4t          d |j        D                       r|
r|                                }|                    |           it          | S |S )	Nr   fractionexactFc                 <    g | ]}|j         r |j        d i n|S )r#   )r   _eval_expand_mul)rF   r   r  s     r%   r^   z(Mul._eval_expand_mul.<locals>.<listcomp>  sI     ! ! ! 458B&A&///// ! ! !r$   Tr
  c              3   $   K   | ]}|j         V  d S rC   )r   rE   s     r%   rG   z'Mul._eval_expand_mul.<locals>.<genexpr>  s$      'A'AQ'A'A'A'A'A'Ar$   )sympy.simplify.radsimpr%  r  r   r+   r   r3   r"   r	   r  r  r   r(  rf   )rI   r  r%  exprr   rj   plainr  rewritefactorr
  r   r+   termra   s    `             r%   r(  zMul._eval_expand_mul  s   333333 xeii778818 	!! ! ! !Q! ! !DAqs{ 	K!2uWti 	/ 	/F} /F###( /LL((((KKf.... 	KDIu%E yy//	--d33! # #D		%..Ax 1C'A'A!&'A'A'A$A$A 1d 1..00KKNNNNDz!r$   c           
      `   t          | j                  }g }t          t          |                    D ]h}||                             |          }|rI|                    t          d |d |         |gz   ||dz   d          z   t          j                             it          j
        |          S )Nc                     | |z  S rC   r#   )r   ys     r%   r   z&Mul._eval_derivative.<locals>.<lambda>  s
    1 r$   r   )r.   r+   r   r   diffr3   r   r   r/   rf   fromiter)rI   sr+   r   r   rj   s         r%   _eval_derivativezMul._eval_derivative  s    DIs4yy!! 	_ 	_AQQA _ V$4$4tBQBx1#~QQRUVV7TWXW\]]^^^|E"""r$   c                 Z   ddl m} ddlm}m}m} t          ||f          s"t                                                    S ddl	m
} | j        t                    }t          t          |f          r^g }	ddlm}
  |
|          D ]@\  }t!          fdt#                    D              }|	                    ||z             At'          |	 S ddlm} dd	lm} dd
lm}  |d|z  |          t5                    z
  } |          }|t7          t9          |                    z   ||          z  t!          fdt;          |dz
            D              z  d                              |d|          f          z  fdD             }} ||g|R  S )Nr   )AppliedUndef)SymbolsymbolsDummy)Integerr   )!multinomial_coefficients_iteratorc                 D    g | ]\  }}|                     |f          S r#   r3  )rF   kargr5  s      r%   r^   z0Mul._eval_derivative_n_times.<locals>.<listcomp>  s-    JJJvq##((Aq6**JJJr$   )Sum)	factorial)Maxzk1:%ir   c                 V    g | ]%}|                              |         f          &S r#   r?  )rF   ra   r+   kvalsr5  s     r%   r^   z0Mul._eval_derivative_n_times.<locals>.<listcomp>  s1    BBB!$q',,58}--BBBr$   r{   c                     g | ]}|d fS r   r#   )rF   r@  r   s     r%   r^   z0Mul._eval_derivative_n_times.<locals>.<listcomp>  s    &&&1aAY&&&r$   )r  r8  symbolr9  r:  r;  r   super_eval_derivative_n_timesr   r<  r+   r   intsympy.ntheory.multinomialr=  r4   zipr3   rf   sympy.concrete.summationsrB  (sympy.functions.combinatorial.factorialsrC  (sympy.functions.elementary.miscellaneousrD  sumprodmapr   r3  )rI   r5  r   r8  r9  r:  r;  r<  r   r   r=  r;   r   rB  rC  rD  klastnfactri   lr+   rF  	__class__s    ``                 @@r%   rK  zMul._eval_derivative_n_times  sJ   ******2222222222!lF344 	: 7733Aq999$$$$$$yIIa#w(( 	ESSSSSS==aCC $ $qJJJJUD9I9IJJJKQU####;111111FFFFFF@@@@@@!///CJJ	!$s9e,,---ii.>.>>BBBBBBuQqSzzBBBCDHMM1cc!Umm,--. '&&&&&&	 
 s1zqzzzr$   c                     ddl m} | j        d         }t          | j        dd           }|                    |||z              ||||          z   ||||          |z  z   S )Nr   )difference_deltar   )sympy.series.limitseqrZ  r+   r4   subs)rI   r   stepddarg0rests         r%   _eval_difference_deltazMul._eval_difference_delta  s}    @@@@@@y|DIabbM"		!QX&&D!T):)::RRa=N=N>  	r$   c                     |                                  \  }}t                              |          }t          |          dk    r7| j                            ||          }|d                             ||          S d S )Nr   r   )rc   r4   r   r   rX  _combine_inversematches)rI   r+  	repl_dictr   r   newexprs         r%   _matches_simplezMul._matches_simple  sm    ((**ue$$u::??n55dEBBG8##GY777r$   Nc                    t          |          }| j        r|j        r|                     |||          S | j        |j        urd S |                                 \  }}|                                \  }}d ||fD             \  }}t	          | }t	          | }	|                    |	||          }|s||k    rd S t                              |          }t                              |          }t                              |||          }|pd S )Nc                     g | ]}|pd gS r   r#   r   s     r%   r^   zMul.matches.<locals>.<listcomp>  s    ---q!(s---r$   )r   r"   _matches_commutativer1   r4   rd  _matches_expand_pows_matches_noncomm)
rI   r+  re  oldc1nc1c2nc2comm_mul_selfcomm_mul_exprs
             r%   rd  zMul.matches  s   t}} 	4#6 	,,T9cBBB (;;;4 --//C--//C--RH---B RR!))-CHH	  	R2XX4 &&s++&&s++((c9==	 D r$   c                     g }| D ]M}|j         r/|j        dk    r$|                    |j        g|j        z             8|                    |           N|S rO   )r   expr2   baser3   )arg_listnew_argsrA  s      r%   rl  zMul._matches_expand_pows  sd     	% 	%Cz %cgkk
SW 45555$$$$r$   c                 
   |i }n|                                 }g }d}|\  }}i }|t          |          k     r|t          |           k     r| |         }|j        rt                              ||           t                              ||| |          }	|	r,|	\  }
}|                    |
           |r|D ]}||         ||<   |sdS |                                }|\  }}|t          |          k     r|t          |           k     |S )zNon-commutative multiplication matcher.

        `nodes` is a list of symbols within the matcher multiplication
        expression, while `targets` is a list of arguments in the
        multiplication expression being matched against.
        N)r   r   )copyr   is_Wildr4   _matches_add_wildcard_matches_new_statesr2   r0   )nodestargetsre  agendastatenode_ind
target_indwildcard_dictnodestates_matches
new_statesnew_matchesmatchs                r%   rm  zMul._matches_noncomm%  sB    II!((I $*3w<<''Hs5zz,A,A?D| @))-??? 44]E5:GE EN >*8'
Kj))) >!, > >+6u+=	%(( -t

',$*% 3w<<''Hs5zz,A,A( r$   c                 N    |\  }}|| v r| |         \  }}||f| |<   d S ||f| |<   d S rC   r#   )
dictionaryr  r  r  beginends         r%   r}  zMul._matches_add_wildcardP  sO    $*z!!#H-JE3$):#6Jx   $.
#;Jx   r$   c                    |\  }}||         }||         }|t          |          dz
  k    r|t          |          dz
  k     rd S |j        rt                              | |||          }|rt                              | ||          }	|	D ]R}
| |
         \  }}| |         \  }}|||dz            }|||dz            }t          ||          D ]\  }}||k    r  d S S||dz   fg}|t          |          dz
  k     r|                    |dz   |dz   f           ||fS d S |t          |          dz
  k    r|t          |          dz
  k     rd S |                    |          }|r|dz   |dz   fg|fS ||k    r|dz   |dz   fgd fS d S )Nr   )r   r|  r4   _matches_match_wilds_matches_get_other_nodesrN  r3   rd  )r  r  r  r  r  r  r  targetmatch_attemptother_node_indsindother_begin	other_end
curr_begincurr_endother_targetscurrent_targetscurrr  	new_states                       r%   r~  zMul._matches_new_statesY  s   $*X$ W)))hUa.G.G4< )	44Z5:GE EM 0 #&">">z?Dh#P #P* 	( 	(C-7_*K+5h+?(J$+K	A,E$FM&-jA.E&FO'*?M'J'J ( (e5==#'444 )( '
Q78	c%jj1n,,$$hlJN%CDDD -///0 08 3u::>))j3w<<!;K.K.Kt LL00M !AzA~67FF!AzA~67==tr$   c                     ||         }| |         \  }}|||dz            }t          |          dk    r	t          | n|d         }|                    |          S )z@Determine matches of a wildcard with sub-expression in `target`.r   r   )r   r4   rd  )	r  wildcard_indr  r  wildcardr  r  r   mults	            r%   r  zMul._matches_match_wilds  sa     &-
scAg&!%jj1nnsE{{%(%%%r$   c                 4    |         fd| D             S )z8Find other wildcards that may have already been matched.c                 ,    g | ]}|         k    |S r#   r#   )rF   r  ind_noder  s     r%   r^   z0Mul._matches_get_other_nodes.<locals>.<listcomp>  s'    DDDU3Z8-C-C-C-C-Cr$   r#   )r  r  r  r  s    ` @r%   r  zMul._matches_get_other_nodes  s,     ?DDDDDzDDDDr$   c                    ddl m} ddlm} | |k    rt          j        S d } || |          s |||           rt          j        S t          d | |fD                       ro |d          }t          j        |i}|t          j        i}|                     |          	                                }|                    |          	                                }	t          |	          }
t          |	                                          D ]F}||v r@||xx         |	                    |          z  cc<   ||         s|                    |           Gt          |	          |
k    rpt          d |                                D                                  |          } t          d	 |	                                D                                  |          }| |z  } ||          }|j        r|n|S )
z
        Returns lhs/rhs, but treats arguments like symbols, so things
        like oo/oo return 1 (instead of a nan) and ``I`` behaves like
        a symbol instead of sqrt(-1).
        r   )signsimpr   )r;  c                     | j         rE|j        r>|                     d          |                                                    d          k    S dS )Nr   F)r   is_comparable__add__evalf)rW  r   s     r%   checkz#Mul._combine_inverse.<locals>.check  sG    z <ao < yy||qwwyy'8'8';';;;5r$   c              3   2   K   | ]}|j         p|j        V  d S rC   )r   r   rF   r   s     r%   rG   z'Mul._combine_inverse.<locals>.<genexpr>  s+      88qx#18888888r$   Ic                     g | ]
\  }}||z  S r#   r#   rF   r@  vs      r%   r^   z(Mul._combine_inverse.<locals>.<listcomp>       777TQAqD777r$   c                     g | ]
\  }}||z  S r#   r#   r  s      r%   r^   z(Mul._combine_inverse.<locals>.<listcomp>  r  r$   )sympy.simplify.simplifyr  rI  r;  r   r/   r   r   xreplaceas_powers_dictr   r   keysr0   r4   re   r    )lhsrhsr  r;  r  rj   _ii_r:   rb   blenr]   r   srvs                 r%   rc  zMul._combine_inverse  s    	544444!!!!!!#::5L	 	 	 5c?? 	eeCoo 	5L88c3Z88888 	F c

A/1%BQ_%BR  //11AR  //11Aq66DAFFHHoo " "77bEEEQUU2YY&EEER5 "b			1vv~~77QWWYY7778AA"EE77QWWYY7778AA"EEWhrllm+ss+r$   c                     t          t                    }| j        D ]>}|                                                                D ]\  }}||xx         |z  cc<   ?|S rC   )r   rL  r+   r  re   )rI   rj   r/  rb   ri   s        r%   r  zMul.as_powers_dict  sl    I 	 	D++--3355  1!	r$   c                 z    t          t          d | j        D                        \  }} | j        |  | j        | fS )Nc                 6    g | ]}|                                 S r#   )r   )rF   r   s     r%   r^   z&Mul.as_numer_denom.<locals>.<listcomp>  s$    #J#J#J1A$4$4$6$6#J#J#Jr$   )r.   rN  r+   r  )rI   numersdenomss      r%   r   zMul.as_numer_denom  sH     c#J#J	#J#J#JKLLty&!949f#555r$   c                     d }g }d}| j         D ][}|                                \  }}|j        s|dz  }||}n||k    s|dk    r| t          j        fc S |                    |           \ | j        | |fS )Nr   r   )r+   r   r"   r   r/   r3   r  )rI   r   basesr<   r   rb   ri   s          r%   r   zMul.as_base_exp  s     	 	A==??DAq# azbBFFQU{"""LLOOOOty% "$$r$   c                 D    t          fd| j        D                       S )Nc              3   B   K   | ]}|                               V  d S rC   )_eval_is_polynomialrF   r/  symss     r%   rG   z*Mul._eval_is_polynomial.<locals>.<genexpr>  s1      HHd4++D11HHHHHHr$   allr+   rI   r  s    `r%   r  zMul._eval_is_polynomial  s(    HHHHdiHHHHHHr$   c                 D    t          fd| j        D                       S )Nc              3   B   K   | ]}|                               V  d S rC   )_eval_is_rational_functionr  s     r%   rG   z1Mul._eval_is_rational_function.<locals>.<genexpr>  s1      OOT422488OOOOOOr$   r  r  s    `r%   r  zMul._eval_is_rational_function  s(    OOOOTYOOOOOOr$   c                 L    t          fd| j        D             d          S )Nc              3   D   K   | ]}|                               V  d S rC   )is_meromorphic)rF   rA  r:   r   s     r%   rG   z+Mul._eval_is_meromorphic.<locals>.<genexpr>  s3      KK#S//155KKKKKKr$   T
quick_exitr   r+   )rI   r   r:   s    ``r%   _eval_is_meromorphiczMul._eval_is_meromorphic  s:    KKKKKKKK'+- - - 	-r$   c                 D    t          fd| j        D                       S )Nc              3   B   K   | ]}|                               V  d S rC   )_eval_is_algebraic_exprr  s     r%   rG   z.Mul._eval_is_algebraic_expr.<locals>.<genexpr>  s1      LL$4//55LLLLLLr$   r  r  s    `r%   r  zMul._eval_is_algebraic_expr  s(    LLLL$)LLLLLLr$   c                 >    t          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rC   )r"   rE   s     r%   rG   zMul.<lambda>.<locals>.<genexpr>  s6       5- 5-5- 5- 5- 5- 5- 5-r$   r  rI   s    r%   r   zMul.<lambda>  s.     5- 5-"&)5- 5- 5- )- )- r$   c                     t          d | j        D                       }|du r@t          d | j        D                       r"t          d | j        D                       rd S dS |S )Nc              3   $   K   | ]}|j         V  d S rC   )
is_complexrE   s     r%   rG   z'Mul._eval_is_complex.<locals>.<genexpr>  s$      <<QAL<<<<<<r$   Fc              3   $   K   | ]}|j         V  d S rC   )is_infiniterE   s     r%   rG   z'Mul._eval_is_complex.<locals>.<genexpr>  s$      44Q1=444444r$   c              3   (   K   | ]}|j         d uV  dS r   r   rE   s     r%   rG   z'Mul._eval_is_complex.<locals>.<genexpr>  s)      AA!qy-AAAAAAr$   )r   r+   r   )rI   comps     r%   _eval_is_complexzMul._eval_is_complex  sz    <<$)<<<<<5==44$)44444 AAtyAAAAA  4ur$   c                     dx}}| j         D ]L}|j        r
|dur dS d}|j        r
|dur dS d}$|du r|j        	|dur dS d }|du r|j        	|dur dS d }M||fS )NF)NNT)r+   r   r  )rI   	seen_zeroseen_infiniter:   s       r%   _eval_is_zero_infinite_helperz!Mul._eval_is_zero_infinite_helper  s    X %*)	M 	) 	)Ay ) --%:: 		 )E))%:: $%%!)*;$E11)zz $I E))am.C --)zz$(M-''r$   c                 T    |                                  \  }}|du rdS |du r|du rdS d S NFTr  rI   r  r  s      r%   _eval_is_zerozMul._eval_is_zeroA  sI     $(#E#E#G#G 	=5$=E#9#944r$   c                 T    |                                  \  }}|du r|du rdS |du rdS d S )NTFr  r  s      r%   _eval_is_infinitezMul._eval_is_infiniteM  sI     $(#E#E#G#G 	=D  Y%%7%74e##54r$   c                     t          d | j        D             d          }|r|S |du r t          d | j        D                       rdS d S d S )Nc              3   $   K   | ]}|j         V  d S rC   )is_rationalrE   s     r%   rG   z(Mul._eval_is_rational.<locals>.<genexpr>]  s$      ;;A!-;;;;;;r$   Tr  Fc              3   (   K   | ]}|j         d u V  dS r   r  rE   s     r%   rG   z(Mul._eval_is_rational.<locals>.<genexpr>b  )      99!19%999999r$   r   r+   r  rI   r   s     r%   _eval_is_rationalzMul._eval_is_rational\  sr    ;;;;;MMM 	H%ZZ99ty99999 u Z r$   c                     t          d | j        D             d          }|r|S |du r t          d | j        D                       rdS d S d S )Nc              3   $   K   | ]}|j         V  d S rC   )is_algebraicrE   s     r%   rG   z)Mul._eval_is_algebraic.<locals>.<genexpr>f  s$      <<Q!.<<<<<<r$   Tr  Fc              3   (   K   | ]}|j         d u V  dS r   r  rE   s     r%   rG   z)Mul._eval_is_algebraic.<locals>.<genexpr>k  r  r$   r  r  s     r%   _eval_is_algebraiczMul._eval_is_algebraice  sr    <<$)<<<NNN 	H%ZZ99ty99999 u Z r$   c                 j   |                                  }|du rdS g }g }d}| j        D ]@}d}|j        r1t          |          t          j        ur|                    |           =|j        rk|                                \  }}t          |          t          j        ur|                    |           |t          j        ur|                    |           |j	        r|
                                \  }	}
|	j        r|
j        sdx}}|
j        r?|                    |t          j        u rdnt          |t          j                             %|s|
j        rJ |
j        rJ  d S  d S  d S |s|sdS d }d }d }ddlm |s|rt'          fd	|D                       rdS |rd S  ||          r ||          rdS  ||          r	|dgk    rdS  ||          r! ||          rt)          |d
didz
  j        rdS t+          |          dk    rE|d         }|j        r6|j        r/t1          d |D              t3          |j                  z
  j        rdS t+          |          dk    rE|d         }|j        r8|j        r3t1          d |D              t3          |j                  z
  j        rdS d S d S d S d S )NFTrW   c                 4    t          d | D                       S )Nc              3   $   K   | ]}|j         V  d S rC   )is_oddr  s     r%   rG   z9Mul._eval_is_integer.<locals>.<lambda>.<locals>.<genexpr>  s$      33Aqx333333r$   r  r   s    r%   r   z&Mul._eval_is_integer.<locals>.<lambda>  s    33333333 r$   c                 4    t          d | D                       S )Nc              3   $   K   | ]}|j         V  d S rC   is_evenr  s     r%   rG   z9Mul._eval_is_integer.<locals>.<lambda>.<locals>.<genexpr>  $      55a	555555r$   r  r  s    r%   r   z&Mul._eval_is_integer.<locals>.<lambda>      C55155555 r$   c                 4    t          d | D                       S )Nc              3   $   K   | ]}|j         V  d S rC   r  r  s     r%   rG   z9Mul._eval_is_integer.<locals>.<lambda>.<locals>.<genexpr>  r  r$   )r   r  s    r%   r   z&Mul._eval_is_integer.<locals>.<lambda>  r	  r$   r   )is_gtc              3   D   K   | ]} |t           j                  V  d S rC   )r   r/   )rF   _r  s     r%   rG   z'Mul._eval_is_integer.<locals>.<genexpr>  s@       37 37$%a37 37 37 37 37 37r$   rY   r   c                 P    g | ]#}|j         	|                                d          $S rj  r  r   r  s     r%   r^   z(Mul._eval_is_integer.<locals>.<listcomp>  s;     1 1 1&'i1!--//!, 1 1 1r$   c                 P    g | ]#}|j         	|                                d          $S rj  r  r  s     r%   r^   z(Mul._eval_is_integer.<locals>.<listcomp>  s;     3 3 3()	3!--//!, 3 3 3r$   )r  r+   r   r   r   r/   r3   r   r   r   r   r   r   rv   rR   r   r   
relationalr  r  r4   r   r   r  rf   r   r   is_nonnegative)rI   r  
numeratorsdenominatorsunknownr:   hitr   rj   rb   ri   alloddallevenanyevenr  s                 @r%   _eval_is_integerzMul._eval_is_integerq  s   ,,..%5
 	 	AC| q66&&%%a((( ''))1q66&&%%a(((AE>> ''*** }}1| )1< )$((C'=  ''Q!&[[Aq}--/ / / /  },,, y(((FF FF 	G 	4335555%%%%%% 	l 	s 37 37 37 37)537 37 37 07 07 	5 		FVJ 	GGL$9$9 	5WZ   	\aS%8%84WZ   	VVL & & 	L9599A=	 5|!!QA|  	    1 1"1 1 1 24<QSMMB(   4z??a1A| !	 !  3 3$3 3 3 46>qsmmD%! !5  ! ! ! !! !r$   c                 ~    t          d | j        D                       }|ot          d | j        D                       S )Nc              3   $   K   | ]}|j         V  d S rC   )is_polarrF   rA  s     r%   rG   z%Mul._eval_is_polar.<locals>.<genexpr>  s$      ::::::::r$   c              3   2   K   | ]}|j         p|j        V  d S rC   )r  r   r  s     r%   rG   z%Mul._eval_is_polar.<locals>.<genexpr>  s+      EEC/EEEEEEr$   )r   r+   r  )rI   	has_polars     r%   _eval_is_polarzMul._eval_is_polar  sK    ::	:::::	 FEE49EEEEE	Fr$   c                 ,    |                      d          S NT)_eval_real_imagr  s    r%   _eval_is_extended_realzMul._eval_is_extended_real  s    ##D)))r$   c                    d}d }| j         D ]}|j        p|j        du r|j        du r dS |j        r| })|j        r9|s6|j        }|s|du r|}B|r$t          d | j         D                       r dS  d S i|j        du r|r d S |}z|j        du r|r d S |} d S |r|j        du r|r|S |j        du r|s|S d S d S |du r|S |r|S d S )NFc              3   $   K   | ]}|j         V  d S rC   r   rE   s     r%   rG   z&Mul._eval_real_imag.<locals>.<genexpr>  s$      >>qq{>>>>>>r$   T)r+   r  r  r   r   r   r  )rI   realzerot_not_re_imra   zs         r%   r%  zMul._eval_real_imag  s    	 	A-%77A<NRW<W<Wuu x#  	A   >>DI>>>>> (#'44#u,, FF5(( FF 
	+u44  K'500  K 10   U]]K 	K	 	r$   c                 l    t          d | j        D                       r|                     d          S d S )Nc              3   6   K   | ]}|j         d u o|j        V  dS r   )r   r   rE   s     r%   rG   z)Mul._eval_is_imaginary.<locals>.<genexpr>  s0      EEaqyE!1akEEEEEEr$   F)r  r+   r%  r  s    r%   _eval_is_imaginaryzMul._eval_is_imaginary  sA    EE49EEEEE 	/''...	/ 	/r$   c                 ,    |                      d          S r$  _eval_herm_antihermr  s    r%   _eval_is_hermitianzMul._eval_is_hermitian  s    ''---r$   c                 ,    |                      d          S NFr1  r  s    r%   _eval_is_antihermitianzMul._eval_is_antihermitian  s    ''...r$   c                     | j         D ](}|j        |j         d S |j        r|j        r| }& d S |dur|S |                                 }|rdS |du r|S d S r  )r+   is_hermitianis_antihermitianr  )rI   hermra   r   s       r%   r2  zMul._eval_herm_antiherm  s     	 	A~%);)C~ # xuK$$&& 	4K r$   c                    | j         D ]X}|j        }|rHt          | j                   }|                    |           t	          d |D                       r dS  d S | d S Yt	          d | j         D                       rdS d S )Nc              3   P   K   | ]!}|j         ot          |j                  d u V  "dS )TN)r  r   r   rF   r   s     r%   rG   z*Mul._eval_is_irrational.<locals>.<genexpr>  s8      XXA>)AI*>*>4GXXXXXXr$   Tc              3   $   K   | ]}|j         V  d S rC   )is_realr=  s     r%   rG   z*Mul._eval_is_irrational.<locals>.<genexpr>  s$      ,,Qqy,,,,,,r$   F)r+   is_irrationalr.   remover  )rI   ra   r:   otherss       r%   _eval_is_irrationalzMul._eval_is_irrational  s     		 		AA dia   XXQWXXXXX  44y ,,$),,,,, 	5	 	r$   c                 ,    |                      d          S )a  Return True if self is positive, False if not, and None if it
        cannot be determined.

        Explanation
        ===========

        This algorithm is non-recursive and works by keeping track of the
        sign which changes when a negative or nonpositive is encountered.
        Whether a nonpositive or nonnegative is seen is also tracked since
        the presence of these makes it impossible to return True, but
        possible to return False if the end result is nonpositive. e.g.

            pos * neg * nonpositive -> pos or zero -> None is returned
            pos * neg * nonnegative -> neg or zero -> False is returned
        r   _eval_pos_negr  s    r%   _eval_is_extended_positivezMul._eval_is_extended_positive  s      !!!$$$r$   c                 J   dx}}| j         D ]~}|j        r
|j        r| }|j        r$t	          d | j         D                       r dS  d S |j        r| }d}M|j        rd}W|j        du r| }|r d S d}k|j        du r|r d S d}| d S |dk    r
|du r|du rdS |dk     rdS d S )NFc              3   $   K   | ]}|j         V  d S rC   r   rE   s     r%   rG   z$Mul._eval_pos_neg.<locals>.<genexpr>7  s$      66qq{666666r$   Tr   r   )	r+   r|   rL   r   r  is_extended_nonpositiveis_extended_nonnegativer   r   )rI   r   saw_NONsaw_NOTra   s        r%   rF  zMul._eval_pos_neg/  s0   !!' 	 	A% ' u 66DI66666 ! 55* u*  %''u FF%'' FF199E))g.>.>4!885 8r$   c                 ,    |                      d          S rz   rE  r  s    r%   _eval_is_extended_negativezMul._eval_is_extended_negativeR  s    !!"%%%r$   c                    |                                  }|dur|S ddlm}  ||           \  }}|j        rP|j        rIt          d t                              |          D              t          |j	                  z
  j
        rdS d S d\  }}| j        D ]K}t          |          t          j        u r|j        r dS |du rn|dk    r||z   j        rd}n	|j        d }|}L|S )NTr   r$  c                 P    g | ]#}|j         	|                                d          $S rj  r  r  s     r%   r^   z$Mul._eval_is_odd.<locals>.<listcomp>_  ;     3 3 3Q()	3ammooa( 3 3 3r$   F)Tr   r   )r  r*  r%  r   r  rf   r4   r   r   r   r   r+   r   r   r/   r  )rI   r   r%  r   rj   r   accra   s           r%   _eval_is_oddzMul._eval_is_oddU  s0   **,,
T!!333333x~~1< 	AI 	  3 3MM!$$3 3 3 46>qsmmD! uF3 	 	A1vvy uuEzzsQw."CCr$   c                     ddl m}  ||           \  }}|j        rN|j        rIt	          d t
                              |          D              t          |j                  z
  j	        rdS d S d S d S )Nr   r$  c                 P    g | ]#}|j         	|                                d          $S rj  r  r  s     r%   r^   z%Mul._eval_is_even.<locals>.<listcomp>z  rR  r$   F)
r*  r%  r   r  rf   r4   r   r   r   r  )rI   r%  r   rj   s       r%   _eval_is_evenzMul._eval_is_evens  s    333333x~~1< 	AI 	  3 3MM!$$3 3 3 46>qsmmD$ u	 	 	 	 r$   c                 n    d}| j         D ]"}|j        r|j        s dS |dz
  j        r|dz  }#|dk    rdS dS )z
        Here we count the number of arguments that have a minimum value
        greater than two.
        If there are more than one of such a symbol then the result is composite.
        Else, the result cannot be determined.
        r   Nr   T)r+   r   r   )rI   number_of_argsrA  s      r%   _eval_is_compositezMul._eval_is_composite  sf     9 	$ 	$CN s ttA" $!#A4 r$   c           	      @  ()*+, ddl m, ddlm} ddlm+ ddlm} |j        sd S |j	        d         j
        rN|j	        d         dk     r=| j	        d         j
        r+| j	        d         dk     r|                     | |           S d S d ((+fd}(fd}d	 }d } ||           \  }	}
| }|
t          j        urR|	                    ||          |
                    ||          z  }|j        s|                    ||          S || k    r|}|j	        d         }|j	        d         }d }|j        r#|j        r||k    r|                    |          }n	|j        r|S  ||          \  )} ||          \  *}|rx|j        rqt!          |          d
k    r^t           |t!          |          |                    })                    |           |)v r)|xx         |z  cc<   n|)|<   |||z  z  }nd
}d}t%          |          t%          |          k    rd}nt%          *          t%          )          k    rd}n}d |D                                 d |D                       rd}nQt)          *                              t)          )                    rd}nt+          )*,fd*D                       rd}|s|S *sd }n^g }*                                D ]8\  }})|         }|                     |||                     |d         s|c S 9t1          |          }|s1d }t3          t%          |                    D ]} |||          ||<   nd}t%          |          }|pt          j        }g }d}|r||z   t%          |          k    rvd}g }t3          |          D ]}|||z            d         ||         d         k    r n|dk    r;|                     ||||z            d
         ||         d
                              n}||d
z
  k    r;|                     ||||z            d
         ||         d
                              n9|||z            d
         ||         d
         k    r n_|                    d
           |d
z  }t1          |          } | r2|d
k    r]|rt1          ||           } t7          ||            |||         d         ||         d
         | |d         d
         z  z
            z  ||<   nd
}  |||         d         ||         d
         | |d         d
         z  z
            }!|}"||z   d
z
  }#||#         d         ||#         d
         | |d         d
         z  z
  f}$|$d
         r=||z   t%          |          k     r|!|"z  |$g||||z   <   n% ||$ }$|!|"z  |$z  g||||z   <   n|!|"z  g||||z   <   || z  }|| z  }d}|s|                    |           |d
z  }|r||z   t%          |          k    v|s|S |                    t3          |t%          |                               |D ]$} |||                              ||          ||<   %||}%n||}%nt1          ||          }%g }&)D ]s}|*v r4)|         *|         |%z  z
  }'|&                     |||'                     :|&                     ||                    ||          )|                              t|r|st7          ||          g|&z   }&| |j        |& z   |j        | z  S )Nr   r   )multiplicity)	powdenestr$  c                     ddl m} | j        st          | |          r|                                 S | t
          j        fS )Nr   )rv  )&sympy.functions.elementary.exponentialrv  r   r   r   r   r/   )r:   rv  s     r%   base_expz Mul._eval_subs.<locals>.base_exp  sK     CBBBBBx ':a-- '}}&ae8Or$   c                 v   t          t                    g }}t                              |           D ]} 	|          } |          \  }}|t          j        ur,|                                \  }}t          |||z            }|}|j        r||xx         |z  cc<   m|	                    ||g           ||fS )zbreak up powers of eq when treated as a Mul:
                   b**(Rational*e) -> b**e, Rational
                commutatives come back as a dictionary {b**e: Rational}
                noncommutatives come back as a list [(b**e, Rational)]
            )
r   rL  r4   r   r   r/   rP   rv   r"   r3   )
eqr;   r<   r:   rb   ri   r9   r  r`  r]  s
           r%   breakupzMul._eval_subs.<locals>.breakup  s     #3''Q]]2&& 
& 
&IaLL!!AAE>>nn..GRAqtAA# &aDDDAIDDDDIIq!f%%%%r7Nr$   c                 F     |           \  } }t          | ||z            S )z
            Put rational back with exponent; in general this is not ok, but
            since we took it from the exponent for analysis, it's ok to put
            it back.
            ru   )rb   r9   ri   r`  s      r%   rejoinzMul._eval_subs.<locals>.rejoin  s(     Xa[[FQq!B$<<r$   c                 f    |j         | j         z  r| j         |j         z  st          | |z            S dS )zif b divides a in an extractive way (like 1/4 divides 1/2
            but not vice versa, and 2/5 does not divide 1/3) then return
            the integer number of times it divides, else return 0.
            r   )r   rL  )r:   rb   s     r%   ndivzMul._eval_subs.<locals>.ndiv  s7    
 39  AC!#I  1Q3xx1r$   r   TFc                     h | ]
}|d          S rH  r#   r  s     r%   rs   z!Mul._eval_subs.<locals>.<setcomp>  s    ###qad###r$   c                     h | ]
}|d          S rH  r#   r  s     r%   rs   z!Mul._eval_subs.<locals>.<setcomp>  s    /A/A/A!/A/A/Ar$   c              3   `   K   | ](} |                    |                   k    V  )d S rC   r#   )rF   rb   r;   old_cr   s     r%   rG   z!Mul._eval_subs.<locals>.<genexpr>  s@      ==!adttE!H~~-======r$   r{   )r   r   sympy.ntheory.factor_r\  sympy.simplify.powsimpr]  r*  r%  r   r+   r    _subsr   r/   r   extract_multiplicativelyr   r0   r   
differencesetr   re   r3   minr   r   rv   r2   r\  r  )-rI   rn  newr\  r%  rc  re  rg  r   r   rj   self2co_selfco_oldco_xmulr<   old_ncr  co_residualokcdidratrb   old_ec_encdidr   takelimitfailedr  r   ndorW  midirr   domargsri   r`  r;   rk  r]  r   s-                                           @@@@@r%   
_eval_subszMul._eval_subs  s   ======666666444444333333z 	4 8A;  	SXa[1__y|% 9Q<!##::sdSD111t	 	 		 	 	 	 	 	*	  	  	  	  	 	 	 	 x~~1AE>>GGC%%aggc3&7&77E< -{{3,,,}} *Q-! 	'"5 	   !::6BB 	I '%..B!'#,,  		w* 		s6{{a/?/?\\#f++w7788DEE'NNN{{&			T!				 &	!&$,.KKK v;;R  BBZZ#a&&  BB##F###../A/Ab/A/A/ABB 	BBZZ""3q66** 	BB======u===== 	B 	I 		DDC#kkmm  
Ed

44U++,,,2w IIIs88D W	:E3r77^^ ' '11' Ev;;D&AJEFA M:AHB// t 3# 3#A!a%y|vay|33a

441q5	!fQil#C#CDDDDdQh

441q5	!fQil#C#CDDDDAE1155

1FAAc((C %#199# 5&)$nn$'SMM&&Aq$&qE!Hs6!9Q</?$?3A 3A %ABqEE #$C !'r!uQxAqC$*1IaL=1 21 !2 !2A
 #&C "#TAB!#BBrF1I!'A9/ -/ !0A t 
9#$t8c"gg#5#567eQZBqTzNN(.
A67eAgYBqTzNN
 34C%1QX:" % MM!$$$QC  M:AHB//H  I eAs2ww//000 : :A"FBqEN//S99BqEE <BB]BBUD!!B 	= 	=AEzz aD58B;&VVAq\\****VVAFF3$4$4ad;;<<<< 	- 	- d^^$u,E:5:u--jej"o==r$   r   c                 .   ddl m} ddlm ddlm} d g }	 | j        D ]M}|                              \  }	}
|	                              s|	                    ||
f           Gt          t          d |D                       g }|D ]q\  }} z
  |j        r|ndz             }|                    |          }|                                }|||k     r||z
  z  |	                    |           rn# t          t          t           |f$ r t#          t          d	 |D                                 j        rt&          j        fd
| j        D             }ddlm}  | | j        |                                 dd          }|                    |          r| |z            z  }|cY S w xY wt&          j        }d |D             }t3          | D ]H}fd|D             }t5          | \  }}t          |          }|z
  j        r|t9          | |z  z  z  }Ifd|                               rVddlm} ddl m!} 	  |           k    s ||            ||          k    r| |z            z  }|S # |$ r Y nw xY w|| k    ri| |z
  "                    d          t&          j        k    r0dk    r*| #                              }|t&          j        k    r|S | |z            z  }|S )Nr   )	PoleErrorr   )ceiling)Orderc                     |                      |          }|d                             |          r5	 |                     |          }n# t          $ r | t          j        fcY S w xY w|S rO   )as_coeff_exponentr   leadterm
ValueErrorr   r   )r/  r   lts      r%   	coeff_expz$Mul._eval_nseries.<locals>.coeff_exp  su    ''**B!uyy|| ((q))BB! ( ( (<'''(Is   A A#"A#c              3   @   K   | ]}|d          j         |d          V  dS r   Nr   rF   ra   s     r%   rG   z$Mul._eval_nseries.<locals>.<genexpr>  s1      ::a1Q4>:QqT::::::r$   r   logxcdirc              3   @   K   | ]}|d          j         |d          V  dS r  r  r  s     r%   rG   z$Mul._eval_nseries.<locals>.<genexpr>  s1      BBa1Q4>BQqTBBBBBBr$   c           	      Z    g | ]'}|                      z
                       (S )r  )nseries)rF   ra   r  r  r  r   n0r   s     r%   r^   z%Mul._eval_nseries.<locals>.<listcomp>  s9    [[[AAIIa771R4==t$IGG[[[r$   )powsimprv  T)combiner
  c                 6    g | ]}t          j        |          S r#   )rf   r   )rF   r.  s     r%   r^   z%Mul._eval_nseries.<locals>.<listcomp>  s"    :::6v&&:::r$   c                 (    g | ]} |          S r#   r#   )rF   r/  r  r   s     r%   r^   z%Mul._eval_nseries.<locals>.<listcomp>  s%    888DYYtQ''888r$   c                 8   | u rt           j        S | j        rt           j        S | j        r!t          fd| j        D                       S | j        rt          fd| j        D              S | j	        r | j
                  | j        z  S t           j        S )Nc              3   0   K   | ]} |          V  d S rC   r#   rF   r:   
max_degreer   s     r%   rG   z8Mul._eval_nseries.<locals>.max_degree.<locals>.<genexpr>  s/      <<::a++<<<<<<r$   c                 (    g | ]} |          S r#   r#   r  s     r%   r^   z9Mul._eval_nseries.<locals>.max_degree.<locals>.<listcomp>  s%    >>>!ZZ1-->>>r$   )r   r/   is_Atomr   r   maxr+   r   rf   r   rw  rv  )ri   r   r  s    `r%   r  z%Mul._eval_nseries.<locals>.max_degree  s    Avvuy vx =<<<<<QV<<<<<<x @>>>>>qv>>>??x 3!z!&!,,QU226Mr$   )PolynomialError)degreer  r  )$r  r  #sympy.functions.elementary.integersr  sympy.series.orderr  r+   r  r   r3   r  rR  r   r  getnNotImplementedError	TypeErrorr   r  r   r   rm  r  r  r   r   rN  r   r4   is_polynomialsympy.polys.polyerrorsr  sympy.polys.polytoolsr  r\  _eval_as_leading_term)rI   r   r   r  r  r  r  ordsra   r   rv  facsr   n1r5  nsr  resords2facords3coeffspowerspowerr  r  r  r  r  r  r  s    ````                      @@@@r%   _eval_nserieszMul._eval_nseries  s.   ''''''??????,,,,,,	 	 	 	Y % %ZZ]]
syy|| %KKC))))$$::4:::::BD  1WQVAK'>qqQ?@@IIa2DtI<<VVXX>BwwR"WA /IF 	 	 	 BB4BBBBBCCB  V[[[[[[[[[QUQZ[[[D666666')$)T*1133UNNNCwwu~~ &uuQT1~~%JJJ	 f::T:::E? 	/ 	/C88888C888E %[NFFKKE	& /sF|QX..	 	 	 	 	 a   		>>>>>>444444:dA&&!++vvdA&&a../P/P55Aq>>)C 
 #   
 $;;s
  A&&!&00QUU//4/HH<<J55Aq>>!C
s%   C$D C G	G	<J J#"J#c                 B     | j         fd| j        D              S )Nc                 @    g | ]}|                                S )r  )as_leading_term)rF   ra   r  r  r   s     r%   r^   z-Mul._eval_as_leading_term.<locals>.<listcomp>  s.    YYY!1,,QT,EEYYYr$   r  r+   )rI   r   r  r  s    ```r%   r  zMul._eval_as_leading_term  s1    tyYYYYYYtyYYYZZr$   c                 4     | j         d | j        D              S )Nc                 6    g | ]}|                                 S r#   )r  r  s     r%   r^   z'Mul._eval_conjugate.<locals>.<listcomp>  s     <<<Q1;;==<<<r$   r  r  s    r%   _eval_conjugatezMul._eval_conjugate  s"    ty<<$)<<<==r$   c                 F     | j         d | j        d d d         D              S )Nc                 6    g | ]}|                                 S r#   )	transposer  s     r%   r^   z'Mul._eval_transpose.<locals>.<listcomp>  s     BBBQ1;;==BBBr$   r{   r  r  s    r%   _eval_transposezMul._eval_transpose  s,    tyBB$)DDbD/BBBCCr$   c                 F     | j         d | j        d d d         D              S )Nc                 6    g | ]}|                                 S r#   )adjointr  s     r%   r^   z%Mul._eval_adjoint.<locals>.<listcomp>  s     @@@1199;;@@@r$   r{   r  r  s    r%   _eval_adjointzMul._eval_adjoint  s,    ty@@	$$B$@@@AAr$   c                     t           j        }g }| j        D ]D}|                    ||          \  }}||z  }|t           j        ur|                    |           E| | j        | fS )aU  Return the tuple (R, self/R) where R is the positive Rational
        extracted from self.

        Examples
        ========

        >>> from sympy import sqrt
        >>> (-3*sqrt(2)*(2 - 2*sqrt(2))).as_content_primitive()
        (6, -sqrt(2)*(1 - sqrt(2)))

        See docstring of Expr.as_content_primitive for more examples.
        )radicalclear)r   r/   r+   as_content_primitiver3   r  )rI   r  r  coefr+   r:   r;   r   s           r%   r  zMul.as_content_primitive  sw     u 	 	A))')GGDAqAID~~A YTY%%%r$   c                 n    |                                  \  }}|                    fd           ||z   S )a  Transform an expression into an ordered list of factors.

        Examples
        ========

        >>> from sympy import sin, cos
        >>> from sympy.abc import x, y

        >>> (2*x*y*sin(x)*cos(x)).as_ordered_factors()
        [2, x, y, sin(x), cos(x)]

        c                 0    |                                S )N)order)sort_key)r+  r  s    r%   r   z(Mul.as_ordered_factors.<locals>.<lambda>'  s    DMMM$>$> r$   r'   )r1   r)   )rI   r  cpartncparts    `  r%   as_ordered_factorszMul.as_ordered_factors  s>     v

>>>>
???v~r$   c                 D    t          |                                           S rC   )r   r  r  s    r%   _sorted_argszMul._sorted_args*  s    T,,..///r$   )F)Tr5  rC   rH  rO   )FT)Qr   r   r   __doc__	__slots__tTupler   __annotations__r   
_args_typer   rH   propertyrD   rM   rS   classmethodr   r   r   r   r   r   r   rP   rc   r   staticmethodr  r(  r6  rK  ra  rg  rd  rl  rm  r}  r~  r  r  rc  r  r   r   r  r  r  r  _eval_is_commutativer  r  r  r  r  r  r  r"  r&  r%  r/  r3  r6  r2  rC  rG  rF  rO  rT  rW  rZ  r  r  r  r  r  r  r  r  r  __classcell__)rX  s   @r%   r4   r4   [   sg        D DJ I
s
FJ%~&;NNN1 1 X16 6 6
: : : I. I. [I.V  8 " " ["    6 6 X6 9 9 W9< +/ 
 
 
 
 W
    5: 5: 5: 5:n $ $ \$$) ) )V 	# 	# W	#     W>    ! ! ! !@   \ ( ( ( \(T < < \< 2 2 \2h & & \& E E \E
 ', ', \',R  6 6 6% % %I I IP P P- - -M M M- -  A( A( A(F
 
 

 
 
    L! L! L!\F F F
* * *( ( (T/ / /. . ./ / /  (  % % %$! ! !F& & &  <
 
 
  "F> F> F>PY Y Y Yv[ [ [ [> > >D D DB B B& & & &4   " 0 0 X0 0 0 0 0r$   r4   mulc                 8    t          t          j        | |          S )a  Return product of elements of a. Start with int 1 so if only
       ints are included then an int result is returned.

    Examples
    ========

    >>> from sympy import prod, S
    >>> prod(range(3))
    0
    >>> type(_) is int
    True
    >>> prod([S(2), 3])
    6
    >>> _.is_Integer
    True

    You can start the product at something other than 1:

    >>> prod([1, 2], 3)
    6

    )r   operatorr  )r:   starts     r%   rS  rS  1  s    . (,5)))r$   TFc                      j         s|j         r |c} n |z  S |t          j        u r S  t          j        u r|S  t          j        u r|s| S |j        r||sh j        ra j        dk    rVd |j        D             } fd|D             }t          d |D                       rt          j
        d |D                       S t           |d          S |j        rt          |j                  }|d         j         r2|dxx          z  cc<   |d         dk    r|                    d           n|                    d            t          
                    |          S  |z  }|j         r#|j         st          
                     |f          }|S )	a  Return ``coeff*factors`` unevaluated if necessary.

    If ``clear`` is False, do not keep the coefficient as a factor
    if it can be distributed on a single factor such that one or
    more terms will still have integer coefficients.

    If ``sign`` is True, allow a coefficient of -1 to remain factored out.

    Examples
    ========

    >>> from sympy.core.mul import _keep_coeff
    >>> from sympy.abc import x, y
    >>> from sympy import S

    >>> _keep_coeff(S.Half, x + 2)
    (x + 2)/2
    >>> _keep_coeff(S.Half, x + 2, clear=False)
    x/2 + 1
    >>> _keep_coeff(S.Half, (x + 2)*y, clear=False)
    y*(x + 2)/2
    >>> _keep_coeff(S(-1), x + y)
    -x - y
    >>> _keep_coeff(S(-1), x + y, sign=True)
    -(x + y)
    r   c                 6    g | ]}|                                 S r#   )rc   r  s     r%   r^   z_keep_coeff.<locals>.<listcomp>s  s"    ;;;ANN$$;;;r$   c                 :    g | ]\  }}t          |          |fS r#   r[   )rF   r;   r   r   s      r%   r^   z_keep_coeff.<locals>.<listcomp>t  s,    @@@41a[E**A.@@@r$   c              3   *   K   | ]\  }}|j         V  d S rC   )r   )rF   r;   r  s      r%   rG   z_keep_coeff.<locals>.<genexpr>u  s(      11DAq1<111111r$   c                 n    g | ]2}t                               |d          dk    r
|dd         n|          3S )r   r   N)r4   r5   r  s     r%   r^   z_keep_coeff.<locals>.<listcomp>v  sQ     '> '> '>34 (+~~qTQYYAabbEEA(/ (/ '> '> '>r$   FrX   r   )r    r   r/   rR   r   r   r   r+   r   rf   r5   r4   r   r.   r0   r6   )r   factorsr  r   r+   r  r   s   `      r%   r\   r\   K  s   6 ? ! 	!"GNGUU= !%~~	!-			x	  	?* 	?uw!||;;gl;;;D@@@@4@@@D11D11111 ?~ '> '>8<'> '> '> ? ? ?5'E2222	 W\""8 	#!HHHHHHQx1}}		!LLE"""~~e$$$'M; 	1w0 	1w/00Ar$   c                 (    d }t          | |          S )Nc                     | j         r?|                                 \  }j        r!|j        rt	          fd|j        D              S | S )Nc                     g | ]}|z  S r#   r#   )rF   rir;   s     r%   r^   z+expand_2arg.<locals>.do.<locals>.<listcomp>  s    )@)@)@2!B$)@)@)@r$   )r   rc   r    r   _unevaluated_Addr+   )ri   r   r;   s     @r%   r  zexpand_2arg.<locals>.do  s]    8 	B>>##DAq{ Bqx B')@)@)@)@)@)@)@AAr$   r   )ri   r  s     r%   expand_2argr    s#       Qr$   )r   ru   )rf   r  rj  )TF)4typingr   r  collectionsr   	functoolsr   	itertoolsr   r  r   basicr	   r
   	singletonr   
operationsr   r   cacher   intfuncr   r   logicr   r   r+  r   
parametersr   rD   r   	traversalr   sympy.utilities.iterablesr   r   r,   r=   r4   r  rS  r\   r  r   r   r  rv   addrf   r  r#   r$   r%   <module>r     sP   " " " " " " # # # # # #                    ' ' ' ' ' ' ' '       2 2 2 2 2 2 2 2       . . . . . . . . * * * * * * * *       ) ) ) ) ) )                         * * * * * *       ! ! !
3# 3# 3#lQ0 Q0 Q0 Q0 Q0$ Q0 Q0 Q0f> * * * *4; ; ; ;z               & & & & & & & & & &r$   