o
    Rhg                     @  s   d 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mZ ddlmZ erNdd	lmZmZ dd
lmZ ddlmZ ddlmZmZ d&ddZG dd dZd'ddZd'ddZd(d!d"ZG d#d$ d$Zd%S ))z
Puiseux rings. These are used by the ring_series module to represented
truncated Puiseux series. Elements of a Puiseux ring are like polynomials
except that the exponents can be negative or rational rather than just
non-negative integers.
    )annotationsQQ)PolyRingPolyElement)Add)Mul)gcdlcm)TYPE_CHECKING)AnyUnpack)Expr)Domain)IterableIteratorsymbolsstr | list[Expr]domainr   return3tuple[PuiseuxRing, Unpack[tuple[PuiseuxPoly, ...]]]c                 C  s   t | |}|f|j S )ac  Construct a Puiseux ring.

    This function constructs a Puiseux ring with the given symbols and domain.

    >>> from sympy.polys.domains import QQ
    >>> from sympy.polys.puiseux import puiseux_ring
    >>> R, x, y = puiseux_ring('x y', QQ)
    >>> R
    PuiseuxRing((x, y), QQ)
    >>> p = 5*x**QQ(1,2) + 7/y
    >>> p
    7*y**(-1) + 5*x**(1/2)
    )PuiseuxRinggens)r   r   ring r   U/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/sympy/polys/puiseux.pypuiseux_ring'   s   
r   c                   @  st   e Zd ZdZd)ddZd*d
dZd+ddZd,ddZd-ddZd.ddZ	d/dd Z
d0d!d"Zd0d#d$Zd1d&d'Zd(S )2r   a  Ring of Puiseux polynomials.

    A Puiseux polynomial is a truncated Puiseux series. The exponents of the
    monomials can be negative or rational numbers. This ring is used by the
    ring_series module:

    >>> from sympy.polys.domains import QQ
    >>> from sympy.polys.puiseux import puiseux_ring
    >>> from sympy.polys.ring_series import rs_exp, rs_nth_root
    >>> ring, x, y = puiseux_ring('x y', QQ)
    >>> f = x**2 + y**3
    >>> f
    y**3 + x**2
    >>> f.diff(x)
    2*x
    >>> rs_exp(x, x, 5)
    1 + x + 1/2*x**2 + 1/6*x**3 + 1/24*x**4

    Importantly the Puiseux ring can represent truncated series with negative
    and fractional exponents:

    >>> f = 1/x + 1/y**2
    >>> f
    x**(-1) + y**(-2)
    >>> f.diff(x)
    -1*x**(-2)

    >>> rs_nth_root(8*x + x**2 + x**3, 3, x, 5)
    2*x**(1/3) + 1/12*x**(4/3) + 23/288*x**(7/3) + -139/20736*x**(10/3)

    See Also
    ========

    sympy.polys.ring_series.rs_series
    PuiseuxPoly
    r   r   r   r   c                   sz   t ||}|j}|j}| _| _|j _t fdd|jD  _| _ |j _ |j	 _	|j
 _
|j _d S )Nc                   s   g | ]}  |qS r   )	from_poly).0gselfr   r   
<listcomp>k       z(PuiseuxRing.__init__.<locals>.<listcomp>)r   r   ngens	poly_ringr   tupler   r   zeroone
zero_monommonomial_mul)r!   r   r   r%   r$   r   r    r   __init__`   s   
zPuiseuxRing.__init__r   strc                 C  s   d| j  d| j dS )NzPuiseuxRing(z, ))r   r   r    r   r   r   __repr__t   s   zPuiseuxRing.__repr__otherr   boolc                 C  s&   t |tstS | j|jko| j|jkS N)
isinstancer   NotImplementedr   r   r!   r/   r   r   r   __eq__w   s   
zPuiseuxRing.__eq__polyr   PuiseuxPolyc                 C  s
   t || S )aJ  Create a Puiseux polynomial from a polynomial.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.rings import ring
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R1, x1 = ring('x', QQ)
        >>> R2, x2 = puiseux_ring('x', QQ)
        >>> R2.from_poly(x1**2)
        x**2
        )r7   )r!   r6   r   r   r   r   |   s   
zPuiseuxRing.from_polytermsdict[tuple[int, ...], Any]c                 C  s   t || S )a  Create a Puiseux polynomial from a dictionary of terms.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.from_dict({(QQ(1,2),): QQ(3)})
        3*x**(1/2)
        )r7   	from_dict)r!   r8   r   r   r   r:      s   	zPuiseuxRing.from_dictnintc                 C  s   |  | |S )zCreate a Puiseux polynomial from an integer.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.from_int(3)
        3
        )r   r%   r!   r;   r   r   r   from_int   s   	zPuiseuxRing.from_intargc                 C     | j |S )a  Create a new element of the domain.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.domain_new(3)
        3
        >>> QQ.of_type(_)
        True
        )r%   
domain_newr!   r?   r   r   r   rA         zPuiseuxRing.domain_newc                 C     |  | j|S )a-  Create a new element from a ground element.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring, PuiseuxPoly
        >>> R, x = puiseux_ring('x', QQ)
        >>> R.ground_new(3)
        3
        >>> isinstance(_, PuiseuxPoly)
        True
        )r   r%   
ground_newrB   r   r   r   rE      s   zPuiseuxRing.ground_newc                 C  s$   t |tr
| |S | | |S )a  Coerce an element into the ring.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> R(3)
        3
        >>> R({(QQ(1,2),): QQ(3)})
        3*x**(1/2)
        )r2   dictr:   r   r%   rB   r   r   r   __call__   s   

zPuiseuxRing.__call__xc                 C  r@   )a  Return the index of a generator.

        >>> from sympy.polys.domains import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x y', QQ)
        >>> R.index(x)
        0
        >>> R.index(y)
        1
        )r   index)r!   rH   r   r   r   rI      rC   zPuiseuxRing.indexN)r   r   r   r   r   r,   r/   r   r   r0   )r6   r   r   r7   )r8   r9   r   r7   r;   r<   r   r7   )r?   r   r   r   )r?   r   r   r7   )rH   r7   r   r<   )__name__
__module____qualname____doc__r+   r.   r5   r   r:   r>   rA   rE   rG   rI   r   r   r   r   r   ;   s    
$







r   r6   r   monomIterable[int]c                   s*   | j }|j | fdd|  D S )Nc                   s   i | ]
\}} ||qS r   r   r   mcdivrQ   r   r   
<dictcomp>       z#_div_poly_monom.<locals>.<dictcomp>)r   monomial_divr:   r8   r6   rQ   r   r   rV   r   _div_poly_monom      r\   c                   s*   | j }|j| fdd|  D S )Nc                   s   i | ]
\}}| |qS r   r   rS   rQ   mulr   r   rX      rY   z#_mul_poly_monom.<locals>.<dictcomp>)r   r*   r:   r8   r[   r   r^   r   _mul_poly_monom   r]   r`   rW   tuple[int, ...]c                 C  s   t dd t| |D S )Nc                 s  s    | ]	\}}|| V  qd S r1   r   r   midir   r   r   	<genexpr>       z_div_monom.<locals>.<genexpr>r&   zip)rQ   rW   r   r   r   
_div_monom   s   ri   c                   @  s  e Zd ZU dZded< ded< ded< ded< dxd
dZedyddZedyddZdzddZ	ed{ddZ
ed|ddZed}ddZd~d d!Zdd#d$Zdd&d'Zdd(d)Zdd+d,Zdd-d.Zdd0d1Zedd2d3Zdd5d6Zedd9d:Zdd<d=Zdd?d@ZddBdCZddDdEZddFdGZddHdIZddJdKZddLdMZddNdOZ ddPdQZ!ddRdSZ"ddTdUZ#ddVdWZ$ddXdYZ%ddZd[Z&dd]d^Z'dd_d`Z(ddadbZ)ddcddZ*ddedfZ+ddgdhZ,ddidjZ-ddldmZ.ddndoZ/ddpdqZ0ddrdsZ1ddudvZ2dwS )r7   aR  Puiseux polynomial. Represents a truncated Puiseux series.

    See the :class:`PuiseuxRing` class for more information.

    >>> from sympy import QQ
    >>> from sympy.polys.puiseux import puiseux_ring
    >>> R, x, y = puiseux_ring('x, y', QQ)
    >>> p = 5*x**2 + 7*y**3
    >>> p
    7*y**3 + 5*x**2

    The internal representation of a Puiseux polynomial wraps a normal
    polynomial. To support negative powers the polynomial is considered to be
    divided by a monomial.

    >>> p2 = 1/x + 1/y**2
    >>> p2.monom # x*y**2
    (1, 2)
    >>> p2.poly
    x + y**2
    >>> (y**2 + x) / (x*y**2) == p2
    True

    To support fractional powers the polynomial is considered to be a function
    of ``x**(1/nx), y**(1/ny), ...``. The representation keeps track of a
    monomial and a list of exponent denominators so that the polynomial can be
    used to represent both negative and fractional powers.

    >>> p3 = x**QQ(1,2) + y**QQ(2,3)
    >>> p3.ns
    (2, 3)
    >>> p3.poly
    x + y**2

    See Also
    ========

    sympy.polys.puiseux.PuiseuxRing
    sympy.polys.rings.PolyElement
    r   r   r   r6   tuple[int, ...] | NonerQ   nsr   c                 C  s   |  ||d d S r1   )_new)clsr6   r   r   r   r   __new__  s   zPuiseuxPoly.__new__c                 C  s$   |  |||\}}}| ||||S r1   )
_normalize_new_raw)rm   r   r6   rQ   rk   r   r   r   rl     s   zPuiseuxPoly._newc                 C  s&   t | }||_||_||_||_|S r1   )objectrn   r   r6   rQ   rk   )rm   r   r6   rQ   rk   objr   r   r   rp   $  s   
zPuiseuxPoly._new_rawr/   r   r0   c                 C  sR   t |tr| j|jko| j|jko| j|jkS | jd u r'| jd u r'| j|S tS r1   )r2   r7   r6   rQ   rk   r5   r3   r4   r   r   r   r5   3  s   


zPuiseuxPoly.__eq__Btuple[PolyElement, tuple[int, ...] | None, tuple[int, ...] | None]c                 C  s|  |d u r|d u r|d d fS |d ur<dd |  D }tdd t||D r.t||}d }nt|r<t||}t||}|d ur| \}\}| }|d urQ|ndgt| }g }	g }
g }t||||D ]+\}}}}|dkrut	||}nt	|||}|	
||  |

||  |
||  qetdd |D r||}|}|d urt|
}tdd |	D rd }nt|	}|||fS )Nc                 S  s   g | ]}t |d qS )r   max)r   dr   r   r   r"   J  r#   z*PuiseuxPoly._normalize.<locals>.<listcomp>c                 s  s    | ]	\}}||kV  qd S r1   r   )r   rd   rc   r   r   r   re   K  rf   z)PuiseuxPoly._normalize.<locals>.<genexpr>r   c                 s  s    | ]}|d kV  qdS    Nr   )r   inflr   r   r   re   b      c                 s      | ]}|d kV  qdS rw   r   r   r;   r   r   r   re   j  rz   )tail_degreesallrh   r\   anyri   deflatedegreeslenr	   appendinflater&   )rm   r6   rQ   rk   degs	factors_dpoly_dr   monom_dns_new	monom_new
inflationsfinird   rc   r   r   r   r   ro   ?  sB   





zPuiseuxPoly._normalizera   dmonomtuple[Any, ...]c                 C  |   |d ur|d urt dd t|||D S |d ur%t dd t||D S |d ur5t dd t||D S t dd |D S )Nc                 s  s$    | ]\}}}t || |V  qd S r1   r   r   rc   rd   r   r   r   r   re   y     " z-PuiseuxPoly._monom_fromint.<locals>.<genexpr>c                 s  s     | ]\}}t || V  qd S r1   r   rb   r   r   r   re   {  s    c                 s      | ]
\}}t ||V  qd S r1   r   r   rc   r   r   r   r   re   }      c                 s  s    | ]}t |V  qd S r1   r   r   rc   r   r   r   re     rz   rg   rm   rQ   r   rk   r   r   r   _monom_fromintq  s   zPuiseuxPoly._monom_fromintc                 C  r   )Nc                 s  s(    | ]\}}}t || j| V  qd S r1   r<   	numeratorr   r   r   r   re     s    
z+PuiseuxPoly._monom_toint.<locals>.<genexpr>c                 s  s"    | ]\}}t |j| V  qd S r1   r   rb   r   r   r   re          c                 s  s"    | ]\}}t || jV  qd S r1   r   r   r   r   r   re     r   c                 s  s    | ]}t |jV  qd S r1   r   r   r   r   r   re     s    rg   r   r   r   r   _monom_toint  s   
zPuiseuxPoly._monom_tointIterator[tuple[Any, ...]]c                 c  s4    | j | j}}| j D ]
}| |||V  qdS )a@  Iterate over the monomials of a Puiseux polynomial.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x, y', QQ)
        >>> p = 5*x**2 + 7*y**3
        >>> list(p.itermonoms())
        [(2, 0), (0, 3)]
        >>> p[(2, 0)]
        5
        N)rQ   rk   r6   
itermonomsr   )r!   rQ   rk   rT   r   r   r   r     s
   zPuiseuxPoly.itermonomslist[tuple[Any, ...]]c                 C     t |  S )z7Return a list of the monomials of a Puiseux polynomial.)listr   r    r   r   r   monoms     zPuiseuxPoly.monoms%Iterator[tuple[tuple[Any, ...], Any]]c                 C  s   |   S r1   )r   r    r   r   r   __iter__  s   zPuiseuxPoly.__iter__c                 C  s   |  || j| j}| j| S r1   )r   rQ   rk   r6   )r!   rQ   r   r   r   __getitem__  s   
zPuiseuxPoly.__getitem__r<   c                 C  s
   t | jS r1   )r   r6   r    r   r   r   __len__  s   
zPuiseuxPoly.__len__c                 c  s@    | j | j}}| j D ]\}}| |||}||fV  qdS )a%  Iterate over the terms of a Puiseux polynomial.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x, y', QQ)
        >>> p = 5*x**2 + 7*y**3
        >>> list(p.iterterms())
        [((2, 0), 5), ((0, 3), 7)]
        N)rQ   rk   r6   	itertermsr   )r!   rQ   rk   rT   coeffmqr   r   r   r     s   
zPuiseuxPoly.iterterms!list[tuple[tuple[Any, ...], Any]]c                 C  r   )z3Return a list of the terms of a Puiseux polynomial.)r   r   r    r   r   r   r8     r   zPuiseuxPoly.termsc                 C  s   | j jS )z7Return True if the Puiseux polynomial is a single term.)r6   is_termr    r   r   r   r     s   zPuiseuxPoly.is_termr9   c                 C  r   )z;Return a dictionary representation of a Puiseux polynomial.)rF   r   r    r   r   r   to_dict  r   zPuiseuxPoly.to_dictr8   dict[tuple[Any, ...], Any]c                   s   dg|j  }dg|j  }|D ]}dd t||D }dd t||D }qt|s,dntdd t||D td	d |D rDdnt| fd
d| D }|j|} ||S )a^  Create a Puiseux polynomial from a dictionary of terms.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring, PuiseuxPoly
        >>> R, x = puiseux_ring('x', QQ)
        >>> PuiseuxPoly.from_dict({(QQ(1,2),): QQ(3)}, R)
        3*x**(1/2)
        >>> R.from_dict({(QQ(1,2),): QQ(3)})
        3*x**(1/2)
        rx   r   c                 S  s   g | ]
\}}t ||jqS r   )r
   denominator)r   r;   rT   r   r   r   r"     rY   z)PuiseuxPoly.from_dict.<locals>.<listcomp>c                 S  s   g | ]	\}}t ||qS r   )minr   rT   r;   r   r   r   r"     s    Nc                 s  s$    | ]\}}t || j V  qd S r1   r   r   r   r   r   re     r   z(PuiseuxPoly.from_dict.<locals>.<genexpr>c                 s  r{   rw   r   r|   r   r   r   re     rz   c                   s    i | ]\}}  ||qS r   )r   )r   rT   r   rm   rQ   ns_finalr   r   rX     s     z)PuiseuxPoly.from_dict.<locals>.<dictcomp>)	r$   rh   r   r&   r~   itemsr%   r:   rl   )rm   r8   r   rk   monmoterms_pr6   r   r   r   r:     s   zPuiseuxPoly.from_dictr   c                 C  sx   | j }|j}|j}g }|  D ](\}}||}g }t|D ]\}	}
|||	 |
  q|t|g|R   qt| S )aO  Convert a Puiseux polynomial to :class:`~sympy.core.expr.Expr`.

        >>> from sympy import QQ, Expr
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x = puiseux_ring('x', QQ)
        >>> p = 5*x**2 + 7*x**3
        >>> p.as_expr()
        7*x**3 + 5*x**2
        >>> isinstance(_, Expr)
        True
        )	r   r   r   r   to_sympy	enumerater   r   r   )r!   r   domr   r8   rQ   r   
coeff_exprmonoms_exprirT   r   r   r   as_expr  s   
zPuiseuxPoly.as_exprr,   c                   s   ddd | j }|j}dd	 |jD }g }t|  D ]:\}}d
 fddt||D }||jkrA|r;|| q|d q|sK|t	| q|| d
|  qd|S )Nbaser,   expr<   r   c                 S  s>   |dkr| S |dkrt ||kr|  d| S |  d| dS )Nrx   r   z**z**(r-   )r<   )r   r   r   r   r   format_power  s
   z*PuiseuxPoly.__repr__.<locals>.format_powerc                 S  s   g | ]}t |qS r   )r,   )r   sr   r   r   r"     s    z(PuiseuxPoly.__repr__.<locals>.<listcomp>*c                 3  s"    | ]\}}|r ||V  qd S r1   r   )r   r   er   r   r   re     r   z'PuiseuxPoly.__repr__.<locals>.<genexpr>1z + )r   r,   r   r<   r   r,   )
r   r   r   sortedr8   joinrh   r(   r   r,   )r!   r   r   syms	terms_strrQ   r   	monom_strr   r   r   r.   	  s   


zPuiseuxPoly.__repr__Otuple[PolyElement, PolyElement, tuple[int, ...] | None, tuple[int, ...] | None]c                 C  s  | j | j| j}}}|j |j|j}}}||kr$||kr$||||fS ||kr+|}n|dur~|dur~tdd t||D }dd t||D }	dd t||D }
||	}||
}|durmtdd t||	D }|dur}tdd t||
D }n:|dur|}||}|durtd	d t||D }n|dur|}||}|durtd
d t||D }nJ ||kr|}n?|dur|durtdd t||D }t|t||}t|t||}n|dur|}t||}n|dur|}t||}nJ ||||fS )z7Bring two Puiseux polynomials to a common monom and ns.Nc                 s  r   r1   )r
   )r   n1n2r   r   r   re   5  r   z%PuiseuxPoly._unify.<locals>.<genexpr>c                 S     g | ]\}}|| qS r   r   )r   r;   r   r   r   r   r"   6      z&PuiseuxPoly._unify.<locals>.<listcomp>c                 S  r   r   r   )r   r;   r   r   r   r   r"   7  r   c                 s      | ]	\}}|| V  qd S r1   r   r   rT   fr   r   r   re   ;  rf   c                 s  r   r1   r   r   r   r   r   re   =  rf   c                 s  r   r1   r   r   r   r   r   re   B  rf   c                 s  r   r1   r   r   r   r   r   re   G  rf   Fc                 s  r   r1   rt   )r   m1m2r   r   r   re   N  r   )r6   rQ   rk   r&   rh   r   r`   ri   )r!   r/   poly1monom1ns1poly2monom2ns2rk   f1f2rQ   r   r   r   _unify&  sX   



zPuiseuxPoly._unifyc                 C  s   | S r1   r   r    r   r   r   __pos__\  s   zPuiseuxPoly.__pos__c                 C  s   |  | j| j | j| jS r1   rp   r   r6   rQ   rk   r    r   r   r   __neg___  s   zPuiseuxPoly.__neg__c                 C  h   t |tr| j|jkrtd| |S | jj}t |tr(| |t	|t	S |
|r2| |S tS )Nz3Cannot add Puiseux polynomials from different rings)r2   r7   r   
ValueError_addr   r<   _add_groundconvert_fromr   of_typer3   r!   r/   r   r   r   r   __add__b  s   




zPuiseuxPoly.__add__c                 C  @   | j j}t|tr| |t|tS ||r| |S tS r1   )	r   r   r2   r<   r   r   r   r   r3   r   r   r   r   __radd__o     


zPuiseuxPoly.__radd__c                 C  r   )Nz8Cannot subtract Puiseux polynomials from different rings)r2   r7   r   r   _subr   r<   _sub_groundr   r   r   r3   r   r   r   r   __sub__x     




zPuiseuxPoly.__sub__c                 C  r   r1   )	r   r   r2   r<   _rsub_groundr   r   r   r3   r   r   r   r   __rsub__  r   zPuiseuxPoly.__rsub__c                 C  r   )Nz8Cannot multiply Puiseux polynomials from different rings)r2   r7   r   r   _mulr   r<   _mul_groundr   r   r   r3   r   r   r   r   __mul__  r   zPuiseuxPoly.__mul__c                 C  r   r1   )	r   r   r2   r<   r   r   r   r   r3   r   r   r   r   __rmul__  r   zPuiseuxPoly.__rmul__c                 C  s@   t |tr|dkr| |S | | S t|r| |S tS )Nr   )r2   r<   	_pow_pint	_pow_nintr   r   _pow_rationalr3   r4   r   r   r   __pow__  s   



zPuiseuxPoly.__pow__c                 C  sn   t |tr| j|jkrtd| | S | jj}t |tr+| |	t
d|t
S ||r5| |S tS )Nz6Cannot divide Puiseux polynomials from different ringsrx   )r2   r7   r   r   r   _invr   r<   r   r   r   r   _div_groundr3   r   r   r   r   __truediv__  s   



zPuiseuxPoly.__truediv__c                 C  sH   t |tr|  | jjt|tS | jj|r"|  |S t	S r1   )
r2   r<   r   r   r   r   r   r   r   r3   r4   r   r   r   __rtruediv__  s
   
zPuiseuxPoly.__rtruediv__c                 C  s(   |  |\}}}}| | j|| ||S r1   r   rl   r   r!   r/   r   r   rQ   rk   r   r   r   r        zPuiseuxPoly._addgroundc                 C  rD   r1   )r   r   rE   r!   r  r   r   r   r        zPuiseuxPoly._add_groundc                 C  s(   |  |\}}}}| | j|| ||S r1   r   r   r   r   r   r     r  zPuiseuxPoly._subc                 C  rD   r1   )r   r   rE   r  r   r   r   r     r  zPuiseuxPoly._sub_groundc                 C  s   | j || S r1   )r   rE   r   r  r   r   r   r     r  zPuiseuxPoly._rsub_groundc                 C  sB   |  |\}}}}|d urtdd |D }| | j|| ||S )Nc                 s  s    | ]}d | V  qdS )   Nr   )r   r   r   r   r   re     rz   z#PuiseuxPoly._mul.<locals>.<genexpr>)r   r&   rl   r   r   r   r   r   r     s   zPuiseuxPoly._mulc                 C  s   |  | j| j| | j| jS r1   r   r  r   r   r   r        zPuiseuxPoly._mul_groundc                 C  s   |  | j| j| | j| jS r1   r   r  r   r   r   r     r  zPuiseuxPoly._div_groundr;   c                   sJ    dksJ | j }|d urt fdd|D }| | j| j  || jS )Nr   c                 3      | ]}|  V  qd S r1   r   r   rT   r;   r   r   re     rz   z(PuiseuxPoly._pow_pint.<locals>.<genexpr>)rQ   r&   rl   r   r6   rk   )r!   r;   rQ   r   r	  r   r     s
   zPuiseuxPoly._pow_pintc                 C  s   |   |S r1   )r   r   r=   r   r   r   r     s   zPuiseuxPoly._pow_nintc                   s^   | j std|  \\}}| jj}||stdt fdd|D }| j||jiS )Nz0Only monomials can be raised to a rational powerc                 3  r  r1   r   r  r	  r   r   re     rz   z,PuiseuxPoly._pow_rational.<locals>.<genexpr>)	r   r   r8   r   r   is_oner&   r:   r(   )r!   r;   rQ   r   r   r   r	  r   r     s   
zPuiseuxPoly._pow_rationalc                 C  sf   | j std|  \\}}| jj}|js||stdtdd |D }d| }| j||iS )NzOnly terms can be invertedz"Cannot invert non-unit coefficientc                 s  s    | ]}| V  qd S r1   r   r  r   r   r   re     s    z#PuiseuxPoly._inv.<locals>.<genexpr>rx   )	r   r   r8   r   r   is_Fieldr
  r&   r:   )r!   rQ   r   r   r   r   r   r     s   zPuiseuxPoly._invrH   c           	      C  sb   | j }||}i }|  D ]\}}|| }|r,t|}||  d8  < || |t|< q||S )a:  Differentiate a Puiseux polynomial with respect to a variable.

        >>> from sympy import QQ
        >>> from sympy.polys.puiseux import puiseux_ring
        >>> R, x, y = puiseux_ring('x, y', QQ)
        >>> p = 5*x**2 + 7*y**3
        >>> p.diff(x)
        10*x
        >>> p.diff(y)
        21*y**2
        rx   )r   rI   r   r   r&   )	r!   rH   r   r   r   expvr   r;   r   r   r   r   diff  s   
zPuiseuxPoly.diffN)r6   r   r   r   r   r7   )
r   r   r6   r   rQ   rj   rk   rj   r   r7   rK   )r6   r   rQ   rj   rk   rj   r   rs   )rQ   ra   r   rj   rk   rj   r   r   )rQ   r   r   rj   rk   rj   r   ra   )r   r   )r   r   )r   r   )rQ   ra   r   r   )r   r<   )r   r   )r   r0   )r   r9   )r8   r   r   r   r   r7   )r   r   rJ   )r/   r7   r   r   )r   r7   )r/   r   r   r7   )r/   r7   r   r7   )r  r   r   r7   rL   )r;   r   r   r7   )rH   r7   r   r7   )3rM   rN   rO   rP   __annotations__rn   classmethodrl   rp   r5   ro   r   r   r   r   r   r   r   r   r8   propertyr   r   r:   r   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r7      sr   
 )


1








#


6



	

	

	














r7   N)r   r   r   r   r   r   )r6   r   rQ   rR   r   r   )rQ   rR   rW   rR   r   ra   )rP   
__future__r   sympy.polys.domainsr   sympy.polys.ringsr   r   sympy.core.addr   sympy.core.mulr   sympy.external.gmpyr	   r
   typingr   r   r   sympy.core.exprr   r   collections.abcr   r   r   r   r\   r`   ri   r7   r   r   r   r   <module>   s(    
 


