a
    RG5d-                     @   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   s   |  | j S zMake the ground domain a ring. )
set_domaindomget_ringf r   S/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/polys/polyclasses.pyground_to_ring   s    zGenericPoly.ground_to_ringc                 C   s   |  | j S z Make the ground domain a field. )r
   r   	get_fieldr   r   r   r   ground_to_field   s    zGenericPoly.ground_to_fieldc                 C   s   |  | j S zMake the ground domain exact. )r
   r   	get_exactr   r   r   r   ground_to_exact   s    zGenericPoly.ground_to_exactc                    s2   |r|\}} fdd|D }|r*||fS |S d S )Nc                    s   g | ]\}} ||fqS r   r   .0gkperr   r   
<listcomp>       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   s    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d0ddZJdd ZKdd ZLdd ZMdd ZNdd ZOd1ddZPdd ZQdd ZRdd ZSdd ZTd2ddZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd ZbddÄ Zcddń ZdddǄ Zed3ddɄZfd4dd˄Zgdd̈́ Zhddτ Zid5ddфZjd6ddӄZkd7ddՄZld8ddׄ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d9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|||}qJt|tsJt|||}nt|\}}|| _|| _	|| _
|| _d S r   )typedictr@   
isinstancelistr;   convertr*   r   r   r   r   )selfr   r   r   r   r   r   r   __init__   s    
zDMP.__init__c                 C   s   d| j j| j| j| jf S Nz%s(%s, %s, %s))	__class__r%   r   r   r   r   r   r   r   __repr__   s    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rV| j|jkrV| j| j| j| j|jfS | j| j|j }}| j |jdur dur |j n|j t	| j|| j|}t	|j||j|}||df fdd	}|||||fS d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 r6| 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   s   t d|||S Nr   r   clsr   r   r   r   r   r   zero   s    zDMP.zeroc                 C   s   t d|||S r   r   r   r   r   r   one   s    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   s    zDMP.from_listc                 C   s   | t |||||S )zBCreate an instance of ``cls`` given a list of SymPy coefficients. )r/   r   r   r   r   from_sympy_list   s    zDMP.from_sympy_listc                 C   s   t | j| j| j|dS )AConvert ``f`` to a dict representation with native coefficients. r   )rA   r   r   r   )r   r   r   r   r   to_dict   s    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   )rA   r   r   r   itemsto_sympy)r   r   r   r   vr   r   r   to_sympy_dict   s    zDMP.to_sympy_dictc                 C   s   | j S zAConvert ``f`` to a list representation with native coefficients. r   r   r   r   r   to_list   s    zDMP.to_listc                    s    fdd j S )@Convert ``f`` to a list representation with SymPy coefficients. c                    s>   g }| D ]0}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   s   t | j| jS )x
        Convert ``f`` to a tuple representation with native coefficients.

        This is needed for hashing.
        )rJ   r   r   r   r   r   r   r     s    zDMP.to_tuplec                 C   s   | t |||||S )zBConstruct and instance of ``cls`` from a ``dict`` representation. )r@   r   r   r   r   	from_dict  s    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  s    zDMP.from_monoms_coeffsc                 C   s   |  | j S r	   )r   r   r   r   r   r   r   to_ring  s    zDMP.to_ringc                 C   s   |  | j S r   )r   r   r   r   r   r   r   to_field!  s    zDMP.to_fieldc                 C   s   |  | j S r   )r   r   r   r   r   r   r   to_exact%  s    zDMP.to_exactc                 C   s0   | j |kr| S tt| j| j| j ||| jS dS )z$Convert the ground domain of ``f``. N)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   rH   r   r   r   )r   mnjr   r   r   slice0  s    z	DMP.slicec                 C   s    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  r   zDMP.coeffs.<locals>.<listcomp>orderrF   r   r   r   r   r   r   r   r   r   4  s    z
DMP.coeffsc                 C   s    dd t | j| j| j|dD S )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  s    z
DMP.monomsc                 C   s   t | j| j| j|dS )z4Returns all non-zero terms from ``f`` in lex order. r   r   r   r   r   r   terms<  s    z	DMP.termsc                 C   s2   | j s&| s| jjgS dd | jD S ntddS )z%Returns all coefficients from ``f``. c                 S   s   g | ]}|qS r   r   r   r   r   r   r   r   F  r   z"DMP.all_coeffs.<locals>.<listcomp>&multivariate polynomials not supportedN)r   r   r   r   r   r   r   r   r   
all_coeffs@  s
    
zDMP.all_coeffsc                    sD   | j s8t| j  dk rdgS  fddt| jD S ntddS )z"Returns all monomials from ``f``. r   r   c                    s   g | ]\}} | fqS r   r   r   ir   r   r   r   r   R  r   z"DMP.all_monoms.<locals>.<listcomp>r   N)r   r1   r   	enumerater   r   r   r   r   
all_monomsJ  s    
zDMP.all_monomsc                    sL   | j s@t| j  dk r&d| jjfgS  fddt| jD S ntddS )z Returns all terms from a ``f``. r   r   c                    s   g | ]\}} | f|fqS r   r   r   r   r   r   r   ^  r   z!DMP.all_terms.<locals>.<listcomp>r   N)r   r1   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   rw   r   r   r   r   r   r   r   liftb  s    zDMP.liftc                 C   s$   t | j| j| j\}}|| |fS )z2Reduce degree of `f` by mapping `x_i^m` to `y_i`. )rB   r   r   r   r   r   Jr   r   r   r   deflatef  s    zDMP.deflatec                 C   s,   t | j| j| j|d\}}| || jj|S )z,Inject ground domain generators into ``f``. front)rC   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   )rD   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))

        )rG   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   rI   r   r   r   )r   Pr   r   r   permute  s    zDMP.permutec                 C   s$   t | j| j| j\}}|| |fS )z/Remove GCD of terms from the polynomial ``f``. )rE   r   r   r   r   r   r   r   r   	terms_gcd  s    zDMP.terms_gcdc                 C   s"   |  t| j| j|| j| jS )z.Add an element of the ground domain to ``f``. )r   rK   r   r   r   r   r   r   r   r   r   
add_ground  s    zDMP.add_groundc                 C   s"   |  t| j| j|| j| jS )z5Subtract an element of the ground domain from ``f``. )r   rL   r   r   r   r   r   r   r   r   
sub_ground  s    zDMP.sub_groundc                 C   s"   |  t| j| j|| j| jS )z5Multiply ``f`` by a an element of the ground domain. )r   rM   r   r   r   r   r   r   r   r   
mul_ground  s    zDMP.mul_groundc                 C   s"   |  t| j| j|| j| jS )z8Quotient of ``f`` by a an element of the ground domain. )r   rN   r   r   r   r   r   r   r   r   
quo_ground  s    zDMP.quo_groundc                 C   s"   |  t| j| j|| j| jS )z>Exact quotient of ``f`` by a an element of the ground domain. )r   rO   r   r   r   r   r   r   r   r   exquo_ground  s    zDMP.exquo_groundc                 C   s   |  t| j| j| jS )z)Make all coefficients in ``f`` positive. )r   rP   r   r   r   r   r   r   r   abs  s    zDMP.absc                 C   s   |  t| j| j| jS )"Negate all coefficients in ``f``. )r   rR   r   r   r   r   r   r   r   neg  s    zDMP.negc                 C   s&   |  |\}}}}}|t||||S )z2Add two multivariate polynomials ``f`` and ``g``. )r   rT   r   r   r   r   r   r   r   r   r   r   add  s    zDMP.addc                 C   s&   |  |\}}}}}|t||||S )z7Subtract two multivariate polynomials ``f`` and ``g``. )r   rV   r  r   r   r   sub  s    zDMP.subc                 C   s&   |  |\}}}}}|t||||S )z7Multiply two multivariate polynomials ``f`` and ``g``. )r   rX   r  r   r   r   mul  s    zDMP.mulc                 C   s   |  t| j| j| jS )z(Square a multivariate polynomial ``f``. )r   rY   r   r   r   r   r   r   r   sqr  s    zDMP.sqrc                 C   s8   t |tr$| t| j|| j| jS tdt| dS )+Raise ``f`` to a non-negative power ``n``. ``int`` expected, got %sN)	r   intr   r[   r   r   r   	TypeErrorr   r   r   r   r   r   pow  s    
zDMP.powc           	      C   s6   |  |\}}}}}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  s    zDMP.pdivc                 C   s&   |  |\}}}}}|t||||S )z0Polynomial pseudo-remainder of ``f`` and ``g``. )r   r]   r  r   r   r   prem  s    zDMP.premc                 C   s&   |  |\}}}}}|t||||S )z/Polynomial pseudo-quotient of ``f`` and ``g``. )r   r^   r  r   r   r   pquo  s    zDMP.pquoc                 C   s&   |  |\}}}}}|t||||S )z5Polynomial exact pseudo-quotient of ``f`` and ``g``. )r   r_   r  r   r   r   pexquo  s    z
DMP.pexquoc           	      C   s6   |  |\}}}}}t||||\}}||||fS )z7Polynomial division with remainder of ``f`` and ``g``. )r   r`   r  r   r   r   div  s    zDMP.divc                 C   s&   |  |\}}}}}|t||||S )z2Computes polynomial remainder of ``f`` and ``g``. )r   rb   r  r   r   r   rem  s    zDMP.remc                 C   s&   |  |\}}}}}|t||||S )z1Computes polynomial quotient of ``f`` and ``g``. )r   rc   r  r   r   r   quo  s    zDMP.quoc           	      C   sT   |  |\}}}}}|t||||}| jrP|| jvrPddlm} || || j|S )z7Computes polynomial exact quotient of ``f`` and ``g``. r   ExactQuotientFailed)r   rd   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| dS )z0Returns the leading degree of ``f`` in ``x_j``. r  N)r   r  r2   r   r   r  r   )r   r   r   r   r   degree  s    
z
DMP.degreec                 C   s   t | j| jS )z$Returns a list of degrees of ``f``. )r3   r   r   r   r   r   r   degree_list  s    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>  r   z#DMP.total_degree.<locals>.<genexpr>)maxr   r   r   r   r   total_degree  s    zDMP.total_degreec           	      C   s   |   }i }|t|  d d k}|  D ]n}t|d }||k rN|| }nd}|rn|d ||d |f < q,t|d }||  |7  < |d |t|< q,t|| j| jt	| | j
S )z&Return homogeneous polynomial of ``f``r   r   )r(  r   r   r%  r   tupler   r   r   r  r   )	r   stdr    Z
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   r%  )r   r   ZtdegmonomZ_tdegr   r   r   homogeneous_order&  s    zDMP.homogeneous_orderc                 C   s   t | j| j| jS z*Returns the leading coefficient of ``f``. )r6   r   r   r   r   r   r   r   LC6  s    zDMP.LCc                 C   s   t | j| j| jS z+Returns the trailing coefficient of ``f``. )r8   r   r   r   r   r   r   r   TC:  s    zDMP.TCc                 G   s2   t dd |D r&t| j|| j| jS tddS )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&  @  r   zDMP.nth.<locals>.<genexpr>za sequence of integers expectedN)allr9   r   r   r   r  )r   Nr   r   r   nth>  s    zDMP.nthc                 C   s   t | j| j| jS )zReturns maximum norm of ``f``. )rg   r   r   r   r   r   r   r   max_normE  s    zDMP.max_normc                 C   s   t | j| j| jS )zReturns l1 norm of ``f``. )rh   r   r   r   r   r   r   r   l1_normI  s    zDMP.l1_normc                 C   s   t | j| j| jS )z!Return squared l2 norm of ``f``. )ri   r   r   r   r   r   r   r   l2_norm_squaredM  s    zDMP.l2_norm_squaredc                 C   s$   t | j| j| j\}}|| |fS )z0Clear denominators, but keep the ground domain. )rj   r   r   r   r   )r   r"   r   r   r   r   clear_denomsQ  s    zDMP.clear_denomsr   c                 C   sP   t |tstdt| t |ts4t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   	integrateV  s
    

zDMP.integratec                 C   sP   t |tstdt| t |ts4tdt| | t| j||| j| jS )z<Computes the ``m``-th order derivative of ``f`` in ``x_j``. r  )	r   r  r  r   r   rl   r   r   r   r>  r   r   r   diff`  s
    

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   evalj  s    

zDMP.evalc           	      C   sD   |  |\}}}}}|s8t|||\}}||||fS tddS )z2Half extended Euclidean algorithm, if univariate. univariate polynomial expectedN)r   rx   
ValueError)	r   r   r   r   r   r   r   r*  hr   r   r   
half_gcdexr  s
    zDMP.half_gcdexc           
      C   sL   |  |\}}}}}|s@t|||\}}}	||||||	fS tddS )z-Extended Euclidean algorithm, if univariate. rD  N)r   ry   rE  )
r   r   r   r   r   r   r   r*  trF  r   r   r   gcdex|  s
    z	DMP.gcdexc                 C   s4   |  |\}}}}}|s(|t|||S tddS )z(Invert ``f`` modulo ``g``, if possible. rD  N)r   rz   rE  r  r   r   r   invert  s    z
DMP.invertc                 C   s(   | j s| t| j|| jS tddS )z"Compute ``f**(-1)`` mod ``x**n``. rD  N)r   r   rn   r   r   rE  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^   |  |\}}}}}|rHt|||||d\}}	||ddtt||	fS |t||||ddS )z/Computes resultant of ``f`` and ``g`` via PRS. )
includePRSTrA  )r   r|   r   rL  )
r   r   rO  r   r   r   r   r   r   rM  r   r   r   	resultant  s
    zDMP.resultantc                 C   s   | j t| j| j| jddS )z Computes discriminant of ``f``. TrA  )r   r}   r   r   r   r   r   r   r   discriminant  s    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   rF  cffcfgr   r   r   	cofactors  s    zDMP.cofactorsc                 C   s&   |  |\}}}}}|t||||S )z+Returns polynomial GCD of ``f`` and ``g``. )r   r   r  r   r   r   gcd  s    zDMP.gcdc                 C   s&   |  |\}}}}}|t||||S )z+Returns polynomial LCM of ``f`` and ``g``. )r   r   r  r   r   r   lcm  s    zDMP.lcmTc           
      C   sx   |  |\}}}}}|r0t||||dd\}}nt||||dd\}}	}}|||| }}|rh||fS ||	||fS dS )z6Cancel common factors in a rational function ``f/g``. T)r!   FN)r   r   )
r   r   r!   r   r   r   r   r   ZcFZcGr   r   r   cancel  s    z
DMP.cancelc                 C   s"   |  t| j| j|| j| jS )z&Reduce ``f`` modulo a constant ``p``. )r   ro   r   r   r   r   )r   pr   r   r   trunc  s    z	DMP.truncc                 C   s   |  t| j| j| jS )z'Divides all coefficients by ``LC(f)``. )r   rr   r   r   r   r   r   r   r   monic  s    z	DMP.monicc                 C   s   t | j| j| jS )z(Returns GCD of polynomial coefficients. )rp   r   r   r   r   r   r   r   content  s    zDMP.contentc                 C   s$   t | j| j| j\}}|| |fS )z/Returns content and a primitive form of ``f``. )rq   r   r   r   r   )r   contr   r   r   r   	primitive  s    zDMP.primitivec                 C   s&   |  |\}}}}}|t||||S )z4Computes functional composition of ``f`` and ``g``. )r   rs   r  r   r   r   compose  s    zDMP.composec                 C   s,   | j s tt| jt| j| jS tddS )z,Computes functional decomposition of ``f``. rD  N)r   r   rL  r   rt   r   r   rE  r   r   r   r   	decompose  s    zDMP.decomposec                 C   s0   | j s$| t| j| j|| jS tddS )z/Efficiently compute Taylor shift ``f(x + a)``. rD  N)r   r   ru   r   r   r   rE  )r   rB  r   r   r   shift  s    z	DMP.shiftc           	      C   s   | j rtd||\}}}}}| ||||\}}}}}||||||||\}}}}}|sx|t||||S tddS )z5Evaluate functional transformation ``q**n * f(p/q)``.rD  N)r   rE  r   rv   )	r   rX  r  r   r   r   r   Qr   r   r   r   	transform  s    $zDMP.transformc                 C   s,   | j s tt| jt| j| jS tddS )z&Computes the Sturm sequence of ``f``. rD  N)r   r   rL  r   r   r   r   rE  r   r   r   r   sturm  s    z	DMP.sturmc                 C   s    | j st| j| jS tddS )z7Computes the Cauchy upper bound on the roots of ``f``. rD  N)r   r   r   r   rE  r   r   r   r   cauchy_upper_bound  s    zDMP.cauchy_upper_boundc                 C   s    | j st| j| jS tddS )z?Computes the Cauchy lower bound on the nonzero roots of ``f``. rD  N)r   r   r   r   rE  r   r   r   r   cauchy_lower_bound  s    zDMP.cauchy_lower_boundc                 C   s    | j st| j| jS tddS )zBComputes the squared Mignotte bound on root separations of ``f``. rD  N)r   r   r   r   rE  r   r   r   r   mignotte_sep_bound_squared  s    zDMP.mignotte_sep_bound_squaredc                    s.    j s" fddt j jD S tddS )z4Computes greatest factorial factorization of ``f``. c                    s   g | ]\}}  ||fqS r   r   r   r   r   r   r     r   z DMP.gff_list.<locals>.<listcomp>rD  N)r   r   r   r   rE  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  s    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   r*  r   r  r   r   r   sqf_norm"  s    zDMP.sqf_normc                 C   s   |  t| j| j| jS )z$Computes square-free part of ``f``. )r   r   r   r   r   r   r   r   r   sqf_part'  s    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                    s   g | ]\}}  ||fqS r   r   r   r   r   r   r   .  r   z DMP.sqf_list.<locals>.<listcomp>)r   r   r   r   )r   r7  r"   r#   r   r   r   sqf_list+  s    zDMP.sqf_listc                    s&   t  j j j|} fdd|D S )rk  c                    s   g | ]\}}  ||fqS r   r   r   r   r   r   r   3  r   z(DMP.sqf_list_include.<locals>.<listcomp>)r   r   r   r   )r   r7  r#   r   r   r   sqf_list_include0  s    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                    s   g | ]\}}  ||fqS 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 )rn  c                    s   g | ]\}}  ||fqS 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:  s    zDMP.factor_list_includec                 C   s   | j sv|s@|s&t| j| j||||dS t| j| j||||dS q~|s\t| j| j||||dS t| j| j||||dS ntddS )z0Compute isolating intervals for roots of ``f``. )epsinfsupfastz1Cannot isolate roots of a multivariate polynomialN)r   r   r   r   r   r   r   r   )r   r7  rq  rr  rs  rt  sqfr   r   r   	intervals?  s    zDMP.intervalsc              	   C   s,   | j s t| j||| j|||dS tddS )zu
        Refine an isolating interval to the given precision.

        ``eps`` should be a rational number.

        )rq  stepsrt  z1Cannot refine a root of a multivariate polynomialN)r   r   r   r   r   )r   r*  rH  rq  rw  rt  r   r   r   refine_rootP  s
    zDMP.refine_rootc                 C   s   t | j| j||dS )z<Return the number of real roots of ``f`` in ``[inf, sup]``. rr  rs  )r   r   r   r   rr  rs  r   r   r   count_real_roots]  s    zDMP.count_real_rootsc                 C   s   t | j| j||dS )z?Return the number of complex roots of ``f`` in ``[inf, sup]``. ry  )r   r   r   rz  r   r   r   count_complex_rootsa  s    zDMP.count_complex_rootsc                 C   s   t | j| jS )z0Returns ``True`` if ``f`` is a zero polynomial. r<   r   r   r   r   r   r   r0  e  s    zDMP.is_zeroc                 C   s   t | j| j| jS )z0Returns ``True`` if ``f`` is a unit polynomial. )r=   r   r   r   r   r   r   r   is_onej  s    z
DMP.is_onec                 C   s   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  s    zDMP.is_groundc                 C   s   t | j| j| jS )z7Returns ``True`` if ``f`` is a square-free polynomial. )r   r   r   r   r   r   r   r   is_sqft  s    z
DMP.is_sqfc                 C   s   | j t| j| j| j S )z=Returns ``True`` if the leading coefficient of ``f`` is one. )r   r~  r6   r   r   r   r   r   r   is_monicy  s    zDMP.is_monicc                 C   s   | j t| j| j| j S )zAReturns ``True`` if the GCD of the coefficients of ``f`` is one. )r   r~  rp   r   r   r   r   r   r   is_primitive~  s    zDMP.is_primitivec                 C   s$   t dd t| j| j| j D S )z:Returns ``True`` if ``f`` is linear in all its variables. c                 s   s   | ]}t |d kV  qdS )r   Nr$  r   r1  r   r   r   r&    r   z DMP.is_linear.<locals>.<genexpr>r7  rA   r   r   r   keysr   r   r   r   	is_linear  s    zDMP.is_linearc                 C   s$   t dd t| j| j| j D S )z=Returns ``True`` if ``f`` is quadratic in all its variables. c                 s   s   | ]}t |d kV  qdS )   Nr$  r  r   r   r   r&    r   z#DMP.is_quadratic.<locals>.<genexpr>r  r   r   r   r   is_quadratic  s    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  s    zDMP.is_monomialc                 C   s   |   duS )z7Returns ``True`` if ``f`` is a homogeneous polynomial. N)r2  r   r   r   r   is_homogeneous  s    zDMP.is_homogeneousc                 C   s   t | j| j| jS )z:Returns ``True`` if ``f`` has no factors over its domain. )r   r   r   r   r   r   r   r   is_irreducible  s    zDMP.is_irreduciblec                 C   s   | j st| j| jS dS dS )z6Returns ``True`` if ``f`` is a cyclotomic polynomial. FN)r   r   r   r   r   r   r   r   is_cyclotomic  s    zDMP.is_cyclotomicc                 C   s   |   S r   )r  r   r   r   r   __abs__  s    zDMP.__abs__c                 C   s   |   S r   r  r   r   r   r   __neg__  s    zDMP.__neg__c                 C   s   t |tsz| t| j|| j}W nd ty>   t Y S  t	t
fy   | jd urz| j|}W n t	t
fy   t Y  Y S 0 Y n0 | |S r   )r   r   r   r;   r   r   r   r  NotImplementedr   NotImplementedErrorr   r	  r   r   r   r   r   __add__  s    

zDMP.__add__c                 C   s
   |  |S r   r  r  r   r   r   __radd__  s    zDMP.__radd__c                 C   s   t |tsz| t| j|| j}W nd ty>   t Y S  t	t
fy   | jd urz| j|}W n t	t
fy   t Y  Y S 0 Y n0 | |S r   )r   r   r   r;   r   r   r   r  r  r   r  r   r
  r  r   r   r   __sub__  s    

zDMP.__sub__c                 C   s   |   |S r   r  r  r   r   r   __rsub__  s    zDMP.__rsub__c                 C   s   t |tr| |S z| |W S  ty6   t Y S  ttfy   | jd urz| | j	|W  Y S  ttfy~   Y n0 t Y S 0 d S r   )
r   r   r  r  r  r  r   r  r   r   r  r   r   r   __mul__  s    


zDMP.__mul__c                 C   s   t |tr| |S z| |W S  ty6   t Y S  ttfy   | jd urz| | j	|W  Y S  ttfy~   Y n0 t Y S 0 d S r   )
r   r   r!  r  r  r  r   r  r   r   r  r   r   r   __truediv__  s    


zDMP.__truediv__c              	   C   sN   t |tr|| S | jd urJz| j|| W S  ttfyH   Y n0 tS r   )r   r   r!  r   r   r   r  r  r  r   r   r   __rtruediv__  s    


zDMP.__rtruediv__c                 C   s
   |  |S r   r  r  r   r   r   __rmul__  s    zDMP.__rmul__c                 C   s
   |  |S r   r  r  r   r   r   __pow__  s    zDMP.__pow__c                 C   s
   |  |S r   r  r  r   r   r   
__divmod__  s    zDMP.__divmod__c                 C   s
   |  |S r   r  r  r   r   r   __mod__  s    zDMP.__mod__c                 C   s<   t |tr| |S z| |W S  ty6   t Y S 0 d S r   )r   r   r  r  r  r  r  r   r   r   __floordiv__  s    

zDMP.__floordiv__c                 C   sF   z.|  |\}}}}}| j|jkr,||kW S W n ty@   Y n0 dS 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__  s    z
DMP.__ne__c                 C   s   |s| |kS |  |S d 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!  s    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   s   |  |\}}}}}||k S r   r   r  r   r   r   __lt__)  s    z
DMP.__lt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   __le__-  s    z
DMP.__le__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   __gt__1  s    z
DMP.__gt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   __ge__5  s    z
DMP.__ge__c                 C   s   t | j| j S r   r}  r   r   r   r   __bool__9  s    zDMP.__bool__)NN)NFN)N)N)F)F)N)r   )N)N)N)F)F)r   )r   r   )r   r   )r   )F)T)F)F)FNNNFF)NNF)NN)NN)F)F)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  r  r  r  r  r  r  r!  r"  r#  r(  r/  r2  r4  r6  r9  r:  r;  r<  r=  r?  r@  rC  rG  rI  rJ  rK  rN  rP  rQ  rT  rU  rV  rW  rY  rZ  r[  r]  r^  r_  r`  rb  rc  rd  re  rf  rg  rh  ri  rj  rl  rm  ro  rp  rv  rx  r{  r|  propertyr0  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dWddZedXdd	Zd
d Z	dd Z
dd Zdd ZdYddZdZddZed[ddZed\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d,d- ZeZd]d.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r|\}}|d urHt |tr0t|||}t |trvt|||}n.t|\}}t|\}}||krn|}ntdt||rtdt||rt||}n$t	|||rt
|||}t
|||}nZ|}|d urt |trt|||}nt |tst|||}nt|\}}t||}|||fS )Nzinconsistent number of levelszfraction denominator)r   r)  r   r@   r*   rE  r<   ZeroDivisionErrorr:   r4   rR   r   r;   r   )r   r   r   r   r  r  Znum_levZden_levr   r   r   r  _  s8    







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%   rJ   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rdur
|jn|jtj|j tj|j f}t|j	||j }dd|f fdd	}| |||fS dS )z0Unify a multivariate fraction and a polynomial. r   NTFc                    sF   |r|s| | S |d }|r.t | || \} }jj| |f |dS Nr   r   r   r   r  r  r  rW  r   r   r   r   r   r   r   r     s    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rbj|jkrbjjjjjf|j|jffS jj	|j } j|jdurdur	|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 dS )z5Unify representations of two multivariate fractions. r   NTFc                    sF   |r|s| | S |d }|r.t | || \} }jj| |f |dS r  r  r  r  r   r   r     s    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 rJ| 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  rW  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   s   | j d|||dS )Nr   r   r  r   r   r   r   r     s    zDMF.zeroc                 C   s   | j d|||dS r  r  r   r   r   r   r     s    zDMF.onec                 C   s   |  | jS )z Returns the numerator of ``f``. )r  r  r   r   r   r   numer  s    z	DMF.numerc                 C   s   |  | jS )z"Returns the denominator of ``f``. )r  r  r   r   r   r   denom  s    z	DMF.denomc                 C   s   |  | j| jS )z4Remove common factors from ``f.num`` and ``f.den``. )r   r  r  r   r   r   r   rW  	  s    z
DMF.cancelc                 C   s    | j t| j| j| j| jddS )r  FrW  )r   rR   r  r   r   r  r   r   r   r   r    s    zDMF.negc                 C   s   t |tr:| |\}}}\}}}t|||||| }}	nV| |\}}}}
}|
| \}}\}}tt||||t||||||}t||||}	|||	S )z0Add two multivariate fractions ``f`` and ``g``. )r   r   r  re   r  rT   rX   r   r   r   r   r   F_numF_denr   r  r  r   G_numG_denr   r   r   r	    s    
zDMF.addc                 C   s   t |tr:| |\}}}\}}}t|||||| }}	nV| |\}}}}
}|
| \}}\}}tt||||t||||||}t||||}	|||	S )z5Subtract two multivariate fractions ``f`` and ``g``. )r   r   r  rf   r  rV   rX   r  r   r   r   r
     s    
zDMF.subc                 C   s   t |tr8| |\}}}\}}}t||||| }}	nB| |\}}}}
}|
| \}}\}}t||||}t||||}	|||	S )z5Multiply two multivariate fractions ``f`` and ``g``. )r   r   r  rX   r  r  r   r   r   r  /  s    
zDMF.mulc                 C   sr   t |tr^| j| j }}|dk r2|||   }}}| jt||| j| jt||| j| jddS tdt	| dS )r  r   Fr  r  N)
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r8| |\}}}\}}}|t|||| }}	nB| |\}}}}
}|
| \}}\}}t||||}t||||}	|||	}| jdur|| jvrddlm} || || j|S )z0Computes quotient of fractions ``f`` and ``g``. Nr   r  )r   r   r  rX   r  r   r  r  )r   r   r   r   r   r  r  r   r  r  r   r  r  r   r  r   r   r   r  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   rJ  \  s    z
DMF.invertc                 C   s   t | j| jS )z.Returns ``True`` if ``f`` is a zero fraction. r<   r  r   r   r   r   r   r0  c  s    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   s   |   S r   r  r   r   r   r   r  n  s    zDMF.__neg__c                 C   s   t |ttfr| |S z| | |W S  ty@   t Y S  ttfy   | j	d urz| | j	
|W  Y S  ttfy   Y n0 t Y S 0 d S r   )r   r   r  r	  r  r  r  r   r  r   r   r  r   r   r   r  q  s    

zDMF.__add__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zDMF.__radd__c                 C   s   t |ttfr| |S z| | |W S  ty@   t Y S  ttfy   | j	d urz| | j	
|W  Y S  ttfy   Y n0 t Y S 0 d S r   )r   r   r  r
  r  r  r  r   r  r   r   r  r   r   r   r    s    

zDMF.__sub__c                 C   s   |   |S r   r  r  r   r   r   r    s    zDMF.__rsub__c                 C   s   t |ttfr| |S z| | |W S  ty@   t Y S  ttfy   | j	d urz| | j	
|W  Y S  ttfy   Y n0 t Y S 0 d S r   )r   r   r  r  r  r  r  r   r  r   r   r  r   r   r   r    s    

zDMF.__mul__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zDMF.__rmul__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zDMF.__pow__c                 C   s   t |ttfr| |S z| | |W S  ty@   t Y S  ttfy   | j	d urz| | j	
|W  Y S  ttfy   Y n0 t Y S 0 d S r   )r   r   r  r  r  r  r  r   r  r   r   r  r   r   r   r    s    

zDMF.__truediv__c                 C   s>   | j dd| }| jr:|| jvr:ddlm} ||| | j|S )NF)r  r   r  )rJ  r   r  r  )r   r   r  r  r   r   r   r    s
    zDMF.__rtruediv__c                 C   s   zxt |trL| |\}}}\}}}| j|jkrvt|| j| joF||kW S n*| |\}}}}}| j|jkrv||kW S W n ty   Y n0 dS 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   zzt |trN| |\}}}\}}}| j|jkrxt|| j| joF||k W S n*| |\}}}}}| j|jkrx||kW S W n ty   Y n0 dS NTr  r  r   r   r   r    s    
z
DMF.__ne__c                 C   s   |  |\}}}}}||k S r   r  r  r   r   r   r    s    z
DMF.__lt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    s    z
DMF.__le__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    s    z
DMF.__gt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    s    z
DMF.__ge__c                 C   s   t | j| j S r   r  r   r   r   r   r    s    zDMF.__bool__)NN)NN)N)TFN)F)N)N)T)0r%   r&   r'   r(   r  r   r)   r  r  r   r   r  r  r   r  r   r   r  r  rW  r  r	  r
  r  r  r  r!  rJ  r  r0  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  B  sb   

+#%




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                    s   t |tu rt| | _n4t|tr8 fdd|D }n |g}t|| _t|trb|j| _	n"t|trzt| | _	n
t|| _	 | _
d S )Nc                    s   g | ]}  |qS r   )r   )r   rB  r   r   r   r   
  r   z ANP.__init__.<locals>.<listcomp>)r   r   r?   r   r   r   r   r0   r   r  r   )r   r   r  r   r   r   r   r     s    





zANP.__init__c                 C   s   d| j j| j| j| jf S r   )r   r%   r   r  r   r   r   r   r   r     s    zANP.__repr__c                 C   s"   t | jj|  t| jd| jfS r   )r   r   r%   r   rJ   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rJ| j| j| j|j| jfS | j|j t| j| j }t|j|j } | jkr |jkrt| j| j n | jkr| 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>5  r   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   9  s    zANP.perc                 C   s   t d||S r   r  r   r  r   r   r   r   r   <  s    zANP.zeroc                 C   s   t d||S r   r  r  r   r   r   r   @  s    zANP.onec                 C   s   t | jd| jS )r   r   )rA   r   r   r   r   r   r   r   D  s    zANP.to_dictc                 C   s6   t | jd| j}| D ]\}}| j|||< q|S )r   r   )rA   r   r   r   r   )r   r   r   r   r   r   r   r   H  s    zANP.to_sympy_dictc                 C   s   | j S r   r   r   r   r   r   r   Q  s    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  r   z%ANP.to_sympy_list.<locals>.<listcomp>r   r   r   r   r   r   U  s    zANP.to_sympy_listc                 C   s   t | jdS )r   r   )rJ   r   r   r   r   r   r   Y  s    zANP.to_tuplec                 C   s   t ttt|j|||S r   )r  r0   r   rL  r   )r   r   r  r   r   r   r   r   a  s    zANP.from_listc                 C   s   |  t| j| jS r   )r   rQ   r   r   r   r   r   r   r  e  s    zANP.negc                 C   s$   |  |\}}}}}|t|||S r   )r   rS   r   r   r   r   r   r   r  r   r   r   r	  h  s    zANP.addc                 C   s$   |  |\}}}}}|t|||S r   )r   rU   r  r   r   r   r
  l  s    zANP.subc                 C   s,   |  |\}}}}}|tt|||||S r   )r   ra   rW   r  r   r   r   r  p  s    zANP.mulc                 C   sh   t |trT|dk r.t| j| j| j|  }}n| j}| tt||| j| j| jS t	dt
| dS )r  r   r  N)r   r  rz   r   r  r   r   ra   rZ   r  r   )r   r   r   r   r   r   r  t  s    
 zANP.powc                 C   s@   |  |\}}}}}|tt|t||||||| ||fS r   )r   ra   rW   rz   r   r  r   r   r   r    s    zANP.divc                 C   sH   |  |\}}}}}t|||\}}||jgkr<| ||S tdd S )Nzzero divisor)r   rx   r   r   r   )r   r   r   r   r   r  r*  rF  r   r   r   r    s
    zANP.remc                 C   s4   |  |\}}}}}|tt|t||||||S r   )r   ra   rW   rz   r  r   r   r   r    s    zANP.quoc                 C   s   t | j| jS r3  )r5   r   r   r   r   r   r   r4    s    zANP.LCc                 C   s   t | j| jS r5  )r7   r   r   r   r   r   r   r6    s    zANP.TCc                 C   s   |  S )z6Returns ``True`` if ``f`` is a zero algebraic number. r   r   r   r   r   r0    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~    s    z
ANP.is_onec                 C   s   | j  pt| j dkS )r  r   )r   r   r   r   r   r   r    s    zANP.is_groundc                 C   s   | S r   r   r   r   r   r   __pos__  s    zANP.__pos__c                 C   s   |   S r   r  r   r   r   r   r    s    zANP.__neg__c              	   C   sF   t |tr| |S z| | |W S  ttfy@   t Y S 0 d S r   )r   r  r	  r   r   r  r  r  r   r   r   r    s    

zANP.__add__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zANP.__radd__c              	   C   sF   t |tr| |S z| | |W S  ttfy@   t Y S 0 d S r   )r   r  r
  r   r   r  r  r  r   r   r   r    s    

zANP.__sub__c                 C   s   |   |S r   r  r  r   r   r   r    s    zANP.__rsub__c              	   C   sF   t |tr| |S z| | |W S  ttfy@   t Y S 0 d S r   )r   r  r  r   r   r  r  r  r   r   r   r    s    

zANP.__mul__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zANP.__rmul__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zANP.__pow__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zANP.__divmod__c                 C   s
   |  |S r   r  r  r   r   r   r    s    zANP.__mod__c              	   C   sF   t |tr| |S z| | |W S  ttfy@   t Y S 0 d S r   )r   r  r  r   r   r  r  r  r   r   r   r    s    

zANP.__truediv__c                 C   s8   z|  |\}}}}}||kW S  ty2   Y dS 0 d S r  r   r   r  r   r   r   r    s
    
z
ANP.__eq__c                 C   s8   z|  |\}}}}}||kW S  ty2   Y dS 0 d S r  r  r  r   r   r   r    s
    
z
ANP.__ne__c                 C   s   |  |\}}}}}||k S r   r  r  r   r   r   r    s    z
ANP.__lt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    s    z
ANP.__le__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    s    z
ANP.__gt__c                 C   s   |  |\}}}}}||kS r   r  r  r   r   r   r    s    z
ANP.__ge__c                 C   s
   t | jS r   )boolr   r   r   r   r   r    s    zANP.__bool__)NN)5r%   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!  r4  r6  r  r0  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    sl   


	




				r  N)r(   sympy.core.numbersr   sympy.core.sympifyr   r  r   r   r   sympy.polys.polyutilsr   r   Zsympy.polys.densebasicr*   r+   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   Zsympy.polys.densearithrK   rL   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   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   sympy.polys.rootisolationr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   <module>   s:   @0
$4       2   ;