B
    dd-                 @   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   d/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/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_field)r   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_exact)r   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>   s    z/GenericPoly._perify_factors.<locals>.<listcomp>r   )r   resultincludecoefffactorsr   )r   r   _perify_factors   s    zGenericPoly._perify_factorsN)	__name__
__module____qualname____doc__r   r   r   classmethodr   r   r   r   r   r   
   s
   r   )!dmp_validate
dup_normal
dmp_normaldup_convertdmp_convertdmp_from_sympy	dup_strip
dup_degreedmp_degree_indmp_degree_listdmp_negative_pdup_LCdmp_ground_LCdup_TCdmp_ground_TCdmp_ground_nthdmp_one
dmp_ground
dmp_zero_p	dmp_one_pdmp_ground_pdup_from_dictdmp_from_dictdmp_to_dictdmp_deflate
dmp_inject	dmp_ejectdmp_terms_gcddmp_list_termsdmp_excludedmp_slice_indmp_permutedmp_to_tuple)dmp_add_grounddmp_sub_grounddmp_mul_grounddmp_quo_grounddmp_exquo_grounddmp_absdup_negdmp_negdup_adddmp_adddup_subdmp_subdup_muldmp_muldmp_sqrdup_powdmp_powdmp_pdivdmp_premdmp_pquo
dmp_pexquodmp_divdup_remdmp_remdmp_quo	dmp_exquodmp_add_muldmp_sub_muldmp_max_normdmp_l1_normdmp_l2_norm_squared)dmp_clear_denomsdmp_integrate_indmp_diff_indmp_eval_in
dup_revertdmp_ground_truncdmp_ground_contentdmp_ground_primitivedmp_ground_monicdmp_composedup_decompose	dup_shiftdup_transformdmp_lift)
dup_half_gcdex	dup_gcdex
dup_invertdmp_subresultantsdmp_resultantdmp_discriminantdmp_inner_gcddmp_gcddmp_lcm
dmp_cancel)dup_gff_listdmp_norm	dmp_sqf_pdmp_sqf_normdmp_sqf_partdmp_sqf_listdmp_sqf_list_include)dup_cyclotomic_pdmp_irreducible_pdmp_factor_listdmp_factor_list_include)dup_isolate_real_roots_sqfdup_isolate_real_rootsdup_isolate_all_roots_sqfdup_isolate_all_rootsdup_refine_real_rootdup_count_real_rootsdup_count_complex_roots	dup_sturmdup_cauchy_upper_bounddup_cauchy_lower_bounddup_mignotte_sep_bound_squared)UnificationFailedPolynomialErrorc             C   s   t t| ||||S )N)DMPr%   )replevr
   r   r   r   init_normal_DMP   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 k	r>t |tkr"t|||}qJt|tsJt|||}nt|\}}|| _|| _	|| _
|| _d S )N)typedictr9   
isinstancelistr4   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 )N)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k	r dk	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. z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kr(| j}|dkr6| j}t||||S )z.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 )Nr   )r   )r   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
   r   r   r   from_sympy_list   s    zDMP.from_sympy_listc             C   s   t | j| j| j|dS )zAConvert ``f`` to a dict representation with native coefficients. )r   )r:   r   r   r
   )r   r   r   r   r   to_dict   s    zDMP.to_dictc             C   s@   t | j| j| j|d}x$| D ]\}}| j|||< q W |S )z@Convert ``f`` to a dict representation with SymPy coefficients. )r   )r:   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 )z@Convert ``f`` to a list representation with SymPy coefficients. c                sB   g }x8| D ]0}t |tr(|| q
| j| q
W |S )N)r   r   appendr
   r   )r   outval)r   sympify_nested_listr   r   r     s    

z.DMP.to_sympy_list.<locals>.sympify_nested_list)r   )r   r   )r   r   r   to_sympy_list   s    	zDMP.to_sympy_listc             C   s   t | j| jS )zx
        Convert ``f`` to a tuple representation with native coefficients.

        This is needed for hashing.
        )rC   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. )r9   )r   r   r   r
   r   r   r   	from_dict  s    zDMP.from_dictc             C   s   t ttt|||||S )N)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 )zMake the ground domain a ring. )r   r
   r   )r   r   r   r   to_ring  s    zDMP.to_ringc             C   s   |  | j S )z Make the ground domain a field. )r   r
   r   )r   r   r   r   to_field!  s    zDMP.to_fieldc             C   s   |  | j S )zMake the ground domain exact. )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   rA   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  s    zDMP.coeffs.<locals>.<listcomp>)order)r?   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   :  s    zDMP.monoms.<locals>.<listcomp>)r   )r?   r   r   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   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  s    z"DMP.all_coeffs.<locals>.<listcomp>z&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  s    z"DMP.all_monoms.<locals>.<listcomp>z&multivariate polynomials not supportedN)r   r*   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   r   ^  s    z!DMP.all_terms.<locals>.<listcomp>z&multivariate polynomials not supportedN)r   r*   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   rp   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`. )r;   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)r<   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   )r=   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))

        )r@   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   rB   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``. )r>   r   r   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   rD   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   rE   r   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   rF   r   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   rG   r   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   rH   r   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   rI   r   r   r
   )r   r   r   r   abs  s    zDMP.absc             C   s   |  t| j| j| jS )z"Negate all coefficients in ``f``. )r   rK   r   r   r
   )r   r   r   r   neg  s    zDMP.negc             C   s&   |  |\}}}}}|t||||S )z2Add two multivariate polynomials ``f`` and ``g``. )r   rM   )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   rO   )r   r   r   r
   r   r   r   r   r   r   sub  s    zDMP.subc             C   s&   |  |\}}}}}|t||||S )z7Multiply two multivariate polynomials ``f`` and ``g``. )r   rQ   )r   r   r   r
   r   r   r   r   r   r   mul  s    zDMP.mulc             C   s   |  t| j| j| jS )z(Square a multivariate polynomial ``f``. )r   rR   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 )z+Raise ``f`` to a non-negative power ``n``. z``int`` expected, got %sN)	r   intr   rT   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   rU   )	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   rV   )r   r   r   r
   r   r   r   r   r   r   prem  s    zDMP.premc             C   s&   |  |\}}}}}|t||||S )z/Polynomial pseudo-quotient of ``f`` and ``g``. )r   rW   )r   r   r   r
   r   r   r   r   r   r   pquo  s    zDMP.pquoc             C   s&   |  |\}}}}}|t||||S )z5Polynomial exact pseudo-quotient of ``f`` and ``g``. )r   rX   )r   r   r   r
   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   rY   )	r   r   r   r
   r   r   r   r   r   r   r   r   div  s    zDMP.divc             C   s&   |  |\}}}}}|t||||S )z2Computes polynomial remainder of ``f`` and ``g``. )r   r[   )r   r   r   r
   r   r   r   r   r   r   rem  s    zDMP.remc             C   s&   |  |\}}}}}|t||||S )z1Computes polynomial quotient of ``f`` and ``g``. )r   r\   )r   r   r   r
   r   r   r   r   r   r   quo  s    zDMP.quoc       	      C   sT   |  |\}}}}}|t||||}| jrP|| jkrPddlm} || || j|S )z7Computes polynomial exact quotient of ``f`` and ``g``. r   )ExactQuotientFailed)r   r]   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``. z``int`` expected, got %sN)r   r   r+   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``. )r,   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 )N)sum)r   r   r   r   r   	<genexpr>  s    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}xz|  D ]n}t|d }||k rP|| }nd}|rp|d ||d |f < q.t|d }||  |7  < |d |t|< q.W 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   sF   | j rt S |  }t|d }x |D ]}t|}||kr&dS q&W |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``. )r/   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``. )r1   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 )N)r   r   )r   r   r   r   r   r   @  s    zDMP.nth.<locals>.<genexpr>za sequence of integers expectedN)allr2   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``. )r`   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``. )ra   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``. )rb   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. )rc   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``. z``int`` expected, got %s)	r   r   r   r   r   rd   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``. z``int`` expected, got %s)	r   r   r   r   r   re   r   r   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``. z``int`` expected, got %sT)r   )
r   r   r   r   r   rf   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. zunivariate polynomial expectedN)r   rq   
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. zunivariate polynomial expectedN)r   rr   r  )
r   r   r   r
   r   r   r   r   tr  r   r   r   gcdex|  s
    z	DMP.gcdexc             C   s4   |  |\}}}}}|s(|t|||S tddS )z(Invert ``f`` modulo ``g``, if possible. zunivariate polynomial expectedN)r   rs   r  )r   r   r   r
   r   r   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``. zunivariate polynomial expectedN)r   r   rg   r   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   rt   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. )
includePRST)r   )r   ru   r   r  )
r   r   r  r   r
   r   r   r   r   r  r   r   r   	resultant  s
    zDMP.resultantc             C   s   | j t| j| j| jddS )z Computes discriminant of ``f``. T)r   )r   rv   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   rw   )
r   r   r   r
   r   r   r   r  Zcffcfgr   r   r   	cofactors  s    zDMP.cofactorsc             C   s&   |  |\}}}}}|t||||S )z+Returns polynomial GCD of ``f`` and ``g``. )r   rx   )r   r   r   r
   r   r   r   r   r   r   gcd  s    zDMP.gcdc             C   s&   |  |\}}}}}|t||||S )z+Returns polynomial LCM of ``f`` and ``g``. )r   ry   )r   r   r   r
   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   rz   )
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   rh   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   rk   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. )ri   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``. )rj   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   rl   )r   r   r   r
   r   r   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``. zunivariate polynomial expectedN)r   r   r  r   rm   r   r
   r  )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)``. zunivariate polynomial expectedN)r   r   rn   r   r
   r   r  )r   r  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)``.zunivariate polynomial expectedN)r   r  r   ro   )	r   r%  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``. zunivariate polynomial expectedN)r   r   r  r   r   r   r
   r  )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``. zunivariate polynomial expectedN)r   r   r   r
   r  )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``. zunivariate polynomial expectedN)r   r   r   r
   r  )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``. zunivariate polynomial expectedN)r   r   r   r
   r  )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   r     s    z DMP.gff_list.<locals>.<listcomp>zunivariate polynomial expectedN)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  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 )z0Returns a list of square-free factors of ``f``. c                s   g | ]\}}  ||fqS r   )r   )r   r   r   )r   r   r   r   .  s    z DMP.sqf_list.<locals>.<listcomp>)r   r   r   r
   )r   r  r   r   r   )r   r   sqf_list+  s    zDMP.sqf_listc                s&   t  j j j|} fdd|D S )z0Returns a list of square-free factors of ``f``. c                s   g | ]\}}  ||fqS r   )r   )r   r   r   )r   r   r   r   3  s    z(DMP.sqf_list_include.<locals>.<listcomp>)r   r   r   r
   )r   r  r   r   )r   r   sqf_list_include0  s    zDMP.sqf_list_includec                s,   t  j j j\}}| fdd|D fS )z0Returns a list of irreducible factors of ``f``. c                s   g | ]\}}  ||fqS r   )r   )r   r   r   )r   r   r   r   8  s    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 )z0Returns a list of irreducible factors of ``f``. c                s   g | ]\}}  ||fqS r   )r   )r   r   r   )r   r   r   r   =  s    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   r  r<  r=  r>  r?  Z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.

        )r<  stepsr?  z1Cannot refine a root of a multivariate polynomialN)r   r   r   r
   r   )r   r   r  r<  rA  r?  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]``. )r=  r>  )r   r   r
   )r   r=  r>  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]``. )r=  r>  )r   r   r
   )r   r=  r>  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. )r5   r   r   )r   r   r   r   r  e  s    zDMP.is_zeroc             C   s   t | j| j| jS )z0Returns ``True`` if ``f`` is a unit polynomial. )r6   r   r   r
   )r   r   r   r   is_onej  s    z
DMP.is_onec             C   s   t | jd| jS )z>Returns ``True`` if ``f`` is an element of the ground domain. N)r7   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
   rE  r/   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
   rE  ri   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   N)r   )r   r  r   r   r   r     s    z DMP.is_linear.<locals>.<genexpr>)r  r:   r   r   r
   keys)r   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 )   N)r   )r   r  r   r   r   r     s    z#DMP.is_quadratic.<locals>.<genexpr>)r  r:   r   r   r
   rJ  )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k	S )z7Returns ``True`` if ``f`` is a homogeneous polynomial. N)r  )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 )N)r   )r   r   r   r   __abs__  s    zDMP.__abs__c             C   s   |   S )N)r   )r   r   r   r   __neg__  s    zDMP.__neg__c             C   s   t |tsy| t| j|| j}W n^ tk
r<   tS  t	t
fk
r   | jd k	ry| j|}W n t	t
fk
r   tS X Y nX | |S )N)r   r   r   r4   r
   r   r   r   NotImplementedr   NotImplementedErrorr   r   )r   r   r   r   r   __add__  s    

zDMP.__add__c             C   s
   |  |S )N)rV  )r   r   r   r   r   __radd__  s    zDMP.__radd__c             C   s   t |tsy| t| j|| j}W n^ tk
r<   tS  t	t
fk
r   | jd k	ry| j|}W n t	t
fk
r   tS X Y nX | |S )N)r   r   r   r4   r
   r   r   r   rT  r   rU  r   r   )r   r   r   r   r   __sub__  s    

zDMP.__sub__c             C   s   |   |S )N)rV  )r   r   r   r   r   __rsub__  s    zDMP.__rsub__c             C   s   t |tr| |S y
| |S  tk
r2   tS  ttfk
r~   | jd k	rzy| | j	|S  ttfk
rx   Y nX tS X d S )N)
r   r   r   r   r   rT  r   rU  r   r   )r   r   r   r   r   __mul__  s    



zDMP.__mul__c             C   s   t |tr| |S y
| |S  tk
r2   tS  ttfk
r~   | jd k	rzy| | j	|S  ttfk
rx   Y nX tS X d S )N)
r   r   r   r   r   rT  r   rU  r   r   )r   r   r   r   r   __truediv__  s    



zDMP.__truediv__c          	   C   sN   t |tr|| S | jd k	rJy| j|| S  ttfk
rH   Y nX tS )N)r   r   r   r   r   r   rU  rT  )r   r   r   r   r   __rtruediv__  s    


zDMP.__rtruediv__c             C   s
   |  |S )N)rZ  )r   r   r   r   r   __rmul__  s    zDMP.__rmul__c             C   s
   |  |S )N)r   )r   r   r   r   r   __pow__  s    zDMP.__pow__c             C   s
   |  |S )N)r   )r   r   r   r   r   
__divmod__  s    zDMP.__divmod__c             C   s
   |  |S )N)r   )r   r   r   r   r   __mod__  s    zDMP.__mod__c             C   s8   t |tr| |S y
| |S  tk
r2   tS X d S )N)r   r   r   r   r   rT  )r   r   r   r   r   __floordiv__  s    


zDMP.__floordiv__c             C   sF   y,|  |\}}}}}| j|jkr*||kS W n tk
r@   Y nX dS )NF)r   r   r   )r   r   r   r   r   r   r   r   __eq__  s    z
DMP.__eq__c             C   s
   | |k S )Nr   )r   r   r   r   r   __ne__  s    z
DMP.__ne__c             C   s   |s| |kS |  |S d S )N)
_strict_eq)r   r   strictr   r   r   eq  s    zDMP.eqc             C   s   | j ||d S )N)re  )rf  )r   r   re  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 )N)r   r   r   r
   r   )r   r   r   r   r   rd  $  s    zDMP._strict_eqc             C   s   |  |\}}}}}||k S )N)r   )r   r   r   r   r   r   r   r   __lt__)  s    z
DMP.__lt__c             C   s   |  |\}}}}}||kS )N)r   )r   r   r   r   r   r   r   r   __le__-  s    z
DMP.__le__c             C   s   |  |\}}}}}||kS )N)r   )r   r   r   r   r   r   r   r   __gt__1  s    z
DMP.__gt__c             C   s   |  |\}}}}}||kS )N)r   )r   r   r   r   r   r   r   r   __ge__5  s    z
DMP.__ge__c             C   s   t | j| j S )N)r5   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  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  r6  r7  r8  r9  r:  r;  r@  rB  rC  rD  propertyr  rE  rF  rG  rH  rI  rK  rM  rN  rO  rP  rQ  rR  rS  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rf  rg  rd  rh  ri  rj  rk  rl  r   r   r   r   r      s"  	
	



	
	r   c             C   s   t t| ||t|||||S )N)DMFr%   )numdenr   r
   r   r   r   init_normal_DMF=  s    rr  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 )^ro  z'Dense Multivariate Fractions over `K`. )rp  rq  r   r
   r   Nc             C   sH   |  |||\}}}t||||\}}|| _|| _|| _|| _|| _d S )N)_parserz   rp  rq  r   r
   r   )r   r   r
   r   r   rp  rq  r   r   r   r   G  s    zDMF.__init__c             C   s@   |  |||\}}}t| }||_||_||_||_||_|S )N)rs  object__new__rp  rq  r   r
   r   )r   r   r
   r   r   rp  rq  objr   r   r   newQ  s    
zDMF.newc             C   s(  t |tr|\}}|d k	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 k	rt |trt|||}nt |tst|||}nt|\}}t||}|||fS )Nzinconsistent number of levelszfraction denominator)r   r   r   r9   r#   r  r5   ZeroDivisionErrorr3   r-   rK   r   r4   r   )r   r   r
   r   rp  rq  Znum_levZden_levr   r   r   rs  _  s8    







z
DMF._parsec             C   s   d| j j| j| j| j| jf S )Nz%s((%s, %s), %s, %s))r   r   rp  rq  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 )N)	r   r   r   rC   rp  r   rq  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k	rdk	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. zCannot unify %s with %sNTFc                sF   |r|s| | S |d }|r.t | || \} }jj| |f |dS )Nr   )r   )rz   r   rw  )rp  rq  r$  r   r   )r
   r   r   r   r   r     s    zDMF.poly_unify.<locals>.per)r   r   r   r   r
   r   r   rp  rq  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k	rdk	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. zCannot unify %s with %sNTFc                sF   |r|s| | S |d }|r.t | || \} }jj| |f |dS )Nr   )r   )rz   r   rw  )rp  rq  r$  r   r   )r
   r   r   r   r   r     s    zDMF.frac_unify.<locals>.per)r   ro  r   r   r
   r   r   rp  rq  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krJ| j}| jj||f|||dS )z.Create a DMF out of the given representation. r   N)r   )r   r
   rz   r   r   rw  )r   rp  rq  r$  r   r   r   r
   r   r   r   r     s    zDMF.perc             C   s(   | j }|r|s|S |d8 }t|| j|S )z.Create a DMP out of the given representation. 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   )rw  )r   r   r
   r   r   r   r   r     s    zDMF.zeroc             C   s   | j d|||dS )Nr   )r   )rw  )r   r   r
   r   r   r   r   r     s    zDMF.onec             C   s   |  | jS )z Returns the numerator of ``f``. )r{  rp  )r   r   r   r   numer  s    z	DMF.numerc             C   s   |  | jS )z"Returns the denominator of ``f``. )r{  rq  )r   r   r   r   denom  s    z	DMF.denomc             C   s   |  | j| jS )z4Remove common factors from ``f.num`` and ``f.den``. )r   rp  rq  )r   r   r   r   r$  	  s    z
DMF.cancelc             C   s    | j t| j| j| j| jddS )z"Negate all coefficients in ``f``. F)r$  )r   rK   rp  r   r
   rq  )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   ry  r^   rz  rM   rQ   )r   r   r   r
   r   F_numF_denr   rp  rq  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   ry  r_   rz  rO   rQ   )r   r   r   r
   r   r~  r  r   rp  rq  r   r  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   ry  rQ   rz  )r   r   r   r
   r   r~  r  r   rp  rq  r   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 )z+Raise ``f`` to a non-negative power ``n``. r   F)r$  z``int`` expected, got %sN)
r   r   rp  rq  r   rT   r   r
   r   r   )r   r   rp  rq  r   r   r   r   =  s    
zDMF.powc             C   s   t |tr8| |\}}}\}}}|t|||| }}	nB| |\}}}}
}|
| \}}\}}t||||}t||||}	|||	}| jdk	r|| jkrddlm} || || j|S )z0Computes quotient of fractions ``f`` and ``g``. Nr   )r   )r   r   ry  rQ   rz  r   r   r   )r   r   r   r
   r   r~  r  r   rp  rq  r   r  r  r   r   r   r   r   r   H  s    

zDMF.quoc             C   s>   |r&| j dk	r&| j | s&t| | j | j| j| jdd}|S )z&Computes inverse of a fraction ``f``. NF)r$  )r   Zis_unitr   r   rq  rp  )r   checkr   r   r   r   r  \  s    z
DMF.invertc             C   s   t | j| jS )z.Returns ``True`` if ``f`` is a zero fraction. )r5   rp  r   )r   r   r   r   r  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. )r6   rp  r   r
   rq  )r   r   r   r   rE  h  s    z
DMF.is_onec             C   s   |   S )N)r   )r   r   r   r   rS  n  s    zDMF.__neg__c             C   s   t |ttfr| |S y| | |S  tk
r<   tS  ttfk
r   | j	d k	ry| | j	
|S  ttfk
r   Y nX tS X d S )N)r   r   ro  r   r{  r   rT  r   rU  r   r   )r   r   r   r   r   rV  q  s    

zDMF.__add__c             C   s
   |  |S )N)rV  )r   r   r   r   r   rW    s    zDMF.__radd__c             C   s   t |ttfr| |S y| | |S  tk
r<   tS  ttfk
r   | j	d k	ry| | j	
|S  ttfk
r   Y nX tS X d S )N)r   r   ro  r   r{  r   rT  r   rU  r   r   )r   r   r   r   r   rX    s    

zDMF.__sub__c             C   s   |   |S )N)rV  )r   r   r   r   r   rY    s    zDMF.__rsub__c             C   s   t |ttfr| |S y| | |S  tk
r<   tS  ttfk
r   | j	d k	ry| | j	
|S  ttfk
r   Y nX tS X d S )N)r   r   ro  r   r{  r   rT  r   rU  r   r   )r   r   r   r   r   rZ    s    

zDMF.__mul__c             C   s
   |  |S )N)rZ  )r   r   r   r   r   r]    s    zDMF.__rmul__c             C   s
   |  |S )N)r   )r   r   r   r   r   r^    s    zDMF.__pow__c             C   s   t |ttfr| |S y| | |S  tk
r<   tS  ttfk
r   | j	d k	ry| | j	
|S  ttfk
r   Y nX tS X d S )N)r   r   ro  r   r{  r   rT  r   rU  r   r   )r   r   r   r   r   r[    s    

zDMF.__truediv__c             C   s>   | j dd| }| jr:|| jkr:ddlm} ||| | j|S )NF)r  r   )r   )r  r   r   r   )r   r   r   r   r   r   r   r\    s
    zDMF.__rtruediv__c             C   s   ytt |trJ| |\}}}\}}}| j|jkrrt|| j| joF||kS n(| |\}}}}}| j|jkrr||kS W n tk
r   Y nX dS )NF)r   r   ry  r   r6   r
   rz  r   )r   r   r   r~  r  r   r   r   r   r   rb    s    
z
DMF.__eq__c             C   s   yvt |trL| |\}}}\}}}| j|jkrtt|| j| joF||k S n(| |\}}}}}| j|jkrt||kS W n tk
r   Y nX dS )NT)r   r   ry  r   r6   r
   rz  r   )r   r   r   r~  r  r   r   r   r   r   rc    s    
z
DMF.__ne__c             C   s   |  |\}}}}}||k S )N)rz  )r   r   r   r   r   r   r   r   rh    s    z
DMF.__lt__c             C   s   |  |\}}}}}||kS )N)rz  )r   r   r   r   r   r   r   r   ri    s    z
DMF.__le__c             C   s   |  |\}}}}}||kS )N)rz  )r   r   r   r   r   r   r   r   rj    s    z
DMF.__gt__c             C   s   |  |\}}}}}||kS )N)rz  )r   r   r   r   r   r   r   r   rk    s    z
DMF.__ge__c             C   s   t | j| j S )N)r5   rp  r   )r   r   r   r   rl    s    zDMF.__bool__)NN)NN)N)TFN)F)N)N)T)0r   r   r    r!   rm  r   r"   rw  rs  r   r   ry  rz  r   r{  r   r   r|  r}  r$  r   r   r   r   r   r   r   r  rn  r  rE  rS  rV  rW  rX  rY  rZ  r]  r^  r[  r\  rb  rc  rh  ri  rj  rk  rl  r   r   r   r   ro  B  s^   

+#%


ro  c             C   s   t t| |t|||S )N)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   r  r
   c                s   t |tk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   r  )r
   r   r   r   
  s    z ANP.__init__.<locals>.<listcomp>)r   r   r8   r   r   r   r   r)   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 )Nz%s(%s, %s, %s))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 )Nr   )r   r   r   r   rC   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. zCannot unify %s with %sc                s   t |  S )N)r  )r   )r
   r  r   r   <lambda>5      zANP.unify.<locals>.<lambda>)	r   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 )N)r  r  r
   )r   r   r  r
   r   r   r   r   9  s    zANP.perc             C   s   t d||S )Nr   )r  )r   r  r
   r   r   r   r   <  s    zANP.zeroc             C   s   t d||S )Nr   )r  )r   r  r
   r   r   r   r   @  s    zANP.onec             C   s   t | jd| jS )zAConvert ``f`` to a dict representation with native coefficients. r   )r:   r   r
   )r   r   r   r   r   D  s    zANP.to_dictc             C   s:   t | jd| j}x$| D ]\}}| j|||< qW |S )z@Convert ``f`` to a dict representation with SymPy coefficients. r   )r:   r   r
   r   r   )r   r   r   r   r   r   r   r   H  s    zANP.to_sympy_dictc             C   s   | j S )zAConvert ``f`` to a list representation with native coefficients. )r   )r   r   r   r   r   Q  s    zANP.to_listc                s    fdd j D S )z@Convert ``f`` to a list representation with SymPy coefficients. c                s   g | ]} j |qS r   )r
   r   )r   r   )r   r   r   r   W  s    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 )zx
        Convert ``f`` to a tuple representation with native coefficients.

        This is needed for hashing.
        r   )rC   r   )r   r   r   r   r   Y  s    zANP.to_tuplec             C   s   t ttt|j|||S )N)r  r)   r   r  r   )r   r   r  r
   r   r   r   r   a  s    zANP.from_listc             C   s   |  t| j| jS )N)r   rJ   r   r
   )r   r   r   r   r   e  s    zANP.negc             C   s$   |  |\}}}}}|t|||S )N)r   rL   )r   r   r
   r   r   r   r  r   r   r   r   h  s    zANP.addc             C   s$   |  |\}}}}}|t|||S )N)r   rN   )r   r   r
   r   r   r   r  r   r   r   r   l  s    zANP.subc             C   s,   |  |\}}}}}|tt|||||S )N)r   rZ   rP   )r   r   r
   r   r   r   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 )z+Raise ``f`` to a non-negative power ``n``. r   z``int`` expected, got %sN)r   r   rs   r   r  r
   r   rZ   rS   r   r   )r   r   r   r   r   r   r   t  s    
 zANP.powc             C   s@   |  |\}}}}}|tt|t||||||| ||fS )N)r   rZ   rP   rs   r   )r   r   r
   r   r   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   rq   r   r   r   )r   r   r
   r   r   r  r   r  r   r   r   r     s
    zANP.remc             C   s4   |  |\}}}}}|tt|t||||||S )N)r   rZ   rP   rs   )r   r   r
   r   r   r   r  r   r   r   r     s    zANP.quoc             C   s   t | j| jS )z*Returns the leading coefficient of ``f``. )r.   r   r
   )r   r   r   r   r    s    zANP.LCc             C   s   t | j| jS )z+Returns the trailing coefficient of ``f``. )r0   r   r
   )r   r   r   r   r    s    zANP.TCc             C   s   |  S )z6Returns ``True`` if ``f`` is a zero algebraic number. r   )r   r   r   r   r    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   rE    s    z
ANP.is_onec             C   s   | j  pt| j dkS )z>Returns ``True`` if ``f`` is an element of the ground domain. r   )r   r   )r   r   r   r   rF    s    zANP.is_groundc             C   s   | S )Nr   )r   r   r   r   __pos__  s    zANP.__pos__c             C   s   |   S )N)r   )r   r   r   r   rS    s    zANP.__neg__c          	   C   sB   t |tr| |S y| | |S  ttfk
r<   tS X d S )N)r   r  r   r   r   r   rT  )r   r   r   r   r   rV    s    

zANP.__add__c             C   s
   |  |S )N)rV  )r   r   r   r   r   rW    s    zANP.__radd__c          	   C   sB   t |tr| |S y| | |S  ttfk
r<   tS X d S )N)r   r  r   r   r   r   rT  )r   r   r   r   r   rX    s    

zANP.__sub__c             C   s   |   |S )N)rV  )r   r   r   r   r   rY    s    zANP.__rsub__c          	   C   sB   t |tr| |S y| | |S  ttfk
r<   tS X d S )N)r   r  r   r   r   r   rT  )r   r   r   r   r   rZ    s    

zANP.__mul__c             C   s
   |  |S )N)rZ  )r   r   r   r   r   r]    s    zANP.__rmul__c             C   s
   |  |S )N)r   )r   r   r   r   r   r^    s    zANP.__pow__c             C   s
   |  |S )N)r   )r   r   r   r   r   r_    s    zANP.__divmod__c             C   s
   |  |S )N)r   )r   r   r   r   r   r`    s    zANP.__mod__c          	   C   sB   t |tr| |S y| | |S  ttfk
r<   tS X d S )N)r   r  r   r   r   r   rT  )r   r   r   r   r   r[    s    

zANP.__truediv__c             C   s6   y|  |\}}}}}||kS  tk
r0   dS X d S )NF)r   r   )r   r   r   r   r   r   r   r   rb    s
    z
ANP.__eq__c             C   s6   y|  |\}}}}}||kS  tk
r0   dS X d S )NT)r   r   )r   r   r   r   r   r   r   r   rc    s
    z
ANP.__ne__c             C   s   |  |\}}}}}||k S )N)r   )r   r   r   r   r   r   r   r   rh    s    z
ANP.__lt__c             C   s   |  |\}}}}}||kS )N)r   )r   r   r   r   r   r   r   r   ri    s    z
ANP.__le__c             C   s   |  |\}}}}}||kS )N)r   )r   r   r   r   r   r   r   r   rj    s    z
ANP.__gt__c             C   s   |  |\}}}}}||kS )N)r   )r   r   r   r   r   r   r   r   rk    s    z
ANP.__ge__c             C   s
   t | jS )N)boolr   )r   r   r   r   rl    s    zANP.__bool__)NN)5r   r   r    r!   rm  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  rn  r  rE  rF  r  rS  rV  rW  rX  rY  rZ  r]  r^  r_  r`  r[  rb  rc  rh  ri  rj  rk  rl  r   r   r   r   r    s`   
	
				r  N)r!   Zsympy.core.numbersr   Zsympy.core.sympifyr   r   r   r   r   Zsympy.polys.polyutilsr   r   Zsympy.polys.densebasicr#   r$   r%   r&   r'   r(   r)   r*   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   Zsympy.polys.densearithrD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   Zsympy.polys.densetoolsrc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   Zsympy.polys.euclidtoolsrq   rr   rs   rt   ru   rv   rw   rx   ry   rz   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   rr  ro  r  r  r   r   r   r   <module>   s:   @0
$4       2   ;