o
    GZhg                     @  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   B/var/www/auris/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oneZ
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
        )r6   )r!   r5   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)
        )r6   	from_dict)r!   r7   r   r   r   r9      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   r@         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_newrA   r   r   r   rD      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)
        )r1   dictr9   r   r%   rA   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!   rG   r   r   r   rH      rB   zPuiseuxRing.indexN)r   r   r   r   r   r+   r.   r   r   r/   )r5   r   r   r6   )r7   r8   r   r6   r:   r;   r   r6   )r>   r   r   r   )r>   r   r   r6   )rG   r6   r   r;   )__name__
__module____qualname____doc__r*   r-   r4   r   r9   r=   r@   rD   rF   rH   r   r   r   r   r   ;   s    
$







r   r5   r   monomIterable[int]c                   s*   | j }|j | fdd|  D S )Nc                   s   i | ]
\}} ||qS r   r   r   mcdivrP   r   r   
<dictcomp>       z#_div_poly_monom.<locals>.<dictcomp>)r   Zmonomial_divr9   r7   r5   rP   r   r   rU   r   _div_poly_monom      rZ   c                   s*   | j }|j| fdd|  D S )Nc                   s   i | ]
\}}| |qS r   r   rR   rP   mulr   r   rW      rX   z#_mul_poly_monom.<locals>.<dictcomp>)r   r)   r9   r7   rY   r   r\   r   _mul_poly_monom   r[   r^   rV   tuple[int, ...]c                 C  s   t dd t| |D S )Nc                 s  s    | ]	\}}|| V  qd S r0   r   r   midir   r   r   	<genexpr>       z_div_monom.<locals>.<genexpr>r&   zip)rP   rV   r   r   r   
_div_monom   s   rg   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 )r6   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   r5   tuple[int, ...] | NonerP   nsr   c                 C  s   |  ||d d S r0   )_new)clsr5   r   r   r   r   __new__  s   zPuiseuxPoly.__new__c                 C  s$   |  |||\}}}| ||||S r0   )
_normalize_new_raw)rk   r   r5   rP   ri   r   r   r   rj     s   zPuiseuxPoly._newc                 C  s&   t | }||_||_||_||_|S r0   )objectrl   r   r5   rP   ri   )rk   r   r5   rP   ri   objr   r   r   rn   $  s   
zPuiseuxPoly._new_rawr.   r   r/   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 r0   )r1   r6   r5   rP   ri   r4   r2   r3   r   r   r   r4   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 r0   r   )r   rb   ra   r   r   r   rc   K  rd   z)PuiseuxPoly._normalize.<locals>.<genexpr>r   c                 s  s    | ]}|d kV  qdS    Nr   )r   Zinflr   r   r   rc   b      c                 s      | ]}|d kV  qdS ru   r   r   r:   r   r   r   rc   j  rw   )Ztail_degreesallrf   rZ   anyrg   deflatedegreeslenr	   appendinflater&   )rk   r5   rP   ri   ZdegsZ	factors_dZpoly_dr}   Zmonom_dZns_newZ	monom_newZ
inflationsfinirb   ra   r   r   r   r   rm   ?  sB   





zPuiseuxPoly._normalizer_   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 r0   r   r   ra   rb   r   r   r   r   rc   y     " z-PuiseuxPoly._monom_fromint.<locals>.<genexpr>c                 s  s     | ]\}}t || V  qd S r0   r   r`   r   r   r   rc   {  s    c                 s      | ]
\}}t ||V  qd S r0   r   r   ra   r   r   r   r   rc   }      c                 s  s    | ]}t |V  qd S r0   r   r   ra   r   r   r   rc     rw   re   rk   rP   r   ri   r   r   r   _monom_fromintq  s   zPuiseuxPoly._monom_fromintc                 C  r   )Nc                 s  s(    | ]\}}}t || j| V  qd S r0   r;   	numeratorr   r   r   r   rc     s    
z+PuiseuxPoly._monom_toint.<locals>.<genexpr>c                 s  s"    | ]\}}t |j| V  qd S r0   r   r`   r   r   r   rc          c                 s  s"    | ]\}}t || jV  qd S r0   r   r   r   r   r   rc     r   c                 s  s    | ]}t |jV  qd S r0   r   r   r   r   r   rc     s    re   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)rP   ri   r5   
itermonomsr   )r!   rP   ri   rS   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 r0   )r   r    r   r   r   __iter__  s   zPuiseuxPoly.__iter__c                 C  s   |  || j| j}| j| S r0   )r   rP   ri   r5   )r!   rP   r   r   r   __getitem__  s   
zPuiseuxPoly.__getitem__r;   c                 C  s
   t | jS r0   )r~   r5   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)rP   ri   r5   	itertermsr   )r!   rP   ri   rS   coeffZ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   r7     r   zPuiseuxPoly.termsc                 C  s   | j jS )z7Return True if the Puiseux polynomial is a single term.)r5   is_termr    r   r   r   r     s   zPuiseuxPoly.is_termr8   c                 C  r   )z;Return a dictionary representation of a Puiseux polynomial.)rE   r   r    r   r   r   to_dict  r   zPuiseuxPoly.to_dictr7   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)
        rv   r   c                 S  s   g | ]
\}}t ||jqS r   )r
   denominator)r   r:   rS   r   r   r   r"     rX   z)PuiseuxPoly.from_dict.<locals>.<listcomp>c                 S  s   g | ]	\}}t ||qS r   )minr   rS   r:   r   r   r   r"     s    Nc                 s  s$    | ]\}}t || j V  qd S r0   r   r   r   r   r   rc     r   z(PuiseuxPoly.from_dict.<locals>.<genexpr>c                 s  rx   ru   r   ry   r   r   r   rc     rw   c                   s    i | ]\}}  ||qS r   )r   )r   rS   r   rk   rP   Zns_finalr   r   rW     s     z)PuiseuxPoly.from_dict.<locals>.<dictcomp>)	r$   rf   r{   r&   rz   itemsr%   r9   rj   )rk   r7   r   ri   monmoZterms_pr5   r   r   r   r9     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   Zto_sympy	enumerater   r   r   )r!   r   domr   r7   rP   r   Z
coeff_exprZmonoms_exprirS   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 )Nrv   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 r0   r   )r   r   er   r   r   rc     r   z'PuiseuxPoly.__repr__.<locals>.<genexpr>1z + )r   r+   r   r;   r   r+   )
r   r   r   sortedr7   joinrf   r(   r   r+   )r!   r   r   ZsymsZ	terms_strrP   r   Z	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   r0   )r
   )r   n1n2r   r   r   rc   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 r0   r   r   rS   fr   r   r   rc   ;  rd   c                 s  r   r0   r   r   r   r   r   rc   =  rd   c                 s  r   r0   r   r   r   r   r   rc   B  rd   c                 s  r   r0   r   r   r   r   r   rc   G  rd   Fc                 s  r   r0   rr   )r   m1m2r   r   r   rc   N  r   )r5   rP   ri   r&   rf   r   r^   rg   )r!   r.   poly1Zmonom1Zns1poly2Zmonom2Zns2ri   f1f2rP   r   r   r   _unify&  sX   



zPuiseuxPoly._unifyc                 C  s   | S r0   r   r    r   r   r   __pos__\  s   zPuiseuxPoly.__pos__c                 C  s   |  | j| j | j| jS r0   rn   r   r5   rP   ri   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)r1   r6   r   
ValueError_addr   r;   _add_groundconvert_fromr   of_typer2   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 r0   )	r   r   r1   r;   r   r   r   r   r2   r   r   r   r   __radd__o     


zPuiseuxPoly.__radd__c                 C  r   )Nz8Cannot subtract Puiseux polynomials from different rings)r1   r6   r   r   _subr   r;   _sub_groundr   r   r   r2   r   r   r   r   __sub__x     




zPuiseuxPoly.__sub__c                 C  r   r0   )	r   r   r1   r;   _rsub_groundr   r   r   r2   r   r   r   r   __rsub__  r   zPuiseuxPoly.__rsub__c                 C  r   )Nz8Cannot multiply Puiseux polynomials from different rings)r1   r6   r   r   _mulr   r;   _mul_groundr   r   r   r2   r   r   r   r   __mul__  r   zPuiseuxPoly.__mul__c                 C  r   r0   )	r   r   r1   r;   r   r   r   r   r2   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   )r1   r;   	_pow_pint	_pow_nintr   r   _pow_rationalr2   r3   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 ringsrv   )r1   r6   r   r   r   _invr   r;   r   r   r   r   _div_groundr2   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 r0   )
r1   r;   r   r   r   r   r   r   r   r2   r3   r   r   r   __rtruediv__  s
   
zPuiseuxPoly.__rtruediv__c                 C  s(   |  |\}}}}| | j|| ||S r0   r   rj   r   r!   r.   r   r   rP   ri   r   r   r   r        zPuiseuxPoly._addgroundc                 C  rC   r0   )r   r   rD   r!   r   r   r   r   r        zPuiseuxPoly._add_groundc                 C  s(   |  |\}}}}| | j|| ||S r0   r   r   r   r   r   r     r   zPuiseuxPoly._subc                 C  rC   r0   )r   r   rD   r   r   r   r   r     r   zPuiseuxPoly._sub_groundc                 C  s   | j || S r0   )r   rD   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   rc     rw   z#PuiseuxPoly._mul.<locals>.<genexpr>)r   r&   rj   r   r   r   r   r   r     s   zPuiseuxPoly._mulc                 C  s   |  | j| j| | j| jS r0   r   r   r   r   r   r        zPuiseuxPoly._mul_groundc                 C  s   |  | j| j| | j| jS r0   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 r0   r   r   rS   r:   r   r   rc     rw   z(PuiseuxPoly._pow_pint.<locals>.<genexpr>)rP   r&   rj   r   r5   ri   )r!   r:   rP   r   r   r   r     s
   zPuiseuxPoly._pow_pintc                 C  s   |   |S r0   )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   r0   r   r   r   r   r   rc     rw   z,PuiseuxPoly._pow_rational.<locals>.<genexpr>)	r   r   r7   r   r   is_oner&   r9   r(   )r!   r:   rP   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 r0   r   r   r   r   r   rc     s    z#PuiseuxPoly._inv.<locals>.<genexpr>rv   )	r   r   r7   r   r   Zis_Fieldr   r&   r9   )r!   rP   r   r   r   r   r   r     s   zPuiseuxPoly._invrG   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
        rv   )r   rH   r   r   r&   )	r!   rG   r   r   r   Zexpvr   r:   r   r   r   r   diff  s   
zPuiseuxPoly.diffN)r5   r   r   r   r   r6   )
r   r   r5   r   rP   rh   ri   rh   r   r6   rJ   )r5   r   rP   rh   ri   rh   r   rq   )rP   r_   r   rh   ri   rh   r   r   )rP   r   r   rh   ri   rh   r   r_   )r   r   )r   r   )r   r   )rP   r_   r   r   )r   r;   )r   r   )r   r/   )r   r8   )r7   r   r   r   r   r6   )r   r   rI   )r.   r6   r   r   )r   r6   )r.   r   r   r6   )r.   r6   r   r6   )r   r   r   r6   rK   )r:   r   r   r6   )rG   r6   r   r6   )3rL   rM   rN   rO   __annotations__rl   classmethodrj   rn   r4   rm   r   r   r   r   r   r   r   r   r7   propertyr   r   r9   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   r6      sr   
 )


1








#


6



	

	

	














r6   N)r   r   r   r   r   r   )r5   r   rP   rQ   r   r   )rP   rQ   rV   rQ   r   r_   )rO   
__future__r   Zsympy.polys.domainsr   Zsympy.polys.ringsr   r   Zsympy.core.addr   Zsympy.core.mulr   Zsympy.external.gmpyr	   r
   typingr   r   r   Zsympy.core.exprr   r   collections.abcr   r   r   r   rZ   r^   rg   r6   r   r   r   r   <module>   s(    
 


