o
    8Va4                     @   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@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL dd
lMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[ ddl\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZf ddlgmhZhmiZimjZjmkZkmlZlmmZmmnZn ddlompZpmqZqmrZrmsZs ddltmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z| ddlm}Z}m~Z~ dd ZG 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   9/usr/lib/python3/dist-packages/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_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)UnificationFailedPolynomialErrorc                 C   s   t t| ||||S N)DMPr-   )replevr   r   r   r   init_normal_DMP      r   c                   @   s8  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 ZFdddZGdddZHdddZIdd ZJdd ZKdd ZLdd ZMdd ZNdddZOdd ZPdd ZQdd ZRdd ZSdddZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd ZadddZbdddÄZcddń ZdddǄ ZedddɄZfd dd˄Zgddd̈́ZhdddτZiejddф Zkejddӄ ZlejddՄ Zmejddׄ Znejddل Zoejddۄ Zpejdd݄ Zqejdd߄ Zrejdd Zsejdd Ztejdd Zuejdd Zvdd Zwdd Zxdd Zydd 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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   sh   |d ur t |tu rt|||}nt |turt|||}nt|\}}|| _|| _|| _	|| _
d S r   )typedictrA   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. can't 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)

isinstancer   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   slice+  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    1      zDMP.coeffs.<locals>.<listcomp>orderrG   r   r   r   r   r   r   r   r   r   /      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    5  r   zDMP.monoms.<locals>.<listcomp>r   r   r   r   r   r   r   3  r   z
DMP.monomsc                 C   r   )z4Returns all non-zero terms from ``f`` in lex order. r   r   r   r   r   r   terms7  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    A  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    M  s    z"DMP.all_monoms.<locals>.<listcomp>r   )r   r2   r   	enumerater   r   r   r   r   
all_monomsE  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    Y      z!DMP.all_terms.<locals>.<listcomp>r   )r   r2   r   r   r   r   r   r   r   r   r   	all_termsQ  s   
zDMP.all_termsc                 C   s    | j t| j| j| j| jjdS )z-Convert algebraic coefficients to rationals. r   )r   rw   r   r   r   r   r   r   r   lift]  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   deflatea     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   injectf  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   ejectk  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   excludep  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  r/  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.polyerrorsr7  )	r   r   r   r   r   r   r   resr7  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   )rA  r  r   r>  r   tupler   r   r   r&  r   )	r   sZtdr!   Z
new_symbolZ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   r>  )r   r   ZtdegmonomZ_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   LC1     zDMP.LCc                 C   rJ  z+Returns the trailing coefficient of ``f``. )r9   r   r   r   r   r   r   r   TC5  rM  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   r?  ;  s    zDMP.nth.<locals>.<genexpr>za sequence of integers expected)allr:   r   r   r   r'  )r   Nr   r   r   nth9  s   zDMP.nthc                 C   rJ  )zReturns maximum norm of ``f``. )rh   r   r   r   r   r   r   r   max_norm@  rM  zDMP.max_normc                 C   rJ  )zReturns l1 norm of ``f``. )ri   r   r   r   r   r   r   r   l1_normD  rM  zDMP.l1_normc                 C   r   )z0Clear denominators, but keep the ground domain. )rj   r   r   r   r   )r   r#   r   r   r   r   clear_denomsH  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   rk   r   r   r   r   r   r   r   r   r   	integrateM  
   

zDMP.integratec                 C   rV  )z<Computes the ``m``-th order derivative of ``f`` in ``x_j``. r%  )	r   r&  r'  r   r   rl   r   r   r   rW  r   r   r   diffW  rY  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   rm   r   r   r   r   )r   ar   r   r   r   evala  s   

zDMP.evalc           	      C   s@   |  |\}}}}}|st|||\}}||||fS td)z2Half extended Euclidean algorithm, if univariate. univariate polynomial expected)r   rx   
ValueError)	r   r   r   r   r   r   r   rC  hr   r   r   
half_gcdexi  s
   zDMP.half_gcdexc           
      C   sH   |  |\}}}}}|s t|||\}}}	||||||	fS td)z-Extended Euclidean algorithm, if univariate. r^  )r   ry   r_  )
r   r   r   r   r   r   r   rC  tr`  r   r   r   gcdexs  s
   z	DMP.gcdexc                 C   s0   |  |\}}}}}|s|t|||S td)z(Invert ``f`` modulo ``g``, if possible. r^  )r   rz   r_  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``. r^  )r   r   rn   r   r   r_  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. )
includePRSTr[  )r   r|   r   rf  )
r   r   ri  r   r   r   r   r   r9  rg  r   r   r   	resultant  s
   zDMP.resultantc                 C   s   | j t| j| j| jddS )z Computes discriminant of ``f``. Tr[  )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   r`  ZcffZ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   ZcFZcGr   r   r   cancel  s   z
DMP.cancelc                 C   r  )z&Reduce ``f`` modulo a constant ``p``. )r   ro   r   r   r   r   )r   pr   r   r   trunc  r  z	DMP.truncc                 C   r  )z'Divides all coefficients by ``LC(f)``. )r   rr   r   r   r   r   r   r   r   monic  r  z	DMP.monicc                 C   rJ  )z(Returns GCD of polynomial coefficients. )rp   r   r   r   r   r   r   r   content  rM  zDMP.contentc                 C   r   )z/Returns content and a primitive form of ``f``. )rq   r   r   r   r   )r   Zcontr   r   r   r   	primitive  r  zDMP.primitivec                 C   r  )z4Computes functional composition of ``f`` and ``g``. )r   rs   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``. r^  )r   r   rf  r   rt   r   r   r_  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)``. r^  )r   r   ru   r   r   r   r_  )r   r\  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)``.r^  )r   r_  r   rv   )	r   rp  r,  r   r   r   r  Qr   r   r   r   	transform  s   $zDMP.transformc                 C   rv  )z&Computes the Sturm sequence of ``f``. r^  )r   r   rf  r   r   r   r   r_  r   r   r   r   sturm  rx  z	DMP.sturmc                    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>r^  )r   r   r   r   r_  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   r-  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   rC  r   r-  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   rP  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      r   z(DMP.sqf_list_include.<locals>.<listcomp>)r   r   r   r   )r   rP  r$   r   r   r   sqf_list_include  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      r   z#DMP.factor_list.<locals>.<listcomp>)r   r   r   r   )r   r#   r$   r   r   r   factor_list  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fastz0can't isolate roots of a multivariate polynomial)r   r   r   r   r   r   r   r   )r   rP  r  r  r  r  Z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  z0can't refine a root of a multivariate polynomial)r   r   r   r   r   )r   rC  rb  r  r  r  r   r   r   refine_root2  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_rootsC  r  zDMP.count_complex_rootsc                 C   r   )z0Returns ``True`` if ``f`` is a zero polynomial. r=   r   r   r   r   r   r   rG  G     zDMP.is_zeroc                 C   rJ  )z0Returns ``True`` if ``f`` is a unit polynomial. )r>   r   r   r   r   r   r   r   is_oneL     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_groundQ     zDMP.is_groundc                 C   rJ  )z7Returns ``True`` if ``f`` is a square-free polynomial. )r   r   r   r   r   r   r   r   is_sqfV  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_monic[     zDMP.is_monicc                 C   r  )zAReturns ``True`` if the GCD of the coefficients of ``f`` is one. )r   r  rp   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   Nr=  r   rH  r   r   r   r?  h      z DMP.is_linear.<locals>.<genexpr>rP  rB   r   r   r   keysr   r   r   r   	is_lineare     $zDMP.is_linearc                 C   r  )z=Returns ``True`` if ``f`` is quadratic in all its variables. c                 s   r  )   Nr=  r  r   r   r   r?  m  r  z#DMP.is_quadratic.<locals>.<genexpr>r  r   r   r   r   is_quadraticj  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_monomialo  r  zDMP.is_monomialc                 C   s   |   duS )z7Returns ``True`` if ``f`` is a homogeneous polynomial. N)rI  r   r   r   r   is_homogeneoust  s   zDMP.is_homogeneousc                 C   rJ  )z:Returns ``True`` if ``f`` has no factors over its domain. )r   r   r   r   r   r   r   r   is_irreducibley  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   r3  r  r   r   r   
__divmod__  r  zDMP.__divmod__c                 C   r  r   r4  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   r5  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__  r  z
DMP.__gt__c                 C      |  |\}}}}}||kS r   r  r  r   r   r   __ge__  r  z
DMP.__ge__c                 C      t | j| j S r   r  r   r   r   r   __bool__  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)  r.  r0  r1  r2  r3  r4  r5  r:  r;  r<  rA  rF  rI  rL  rO  rR  rS  rT  rU  rX  rZ  r]  ra  rc  rd  re  rh  rj  rk  rl  rm  rn  ro  rq  rr  rs  rt  ru  rw  ry  r{  r|  r~  r  r  r  r  r  r  r  r  r  r  r  propertyrG  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      s:   

	

	



	












	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   )  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   new3  s   
zDMF.newc                 C   s.  t |tu re|\}}|d ur't |tu rt|||}t |tu r&t|||}nt|\}}t|\}}||kr:|}ntdt||rGtdt||rRt||}n@t	|||rdt
|||}t
|||}n-|}|d urt |tu rxt|||}nt |turt|||}nt|\}}t||}|||fS )Nzinconsistent number of levelszfraction denominator)r   rB  r   rA   r+   r_  r=   ZeroDivisionErrorr;   r5   rS   r   r<   r   )r   r   r   r   r  r  Znum_levZden_levr   r   r   r  A  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   m  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   q  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  ro  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_unifyu  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  ro  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     rM  zDMF.zeroc                 C   r  r  r  r   r   r   r   r     rM  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   ro    r   z
DMF.cancelc                 C   s    | j t| j| j| j| jddS )r  Fro  )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   r6  )r   r   r  rY   r  r   r8  r7  )r   r   r   r   r   r
  r  r   r  r  r   r  r  r9  r7  r   r   r   r5  *  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   Zis_unitr   r   r  r  )r   checkr9  r   r   r   rd  >  s   z
DMF.invertc                 C   r   )z.Returns ``True`` if ``f`` is a zero fraction. r=   r  r   r   r   r   r   rG  E  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  J  s   z
DMF.is_onec                 C   r  r   r  r   r   r   r   r  P  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  S      

zDMF.__add__c                 C   r  r   r  r  r   r   r   r  c  r  zDMF.__radd__c                 C   r  r   )r   r   r  r!  r   r'  r  r   r  r   r   r  r   r   r   r  f  r  zDMF.__sub__c                 C   r  r   r  r  r   r   r   r  v  r  zDMF.__rsub__c                 C   r  r   )r   r   r  r"  r   r'  r  r   r  r   r   r  r   r   r   r  y  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  r5  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   r6  )rd  r   r8  r7  )r   r   r-  r7  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  ro  r  r  r!  r"  r)  r5  r:  rd  r  rG  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  $  sd    

+#
%



r  c                 C   s   t t| |t|||S r   )ANPr,   r   modr   r   r   r   init_normal_ANP  s   

r  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. r  c                 C   s~   t |tu rt||| _nt |tur||g}t|| _t|tr(|j| _	nt |tu r5t||| _	nt|| _	|| _
d S r   )r   r   r@   r   r   r   r1   r   r   r  r   )r   r   r  r   r   r   r   r     s   




zANP.__init__c                 C   r   r   )r   r&   r   r  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   r  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   r  r   r   <lambda>  s    zANP.unify.<locals>.<lambda>)	r   r  r  r   r   r   r   r   r.   )r   r   r   r   r   r   r  r   r     s   
z	ANP.unifyNc                 C   s   t ||p| j|p
| jS r   )r  r  r   )r   r   r  r   r   r   r   r     s   zANP.perc                 C      t d||S r   r  r   r  r   r   r   r   r     r  zANP.zeroc                 C   r  r   r  r  r   r   r   r     r  zANP.onec                 C   r  )r   r   )rB   r   r   r   r   r   r   r   #  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   '  s   zANP.to_sympy_dictc                 C   r   r   r   r   r   r   r   r   0  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    6  s    z%ANP.to_sympy_list.<locals>.<listcomp>r   r   r   r   r   r   4  r  zANP.to_sympy_listc                 C   s   t | jdS )r   r   )rK   r   r   r   r   r   r   8  s   zANP.to_tuplec                 C   s   t ttt|j|||S r   )r  r1   r   rf  r   )r   r   r  r   r   r   r   r   @  r   zANP.from_listc                 C   s   |  t| j| jS r   )r   rR   r   r   r   r   r   r   r  D  r   zANP.negc                 C   $   |  |\}}}}}|t|||S r   )r   rT   r   r   r   r   r   r   r  r   r   r   r  G     zANP.addc                 C   r   r   )r   rV   r!  r   r   r   r!  K  r"  zANP.subc                 C   s,   |  |\}}}}}|tt|||||S r   )r   rb   rX   r!  r   r   r   r"  O  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&  rz   r   r  r   r   rb   r[   r'  r   )r   r   r   r   r   r   r)  S  s   
 zANP.powc                 C   s@   |  |\}}}}}|tt|t||||||| ||fS r   )r   rb   rX   rz   r   r!  r   r   r   r3  _  s   ,zANP.divc                 C   sD   |  |\}}}}}t|||\}}||jgkr| ||S td)Nzzero divisor)r   rx   r   r   r   )r   r   r   r   r   r  rC  r`  r   r   r   r4  c  s
   zANP.remc                 C   s4   |  |\}}}}}|tt|t||||||S r   )r   rb   rX   rz   r!  r   r   r   r5  m  s    zANP.quoc                 C   r   rK  )r6   r   r   r   r   r   r   rL  s  r   zANP.LCc                 C   r   rN  )r8   r   r   r   r   r   r   rO  w  r   zANP.TCc                 C   s   |  S )z6Returns ``True`` if ``f`` is a zero algebraic number. r   r   r   r   r   rG  {  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  r5  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)  r3  r4  r5  r:  rL  rO  r  rG  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)   Zsympyr   Zsympy.core.sympifyr   r8  r   r   r   Zsympy.polys.polyutilsr   r   Z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   Z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   Zsympy.polys.densetoolsrj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   Zsympy.polys.euclidtoolsrx   ry   rz   r{   r|   r}   r~   r   r   r   Zsympy.polys.sqfreetoolsr   r   r   r   r   r   r   Zsympy.polys.factortoolsr   r   r   r   Zsympy.polys.rootisolationr   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   <module>   s<    @0$
(
          ;