o
    *ήc-                     @   s  d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 G dd de
ZddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- dd	l.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM dd
lNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ ddl]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZg ddlhmiZimjZjmkZkmlZlmmZmmnZnmoZo ddlpmqZqmrZrmsZsmtZt ddlumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZ ddlmZmZ dd ZG dd de
eZdd ZG dd de
eZdd ZG dd de
eZdS )z1OO layer for several polynomial representations.     )oo)CantSympify)CoercionFailedNotReversibleNotInvertible)PicklableWithSlotsc                   @   s4   e Zd ZdZdd Zdd Zdd Zedd	 Zd
S )GenericPolyz5Base class for low-level polynomial representations. c                 C      |  | j S zMake the ground domain a ring. )
set_domaindomget_ringf r   >/tmp/pip-target-vg8gfxp4/lib/python/sympy/polys/polyclasses.pyground_to_ring      zGenericPoly.ground_to_ringc                 C   r	   z Make the ground domain a field. )r   r   	get_fieldr   r   r   r   ground_to_field   r   zGenericPoly.ground_to_fieldc                 C   r	   zMake the ground domain exact. )r   r   	get_exactr   r   r   r   ground_to_exact   r   zGenericPoly.ground_to_exactc                    s.   |r|\}} fdd|D }|r||fS |S )Nc                    s   g | ]
\}} ||fqS r   r   .0gkperr   r   
<listcomp>   s    z/GenericPoly._perify_factors.<locals>.<listcomp>r   )r   resultincludecoefffactorsr   r   r   _perify_factors   s   zGenericPoly._perify_factorsN)	__name__
__module____qualname____doc__r   r   r   classmethodr%   r   r   r   r   r   
   s    r   )!dmp_validate
dup_normal
dmp_normaldup_convertdmp_convertdmp_from_sympy	dup_strip
dup_degreedmp_degree_indmp_degree_listdmp_negative_pdup_LCdmp_ground_LCdup_TCdmp_ground_TCdmp_ground_nthdmp_one
dmp_ground
dmp_zero_p	dmp_one_pdmp_ground_pdup_from_dictdmp_from_dictdmp_to_dictdmp_deflate
dmp_inject	dmp_ejectdmp_terms_gcddmp_list_termsdmp_excludedmp_slice_indmp_permutedmp_to_tuple)dmp_add_grounddmp_sub_grounddmp_mul_grounddmp_quo_grounddmp_exquo_grounddmp_absdup_negdmp_negdup_adddmp_adddup_subdmp_subdup_muldmp_muldmp_sqrdup_powdmp_powdmp_pdivdmp_premdmp_pquo
dmp_pexquodmp_divdup_remdmp_remdmp_quo	dmp_exquodmp_add_muldmp_sub_muldmp_max_normdmp_l1_normdmp_l2_norm_squared)dmp_clear_denomsdmp_integrate_indmp_diff_indmp_eval_in
dup_revertdmp_ground_truncdmp_ground_contentdmp_ground_primitivedmp_ground_monicdmp_composedup_decompose	dup_shiftdup_transformdmp_lift)
dup_half_gcdex	dup_gcdex
dup_invertdmp_subresultantsdmp_resultantdmp_discriminantdmp_inner_gcddmp_gcddmp_lcm
dmp_cancel)dup_gff_listdmp_norm	dmp_sqf_pdmp_sqf_normdmp_sqf_partdmp_sqf_listdmp_sqf_list_include)dup_cyclotomic_pdmp_irreducible_pdmp_factor_listdmp_factor_list_include)dup_isolate_real_roots_sqfdup_isolate_real_rootsdup_isolate_all_roots_sqfdup_isolate_all_rootsdup_refine_real_rootdup_count_real_rootsdup_count_complex_roots	dup_sturmdup_cauchy_upper_bounddup_cauchy_lower_bounddup_mignotte_sep_bound_squared)UnificationFailedPolynomialErrorc                 C   s   t t| ||||S N)DMPr-   )replevr   r   r   r   init_normal_DMP      r   c                   @   sh  e Zd ZdZdZd ddZdd Zdd	 Zd
d Zd!ddZ	e
d"ddZe
d"ddZe
dd Ze
dd Zd#ddZd#ddZdd Zdd Zdd  Ze
d!d" Ze
d"d#d$Zd%d& Zd'd( Zd)d* Zd+d, Zd$d.d/Zd"d0d1Zd"d2d3Zd"d4d5Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d#d@dAZ#d#dBdCZ$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dZd[ Z0d\d] Z1d^d_ Z2d`da Z3dbdc Z4ddde Z5dfdg Z6dhdi Z7djdk Z8dldm Z9dndo Z:dpdq Z;d$drdsZ<dtdu Z=dvdw Z>dxdy Z?dzd{ Z@d|d} ZAd~d ZBdd ZCdd ZDdd ZEdd ZFdd ZGd%ddZHd%ddZId$ddZJdd ZKdd ZLdd ZMdd ZNdd ZOd#ddZPdd ZQdd ZRdd ZSdd ZTd&ddZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd ZbddÄ Zcddń ZdddǄ Zed#ddɄZfd#dd˄Zgdd̈́ Zhddτ Zid'ddфZjd(ddӄZkd ddՄZld ddׄZmenddل Zoenddۄ Zpendd݄ Zqendd߄ Zrendd Zsendd Ztendd Zuendd Zvendd Zwendd Zxendd Zyendd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zd d Zdd Zdd Zdd Zdd	 Zd
d Zdd Zdd Zd#ddZd#ddZdd Zdd Zdd Zdd Zdd Zdd ZdS ()  r   z)Dense Multivariate Polynomials over `K`. )r   r   r   ringNc                 C   sf   |d urt |tu rt|||}nt|tst|||}nt|\}}|| _|| _	|| _
|| _d S r   )typedictrA   
isinstancelistr<   convertr+   r   r   r   r   )selfr   r   r   r   r   r   r   __init__   s   

zDMP.__init__c                 C      d| j j| j| j| jf S Nz%s(%s, %s, %s))	__class__r&   r   r   r   r   r   r   r   __repr__      zDMP.__repr__c                 C   s    t | jj|  | j| j| jfS r   )hashr   r&   to_tupler   r   r   r   r   r   r   __hash__   s    zDMP.__hash__c                    s   t |tr| j|jkrtd| |f | j|jkr+| j|jkr+| j| j| j| j|jfS | j| j|j}}| j |jdurL durI |j n|j t	| j|| j|}t	|j||j|}||df fdd	}|||||fS )z7Unify representations of two multivariate polynomials. Cannot unify %s with %sNFc                    s"   |r
|s| S |d8 }t | || S N   r   )r   r   r   killr   r   r   r      s
   zDMP.unify.<locals>.per)
r   r   r   r   r   r   r   r   unifyr/   )r   r   r   r   FGr   r   r   r   r      s   
	z	DMP.unifyFc                 C   sD   | j }|r|s	|S |d8 }|du r| j}|du r| j}t||||S ).Create a DMP out of the given representation. r   N)r   r   r   r   )r   r   r   r   r   r   r   r   r   r      s   zDMP.perc                 C      t d|||S Nr   r   clsr   r   r   r   r   r   zero      zDMP.zeroc                 C   r   r   r   r   r   r   r   one   r   zDMP.onec                 C   s   | t ||d|||S )zCCreate an instance of ``cls`` given a list of native coefficients. N)r/   r   r   r   r   r   r   r   	from_list      zDMP.from_listc                 C      | t |||||S )zBCreate an instance of ``cls`` given a list of SymPy coefficients. )r0   r   r   r   r   from_sympy_list      zDMP.from_sympy_listc                 C      t | j| j| j|dS )AConvert ``f`` to a dict representation with native coefficients. r   )rB   r   r   r   )r   r   r   r   r   to_dict      zDMP.to_dictc                 C   s<   t | j| j| j|d}| D ]\}}| j|||< q|S )@Convert ``f`` to a dict representation with SymPy coefficients. r   )rB   r   r   r   itemsto_sympy)r   r   r   r   vr   r   r   to_sympy_dict   s   zDMP.to_sympy_dictc                 C      | j S zAConvert ``f`` to a list representation with native coefficients. r   r   r   r   r   to_list      zDMP.to_listc                    s    fdd j S )@Convert ``f`` to a list representation with SymPy coefficients. c                    s>   g }| D ]}t |tr|| q| j| q|S r   )r   r   appendr   r   )r   outvalr   sympify_nested_listr   r   r     s   
z.DMP.to_sympy_list.<locals>.sympify_nested_listr   r   r   r   r   to_sympy_list   s   
	zDMP.to_sympy_listc                 C      t | j| jS )x
        Convert ``f`` to a tuple representation with native coefficients.

        This is needed for hashing.
        )rK   r   r   r   r   r   r   r     s   zDMP.to_tuplec                 C   r   )zBConstruct and instance of ``cls`` from a ``dict`` representation. )rA   r   r   r   r   	from_dict  r   zDMP.from_dictc                 C   s   t ttt|||||S r   )r   r   r   zip)r   monomscoeffsr   r   r   r   r   r   from_monoms_coeffs     zDMP.from_monoms_coeffsc                 C   r	   r
   )r   r   r   r   r   r   r   to_ring  r   zDMP.to_ringc                 C   r	   r   )r   r   r   r   r   r   r   to_field!  r   zDMP.to_fieldc                 C   r	   r   )r   r   r   r   r   r   r   to_exact%  r   zDMP.to_exactc                 C   s,   | j |kr| S tt| j| j| j ||| jS )z$Convert the ground domain of ``f``. )r   r   r/   r   r   )r   r   r   r   r   r   )  s   
zDMP.convertr   c              	   C   s   |  t| j|||| j| jS )z1Take a continuous subsequence of terms of ``f``. )r   rI   r   r   r   )r   mnjr   r   r   slice0  s   z	DMP.slicec                 C       dd t | j| j| j|dD S )z;Returns all non-zero coefficients from ``f`` in lex order. c                 S   s   g | ]\}}|qS r   r   )r   _cr   r   r   r    6      zDMP.coeffs.<locals>.<listcomp>orderrG   r   r   r   r   r   r   r   r   r   4      z
DMP.coeffsc                 C   r   )z8Returns all non-zero monomials from ``f`` in lex order. c                 S   s   g | ]\}}|qS r   r   )r   r   r   r   r   r   r    :  r   zDMP.monoms.<locals>.<listcomp>r   r   r   r   r   r   r   8  r   z
DMP.monomsc                 C   r   )z4Returns all non-zero terms from ``f`` in lex order. r   r   r   r   r   r   terms<  r   z	DMP.termsc                 C   s,   | j s| s
| jjgS dd | jD S td)z%Returns all coefficients from ``f``. c                 S   s   g | ]}|qS r   r   r   r   r   r   r   r    F  s    z"DMP.all_coeffs.<locals>.<listcomp>&multivariate polynomials not supported)r   r   r   r   r   r   r   r   r   
all_coeffs@  s
   
zDMP.all_coeffsc                    s>   | j st| j  dk rdgS  fddt| jD S td)z"Returns all monomials from ``f``. r   r   c                    s   g | ]	\}} | fqS r   r   r   ir   r   r   r   r    R  s    z"DMP.all_monoms.<locals>.<listcomp>r   )r   r2   r   	enumerater   r   r   r   r   
all_monomsJ  s   
zDMP.all_monomsc                    sF   | j st| j  dk rd| jjfgS  fddt| jD S td)z Returns all terms from a ``f``. r   r   c                    s   g | ]\}} | f|fqS r   r   r   r   r   r   r    ^      z!DMP.all_terms.<locals>.<listcomp>r   )r   r2   r   r   r   r   r   r   r   r   r   	all_termsV  s   
zDMP.all_termsc                 C   s    | j t| j| j| j| jjdS )z-Convert algebraic coefficients to rationals. r   )r   rx   r   r   r   r   r   r   r   liftb  r   zDMP.liftc                 C   $   t | j| j| j\}}|| |fS )z2Reduce degree of `f` by mapping `x_i^m` to `y_i`. )rC   r   r   r   r   r   Jr   r   r   r   deflatef     zDMP.deflatec                 C   s,   t | j| j| j|d\}}| || jj|S )z,Inject ground domain generators into ``f``. front)rD   r   r   r   r   )r   r
  r   r   r   r   r   injectk  s   z
DMP.injectc                 C   s.   t | j| j||d}| ||| jt|j S )z2Eject selected generators into the ground domain. r	  )rE   r   r   r   lensymbols)r   r   r
  r   r   r   r   ejectp  s   z	DMP.ejectc                 C   s,   t | j| j| j\}}}|| || j|fS )ao  
        Remove useless generators from ``f``.

        Returns the removed generators and the new excluded ``f``.

        Examples
        ========

        >>> from sympy.polys.polyclasses import DMP
        >>> from sympy.polys.domains import ZZ

        >>> DMP([[[ZZ(1)]], [[ZZ(1)], [ZZ(2)]]], ZZ).exclude()
        ([2], DMP([[1], [1, 2]], ZZ, None))

        )rH   r   r   r   r   )r   r  r   ur   r   r   excludeu  s   zDMP.excludec                 C   s   |  t| j|| j| jS )a  
        Returns a polynomial in `K[x_{P(1)}, ..., x_{P(n)}]`.

        Examples
        ========

        >>> from sympy.polys.polyclasses import DMP
        >>> from sympy.polys.domains import ZZ

        >>> DMP([[[ZZ(2)], [ZZ(1), ZZ(0)]], [[]]], ZZ).permute([1, 0, 2])
        DMP([[[2], []], [[1, 0], []]], ZZ, None)

        >>> DMP([[[ZZ(2)], [ZZ(1), ZZ(0)]], [[]]], ZZ).permute([1, 2, 0])
        DMP([[[1], []], [[2, 0], []]], ZZ, None)

        )r   rJ   r   r   r   )r   Pr   r   r   permute  s   zDMP.permutec                 C   r  )z/Remove GCD of terms from the polynomial ``f``. )rF   r   r   r   r   r  r   r   r   	terms_gcd  r  zDMP.terms_gcdc                 C   "   |  t| j| j|| j| jS )z.Add an element of the ground domain to ``f``. )r   rL   r   r   r   r   r   r   r   r   r   
add_ground     "zDMP.add_groundc                 C   r  )z5Subtract an element of the ground domain from ``f``. )r   rM   r   r   r   r   r  r   r   r   
sub_ground  r  zDMP.sub_groundc                 C   r  )z5Multiply ``f`` by a an element of the ground domain. )r   rN   r   r   r   r   r  r   r   r   
mul_ground  r  zDMP.mul_groundc                 C   r  )z8Quotient of ``f`` by a an element of the ground domain. )r   rO   r   r   r   r   r  r   r   r   
quo_ground  r  zDMP.quo_groundc                 C   r  )z>Exact quotient of ``f`` by a an element of the ground domain. )r   rP   r   r   r   r   r  r   r   r   exquo_ground  r  zDMP.exquo_groundc                 C      |  t| j| j| jS )z)Make all coefficients in ``f`` positive. )r   rQ   r   r   r   r   r   r   r   abs     zDMP.absc                 C   r  )"Negate all coefficients in ``f``. )r   rS   r   r   r   r   r   r   r   neg  r  zDMP.negc                 C   &   |  |\}}}}}|t||||S )z2Add two multivariate polynomials ``f`` and ``g``. )r   rU   r   r   r   r   r   r   r   r   r   r   add     zDMP.addc                 C   r!  )z7Subtract two multivariate polynomials ``f`` and ``g``. )r   rW   r"  r   r   r   sub  r$  zDMP.subc                 C   r!  )z7Multiply two multivariate polynomials ``f`` and ``g``. )r   rY   r"  r   r   r   mul  r$  zDMP.mulc                 C   r  )z(Square a multivariate polynomial ``f``. )r   rZ   r   r   r   r   r   r   r   sqr  r  zDMP.sqrc                 C   s4   t |tr| t| j|| j| jS tdt| )+Raise ``f`` to a non-negative power ``n``. ``int`` expected, got %s)	r   intr   r\   r   r   r   	TypeErrorr   r   r   r   r   r   pow  s   
zDMP.powc           	      C   6   |  |\}}}}}t||||\}}||||fS )z/Polynomial pseudo-division of ``f`` and ``g``. )r   r]   	r   r   r   r   r   r   r   qrr   r   r   pdiv     zDMP.pdivc                 C   r!  )z0Polynomial pseudo-remainder of ``f`` and ``g``. )r   r^   r"  r   r   r   prem  r$  zDMP.premc                 C   r!  )z/Polynomial pseudo-quotient of ``f`` and ``g``. )r   r_   r"  r   r   r   pquo  r$  zDMP.pquoc                 C   r!  )z5Polynomial exact pseudo-quotient of ``f`` and ``g``. )r   r`   r"  r   r   r   pexquo  r$  z
DMP.pexquoc           	      C   r.  )z7Polynomial division with remainder of ``f`` and ``g``. )r   ra   r/  r   r   r   div  r3  zDMP.divc                 C   r!  )z2Computes polynomial remainder of ``f`` and ``g``. )r   rc   r"  r   r   r   rem  r$  zDMP.remc                 C   r!  )z1Computes polynomial quotient of ``f`` and ``g``. )r   rd   r"  r   r   r   quo  r$  zDMP.quoc           	      C   sT   |  |\}}}}}|t||||}| jr(|| jvr(ddlm} || || j|S )z7Computes polynomial exact quotient of ``f`` and ``g``. r   ExactQuotientFailed)r   re   r   sympy.polys.polyerrorsr;  )	r   r   r   r   r   r   r   resr;  r   r   r   exquo  s   z	DMP.exquoc                 C   s*   t |trt| j|| jS tdt| )z0Returns the leading degree of ``f`` in ``x_j``. r)  )r   r*  r3   r   r   r+  r   )r   r   r   r   r   degree  s   
z
DMP.degreec                 C   r   )z$Returns a list of degrees of ``f``. )r4   r   r   r   r   r   r   degree_list  r   zDMP.degree_listc                 C   s   t dd |  D S )z#Returns the total degree of ``f``. c                 s   s    | ]}t |V  qd S r   sum)r   r   r   r   r   	<genexpr>  s    z#DMP.total_degree.<locals>.<genexpr>)maxr   r   r   r   r   total_degree  r   zDMP.total_degreec           	      C   s   |   }i }|t|  d d k}|  D ]7}t|d }||k r'|| }nd}|r7|d ||d |f < qt|d }||  |7  < |d |t|< qt|| j| jt	| | j
S )z&Return homogeneous polynomial of ``f``r   r   )rE  r  r   rB  r   tupler   r   r   r*  r   )	r   stdr!   
new_symboltermdr   lr   r   r   
homogenize  s   
zDMP.homogenizec                 C   sD   | j rt S |  }t|d }|D ]}t|}||kr dS q|S )z(Returns the homogeneous order of ``f``. r   N)is_zeror   r   rB  )r   r   tdegmonom_tdegr   r   r   homogeneous_order&  s   zDMP.homogeneous_orderc                 C      t | j| j| jS z*Returns the leading coefficient of ``f``. )r7   r   r   r   r   r   r   r   LC6     zDMP.LCc                 C   rS  z+Returns the trailing coefficient of ``f``. )r9   r   r   r   r   r   r   r   TC:  rV  zDMP.TCc                 G   s.   t dd |D rt| j|| j| jS td)z+Returns the ``n``-th coefficient of ``f``. c                 s   s    | ]}t |tV  qd S r   )r   r*  )r   r   r   r   r   rC  @  s    zDMP.nth.<locals>.<genexpr>za sequence of integers expected)allr:   r   r   r   r+  )r   Nr   r   r   nth>  s   zDMP.nthc                 C   rS  )zReturns maximum norm of ``f``. )rh   r   r   r   r   r   r   r   max_normE  rV  zDMP.max_normc                 C   rS  )zReturns l1 norm of ``f``. )ri   r   r   r   r   r   r   r   l1_normI  rV  zDMP.l1_normc                 C   rS  )z!Return squared l2 norm of ``f``. )rj   r   r   r   r   r   r   r   l2_norm_squaredM  rV  zDMP.l2_norm_squaredc                 C   r  )z0Clear denominators, but keep the ground domain. )rk   r   r   r   r   )r   r#   r   r   r   r   clear_denomsQ  r  zDMP.clear_denomsr   c                 C   P   t |tstdt| t |tstdt| | t| j||| j| jS )zEComputes the ``m``-th order indefinite integral of ``f`` in ``x_j``. r)  )	r   r*  r+  r   r   rl   r   r   r   r   r   r   r   r   r   	integrateV  
   

zDMP.integratec                 C   r`  )z<Computes the ``m``-th order derivative of ``f`` in ``x_j``. r)  )	r   r*  r+  r   r   rm   r   r   r   ra  r   r   r   diff`  rc  zDMP.diffc                 C   sB   t |tstdt| | jt| j| j||| j	| jddS )z5Evaluates ``f`` at the given point ``a`` in ``x_j``. r)  Tr   )
r   r*  r+  r   r   rn   r   r   r   r   )r   ar   r   r   r   evalj  s   

zDMP.evalc           	      C   s@   |  |\}}}}}|st|||\}}||||fS td)z2Half extended Euclidean algorithm, if univariate. univariate polynomial expected)r   ry   
ValueError)	r   r   r   r   r   r   r   rG  hr   r   r   
half_gcdexr  s
   zDMP.half_gcdexc           
      C   sH   |  |\}}}}}|s t|||\}}}	||||||	fS td)z-Extended Euclidean algorithm, if univariate. rh  )r   rz   ri  )
r   r   r   r   r   r   r   rG  trj  r   r   r   gcdex|  s
   z	DMP.gcdexc                 C   s0   |  |\}}}}}|s|t|||S td)z(Invert ``f`` modulo ``g``, if possible. rh  )r   r{   ri  r"  r   r   r   invert  s   z
DMP.invertc                 C   s$   | j s| t| j|| jS td)z"Compute ``f**(-1)`` mod ``x**n``. rh  )r   r   ro   r   r   ri  r,  r   r   r   revert  s   z
DMP.revertc                 C   s0   |  |\}}}}}t||||}tt||S )z7Computes subresultant PRS sequence of ``f`` and ``g``. )r   r|   r   map)r   r   r   r   r   r   r   Rr   r   r   subresultants  s   zDMP.subresultantsc           
      C   s^   |  |\}}}}}|r$t|||||d\}}	||ddtt||	fS |t||||ddS )z/Computes resultant of ``f`` and ``g`` via PRS. )
includePRSTre  )r   r}   r   rp  )
r   r   rs  r   r   r   r   r   r=  rq  r   r   r   	resultant  s
   zDMP.resultantc                 C   s   | j t| j| j| jddS )z Computes discriminant of ``f``. Tre  )r   r~   r   r   r   r   r   r   r   discriminant  r   zDMP.discriminantc           
      C   s>   |  |\}}}}}t||||\}}}	||||||	fS )z4Returns GCD of ``f`` and ``g`` and their cofactors. )r   r   )
r   r   r   r   r   r   r   rj  cffcfgr   r   r   	cofactors  s   zDMP.cofactorsc                 C   r!  )z+Returns polynomial GCD of ``f`` and ``g``. )r   r   r"  r   r   r   gcd  r$  zDMP.gcdc                 C   r!  )z+Returns polynomial LCM of ``f`` and ``g``. )r   r   r"  r   r   r   lcm  r$  zDMP.lcmTc           
      C   st   |  |\}}}}}|rt||||dd\}}nt||||dd\}}	}}||||}}|r4||fS ||	||fS )z6Cancel common factors in a rational function ``f/g``. T)r"   F)r   r   )
r   r   r"   r   r   r   r   r   cFcGr   r   r   cancel  s   z
DMP.cancelc                 C   r  )z&Reduce ``f`` modulo a constant ``p``. )r   rp   r   r   r   r   )r   pr   r   r   trunc  r  z	DMP.truncc                 C   r  )z'Divides all coefficients by ``LC(f)``. )r   rs   r   r   r   r   r   r   r   monic  r  z	DMP.monicc                 C   rS  )z(Returns GCD of polynomial coefficients. )rq   r   r   r   r   r   r   r   content  rV  zDMP.contentc                 C   r  )z/Returns content and a primitive form of ``f``. )rr   r   r   r   r   )r   contr   r   r   r   	primitive  r  zDMP.primitivec                 C   r!  )z4Computes functional composition of ``f`` and ``g``. )r   rt   r"  r   r   r   compose  r$  zDMP.composec                 C   (   | j stt| jt| j| jS td)z,Computes functional decomposition of ``f``. rh  )r   r   rp  r   ru   r   r   ri  r   r   r   r   	decompose     zDMP.decomposec                 C   s,   | j s| t| j| j|| jS td)z/Efficiently compute Taylor shift ``f(x + a)``. rh  )r   r   rv   r   r   r   ri  )r   rf  r   r   r   shift  s   z	DMP.shiftc           	      C   s   | j rtd||\}}}}}| ||||\}}}}}||||||||\}}}}}|s<|t||||S td)z5Evaluate functional transformation ``q**n * f(p/q)``.rh  )r   ri  r   rw   )	r   r~  r0  r   r   r   r  Qr   r   r   r   	transform  s   $zDMP.transformc                 C   r  )z&Computes the Sturm sequence of ``f``. rh  )r   r   rp  r   r   r   r   ri  r   r   r   r   sturm  r  z	DMP.sturmc                 C      | j s
t| j| jS td)z7Computes the Cauchy upper bound on the roots of ``f``. rh  )r   r   r   r   ri  r   r   r   r   cauchy_upper_bound     zDMP.cauchy_upper_boundc                 C   r  )z?Computes the Cauchy lower bound on the nonzero roots of ``f``. rh  )r   r   r   r   ri  r   r   r   r   cauchy_lower_bound  r  zDMP.cauchy_lower_boundc                 C   r  )zBComputes the squared Mignotte bound on root separations of ``f``. rh  )r   r   r   r   ri  r   r   r   r   mignotte_sep_bound_squared  r  zDMP.mignotte_sep_bound_squaredc                    s*    j s fddt j jD S td)z4Computes greatest factorial factorization of ``f``. c                       g | ]\}}  ||fqS r   r   r   r   r   r   r      r   z DMP.gff_list.<locals>.<listcomp>rh  )r   r   r   r   ri  r   r   r   r   gff_list  s   zDMP.gff_listc                 C   s$   t | j| j| j}| j|| jjdS )zComputes ``Norm(f)``.r  )r   r   r   r   r   )r   r1  r   r   r   norm     zDMP.normc                 C   s6   t | j| j| j\}}}|| || j|| jjdfS )z$Computes square-free norm of ``f``. r  )r   r   r   r   r   )r   rG  r   r1  r   r   r   sqf_norm"  s   zDMP.sqf_normc                 C   r  )z$Computes square-free part of ``f``. )r   r   r   r   r   r   r   r   r   sqf_part'  r  zDMP.sqf_partc                    s.   t  j j j|\}}| fdd|D fS )0Returns a list of square-free factors of ``f``. c                    r  r   r   r   r   r   r   r    .  r   z DMP.sqf_list.<locals>.<listcomp>)r   r   r   r   )r   rY  r#   r$   r   r   r   sqf_list+  s   zDMP.sqf_listc                    s&   t  j j j|} fdd|D S )r  c                    r  r   r   r   r   r   r   r    3  r   z(DMP.sqf_list_include.<locals>.<listcomp>)r   r   r   r   )r   rY  r$   r   r   r   sqf_list_include0  r$  zDMP.sqf_list_includec                    s,   t  j j j\}}| fdd|D fS )0Returns a list of irreducible factors of ``f``. c                    r  r   r   r   r   r   r   r    8  r   z#DMP.factor_list.<locals>.<listcomp>)r   r   r   r   )r   r#   r$   r   r   r   factor_list5  s   zDMP.factor_listc                    s$   t  j j j} fdd|D S )r  c                    r  r   r   r   r   r   r   r    =  r   z+DMP.factor_list_include.<locals>.<listcomp>)r   r   r   r   )r   r$   r   r   r   factor_list_include:  r  zDMP.factor_list_includec                 C   sz   | j s9|s|st| j| j||||dS t| j| j||||dS |s-t| j| j||||dS t| j| j||||dS td)z0Compute isolating intervals for roots of ``f``. )epsinfsupfastz1Cannot isolate roots of a multivariate polynomial)r   r   r   r   r   r   r   r   )r   rY  r  r  r  r  sqfr   r   r   	intervals?  s   zDMP.intervalsc              	   C   s(   | j st| j||| j|||dS td)zu
        Refine an isolating interval to the given precision.

        ``eps`` should be a rational number.

        )r  stepsr  z1Cannot refine a root of a multivariate polynomial)r   r   r   r   r   )r   rG  rl  r  r  r  r   r   r   refine_rootP  s
   zDMP.refine_rootc                 C      t | j| j||dS )z<Return the number of real roots of ``f`` in ``[inf, sup]``. r  r  )r   r   r   r   r  r  r   r   r   count_real_roots]     zDMP.count_real_rootsc                 C   r  )z?Return the number of complex roots of ``f`` in ``[inf, sup]``. r  )r   r   r   r  r   r   r   count_complex_rootsa  r  zDMP.count_complex_rootsc                 C   r   )z0Returns ``True`` if ``f`` is a zero polynomial. r=   r   r   r   r   r   r   rN  e     zDMP.is_zeroc                 C   rS  )z0Returns ``True`` if ``f`` is a unit polynomial. )r>   r   r   r   r   r   r   r   is_onej     z
DMP.is_onec                 C      t | jd| jS )>Returns ``True`` if ``f`` is an element of the ground domain. N)r?   r   r   r   r   r   r   	is_groundo     zDMP.is_groundc                 C   rS  )z7Returns ``True`` if ``f`` is a square-free polynomial. )r   r   r   r   r   r   r   r   is_sqft  r  z
DMP.is_sqfc                 C      | j t| j| j| j S )z=Returns ``True`` if the leading coefficient of ``f`` is one. )r   r  r7   r   r   r   r   r   r   is_monicy     zDMP.is_monicc                 C   r  )zAReturns ``True`` if the GCD of the coefficients of ``f`` is one. )r   r  rq   r   r   r   r   r   r   is_primitive~  r  zDMP.is_primitivec                 C   $   t dd t| j| j| j D S )z:Returns ``True`` if ``f`` is linear in all its variables. c                 s       | ]	}t |d kV  qdS )r   NrA  r   rP  r   r   r   rC        z DMP.is_linear.<locals>.<genexpr>rY  rB   r   r   r   keysr   r   r   r   	is_linear     $zDMP.is_linearc                 C   r  )z=Returns ``True`` if ``f`` is quadratic in all its variables. c                 s   r  )   NrA  r  r   r   r   rC    r  z#DMP.is_quadratic.<locals>.<genexpr>r  r   r   r   r   is_quadratic  r  zDMP.is_quadraticc                 C   s   t |  dkS )z8Returns ``True`` if ``f`` is zero or has only one term. r   )r  r   r   r   r   r   is_monomial  r  zDMP.is_monomialc                 C   s   |   duS )z7Returns ``True`` if ``f`` is a homogeneous polynomial. N)rR  r   r   r   r   is_homogeneous  s   zDMP.is_homogeneousc                 C   rS  )z:Returns ``True`` if ``f`` has no factors over its domain. )r   r   r   r   r   r   r   r   is_irreducible  r  zDMP.is_irreduciblec                 C   s   | j s
t| j| jS dS )z6Returns ``True`` if ``f`` is a cyclotomic polynomial. F)r   r   r   r   r   r   r   r   is_cyclotomic  s   zDMP.is_cyclotomicc                 C      |   S r   )r  r   r   r   r   __abs__     zDMP.__abs__c                 C   r  r   r   r   r   r   r   __neg__  r  zDMP.__neg__c                 C      t |tsGz| t| j|| j}W n2 ty   t Y S  t	t
fyF   | jd urDz| j|}W n t	t
fyC   t Y  Y S w Y nw | |S r   )r   r   r   r<   r   r   r   r+  NotImplementedr   NotImplementedErrorr   r#  r   r   r   r   r   __add__     


zDMP.__add__c                 C   
   |  |S r   r  r  r   r   r   __radd__     
zDMP.__radd__c                 C   r  r   )r   r   r   r<   r   r   r   r+  r  r   r  r   r%  r  r   r   r   __sub__  r  zDMP.__sub__c                 C      |   |S r   r  r  r   r   r   __rsub__     zDMP.__rsub__c                 C      t |tr
| |S z| |W S  ty   t Y S  ttfyG   | jd urCz| | j	|W  Y S  ttfyB   Y t Y S w t Y S w r   )
r   r   r&  r  r+  r  r   r  r   r   r  r   r   r   __mul__      


zDMP.__mul__c                 C   r  r   )
r   r   r>  r  r+  r  r   r  r   r   r  r   r   r   __truediv__  r  zDMP.__truediv__c              	   C   sP   t |tr
|| S | jd ur&z
| j|| W S  ttfy%   Y tS w tS r   )r   r   r>  r   r   r   r  r  r  r   r   r   __rtruediv__  s   


zDMP.__rtruediv__c                 C   r  r   r  r  r   r   r   __rmul__  r  zDMP.__rmul__c                 C   r  r   r-  r,  r   r   r   __pow__  r  zDMP.__pow__c                 C   r  r   r7  r  r   r   r   
__divmod__  r  zDMP.__divmod__c                 C   r  r   r8  r  r   r   r   __mod__  r  zDMP.__mod__c                 C   s8   t |tr
| |S z| |W S  ty   t Y S w r   )r   r   r9  r  r+  r  r  r   r   r   __floordiv__  s   

zDMP.__floordiv__c                 C   sF   z|  |\}}}}}| j|jkr||kW S W dS  ty"   Y dS w NF)r   r   r   r   r   r   r   r   r   r   r   __eq__  s   
z
DMP.__eq__c                 C   s
   | |k S r   r   r  r   r   r   __ne__  r  z
DMP.__ne__c                 C   s   |s| |kS |  |S r   )
_strict_eqr   r   strictr   r   r   eq  s   
zDMP.eqc                 C   s   | j ||d S )N)r  )r  r  r   r   r   ne!     zDMP.nec                 C   s0   t || jo| j|jko| j|jko| j|jkS r   )r   r   r   r   r   r  r   r   r   r  $  s
   

zDMP._strict_eqc                 C      |  |\}}}}}||k S r   r   r  r   r   r   __lt__)     z
DMP.__lt__c                 C      |  |\}}}}}||kS r   r  r  r   r   r   __le__-  r  z
DMP.__le__c                 C      |  |\}}}}}||kS r   r  r  r   r   r   __gt__1  r  z
DMP.__gt__c                 C      |  |\}}}}}||kS r   r  r  r   r   r   __ge__5  r  z
DMP.__ge__c                 C      t | j| j S r   r  r   r   r   r   __bool__9  r  zDMP.__bool__NN)NFNr   Fr   )r   r   T)FNNNFF)NNF)r&   r'   r(   r)   	__slots__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&  r'  r-  r2  r4  r5  r6  r7  r8  r9  r>  r?  r@  rE  rM  rR  rU  rX  r[  r\  r]  r^  r_  rb  rd  rg  rk  rm  rn  ro  rr  rt  ru  rx  ry  rz  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  propertyrN  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      sB   

	

	



	












	r   c                 C   s   t t| ||t|||||S r   )DMFr-   )numdenr   r   r   r   r   init_normal_DMF=  s   r  c                   @   s  e Zd ZdZdZdVddZedVddZedWdd	Zd
d Z	dd Z
dd Zdd ZdXddZdYddZedWddZedWddZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- ZeZdZd.d/Zed0d1 Zed2d3 Zd4d5 Zd6d7 Z d8d9 Z!d:d; Z"d<d= Z#d>d? Z$d@dA Z%dBdC Z&dDdE Z'dFdG Z(dHdI Z)dJdK Z*dLdM Z+dNdO Z,dPdQ Z-dRdS Z.dTdU Z/dS )[r  z'Dense Multivariate Fractions over `K`. )r  r  r   r   r   Nc                 C   sH   |  |||\}}}t||||\}}|| _|| _|| _|| _|| _d S r   )_parser   r  r  r   r   r   )r   r   r   r   r   r  r  r   r   r   r   G  s   
zDMF.__init__c                 C   s@   |  |||\}}}t| }||_||_||_||_||_|S r   )r  object__new__r  r  r   r   r   )r   r   r   r   r   r  r  objr   r   r   newQ  s   
zDMF.newc                 C   s$  t |trb|\}}|d ur$t |trt|||}t |tr#t|||}nt|\}}t|\}}||kr7|}ntdt||rDtdt||rOt||}n>t	|||rat
|||}t
|||}n+|}|d urt |trtt|||}nt |tst|||}nt|\}}t||}|||fS )Nzinconsistent number of levelszfraction denominator)r   rF  r   rA   r+   ri  r=   ZeroDivisionErrorr;   r5   rS   r   r<   r   )r   r   r   r   r  r  num_levden_levr   r   r   r  _  s>   








z
DMF._parsec                 C   s   d| j j| j| j| j| jf S )Nz%s((%s, %s), %s, %s))r   r&   r  r  r   r   r   r   r   r   r     s   zDMF.__repr__c                 C   s2   t | jjt| j| jt| j| j| j| j| jfS r   )	r   r   r&   rK   r  r   r  r   r   r   r   r   r   r     s   zDMF.__hash__c                    s   t |trj|jkrtd|f j|jkr.j|jkr.jjjjjf|j	fS jj
|j} j|jdurOdurL
|jn|jtj|j tj|j f}t|j	||j }dd|f fdd	}| |||fS )z0Unify a multivariate fraction and a polynomial. r   NTFc                    F   |r|s| | S |d }|rt | || \} }jj| |f |dS Nr   r   r   r   r
  r  r  r}  r   r   r   r   r   r   r   r        zDMF.poly_unify.<locals>.per)r   r   r   r   r   r   r   r  r  r   r   r/   r   r   r   r   r   r   r   r  r   
poly_unify  s    
zDMF.poly_unifyc                    s  t |trj|jkrtd|f j|jkr1j|jkr1jjjjjf|j|jffS jj	|j} j|jdurRdurO	|jn|jt
j|j t
j|j f}t
|j||j t
|j||j f}dd|f fdd	}| |||fS )z5Unify representations of two multivariate fractions. r   NTFc                    r  r  r  r  r  r   r   r     r  zDMF.frac_unify.<locals>.per)r   r  r   r   r   r   r   r  r  r   r/   r  r   r  r   
frac_unify  s(   

zDMF.frac_unifyTFc                 C   sb   | j | j}}|r|s|| S |d8 }|rt||||\}}|du r%| j}| jj||f|||dS )z.Create a DMF out of the given representation. r   Nr   )r   r   r   r   r   r
  )r   r  r  r}  r   r   r   r   r   r   r   r     s   zDMF.perc                 C   s(   | j }|r|s	|S |d8 }t|| j|S )r   r   )r   r   r   )r   r   r   r   r   r   r   half_per  s   zDMF.half_perc                 C      | j d|||dS )Nr   r   r
  r   r   r   r   r     rV  zDMF.zeroc                 C   r  r  r  r   r   r   r   r     rV  zDMF.onec                 C      |  | jS )z Returns the numerator of ``f``. )r  r  r   r   r   r   numer     z	DMF.numerc                 C   r  )z"Returns the denominator of ``f``. )r  r  r   r   r   r   denom  r  z	DMF.denomc                 C   s   |  | j| jS )z4Remove common factors from ``f.num`` and ``f.den``. )r   r  r  r   r   r   r   r}  	  r   z
DMF.cancelc                 C   s    | j t| j| j| j| jddS )r  Fr}  )r   rS   r  r   r   r  r   r   r   r   r     r   zDMF.negc                 C      t |tr| |\}}}\}}}t||||||}}	n+| |\}}}}
}|
|\}}\}}tt||||t||||||}t||||}	|||	S )z0Add two multivariate fractions ``f`` and ``g``. )r   r   r  rf   r  rU   rY   r   r   r   r   r   F_numF_denr   r  r  r   G_numG_denr   r   r   r#       

zDMF.addc                 C   r  )z5Subtract two multivariate fractions ``f`` and ``g``. )r   r   r  rg   r  rW   rY   r   r   r   r   r%     r%  zDMF.subc                 C   s   t |tr| |\}}}\}}}t|||||}}	n!| |\}}}}
}|
|\}}\}}t||||}t||||}	|||	S )z5Multiply two multivariate fractions ``f`` and ``g``. )r   r   r  rY   r  r   r   r   r   r&  /  s   

zDMF.mulc                 C   sn   t |tr/| j| j}}|dk r||| }}}| jt||| j| jt||| j| jddS tdt	| )r(  r   Fr  r)  )
r   r*  r  r  r   r\   r   r   r+  r   )r   r   r  r  r   r   r   r-  =  s   
zDMF.powc                 C   s   t |tr| |\}}}\}}}|t||||}}	n!| |\}}}}
}|
|\}}\}}t||||}t||||}	|||	}| jdurY|| jvrYddlm} || || j|S )z0Computes quotient of fractions ``f`` and ``g``. Nr   r:  )r   r   r  rY   r  r   r<  r;  )r   r   r   r   r   r!  r"  r   r  r  r   r#  r$  r=  r;  r   r   r   r9  H  s   

zDMF.quoc                 C   s>   |r| j dur| j | st| | j | j| j| jdd}|S )z&Computes inverse of a fraction ``f``. NFr  )r   is_unitr   r   r  r  )r   checkr=  r   r   r   rn  \  s   z
DMF.invertc                 C   r   )z.Returns ``True`` if ``f`` is a zero fraction. r=   r  r   r   r   r   r   rN  c  r  zDMF.is_zeroc                 C   s$   t | j| j| jot | j| j| jS )z.Returns ``True`` if ``f`` is a unit fraction. )r>   r  r   r   r  r   r   r   r   r  h  s   z
DMF.is_onec                 C   r  r   r  r   r   r   r   r  n  r  zDMF.__neg__c                 C      t |ttfr| |S z	| | |W S  ty    t Y S  ttfyL   | j	d urHz| | j	
|W  Y S  ttfyG   Y t Y S w t Y S w r   )r   r   r  r#  r  r+  r  r   r  r   r   r  r   r   r   r  q      

zDMF.__add__c                 C   r  r   r  r  r   r   r   r    r  zDMF.__radd__c                 C   r)  r   )r   r   r  r%  r  r+  r  r   r  r   r   r  r   r   r   r    r*  zDMF.__sub__c                 C   r  r   r  r  r   r   r   r    r  zDMF.__rsub__c                 C   r)  r   )r   r   r  r&  r  r+  r  r   r  r   r   r  r   r   r   r    r*  zDMF.__mul__c                 C   r  r   r  r  r   r   r   r    r  zDMF.__rmul__c                 C   r  r   r  r,  r   r   r   r    r  zDMF.__pow__c                 C   r)  r   )r   r   r  r9  r  r+  r  r   r  r   r   r  r   r   r   r    r*  zDMF.__truediv__c                 C   s>   | j dd| }| jr|| jvrddlm} ||| | j|S )NF)r'  r   r:  )rn  r   r<  r;  )r   r   r1  r;  r   r   r   r    s
   zDMF.__rtruediv__c                 C   s   z?t |tr(| |\}}}\}}}| j|jkr%t|| j| jo#||kW S W dS | |\}}}}}| j|jkr=||kW S W dS  tyI   Y dS w r  r   r   r  r   r>   r   r  r   r   r   r   r!  r"  r   r   r   r   r   r    s    


z
DMF.__eq__c                 C   s   z@t |tr)| |\}}}\}}}| j|jkr&t|| j| jo#||k W S W dS | |\}}}}}| j|jkr>||kW S W dS  tyJ   Y dS w NTr+  r,  r   r   r   r    s    


z
DMF.__ne__c                 C   r  r   r  r  r   r   r   r    r  z
DMF.__lt__c                 C   r  r   r.  r  r   r   r   r    r  z
DMF.__le__c                 C   r  r   r.  r  r   r   r   r    r  z
DMF.__gt__c                 C   r  r   r.  r  r   r   r   r    r  z
DMF.__ge__c                 C   r  r   r(  r   r   r   r   r    r  zDMF.__bool__r  r   )TFNr  r  )0r&   r'   r(   r)   r   r   r*   r
  r  r   r   r  r  r   r  r   r   r  r  r}  r   r#  r%  r&  r-  r9  r>  rn  r  rN  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  B  sd    

+#
%



r  c                 C   s   t t| |t|||S r   )ANPr,   r   modr   r   r   r   init_normal_ANP  s   

r2  c                   @   s  e Zd ZdZdZdd Zdd Zdd Zd	d
 Zd^ddZ	e
dd Ze
dd Zdd Zdd Zdd Zdd Zdd Ze
dd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- ZeZd.d/ Zd0d1 Zed2d3 Zed4d5 Z ed6d7 Z!d8d9 Z"d:d; Z#d<d= Z$d>d? Z%d@dA Z&dBdC Z'dDdE Z(dFdG Z)dHdI Z*dJdK Z+dLdM Z,dNdO Z-dPdQ Z.dRdS Z/dTdU Z0dVdW Z1dXdY Z2dZd[ Z3d\d] Z4dS )_r/  z1Dense Algebraic Number Polynomials over a field. r0  c                    s   t |tu rt| | _nt|tr fdd|D }n |g}t|| _t|tr1|j| _	nt|tr=t| | _	nt|| _	 | _
d S )Nc                    s   g | ]}  |qS r   )r   )r   rf  r  r   r   r    
  s    z ANP.__init__.<locals>.<listcomp>)r   r   r@   r   r   r   r   r1   r   r1  r   )r   r   r1  r   r   r  r   r     s   






zANP.__init__c                 C   r   r   )r   r&   r   r1  r   r   r   r   r   r     r   zANP.__repr__c                 C   s"   t | jj|  t| jd| jfS r   )r   r   r&   r   rK   r1  r   r   r   r   r   r     s   "zANP.__hash__c                    s   t |tr| j|jkrtd| |f | j|jkr%| j| j| j|j| jfS | j|j t| j| j }t|j|j } | jkrO |jkrOt| j| j n | jkrX| jn|j fdd} |||fS )z0Unify representations of two algebraic numbers. r   c                    s   t |  S r   r/  r   r   r1  r   r   <lambda>5  s    zANP.unify.<locals>.<lambda>)	r   r/  r1  r   r   r   r   r   r.   )r   r   r   r   r   r   r4  r   r      s   
z	ANP.unifyNc                 C   s   t ||p| j|p
| jS r   )r/  r1  r   )r   r   r1  r   r   r   r   r   9  s   zANP.perc                 C      t d||S r   r3  r   r1  r   r   r   r   r   <  r  zANP.zeroc                 C   r6  r   r3  r7  r   r   r   r   @  r  zANP.onec                 C   r  )r   r   )rB   r   r   r   r   r   r   r   D  r   zANP.to_dictc                 C   s6   t | jd| j}| D ]\}}| j|||< q|S )r   r   )rB   r   r   r   r   )r   r   r   r   r   r   r   r   H  s   zANP.to_sympy_dictc                 C   r   r   r   r   r   r   r   r   Q  r   zANP.to_listc                    s    fdd j D S )r   c                    s   g | ]} j |qS r   )r   r   r   r   r   r   r    W  s    z%ANP.to_sympy_list.<locals>.<listcomp>r   r   r   r   r   r   U  r  zANP.to_sympy_listc                 C   s   t | jdS )r   r   )rK   r   r   r   r   r   r   Y  s   zANP.to_tuplec                 C   s   t ttt|j|||S r   )r/  r1   r   rp  r   )r   r   r1  r   r   r   r   r   a  r   zANP.from_listc                 C   s   |  t| j| jS r   )r   rR   r   r   r   r   r   r   r   e  r   zANP.negc                 C   $   |  |\}}}}}|t|||S r   )r   rT   r   r   r   r   r   r   r1  r   r   r   r#  h     zANP.addc                 C   r8  r   )r   rV   r9  r   r   r   r%  l  r:  zANP.subc                 C   s,   |  |\}}}}}|tt|||||S r   )r   rb   rX   r9  r   r   r   r&  p  s   zANP.mulc                 C   sd   t |tr*|dk rt| j| j| j| }}n| j}| tt||| j| j| jS t	dt
| )r(  r   r)  )r   r*  r{   r   r1  r   r   rb   r[   r+  r   )r   r   r   r   r   r   r-  t  s   
 zANP.powc                 C   s@   |  |\}}}}}|tt|t||||||| ||fS r   )r   rb   rX   r{   r   r9  r   r   r   r7    s   ,zANP.divc                 C   sD   |  |\}}}}}t|||\}}||jgkr| ||S td)Nzzero divisor)r   ry   r   r   r   )r   r   r   r   r   r1  rG  rj  r   r   r   r8    s
   zANP.remc                 C   s4   |  |\}}}}}|tt|t||||||S r   )r   rb   rX   r{   r9  r   r   r   r9    s    zANP.quoc                 C   r   rT  )r6   r   r   r   r   r   r   rU    r   zANP.LCc                 C   r   rW  )r8   r   r   r   r   r   r   rX    r   zANP.TCc                 C   s   |  S )z6Returns ``True`` if ``f`` is a zero algebraic number. r   r   r   r   r   rN    s   zANP.is_zeroc                 C   s   | j | jjgkS )z6Returns ``True`` if ``f`` is a unit algebraic number. )r   r   r   r   r   r   r   r    r  z
ANP.is_onec                 C   s   | j  p
t| j dkS )r  r   )r   r  r   r   r   r   r    r   zANP.is_groundc                 C   s   | S r   r   r   r   r   r   __pos__  s   zANP.__pos__c                 C   r  r   r  r   r   r   r   r    r  zANP.__neg__c              	   C   B   t |tr
| |S z	| | |W S  ttfy    t Y S w r   )r   r/  r#  r   r   r+  r  r  r   r   r   r       

zANP.__add__c                 C   r  r   r  r  r   r   r   r    r  zANP.__radd__c              	   C   r<  r   )r   r/  r%  r   r   r+  r  r  r   r   r   r    r=  zANP.__sub__c                 C   r  r   r  r  r   r   r   r    r  zANP.__rsub__c              	   C   r<  r   )r   r/  r&  r   r   r+  r  r  r   r   r   r    r=  zANP.__mul__c                 C   r  r   r  r  r   r   r   r    r  zANP.__rmul__c                 C   r  r   r  r,  r   r   r   r    r  zANP.__pow__c                 C   r  r   r  r  r   r   r   r    r  zANP.__divmod__c                 C   r  r   r  r  r   r   r   r    r  zANP.__mod__c              	   C   r<  r   )r   r/  r9  r   r   r+  r  r  r   r   r   r    r=  zANP.__truediv__c                 C   s4   z|  |\}}}}}||kW S  ty   Y dS w r  r   r   r  r   r   r   r       
z
ANP.__eq__c                 C   s4   z|  |\}}}}}||kW S  ty   Y dS w r-  r>  r  r   r   r   r    r?  z
ANP.__ne__c                 C   s   |  |\}}}}}||k S r   r  r  r   r   r   r    r  z
ANP.__lt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    r  z
ANP.__le__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    r  z
ANP.__gt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    r  z
ANP.__ge__c                 C   s
   t | jS r   )boolr   r   r   r   r   r    r  zANP.__bool__r  )5r&   r'   r(   r)   r   r   r   r   r   r   r*   r   r   r   r   r   r   r   r   r   r#  r%  r&  r-  r7  r8  r9  r>  rU  rX  r  rN  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/    sn    


	




				r/  N)r)   sympy.core.numbersr   sympy.core.sympifyr   r<  r   r   r   sympy.polys.polyutilsr   r   sympy.polys.densebasicr+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   sympy.polys.densearithrL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   sympy.polys.densetoolsrk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   sympy.polys.euclidtoolsry   rz   r{   r|   r}   r~   r   r   r   r   sympy.polys.sqfreetoolsr   r   r   r   r   r   r   sympy.polys.factortoolsr   r   r   r   sympy.polys.rootisolationr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r2  r/  r   r   r   r   <module>   s<    @0$
4       2   ;