
    Ed^                       d Z ddlmZmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ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#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z6m7Z8m9Z9 ddl:m;Z;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE eAe.fd            ZFeAe.fd            ZGeAe.fd            ZHeAd             ZId ZJi ZK G d d e?e          ZL G d! d"e&e?eeM          ZNd#S )$zSparse polynomial rings.     )AnyDict)addmulltlegtge)reduce)GeneratorType)Expr)igcdoo)Symbolsymbols)CantSympifysympify)multinomial_coefficients)IPolys)construct_domain)dmp_to_dictdmp_from_dict)DomainElementPolynomialRingheugcd)MonomialOps)lex)CoercionFailedGeneratorsErrorExactQuotientFailedMultivariatePolynomialError)DomainOrderbuild_options)expr_from_dict_dict_reorder_parallel_dict_from_expr)DefaultPrinting)public)is_sequence)pollutec                 :    t          | ||          }|f|j        z   S )a  Construct a polynomial ring returning ``(ring, x_1, ..., x_n)``.

    Parameters
    ==========

    symbols : str
        Symbol/Expr or sequence of str, Symbol/Expr (non-empty)
    domain : :class:`~.Domain` or coercible
    order : :class:`~.MonomialOrder` or coercible, optional, defaults to ``lex``

    Examples
    ========

    >>> from sympy.polys.rings import ring
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.orderings import lex

    >>> R, x, y, z = ring("x,y,z", ZZ, lex)
    >>> R
    Polynomial ring in x, y, z over ZZ with lex order
    >>> x + y + z
    x + y + z
    >>> type(_)
    <class 'sympy.polys.rings.PolyElement'>

    PolyRinggensr   domainorder_rings       1lib/python3.11/site-packages/sympy/polys/rings.pyringr7   #   s$    8 Wfe,,E8ej      c                 6    t          | ||          }||j        fS )a  Construct a polynomial ring returning ``(ring, (x_1, ..., x_n))``.

    Parameters
    ==========

    symbols : str
        Symbol/Expr or sequence of str, Symbol/Expr (non-empty)
    domain : :class:`~.Domain` or coercible
    order : :class:`~.MonomialOrder` or coercible, optional, defaults to ``lex``

    Examples
    ========

    >>> from sympy.polys.rings import xring
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.orderings import lex

    >>> R, (x, y, z) = xring("x,y,z", ZZ, lex)
    >>> R
    Polynomial ring in x, y, z over ZZ with lex order
    >>> x + y + z
    x + y + z
    >>> type(_)
    <class 'sympy.polys.rings.PolyElement'>

    r/   r2   s       r6   xringr:   B   s"    8 Wfe,,E5:r8   c                 p    t          | ||          }t          d |j        D             |j                   |S )a  Construct a polynomial ring and inject ``x_1, ..., x_n`` into the global namespace.

    Parameters
    ==========

    symbols : str
        Symbol/Expr or sequence of str, Symbol/Expr (non-empty)
    domain : :class:`~.Domain` or coercible
    order : :class:`~.MonomialOrder` or coercible, optional, defaults to ``lex``

    Examples
    ========

    >>> from sympy.polys.rings import vring
    >>> from sympy.polys.domains import ZZ
    >>> from sympy.polys.orderings import lex

    >>> vring("x,y,z", ZZ, lex)
    Polynomial ring in x, y, z over ZZ with lex order
    >>> x + y + z # noqa:
    x + y + z
    >>> type(_)
    <class 'sympy.polys.rings.PolyElement'>

    c                     g | ]	}|j         
S  )name).0syms     r6   
<listcomp>zvring.<locals>.<listcomp>}   s    1113ch111r8   )r0   r-   r   r1   r2   s       r6   vringrB   a   s=    6 Wfe,,E11%-1115:>>>Lr8   c                 (  
 d}t          |           s| gd}} t          t          t          |                     } t	          ||          }t          | |          \  }}|j        ^t          d |D             g           }t          ||          \  |_        }t          t          ||                    

fd|D             }t          |j        |j        |j                  }t          t          |j        |                    }	|r
||	d         fS ||	fS )ad  Construct a ring deriving generators and domain from options and input expressions.

    Parameters
    ==========

    exprs : :class:`~.Expr` or sequence of :class:`~.Expr` (sympifiable)
    symbols : sequence of :class:`~.Symbol`/:class:`~.Expr`
    options : keyword arguments understood by :class:`~.Options`

    Examples
    ========

    >>> from sympy import sring, symbols

    >>> x, y, z = symbols("x,y,z")
    >>> R, f = sring(x + 2*y + 3*z)
    >>> R
    Polynomial ring in x, y, z over ZZ with lex order
    >>> f
    x + 2*y + 3*z
    >>> type(_)
    <class 'sympy.polys.rings.PolyElement'>

    FTNc                 P    g | ]#}t          |                                          $S r=   listvalues)r?   reps     r6   rA   zsring.<locals>.<listcomp>   s(    ;;;ctCJJLL));;;r8   )optc                 P    g | ]"}fd |                                 D             #S )c                 (    i | ]\  }}||         S r=   r=   )r?   mc	coeff_maps      r6   
<dictcomp>z$sring.<locals>.<listcomp>.<dictcomp>   s#    999TQIaL999r8   )items)r?   rH   rN   s     r6   rA   zsring.<locals>.<listcomp>   s6    JJJc9999SYY[[999JJJr8   r   )r,   rF   mapr   r&   r)   r3   sumr   dictzipr0   r1   r4   	from_dict)exprsr   optionssinglerI   repscoeffs
coeffs_domr5   polysrN   s             @r6   sringr]      s#   4 Fu &vWe$$%%E

)
)C )44ID#
z K;;T;;;R@@!1&c!B!B!B
JVZ0011	JJJJTJJJSXsz3955EU_d++,,E uQx  u~r8   c                 H   t          | t                    r| rt          | d          ndS t          | t                    r| fS t	          |           rCt          d | D                       rt          |           S t          d | D                       r| S t          d          )NT)seqr=   c              3   @   K   | ]}t          |t                    V  d S N)
isinstancestrr?   ss     r6   	<genexpr>z!_parse_symbols.<locals>.<genexpr>   s,      33az!S!!333333r8   c              3   @   K   | ]}t          |t                    V  d S ra   )rb   r   rd   s     r6   rf   z!_parse_symbols.<locals>.<genexpr>   s,      66At$$666666r8   zbexpected a string, Symbol or expression or a non-empty sequence of strings, Symbols or expressions)rb   rc   _symbolsr   r,   allr!   r   s    r6   _parse_symbolsrk      s    '3 .5=xT****2=	GT	"	" z	W		 33733333 	G$$$66g66666 	N
~

r8   c                   (   e Zd ZdZefdZd Zd Zd Zd Z	d Z
d Zd$d
Zd Zed             Zed             Zd%dZd Zd Zd ZeZd%dZd%dZd Zd Zd Zd Zd Zd Zd Zd Zd Z ed             Z!ed             Z"d Z#d  Z$d! Z%d" Z&d# Z'd	S )&r0   z*Multivariate distributed polynomial ring. c                    t          t          |                    }t          |          }t          j        |          }t          j                  | j        |||f}t                              |          }|v|j	        r3t          |          t          |j                  z  rt          d          t                              |           }||_        t!          |          |_        t%          dt&          fd|i          |_        ||_        ||_        ||_        |_        d|z  |_        |                                |_        t          |j                  |_        |j        |j        fg|_        |rt=          |          }|                                |_         |!                                |_"        |#                                |_$        |%                                |_&        |'                                |_(        |)                                |_*        |+                                |_,        n5d }||_         ||_"        d |_$        ||_&        ||_(        ||_*        ||_,        tZ          u rt\          |_/        n
fd|_/        ta          |j        |j                  D ]B\  }	}
tc          |	td                    r(|	j3        }ti          ||          stk          |||
           C|t          |<   |S )Nz7polynomial ring and it's ground domain share generatorsPolyElementr7   r   c                     dS Nr=   r=   )abs     r6   <lambda>z"PolyRing.__new__.<locals>.<lambda>   s    r r8   c                     dS rq   r=   )rr   rs   rM   s      r6   rt   z"PolyRing.__new__.<locals>.<lambda>   s    b r8   c                 &    t          |           S )Nkey)max)fr4   s    r6   rt   z"PolyRing.__new__.<locals>.<lambda>   s    S->->-> r8   )6tuplerk   len	DomainOpt
preprocessOrderOpt__name___ring_cachegetis_Compositesetr   r!   object__new___hash_tuplehash_hashtypern   dtypengensr3   r4   
zero_monom_gensr1   	_gens_setone_oner   r   monomial_mulpowmonomial_powmulpowmonomial_mulpowldivmonomial_ldivdivmonomial_divlcmmonomial_lcmgcdmonomial_gcdr   ry   leading_expvrT   rb   r   r>   hasattrsetattr)clsr   r3   r4   r   r   objcodegenmonunitsymbol	generatorr>   s      `        r6   r   zPolyRing.__new__   s   w//00G%f--#E**|WeVUCook** 4	+" as7||c&.6I6I'I a%&_```..%%C)CO[))CI][NVSMJJCI!CKCICJCI!%ZCNyy{{CHMMCM45CH +%e,,#*;;== #*;;== &-nn&6&6#$+LLNN!#*;;== #*;;== #*;;==  )/#* #* &8&8#$+!#* #* #*  | ?#&  #>#>#>#> %(ch%?%? 6 6!	ff-- 6!;D"3-- 6T9555'*K$
r8   c                     | j         j        }g }t          | j                  D ]8}|                     |          }| j        }|||<   |                    |           9t          |          S )z(Return a list of polynomial generators. )r3   r   ranger   monomial_basiszeroappendr{   )selfr   r   iexpvpolys         r6   r   zPolyRing._gens  sm    kotz"" 	 	A&&q))D9DDJLLU||r8   c                 *    | j         | j        | j        fS ra   )r   r3   r4   r   s    r6   __getnewargs__zPolyRing.__getnewargs__  s    dk4:66r8   c                     | j                                         }|d= |                                D ]\  }}|                    d          r||= |S )Nr   	monomial_)__dict__copyrP   
startswith)r   staterx   values       r6   __getstate__zPolyRing.__getstate__  sY    ""$$.!++-- 	 	JC~~k** #Jr8   c                     | j         S ra   )r   r   s    r6   __hash__zPolyRing.__hash__   s
    zr8   c                     t          |t                    o5| j        | j        | j        | j        f|j        |j        |j        |j        fk    S ra   )rb   r0   r   r3   r   r4   r   others     r6   __eq__zPolyRing.__eq__#  sI    %** D\4;
DJ?]EL%+u{CD	Dr8   c                     | |k     S ra   r=   r   s     r6   __ne__zPolyRing.__ne__(  s    5=  r8   Nc                 Z    |                      |p| j        |p| j        |p| j                  S ra   )	__class__r   r3   r4   )r   r   r3   r4   s       r6   clonezPolyRing.clone+  s/    ~~g5v7LeNaW[Wabbbr8   c                 @    dg| j         z  }d||<   t          |          S )zReturn the ith-basis element. r      )r   r{   )r   r   basiss      r6   r   zPolyRing.monomial_basis.  s$    DJaU||r8   c                 *    |                                  S ra   )r   r   s    r6   r   zPolyRing.zero4  s    zz||r8   c                 6    |                      | j                  S ra   )r   r   r   s    r6   r   zPolyRing.one8  s    zz$)$$$r8   c                 8    | j                             ||          S ra   )r3   convertr   elementorig_domains      r6   
domain_newzPolyRing.domain_new<  s    {""7K888r8   c                 8    |                      | j        |          S ra   )term_newr   )r   coeffs     r6   
ground_newzPolyRing.ground_new?  s    }}T_e444r8   c                 L    |                      |          }| j        }|r|||<   |S ra   )r   r   )r   monomr   r   s       r6   r   zPolyRing.term_newB  s0    &&y 	 DKr8   c                    t          |t                    r`| |j        k    r|S t          | j        t                    r*| j        j        |j        k    r|                     |          S t          d          t          |t                    rt          d          t          |t                    r| 	                    |          S t          |t                    r;	 |                     |          S # t          $ r |                     |          cY S w xY wt          |t                    r|                     |          S |                     |          S )N
conversionparsing)rb   rn   r7   r3   r   r   NotImplementedErrorrc   rS   rU   rF   
from_terms
ValueError	from_listr   	from_exprr   r   s     r6   ring_newzPolyRing.ring_newI  sG   g{++ 	,w|# 8DK88 8T[=MQXQ]=] 8w///),777%% 	,%i000&& 
	,>>'***&& 	,/w/// / / /~~g...../&& 	,>>'***??7+++s   C/ /DDc                 |    | j         }| j        }|                                D ]\  }} |||          }|r|||<   |S ra   )r   r   rP   )r   r   r   r   r   r   r   s          r6   rU   zPolyRing.from_dicta  sS    _
y#MMOO 	$ 	$LE5Juk22E $#Ur8   c                 H    |                      t          |          |          S ra   )rU   rS   r   s      r6   r   zPolyRing.from_termsl  s    ~~d7mm[999r8   c                 d    |                      t          || j        dz
  | j                            S Nr   )rU   r   r   r3   r   s     r6   r   zPolyRing.from_listo  s(    ~~k'4:a<MMNNNr8   c                 X      j          fd t          |                    S )Nc           	                              |           }||S | j        r5t          t          t	          t          | j                                      S | j        r5t          t          t	          t          | j                                      S | 	                                \  }}|j
        r!|dk    r |          t          |          z  S                                         |                     S r   )r   is_Addr   r   rF   rQ   argsis_Mulr   as_base_exp
is_Integerintr   r   )exprr   baseexp_rebuildr3   mappingr   s       r6   r   z(PolyRing._rebuild_expr.<locals>._rebuildu  s    D))I A   Ac4Hdi(@(@#A#ABBB 	Ac4Hdi(@(@#A#ABBB !,,..	c> AcAg A#8D>>3s8833??6>>$+?+?@@@r8   )r3   r   )r   r   r   r   r3   s   ` `@@r6   _rebuild_exprzPolyRing._rebuild_exprr  sU    	A 	A 	A 	A 	A 	A 	A 	A$ x&&&r8   c                    t          t          t          | j        | j                                      }	 |                     ||          }|                     |          S # t          $ r t          d| d|          w xY w)Nz6expected an expression convertible to a polynomial in z, got )	rS   rF   rT   r   r1   r   r   r    r   )r   r   r   r   s       r6   r   zPolyRing.from_expr  s    tCdi8899::	'%%dG44D ==&&&  	p 	p 	p*cgcgcgimimnooo	ps   A! ! Bc                 8   || j         rd}nd}nt          |t                    r?|}d|k    r|| j         k     rn| j          |k    r|dk    r| dz
  }nt          d|z            t          || j                  r<	 | j                            |          }n# t          $ r t          d|z            w xY wt          |t                    r<	 | j                            |          }n2# t          $ r t          d|z            w xY wt          d|z            |S )z+Compute index of ``gen`` in ``self.gens``. Nr   r   zinvalid generator index: %szinvalid generator: %szEexpected a polynomial generator, an integer, a string or None, got %s)	r   rb   r   r   r   r1   indexrc   r   )r   genr   s      r6   r   zPolyRing.index  sz    	lz S!! 	lAAv F!dj. F*! Fa2g FBF !>!DEEETZ(( 	l@IOOC(( @ @ @ !83!>???@S!! 	l@L&&s++ @ @ @ !83!>???@ dgjjkkks   <B B4C( (Dc                     t          t          | j        |                    fdt          | j                  D             }|s| j        S |                     |          S )z,Remove specified generators from this ring. c                 "    g | ]\  }}|v	|S r=   r=   r?   r   re   indicess      r6   rA   z!PolyRing.drop.<locals>.<listcomp>  s'    OOO$!QQg=MOAOOOr8   rj   )r   rQ   r   	enumerater   r3   r   r   r1   r   r   s      @r6   dropzPolyRing.drop  sc    c$*d++,,OOOO)DL"9"9OOO 	/;::g:...r8   c                 Z    | j         |         }|s| j        S |                     |          S )Nrj   )r   r3   r   )r   rx   r   s      r6   __getitem__zPolyRing.__getitem__  s2    ,s# 	/;::g:...r8   c                     | j         j        st          | j         d          r |                     | j         j                   S t	          d| j         z            )Nr3   r3   z%s is not a composite domain)r3   r   r   r   r   r   s    r6   	to_groundzPolyRing.to_ground  sS    ;# 	Kwt{H'E'E 	K::T[%7:888;dkIJJJr8   c                      t          |           S ra   r   r   s    r6   	to_domainzPolyRing.to_domain  s    d###r8   c                 F    ddl m}  || j        | j        | j                  S )Nr   )	FracField)sympy.polys.fieldsr  r   r3   r4   )r   r  s     r6   to_fieldzPolyRing.to_field  s.    000000yt{DJ???r8   c                 2    t          | j                  dk    S r   r|   r1   r   s    r6   is_univariatezPolyRing.is_univariate  s    49~~""r8   c                 2    t          | j                  dk    S r   r  r   s    r6   is_multivariatezPolyRing.is_multivariate  s    49~~!!r8   c                 p    | j         }|D ]+}t          |t                    r| | j        | z  }&||z  },|S )aw  
        Add a sequence of polynomials or containers of polynomials.

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> R, x = ring("x", ZZ)
        >>> R.add([ x**2 + 2*i + 3 for i in range(4) ])
        4*x**2 + 24
        >>> _.factor_list()
        (4, [(x**2 + 6, 1)])

        include)r   r,   r   r   r   objspr   s       r6   r   zPolyRing.add  sS    " I 	 	C3666 XTXs^#Sr8   c                 p    | j         }|D ]+}t          |t                    r| | j        | z  }&||z  },|S )a  
        Multiply a sequence of polynomials or containers of polynomials.

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> R, x = ring("x", ZZ)
        >>> R.mul([ x**2 + 2*i + 3 for i in range(4) ])
        x**8 + 24*x**6 + 206*x**4 + 744*x**2 + 945
        >>> _.factor_list()
        (1, [(x**2 + 3, 1), (x**2 + 5, 1), (x**2 + 7, 1), (x**2 + 9, 1)])

        r  )r   r,   r   r   r  s       r6   r   zPolyRing.mul  sS    " H 	 	C3666 XTXs^#Sr8   c                    t          t          | j        |                    fdt          | j                  D             }fdt          | j                  D             }|s| S |                     | | j        |           S )zd
        Remove specified generators from the ring and inject them into
        its domain.
        c                 "    g | ]\  }}|v	|S r=   r=   r   s      r6   rA   z+PolyRing.drop_to_ground.<locals>.<listcomp>  s'    MMMAAW<LM1MMMr8   c                 "    g | ]\  }}|v	|S r=   r=   )r?   r   r   r   s      r6   rA   z+PolyRing.drop_to_ground.<locals>.<listcomp>  s'    KKK3!7:JKKKKr8   r   r3   )r   rQ   r   r   r   r1   r   r   r   s      @r6   drop_to_groundzPolyRing.drop_to_ground  s    
 c$*d++,,MMMM4<!8!8MMMKKKK)DI"6"6KKK 	HK::gidi6F:GGGr8   c                     | |k    r\t          | j                                      t          |j                            }|                     t	          |                    S | S )z+Add the generators of ``other`` to ``self``rj   r   r   unionr   rF   )r   r   symss      r6   composezPolyRing.compose  sT    5= 	t|$$**3u}+=+=>>D::d4jj:111Kr8   c                     t          | j                                      t          |                    }|                     t	          |                    S )z9Add the elements of ``symbols`` as generators to ``self``rj   r  )r   r   r  s      r6   add_genszPolyRing.add_gens&  s?    4<  &&s7||44zz$t**z---r8   )NNNra   )(r   
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   __call__rU   r   r   r   r   r   r   r  r  r  r
  r  r  r   r   r  r   r"  r=   r8   r6   r0   r0      sp       44,/ ? ? ? ?B	 	 	7 7 7    D D D
! ! !c c c c     X % % X%9 9 9 95 5 5  , , ,, H	 	 	 	: : : :O O O' ' '.' ' '  >/ / // / /K K K$ $ $@ @ @ # # X# " " X"  6  6H H H  . . . . .r8   r0   c                      e Zd ZdZd Zd Zd ZdZd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed             Z ed             Z!ed             Z"ed              Z#ed!             Z$ed"             Z%ed#             Z&ed$             Z'ed%             Z(ed&             Z)ed'             Z*ed(             Z+ed)             Z,ed*             Z-ed+             Z.ed,             Z/ed-             Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6d4 Z7d5 Z8d6 Z9d7 Z:d8 Z;d9 Z<d: Z=d; Z>d< Z?d= Z@d> ZAd? ZBeAZCeBZDd@ ZEdA ZFdB ZGdC ZHdD ZIdE ZJdF ZKddGZLdH ZMddIZNdJ ZOdK ZPdL ZQdM ZRdN ZSedO             ZTedP             ZUdQ ZVedR             ZWdS ZXdT ZYddUZZddVZ[ddWZ\dX Z]dY Z^dZ Z_d[ Z`d\ Zad] Zbd^ Zcd_ Zdd` Zeda Zfdb Zgdc Zhdd Zide Zjdf Zkdg ZlelZmdh Zndi Zodj Zpdk Zqdl Zrdm Zsdn Ztdo Zudp Zvdq Zwdr Zxds Zydt Zzdu Z{dv Z|dw Z}dx Z~dy ZddzZdd{Zdd|Zd} Zd~ Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd ZdS )rn   z5Element of multivariate distributed polynomial ring. c                 ,    |                      |          S ra   )r   )r   inits     r6   newzPolyElement.new/  s    ~~d###r8   c                 4    | j                                         S ra   )r7   r  r   s    r6   parentzPolyElement.parent2  s    y""$$$r8   c                 R    | j         t          |                                           fS ra   )r7   rF   	itertermsr   s    r6   r   zPolyElement.__getnewargs__5  s!    	4 0 01122r8   Nc                     | j         }|<t          | j        t          |                                           f          x| _         }|S ra   )r   r   r7   	frozensetrP   )r   r   s     r6   r   zPolyElement.__hash__:  sD     
 	L!%ty)DJJLL2I2I&J!K!KKDJr8   c                 ,    |                      |           S )a  Return a copy of polynomial self.

        Polynomials are mutable; if one is interested in preserving
        a polynomial, and one plans to use inplace operations, one
        can copy the polynomial. This method makes a shallow copy.

        Examples
        ========

        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.rings import ring

        >>> R, x, y = ring('x, y', ZZ)
        >>> p = (x + y)**2
        >>> p1 = p.copy()
        >>> p2 = p
        >>> p[R.zero_monom] = 3
        >>> p
        x**2 + 2*x*y + y**2 + 3
        >>> p1
        x**2 + 2*x*y + y**2
        >>> p2
        x**2 + 2*x*y + y**2 + 3

        )r+  r   s    r6   r   zPolyElement.copyE  s    4 xx~~r8   c           	      .   | j         |k    r| S | j         j        |j        k    rTt          t          t	          | | j         j        |j                             }|                    || j         j                  S |                    | | j         j                  S ra   )r7   r   rF   rT   r(   r   r3   rU   )r   new_ringtermss      r6   set_ringzPolyElement.set_ringa  s    9  	>KY("22 	>mD$)2CXEUVVWXXE&&udi.>???%%dDI,<===r8   c                     |rIt          |          | j        j        k    r,t          d| j        j        dt          |                    | j        j        }t          |                                 g|R  S )Nznot enough symbols, expected z got )r|   r7   r   r   r   r'   as_expr_dict)r   r   s     r6   as_exprzPolyElement.as_exprj  sv     	(s7||ty6 	(*Z]^eZfZfZfghhhi'Gd//11<G<<<<r8   c                 f    | j         j        j        fd|                                 D             S )Nc                 .    i | ]\  }}| |          S r=   r=   )r?   r   r   to_sympys      r6   rO   z,PolyElement.as_expr_dict.<locals>.<dictcomp>t  s'    LLL<5%xxLLLr8   )r7   r3   r<  r/  )r   r<  s    @r6   r8  zPolyElement.as_expr_dictr  s4    9#,LLLL4>>;K;KLLLLr8   c                 b   | j         j        }|j        r|j        s	|j        | fS |                                }|j        |j        }|j        }|                                 D ]} | ||                    | 	                    fd| 
                                D                       }|fS )Nc                 $    g | ]\  }}||z  fS r=   r=   )r?   kvcommons      r6   rA   z,PolyElement.clear_denoms.<locals>.<listcomp>  s%    BBBDAq1ah-BBBr8   )r7   r3   is_Fieldhas_assoc_Ringr   get_ringr   denomrG   r+  rP   )r   r3   ground_ringr   rE  r   r   rA  s          @r6   clear_denomszPolyElement.clear_denomsv  s    ! 	$f&; 	$:t##oo''o[[]] 	/ 	/ESu..FFxxBBBBDJJLLBBBCCt|r8   c                 ^    t          |                                           D ]
\  }}|s| |= dS )z+Eliminate monomials with zero coefficient. NrF   rP   )r   r?  r@  s      r6   
strip_zerozPolyElement.strip_zero  s?    && 	 	DAq G	 	r8   c                     |s|  S t          |t                    r+|j        | j        k    rt                              | |          S t          |           dk    rdS |                     | j        j                  |k    S )aP  Equality test for polynomials.

        Examples
        ========

        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.rings import ring

        >>> _, x, y = ring('x, y', ZZ)
        >>> p1 = (x + y)**2 + (x - y)**2
        >>> p1 == 4*x*y
        False
        >>> p1 == 2*(x**2 + y**2)
        True

        r   F)rb   rn   r7   rS   r   r|   r   r   p1p2s     r6   r   zPolyElement.__eq__  s|    "  	46MK(( 	4RW-? 	4;;r2&&&WWq[ 	4566"',--33r8   c                     | |k     S ra   r=   rL  s     r6   r   zPolyElement.__ne__  s    8|r8   c                 &   | j         }t          ||j                  rt          |                                           t          |                                          k    rdS |j        j        }|                                 D ]} || |         ||         |          s dS dS t          |           dk    rdS 	 |j                            |          }|j                            | 	                                ||          S # t          $ r Y dS w xY w)z+Approximate equality test for polynomials. FTr   )r7   rb   r   r   keysr3   almosteqr|   r   constr    )rM  rN  	tolerancer7   rR  r?  s         r6   rR  zPolyElement.almosteq  s   wb$*%% 	G27799~~RWWYY/ u{+HWWYY ! !x1r!ui88 ! 55!4WWq[ 	G5G[((,, {++BHHJJIFFF "   uus   :D 
DDc                 H    t          |           |                                 fS ra   )r|   r5  r   s    r6   sort_keyzPolyElement.sort_key  s    D		4::<<((r8   c                     t          || j        j                  r0 ||                                 |                                          S t          S ra   )rb   r7   r   rV  NotImplemented)rM  rN  ops      r6   _cmpzPolyElement._cmp  s@    b"'-(( 	"2bkkmmR[[]]333!!r8   c                 8    |                      |t                    S ra   )rZ  r   rL  s     r6   __lt__zPolyElement.__lt__      wwr2r8   c                 8    |                      |t                    S ra   )rZ  r   rL  s     r6   __le__zPolyElement.__le__  r]  r8   c                 8    |                      |t                    S ra   )rZ  r	   rL  s     r6   __gt__zPolyElement.__gt__  r]  r8   c                 8    |                      |t                    S ra   )rZ  r
   rL  s     r6   __ge__zPolyElement.__ge__  r]  r8   c                     | j         }|                    |          }|j        dk    r	||j        fS t	          |j                  }||= ||                    |          fS )Nr   rj   )r7   r   r   r3   rF   r   r   r   r   r7   r   r   s        r6   _dropzPolyElement._drop  sa    yJJsOO:? 	2dk>!4<((G
djjj1111r8   c                 x   |                      |          \  }}| j        j        dk    r.| j        r|                     d          S t          d|z            |j        }|                                 D ]G\  }}||         dk    r%t          |          }||= ||t          |          <   6t          d|z            |S )Nr   zCannot drop %sr   )
rf  r7   r   	is_groundr   r   r   rP   rF   r{   )r   r   r   r7   r   r?  r@  Ks           r6   r   zPolyElement.drop  s    **S//49?a 	~ 9zz!}}$ !1C!78889D

 = =1Q419 =QA!%&DqNN$%5%;<<<Kr8   c                     | j         }|                    |          }t          |j                  }||= ||                    |||                   fS )Nr  )r7   r   rF   r   r   re  s        r6   _drop_to_groundzPolyElement._drop_to_ground  sM    yJJsOOt|$$AJ$**WT!W*====r8   c                    | j         j        dk    rt          d          |                     |          \  }}|j        }|j        j        d         }|                                 D ]o\  }}|d |         ||dz   d          z   }||vr"|||         z                      |          ||<   C||xx         |||         z                      |          z  cc<   p|S )Nr   z$Cannot drop only generator to groundr   )	r7   r   r   rk  r   r3   r1   r/  
mul_ground)r   r   r   r7   r   r   r   mons           r6   r  zPolyElement.drop_to_ground  s    9?a 	ECDDD&&s++4ykq! NN,, 	? 	?LE5)eAaCDDk)C$ ? %(]66u==S		S			c58m77>>>				r8   c                 R    t          | | j        j        dz
  | j        j                  S r   )r   r7   r   r3   r   s    r6   to_densezPolyElement.to_dense  s"    T49?1#4di6FGGGr8   c                      t          |           S ra   )rS   r   s    r6   to_dictzPolyElement.to_dict  s    Dzzr8   c                 z   | s$|                     | j        j        j                  S |d         }|d         }| j        }|j        }|j        }	|j        }
g }|                                 D ]\  }}|j                            |          }|rdnd}|	                    |           ||
k    r7|                     |          }|r|
                    d          r
|dd          }n0|r| }|| j        j        k    r|                    ||d          }nd	}g }t          |	          D ]}||         }|s|                    ||         |d          }|dk    rO|t          |          k    s|d
k     r|                    ||d          }n|}|	                    |||fz             |	                    d|z             |r|g|z   }|	                    |                    |                     |d
         dv r1|                    d
          }|dk    r|                    d
d           d	                    |          S )NMulAtom -  + -r   T)strict r   Fz%s)rw  rv  )_printr7   r3   r   r   r   r   r5  is_negativer   r   r   parenthesizer   r   joinpopinsert)r   printer
precedenceexp_pattern
mul_symbolprec_mul	prec_atomr7   r   r   zmsexpvsr   r   negativesignscoeffsexpvr   r   r   sexpheads                          r6   rc   zPolyElement.str  s    	9>>$)"2"7888e$v&	y,
_::<< 	2 	2KD%{..u55H$/55%DMM$rz 
  .. ( 1 1# 6 6 (#ABBZF #"FEDIM)  $11%$1OOFFFE5\\ 0 01g  --gaj)D-QQ!8 0c#hh ##' #&33C53QQ"LL~!=>>>>LL//// )5(MM*//%001111!9& 	&::a==Du} &a%%%wwvr8   c                     | | j         j        v S ra   )r7   r   r   s    r6   is_generatorzPolyElement.is_generatorC  s    ty***r8   c                 J    |  p t          |           dk    o| j        j        | v S r   )r|   r7   r   r   s    r6   rh  zPolyElement.is_groundG  s(    xLCIINKty/Ct/KLr8   c                 D    |  pt          |           dk    o
| j        dk    S r   )r|   LCr   s    r6   is_monomialzPolyElement.is_monomialK  s$    x<CIIN;tw!|<r8   c                 (    t          |           dk    S r   )r|   r   s    r6   is_termzPolyElement.is_termO  s    4yyA~r8   c                 J    | j         j                            | j                  S ra   )r7   r3   r|  r  r   s    r6   r|  zPolyElement.is_negativeS      y++DG444r8   c                 J    | j         j                            | j                  S ra   )r7   r3   is_positiver  r   s    r6   r  zPolyElement.is_positiveW  r  r8   c                 J    | j         j                            | j                  S ra   )r7   r3   is_nonnegativer  r   s    r6   r  zPolyElement.is_nonnegative[      y..tw777r8   c                 J    | j         j                            | j                  S ra   )r7   r3   is_nonpositiver  r   s    r6   r  zPolyElement.is_nonpositive_  r  r8   c                     |  S ra   r=   rz   s    r6   is_zerozPolyElement.is_zeroc  s	    ur8   c                 "    | | j         j        k    S ra   )r7   r   r  s    r6   is_onezPolyElement.is_oneg  s    AFJr8   c                 J    | j         j                            | j                  S ra   )r7   r3   r  r  r  s    r6   is_moniczPolyElement.is_monick  s    v}##AD)))r8   c                 d    | j         j                            |                                           S ra   )r7   r3   r  contentr  s    r6   is_primitivezPolyElement.is_primitiveo  s"    v}##AIIKK000r8   c                 X    t          d |                                 D                       S )Nc              3   <   K   | ]}t          |          d k    V  dS r   NrR   r?   r   s     r6   rf   z(PolyElement.is_linear.<locals>.<genexpr>u  ,      ??u3u::???????r8   ri   
itermonomsr  s    r6   	is_linearzPolyElement.is_linears  '    ????????r8   c                 X    t          d |                                 D                       S )Nc              3   <   K   | ]}t          |          d k    V  dS )   Nr  r  s     r6   rf   z+PolyElement.is_quadratic.<locals>.<genexpr>y  r  r8   r  r  s    r6   is_quadraticzPolyElement.is_quadraticw  r  r8   c                 R    | j         j        sdS | j                             |           S NT)r7   r   	dmp_sqf_pr  s    r6   is_squarefreezPolyElement.is_squarefree{  s)    v| 	4v"""r8   c                 R    | j         j        sdS | j                             |           S r  )r7   r   dmp_irreducible_pr  s    r6   is_irreduciblezPolyElement.is_irreducible  s)    v| 	4v''***r8   c                 l    | j         j        r| j                             |           S t          d          )Nzcyclotomic polynomial)r7   r  dup_cyclotomic_pr#   r  s    r6   is_cyclotomiczPolyElement.is_cyclotomic  s5    6 	G6**1----.EFFFr8   c                 d    |                      d |                                 D                       S )Nc                     g | ]
\  }}|| fS r=   r=   )r?   r   r   s      r6   rA   z'PolyElement.__neg__.<locals>.<listcomp>  s"    PPPleU55&/PPPr8   )r+  r/  r   s    r6   __neg__zPolyElement.__neg__  s-    xxPPdnn>N>NPPPQQQr8   c                     | S ra   r=   r   s    r6   __pos__zPolyElement.__pos__  s    r8   c                 `   |s|                                  S | j        }t          ||j                  r]|                                  }|j        }|j        j        }|                                D ]\  }} |||          |z   }|r|||<   ||=  |S t          |t                    rt          |j        t                    r|j        j        |j        k    rnPt          |j        j        t                    r*|j        j        j        |k    r|
                    |           S t          S 	 |                    |          }|                                  }|s|S |j        }	|	|                                 vr|||	<   n!|||	          k    r||	= n||	xx         |z  cc<   |S # t          $ r
 t          cY S w xY w)a  Add two polynomials.

        Examples
        ========

        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.rings import ring

        >>> _, x, y = ring('x, y', ZZ)
        >>> (x + y)**2 + (x - y)**2
        2*x**2 + 2*y**2

        )r   r7   rb   r   r   r3   r   rP   rn   r   __radd__rX  r   r   rQ  r    )
rM  rN  r7   r  r   r   r?  r@  cp2r  s
             r6   __add__zPolyElement.__add__  s     	7799wb$*%% 	&		A%C;#D

  1C4LL1$ AaDD!HK(( 	&$+~66 &4;;Krw;V &BGNN;; &@SW[@[ &{{2&%%	//"%%C 		A B" !"!B%< !"bEEESLEEEH  	" 	" 	"!!!!	"s   &F F-,F-c                 &   |                                  }|s|S | j        }	 |                    |          }|j        }||                                 vr|||<   n!|||          k    r||= n||xx         |z  cc<   |S # t
          $ r
 t          cY S w xY wra   )r   r7   r   r   rQ  r    rX  )rM  nr  r7   r  s        r6   r  zPolyElement.__radd__  s    GGII 	Hw	""A B" "2; "bEEEQJEEEH  	" 	" 	"!!!!	"s   A< <BBc                 X   |s|                                  S | j        }t          ||j                  r]|                                  }|j        }|j        j        }|                                D ]\  }} |||          |z
  }|r|||<   ||=  |S t          |t                    rt          |j        t                    r|j        j        |j        k    rnPt          |j        j        t                    r*|j        j        j        |k    r|
                    |           S t          S 	 |                    |          }|                                  }|j        }||                                 vr| ||<   n |||         k    r||= n||xx         |z  cc<   |S # t          $ r
 t          cY S w xY w)a.  Subtract polynomial p2 from p1.

        Examples
        ========

        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.rings import ring

        >>> _, x, y = ring('x, y', ZZ)
        >>> p1 = x + y**2
        >>> p2 = x*y + y**2
        >>> p1 - p2
        -x*y + x

        )r   r7   rb   r   r   r3   r   rP   rn   r   __rsub__rX  r   r   rQ  r    )	rM  rN  r7   r  r   r   r?  r@  r  s	            r6   __sub__zPolyElement.__sub__  s      	7799wb$*%% 	&		A%C;#D

  1C4LL1$ AaDD!HK(( 	&$+~66 &4;;Krw;V &BGNN;; &@SW[@[ &{{2&%%	$$B 		AB"  "2;  "bEEERKEEEH  	" 	" 	"!!!!	"s   &F F)(F)c                     | j         }	 |                    |          }|j        }| D ]}| |          ||<   ||z  }|S # t          $ r
 t          cY S w xY w)a#  n - p1 with n convertible to the coefficient domain.

        Examples
        ========

        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.rings import ring

        >>> _, x, y = ring('x, y', ZZ)
        >>> p = x + y
        >>> 4 - p
        -x - y + 4

        )r7   r   r   r    rX  )rM  r  r7   r  r   s        r6   r  zPolyElement.__rsub__  s     w		""A 	A $ $d8)$FAH  	" 	" 	"!!!!	"s   = AAc                 P   | j         }|j        }| r|s|S t          ||j                  r|j        }|j        j        }|j        }t          |                                          }|                                 D ].\  }}	|D ]&\  }
} |||
          } |||          |	|z  z   ||<   '/|	                                 |S t          |t                    rt          |j        t                    r|j        j         |j         k    rnPt          |j         j        t                    r*|j         j        j         |k    r|                    |           S t          S 	 |                    |          }|                                 D ]\  }}	|	|z  }|r|||<   |S # t          $ r
 t          cY S w xY w)a!  Multiply two polynomials.

        Examples
        ========

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.rings import ring

        >>> _, x, y = ring('x, y', QQ)
        >>> p1 = x + y
        >>> p2 = x - y
        >>> p1*p2
        x**2 - y**2

        )r7   r   rb   r   r   r3   r   rF   rP   rJ  rn   r   __rmul__rX  r   r    )rM  rN  r7   r  r   r   r   p2itexp1v1exp2v2r   r@  s                 r6   __mul__zPolyElement.__mul__/  s     wI 	& 	&HDJ'' 	&%C;#D,L

##DHHJJ 4 4b $ 4 4HD"&,tT22C Sd^^be3AcFF4 LLNNNHK(( 	&$+~66 &4;;Krw;V &BGNN;; &@SW[@[ &{{2&%%		$$B HHJJ    brE  AdGH  	" 	" 	"!!!!	"s   F F%$F%c                     | j         j        }|s|S 	 |j                             |          }|                                 D ]\  }}||z  }|r|||<   |S # t          $ r
 t
          cY S w xY w)a  p2 * p1 with p2 in the coefficient domain of p1.

        Examples
        ========

        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.rings import ring

        >>> _, x, y = ring('x, y', ZZ)
        >>> p = x + y
        >>> 4 * p
        4*x + 4*y

        )r7   r   r   rP   r    rX  )rM  rN  r  r  r  r@  s         r6   r  zPolyElement.__rmul__a  s     GL 	H		""2&&B HHJJ    brE  AdGH  	" 	" 	"!!!!	"s   A A('A(c                    | j         }|s| r|j        S t          d          t          |           dk    rot	          |                                           d         \  }}|j        }|dk    r|||                    ||          <   n||z  ||                    ||          <   |S t          |          }|dk     rt          d          |dk    r| 	                                S |dk    r| 
                                S |dk    r| | 
                                z  S t          |           dk    r|                     |          S |                     |          S )a(  raise polynomial to power `n`

        Examples
        ========

        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.rings import ring

        >>> _, x, y = ring('x, y', ZZ)
        >>> p = x + y**2
        >>> p**3
        x**3 + 3*x**2*y**2 + 3*x*y**4 + y**6

        z0**0r   r   zNegative exponentr        )r7   r   r   r|   rF   rP   r   r   r   r   square_pow_multinomial_pow_generic)r   r  r7   r   r   r  s         r6   __pow__zPolyElement.__pow__~  sh    y 	 )x (((YY!^ 	

--a0LE5	Az :16$##E1--..16$##E1--.H FFq5 	(0111!V 		(99;;!V 	(;;== !V 	(%%YY!^ 	(((+++$$Q'''r8   c                 |    | j         j        }| }	 |dz  r||z  }|dz  }|sn|                                }|dz  },|S )NTr   r  )r7   r   r  )r   r  r  rM   s       r6   r  zPolyElement._pow_generic  s`    IM	1u aCQ 

AQA	 r8   c                    t          t          |           |                                          }| j        j        }| j        j        }|                                 }| j        j        j        }| j        j        }|D ]r\  }}	|}
|	}t          ||          D ]\  }\  }}|r ||
||          }
|||z  z  } t          |
          }|}|
                    ||          |z   }|r|||<   k||v r||= s|S ra   )r   r|   rP   r7   r   r   r3   r   rT   r{   r   )r   r  multinomialsr   r   r5  r   r   multinomialmultinomial_coeffproduct_monomproduct_coeffr   r   r   s                  r6   r  zPolyElement._pow_multinomial  s   /D		1==CCEE)3Y)


y$y~.: 	  	 *K*&M-M'*;'>'> 0 0#^eU 0$3OM5#$N$NM!UCZ/M-((E!EHHUD))E1E  #U$  Kr8   c                 N   | j         }|j        }|j        }t          |                                           }|j        j        }|j        }t          t          |                    D ]S}||         }| |         }	t          |          D ]1}
||
         } |||          } |||          |	| |         z  z   ||<   2T|	                    d          }|j        }| 
                                D ]&\  }} |||          } |||          |dz  z   ||<   '|                                 |S )a  square of a polynomial

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y = ring('x, y', ZZ)
        >>> p = x + y**2
        >>> p.square()
        x**2 + 2*x*y**2 + y**4

        r  )r7   r   r   rF   rQ  r3   r   r   r|   imul_numrP   rJ  )r   r7   r  r   rQ  r   r   r   k1pkjk2r   r?  r@  s                  r6   r  zPolyElement.square  s9    yIeDIIKK  {(s4yy!! 	6 	6AaBbB1XX 6 6!W"l2r**S$"T"X+5#6 JJqMMeJJLL 	) 	)DAqa##BCDMMAqD(AbEE	r8   c                 ^   | j         }|st          d          t          ||j                  r|                     |          S t          |t
                    rt          |j        t                    r|j        j         |j         k    rnPt          |j         j        t                    r*|j         j        j         |k    r|                    |           S t          S 	 |
                    |          }|                     |          |                     |          fS # t          $ r
 t          cY S w xY wNpolynomial division)r7   ZeroDivisionErrorrb   r   r   rn   r3   r   __rdivmod__rX  r   
quo_ground
rem_groundr    rM  rN  r7   s      r6   
__divmod__zPolyElement.__divmod__  s&   w 
	&#$9:::DJ'' 	&66"::K(( 	&$+~66 &4;;Krw;V &BGNN;; &@SW[@[ &~~b)))%%	:$$B MM"%%r}}R'8'899  	" 	" 	"!!!!	"s   D D,+D,c                     t           S ra   rX  rL  s     r6   r  zPolyElement.__rdivmod__      r8   c                 4   | j         }|st          d          t          ||j                  r|                     |          S t          |t
                    rt          |j        t                    r|j        j         |j         k    rnPt          |j         j        t                    r*|j         j        j         |k    r|                    |           S t          S 	 |
                    |          }|                     |          S # t          $ r
 t          cY S w xY wr  )r7   r  rb   r   remrn   r3   r   __rmod__rX  r   r  r    r  s      r6   __mod__zPolyElement.__mod__  s   w 
	&#$9:::DJ'' 	&66"::K(( 	&$+~66 &4;;Krw;V &BGNN;; &@SW[@[ &{{2&%%	%$$B ==$$$  	" 	" 	"!!!!	"s   D DDc                     t           S ra   r  rL  s     r6   r  zPolyElement.__rmod__.  r  r8   c                 R   | j         }|st          d          t          ||j                  r$|j        r| |dz  z  S |                     |          S t          |t                    rt          |j        t                    r|j        j         |j         k    rnPt          |j         j        t                    r*|j         j        j         |k    r|	                    |           S t          S 	 |                    |          }|                     |          S # t          $ r
 t          cY S w xY w)Nr  r   )r7   r  rb   r   r  quorn   r3   r   __rtruediv__rX  r   r  r    r  s      r6   __truediv__zPolyElement.__truediv__1  s-   w 	&#$9:::DJ'' 	&~ "28}$vvbzz!K(( 	&$+~66 &4;;Krw;V &BGNN;; &@SW[@[ &r***%%	%$$B ==$$$  	" 	" 	"!!!!	"s   (D D&%D&c                     t           S ra   r  rL  s     r6   r  zPolyElement.__rtruediv__J  r  r8   c                     | j         j        | j         j        }|j        | j         j        |j        rfd}nfd}|S )Nc                 f    | \  }}|\  }}|	k    r|}n ||          }|| ||          fS d S ra   r=   
	a_lm_a_lc	b_lm_b_lca_lma_lcb_lmb_lcr   
domain_quor   r  s
          r6   term_divz'PolyElement._term_div.<locals>.term_divY  s]    &
d&
d2: 5 EE(Lt44E   **T4"8"8884r8   c                 p    | \  }}|\  }}|	k    r|}n ||          }|||z  s| ||          fS d S ra   r=   r  s
          r6   r  z'PolyElement._term_div.<locals>.term_dive  sh    &
d&
d2: 5 EE(Lt44E     **T4"8"8884r8   )r7   r   r3   r   r   rB  )r   r3   r  r  r   r  s      @@@r6   	_term_divzPolyElement._term_divR  s    Y!!Z
y-? 	 
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  r8   c                    | j         d}t          |t                    rd}|g}t          |          st	          d          | s|rj        j        fS g j        fS |D ]}|j         k    rt          d          t          |          }fdt          |          D             }| 	                                }j        }| 
                                }d |D             }	|rd}
d}|
|k     r|dk    r|                                } ||||         f|	|
         ||
         |	|
                  f          }|G|\  }}||
                             ||f          ||
<   |                    ||
         || f          }d	}n|
d	z  }
|
|k     r|dk    |s4|                                }|                    |||         f          }||= ||j        k    r||z  }|r|s	j        |fS |d         |fS ||fS )
aU  Division algorithm, see [CLO] p64.

        fv array of polynomials
           return qv, r such that
           self = sum(fv[i]*qv[i]) + r

        All polynomials are required not to be Laurent polynomials.

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y = ring('x, y', ZZ)
        >>> f = x**3
        >>> f0 = x - y**2
        >>> f1 = x - y
        >>> qv, r = f.div((f0, f1))
        >>> qv[0]
        x**2 + x*y**2 + y**4
        >>> qv[1]
        0
        >>> r
        y**6

        FTr  z"self and f must have the same ringc                     g | ]	}j         
S r=   )r   )r?   r   r7   s     r6   rA   z#PolyElement.div.<locals>.<listcomp>  s    ***Adi***r8   c                 6    g | ]}|                                 S r=   )r   )r?   fxs     r6   rA   z#PolyElement.div.<locals>.<listcomp>  s"    000r""000r8   r   Nr   )r7   rb   rn   ri   r  r   r   r|   r   r   r  r   _iadd_monom_iadd_poly_monomr   )r   fv
ret_singlerz   re   qvr  rr  expvsr   divoccurredr   termexpv1rM   r7   s                   @r6   r   zPolyElement.divs  s{   8 y
b+&& 	JB2ww 	;#$9::: 	% %y$)++49}$ 	G 	GAv~ G !EFFFGGG****q***IIKKI>>##00R000 	AKa% 	K1, 	~~''xqw%(BqE%(O1LMM #HE1qE--uaj99BqE**2a551"+>>A"#KKFA a% 	K1, 	  ((MM44/22dG!  	" 4?" 	FA 	  y!|#!uaxq5Lr8   c                    | }t          |t                    r|g}t          |          st          d          |j        }|j        }|j        }|j        }|j        }|                                }|j	        }	|
                                }|j        }
|r|D ]} ||	|j	                  }|j|\  }}|                                D ].\  }} |||          } |
||          ||z  z
  }|s||= )|||<   /|                                }|
|||         f}	 nC|	\  }}||v r||xx         |z  cc<   n|||<   ||= |                                }|
|||         f}	||S r  )rb   rn   ri   r  r7   r3   r   r   r  LTr   r   r/  r   )r   Grz   r7   r3   r   r   r  r  ltfr   gtqrL   rM   mgcgm1c1ltmltcs                        r6   r  zPolyElement.rem  s   a%% 	A1vv 	;#$9:::v{(I;;==dFFHHe 	& & &Xc14(( DAq"#++-- ' 'B)\"a00 ST]]QrT1! ' !"$&AbEE..**C *!1S6kE S!8 !cFFFcMFFFF AcFcFnn&& &qv+C5  	&8 r8   c                 8    |                      |          d         S Nr   )r   )rz   r!  s     r6   r   zPolyElement.quo  s    uuQxx{r8   c                 Z    |                      |          \  }}|s|S t          | |          ra   )r   r"   )rz   r!  qr  s       r6   exquozPolyElement.exquo  s2    uuQxx1 	,H%a+++r8   c                     | | j         j        v r|                                 }n| }|\  }}|                    |          }||||<   n||z  }|r|||<   n||= |S )a  add to self the monomial coeff*x0**i0*x1**i1*...
        unless self is a generator -- then just return the sum of the two.

        mc is a tuple, (monom, coeff), where monomial is (i0, i1, ...)

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y = ring('x, y', ZZ)
        >>> p = x**4 + 2*y
        >>> m = (1, 2)
        >>> p1 = p._iadd_monom((m, 5))
        >>> p1
        x**4 + 5*x*y**2 + 2*y
        >>> p1 is p
        True
        >>> p = x
        >>> p1 = p._iadd_monom((m, 5))
        >>> p1
        5*x*y**2 + x
        >>> p1 is p
        False

        )r7   r   r   r   )r   mccpselfr   r   rM   s         r6   r  zPolyElement._iadd_monom  s    8 49&& 	YY[[FFFeJJt 	! F4LLJA ! t4Lr8   c                 &   | }||j         j        v r|                                }|\  }}|j        }|j         j        j        }|j         j        }|                                D ].\  }	}
 ||	|          } |||          |
|z  z   }|r|||<   +||= /|S )aE  add to self the product of (p)*(coeff*x0**i0*x1**i1*...)
        unless self is a generator -- then just return the sum of the two.

        mc is a tuple, (monom, coeff), where monomial is (i0, i1, ...)

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y, z = ring('x, y, z', ZZ)
        >>> p1 = x**4 + 2*y
        >>> p2 = y + z
        >>> m = (1, 2, 3)
        >>> p1 = p1._iadd_poly_monom(p2, (m, 3))
        >>> p1
        x**4 + 3*x*y**3*z**3 + 3*x*y**2*z**4 + 2*y

        )r7   r   r   r   r3   r   r   rP   )r   rN  r1  rM  rL   rM   r   r   r   r?  r@  kar   s                r6   r  zPolyElement._iadd_poly_monom#  s    * "" 	BAfw~"w+HHJJ 	 	DAqa##BCDMMAaC'E 2rFF	r8   c                     | j                             |          | st           S dk     rdS t          fd|                                 D                       S )z
        The leading degree in ``x`` or the main variable.

        Note that the degree of 0 is negative infinity (the SymPy object -oo).

        r   c                      g | ]
}|         S r=   r=   r?   r   r   s     r6   rA   z&PolyElement.degree.<locals>.<listcomp>V      ???eq???r8   )r7   r   r   ry   r  rz   xr   s     @r6   degreezPolyElement.degreeH  c     FLLOO 	A3JU 	A1????q||~~???@@@r8   c                     | st            f| j        j        z  S t          t	          t
          t          t          |                                                                S )z
        A tuple containing leading degrees in all variables.

        Note that the degree of 0 is negative infinity (the SymPy object -oo)

        )	r   r7   r   r{   rQ   ry   rF   rT   r  r  s    r6   degreeszPolyElement.degreesX  L      	?C6!&,&&S$sALLNN';"<"<==>>>r8   c                     | j                             |          | st           S dk     rdS t          fd|                                 D                       S )z
        The tail degree in ``x`` or the main variable.

        Note that the degree of 0 is negative infinity (the SymPy object -oo)

        r   c                      g | ]
}|         S r=   r=   r7  s     r6   rA   z+PolyElement.tail_degree.<locals>.<listcomp>r  r8  r8   )r7   r   r   minr  r9  s     @r6   tail_degreezPolyElement.tail_degreed  r<  r8   c                     | st            f| j        j        z  S t          t	          t
          t          t          |                                                                S )z
        A tuple containing tail degrees in all variables.

        Note that the degree of 0 is negative infinity (the SymPy object -oo)

        )	r   r7   r   r{   rQ   rB  rF   rT   r  r  s    r6   tail_degreeszPolyElement.tail_degreest  r?  r8   c                 >    | r| j                             |           S dS )aT  Leading monomial tuple according to the monomial ordering.

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y, z = ring('x, y, z', ZZ)
        >>> p = x**4 + x**3*y + x**2*z**2 + z**7
        >>> p.leading_expv()
        (4, 0, 0)

        N)r7   r   r   s    r6   r   zPolyElement.leading_expv  s'      	9))$///4r8   c                 L    |                      || j        j        j                  S ra   )r   r7   r3   r   r   r   s     r6   
_get_coeffzPolyElement._get_coeff  s    xxdi.3444r8   c                 v   |dk    r|                      | j        j                  S t          || j        j                  rit          |                                          }t          |          dk    r5|d         \  }}|| j        j        j	        k    r|                      |          S t          d|z            )a  
        Returns the coefficient that stands next to the given monomial.

        Parameters
        ==========

        element : PolyElement (with ``is_monomial = True``) or 1

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y, z = ring("x,y,z", ZZ)
        >>> f = 3*x**2*y - x*y*z + 7*z**3 + 23

        >>> f.coeff(x**2*y)
        3
        >>> f.coeff(x*y)
        0
        >>> f.coeff(1)
        23

        r   r   zexpected a monomial, got %s)rI  r7   r   rb   r   rF   r/  r|   r3   r   r   )r   r   r5  r   r   s        r6   r   zPolyElement.coeff  s    4 a< 	2??49#788811 	2**,,--E5zzQ 2$QxuDI,00 2??51116@AAAr8   c                 @    |                      | j        j                  S )z!Returns the constant coeffcient. )rI  r7   r   r   s    r6   rS  zPolyElement.const  s    ty3444r8   c                 P    |                      |                                           S ra   )rI  r   r   s    r6   r  zPolyElement.LC  s     t0022333r8   c                 J    |                                  }|| j        j        S |S ra   )r   r7   r   rH  s     r6   LMzPolyElement.LM  s+      "" 	9''Kr8   c                 r    | j         j        }|                                 }|r| j         j        j        ||<   |S )a  
        Leading monomial as a polynomial element.

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y = ring('x, y', ZZ)
        >>> (3*x*y + y**2).leading_monom()
        x*y

        )r7   r   r   r3   r   r   r  r   s      r6   leading_monomzPolyElement.leading_monom  s<     IN  "" 	+i&*AdGr8   c                     |                                  }|| j        j        | j        j        j        fS ||                     |          fS ra   )r   r7   r   r3   r   rI  rH  s     r6   r   zPolyElement.LT  sJ      "" 	1I($)*:*?@@$//$//00r8   c                 `    | j         j        }|                                 }|| |         ||<   |S )a  Leading term as a polynomial element.

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y = ring('x, y', ZZ)
        >>> (3*x*y + y**2).leading_term()
        3*x*y

        )r7   r   r   rP  s      r6   leading_termzPolyElement.leading_term  s8     IN  "" 	!4jAdGr8   c                     | j         j        nt          j                  t          u rt          |d d          S t          |fdd          S )Nc                     | d         S r,  r=   )r   s    r6   rt   z%PolyElement._sorted.<locals>.<lambda>  s
    q r8   T)rx   reversec                 &     | d                   S r,  r=   )r   r4   s    r6   rt   z%PolyElement._sorted.<locals>.<lambda>  s    uQx r8   )r7   r4   r   r~   r   sorted)r   r_   r4   s     `r6   _sortedzPolyElement._sorted  sk     	/IOEE'..EC< 	P##9#94HHHH##@#@#@#@$OOOOr8   c                 @    d |                      |          D             S )a  Ordered list of polynomial coefficients.

        Parameters
        ==========

        order : :class:`~.MonomialOrder` or coercible, optional

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.orderings import lex, grlex

        >>> _, x, y = ring("x, y", ZZ, lex)
        >>> f = x*y**7 + 2*x**2*y**3

        >>> f.coeffs()
        [2, 1]
        >>> f.coeffs(grlex)
        [1, 2]

        c                     g | ]\  }}|S r=   r=   )r?   _r   s      r6   rA   z&PolyElement.coeffs.<locals>.<listcomp>   s    :::81e:::r8   r5  r   r4   s     r6   rZ   zPolyElement.coeffs  $    0 ;:tzz%'8'8::::r8   c                 @    d |                      |          D             S )a
  Ordered list of polynomial monomials.

        Parameters
        ==========

        order : :class:`~.MonomialOrder` or coercible, optional

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.orderings import lex, grlex

        >>> _, x, y = ring("x, y", ZZ, lex)
        >>> f = x*y**7 + 2*x**2*y**3

        >>> f.monoms()
        [(2, 3), (1, 7)]
        >>> f.monoms(grlex)
        [(1, 7), (2, 3)]

        c                     g | ]\  }}|S r=   r=   )r?   r   r]  s      r6   rA   z&PolyElement.monoms.<locals>.<listcomp>:  s    :::85!:::r8   r^  r_  s     r6   monomszPolyElement.monoms"  r`  r8   c                 l    |                      t          |                                           |          S )a  Ordered list of polynomial terms.

        Parameters
        ==========

        order : :class:`~.MonomialOrder` or coercible, optional

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ
        >>> from sympy.polys.orderings import lex, grlex

        >>> _, x, y = ring("x, y", ZZ, lex)
        >>> f = x*y**7 + 2*x**2*y**3

        >>> f.terms()
        [((2, 3), 2), ((1, 7), 1)]
        >>> f.terms(grlex)
        [((1, 7), 1), ((2, 3), 2)]

        )rZ  rF   rP   r_  s     r6   r5  zPolyElement.terms<  s(    0 ||D..666r8   c                 D    t          |                                           S )z,Iterator over coefficients of a polynomial. )iterrG   r   s    r6   
itercoeffszPolyElement.itercoeffsV      DKKMM"""r8   c                 D    t          |                                           S )z)Iterator over monomials of a polynomial. )rf  rQ  r   s    r6   r  zPolyElement.itermonomsZ      DIIKK   r8   c                 D    t          |                                           S )z%Iterator over terms of a polynomial. )rf  rP   r   s    r6   r/  zPolyElement.iterterms^      DJJLL!!!r8   c                 D    t          |                                           S )z+Unordered list of polynomial coefficients. rE   r   s    r6   
listcoeffszPolyElement.listcoeffsb  rh  r8   c                 D    t          |                                           S )z(Unordered list of polynomial monomials. )rF   rQ  r   s    r6   
listmonomszPolyElement.listmonomsf  rj  r8   c                 D    t          |                                           S )z$Unordered list of polynomial terms. rI  r   s    r6   	listtermszPolyElement.listtermsj  rl  r8   c                     | | j         j        v r| |z  S |s|                                  dS | D ]}| |xx         |z  cc<   | S )a:  multiply inplace the polynomial p by an element in the
        coefficient ring, provided p is not one of the generators;
        else multiply not inplace

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y = ring('x, y', ZZ)
        >>> p = x + y**2
        >>> p1 = p.imul_num(3)
        >>> p1
        3*x + 3*y**2
        >>> p1 is p
        True
        >>> p = x
        >>> p1 = p.imul_num(3)
        >>> p1
        3*x
        >>> p1 is p
        False

        N)r7   r   clear)r  rM   r   s      r6   r  zPolyElement.imul_numn  sd    4    	Q3J 	GGIIIF 	 	CcFFFaKFFFFr8   c                     | j         j        }|j        }|j        }|                                 D ]} |||          }|S )z*Returns GCD of polynomial's coefficients. )r7   r3   r   r   rg  )rz   r3   contr   r   s        r6   r  zPolyElement.content  sH    {j\\^^ 	$ 	$E3tU##DDr8   c                 X    |                                  }||                     |          fS )z,Returns content and a primitive polynomial. )r  r  )rz   rv  s     r6   	primitivezPolyElement.primitive  s&    yy{{Q\\$''''r8   c                 >    | s| S |                      | j                  S )z5Divides all coefficients by the leading coefficient. )r  r  r  s    r6   moniczPolyElement.monic  s#     	&H<<%%%r8   c                     s| j         j        S fd|                                 D             }|                     |          S )Nc                 $    g | ]\  }}||z  fS r=   r=   r?   r   r   r:  s      r6   rA   z*PolyElement.mul_ground.<locals>.<listcomp>  s&    FFF|ue5%'"FFFr8   )r7   r   r/  r+  )rz   r:  r5  s    ` r6   rm  zPolyElement.mul_ground  sF     	6;FFFFq{{}}FFFuuU||r8   c                     | j         j        fd|                                 D             }|                     |          S )Nc                 2    g | ]\  }} |          |fS r=   r=   )r?   f_monomf_coeffr   r   s      r6   rA   z)PolyElement.mul_monom.<locals>.<listcomp>  s/    ]]]>Ngw<<//9]]]r8   )r7   r   rP   r+  )rz   r   r5  r   s    ` @r6   	mul_monomzPolyElement.mul_monom  sG    v*]]]]]RSRYRYR[R[]]]uuU||r8   c                    |\  | rs| j         j        S | j         j        k    r|                               S | j         j        fd|                                 D             }|                     |          S )Nc                 8    g | ]\  }} |          |z  fS r=   r=   )r?   r  r  r   r   r   s      r6   rA   z(PolyElement.mul_term.<locals>.<listcomp>  s3    cccDTGW<<//?cccr8   )r7   r   r   rm  r   rP   r+  )rz   r  r5  r   r   r   s      @@@r6   mul_termzPolyElement.mul_term  s    u 	' 	'6;af'' 	'<<&&&v*ccccccXYX_X_XaXacccuuU||r8   c                 (   | j         j        }st          d          | r|j        k    r| S |j        r)|j        fd|                                 D             }n fd|                                 D             }|                     |          S )Nr  c                 2    g | ]\  }}| |          fS r=   r=   )r?   r   r   r   r:  s      r6   rA   z*PolyElement.quo_ground.<locals>.<listcomp>  s,    PPPucc%mm,PPPr8   c                 .    g | ]\  }}|z  
||z  fS r=   r=   r}  s      r6   rA   z*PolyElement.quo_ground.<locals>.<listcomp>  s2    ```leUTY\]T]`ueqj)```r8   )r7   r3   r  r   rB  r   r/  r+  )rz   r:  r3   r5  r   s    `  @r6   r  zPolyElement.quo_ground  s     	;#$9::: 	AO 	H? 	a*CPPPPPPPPEE````akkmm```EuuU||r8   c                 @   \  }}|st          d          | s| j        j        S || j        j        k    r|                     |          S |                                 fd|                                 D             }|                     d |D                       S )Nr  c                 (    g | ]} |          S r=   r=   )r?   tr  r  s     r6   rA   z(PolyElement.quo_term.<locals>.<listcomp>  s%    <<<((1d##<<<r8   c                     g | ]}||S ra   r=   )r?   r  s     r6   rA   z(PolyElement.quo_term.<locals>.<listcomp>  s    :::Q1:q:::r8   )r  r7   r   r   r  r  r/  r+  )rz   r  r   r   r5  r  s    `   @r6   quo_termzPolyElement.quo_term  s    u 	'#$9::: 	'6;af'' 	'<<&&&;;==<<<<<Q[[]]<<<uu::%:::;;;r8   c                 J   | j         j        j        rGg }|                                 D ]/\  }}|z  }|dz  k    r|z
  }|                    ||f           0n fd|                                 D             }|                     |          }|                                 |S )Nr  c                 $    g | ]\  }}||z  fS r=   r=   )r?   r   r   r  s      r6   rA   z,PolyElement.trunc_ground.<locals>.<listcomp>  s&    LLL\UEueai(LLLr8   )r7   r3   is_ZZr/  r   r+  rJ  )rz   r  r5  r   r   r   s    `    r6   trunc_groundzPolyElement.trunc_ground  s    6= 	ME ! - -u	16> &!AIEeU^,,,,- MLLLQ[[]]LLLEuuU||r8   c                     | }|                                 }|                                 }|j        j                            ||          }|                    |          }|                    |          }|||fS ra   )r  r7   r3   r   r  )r   r#  rz   fcgcr   s         r6   extract_groundzPolyElement.extract_ground  sh    YY[[YY[[fmB''LLLLAqyr8   c                     | s| j         j        j        S | j         j        j         |fd|                                 D                       S )Nc                 &    g | ]} |          S r=   r=   )r?   r   
ground_abss     r6   rA   z%PolyElement._norm.<locals>.<listcomp>  s#    NNNUzz%00NNNr8   )r7   r3   r   absrg  )rz   	norm_funcr  s     @r6   _normzPolyElement._norm  sR     	P6=%%*J9NNNNallnnNNNOOOr8   c                 6    |                      t                    S ra   )r  ry   r  s    r6   max_normzPolyElement.max_norm      wws||r8   c                 6    |                      t                    S ra   )r  rR   r  s    r6   l1_normzPolyElement.l1_norm	  r  r8   c                 J   | j         }| gt          |          z   }dg|j        z  }|D ]G}|                                D ]0}t	          |          D ]\  }}t          ||         |          ||<   1Ht	          |          D ]\  }}	|	sd||<   t          |          }t          d |D                       r||fS g }
|D ]d}|j        }|	                                D ]1\  }}d t          ||          D             }||t          |          <   2|
                    |           e||
fS )Nr   r   c              3   "   K   | ]
}|d k    V  dS r  r=   )r?   rs   s     r6   rf   z&PolyElement.deflate.<locals>.<genexpr>  s&      !!!qAv!!!!!!r8   c                     g | ]
\  }}||z  S r=   r=   r?   r   r  s      r6   rA   z'PolyElement.deflate.<locals>.<listcomp>&  s     444Aa1f444r8   )r7   rF   r   r  r   r   r{   ri   r   r/  rT   r   )rz   r!  r7   r\   Jr  r   r   rL   rs   HhIr   Ns                  r6   deflatezPolyElement.deflate  se   vd1ggC
N 	) 	)A ) )%e,, ) )DAq!a==AaDD)) aLL 	 	DAq !!HH!!q!!!!! 	e8O 	 	A	AKKMM $ $544Q444#%((HHQKKKK!tr8   c                     | j         j        }|                                 D ]1\  }}d t          ||          D             }||t	          |          <   2|S )Nc                     g | ]
\  }}||z  S r=   r=   r  s      r6   rA   z'PolyElement.inflate.<locals>.<listcomp>1  s     ---$!Q!A#---r8   )r7   r   r/  rT   r{   )rz   r  r   r  r   r  s         r6   inflatezPolyElement.inflate-  sW    v{ 	# 	#HAu--#a))---A"DqNNr8   c                 j   | }|j         j        }|j        sD|                                \  }}|                                \  }}|                    ||          }||z                      |                    |                    }|j        s|                    |          S |                                S ra   )	r7   r3   rB  rx  r   r   r   rm  rz  )r   r#  rz   r3   r  r  rM   r  s           r6   r   zPolyElement.lcm6  s     	#KKMMEBKKMMEB

2r""AqSIIaeeAhh 	<<??"7799r8   c                 8    |                      |          d         S r,  )	cofactorsrz   r#  s     r6   r   zPolyElement.gcdF  s    {{1~~a  r8   c                 T   | s|s| j         j        }|||fS | s|                     |          \  }}}|||fS |s|                    |           \  }}}|||fS t          |           dk    r|                     |          \  }}}|||fS t          |          dk    r|                    |           \  }}}|||fS |                     |          \  }\  } }|                     |          \  }}}|                    |          |                    |          |                    |          fS r   )r7   r   	_gcd_zeror|   
_gcd_monomr  _gcdr  )rz   r#  r   r  cffcfgr  s          r6   r  zPolyElement.cofactorsI  s6    	 	6;Dt## 	++a..KAsCc3; 	++a..KAsCc3;VVq[ 	,,q//KAsCc3;VVq[ 	,,q//KAsCc3;IIaLL	6AqffQii3		!ckk!nnckk!nn==r8   c                 X    | j         j        | j         j        }}|j        r|||fS | || fS ra   )r7   r   r   r  )rz   r#  r   r   s       r6   r  zPolyElement._gcd_zero_  s:    FJT 	"dC<2tcT>!r8   c                 $   | j         }|j        j        }|j        j        |j        }|j        t          |                                           d         \  }}||c|                                D ]\  }} ||           ||          |                     fg          }	|                      |           |          fg          }
|                     fd|                                D                       }|	|
|fS )Nr   c                 F    g | ]\  }} |           |          fS r=   r=   )r?   r%  r&  _cgcd_mgcd
ground_quor   s      r6   rA   z*PolyElement._gcd_monom.<locals>.<listcomp>s  s:    ccc62rmmB..

2u0E0EFcccr8   )	r7   r3   r   r   r   r   rF   r/  r+  )rz   r#  r7   
ground_gcdr   mfcfr%  r&  r  r  r  r  r  r  r   s               @@@@r6   r  zPolyElement._gcd_monomf  s(   v[_
[_
(*akkmm$$Q'B2ukkmm 	* 	*FB L++EJub))EEEEE5>"##eemmB..

2u0E0EFGHHeecccccccUVU`U`UbUbcccdd#s{r8   c                     | j         }|j        j        r|                     |          S |j        j        r|                     |          S |                    | |          S ra   )r7   r3   is_QQ_gcd_QQr  _gcd_ZZdmp_inner_gcd)rz   r#  r7   s      r6   r  zPolyElement._gcdv  sY    v; 	,99Q<<[ 	,99Q<<%%a+++r8   c                 "    t          | |          S ra   r   r  s     r6   r  zPolyElement._gcd_ZZ  s    a||r8   c                    | }|j         }|                    |j                                                  }|                                \  }}|                                \  }}|                    |          }|                    |          }|                    |          \  }}}	|                    |          }|j        |                                }}
|                    |          	                    |j        
                    |
|                    }|	                    |          	                    |j        
                    |
|                    }	|||	fS )Nr  )r7   r   r3   rD  rG  r6  r  r  rz  rm  r   )r   r#  rz   r7   r4  r  r&  r  r  r  rM   s              r6   r  zPolyElement._gcd_QQ  s   v::T[%9%9%;%;:<<  A  AJJx  JJx  iill3JJttQWWYY1ll4  ++DKOOAr,B,BCCll4  ++DKOOAr,B,BCC#s{r8   c                 l   | }|j         }|s	||j        fS |j        }|j        r|j        s|                    |          \  }}}n|                    |                                          }|                                \  }	}|                                \  }
}|	                    |          }|	                    |          }|                    |          \  }}}|j                            |
|	          \  }}
}	|	                    |          }|	                    |          }|
                    |
          }|
                    |	          }|                                }||j        k    r||}}n=||j         k    r| | }}n*|
                    |          }|
                    |          }||fS )a  
        Cancel common factors in a rational function ``f/g``.

        Examples
        ========

        >>> from sympy.polys import ring, ZZ
        >>> R, x,y = ring("x,y", ZZ)

        >>> (2*x**2 - 2).cancel(x**2 - 2*x + 1)
        (2*x + 2, x - 1)

        r  )r7   r   r3   rB  rC  r  r   rD  rG  r6  rm  canonical_unit)r   r#  rz   r7   r3   r]  r  r.  r4  cqcpus               r6   cancelzPolyElement.cancel  s    v 	dh; 	!F$9 	!kk!nnGAq!!zz):):z;;HNN$$EBNN$$EB

8$$A

8$$Akk!nnGAq! 11"b99IAr2

4  A

4  AR  AR  A
 
? 	 aqAA6:+ 	 2rqAAQAQA!tr8   c                 N    | j         j        }|                    | j                  S ra   )r7   r3   r  r  )rz   r3   s     r6   r  zPolyElement.canonical_unit  s!    $$QT***r8   c                 (   | j         }|                    |          }|                    |          }|j        }|                                 D ]D\  }}||         r7|                    ||          }|                    |||         z            ||<   E|S )a!  Computes partial derivative in ``x``.

        Examples
        ========

        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.domains import ZZ

        >>> _, x, y = ring("x,y", ZZ)
        >>> p = x + x**2*y**3
        >>> p.diff(x)
        2*x*y**3 + 1

        )r7   r   r   r   r/  r   r   )	rz   r:  r7   r   rL   r#  r   r   es	            r6   diffzPolyElement.diff  s     vJJqMM""I;;== 	6 	6KD%Aw 6&&tQ//uT!W}55!r8   c                    dt          |          cxk     r| j        j        k    r=n n:|                     t	          t          | j        j        |                              S t          d| j        j        dt          |                    )Nr   z expected at least 1 and at most z values, got )r|   r7   r   evaluaterF   rT   r1   r   )rz   rG   s     r6   r'  zPolyElement.__call__  s    s6{{ 	p 	p 	p 	pafl 	p 	p 	p 	p 	p::d3qv{F#;#;<<===*TUTZT`T`T`beflbmbmbmnooor8   c                    | }t          |t                    rU|S|d         |dd          c\  }}|                    |          }|s|S fd|D             }|                    |          S |j        }|                    |          }|j                            |          }|j        dk    r5|j        j        }|	                                D ]\  \  }}||||z  z  z  }|S |
                    |          j        }	|	                                D ]O\  }
}|
|         |
d |         |
|dz   d          z   }
}|||z  z  }|
|	v r||	|
         z   }|r||	|
<   D|	|
= H|r||	|
<   P|	S )Nr   r   c                 D    g | ]\  }}|                               |fS r=   )r   )r?   Yrr   Xs      r6   rA   z(PolyElement.evaluate.<locals>.<listcomp>  s+    666!Qqvvayy!n666r8   )rb   rF   r  r7   r   r3   r   r   r   r/  r   )r   r:  rr   rz   r7   r   resultr  r   r   r   r  s              @r6   r  zPolyElement.evaluate  s   a 	%1 	%!aeIFQA

1a  A %66661666zz!}}$vJJqMMK"":? 	[%F {{}} % %e%1*$M99Q<<$D ! , ,u 8U2A2Yqstt%<5ad
D= 	,!DK/E (&+U KK ,&+UKr8   c                 f   | }t          |t                    r"| |D ]\  }}|                    ||          }|S |j        }|                    |          }|j                            |          }|j        dk    rH|j        j        }|	                                D ]\  \  }}	||	||z  z  z  }|
                    |          S |j        }
|	                                D ]R\  }}	||         |d |         dz   ||dz   d          z   }}|	||z  z  }	||
v r|	|
|         z   }	|	r|	|
|<   G|
|= K|	r|	|
|<   S|
S )Nr   ro   )rb   rF   subsr7   r   r3   r   r   r   r/  r   )r   r:  rr   rz   r  r7   r   r  r  r   r   r   s               r6   r  zPolyElement.subs	  sx   a 	1 	 ! !1FF1aLLHvJJqMMK"":? 	[%F {{}} % %e%1*$??6***9D ! , ,u 8U2A2Y%5acdd%C5ad
D= 	,!DK/E (&+U KK ,&+UKr8   c                 ,   | j         }|j        }t          t          t	          |j        t          t          |j                                                          |||fg}n}t          |t                    rt          |          }nXt          |t                    r4t          t          |
                                          fd          }nt          d          t          |          D ](\  }\  }}|         |                    |          f||<   )|                                 D ]d\  }}	t          |          }|j        }
|D ]\  }}||         dc}||<   |r|
||z  z  }
|
                    t#          |          |	f          }
||
z  }e|S )Nc                      | d                  S r,  r=   )r?  gens_maps    r6   rt   z%PolyElement.compose.<locals>.<lambda>Q	  s    XaPQd^ r8   rw   z9expected a generator, value pair a sequence of such pairsr   )r7   r   rS   rF   rT   r1   r   r   rb   rY  rP   r   r   r   r/  r   r  r{   )rz   r:  rr   r7   r   replacementsr?  r#  r   r   subpolyr   r  r  s                @r6   r   zPolyElement.composeF	  s   vySDtz1B1B,C,CDDEEFF 	^F8LL!T"" ^#AwwAt$$ ^%d17799oo;S;S;S;STTT !\]]]"<00 	> 	>IAv1'{DMM!,<,<=LOOKKMM 
	 
	LE5KKEhG$ $ $1#Ah58 $q!tOG&&ee'<==GGODDr8   c                 8    | j                             | |          S ra   )r7   dmp_pdivr  s     r6   pdivzPolyElement.pdivi	      vq!$$$r8   c                 8    | j                             | |          S ra   )r7   dmp_premr  s     r6   premzPolyElement.preml	  r  r8   c                 8    | j                             | |          S ra   )r7   dmp_quor  s     r6   pquozPolyElement.pquoo	  s    v~~a###r8   c                 8    | j                             | |          S ra   )r7   	dmp_exquor  s     r6   pexquozPolyElement.pexquor	      v1%%%r8   c                 8    | j                             | |          S ra   )r7   dmp_half_gcdexr  s     r6   
half_gcdexzPolyElement.half_gcdexu	  s    v$$Q***r8   c                 8    | j                             | |          S ra   )r7   	dmp_gcdexr  s     r6   gcdexzPolyElement.gcdexx	  r  r8   c                 8    | j                             | |          S ra   )r7   dmp_subresultantsr  s     r6   subresultantszPolyElement.subresultants{	  s    v''1---r8   c                 8    | j                             | |          S ra   )r7   dmp_resultantr  s     r6   	resultantzPolyElement.resultant~	  s    v##Aq)))r8   c                 6    | j                             |           S ra   )r7   dmp_discriminantr  s    r6   discriminantzPolyElement.discriminant	  s    v&&q)))r8   c                 l    | j         j        r| j                             |           S t          d          )Nzpolynomial decomposition)r7   r  dup_decomposer#   r  s    r6   	decomposezPolyElement.decompose	  s5    6 	J6''***-.HIIIr8   c                 n    | j         j        r| j                             | |          S t          d          )Nzpolynomial shift)r7   r  	dup_shiftr#   )rz   rr   s     r6   shiftzPolyElement.shift	  s7    6 	B6##Aq)))-.@AAAr8   c                 l    | j         j        r| j                             |           S t          d          )Nzsturm sequence)r7   r  	dup_sturmr#   r  s    r6   sturmzPolyElement.sturm	  s5    6 	@6##A&&&-.>???r8   c                 6    | j                             |           S ra   )r7   dmp_gff_listr  s    r6   gff_listzPolyElement.gff_list	      v""1%%%r8   c                 6    | j                             |           S ra   )r7   dmp_sqf_normr  s    r6   sqf_normzPolyElement.sqf_norm	  r	  r8   c                 6    | j                             |           S ra   )r7   dmp_sqf_partr  s    r6   sqf_partzPolyElement.sqf_part	  r	  r8   Fc                 :    | j                             | |          S )N)ri   )r7   dmp_sqf_list)rz   ri   s     r6   sqf_listzPolyElement.sqf_list	  s    v""1#"...r8   c                 6    | j                             |           S ra   )r7   dmp_factor_listr  s    r6   factor_listzPolyElement.factor_list	  s    v%%a(((r8   ra   )F)r   r#  r$  r%  r+  r-  r   r   r   r   r6  r9  r8  rG  rJ  r   r   rR  rV  rZ  r\  r_  ra  rc  rf  r   rk  r  rp  rr  rc   r&  r  rh  r  r  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __floordiv____rfloordiv__r  r   r  r   r/  r  r  r;  r>  rC  rE  r   rI  r   rS  r  rN  rQ  r   rT  rZ  rZ   rc  r5  rg  r  r/  rn  rp  rr  r  r  rx  rz  rm  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  r  r  r  r'  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r=   r8   r6   rn   rn   ,  s	       ??$ $ $% % %3 3 3 E	 	 	  8> > >= = =M M M  "  4 4 44  G G G G0) ) )" " "        	2 	2 	2  *> > >  "H H H  . . .` + + X+ M M XM = = X=   X 5 5 X5 5 5 X5 8 8 X8 8 8 X8   X   X * * X* 1 1 X1 @ @ X@ @ @ X@ # # X#
 + + X+
 G G XGR R R  4 4 4l  (4 4 4l  60 0 0d  :.( .( .(`     :" " "H: : :,  % % %,  % % %2   L M  BJ J JX+ + +Z  , , ,* * *X# # #JA A A A 
? 
? 
?A A A A 
? 
? 
?  (5 5 5#B #B #BJ5 5 5 4 4 X4   X  * 1 1 X1  (	P 	P 	P; ; ; ;4; ; ; ;47 7 7 74# # #! ! !" " "# # #! ! !" " "! ! !F	 	 	( ( (
& & &    

 
 
   < < <  $ J
 
 
P P P      B     ! ! !> > >," " "   , , ,    *6 6 6p+ + +  2p p p* * * *X% % % %N   F% % %% % %$ $ $& & &+ + +& & &. . .* * ** * *J J JB B B@ @ @& & && & && & &/ / / /) ) ) ) )r8   rn   N)Or%  typingr   r   tDictoperatorr   r   r   r   r	   r
   	functoolsr   typesr   sympy.core.exprr   sympy.core.numbersr   r   sympy.core.symbolr   r   rh   sympy.core.sympifyr   r   sympy.ntheory.multinomialr   sympy.polys.compatibilityr   sympy.polys.constructorr   sympy.polys.densebasicr   r   !sympy.polys.domains.domainelementr   "sympy.polys.domains.polynomialringr   sympy.polys.heuristicgcdr   sympy.polys.monomialsr   sympy.polys.orderingsr   sympy.polys.polyerrorsr    r!   r"   r#   sympy.polys.polyoptionsr$   r}   r%   r   r&   sympy.polys.polyutilsr'   r(   r)   sympy.printing.defaultsr*   sympy.utilitiesr+   sympy.utilities.iterablesr,   sympy.utilities.magicr-   r7   r:   rB   r]   rk   r   r0   rS   rn   r=   r8   r6   <module>r1     s     & % % % % % % % - - - - - - - - - - - - - - - -                         ' ' ' ' ' ' ' ' 9 9 9 9 9 9 9 9 3 3 3 3 3 3 3 3 > > > > > > , , , , , , 4 4 4 4 4 4 = = = = = = = = ; ; ; ; ; ; = = = = = = + + + + + + - - - - - - % % % % % %6 6 6 6 6 6 6 6 6 6 6 6G G G G G G G G G G= = = = = = = = = = 3 3 3 3 3 3 " " " " " " 1 1 1 1 1 1 ) ) ) ) ) ) # ! ! ! !< !$    < !$    < 2 2 2h@ @ @ e. e. e. e. e. e. e. e.Pw) w) w) w) w)-+t w) w) w) w) w)r8   