
    Qia5                      d dl 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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/m0Z0 dd!l1m2Z2 dd"l3m4Z4m5Z5 dS )%    )annotations)TYPE_CHECKINGClassVar)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     f/var/www/development/aibuddy-work/election-extract/venv/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                    g }g }t          |           } t          j        }| D ]}|j        rB|                                \  }}|                     |           |                    |           K|j        r||z  }X|j        r|                    |           u|                    |           t          |           |t          j        ur|
                    d|           t                              ||z             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   Oner!   args_cncextendr"   r$   appendr.   insertMul
_from_args)r-   cargsncargscoaa_ca_ncs          r'   _unevaluated_Mulr>   '   s    > EF::D	
B 
 
8 		

ICKKMM$[ 	!GBB 	LLOOOOMM!UOOO	Q>>%,'''r&   c                      e Zd ZU dZdZdZeZ edd          Z	de
d<   ed             Zerdd	dVdZedWd            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dXdZdYdZed              Zd! Zed"             Z e fd#            Z!d$ Z"d% Z#dZd'Z$ed(             Z%ed[d)            Z&ed*             Z'ed+             Z(ed,             Z)ed-             Z*ed.             Z+d/ Z,d0 Z-d1 Z.d2 Z/d3 Z0d4 Z1d5 Z2d6 Z3d7 Z4d8 Z5d9 Z6d: Z7d; Z8d< Z9d= Z:d> Z;d? Z<d@ Z=dA Z>dB Z?dC Z@dD ZAdE ZBdF ZCdG ZDdH ZEdI ZFdJ ZGdK ZHdL ZId\dNZJdO ZKdP ZLdQ ZMdR ZNd]dSZOd[dTZPedU             ZQ xZRS )^r6   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%   TMul_kind_dispatcher)commutativezClassVar[Expr]identityc                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'   rF   zMul.kind   s'    //TY///	$t$i00r&   evaluater-   Expr | complexrN   boolreturnr   c                   d S rE   r%   )clsrN   r-   s      r'   __new__zMul.__new__   s    Cr&   tuple[Expr, ...]c                    d S rE   r%   rK   s    r'   r-   zMul.args   s    Cr&   c                J    | |  k    rdS | j         d         }|j        o|j        S )NFr   )r-   r"   is_extended_negative)rK   cs     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   ComplexInfinityr1   r"   r0   NegativeOner7   r$   )rK   rZ   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s4sEt5          |t                    r0t9          d	 |j        D                       rt          j        gg dfc S |t          j        u r|t          j        z  }|j        r|                                \  3}|j         rŉ3j        r|j        r|j!        r4tE          3|          z  4(|j#        r%|                    tE          3|                     T3j#        r||z  }3 33t          j        ur)|$                    3g                               |           3j%        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
 } ||          } ||          }tS          d          D ]G}g }d}|D ]\  3}|j        r_3j
        s3j        rPt9          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?tE          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4tE          3|          z  4)|j.        |j-        k    rEt_          |j.        |j-                  \  }#}$4tE          3|#          z  4ta          |$|j-                  }|"                    3|f           ~!tc          td                    }%d}|t	          |"          k     r|"|         \  }}&|dk    r|dz  }+g }'tS          |dz   t	          |"                    D ]}(|"|(         \  })}*|3                    |)          }+|+t          j        ur|&|*z   }|j-        dk    r4tE          |+|          z  4nl|j.        |j-        k    rEt_          |j.        |j-                  \  }#}$4tE          |+|#          z  4ta          |$|j-                  }|'                    |+|f           |)|+z  |*f|"|(<   ||+z  }|t          j        u r n|t          j        urutE          ||&          },|,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|                    tE          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        rPt9          1fd|	D                       r4g|	|fS t9          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   FrM   c                0    g | ]}t          |          S r%   _keep_coeff)rH   bir;   s     r'   
<listcomp>zMul.flatten.<locals>.<listcomp>1  s#    $I$I$IB[B%7%7$I$I$Ir&   c              3     K   | ]F}t                               |          D ])}|t          j        t          j        t          j        fv V  *Gd S rE   )r6   	make_argsr   NegativeInfinityr_   Infinity)rH   ___s      r'   rI   zMul.flatten.<locals>.<genexpr>  su       :A :AcmmB.?.?:A :A)* !,a.?LL:A :A :A :A :A :A :Ar&   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%   )rH   trZ   bs      r'   rj   z0Mul.flatten.<locals>._gather.<locals>.<listcomp>  s%    $D$D$D$!Qa1X$D$D$Dr&   )as_coeff_Mul
setdefaultr4   itemsAddr3   )	c_powerscommon_ber:   ddilinew_c_powersrt   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 rE   r,   )rH   inftyrt   s     r'   rI   zMul.flatten.<locals>.<genexpr>  s=       6; 6;! 7<qvo 6; 6; 6; 6; 6; 6;r&   Tc                    h | ]\  }}|S r%   r%   )rH   rt   r{   s      r'   	<setcomp>zMul.flatten.<locals>.<setcomp>+  s)      0  0  0!QA 0  0  0r&   c                8    g | ]\  }}|t          ||          S r%   PowrH   r{   rt   s      r'   rj   zMul.flatten.<locals>.<listcomp>;  s)    GGGTQQGs1ayyGGGr&   r	   c                4    g | ]\  }}t          ||          S r%   r   r   s      r'   rj   zMul.flatten.<locals>.<listcomp>  s$    :::TQs1ayy:::r&   c                l    g }| D ],}|j         r
|j        r|dz  }|                    |           -||fS N)is_extended_positiverY   r4   )c_part
coeff_sign
new_c_partrs   s       r'   _handle_for_ooz#Mul.flatten.<locals>._handle_for_oo  s^    
 ) )A- ! - !"b(
 %%a((((!:--r&   c                H    g | ]}t          |j                  r|j        | S rE   r   is_zerois_extended_realrH   rZ   s     r'   rj   zMul.flatten.<locals>.<listcomp>  s?     Q Q QA	!)0D0D Q010B0N 0N0N0Nr&   c                H    g | ]}t          |j                  r|j        | S rE   r   r   s     r'   rj   zMul.flatten.<locals>.<listcomp>  s?     S S SQ)AI2F2F S232D2P 2P2P2Pr&   c              3  8   K   | ]}t          |          V  d S rE   )
isinstance)rH   rZ   rd   s     r'   rI   zMul.flatten.<locals>.<genexpr>  s-      >>:a,,>>>>>>r&   c              3  ,   K   | ]}|j         d k    V  dS FN	is_finiter   s     r'   rI   zMul.flatten.<locals>.<genexpr>  s)      88A1;%'888888r&   c                    g | ]}|z  S r%   r%   )rH   fcoeffs     r'   rj   zMul.flatten.<locals>.<listcomp>  s    <<<E!G<<<r&   ):!sympy.calculus.accumulationboundsrc   sympy.matrices.expressionsrd   lenis_Rationalr   r1   r   ru   is_Addr   
distributer$   rx   r-   Zeror    as_expr_variablesr!   r3   r4   r   r"   NaNr_   r   __mul__anyImaginaryUnitHalfas_base_expis_Pow
is_Integerr   is_negativerv   is_positive
is_integerpopr5   rangern   rm   rw   qpdivmodRationalr   r0   gcdr6   rl   as_numer_denomr`   r.   r   )5rS   seqrc   rvrararbnewbr   nc_partnc_seqry   num_expneg1epnum_ratorder_symbolsor   r{   o1b1e1b2e2new_expo12r   ir   changedr   ri   inv_exp_dictcomb_enum_rate_ieppneweigrowjbjejgobjnr   r   _newrd   r;   rt   r   s5                                                    @@@@r'   flattenzMul.flatten   s   ^ 	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- 	       }	0 }	0Az F#$#6#6}#E#E = x w0# *JJqv&&&& V - -+ -JJqMMMM"MM!,,,, JJy)))  d0::!*;!;!;	!;E7B,,,,_ 1
5+(F(F 1QJE~~ !wD0000A{++ Y0		%((a''' -E7B,,,,) N0z!S11 N0c :A :Af:A :A :A 7A 7A N0 wD((((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 )FrM   r   )rH   rt   expts     r'   rj   z#Mul._eval_power.<locals>.<listcomp>  s(    EEE!Qu555EEEr&   rM   re   r	   r   sign)r2   r   r6   r   r7   r   r   is_imaginaryas_real_imagabsr   r   $sympy.functions.elementary.complexesr   r
   r>   r   r   r   is_Float_eval_expand_power_base)rK   r   r8   ncr;   r   r|   rs   r   r   r   s    `         r'   _eval_powerzMul._eval_power  s    MM%M00	r? 	>EEEEuEEEFCNN2&&u===> > 	f!  
f%%''*= fqs882244DAq*1a00DAq f.q!441 fQQQQQQ '

1A#3AtvIDDGGAOD[@[^b^d?d#e#eedU+++ 	/t} 	/,,...r&   c                    dd| j         fS )N   r   )r   rS   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 rE   )ru   r   r`   r!   r   _eval_evalf	is_numberexpand)rK   precrZ   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   ru   r   r   AttributeError_mpf_)rK   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	   re   r   N)r-   r   r   r1   _new_rawargs)rK   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 rE   )has)xdepss    r'   <lambda>z"Mul.as_coeff_mul.<locals>.<lambda>B  s    uqud| r&   T)binaryr   r	   )
r   r-   r  tupler"   r   rY   r   r`   r1   )rK   r  r  kwargsl1l2r-   s     `    r'   r^   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  rY   r   r`   r1   )rK   r  r   r-   s       r'   ru   zMul.as_coeff_MulL  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rere   ignorer	   )
expand_mulF)deep)r   r  r  r  r   r1   r-   r   r   r4   r   r$   	conjugate	enumerater   funcgetr   r   r   functionr  )rK   r  hintsr  r  r  othercoeffrcoeffiaddtermsr;   r   r   aconjr
  r   imcorecor  addreaddims                        r'   r   zMul.as_real_imag\  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   Nre   c                :    g | ]}D ]}t          ||          S r%   )r6   )rH   r;   rt   rights      r'   rj   z#Mul._expandsums.<locals>.<listcomp>  s.    888q%88QQ8888r&   )r   r-   r6   _expandsumsrx   rl   )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)rH   r   r  s     r'   rj   z(Mul._eval_expand_mul.<locals>.<listcomp>  sI     ! ! ! 458B&A&///// ! ! !r&   Tr  c              3  $   K   | ]}|j         V  d S rE   )r   rG   s     r'   rI   z'Mul._eval_expand_mul.<locals>.<genexpr>  s$      'A'AQ'A'A'A'A'A'Ar&   )sympy.simplify.radsimpr4  r  r!   r-   r   r4   r$   r   r  r,  r   r7  rx   )rK   r  r4  exprr   r|   plainr-  rewritefactorr  r/  r-   termrs   s    `             r'   r7  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 rE   r%   )r
  ys     r'   r  z&Mul._eval_derivative.<locals>.<lambda>  s
    1 r&   r	   )r0   r-   r   r   diffr4   r   r   r1   rx   fromiter)rK   sr-   r/  r   r|   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%   rB  )rH   kargrD  s      r'   rj   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%   rN  )rH   rs   r-   kvalsrD  s     r'   rj   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%   )rH   rO  r   s     r'   rj   z0Mul._eval_derivative_n_times.<locals>.<listcomp>  s    &&&1aAY&&&r&   )r  rG  symbolrH  rI  rJ  r   super_eval_derivative_n_timesr   rK  r-   r   intsympy.ntheory.multinomialrL  r6   zipr4   rx   sympy.concrete.summationsrQ  (sympy.functions.combinatorial.factorialsrR  (sympy.functions.elementary.miscellaneousrS  sumprodmapr   rB  )rK   rD  r   rG  rH  rI  rJ  rK  r   r/  rL  rZ   r   rQ  rR  rS  klastnfactr{   lr-   rU  	__class__s    ``                 @@r'   rZ  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.limitseqri  r-   r6   subs)rK   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   )ru   r6   rl   r   rg  _combine_inversematches)rK   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'   rj   zMul.matches.<locals>.<listcomp>  s    ---q!(s---r&   )r
   r$   _matches_commutativer2   r6   rs  _matches_expand_pows_matches_noncomm)
rK   r:  rt  oldc1nc1c2nc2comm_mul_selfcomm_mul_exprs
             r'   rs  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 r]   )r   expr3   baser4   )arg_listnew_argsrP  s      r'   r{  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_Wildr6   _matches_add_wildcard_matches_new_statesr3   r   )nodestargetsrt  agendastatenode_ind
target_indwildcard_dictnodestates_matches
new_statesnew_matchesmatchs                r'   r|  zMul._matches_noncomm7  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 rE   r%   )
dictionaryr  r  r  beginends         r'   r  zMul._matches_add_wildcardb  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  r6   _matches_match_wilds_matches_get_other_nodesr]  r4   rs  )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_statesk  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   r6   rs  )	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%   )rH   r  ind_noder  s     r'   rj   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	   )rJ  c                    | j         rE|j        r>|                     d          |                                                    d          k    S dS )Nr   F)r   is_comparable__add__evalf)rf  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 rE   )r   r!   rH   r   s     r'   rI   z'Mul._combine_inverse.<locals>.<genexpr>  s+      88qx#18888888r&   Ic                    g | ]
\  }}||z  S r%   r%   rH   rO  vs      r'   rj   z(Mul._combine_inverse.<locals>.<listcomp>       777TQAqD777r&   c                    g | ]
\  }}||z  S r%   r%   r  s      r'   rj   z(Mul._combine_inverse.<locals>.<listcomp>  r  r&   )sympy.simplify.simplifyr  rX  rJ  r   r1   r   r   xreplaceas_powers_dictr   r  keysr   r6   rw   r"   )lhsrhsr  rJ  r  r|   _ii_r;   rt   blenri   r   srvs                 r'   rr  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 rE   )r   r[  r-   r  rw   )rK   r|   r>  rt   r{   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   )rH   r   s     r'   rj   z&Mul.as_numer_denom.<locals>.<listcomp>  s$    #J#J#J1A$4$4$6$6#J#J#Jr&   )r0   r]  r-   r  )rK   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 ]b}|                                \  }}|j        s|dz  }||}n#||k    s|dk    s|j        s| t          j        fc S |                    |           c | j        | |fS )Nr   r	   )r-   r   r$   r   r   r1   r4   r  )rK   r   basesr   r   rt   r{   s          r'   r   zMul.as_base_exp  s     	 	A==??DAq# azbBFF!,FQU{"""LLOOOOty% "$$r&   c                D    t          fd| j        D                       S )Nc              3  B   K   | ]}|                               V  d S rE   )_eval_is_polynomialrH   r>  symss     r'   rI   z*Mul._eval_is_polynomial.<locals>.<genexpr>  s1      HHd4++D11HHHHHHr&   allr-   rK   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 rE   )_eval_is_rational_functionr  s     r'   rI   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 rE   )is_meromorphic)rH   rP  r;   r
  s     r'   rI   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-   )rK   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 rE   )_eval_is_algebraic_exprr  s     r'   rI   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 rE   )r$   rG   s     r'   rI   zMul.<lambda>.<locals>.<genexpr>  s6       5- 5-5- 5- 5- 5- 5- 5-r&   r  rW   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 rE   )
is_complexrG   s     r'   rI   z'Mul._eval_is_complex.<locals>.<genexpr>  s$      <<QAL<<<<<<r&   Fc              3  $   K   | ]}|j         V  d S rE   )is_infiniterG   s     r'   rI   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   rG   s     r'   rI   z'Mul._eval_is_complex.<locals>.<genexpr>  s)      AA!qy-AAAAAAr&   )r   r-   r   )rK   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  )rK   	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  rK   r  r  s      r'   _eval_is_zerozMul._eval_is_zeroS  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_infinite_  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 rE   )is_rationalrG   s     r'   rI   z(Mul._eval_is_rational.<locals>.<genexpr>o  s$      ;;A!-;;;;;;r&   Tr  Fc              3  (   K   | ]}|j         d u V  dS r   r  rG   s     r'   rI   z(Mul._eval_is_rational.<locals>.<genexpr>t  )      99!19%999999r&   r   r-   r  rK   r   s     r'   _eval_is_rationalzMul._eval_is_rationaln  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 rE   )is_algebraicrG   s     r'   rI   z)Mul._eval_is_algebraic.<locals>.<genexpr>x  s$      <<Q!.<<<<<<r&   Tr  Fc              3  (   K   | ]}|j         d u V  dS r   r  rG   s     r'   rI   z)Mul._eval_is_algebraic.<locals>.<genexpr>}  r  r&   r  r  s     r'   _eval_is_algebraiczMul._eval_is_algebraicw  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 )NFTre   c                4    t          d | D                       S )Nc              3  $   K   | ]}|j         V  d S rE   )is_oddr  s     r'   rI   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 rE   is_evenr  s     r'   rI   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 rE   r  r  s     r'   rI   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 rE   )r   r1   )rH   rp   r  s     r'   rI   z'Mul._eval_is_integer.<locals>.<genexpr>  s@       37 37$%a37 37 37 37 37 37r&   rN   r   c                P    g | ]#}|j         	|                                d          $S ry  r  r   r  s     r'   rj   z(Mul._eval_is_integer.<locals>.<listcomp>  s;     1 1 1&'i1!--//!, 1 1 1r&   c                P    g | ]#}|j         	|                                d          $S ry  r  r  s     r'   rj   z(Mul._eval_is_integer.<locals>.<listcomp>  s;     3 3 3()	3!--//!, 3 3 3r&   )r  r-   r   r   r   r1   r4   r   r   r   r   r   r   r   r`   r   r   
relationalr  r  r6   r   r   r  rx   r   r   is_nonnegative)rK   r  
numeratorsdenominatorsunknownr;   hitr   r|   rt   r{   alloddallevenanyevenr  s                 @r'   _eval_is_integerzMul._eval_is_integer  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 rE   )is_polarrH   rP  s     r'   rI   z%Mul._eval_is_polar.<locals>.<genexpr>  s$      ::::::::r&   c              3  2   K   | ]}|j         p|j        V  d S rE   )r+  r   r,  s     r'   rI   z%Mul._eval_is_polar.<locals>.<genexpr>  s+      EEC/EEEEEEr&   )r   r-   r  )rK   	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_imagrW   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 rE   r   rG   s     r'   rI   z&Mul._eval_real_imag.<locals>.<genexpr>  s$      >>qq{>>>>>>r&   T)r-   r  r  r   r   r   r  )rK   realzerot_not_re_imrs   zs         r'   r2  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   rG   s     r'   rI   z)Mul._eval_is_imaginary.<locals>.<genexpr>  s0      EEaqyE!1akEEEEEEr&   F)r  r-   r2  rW   s    r'   _eval_is_imaginaryzMul._eval_is_imaginary  sA    EE49EEEEE 	/''...	/ 	/r&   c                ,    |                      d          S r1  _eval_herm_antihermrW   s    r'   _eval_is_hermitianzMul._eval_is_hermitian  s    ''---r&   c                ,    |                      d          S NFr>  rW   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  )rK   hermrs   r   s       r'   r?  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   rH   r
  s     r'   rI   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 rE   )is_realrJ  s     r'   rI   z*Mul._eval_is_irrational.<locals>.<genexpr>,  s$      ,,Qqy,,,,,,r&   F)r-   is_irrationalr0   remover  )rK   rs   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_negrW   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 rE   r   rG   s     r'   rI   z$Mul._eval_pos_neg.<locals>.<genexpr>I  s$      66qq{666666r&   Tr	   r   )	r-   r   rY   r   r  is_extended_nonpositiveis_extended_nonnegativer   r   )rK   r   saw_NONsaw_NOTrs   s        r'   rS  zMul._eval_pos_negA  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 r   rR  rW   s    r'   _eval_is_extended_negativezMul._eval_is_extended_negatived  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   r3  c                P    g | ]#}|j         	|                                d          $S ry  r  r  s     r'   rj   z$Mul._eval_is_odd.<locals>.<listcomp>q  ;     3 3 3Q()	3ammooa( 3 3 3r&   F)Tr	   r	   )r(  r9  r4  r   r  rx   r6   rl   r   r   r   r-   r   r   r1   r  )rK   r   r4  r   r|   r   accrs   s           r'   _eval_is_oddzMul._eval_is_oddg  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   r3  c                P    g | ]#}|j         	|                                d          $S ry  r  r  s     r'   rj   z%Mul._eval_is_even.<locals>.<listcomp>  r_  r&   F)
r9  r4  r   r  rx   r6   rl   r   r   r   )rK   r4  r   r|   s       r'   _eval_is_evenzMul._eval_is_even  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   )rK   number_of_argsrP  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)	powdenestr3  c                    ddl m} | j        st          | |          r|                                 S | t
          j        fS )Nr   )r  )&sympy.functions.elementary.exponentialr  r   r   r   r   r1   )r;   r  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   r[  r6   rl   r   r1   r^   r   r$   r4   )
eqrZ   r   r;   rt   r{   r:   rp   rm  rj  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.
            r   )rt   r:   r{   rm  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   r[  )r;   rt   s     r'   ndivzMul._eval_subs.<locals>.ndiv  s7    
 39  AC!#I  1Q3xx1r&   r	   TFc                    h | ]
}|d          S rW  r%   r  s     r'   r   z!Mul._eval_subs.<locals>.<setcomp>  s    ###qad###r&   c                    h | ]
}|d          S rW  r%   r  s     r'   r   z!Mul._eval_subs.<locals>.<setcomp>  s    /A/A/A!/A/A/Ar&   c              3  `   K   | ](} |                    |                   k    V  )d S rE   r%   )rH   rt   rZ   old_cr   s     r'   rI   z!Mul._eval_subs.<locals>.<genexpr>$  s@      ==!adttE!H~~-======r&   r   )r   r   sympy.ntheory.factor_ri  sympy.simplify.powsimprj  r9  r4  r!   r-   r"   _subsr   r1   r   extract_multiplicativelyr   r   r   
differencesetr   rw   r4   minr   rn   r   r3   rk  r  )-rK   r}  newri  r4  rp  rr  rt  r   r   r|   self2co_selfco_oldco_xmulr   old_ncr  co_residualokcdidratrt   old_ec_encdidr   takelimitfailedr$  r   ndorf  midirr   domargsr{   rm  rZ   rx  rj  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 r]   )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   rH   rs   s     r'   rI   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'   rI   z$Mul._eval_nseries.<locals>.<genexpr>  s1      BBa1Q4>BQqTBBBBBBr&   c           	     Z    g | ]'}|                      z
                       (S )r  )nseries)rH   rs   r  r  r  r   n0r
  s     r'   rj   z%Mul._eval_nseries.<locals>.<listcomp>  s9    [[[AAIIa771R4==t$IGG[[[r&   )powsimpr  T)combiner  c                6    g | ]}t          j        |          S r%   )rx   rl   )rH   r=  s     r'   rj   z%Mul._eval_nseries.<locals>.<listcomp>  s"    :::6v&&:::r&   c                (    g | ]} |          S r%   r%   )rH   r>  r  r
  s     r'   rj   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 rE   r%   rH   r;   
max_degreer
  s     r'   rI   z8Mul._eval_nseries.<locals>.max_degree.<locals>.<genexpr>  s/      <<::a++<<<<<<r&   c                (    g | ]} |          S r%   r%   r  s     r'   rj   z9Mul._eval_nseries.<locals>.max_degree.<locals>.<listcomp>  s%    >>>!ZZ1-->>>r&   )r   r1   is_Atomr   r   maxr-   r!   rx   r   r  r  )r{   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	  r4   r  ra  r   r  getnNotImplementedError	TypeErrorr
   r   r   r   rz  r  r  r   r   r]  r   r6   is_polynomialsympy.polys.polyerrorsr  sympy.polys.polytoolsr  rk  _eval_as_leading_term)rK   r
  r   r  r  r  r  ordsrs   r   r  facsr   n1rD  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)rH   rs   r  r  r
  s     r'   rj   z-Mul._eval_as_leading_term.<locals>.<listcomp>  s.    YYY!1,,QT,EEYYYr&   r  r-   )rK   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'   rj   z'Mul._eval_conjugate.<locals>.<listcomp>	  s     <<<Q1;;==<<<r&   r  rW   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'   rj   z'Mul._eval_transpose.<locals>.<listcomp>  s     BBBQ1;;==BBBr&   r   r  rW   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'   rj   z%Mul._eval_adjoint.<locals>.<listcomp>  s     @@@1199;;@@@r&   r   r  rW   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   r1   r-   as_content_primitiver4   r  )rK   r  r  coefr-   r;   rZ   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>9  s    DMMM$>$> r&   r)   )r2   r+   )rK   r  cpartncparts    `  r'   as_ordered_factorszMul.as_ordered_factors+  s>     v

>>>>
???v~r&   c                D    t          |                                           S rE   )r  r  rW   s    r'   _sorted_argszMul._sorted_args<  s    T,,..///r&   )r-   rO   rN   rP   rQ   r   )rQ   rU   )F)TrB  rE   rW  )FT)Sr   r   r   __doc__	__slots__r!   r   
_args_typer   rJ   __annotations__propertyrF   r   rT   r-   r[   ra   classmethodr   r   r   r   r  r   r  r^   ru   r   staticmethodr,  r7  rE  rZ  rp  rv  rs  r{  r|  r  r  r  r  rr  r  r   r   r  r  r  r  _eval_is_commutativer  r  r  r  r  r  r(  r/  r3  r2  r<  r@  rC  r?  rP  rT  rS  r\  ra  rd  rg  r  r  r  r  r  r  r  r  r  __classcell__)rg  s   @r'   r6   r6   [   s        D DJ IFJ%~&;NNN1 1 X1  ?C 	 	 	 	 	 	 
	 	 	 
	6 6 6: : : Q. Q. [Q.f  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&   r6   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'   rb  rb  C  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%   )ru   r  s     r'   rj   z_keep_coeff.<locals>.<listcomp>  s"    ;;;ANN$$;;;r&   c                :    g | ]\  }}t          |          |fS r%   rg   )rH   rZ   r   r   s      r'   rj   z_keep_coeff.<locals>.<listcomp>  s,    @@@41a[E**A.@@@r&   c              3  *   K   | ]\  }}|j         V  d S rE   )r   )rH   rZ   rp   s      r'   rI   z_keep_coeff.<locals>.<genexpr>  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)r6   r7   r  s     r'   rj   z_keep_coeff.<locals>.<listcomp>  sQ     '> '> '>34 (+~~qTQYYAabbEEA(/ (/ '> '> '>r&   FrM   r   )r"   r   r1   r`   r   r   r   r-   r   rx   r7   r6   r!   r0   r   r5   )r   factorsr  r   r-   r  r   s   `      r'   rh   rh   ]  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%   )rH   rirZ   s     r'   rj   z+expand_2arg.<locals>.do.<locals>.<listcomp>  s    )@)@)@2!B$)@)@)@r&   )r!   ru   r"   r   _unevaluated_Addr-   )r{   r   rZ   s     @r'   r  zexpand_2arg.<locals>.do  s]    8 	B>>##DAq{ Bqx B')@)@)@)@)@)@)@AAr&   r   )r{   r  s     r'   expand_2argr    s#       Qr&   )r   r   )rx   r  ry  )TF)6
__future__r   typingr   r   collectionsr   	functoolsr   	itertoolsr   r  r
   basicr   r   	singletonr   
operationsr   r   cacher   intfuncr   r   logicr   r   r:  r   
parametersr   rF   r   	traversalr   sympy.utilities.iterablesr   r   r.   r>   r6   r  rb  rh   r  r   r   r  r   addrx   r  r%   r&   r'   <module>r     sh   " " " " " " * * * * * * * * # # # # # #                    ' ' ' ' ' ' ' '       2 2 2 2 2 2 2 2       . . . . . . . . * * * * * * * *       ) ) ) ) ) )                         * * * * * *
       ! ! !
1( 1( 1(hc0 c0 c0 c0 c0$ c0 c0 c0J? * * * *4; ; ; ;z               & & & & & & & & & &r&   