U
    ZÊ¹j¤o ã                   @  sü  U d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZmZmZ dd	lmZmZmZm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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR ddlSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZb ddlcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZm ddlnmoZompZpmqZqmrZrmsZsmtZtmuZu ddlvmwZwmxZxmyZymzZz 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† ddlm‡Z‡mˆZˆ de‰d< edk�rŽddlŠZŠeefZ‹ndZŠdZ‹G dd„ de
ƒZŒG dd„ deŒƒZ�G dd„ deŒƒZŽdd„ Z�G dd „ d ee
ƒZ�d!d"„ Z‘G d#d$„ d$e
ƒZ’dS )%z1OO layer for several polynomial representations. é    )Úannotations)ÚGROUND_TYPES)Úsympy_deprecation_warning)Úoo)ÚCantSympify)ÚPicklableWithSlotsÚ_sort_factors)ÚDomainÚZZÚQQ)ÚCoercionFailedÚExactQuotientFailedÚDomainErrorÚNotInvertible)!ÚninfÚdmp_validateÚ
dup_normalÚ
dmp_normalÚdup_convertÚdmp_convertÚdmp_from_sympyÚ	dup_stripÚdmp_degree_inÚdmp_degree_listÚdmp_negative_pÚdmp_ground_LCÚdmp_ground_TCÚdmp_ground_nthÚdmp_oneÚ
dmp_groundÚdmp_zeroÚ
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Ú	dup_sliceÚ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Údmp_negÚdmp_addÚdmp_subÚdmp_mulÚdmp_sqrÚdmp_powÚdmp_pdivÚdmp_premÚdmp_pquoÚ
dmp_pexquoÚdmp_divÚ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Ú	dmp_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ÚPolynomialErrorztuple[Domain, ...]Ú_flint_domainsÚflintN© c                   @  s^  e Zd ZdZdZ�dždd„Zedd„ ƒZedd	„ ƒZ	d
d„ Z
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Z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d(d)„ Z�dŸd+d,„Z�d d-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!�d¡d<d=„Z"d>d?„ Z#d@dA„ Z$�d¢dBdC„Z%�d£dDdE„Z&�d¤dFdG„Z'�d¥dHdI„Z(dJdK„ Z)dLdM„ Z*dNdO„ Z+dPdQ„ Z,dRdS„ Z-dTdU„ Z.�d¦dVdW„Z/�d§dXdY„Z0dZd[„ Z1d\d]„ Z2d^d_„ Z3d`da„ Z4dbdc„ Z5ddde„ Z6dfdg„ Z7dhdi„ Z8djdk„ Z9dldm„ Z:dndo„ Z;dpdq„ Z<drds„ Z=dtdu„ Z>dvdw„ Z?dxdy„ Z@dzd{„ ZAd|d}„ ZBd~d„ ZCd€d�„ ZDd‚dƒ„ ZEd„d…„ ZFd†d‡„ ZGdˆd‰„ ZHdŠd‹„ ZIdŒd�„ ZJdŽd�„ ZKd�d‘„ ZLd’d“„ ZMd”d•„ ZNd–d—„ ZOd˜d™„ ZPdšd›„ ZQdœd�„ ZRdždŸ„ ZSd d¡„ ZTd¢d£„ ZUd¤d¥„ ZVd¦d§„ ZWd¨d©„ ZXdªd«„ ZYd¬d­„ ZZd®d¯„ Z[�d¨d°d±„Z\d²d³„ Z]d´dµ„ Z^d¶d·„ Z_d¸d¹„ Z`dºd»„ Zad¼d½„ Zbd¾d¿„ ZcdÀdÁ„ ZddÂdÃ„ ZedÄdÅ„ ZfdÆdÇ„ ZgdÈdÉ„ ZhdÊdË„ Zi�d©dÍdÎ„ZjdÏdÐ„ Zk�dªdÑdÒ„ZldÓdÔ„ Zm�d«dÕdÖ„Znd×dØ„ ZodÙdÚ„ ZpdÛdÜ„ ZqdÝdÞ„ Zrdßdà„ Zsdádâ„ Ztdãdä„ Zudådæ„ Zvdçdè„ Zwdédê„ Zxdëdì„ Zydídî„ Zz�d¬dïdð„Z{�d­dñdò„Z|dódô„ Z}dõdö„ Z~d÷dø„ Zdùdú„ Z€dûdü„ Z�dýdþ„ Z‚dÿ�d „ Zƒ�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��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—�d*�d+„ Z˜�d,�d-„ Z™�d.�d/„ Zš�d0�d1„ Z›�d2�d3„ Zœ�d4�d5„ Z��d6�d7„ Zž�d8�d9„ ZŸ�d:�d;„ Z �d<�d=„ Z¡�d¯�d>�d?„Z¢�d°�d@�dA„Z£�dB�dC„ Z¤�dD�dE„ Z¥�d±�dF�dG„Z¦�dH�dI„ Z§�dJ�dK„ Z¨�dL�dM„ Z©�dN�dO„ Zª�d²�dP�dQ„Z«�dR�dS„ Z¬�d³�dT�dU„Z­�d´�dV�dW„Z®e�dX�dY„ ƒZ¯e�dZ�d[„ ƒZ°e�d\�d]„ ƒZ±e�d^�d_„ ƒZ²e�d`�da„ ƒZ³e�db�dc„ ƒZ´e�dd�de„ ƒZµe�df�dg„ ƒZ¶e�dh�di„ ƒZ·e�dj�dk„ ƒZ¸e�dl�dm„ ƒZ¹e�dn�do„ ƒZº�dp�dq„ Z»�dr�ds„ Z¼�dt�du„ Z½�dv�dw„ Z¾�dx�dy„ Z¿�dz�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É�dŽ�d�„ ZÊ�dµ�d��d‘„ZË�d¶�d’�d“„ZÌ�d”�d•„ ZÍ�d–�d—„ ZÎ�d˜�d™„ ZÏ�dš�d›„ ZÐ�dœ�d�„ ZÑdS (·  ÚDMPú)Dense Multivariate Polynomials over `K`. r}   Nc                 C  s>   |d krt |ƒ\}}nt|tƒs0tdt|ƒ ƒ‚|  |||¡S )Nzexpected list, got %s)r   Ú
isinstanceÚlistr   ÚtypeÚnew©ÚclsÚrepÚdomÚlevr}   r}   úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/polys/polyclasses.pyÚ__new__�   s
    
zDMP.__new__c                 C  s4   t d k	r&|dkr&|tkr&t |||¡S t |||¡S ©Nr   )r|   r{   Ú	DUP_FlintÚ_newÚ
DMP_Pythonr„   r}   r}   r‰   rƒ   ˜   s    zDMP.newc                 C  s   t dddd� |  ¡ S )z!Get the representation of ``f``. ay  
        Accessing the ``DMP.rep`` attribute is deprecated. The internal
        representation of ``DMP`` instances can now be ``DUP_Flint`` when the
        ground types are ``flint``. In this case the ``DMP`` instance does not
        have a ``rep`` attribute. Use ``DMP.to_list()`` instead. Using
        ``DMP.to_list()`` also works in previous versions of SymPy.
        z1.13zdmp-rep)Zdeprecated_since_versionZactive_deprecations_target)r   Úto_list©Úfr}   r}   r‰   r†   ¤   s
    øzDMP.repc                 C  s>   t dk	r:t| tƒr:| jdkr:| jtkr:t | j| j| j¡S | S )zÇConvert to DUP_Flint if possible.

        This method should be used when the domain or level is changed and it
        potentially becomes possible to convert from DMP_Python to DUP_Flint.
        Nr   )	r|   r€   rŽ   rˆ   r‡   r{   rŒ   rƒ   Ú_repr�   r}   r}   r‰   Úto_bestµ   s    zDMP.to_bestc                   s@   t ˆ tƒst‚t |tƒr |dks$t‚‡ ‡fdd„‰ˆ||ƒ d S )Nr   c                   sN   t | tƒst‚|dkr2t‡ fdd„| D ƒƒsJt‚n| D ]}ˆ||d ƒ q6d S )Nr   c                 3  s   | ]}ˆ   |¡V  qd S ©N)Zof_type©Ú.0Úc©r‡   r}   r‰   Ú	<genexpr>É   s     z;DMP._validate_args.<locals>.validate_rep.<locals>.<genexpr>é   )r€   r�   ÚAssertionErrorÚall)r†   rˆ   Úr©r‡   Úvalidate_repr}   r‰   rŸ   Æ   s
    z(DMP._validate_args.<locals>.validate_rep)r€   r	   r›   Úintr„   r}   rž   r‰   Ú_validate_argsÁ   s    zDMP._validate_argsc                 C  s   t |||ƒ}|  |||¡S r”   )r%   rƒ   ©r…   r†   rˆ   r‡   r}   r}   r‰   Ú	from_dictÐ   s    zDMP.from_dictc                 C  s   |   t||d|ƒ||¡S )zCCreate an instance of ``cls`` given a list of native coefficients. N)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‰   Úfrom_sympy_listÚ   s    zDMP.from_sympy_listc                 C  s   | t tt||ƒƒƒ||ƒS r”   )Údictr�   Úzip)r…   ÚmonomsÚcoeffsrˆ   r‡   r}   r}   r‰   Úfrom_monoms_coeffsß   s    zDMP.from_monoms_coeffsc                 C  sŠ   | j |kr| S | jstdkr&|  |¡S t| tƒrR|tkrB|  |¡S |  ¡  |¡S n4t| tƒr~|tkrr|  |¡ 	¡ S |  |¡S nt
dƒ‚dS )z0Convert ``f`` to a ``DMP`` over the new domain. Nzunreachable code)r‡   rˆ   r|   Ú_convertr€   rŒ   r{   Úto_DMP_PythonrŽ   Úto_DUP_FlintÚRuntimeError©r‘   r‡   r}   r}   r‰   Úconvertã   s    




zDMP.convertc                 C  s   t ‚d S r”   ©ÚNotImplementedErrorr¯   r}   r}   r‰   r«   ö   s    zDMP._convertc                 C  s   t t|ƒ||ƒS r”   )r~   r    ©r…   rˆ   r‡   r}   r}   r‰   Úzeroù   s    zDMP.zeroc                 C  s   t t||ƒ||ƒS r”   )r~   r   r³   r}   r}   r‰   Úoneý   s    zDMP.onec                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   Ú_one  s    zDMP._onec                 C  s   d| j j|  ¡ | jf S )Nz
%s(%s, %s))Ú	__class__Ú__name__r�   r‡   r�   r}   r}   r‰   Ú__repr__  s    zDMP.__repr__c                 C  s   t | jj|  ¡ | j| jfƒS r”   )Úhashr·   r¸   Úto_tuplerˆ   r‡   r�   r}   r}   r‰   Ú__hash__  s    zDMP.__hash__c                 C  s   |   ¡ | j| jfS r”   )r�   r‡   rˆ   ©Úselfr}   r}   r‰   Ú__getnewargs__
  s    zDMP.__getnewargs__c                 C  s   t ‚dS )ú*Construct a new ground instance of ``f``. Nr±   ©r‘   Úcoeffr}   r}   r‰   Ú
ground_new  s    zDMP.ground_newc                 C  s\   t |tƒr| j|jkr&td| |f ƒ‚| j|jkrT| j |j¡}|  |¡} | |¡}| |fS ©z7Unify and return ``DMP`` instances of ``f`` and ``g``. úCannot unify %s with %s)r€   r~   rˆ   ry   r‡   Úunifyr°   ©r‘   Úgr‡   r}   r}   r‰   Ú	unify_DMP  s    

zDMP.unify_DMPFc                 C  s   t |  ¡ | j| j|d�S )úAConvert ``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  s2   | j |d�}| ¡ D ]\}}| j |¡||< q|S )ú@Convert ``f`` to a dict representation with SymPy coefficients. rË   )rÌ   Úitemsr‡   Úto_sympy)r‘   r´   r†   ÚkÚvr}   r}   r‰   Úto_sympy_dict!  s    zDMP.to_sympy_dictc                   s   ‡ ‡fdd„‰ˆˆ   ¡ ƒ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_list©r�   r�   r}   r×   r‰   Úto_sympy_list*  s    	zDMP.to_sympy_listc                 C  s   t ‚dS )úAConvert ``f`` to a list representation with native coefficients. Nr±   r�   r}   r}   r‰   r�   7  s    zDMP.to_listc                 C  s   t ‚dS )úx
        Convert ``f`` to a tuple representation with native coefficients.

        This is needed for hashing.
        Nr±   r�   r}   r}   r‰   r»   ;  s    zDMP.to_tuplec                 C  s   |   | j ¡ ¡S )zMake the ground domain a ring. )r°   r‡   Zget_ringr�   r}   r}   r‰   Úto_ringC  s    zDMP.to_ringc                 C  s   |   | j ¡ ¡S )z Make the ground domain a field. )r°   r‡   Ú	get_fieldr�   r}   r}   r‰   Úto_fieldG  s    zDMP.to_fieldc                 C  s   |   | j ¡ ¡S )zMake the ground domain exact. )r°   r‡   Z	get_exactr�   r}   r}   r‰   Úto_exactK  s    zDMP.to_exactr   c                 C  s(   | j s|s|  ||¡S |  |||¡S dS ©ú1Take a continuous subsequence of terms of ``f``. N)rˆ   Ú_sliceÚ
_slice_lev©r‘   ÚmÚnÚjr}   r}   r‰   ÚsliceO  s    
z	DMP.slicec                 C  s   t ‚d S r”   r±   )r‘   ræ   rç   r}   r}   r‰   rã   V  s    z
DMP._slicec                 C  s   t ‚d S r”   r±   rå   r}   r}   r‰   rä   Y  s    zDMP._slice_levc                 C  s   dd„ | j |d�D ƒS )z;Returns all non-zero coefficients from ``f`` in lex order. c                 S  s   g | ]\}}|‘qS r}   r}   )r–   Ú_r—   r}   r}   r‰   Ú
<listcomp>^  s     zDMP.coeffs.<locals>.<listcomp>©Úorder©Úterms©r‘   rí   r}   r}   r‰   r©   \  s    z
DMP.coeffsc                 C  s   dd„ | 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ë   b  s     zDMP.monoms.<locals>.<listcomp>rì   rî   rð   r}   r}   r‰   r¨   `  s    z
DMP.monomsc                 C  s2   | j r"d| jd  }|| jjfgS | j|d�S dS )ú4Returns all non-zero terms from ``f`` in lex order. ©r   rš   rì   N)Úis_zerorˆ   r‡   r´   Ú_terms)r‘   rí   Z
zero_monomr}   r}   r‰   rï   d  s    z	DMP.termsc                 C  s   t ‚d S r”   r±   rð   r}   r}   r‰   rô   l  s    z
DMP._termsc                 C  s,   | j rtdƒ‚| s| jjgS t|  ¡ ƒS dS )z%Returns all coefficients from ``f``. ú&multivariate polynomials not supportedN)rˆ   rz   r‡   r´   r�   r�   r�   r}   r}   r‰   Ú
all_coeffso  s
    
zDMP.all_coeffsc                   sB   | j rtdƒ‚|  ¡ ‰ ˆ dk r$dgS ‡ fdd„t|  ¡ ƒD ƒS dS )z"Returns all monomials from ``f``. rõ   r   rò   c                   s   g | ]\}}ˆ | f‘qS r}   r}   ©r–   Úir—   ©rç   r}   r‰   rë   ƒ  s     z"DMP.all_monoms.<locals>.<listcomp>N)rˆ   rz   ÚdegreeÚ	enumerater�   r�   r}   rù   r‰   Ú
all_monomsy  s    zDMP.all_monomsc                   sJ   | j rtdƒ‚|  ¡ ‰ ˆ dk r,d| jjfgS ‡ fdd„t|  ¡ ƒD ƒS dS )z Returns all terms from a ``f``. rõ   r   rò   c                   s   g | ]\}}ˆ | f|f‘qS r}   r}   r÷   rù   r}   r‰   rë   �  s     z!DMP.all_terms.<locals>.<listcomp>N)rˆ   rz   rú   r‡   r´   rû   r�   r�   r}   rù   r‰   Ú	all_terms…  s    zDMP.all_termsc                 C  s   |   ¡  ¡ S ©ú-Convert algebraic coefficients to rationals. )Ú_liftr“   r�   r}   r}   r‰   Úlift‘  s    zDMP.liftc                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   r   •  s    z	DMP._liftc                 C  s   t ‚dS )ú2Reduce degree of `f` by mapping `x_i^m` to `y_i`. Nr±   r�   r}   r}   r‰   Údeflate˜  s    zDMP.deflatec                 C  s   t ‚dS ©ú,Inject ground domain generators into ``f``. Nr±   ©r‘   Úfrontr}   r}   r‰   Úinjectœ  s    z
DMP.injectc                 C  s   t ‚dS ©ú2Eject selected generators into the ground domain. Nr±   ©r‘   r‡   r  r}   r}   r‰   Úeject   s    z	DMP.ejectc                 C  s   |   ¡ \}}|| ¡ fS )ap  
        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_Python([[1], [1, 2]], ZZ))

        )Ú_excluder“   ©r‘   ÚJÚFr}   r}   r‰   Úexclude¤  s    zDMP.excludec                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   r  ·  s    zDMP._excludec                 C  s
   |   |¡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_Python([[[2], []], [[1, 0], []]], ZZ)

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

        )Ú_permute©r‘   ÚPr}   r}   r‰   Úpermuteº  s    zDMP.permutec                 C  s   t ‚d S r”   r±   r  r}   r}   r‰   r  Í  s    zDMP._permutec                 C  s   t ‚dS )ú/Remove GCD of terms from the polynomial ``f``. Nr±   r�   r}   r}   r‰   Ú	terms_gcdÐ  s    zDMP.terms_gcdc                 C  s   t ‚dS )ú)Make all coefficients in ``f`` positive. Nr±   r�   r}   r}   r‰   ÚabsÔ  s    zDMP.absc                 C  s   t ‚dS )ú"Negate all coefficients in ``f``. Nr±   r�   r}   r}   r‰   ÚnegØ  s    zDMP.negc                 C  s   |   | j |¡¡S ©z.Add an element of the ground domain to ``f``. )Ú_add_groundr‡   r°   ©r‘   r—   r}   r}   r‰   Ú
add_groundÜ  s    zDMP.add_groundc                 C  s   |   | j |¡¡S ©z5Subtract an element of the ground domain from ``f``. )Ú_sub_groundr‡   r°   r  r}   r}   r‰   Ú
sub_groundà  s    zDMP.sub_groundc                 C  s   |   | j |¡¡S ©z5Multiply ``f`` by a an element of the ground domain. )Ú_mul_groundr‡   r°   r  r}   r}   r‰   Ú
mul_groundä  s    zDMP.mul_groundc                 C  s   |   | j |¡¡S ©z8Quotient of ``f`` by a an element of the ground domain. )Ú_quo_groundr‡   r°   r  r}   r}   r‰   Ú
quo_groundè  s    zDMP.quo_groundc                 C  s   |   | j |¡¡S ©z>Exact quotient of ``f`` by a an element of the ground domain. )Ú_exquo_groundr‡   r°   r  r}   r}   r‰   Úexquo_groundì  s    zDMP.exquo_groundc                 C  s   |   |¡\}}| |¡S ©z2Add two multivariate polynomials ``f`` and ``g``. )rÉ   Ú_add©r‘   rÈ   r  ÚGr}   r}   r‰   Úaddð  s    zDMP.addc                 C  s   |   |¡\}}| |¡S ©z7Subtract two multivariate polynomials ``f`` and ``g``. )rÉ   Ú_subr.  r}   r}   r‰   Úsubõ  s    zDMP.subc                 C  s   |   |¡\}}| |¡S ©z7Multiply two multivariate polynomials ``f`` and ``g``. )rÉ   Ú_mulr.  r}   r}   r‰   Úmulú  s    zDMP.mulc                 C  s   |   ¡ S ©ú(Square a multivariate polynomial ``f``. )Ú_sqrr�   r}   r}   r‰   Úsqrÿ  s    zDMP.sqrc                 C  s$   t |tƒstdt|ƒ ƒ‚|  |¡S )ú+Raise ``f`` to a non-negative power ``n``. ú``int`` expected, got %s)r€   r    Ú	TypeErrorr‚   Ú_pow©r‘   rç   r}   r}   r‰   Úpow  s    
zDMP.powc                 C  s   |   |¡\}}| |¡S ©ú/Polynomial pseudo-division of ``f`` and ``g``. )rÉ   Ú_pdivr.  r}   r}   r‰   Úpdiv	  s    zDMP.pdivc                 C  s   |   |¡\}}| |¡S ©ú0Polynomial pseudo-remainder of ``f`` and ``g``. )rÉ   Ú_premr.  r}   r}   r‰   Úprem  s    zDMP.premc                 C  s   |   |¡\}}| |¡S ©ú/Polynomial pseudo-quotient of ``f`` and ``g``. )rÉ   Ú_pquor.  r}   r}   r‰   Úpquo  s    zDMP.pquoc                 C  s   |   |¡\}}| |¡S ©ú5Polynomial exact pseudo-quotient of ``f`` and ``g``. )rÉ   Ú_pexquor.  r}   r}   r‰   Úpexquo  s    z
DMP.pexquoc                 C  s   |   |¡\}}| |¡S ©ú7Polynomial division with remainder of ``f`` and ``g``. )rÉ   Ú_divr.  r}   r}   r‰   Údiv  s    zDMP.divc                 C  s   |   |¡\}}| |¡S ©z2Computes polynomial remainder of ``f`` and ``g``. )rÉ   Ú_remr.  r}   r}   r‰   Úrem"  s    zDMP.remc                 C  s   |   |¡\}}| |¡S ©z1Computes polynomial quotient of ``f`` and ``g``. )rÉ   Ú_quor.  r}   r}   r‰   Úquo'  s    zDMP.quoc                 C  s   |   |¡\}}| |¡S ©z7Computes polynomial exact quotient of ``f`` and ``g``. )rÉ   Ú_exquor.  r}   r}   r‰   Úexquo,  s    z	DMP.exquoc                 C  s   t ‚d S r”   r±   r  r}   r}   r‰   r  1  s    zDMP._add_groundc                 C  s   t ‚d S r”   r±   r  r}   r}   r‰   r!  4  s    zDMP._sub_groundc                 C  s   t ‚d S r”   r±   r  r}   r}   r‰   r$  7  s    zDMP._mul_groundc                 C  s   t ‚d S r”   r±   r  r}   r}   r‰   r'  :  s    zDMP._quo_groundc                 C  s   t ‚d S r”   r±   r  r}   r}   r‰   r*  =  s    zDMP._exquo_groundc                 C  s   t ‚d S r”   r±   ©r‘   rÈ   r}   r}   r‰   r-  @  s    zDMP._addc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r2  C  s    zDMP._subc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r5  F  s    zDMP._mulc                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   r9  I  s    zDMP._sqrc                 C  s   t ‚d S r”   r±   r?  r}   r}   r‰   r>  L  s    zDMP._powc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rC  O  s    z	DMP._pdivc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rG  R  s    z	DMP._premc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rK  U  s    z	DMP._pquoc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rO  X  s    zDMP._pexquoc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rS  [  s    zDMP._divc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rV  ^  s    zDMP._remc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rY  a  s    zDMP._quoc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r\  d  s    z
DMP._exquoc                 C  s$   t |tƒstdt|ƒ ƒ‚|  |¡S )ú0Returns the leading degree of ``f`` in ``x_j``. r<  )r€   r    r=  r‚   Ú_degree©r‘   rè   r}   r}   r‰   rú   g  s    
z
DMP.degreec                 C  s   t ‚d S r”   r±   ra  r}   r}   r‰   r`  n  s    zDMP._degreec                 C  s   t ‚dS )ú$Returns a list of degrees of ``f``. Nr±   r�   r}   r}   r‰   Údegree_listq  s    zDMP.degree_listc                 C  s   t ‚dS )ú#Returns the total degree of ``f``. Nr±   r�   r}   r}   r‰   Útotal_degreeu  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t	|ƒ | j
¡S )z&Return homogeneous polynomial of ``f``r   rš   )re  Úlenrï   Úsumr�   Útupler~   r£   rˆ   r    r‡   )	r‘   ÚsÚtdÚresultZ
new_symbolÚtermÚdrø   Úlr}   r}   r‰   Ú
homogenizey  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)ró   r   r¨   rg  )r‘   r¨   ZtdegÚmonomZ_tdegr}   r}   r‰   Úhomogeneous_orderŒ  s    zDMP.homogeneous_orderc                 C  s   t ‚dS )ú*Returns the leading coefficient of ``f``. Nr±   r�   r}   r}   r‰   ÚLCœ  s    zDMP.LCc                 C  s   t ‚dS )ú+Returns the trailing coefficient of ``f``. Nr±   r�   r}   r}   r‰   ÚTC   s    zDMP.TCc                 G  s(   t dd„ |D ƒƒr|  |¡S tdƒ‚dS )ú+Returns the ``n``-th coefficient of ``f``. c                 s  s   | ]}t |tƒV  qd S r”   )r€   r    )r–   rç   r}   r}   r‰   r™   ¦  s     zDMP.nth.<locals>.<genexpr>za sequence of integers expectedN)rœ   Ú_nthr=  ©r‘   ÚNr}   r}   r‰   Únth¤  s    
zDMP.nthc                 C  s   t ‚d S r”   r±   rx  r}   r}   r‰   rw  «  s    zDMP._nthc                 C  s   t ‚dS )úReturns maximum norm of ``f``. Nr±   r�   r}   r}   r‰   Úmax_norm®  s    zDMP.max_normc                 C  s   t ‚dS )úReturns l1 norm of ``f``. Nr±   r�   r}   r}   r‰   Úl1_norm²  s    zDMP.l1_normc                 C  s   t ‚dS )ú!Return squared l2 norm of ``f``. Nr±   r�   r}   r}   r‰   Úl2_norm_squared¶  s    zDMP.l2_norm_squaredc                 C  s   t ‚dS )ú0Clear denominators, but keep the ground domain. Nr±   r�   r}   r}   r‰   Úclear_denomsº  s    zDMP.clear_denomsrš   c                 C  s@   t |tƒstdt|ƒ ƒ‚t |tƒs4tdt|ƒ ƒ‚|  ||¡S )úEComputes the ``m``-th order indefinite integral of ``f`` in ``x_j``. r<  )r€   r    r=  r‚   Ú
_integrate©r‘   ræ   rè   r}   r}   r‰   Ú	integrate¾  s
    

zDMP.integratec                 C  s   t ‚d S r”   r±   r…  r}   r}   r‰   r„  È  s    zDMP._integratec                 C  s@   t |tƒstdt|ƒ ƒ‚t |tƒs4tdt|ƒ ƒ‚|  ||¡S )ú<Computes the ``m``-th order derivative of ``f`` in ``x_j``. r<  )r€   r    r=  r‚   Ú_diffr…  r}   r}   r‰   ÚdiffË  s
    

zDMP.diffc                 C  s   t ‚d S r”   r±   r…  r}   r}   r‰   rˆ  Õ  s    z	DMP._diffc                 C  s`   t |tƒstdt|ƒ ƒ‚n$d|  kr2| jks@n td| ƒ‚| jrR|  ||¡S |  |¡S dS )z5Evaluates ``f`` at the given point ``a`` in ``x_j``. r<  r   zinvalid variable index %sN)r€   r    r=  r‚   rˆ   Ú
ValueErrorÚ	_eval_levÚ_eval©r‘   Úarè   r}   r}   r‰   ÚevalØ  s    
zDMP.evalc                 C  s   t ‚d S r”   r±   ©r‘   rŽ  r}   r}   r‰   rŒ  ä  s    z	DMP._evalc                 C  s   t ‚d S r”   r±   r�  r}   r}   r‰   r‹  ç  s    zDMP._eval_levc                 C  s&   |   |¡\}}|jrtdƒ‚| |¡S )ú2Half extended Euclidean algorithm, if univariate. úunivariate polynomial expected)rÉ   rˆ   rŠ  Ú_half_gcdexr.  r}   r}   r‰   Ú
half_gcdexê  s    zDMP.half_gcdexc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r“  ó  s    zDMP._half_gcdexc                 C  s6   |   |¡\}}|jrtdƒ‚|jjs,tdƒ‚| |¡S )ú-Extended Euclidean algorithm, if univariate. r’  zground domain must be a field)rÉ   rˆ   rŠ  r‡   Úis_Fieldr   Ú_gcdexr.  r}   r}   r‰   Úgcdexö  s    z	DMP.gcdexc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r—    s    z
DMP._gcdexc                 C  s&   |   |¡\}}|jrtdƒ‚| |¡S )ú(Invert ``f`` modulo ``g``, if possible. r’  )rÉ   rˆ   rŠ  Ú_invertr.  r}   r}   r‰   Úinvert  s    z
DMP.invertc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rš    s    zDMP._invertc                 C  s   | j rtdƒ‚|  |¡S )ú"Compute ``f**(-1)`` mod ``x**n``. r’  )rˆ   rŠ  Ú_revertr?  r}   r}   r‰   Úrevert  s    z
DMP.revertc                 C  s   t ‚d S r”   r±   r?  r}   r}   r‰   r�    s    zDMP._revertc                 C  s   |   |¡\}}| |¡S ©ú7Computes subresultant PRS sequence of ``f`` and ``g``. )rÉ   Ú_subresultantsr.  r}   r}   r‰   Úsubresultants  s    zDMP.subresultantsc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r¡     s    zDMP._subresultantsc                 C  s*   |   |¡\}}|r| |¡S | |¡S dS )ú/Computes resultant of ``f`` and ``g`` via PRS. N)rÉ   Ú_resultant_includePRSÚ
_resultant)r‘   rÈ   Ú
includePRSr  r/  r}   r}   r‰   Ú	resultant#  s    
zDMP.resultantc                 C  s   t ‚d S r”   r±   )r‘   rÈ   r¦  r}   r}   r‰   r¥  +  s    zDMP._resultantc                 C  s   t ‚dS )ú Computes discriminant of ``f``. Nr±   r�   r}   r}   r‰   Údiscriminant.  s    zDMP.discriminantc                 C  s   |   |¡\}}| |¡S ©z4Returns GCD of ``f`` and ``g`` and their cofactors. )rÉ   Ú
_cofactorsr.  r}   r}   r‰   Ú	cofactors2  s    zDMP.cofactorsc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r«  7  s    zDMP._cofactorsc                 C  s   |   |¡\}}| |¡S ©z+Returns polynomial GCD of ``f`` and ``g``. )rÉ   Ú_gcdr.  r}   r}   r‰   Úgcd:  s    zDMP.gcdc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r®  ?  s    zDMP._gcdc                 C  s   |   |¡\}}| |¡S ©ú+Returns polynomial LCM of ``f`` and ``g``. )rÉ   Ú_lcmr.  r}   r}   r‰   ÚlcmB  s    zDMP.lcmc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r²  G  s    zDMP._lcmTc                 C  s*   |   |¡\}}|r| |¡S | |¡S dS )ú6Cancel common factors in a rational function ``f/g``. N)rÉ   Ú_cancel_includeÚ_cancel)r‘   rÈ   Úincluder  r/  r}   r}   r‰   ÚcancelJ  s    
z
DMP.cancelc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r¶  S  s    zDMP._cancelc                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rµ  V  s    zDMP._cancel_includec                 C  s   |   | j |¡¡S ©z&Reduce ``f`` modulo a constant ``p``. )Ú_truncr‡   r°   ©r‘   Úpr}   r}   r‰   ÚtruncY  s    z	DMP.truncc                 C  s   t ‚d S r”   r±   r»  r}   r}   r‰   rº  ]  s    z
DMP._truncc                 C  s   t ‚dS )ú'Divides all coefficients by ``LC(f)``. Nr±   r�   r}   r}   r‰   Úmonic`  s    z	DMP.monicc                 C  s   t ‚dS )ú(Returns GCD of polynomial coefficients. Nr±   r�   r}   r}   r‰   Úcontentd  s    zDMP.contentc                 C  s   t ‚dS )ú/Returns content and a primitive form of ``f``. Nr±   r�   r}   r}   r‰   Ú	primitiveh  s    zDMP.primitivec                 C  s   |   |¡\}}| |¡S ©z4Computes functional composition of ``f`` and ``g``. )rÉ   Ú_composer.  r}   r}   r‰   Úcomposel  s    zDMP.composec                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   rÅ  q  s    zDMP._composec                 C  s   | j rtdƒ‚|  ¡ S )ú,Computes functional decomposition of ``f``. r’  )rˆ   rŠ  Ú
_decomposer�   r}   r}   r‰   Ú	decomposet  s    zDMP.decomposec                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   rÈ  {  s    zDMP._decomposec                 C  s    | j rtdƒ‚|  | j |¡¡S )ú/Efficiently compute Taylor shift ``f(x + a)``. r’  )rˆ   rŠ  Ú_shiftr‡   r°   r�  r}   r}   r‰   Úshift~  s    z	DMP.shiftc                   s   ‡ fdd„|D ƒ}ˆ   |¡S )ú/Efficiently compute Taylor shift ``f(X + A)``. c                   s   g | ]}ˆ j  |¡‘qS r}   )r‡   r°   )r–   Zair�   r}   r‰   rë   ‡  s     z"DMP.shift_list.<locals>.<listcomp>)Ú_shift_listr�  r}   r�   r‰   Ú
shift_list…  s    zDMP.shift_listc                 C  s   t ‚d S r”   r±   r�  r}   r}   r‰   rË  Š  s    z
DMP._shiftc                 C  sD   | j rtdƒ‚| |¡\}}|  |¡\}}| |¡\}}| ||¡S )ú5Evaluate functional transformation ``q**n * f(p/q)``.r’  )rˆ   rŠ  rÉ   Ú
_transform)r‘   r¼  Úqr  ÚQr  r}   r}   r‰   Ú	transform�  s    zDMP.transformc                 C  s   t ‚d S r”   r±   ©r‘   r¼  rÒ  r}   r}   r‰   rÑ  ˜  s    zDMP._transformc                 C  s   | j rtdƒ‚|  ¡ S )ú&Computes the Sturm sequence of ``f``. r’  )rˆ   rŠ  Ú_sturmr�   r}   r}   r‰   Ústurm›  s    z	DMP.sturmc                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   r×  ¢  s    z
DMP._sturmc                 C  s   | j rtdƒ‚|  ¡ S )ú7Computes the Cauchy upper bound on the roots of ``f``. r’  )rˆ   rŠ  Ú_cauchy_upper_boundr�   r}   r}   r‰   Úcauchy_upper_bound¥  s    zDMP.cauchy_upper_boundc                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   rÚ  ¬  s    zDMP._cauchy_upper_boundc                 C  s   | j rtdƒ‚|  ¡ S )ú?Computes the Cauchy lower bound on the nonzero roots of ``f``. r’  )rˆ   rŠ  Ú_cauchy_lower_boundr�   r}   r}   r‰   Úcauchy_lower_bound¯  s    zDMP.cauchy_lower_boundc                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   rÝ  ¶  s    zDMP._cauchy_lower_boundc                 C  s   | j rtdƒ‚|  ¡ S )úBComputes the squared Mignotte bound on root separations of ``f``. r’  )rˆ   rŠ  Ú_mignotte_sep_bound_squaredr�   r}   r}   r‰   Úmignotte_sep_bound_squared¹  s    zDMP.mignotte_sep_bound_squaredc                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   rà  À  s    zDMP._mignotte_sep_bound_squaredc                 C  s   | j rtdƒ‚|  ¡ S )ú4Computes greatest factorial factorization of ``f``. r’  )rˆ   rŠ  Ú	_gff_listr�   r}   r}   r‰   Úgff_listÃ  s    zDMP.gff_listc                 C  s   t ‚d S r”   r±   r�   r}   r}   r‰   rã  Ê  s    zDMP._gff_listc                 C  s   t ‚dS ©úComputes ``Norm(f)``.Nr±   r�   r}   r}   r‰   ÚnormÍ  s    zDMP.normc                 C  s   t ‚dS ©ú$Computes square-free norm of ``f``. Nr±   r�   r}   r}   r‰   Úsqf_normÑ  s    zDMP.sqf_normc                 C  s   t ‚dS )ú$Computes square-free part of ``f``. Nr±   r�   r}   r}   r‰   Úsqf_partÕ  s    zDMP.sqf_partc                 C  s   t ‚dS ©ú0Returns a list of square-free factors of ``f``. Nr±   ©r‘   rœ   r}   r}   r‰   Úsqf_listÙ  s    zDMP.sqf_listc                 C  s   t ‚dS rí  r±   rï  r}   r}   r‰   Úsqf_list_includeÝ  s    zDMP.sqf_list_includec                 C  s   t ‚dS ©ú0Returns a list of irreducible factors of ``f``. Nr±   r�   r}   r}   r‰   Úfactor_listá  s    zDMP.factor_listc                 C  s   t ‚dS rò  r±   r�   r}   r}   r‰   Úfactor_list_includeå  s    zDMP.factor_list_includec                 C  sr   | j rtdƒ‚|r(|r(| j||||d�S |rB|sB| j||||d�S |s\|r\| j||||d�S | j||||d�S dS )z0Compute isolating intervals for roots of ``f``. z1Cannot isolate roots of a multivariate polynomial©ÚepsÚinfÚsupÚfastN)rˆ   rz   Ú_isolate_all_roots_sqfÚ_isolate_all_rootsÚ_isolate_real_roots_sqfÚ_isolate_real_roots)r‘   rœ   r÷  rø  rù  rú  Zsqfr}   r}   r‰   Ú	intervalsé  s    zDMP.intervalsc                 C  s   t ‚d S r”   r±   ©r‘   r÷  rø  rù  rú  r}   r}   r‰   rü  ÷  s    zDMP._isolate_all_rootsc                 C  s   t ‚d S r”   r±   r   r}   r}   r‰   rû  ú  s    zDMP._isolate_all_roots_sqfc                 C  s   t ‚d S r”   r±   r   r}   r}   r‰   rþ  ý  s    zDMP._isolate_real_rootsc                 C  s   t ‚d S r”   r±   r   r}   r}   r‰   rý     s    zDMP._isolate_real_roots_sqfc                 C  s"   | j rtdƒ‚| j|||||d�S )zu
        Refine an isolating interval to the given precision.

        ``eps`` should be a rational number.

        z1Cannot refine a root of a multivariate polynomial©r÷  Ústepsrú  )rˆ   rz   Ú_refine_real_root©r‘   ri  Útr÷  r  rú  r}   r}   r‰   Úrefine_root  s
    ÿzDMP.refine_rootc                 C  s   t ‚d S r”   r±   r  r}   r}   r‰   r    s    zDMP._refine_real_rootc                 C  s   t ‚dS )ú<Return the number of real roots of ``f`` in ``[inf, sup]``. Nr±   ©r‘   rø  rù  r}   r}   r‰   Úcount_real_roots  s    zDMP.count_real_rootsc                 C  s   t ‚dS )ú?Return the number of complex roots of ``f`` in ``[inf, sup]``. Nr±   r  r}   r}   r‰   Úcount_complex_roots  s    zDMP.count_complex_rootsc                 C  s   t ‚dS )ú0Returns ``True`` if ``f`` is a zero polynomial. Nr±   r�   r}   r}   r‰   ró     s    zDMP.is_zeroc                 C  s   t ‚dS )ú0Returns ``True`` if ``f`` is a unit polynomial. Nr±   r�   r}   r}   r‰   Úis_one   s    z
DMP.is_onec                 C  s   t ‚dS ©ú>Returns ``True`` if ``f`` is an element of the ground domain. Nr±   r�   r}   r}   r‰   Ú	is_ground%  s    zDMP.is_groundc                 C  s   t ‚dS )ú7Returns ``True`` if ``f`` is a square-free polynomial. Nr±   r�   r}   r}   r‰   Úis_sqf*  s    z
DMP.is_sqfc                 C  s   t ‚dS )ú=Returns ``True`` if the leading coefficient of ``f`` is one. Nr±   r�   r}   r}   r‰   Úis_monic/  s    zDMP.is_monicc                 C  s   t ‚dS )úAReturns ``True`` if the GCD of the coefficients of ``f`` is one. Nr±   r�   r}   r}   r‰   Úis_primitive4  s    zDMP.is_primitivec                 C  s   t ‚dS )ú:Returns ``True`` if ``f`` is linear in all its variables. Nr±   r�   r}   r}   r‰   Ú	is_linear9  s    zDMP.is_linearc                 C  s   t ‚dS )ú=Returns ``True`` if ``f`` is quadratic in all its variables. Nr±   r�   r}   r}   r‰   Úis_quadratic>  s    zDMP.is_quadraticc                 C  s   t ‚dS )ú8Returns ``True`` if ``f`` is zero or has only one term. Nr±   r�   r}   r}   r‰   Úis_monomialC  s    zDMP.is_monomialc                 C  s   t ‚dS ©ú7Returns ``True`` if ``f`` is a homogeneous polynomial. Nr±   r�   r}   r}   r‰   Úis_homogeneousH  s    zDMP.is_homogeneousc                 C  s   t ‚dS )ú:Returns ``True`` if ``f`` has no factors over its domain. Nr±   r�   r}   r}   r‰   Úis_irreducibleM  s    zDMP.is_irreduciblec                 C  s   t ‚dS ©ú6Returns ``True`` if ``f`` is a cyclotomic polynomial. Nr±   r�   r}   r}   r‰   Úis_cyclotomicR  s    zDMP.is_cyclotomicc                 C  s   |   ¡ S r”   )r  r�   r}   r}   r‰   Ú__abs__W  s    zDMP.__abs__c                 C  s   |   ¡ S r”   ©r  r�   r}   r}   r‰   Ú__neg__Z  s    zDMP.__neg__c                 C  s>   t |tƒr|  |¡S z|  |¡W S  tk
r8   t Y S X d S r”   )r€   r~   r0  r  r   ÚNotImplementedr^  r}   r}   r‰   Ú__add__]  s    

zDMP.__add__c                 C  s
   |   |¡S r”   ©r*  r^  r}   r}   r‰   Ú__radd__f  s    zDMP.__radd__c                 C  s>   t |tƒr|  |¡S z|  |¡W S  tk
r8   t Y S X d S r”   )r€   r~   r3  r"  r   r)  r^  r}   r}   r‰   Ú__sub__i  s    

zDMP.__sub__c                 C  s   |    |¡S r”   r+  r^  r}   r}   r‰   Ú__rsub__r  s    zDMP.__rsub__c                 C  s>   t |tƒr|  |¡S z|  |¡W S  tk
r8   t Y S X d S r”   )r€   r~   r6  r%  r   r)  r^  r}   r}   r‰   Ú__mul__u  s    

zDMP.__mul__c                 C  s
   |   |¡S r”   ©r/  r^  r}   r}   r‰   Ú__rmul__~  s    zDMP.__rmul__c                 C  s>   t |tƒr|  |¡S z|  |¡W S  tk
r8   t Y S X d S r”   )r€   r~   r]  r%  r   r)  r^  r}   r}   r‰   Ú__truediv__�  s    

zDMP.__truediv__c                 C  sH   t |tƒr| | ¡S z|  ¡  |¡ | ¡W S  tk
rB   t Y S X d S 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‰   Ú__pow__“  s    zDMP.__pow__c                 C  s
   |   |¡S r”   ©rT  r^  r}   r}   r‰   Ú
__divmod__–  s    zDMP.__divmod__c                 C  s
   |   |¡S r”   ©rW  r^  r}   r}   r‰   Ú__mod__™  s    zDMP.__mod__c                 C  s>   t |tƒr|  |¡S z|  |¡W S  tk
r8   t Y S X d S r”   )r€   r~   rZ  r(  r=  r)  r^  r}   r}   r‰   Ú__floordiv__œ  s    

zDMP.__floordiv__c                 C  sR   | |krdS t |tƒstS z|  |¡\}}W n tk
rB   Y dS X | |¡S d S )NTF)r€   r~   r)  rÉ   ry   Ú
_strict_eqr.  r}   r}   r‰   Ú__eq__¥  s    
z
DMP.__eq__c                 C  s   t ‚d S r”   r±   r^  r}   r}   r‰   r;  ±  s    zDMP._strict_eqc                 C  s   |s| |kS |   |¡S d S r”   )r;  ©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  s   |   |¡\}}| ¡ | ¡ k S r”   ©rÉ   r�   r.  r}   r}   r‰   Ú__lt__½  s    z
DMP.__lt__c                 C  s   |   |¡\}}| ¡ | ¡ kS r”   rA  r.  r}   r}   r‰   Ú__le__Á  s    z
DMP.__le__c                 C  s   |   |¡\}}| ¡ | ¡ kS r”   rA  r.  r}   r}   r‰   Ú__gt__Å  s    z
DMP.__gt__c                 C  s   |   |¡\}}| ¡ | ¡ kS r”   rA  r.  r}   r}   r‰   Ú__ge__É  s    z
DMP.__ge__c                 C  s   | j  S r”   )ró   r�   r}   r}   r‰   Ú__bool__Í  s    zDMP.__bool__)N)F)F)r   )N)N)N)N)F)F)r   )rš   r   )rš   r   )r   )F)F)T)F)F)FNNNFF)NNF)NN)NN)F)F)Òr¸   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rŠ   Úclassmethodrƒ   Úpropertyr†   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  r3  r6  r:  r@  rD  rH  rL  rP  rT  rW  rZ  r]  r  r!  r$  r'  r*  r-  r2  r5  r9  r>  rC  rG  rK  rO  rS  rV  rY  r\  rú   r`  rc  re  ro  rq  rs  ru  rz  rw  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,  r-  r.  r/  r1  r2  r3  r5  r7  r9  r:  r<  r;  r?  r@  rB  rC  rD  rE  rF  r}   r}   r}   r‰   r~   Š   sÄ  	








	


		
							r~   c                   @  s´  e Zd ZdZ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dd„ Zdd„ Zdd„ ZdÝdd„Zdd„ Zd d!„ ZdÞd#d$„Zdßd%d&„Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,dSdT„ Z-dàdVdW„Z.dXdY„ Z/dZd[„ Z0d\d]„ Z1d^d_„ Z2d`da„ Z3dbdc„ Z4ddde„ Z5dfdg„ Z6dhdi„ Z7dádkdl„Z8dâdmdn„Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=dwdx„ Z>dydz„ Z?d{d|„ Z@d}d~„ ZAdd€„ ZBd�d‚„ ZCdƒd„„ ZDd…d†„ ZEd‡dˆ„ ZFd‰dŠ„ ZGd‹dŒ„ ZHd�dŽ„ ZId�d�„ ZJd‘d’„ ZKd“d”„ ZLd•d–„ ZMd—d˜„ ZNd™dš„ ZOd›dœ„ ZPd�dž„ ZQdŸd „ ZRd¡d¢„ ZSd£d¤„ ZTd¥d¦„ ZUd§d¨„ ZVd©dª„ ZWd«d¬„ ZXd­d®„ ZYdãd¯d°„ZZdäd±d²„Z[d³d´„ Z\dµd¶„ Z]d·d¸„ Z^d¹dº„ Z_d»d¼„ Z`d½d¾„ Zad¿dÀ„ ZbdådÁdÂ„ZcdædÃdÄ„ZdeedÅdÆ„ ƒZfeedÇdÈ„ ƒZgeedÉdÊ„ ƒZheedËdÌ„ ƒZieedÍdÎ„ ƒZjeedÏdÐ„ ƒZkeedÑdÒ„ ƒZleedÓdÔ„ ƒZmeedÕdÖ„ ƒZneed×dØ„ ƒZoeedÙdÚ„ ƒZpeedÛdÜ„ ƒZqdS )çrŽ   r   )r’   r‡   rˆ   c                 C  s    t  | ¡}||_||_||_|S r”   )ÚobjectrŠ   r’   rˆ   r‡   )r…   r†   r‡   rˆ   Úobjr}   r}   r‰   r�   Ö  s
    
zDMP_Python._newc                 C  s8   t | ƒt |ƒkrdS | j|jko6| j|jko6| j|jkS ©NF)r‚   rˆ   r‡   r’   r^  r}   r}   r‰   r;  Þ  s    zDMP_Python._strict_eqc                 C  s   |   || j| j¡S )ú.Create a DMP out of the given representation. )r�   r‡   rˆ   ©r‘   r†   r}   r}   r‰   Úperã  s    zDMP_Python.perc                 C  s   |   t|| jƒ| j| j¡S ©rÀ   )r�   r   rˆ   r‡   rÁ   r}   r}   r‰   rÃ   ç  s    zDMP_Python.ground_newc                 C  s   |   | j| j¡S r”   )rµ   rˆ   r‡   r�   r}   r}   r‰   r¶   ë  s    zDMP_Python._onec                   s¦   t |tƒrˆj|jkr&tdˆ|f ƒ‚ˆj|jkrJˆjˆjˆjˆj|jfS ˆjˆj |j¡ ‰‰ tˆjˆˆjˆ ƒ}t|jˆ|jˆ ƒ}‡ ‡‡fdd„}ˆˆ |||fS dS )z7Unify representations of two multivariate polynomials. rÅ   c                   s   ˆ  | ˆ ˆ¡S r”   )r�   ©r†   ©r‡   r‘   rˆ   r}   r‰   rR  ý  s    zDMP_Python.unify.<locals>.perN)	r€   r~   rˆ   ry   r‡   rR  r’   rÆ   r   ©r‘   rÈ   r  r/  rR  r}   rU  r‰   rÆ   î  s    zDMP_Python.unifyc                 C  s   t  | j| j| j¡S )z)Convert ``f`` to a Flint representation. )rŒ   r�   r’   r‡   rˆ   r�   r}   r}   r‰   r­     s    zDMP_Python.to_DUP_Flintc                 C  s
   t | jƒS ©rÛ   )r�   r’   r�   r}   r}   r‰   r�     s    zDMP_Python.to_listc                 C  s   t | j| jƒS ©zBConvert ``f`` to a tuple representation with native coefficients. )r0   r’   rˆ   r�   r}   r}   r‰   r»   
  s    zDMP_Python.to_tuplec                 C  s    |   t| j| j| j|ƒ|| j¡S )ú$Convert the ground domain of ``f``. )r�   r   r’   rˆ   r‡   r¯   r}   r}   r‰   r«     s    zDMP_Python._convertc                 C  s$   t | j||| jƒ}|  || j| j¡S ©râ   )r-   r’   r‡   r�   rˆ   )r‘   ræ   rç   r†   r}   r}   r‰   rã     s    zDMP_Python._slicec                 C  s*   t | j|||| j| jƒ}|  || j| j¡S rZ  )r.   r’   rˆ   r‡   r�   )r‘   ræ   rç   rè   r†   r}   r}   r‰   rä     s    zDMP_Python._slice_levNc                 C  s   t | j| j| j|d�S )rñ   rì   )r+   r’   rˆ   r‡   rð   r}   r}   r‰   rô     s    zDMP_Python._termsc                 C  s&   t | j| j| jƒ}|  || jj| j¡S rþ   )rX   r’   rˆ   r‡   r�   ©r‘   r�   r}   r}   r‰   r      s    zDMP_Python._liftc                 C  s$   t | j| j| jƒ\}}||  |¡fS )r  )r'   r’   rˆ   r‡   rR  r  r}   r}   r‰   r  %  s    zDMP_Python.deflateFc                 C  s,   t | j| j| j|d�\}}|  || jj|¡S )r  ©r  )r(   r’   rˆ   r‡   r�   )r‘   r  r  rˆ   r}   r}   r‰   r  *  s    zDMP_Python.injectc                 C  s.   t | j| j||d�}|  ||| jt|jƒ ¡S )r
  r\  )r)   r’   rˆ   r�   rf  Úsymbols)r‘   r‡   r  r  r}   r}   r‰   r  0  s    zDMP_Python.ejectc                 C  s,   t | j| j| jƒ\}}}||  || j|¡fS )ú&Remove useless generators from ``f``. )r,   r’   rˆ   r‡   r�   )r‘   r  r  Úur}   r}   r‰   r  6  s    zDMP_Python._excludec                 C  s   |   t| j|| j| jƒ¡S )ú6Returns a polynomial in `K[x_{P(1)}, ..., x_{P(n)}]`. )rR  r/   r’   rˆ   r‡   r  r}   r}   r‰   r  <  s    zDMP_Python._permutec                 C  s$   t | j| j| jƒ\}}||  |¡fS ©r  )r*   r’   rˆ   r‡   rR  r  r}   r}   r‰   r  @  s    zDMP_Python.terms_gcdc                 C  s   |   t| j|| j| jƒ¡S r  )rR  r1   r’   rˆ   r‡   r  r}   r}   r‰   r  E  s    zDMP_Python._add_groundc                 C  s   |   t| j|| j| jƒ¡S r   )rR  r2   r’   rˆ   r‡   r  r}   r}   r‰   r!  I  s    zDMP_Python._sub_groundc                 C  s   |   t| j|| j| jƒ¡S r#  )rR  r3   r’   rˆ   r‡   r  r}   r}   r‰   r$  M  s    zDMP_Python._mul_groundc                 C  s   |   t| j|| j| jƒ¡S r&  )rR  r4   r’   rˆ   r‡   r  r}   r}   r‰   r'  Q  s    zDMP_Python._quo_groundc                 C  s   |   t| j|| j| jƒ¡S r)  )rR  r5   r’   rˆ   r‡   r  r}   r}   r‰   r*  U  s    zDMP_Python._exquo_groundc                 C  s   |   t| j| j| jƒ¡S ©r  )rR  r6   r’   rˆ   r‡   r�   r}   r}   r‰   r  Y  s    zDMP_Python.absc                 C  s   |   t| j| j| jƒ¡S ©r  )rR  r7   r’   rˆ   r‡   r�   r}   r}   r‰   r  ]  s    zDMP_Python.negc                 C  s   |   t| j|j| j| jƒ¡S r,  )rR  r8   r’   rˆ   r‡   r^  r}   r}   r‰   r-  a  s    zDMP_Python._addc                 C  s   |   t| j|j| j| jƒ¡S r1  )rR  r9   r’   rˆ   r‡   r^  r}   r}   r‰   r2  e  s    zDMP_Python._subc                 C  s   |   t| j|j| j| jƒ¡S r4  )rR  r:   r’   rˆ   r‡   r^  r}   r}   r‰   r5  i  s    zDMP_Python._mulc                 C  s   |   t| j| j| jƒ¡S r7  )rR  r;   r’   rˆ   r‡   r�   r}   r}   r‰   r:  m  s    zDMP_Python.sqrc                 C  s   |   t| j|| j| jƒ¡S ©r;  )rR  r<   r’   rˆ   r‡   r?  r}   r}   r‰   r>  q  s    zDMP_Python._powc                 C  s.   t | j|j| j| jƒ\}}|  |¡|  |¡fS rA  )r=   r’   rˆ   r‡   rR  ©r‘   rÈ   rÒ  r�   r}   r}   r‰   rC  u  s    zDMP_Python._pdivc                 C  s   |   t| j|j| j| jƒ¡S rE  )rR  r>   r’   rˆ   r‡   r^  r}   r}   r‰   rG  z  s    zDMP_Python._premc                 C  s   |   t| j|j| j| jƒ¡S rI  )rR  r?   r’   rˆ   r‡   r^  r}   r}   r‰   rK  ~  s    zDMP_Python._pquoc                 C  s   |   t| j|j| j| jƒ¡S rM  )rR  r@   r’   rˆ   r‡   r^  r}   r}   r‰   rO  ‚  s    zDMP_Python._pexquoc                 C  s.   t | j|j| j| jƒ\}}|  |¡|  |¡fS rQ  )rA   r’   rˆ   r‡   rR  re  r}   r}   r‰   rS  †  s    zDMP_Python._divc                 C  s   |   t| j|j| j| jƒ¡S rU  )rR  rB   r’   rˆ   r‡   r^  r}   r}   r‰   rV  ‹  s    zDMP_Python._remc                 C  s   |   t| j|j| j| jƒ¡S rX  )rR  rC   r’   rˆ   r‡   r^  r}   r}   r‰   rY  �  s    zDMP_Python._quoc                 C  s   |   t| j|j| j| jƒ¡S r[  )rR  rD   r’   rˆ   r‡   r^  r}   r}   r‰   r\  “  s    zDMP_Python._exquor   c                 C  s   t | j|| jƒS )r_  )r   r’   rˆ   ra  r}   r}   r‰   r`  —  s    zDMP_Python._degreec                 C  s   t | j| jƒS ©rb  )r   r’   rˆ   r�   r}   r}   r‰   rc  ›  s    zDMP_Python.degree_listc                 C  s   t dd„ |  ¡ D ƒƒS )rd  c                 s  s   | ]}t |ƒV  qd S r”   ©rg  )r–   ræ   r}   r}   r‰   r™   ¡  s     z*DMP_Python.total_degree.<locals>.<genexpr>)Úmaxr¨   r�   r}   r}   r‰   re  Ÿ  s    zDMP_Python.total_degreec                 C  s   t | j| j| jƒS ©rr  )r   r’   rˆ   r‡   r�   r}   r}   r‰   rs  £  s    zDMP_Python.LCc                 C  s   t | j| j| jƒS ©rt  )r   r’   rˆ   r‡   r�   r}   r}   r‰   ru  §  s    zDMP_Python.TCc                 C  s   t | j|| j| jƒS ©rv  )r   r’   rˆ   r‡   rx  r}   r}   r‰   rw  «  s    zDMP_Python._nthc                 C  s   t | j| j| jƒS ©r{  )rG   r’   rˆ   r‡   r�   r}   r}   r‰   r|  ¯  s    zDMP_Python.max_normc                 C  s   t | j| j| jƒS ©r}  )rH   r’   rˆ   r‡   r�   r}   r}   r‰   r~  ³  s    zDMP_Python.l1_normc                 C  s   t | j| j| jƒS ©r  )rI   r’   rˆ   r‡   r�   r}   r}   r‰   r€  ·  s    zDMP_Python.l2_norm_squaredc                 C  s$   t | j| j| jƒ\}}||  |¡fS ©r�  )rJ   r’   rˆ   r‡   rR  )r‘   rÂ   r  r}   r}   r‰   r‚  »  s    zDMP_Python.clear_denomsrš   c                 C  s   |   t| j||| j| jƒ¡S )rƒ  )rR  rK   r’   rˆ   r‡   r…  r}   r}   r‰   r„  À  s    zDMP_Python._integratec                 C  s   |   t| j||| j| jƒ¡S )r‡  )rR  rL   r’   rˆ   r‡   r…  r}   r}   r‰   rˆ  Ä  s    zDMP_Python._diffc                 C  s   t | j| j |¡d| j| jƒS r‹   )rM   r’   r‡   r°   rˆ   r�  r}   r}   r‰   rŒ  È  s    zDMP_Python._evalc                 C  s4   t | j| j |¡|| j| jƒ}|  || j| jd ¡S ©Nrš   )rM   r’   r‡   r°   rˆ   rƒ   )r‘   rŽ  rè   r†   r}   r}   r‰   r‹  Ë  s    zDMP_Python._eval_levc                 C  s*   t | j|j| jƒ\}}|  |¡|  |¡fS )r‘  )rY   r’   r‡   rR  ©r‘   rÈ   ri  Úhr}   r}   r‰   r“  Ï  s    zDMP_Python._half_gcdexc                 C  s4   t | j|j| jƒ\}}}|  |¡|  |¡|  |¡fS )r•  )rZ   r’   r‡   rR  )r‘   rÈ   ri  r  rr  r}   r}   r‰   r—  Ô  s    zDMP_Python._gcdexc                 C  s   t | j|j| jƒ}|  |¡S )r™  )r[   r’   r‡   rR  )r‘   rÈ   ri  r}   r}   r‰   rš  Ù  s    zDMP_Python._invertc                 C  s   |   t| j|| jƒ¡S ©rœ  )rR  rN   r’   r‡   r?  r}   r}   r‰   r�  Þ  s    zDMP_Python._revertc                 C  s&   t | j|j| j| jƒ}tt| j|ƒƒS rŸ  )r\   r’   rˆ   r‡   r�   ÚmaprR  ©r‘   rÈ   ÚRr}   r}   r‰   r¡  â  s    zDMP_Python._subresultantsc                 C  sN   t | j|j| j| jdd�\}}| jr:|  || j| jd ¡}|tt| j|ƒƒfS )r£  T)r¦  rš   )r]   r’   rˆ   r‡   rƒ   r�   rt  rR  ©r‘   rÈ   Úresrv  r}   r}   r‰   r¤  ç  s    z DMP_Python._resultant_includePRSc                 C  s6   t | j|j| j| jƒ}| jr2|  || j| jd ¡}|S rp  )r]   r’   rˆ   r‡   rƒ   )r‘   rÈ   rx  r}   r}   r‰   r¥  î  s    zDMP_Python._resultantc                 C  s2   t | j| j| jƒ}| jr.|  || j| jd ¡}|S )r¨  rš   )r^   r’   rˆ   r‡   rƒ   )r‘   rx  r}   r}   r‰   r©  ô  s    zDMP_Python.discriminantc                 C  s8   t | j|j| j| jƒ\}}}|  |¡|  |¡|  |¡fS rª  )r_   r’   rˆ   r‡   rR  )r‘   rÈ   rr  ZcffÚcfgr}   r}   r‰   r«  û  s    zDMP_Python._cofactorsc                 C  s   |   t| j|j| j| jƒ¡S r­  )rR  r`   r’   rˆ   r‡   r^  r}   r}   r‰   r®     s    zDMP_Python._gcdc                 C  s   |   t| j|j| j| jƒ¡S r°  )rR  ra   r’   rˆ   r‡   r^  r}   r}   r‰   r²    s    zDMP_Python._lcmc                 C  s:   t | j|j| j| jdd�\}}}}|||  |¡|  |¡fS )r´  F©r·  ©rb   r’   rˆ   r‡   rR  ©r‘   rÈ   ÚcFÚcGr  r/  r}   r}   r‰   r¶    s    "zDMP_Python._cancelc                 C  s2   t | j|j| j| jdd�\}}|  |¡|  |¡fS )r´  Trz  r{  r.  r}   r}   r‰   rµ    s    zDMP_Python._cancel_includec                 C  s   |   t| j|| j| jƒ¡S r¹  )rR  rO   r’   rˆ   r‡   r»  r}   r}   r‰   rº    s    zDMP_Python._truncc                 C  s   |   t| j| j| jƒ¡S ©r¾  )rR  rR   r’   rˆ   r‡   r�   r}   r}   r‰   r¿    s    zDMP_Python.monicc                 C  s   t | j| j| jƒS ©rÀ  )rP   r’   rˆ   r‡   r�   r}   r}   r‰   rÁ    s    zDMP_Python.contentc                 C  s$   t | j| j| jƒ\}}||  |¡fS ©rÂ  )rQ   r’   rˆ   r‡   rR  )r‘   Úcontr  r}   r}   r‰   rÃ    s    zDMP_Python.primitivec                 C  s   |   t| j|j| j| jƒ¡S rÄ  )rR  rS   r’   rˆ   r‡   r^  r}   r}   r‰   rÅ  #  s    zDMP_Python._composec                 C  s   t t| jt| j| jƒƒƒS )rÇ  )r�   rt  rR  rT   r’   r‡   r�   r}   r}   r‰   rÈ  '  s    zDMP_Python._decomposec                 C  s   |   t| j|| jƒ¡S ©rÊ  )rR  rU   r’   r‡   r�  r}   r}   r‰   rË  +  s    zDMP_Python._shiftc                 C  s   |   t| j|| j| jƒ¡S )rÍ  )rR  rV   r’   rˆ   r‡   r�  r}   r}   r‰   rÎ  /  s    zDMP_Python._shift_listc                 C  s   |   t| j|j|j| jƒ¡S ©rÐ  )rR  rW   r’   r‡   rÕ  r}   r}   r‰   rÑ  3  s    zDMP_Python._transformc                 C  s   t t| jt| j| jƒƒƒS )rÖ  )r�   rt  rR  ru   r’   r‡   r�   r}   r}   r‰   r×  7  s    zDMP_Python._sturmc                 C  s   t | j| jƒS ©rÙ  )rv   r’   r‡   r�   r}   r}   r‰   rÚ  ;  s    zDMP_Python._cauchy_upper_boundc                 C  s   t | j| jƒS ©rÜ  )rw   r’   r‡   r�   r}   r}   r‰   rÝ  ?  s    zDMP_Python._cauchy_lower_boundc                 C  s   t | j| jƒS ©rß  )rx   r’   r‡   r�   r}   r}   r‰   rà  C  s    z&DMP_Python._mignotte_sep_bound_squaredc                   s   ‡ fdd„t ˆ jˆ jƒD ƒS )râ  c                   s   g | ]\}}ˆ   |¡|f‘qS r}   ©rR  ©r–   rÈ   rÐ   r�   r}   r‰   rë   I  s     z(DMP_Python._gff_list.<locals>.<listcomp>)rc   r’   r‡   r�   r}   r�   r‰   rã  G  s    zDMP_Python._gff_listc                 C  s&   t | j| j| jƒ}|  || jj| j¡S )ræ  )rd   r’   rˆ   r‡   rƒ   r[  r}   r}   r‰   rç  K  s    zDMP_Python.normc                 C  s8   t | j| j| jƒ\}}}||  |¡|  || jj| j¡fS )ré  )rf   r’   rˆ   r‡   rR  rƒ   )r‘   ri  rÈ   r�   r}   r}   r‰   rê  P  s    zDMP_Python.sqf_normc                 C  s   |   t| j| j| jƒ¡S ©rë  )rR  rg   r’   rˆ   r‡   r�   r}   r}   r‰   rì  U  s    zDMP_Python.sqf_partc                   s.   t ˆ jˆ jˆ j|ƒ\}}|‡ fdd„|D ƒfS )rî  c                   s   g | ]\}}ˆ   |¡|f‘qS r}   rˆ  r‰  r�   r}   r‰   rë   \  s     z'DMP_Python.sqf_list.<locals>.<listcomp>)rh   r’   rˆ   r‡   ©r‘   rœ   rÂ   Úfactorsr}   r�   r‰   rð  Y  s    zDMP_Python.sqf_listc                   s&   t ˆ jˆ jˆ j|ƒ}‡ fdd„|D ƒS )rî  c                   s   g | ]\}}ˆ   |¡|f‘qS r}   rˆ  r‰  r�   r}   r‰   rë   a  s     z/DMP_Python.sqf_list_include.<locals>.<listcomp>)ri   r’   rˆ   r‡   ©r‘   rœ   rŒ  r}   r�   r‰   rñ  ^  s    zDMP_Python.sqf_list_includec                   s,   t ˆ jˆ jˆ jƒ\}}|‡ fdd„|D ƒfS )ró  c                   s   g | ]\}}ˆ   |¡|f‘qS r}   rˆ  r‰  r�   r}   r‰   rë   f  s     z*DMP_Python.factor_list.<locals>.<listcomp>)rl   r’   rˆ   r‡   )r‘   rÂ   rŒ  r}   r�   r‰   rô  c  s    zDMP_Python.factor_listc                   s$   t ˆ jˆ jˆ jƒ}‡ fdd„|D ƒS )ró  c                   s   g | ]\}}ˆ   |¡|f‘qS r}   rˆ  r‰  r�   r}   r‰   rë   k  s     z2DMP_Python.factor_list_include.<locals>.<listcomp>)rm   r’   rˆ   r‡   ©r‘   rŒ  r}   r�   r‰   rõ  h  s    zDMP_Python.factor_list_includec                 C  s   t | j| j||||d�S ©Nrö  )ro   r’   r‡   r   r}   r}   r‰   rþ  m  s    zDMP_Python._isolate_real_rootsc                 C  s   t | j| j||||d�S r�  )rn   r’   r‡   r   r}   r}   r‰   rý  p  s    z"DMP_Python._isolate_real_roots_sqfc                 C  s   t | j| j||||d�S r�  )rq   r’   r‡   r   r}   r}   r‰   rü  s  s    zDMP_Python._isolate_all_rootsc                 C  s   t | j| j||||d�S r�  )rp   r’   r‡   r   r}   r}   r‰   rû  v  s    z!DMP_Python._isolate_all_roots_sqfc              	   C  s   t | j||| j|||d�S )Nr  )rr   r’   r‡   r  r}   r}   r‰   r  y  s    zDMP_Python._refine_real_rootc                 C  s   t | j| j||d�S ©r  ©rø  rù  )rs   r’   r‡   r  r}   r}   r‰   r	  |  s    zDMP_Python.count_real_rootsc                 C  s   t | j| j||d�S ©r
  r‘  )rt   r’   r‡   r  r}   r}   r‰   r  €  s    zDMP_Python.count_complex_rootsc                 C  s   t | j| jƒS ©r  )r!   r’   rˆ   r�   r}   r}   r‰   ró   „  s    zDMP_Python.is_zeroc                 C  s   t | j| j| jƒS ©r  )r"   r’   rˆ   r‡   r�   r}   r}   r‰   r  ‰  s    zDMP_Python.is_onec                 C  s   t | jd| jƒS r  )r#   r’   rˆ   r�   r}   r}   r‰   r  Ž  s    zDMP_Python.is_groundc                 C  s   t | j| j| jƒS ©r  )re   r’   rˆ   r‡   r�   r}   r}   r‰   r  “  s    zDMP_Python.is_sqfc                 C  s   | j  t| j| j| j ƒ¡S ©r  )r‡   r  r   r’   rˆ   r�   r}   r}   r‰   r  ˜  s    zDMP_Python.is_monicc                 C  s   | j  t| j| j| j ƒ¡S ©r  )r‡   r  rP   r’   rˆ   r�   r}   r}   r‰   r  �  s    zDMP_Python.is_primitivec                 C  s$   t dd„ t| j| j| jƒ ¡ D ƒƒS )r  c                 s  s   | ]}t |ƒd kV  qdS )rš   Nrg  ©r–   rp  r}   r}   r‰   r™   ¥  s     z'DMP_Python.is_linear.<locals>.<genexpr>©rœ   r&   r’   rˆ   r‡   Úkeysr�   r}   r}   r‰   r  ¢  s    zDMP_Python.is_linearc                 C  s$   t dd„ t| j| j| jƒ ¡ D ƒƒS )r  c                 s  s   | ]}t |ƒd kV  qdS )é   Nrg  r˜  r}   r}   r‰   r™   ª  s     z*DMP_Python.is_quadratic.<locals>.<genexpr>r™  r�   r}   r}   r‰   r  §  s    zDMP_Python.is_quadraticc                 C  s   t |  ¡ ƒdkS )r  rš   )rf  rÌ   r�   r}   r}   r‰   r  ¬  s    zDMP_Python.is_monomialc                 C  s   |   ¡ dk	S r  )rq  r�   r}   r}   r‰   r   ±  s    zDMP_Python.is_homogeneousc                 C  s   t | j| j| jƒS ©r!  )rk   r’   rˆ   r‡   r�   r}   r}   r‰   r"  ¶  s    zDMP_Python.is_irreduciblec                 C  s   | j st| j| jƒS dS dS )r$  FN)rˆ   rj   r’   r‡   r�   r}   r}   r‰   r%  »  s    zDMP_Python.is_cyclotomic)N)F)F)r   )rš   r   )rš   r   )F)F)NN)NN)rr¸   rG  rH  rI  rJ  rK  r�   r;  rR  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  r5  r:  r>  rC  rG  rK  rO  rS  rV  rY  r\  r`  rc  re  rs  ru  rw  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  rL  ró   r  r  r  r  r  r  r  r  r   r"  r%  r}   r}   r}   r‰   rŽ   Ñ  sô   





















rŽ   c                   @  sÜ  e Zd ZdZdZdZdd„ Zedd„ ƒZdd	„ Z	e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dd„ Zdd„ Zdd„ Zd d!„ Zdãd#d$„Zd%d&„ Zd'd(„ Zdäd*d+„Zdåd,d-„Zd.d/„ Zd0d1„ Z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.dVdW„ Z/dXdY„ Z0dZd[„ Z1dæd\d]„Z2d^d_„ Z3d`da„ Z4dbdc„ Z5ddde„ Z6dfdg„ Z7dhdi„ Z8djdk„ Z9dldm„ Z:dndo„ Z;dçdqdr„Z<dèdsdt„Z=dudv„ Z>dwdx„ Z?dydz„ Z@d{d|„ ZAd}d~„ ZBdd€„ ZCd�d‚„ ZDdƒd„„ ZEd…d†„ ZFd‡dˆ„ ZGd‰dŠ„ ZHd‹dŒ„ ZId�dŽ„ ZJd�d�„ ZKd‘d’„ ZLd“d”„ ZMd•d–„ ZNd—d˜„ ZOd™dš„ ZPd›dœ„ ZQd�dž„ ZRdŸd „ ZSd¡d¢„ ZTd£d¤„ ZUd¥d¦„ ZVd§d¨„ ZWd©dª„ ZXd«d¬„ ZYd­d®„ ZZd¯d°„ Z[d±d²„ Z\déd³d´„Z]dêdµd¶„Z^d·d¸„ Z_d¹dº„ Z`d»d¼„ Zad½d¾„ Zbd¿dÀ„ ZcdÁdÂ„ ZddÃdÄ„ ZedÅdÆ„ ZfdëdÇdÈ„ZgdìdÉdÊ„ZheidËdÌ„ ƒZjeidÍdÎ„ ƒZkeidÏdÐ„ ƒZleidÑdÒ„ ƒZmeidÓdÔ„ ƒZneidÕdÖ„ ƒZoeid×dØ„ ƒZpeidÙdÚ„ ƒZqeidÛdÜ„ ƒZreidÝdÞ„ ƒZseidßdà„ ƒZteidádâ„ ƒZud"S )írŒ   r   r   )r’   r‡   Ú_clsc                 C  s   | j |  ¡ | j| jffS r”   )r·   r�   r‡   rˆ   r½   r}   r}   r‰   Ú
__reduce__Ë  s    zDUP_Flint.__reduce__c                 C  s$   |   |d d d… ||¡}|  ||¡S ©Néÿÿÿÿ)Ú_flint_polyÚfrom_repr„   r}   r}   r‰   r�   Î  s    zDUP_Flint._newc                 C  s   | j  ¡ ddd… S )rÛ   Nr   )r’   r©   r�   r}   r}   r‰   r�   Ó  s    zDUP_Flint.to_listc                 C  s*   |t kst‚|dkst‚|  |¡}||ƒS r‹   )r{   r›   Ú_get_flint_poly_cls)r…   r†   r‡   rˆ   Z	flint_clsr}   r}   r‰   r¡  ×  s    
zDUP_Flint._flint_polyc                 C  s(   |j rtjS |jrtjS td| ƒ‚d S )Nú%Domain %s is not supported with flint)Úis_ZZr|   Ú	fmpz_polyÚis_QQÚ	fmpq_polyr®   )r…   r‡   r}   r}   r‰   r£  Þ  s
    zDUP_Flint._get_flint_poly_clsc                 C  sh   |j rt|tjƒst‚tj}n*|jr<t|tjƒs4t‚tj}ntd| ƒ‚t 	| ¡}||_
||_||_|S )z,Create a DMP from the given representation. r¤  )r¥  r€   r|   r¦  r›   r§  r¨  r®   rM  rŠ   r‡   r’   r�  )r…   r†   r‡   r�  rN  r}   r}   r‰   r¢  ç  s    
zDUP_Flint.from_repc                 C  s,   t | ƒt |ƒkrdS | j|jko*| j|jkS rO  )r‚   r‡   r’   r^  r}   r}   r‰   r;  û  s    zDUP_Flint._strict_eqc                 C  s   |   |  |g¡| j¡S rS  ©r¢  r�  r‡   rÁ   r}   r}   r‰   rÃ      s    zDUP_Flint.ground_newc                 C  s   |   | jj¡S r”   )rÃ   r‡   rµ   r�   r}   r}   r‰   r¶     s    zDUP_Flint._onec                 C  s   t ‚dS )z*Unify representations of two polynomials. N)r®   r^  r}   r}   r‰   rÆ     s    zDUP_Flint.unifyc                 C  s   t  |  ¡ | j| j¡S )z1Convert ``f`` to a Python native representation. )rŽ   r�   r�   r‡   rˆ   r�   r}   r}   r‰   r¬     s    zDUP_Flint.to_DMP_Pythonc                 C  s   t |  ¡ ƒS rX  )rh  r�   r�   r}   r}   r‰   r»     s    zDUP_Flint.to_tuplec                 C  sd   |t kr&| jtkr&|  t | j¡|¡S |tkrJ| jt krJ|  ¡  |¡ 	¡ S t
d| j› d|› �ƒ‚dS )rY  zDUP_Flint: Cannot convert z to N)r   r‡   r
   r¢  r|   r¨  r’   r¬   r«   r­   r®   r¯   r}   r}   r‰   r«     s
    zDUP_Flint._convertc                 C  s&   | j  ¡ ||… }|  |  |¡| j¡S rZ  )r’   r©   r¢  r�  r‡   )r‘   ræ   rç   r©   r}   r}   r‰   rã     s    zDUP_Flint._slicec                 C  s   t ‚dS rá   r±   rå   r}   r}   r‰   rä   "  s    zDUP_Flint._slice_levNc                 C  sL   |dks|j dkr8dd„ t| j ¡ ƒD ƒ}|ddd… S |  ¡ j|d�S dS )rñ   NÚlexc                 S  s   g | ]\}}|r|f|f‘qS r}   r}   )r–   rç   r—   r}   r}   r‰   rë   *  s      z$DUP_Flint._terms.<locals>.<listcomp>r   rì   )Úaliasrû   r’   r©   r¬   rô   )r‘   rí   rï   r}   r}   r‰   rô   '  s    zDUP_Flint._termsc                 C  s   t ‚dS )rÿ   Nr±   r�   r}   r}   r‰   r   5  s    zDUP_Flint._liftc                 C  s0   | j rd| fS | j ¡ \}}|f|  || j¡fS )r  )rš   )ró   r’   Z	deflationr¢  r‡   )r‘   rÈ   rç   r}   r}   r‰   r  :  s    zDUP_Flint.deflateFc                 C  s   t ‚dS r  r±   r  r}   r}   r‰   r  G  s    zDUP_Flint.injectc                 C  s   t ‚dS r	  r±   r  r}   r}   r‰   r  L  s    zDUP_Flint.ejectc                 C  s   t ‚dS )r^  Nr±   r�   r}   r}   r‰   r  Q  s    zDUP_Flint._excludec                 C  s   t ‚dS )r`  Nr±   r  r}   r}   r‰   r  V  s    zDUP_Flint._permutec                 C  s   |   ¡  ¡ \}}|| ¡ fS ra  )r¬   r  r­   r  r}   r}   r‰   r  [  s    zDUP_Flint.terms_gcdc                 C  s   |   | j| | j¡S r  ©r¢  r’   r‡   r  r}   r}   r‰   r  a  s    zDUP_Flint._add_groundc                 C  s   |   | j| | j¡S r   r¬  r  r}   r}   r‰   r!  e  s    zDUP_Flint._sub_groundc                 C  s   |   | j| | j¡S r#  r¬  r  r}   r}   r‰   r$  i  s    zDUP_Flint._mul_groundc                 C  s   |   | j| | j¡S r&  r¬  r  r}   r}   r‰   r'  m  s    zDUP_Flint._quo_groundc                 C  s,   t | j|ƒ\}}|rt| |ƒ‚|  || j¡S r)  )Údivmodr’   r   r¢  r‡   )r‘   r—   rÒ  r�   r}   r}   r‰   r*  q  s    
zDUP_Flint._exquo_groundc                 C  s   |   ¡  ¡  ¡ S rb  )r¬   r  r­   r�   r}   r}   r‰   r  x  s    zDUP_Flint.absc                 C  s   |   | j | j¡S rc  r¬  r�   r}   r}   r‰   r  |  s    zDUP_Flint.negc                 C  s   |   | j|j | j¡S r,  r¬  r^  r}   r}   r‰   r-  €  s    zDUP_Flint._addc                 C  s   |   | j|j | j¡S r1  r¬  r^  r}   r}   r‰   r2  „  s    zDUP_Flint._subc                 C  s   |   | j|j | j¡S r4  r¬  r^  r}   r}   r‰   r5  ˆ  s    zDUP_Flint._mulc                 C  s   |   | jd | j¡S )r8  r›  r¬  r�   r}   r}   r‰   r:  Œ  s    zDUP_Flint.sqrc                 C  s   |   | j| | j¡S rd  r¬  r?  r}   r}   r‰   r>  �  s    zDUP_Flint._powc                 C  sN   |   ¡ |  ¡  d }t| ¡ | | j |jƒ\}}|  || j¡|  || j¡fS )rB  rš   )rú   r­  rs  r’   r¢  r‡   ©r‘   rÈ   rm  rÒ  r�   r}   r}   r‰   rC  ”  s    zDUP_Flint._pdivc                 C  s:   |   ¡ |  ¡  d }| ¡ | | j |j }|  || j¡S )rF  rš   ©rú   rs  r’   r¢  r‡   )r‘   rÈ   rm  rÒ  r}   r}   r‰   rG  š  s    zDUP_Flint._premc                 C  s:   |   ¡ |  ¡  d }| ¡ | | j |j }|  || j¡S )rJ  rš   r¯  )r‘   rÈ   rm  r�   r}   r}   r‰   rK     s    zDUP_Flint._pquoc                 C  sN   |   ¡ |  ¡  d }t| ¡ | | j |jƒ\}}|r@t| |ƒ‚|  || j¡S )rN  rš   )rú   r­  rs  r’   r   r¢  r‡   r®  r}   r}   r‰   rO  ¦  s
    
zDUP_Flint._pexquoc                 C  s`   | j jr6t| j|jƒ\}}|  || j ¡|  || j ¡fS |  ¡  | ¡ ¡\}}| ¡ | ¡ fS dS )rR  N)r‡   r–  r­  r’   r¢  r¬   rS  r­   re  r}   r}   r‰   rS  ®  s
    zDUP_Flint._divc                 C  s   |   | j|j | j¡S rU  r¬  r^  r}   r}   r‰   rV  ¸  s    zDUP_Flint._remc                 C  s   |   | j|j | j¡S rX  r¬  r^  r}   r}   r‰   rY  ¼  s    zDUP_Flint._quoc                 C  s    |   |¡\}}|rt| |ƒ‚|S r[  )rS  r   re  r}   r}   r‰   r\  À  s    
zDUP_Flint._exquoc                 C  s   | j  ¡ }|dkrt}|S )r_  r   )r’   rú   r   )r‘   rè   rm  r}   r}   r‰   r`  Ç  s    
zDUP_Flint._degreec                 C  s
   |   ¡ fS rf  ©r`  r�   r}   r}   r‰   rc  Î  s    zDUP_Flint.degree_listc                 C  s   |   ¡ S )rd  r°  r�   r}   r}   r‰   re  Ò  s    zDUP_Flint.total_degreec                 C  s   | j | j  ¡  S ri  ©r’   rú   r�   r}   r}   r‰   rs  Ö  s    zDUP_Flint.LCc                 C  s
   | j d S )rt  r   ©r’   r�   r}   r}   r‰   ru  Ú  s    zDUP_Flint.TCc                 C  s   |\}| j | S rk  r²  )r‘   ry  rç   r}   r}   r‰   rw  Þ  s    zDUP_Flint._nthc                 C  s   |   ¡  ¡ S rl  )r¬   r|  r�   r}   r}   r‰   r|  ã  s    zDUP_Flint.max_normc                 C  s   |   ¡  ¡ S rm  )r¬   r~  r�   r}   r}   r‰   r~  ç  s    zDUP_Flint.l1_normc                 C  s   |   ¡  ¡ S rn  )r¬   r€  r�   r}   r}   r‰   r€  ë  s    zDUP_Flint.l2_norm_squaredc                 C  s,   | j  ¡ }|  |  | j  ¡ ¡| j¡}||fS ro  )r’   Údenomr¢  r�  Únumerr‡   )r‘   r³  r´  r}   r}   r‰   r‚  ï  s    
zDUP_Flint.clear_denomsrš   c                 C  sX   |dkst ‚| jjr>| j}t|ƒD ]}| ¡ }q"|  || j¡S |  ¡ j||d� 	¡ S dS )rƒ  r   )ræ   rè   N)
r›   r‡   r§  r’   ÚrangeZintegralr¢  r¬   r„  r­   ©r‘   ræ   rè   r†   rø   r}   r}   r‰   r„  õ  s    
zDUP_Flint._integratec                 C  s6   |dkst ‚| j}t|ƒD ]}| ¡ }q|  || j¡S )z1Computes the ``m``-th order derivative of ``f``. r   )r›   r’   rµ  Z
derivativer¢  r‡   r¶  r}   r}   r‰   rˆ     s
    
zDUP_Flint._diffc                 C  s   |   ¡  |¡S r”   )r¬   rŒ  r�  r}   r}   r‰   rŒ    s    zDUP_Flint._evalc                 C  s   t ‚d S r”   r±   r�  r}   r}   r‰   r‹    s    zDUP_Flint._eval_levc                 C  s&   |   ¡  |  ¡ ¡\}}| ¡ | ¡ fS )z#Half extended Euclidean algorithm. )r¬   r“  r­   rq  r}   r}   r‰   r“    s    zDUP_Flint._half_gcdexc                 C  s<   | j  |j ¡\}}}|  || j¡|  || j¡|  || j¡fS )zExtended Euclidean algorithm. )r’   Úxgcdr¢  r‡   )r‘   rÈ   rr  ri  r  r}   r}   r‰   r—    s    zDUP_Flint._gcdexc                 C  sT   | j jr:| j |j¡\}}}|dkr,tdƒ‚|  || j ¡S |  ¡  | ¡ ¡ ¡ S dS )r™  rš   úzero divisorN)	r‡   r§  r’   r·  r   r¢  r¬   rš  r­   )r‘   rÈ   r¯  ZF_invrê   r}   r}   r‰   rš    s    zDUP_Flint._invertc                 C  s   |   ¡  |¡ ¡ S rs  )r¬   r�  r­   r?  r}   r}   r‰   r�  #  s    zDUP_Flint._revertc                 C  s    |   ¡  |  ¡ ¡}dd„ |D ƒS )r   c                 S  s   g | ]}|  ¡ ‘qS r}   ©r­   ©r–   rÈ   r}   r}   r‰   rë   *  s     z,DUP_Flint._subresultants.<locals>.<listcomp>)r¬   r¡  ru  r}   r}   r‰   r¡  '  s    zDUP_Flint._subresultantsc                 C  s(   |   ¡  |  ¡ ¡\}}|dd„ |D ƒfS )r£  c                 S  s   g | ]}|  ¡ ‘qS r}   r¹  rº  r}   r}   r‰   rë   /  s     z3DUP_Flint._resultant_includePRS.<locals>.<listcomp>)r¬   r¤  rw  r}   r}   r‰   r¤  ,  s    zDUP_Flint._resultant_includePRSc                 C  s   |   ¡  |  ¡ ¡S )z'Computes resultant of ``f`` and ``g``. )r¬   r¥  r^  r}   r}   r‰   r¥  1  s    zDUP_Flint._resultantc                 C  s   |   ¡  ¡ S )r¨  )r¬   r©  r�   r}   r}   r‰   r©  5  s    zDUP_Flint.discriminantc                 C  s    |   |¡}||  |¡| |¡fS rª  )r¯  r]  )r‘   rÈ   rr  r}   r}   r‰   r«  9  s    
zDUP_Flint._cofactorsc                 C  s   |   | j |j¡| j¡S r­  )r¢  r’   r¯  r‡   r^  r}   r}   r‰   r®  >  s    zDUP_Flint._gcdc                 C  sV   | r|s|   | jj¡S |  |¡ |  |¡¡}|jjr>| ¡ }n| ¡ dk rR| 	¡ }|S )r±  r   )
rÃ   r‡   r´   r5  r\  r®  r–  r¿  rs  r  )r‘   rÈ   rn  r}   r}   r‰   r²  B  s    
zDUP_Flint._lcmc           
      C  s  | j |j   krttfks"n t‚| j jrD|  ¡ \}}| ¡ \}}n| j j|  }}|j j| }}| |¡}|| ||  }}| |¡}| 	|¡| 	|¡ }}| 
¡ dk }| 
¡ dk }	|rÐ|	rÐ| ¡ | ¡  }}n,|ræ| | ¡  }}n|	� rü| | ¡  }}||||fS )r´  r   )r‡   r
   r   r›   r§  r‚  rµ   r¯  r®  r]  rs  r  )
r‘   rÈ   r~  r  r}  r/  ZcHÚHZf_negZg_negr}   r}   r‰   r¶  Q  s&    "

zDUP_Flint._cancelc                 C  s&   |   |¡\}}}}| |¡| |¡fS )r´  )r¶  r$  r|  r}   r}   r‰   rµ  p  s    zDUP_Flint._cancel_includec                 C  s   |   ¡  |¡ ¡ S r¹  )r¬   rº  r­   r»  r}   r}   r‰   rº  u  s    zDUP_Flint._truncc                 C  s   |   |  ¡ ¡S r  )r*  rs  r�   r}   r}   r‰   r¿  y  s    zDUP_Flint.monicc                 C  s   |   ¡  ¡ S r€  )r¬   rÁ  r�   r}   r}   r‰   rÁ  }  s    zDUP_Flint.contentc                 C  s   |   ¡ }|  |¡}||fS r�  )rÁ  r*  )r‘   r‚  Zprimr}   r}   r‰   rÃ  ‚  s    
zDUP_Flint.primitivec                 C  s   |   |  |j¡| j¡S rÄ  r¬  r^  r}   r}   r‰   rÅ  ˆ  s    zDUP_Flint._composec                 C  s   dd„ |   ¡  ¡ D ƒS )rÇ  c                 S  s   g | ]}|  ¡ ‘qS r}   r¹  rº  r}   r}   r‰   rë   Ž  s     z(DUP_Flint._decompose.<locals>.<listcomp>)r¬   rÈ  r�   r}   r}   r‰   rÈ  Œ  s    zDUP_Flint._decomposec                 C  s&   |   || jjg¡}|  |  |¡| j¡S rƒ  )r�  r‡   rµ   r¢  r’   )r‘   rŽ  Zx_plus_ar}   r}   r‰   rË  �  s    zDUP_Flint._shiftc                 C  s,   |   ¡ |  ¡ |  ¡   }}}| ||¡ ¡ S r„  )r¬   rÔ  r­   )r‘   r¼  rÒ  r  r  rÓ  r}   r}   r‰   rÑ  •  s    zDUP_Flint._transformc                 C  s   dd„ |   ¡  ¡ D ƒS )rÖ  c                 S  s   g | ]}|  ¡ ‘qS r}   r¹  rº  r}   r}   r‰   rë   œ  s     z$DUP_Flint._sturm.<locals>.<listcomp>)r¬   r×  r�   r}   r}   r‰   r×  š  s    zDUP_Flint._sturmc                 C  s   |   ¡  ¡ S r…  )r¬   rÚ  r�   r}   r}   r‰   rÚ  ž  s    zDUP_Flint._cauchy_upper_boundc                 C  s   |   ¡  ¡ S r†  )r¬   rÝ  r�   r}   r}   r‰   rÝ  ¢  s    zDUP_Flint._cauchy_lower_boundc                 C  s   |   ¡  ¡ S r‡  )r¬   rà  r�   r}   r}   r‰   rà  ¦  s    z%DUP_Flint._mignotte_sep_bound_squaredc                 C  s   |   ¡ }dd„ | ¡ D ƒS )râ  c                 S  s   g | ]\}}|  ¡ |f‘qS r}   r¹  r‰  r}   r}   r‰   rë   ­  s     z'DUP_Flint._gff_list.<locals>.<listcomp>)r¬   rä  )r‘   r  r}   r}   r‰   rã  ª  s    zDUP_Flint._gff_listc                 C  s   t ‚dS rå  r±   r�   r}   r}   r‰   rç  ¯  s    zDUP_Flint.normc                 C  s   t ‚dS rè  r±   r�   r}   r}   r‰   rê  ´  s    zDUP_Flint.sqf_normc                 C  s   |   |  |  ¡ ¡¡S rŠ  )r\  r®  rˆ  r�   r}   r}   r‰   rì  ¹  s    zDUP_Flint.sqf_partc                 C  s&   |   ¡ j|d�\}}|dd„ |D ƒfS )rî  ©rœ   c                 S  s   g | ]\}}|  ¡ |f‘qS r}   r¹  r‰  r}   r}   r‰   rë   À  s     z&DUP_Flint.sqf_list.<locals>.<listcomp>)r¬   rð  r‹  r}   r}   r‰   rð  ½  s    zDUP_Flint.sqf_listc                 C  s   |   ¡ j|d�}dd„ |D ƒS )rî  r¼  c                 S  s   g | ]\}}|  ¡ |f‘qS r}   r¹  r‰  r}   r}   r‰   rë   Å  s     z.DUP_Flint.sqf_list_include.<locals>.<listcomp>)r¬   rñ  r�  r}   r}   r‰   rñ  Â  s    zDUP_Flint.sqf_list_includec                   s¬   ˆ j jr*ˆ j ¡ \}}‡ fdd„|D ƒ}npˆ j jrŒˆ j ¡ \}}‡ fdd„|D ƒ}g }|D ].\}}| ¡ \}}|||  }| ||f¡ qZntdˆ j  ƒ‚ˆ  |¡}||fS )ró  c                   s"   g | ]\}}ˆ   |ˆ j¡|f‘qS r}   ©r¢  r‡   r‰  r�   r}   r‰   rë   Í  s     z)DUP_Flint.factor_list.<locals>.<listcomp>c                   s"   g | ]\}}ˆ   |ˆ j¡|f‘qS r}   r½  r‰  r�   r}   r‰   rë   Ó  s     r¤  )	r‡   r¥  r’   Úfactorr§  r‚  rÔ   r®   r   )r‘   rÂ   rŒ  Zfactors_monicrÈ   rÐ   rm  r}   r�   r‰   rô  Ç  s    
zDUP_Flint.factor_listc                 C  s   |   ¡  ¡ }dd„ |D ƒS )ró  c                 S  s   g | ]\}}|  ¡ |f‘qS r}   r¹  r‰  r}   r}   r‰   rë   î  s     z1DUP_Flint.factor_list_include.<locals>.<listcomp>)r¬   rõ  rŽ  r}   r}   r‰   rõ  å  s    zDUP_Flint.factor_list_includec                   s8   dd„ |D ƒ}t |dd�}‡ fdd„‰‡fdd„|D ƒS )z+Sort a list of factors to canonical order. c                 S  s   g | ]\}}|  ¡ |f‘qS r}   rÙ   r‰  r}   r}   r‰   rë   ó  s     z+DUP_Flint._sort_factors.<locals>.<listcomp>T)Zmultiplec                   s   ˆ   ˆ  | d d d… ¡ˆ j¡S rŸ  r©  )rÈ   r�   r}   r‰   Ú<lambda>õ  ó    z)DUP_Flint._sort_factors.<locals>.<lambda>c                   s   g | ]\}}ˆ |ƒ|f‘qS r}   r}   r‰  )Úto_dup_flintr}   r‰   rë   ö  s     )r   rŽ  r}   )r‘   rÁ  r‰   r   ð  s    zDUP_Flint._sort_factorsc                 C  s   |   ¡  ||||¡S r”   )r¬   rþ  r   r}   r}   r‰   rþ  ø  s    zDUP_Flint._isolate_real_rootsc                 C  s   |   ¡  ||||¡S r”   )r¬   rý  r   r}   r}   r‰   rý  û  s    z!DUP_Flint._isolate_real_roots_sqfc                 C  s   |   ¡  ||||¡S r”   )r¬   rü  r   r}   r}   r‰   rü  þ  s    zDUP_Flint._isolate_all_rootsc                 C  s   |   ¡  ||||¡S r”   )r¬   rû  r   r}   r}   r‰   rû  	  s    z DUP_Flint._isolate_all_roots_sqfc                 C  s   |   ¡  |||||¡S r”   )r¬   r  r  r}   r}   r‰   r  	  s    zDUP_Flint._refine_real_rootc                 C  s   |   ¡ j||d�S r�  )r¬   r	  r  r}   r}   r‰   r	  	  s    zDUP_Flint.count_real_rootsc                 C  s   |   ¡ j||d�S r’  )r¬   r  r  r}   r}   r‰   r  	  s    zDUP_Flint.count_complex_rootsc                 C  s   | j  S r“  r²  r�   r}   r}   r‰   ró   	  s    zDUP_Flint.is_zeroc                 C  s   | j | jjkS r”  )r’   r‡   rµ   r�   r}   r}   r‰   r  	  s    zDUP_Flint.is_onec                 C  s   | j  ¡ dkS )r  r   r±  r�   r}   r}   r‰   r  	  s    zDUP_Flint.is_groundc                 C  s   | j  ¡ dkS )r  rš   r±  r�   r}   r}   r‰   r  	  s    zDUP_Flint.is_linearc                 C  s   | j  ¡ dkS )r  r›  r±  r�   r}   r}   r‰   r  #	  s    zDUP_Flint.is_quadraticc                 C  s
   |   ¡ jS )r  )r¬   r  r�   r}   r}   r‰   r  (	  s    zDUP_Flint.is_monomialc                 C  s   |   ¡ | jjkS r–  )rs  r‡   rµ   r�   r}   r}   r‰   r  -	  s    zDUP_Flint.is_monicc                 C  s
   |   ¡ jS r—  )r¬   r  r�   r}   r}   r‰   r  2	  s    zDUP_Flint.is_primitivec                 C  s
   |   ¡ jS )r  )r¬   r   r�   r}   r}   r‰   r   7	  s    zDUP_Flint.is_homogeneousc                 C  s
   |   ¡ jS r•  )r¬   r  r�   r}   r}   r‰   r  <	  s    zDUP_Flint.is_sqfc                 C  s
   |   ¡ jS rœ  )r¬   r"  r�   r}   r}   r‰   r"  A	  s    zDUP_Flint.is_irreduciblec                 C  s$   | j jrt| j ¡ ƒS |  ¡ jS dS r#  )r‡   r¥  Úboolr’   r%  r¬   r�   r}   r}   r‰   r%  F	  s    zDUP_Flint.is_cyclotomic)N)F)F)r   )rš   r   )rš   r   )F)F)NN)NN)vr¸   rG  rH  rI  rˆ   rJ  rž  rK  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  r5  r:  r>  rC  rG  rK  rO  rS  rV  rY  r\  r`  rc  re  rs  ru  rw  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  rL  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_DMFO	  s
    
  ÿrÇ  c                   @  sŒ  e Zd ZdZdZdZdd„Zed[dd„ƒZ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^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d(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ ZeZd_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„ Z/dVdW„ Z0dXdY„ Z1dS )`rÃ  z'Dense Multivariate Fractions over `K`. rÄ  Nc                 C  sB   |   |||¡\}}}t||||ƒ\}}|| _|| _|| _|| _d S r”   )Ú_parserb   rÅ  rÆ  rˆ   r‡   )r¾   r†   r‡   rˆ   rÅ  rÆ  r}   r}   r‰   Ú__init__Y	  s    zDMF.__init__c                 C  s:   |   |||¡\}}}t | ¡}||_||_||_||_|S r”   )rÈ  rM  rŠ   rÅ  rÆ  rˆ   r‡   )r…   r†   r‡   rˆ   rÅ  rÆ  rN  r}   r}   r‰   rƒ   b	  s    
zDMF.newc                 C  s   |   || j| j¡S r”   )rƒ   r‡   rˆ   )r¾   r†   r}   r}   r‰   rÃ   o	  s    zDMF.ground_newc                 C  s(  t |tƒrÄ|\}}|d k	rHt |tƒr0t|||ƒ}t |tƒrvt|||ƒ}n.t|ƒ\}}t|ƒ\}}||krn|}ntdƒ‚t||ƒrˆtdƒ‚t||ƒržt||ƒ}n$t	|||ƒrÂt
|||ƒ}t
|||ƒ}nZ|}|d k	�rt |tƒrêt|||ƒ}nt |tƒ�st| |¡|ƒ}nt|ƒ\}}t||ƒ}|||fS )Nzinconsistent number of levelszfraction denominator)r€   rh  r¦   r%   r   rŠ  r!   ÚZeroDivisionErrorr   r   r7   r�   r   r°   )r…   r†   r‡   rˆ   rÅ  rÆ  Znum_levZden_levr}   r}   r‰   rÈ  r	  s8    







z
DMF._parsec                 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DMF.__repr__c                 C  s.   t | jjt| j| jƒt| j| jƒ| j| jfƒS r”   )rº   r·   r¸   r0   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rPˆjˆjˆjˆjˆjf|jfS ˆjˆj 	|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Å   TFc                   sB   |r|s| | S |d }|r.t | ||ˆ ƒ\} }ˆj | |fˆ |¡S rp  ©rb   r·   rƒ   ©rÅ  rÆ  r¸  Úkillrˆ   ©r‡   r‘   r}   r‰   rR  ´	  s    zDMF.poly_unify.<locals>.perN)r€   r~   rˆ   ry   r‡   rR  rÅ  rÆ  r’   rÆ   r   ©r‘   rÈ   rˆ   r  r/  rR  r}   rÎ  r‰   Ú
poly_unify¥	  s    ÿzDMF.poly_unifyc                   sÜ   t |tƒrˆj|jkr&tdˆ|f ƒ‚ˆj|jkrVˆjˆjˆjˆjˆjf|j|jffS ˆjˆj |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Å   TFc                   sB   |r|s| | S |d }|r.t | ||ˆ ƒ\} }ˆj | |fˆ |¡S rp  rË  rÌ  rÎ  r}   r‰   rR  Ó	  s    zDMF.frac_unify.<locals>.perN)
r€   rÃ  rˆ   ry   r‡   rR  rÅ  rÆ  rÆ   r   rÏ  r}   rÎ  r‰   Ú
frac_unifyÂ	  s    
ÿÿÿzDMF.frac_unifyTFc                 C  sP   | j | j }}|r&|s|| S |d8 }|r<t||||ƒ\}}| j ||f||¡S )z.Create a DMF out of the given representation. rš   )rˆ   r‡   rb   r·   rƒ   )r‘   rÅ  rÆ  r¸  rÍ  rˆ   r‡   r}   r}   r‰   rR  á	  s    zDMF.perc                 C  s(   | j }|r|s|S |d8 }t|| j|ƒS )rP  rš   )rˆ   r~   r‡   )r‘   r†   rÍ  rˆ   r}   r}   r‰   Úhalf_perð	  s    zDMF.half_perc                 C  s   |   d||¡S r‹   ©rƒ   r³   r}   r}   r‰   r´   ü	  s    zDMF.zeroc                 C  s   |   d||¡S rp  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‰   r´  
  s    z	DMF.numerc                 C  s   |   | j¡S )z"Returns the denominator of ``f``. )rÒ  rÆ  r�   r}   r}   r‰   r³  
  s    z	DMF.denomc                 C  s   |   | j| j¡S )z4Remove common factors from ``f.num`` and ``f.den``. )rR  rÅ  rÆ  r�   r}   r}   r‰   r¸  
  s    z
DMF.cancelc                 C  s    | j t| j| j| jƒ| jdd�S )r  F©r¸  )rR  r7   rÅ  rˆ   r‡   rÆ  r�   r}   r}   r‰   r  
  s    zDMF.negc                 C  s   | |   |¡ S r  )rÃ   r  r}   r}   r‰   r  
  s    zDMF.add_groundc                 C  sš   t |tƒr:|  |¡\}}}\}}}t|||||ƒ| }}	nV|  |¡\}}}}
}|
| \}}\}}tt||||ƒt||||ƒ||ƒ}t||||ƒ}	|||	ƒS )z0Add two multivariate fractions ``f`` and ``g``. )r€   r~   rÐ  rE   rÑ  r8   r:   ©r‘   rÈ   rˆ   r‡   rR  ÚF_numÚF_denr/  rÅ  rÆ  r  ZG_numZG_denr}   r}   r‰   r0  
  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Ñ  r9   r:   rÕ  r}   r}   r‰   r3  '
  s    
  ÿzDMF.subc                 C  s„   t |tƒr8|  |¡\}}}\}}}t||||ƒ| }}	nB|  |¡\}}}}
}|
| \}}\}}t||||ƒ}t||||ƒ}	|||	ƒS )z5Multiply two multivariate fractions ``f`` and ``g``. ©r€   r~   rÐ  r:   rÑ  rÕ  r}   r}   r‰   r6  6
  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Æ  rR  r<   rˆ   r‡   r=  r‚   )r‘   rç   rÅ  rÆ  r}   r}   r‰   r@  D
  s    
 ÿzDMF.powc                 C  s„   t |tƒr8|  |¡\}}}\}}}|t||||ƒ }}	nB|  |¡\}}}}
}|
| \}}\}}t||||ƒ}t||||ƒ}	|||	ƒS )z0Computes quotient of fractions ``f`` and ``g``. rØ  rÕ  r}   r}   r‰   rZ  O
  s    
zDMF.quoc                 C  s   | j | j| jdd�S )z&Computes inverse of a fraction ``f``. FrÔ  )rR  rÆ  rÅ  )r‘   Úcheckr}   r}   r‰   r›  _
  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‰   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. )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  sj   t |ttfƒr|  |¡S || jkr4|  | j |¡¡S z|  |  |¡¡W S  tt	t
fk
rd   t Y S X d S r”   )r€   r~   rÃ  r0  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  sN   t |ttfƒr|  |¡S z|  |  |¡¡W S  tttfk
rH   t Y S X d S r”   )	r€   r~   rÃ  r3  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  sN   t |ttfƒr|  |¡S z|  |  |¡¡W S  tttfk
rH   t Y S X d S r”   )	r€   r~   rÃ  r6  rÒ  r=  r   r²   r)  r^  r}   r}   r‰   r/  ‹
  s    
zDMF.__mul__c                 C  s
   |   |¡S r”   r0  r^  r}   r}   r‰   r1  ”
  s    zDMF.__rmul__c                 C  s
   |   |¡S r”   r4  r?  r}   r}   r‰   r5  —
  s    zDMF.__pow__c              
   C  sN   t |ttfƒr|  |¡S z|  |  |¡¡W S  tttfk
rH   t Y S X d S r”   )	r€   r~   rÃ  rZ  rÒ  r=  r   r²   r)  r^  r}   r}   r‰   r2  š
  s    
zDMF.__truediv__c                 C  s   | j dd�| S )NF)rÙ  )r›  )r¾   rÈ   r}   r}   r‰   r3  £
  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k
rŒ   Y nX dS rO  ©r€   r~   rÐ  rˆ   r"   r‡   rÑ  ry   ©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k
rŽ   Y nX dS )NTrÛ  rÜ  r}   r}   r‰   Ú__ne__·
  s    
z
DMF.__ne__c                 C  s   |   |¡\}}}}}||k S r”   ©rÑ  ©r‘   rÈ   rê   r  r/  r}   r}   r‰   rB  È
  s    z
DMF.__lt__c                 C  s   |   |¡\}}}}}||kS r”   rÞ  rß  r}   r}   r‰   rC  Ì
  s    z
DMF.__le__c                 C  s   |   |¡\}}}}}||kS r”   rÞ  rß  r}   r}   r‰   rD  Ð
  s    z
DMF.__gt__c                 C  s   |   |¡\}}}}}||kS r”   rÞ  rß  r}   r}   r‰   rE  Ô
  s    z
DMF.__ge__c                 C  s   t | j| jƒ S r”   rÚ  r�   r}   r}   r‰   rF  Ø
  s    zDMF.__bool__)N)N)N)TF)F)T)2r¸   rG  rH  rI  rJ  rÉ  rK  rƒ   rÃ   rÈ  r¹   r¼   rÐ  rÑ  rR  rÒ  r´   rµ   r´  r³  r¸  r  r  r0  r3  r6  r@  rZ  r]  r›  rL  ró   r  r(  r*  r,  r-  r.  r/  r1  r5  r2  r3  r<  rÝ  rB  rC  rD  rE  rF  r}   r}   r}   r‰   rÃ  T	  sf   
	+






			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e‡ fdd„ƒZ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dd„ Zdd„ Z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d+d,„ Zed-d.„ ƒZd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Z d7d8„ Z!d9d:„ Z"d;d<„ Z#d=d>„ Z$d?d@„ Z%dAdB„ Z&dCdD„ Z'dEdF„ Z(dGdH„ Z)dIdJ„ Z*dKdL„ Z+e	dMdN„ ƒZ,e	dOdP„ ƒZ-e	dQdR„ ƒZ.dSdT„ Z/dUdV„ Z0dWdX„ Z1dYdZ„ Z2d[d\„ Z3d]d^„ Z4d_d`„ Z5dadb„ Z6dcdd„ Z7dedf„ Z8dgdh„ Z9didj„ Z:dkdl„ Z;dmdn„ Z<dodp„ Z=dqdr„ Z>dsdt„ Z?dudv„ Z@dwdx„ ZA‡  ZBS )yrà  z1Dense Algebraic Number Polynomials over a field. )r’   Ú_modr‡   c                   s®   t |tƒrnZt|ƒtkr,tt|ˆ ƒˆ dƒ}n:t |tƒrJ‡ fdd„|D ƒ}nˆ  |¡g}tt|ƒˆ dƒ}t |tƒrrn.t |tƒr�tt|ˆ ƒˆ dƒ}ntt|ƒˆ dƒ}|  ||ˆ ¡S )Nr   c                   s   g | ]}ˆ   |¡‘qS r}   )r°   )r–   rŽ  r˜   r}   r‰   rë   í
  s     zANP.__new__.<locals>.<listcomp>)	r€   r~   r‚   r¦   r$   r�   r°   r   rƒ   ©r…   r†   rá  r‡   r}   r˜   r‰   rŠ   æ
  s    



zANP.__new__c                   sD   |j |j   kr|ks"n tdƒ‚tƒ  | ¡}||_||_||_ |S )NzInconsistent domain)r‡   r®   ÚsuperrŠ   r’   rã  )r…   r†   rá  r‡   rN  ©r·   r}   r‰   rƒ   û
  s    zANP.newc                 C  s   t | j| j| jffS r”   )rà  r†   rá  r‡   r½   r}   r}   r‰   rž    s    zANP.__reduce__c                 C  s
   | j  ¡ S r”   ©r’   r�   r½   r}   r}   r‰   r†     s    zANP.repc                 C  s   |   ¡ S r”   )Úmod_to_listr½   r}   r}   r‰   rá    s    zANP.modc                 C  s   | j S r”   r²  r½   r}   r}   r‰   Úto_DMP  s    z
ANP.to_DMPc                 C  s   | j S r”   )rã  r½   r}   r}   r‰   Ú
mod_to_DMP  s    zANP.mod_to_DMPc                 C  s   |   || j| j¡S r”   )rƒ   rã  r‡   rQ  r}   r}   r‰   rR    s    zANP.perc                 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‰   r¹     s    zANP.__repr__c                 C  s    t | jj|  ¡ | j ¡ | jfƒS r”   )rº   r·   r¸   r»   rã  r‡   r�   r}   r}   r‰   r¼     s    zANP.__hash__c                 C  s0   | j |kr| S |  | j |¡| j |¡|¡S dS )z.Convert ``f`` to a ``ANP`` over a new domain. N)r‡   rƒ   r’   r°   rã  r¯   r}   r}   r‰   r°   "  s    
zANP.convertc                   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ržt| 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à  rT  ©r‡   rá  r}   r‰   r¿  B  rÀ  zANP.unify.<locals>.<lambda>)	r€   rà  rá  ry   r‡   rR  r†   rÆ   r   rV  r}   rì  r‰   rÆ   )  s    
z	ANP.unifyc                 C  sh   t |tƒr| j|jkr&td| |f ƒ‚| j|jkrT| j |j¡}|  |¡} | |¡}| j|j| j| jfS rÄ   )r€   rà  rã  ry   r‡   rÆ   r°   r’   rÇ   r}   r}   r‰   Ú	unify_ANPF  s    

zANP.unify_ANPc                 C  s   t d||ƒS r‹   rë  ©r…   rá  r‡   r}   r}   r‰   r´   S  s    zANP.zeroc                 C  s   t d||ƒS rp  rë  rî  r}   r}   r‰   rµ   W  s    zANP.onec                 C  s
   | j  ¡ S )rÊ   )r’   rÌ   r�   r}   r}   r‰   rÌ   [  s    zANP.to_dictc                 C  s6   t | jd| jƒ}| ¡ D ]\}}| j |¡||< q|S )rÍ   r   )r&   r†   r‡   rÎ   rÏ   )r‘   r†   rÐ   rÑ   r}   r}   r‰   rÒ   _  s    zANP.to_sympy_dictc                 C  s
   | j  ¡ S rW  rç  r�   r}   r}   r‰   r�   h  s    zANP.to_listc                 C  s
   | j  ¡ S )z5Return ``f.mod`` as a list with native coefficients. )rã  r�   r�   r}   r}   r‰   rè  l  s    zANP.mod_to_listc                   s   ‡ fdd„ˆ   ¡ D ƒS )rÓ   c                   s   g | ]}ˆ j  |¡‘qS r}   )r‡   rÏ   r•   r�   r}   r‰   rë   r  s     z%ANP.to_sympy_list.<locals>.<listcomp>rÙ   r�   r}   r�   r‰   rÚ   p  s    zANP.to_sympy_listc                 C  s
   | j  ¡ S )rÜ   )r’   r»   r�   r}   r}   r‰   r»   t  s    zANP.to_tuplec                 C  s   t ttt|j|ƒƒƒ||ƒS r”   )rà  r   r�   rt  r°   rä  r}   r}   r‰   r¤   |  s    zANP.from_listc                 C  s   |   | j |¡¡S r  )rR  r’   r  r  r}   r}   r‰   r  €  s    zANP.add_groundc                 C  s   |   | j |¡¡S r   )rR  r’   r"  r  r}   r}   r‰   r"  „  s    zANP.sub_groundc                 C  s   |   | j |¡¡S )z3Multiply ``f`` by an element of the ground domain. )rR  r’   r%  r  r}   r}   r‰   r%  ˆ  s    zANP.mul_groundc                 C  s   |   | j |¡¡S )z6Quotient of ``f`` by an element of the ground domain. )rR  r’   r(  r  r}   r}   r‰   r(  Œ  s    zANP.quo_groundc                 C  s   |   | j ¡ ¡S r”   )rR  r’   r  r�   r}   r}   r‰   r  �  s    zANP.negc                 C  s&   |   |¡\}}}}|  | |¡||¡S r”   )rí  rƒ   r0  ©r‘   rÈ   r  r/  rá  r‡   r}   r}   r‰   r0  “  s    zANP.addc                 C  s&   |   |¡\}}}}|  | |¡||¡S r”   )rí  rƒ   r3  rï  r}   r}   r‰   r3  —  s    zANP.subc                 C  s,   |   |¡\}}}}|  | |¡ |¡||¡S r”   )rí  rƒ   r6  rW  rï  r}   r}   r‰   r6  ›  s    zANP.mulc                 C  s^   t |tƒstdt|ƒ ƒ‚| j}| j}|dk r@| |¡|  }}|  | |¡ 	| j¡|| j
¡S )r;  r<  r   )r€   r    r=  r‚   rã  r’   r›  rƒ   r@  rW  r‡   )r‘   rç   rá  r  r}   r}   r‰   r@  Ÿ  s    
zANP.powc                 C  s2   |   |¡\}}}}|  | | |¡¡ |¡||¡S r”   )rí  rƒ   r6  r›  rW  rï  r}   r}   r‰   r]  ­  s    z	ANP.exquoc                 C  s   |   |¡|  | j| j¡fS r”   )r]  r´   rã  r‡   r^  r}   r}   r‰   rT  ±  s    zANP.divc                 C  s
   |   |¡S r”   )r]  r^  r}   r}   r‰   rZ  ´  s    zANP.quoc                 C  s>   |   |¡\}}}}| |¡\}}|jr2|  ||¡S tdƒ‚d S )Nr¸  )rí  r”  r  r´   r   )r‘   rÈ   r  r/  rá  r‡   ri  rr  r}   r}   r‰   rW  ·  s
    zANP.remc                 C  s
   | j  ¡ S ri  )r’   rs  r�   r}   r}   r‰   rs  À  s    zANP.LCc                 C  s
   | j  ¡ S rj  )r’   ru  r�   r}   r}   r‰   ru  Ä  s    zANP.TCc                 C  s   | j jS )z6Returns ``True`` if ``f`` is a zero algebraic number. )r’   ró   r�   r}   r}   r‰   ró   È  s    zANP.is_zeroc                 C  s   | j jS )z6Returns ``True`` if ``f`` is a unit algebraic number. )r’   r  r�   r}   r}   r‰   r  Í  s    z
ANP.is_onec                 C  s   | j jS )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  sL   t |tƒr|  |¡S z| j |¡}W n tk
r<   t Y S X |  |¡S d S r”   )r€   rà  r0  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  sL   t |tƒr|  |¡S z| j |¡}W n tk
r<   t Y S X |  |¡S d S r”   )r€   rà  r3  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  sL   t |tƒr|  |¡S z| j |¡}W n tk
r<   t Y S X |  |¡S d S r”   )r€   rà  r6  r‡   r°   r   r)  r%  r^  r}   r}   r‰   r/  ÷  s    


zANP.__mul__c                 C  s
   |   |¡S r”   r0  r^  r}   r}   r‰   r1    s    zANP.__rmul__c                 C  s
   |   |¡S r”   r4  r?  r}   r}   r‰   r5    s    zANP.__pow__c                 C  s
   |   |¡S r”   r6  r^  r}   r}   r‰   r7    s    zANP.__divmod__c                 C  s
   |   |¡S r”   r8  r^  r}   r}   r‰   r9  
  s    zANP.__mod__c                 C  sL   t |tƒr|  |¡S z| j |¡}W n tk
r<   t Y S X |  |¡S d S r”   )r€   rà  rZ  r‡   r°   r   r)  r(  r^  r}   r}   r‰   r2    s    


zANP.__truediv__c                 C  s8   z|   |¡\}}}}W n tk
r.   t Y S X ||kS r”   ©rí  ry   r)  ©r‘   rÈ   r  r/  rê   r}   r}   r‰   r<    s
    
z
ANP.__eq__c                 C  s8   z|   |¡\}}}}W n tk
r.   t Y S X ||kS r”   rñ  rò  r}   r}   r‰   rÝ    s
    
z
ANP.__ne__c                 C  s   |   |¡\}}}}||k S r”   ©rí  rò  r}   r}   r‰   rB  %  s    z
ANP.__lt__c                 C  s   |   |¡\}}}}||kS r”   ró  rò  r}   r}   r‰   rC  )  s    z
ANP.__le__c                 C  s   |   |¡\}}}}||kS r”   ró  rò  r}   r}   r‰   rD  -  s    z
ANP.__gt__c                 C  s   |   |¡\}}}}||kS r”   ró  rò  r}   r}   r‰   rE  1  s    z
ANP.__ge__c                 C  s
   t | jƒS r”   )rÂ  r’   r�   r}   r}   r‰   rF  5  s    zANP.__bool__)Cr¸   rG  rH  rI  rJ  rŠ   rK  rƒ   rž  rL  r†   rá  ré  rê  rR  r¹   r¼   r°   rÆ   rí  r´   rµ   rÌ   rÒ   r�   rè  rÚ   r»   r¤   r  r"  r%  r(  r  r0  r3  r6  r@  r]  rT  rZ  rW  rs  ru  ró   r  r  rð  r(  r*  r,  r-  r.  r/  r1  r5  r7  r9  r2  r<  rÝ  rB  rC  rD  rE  rF  Ú__classcell__r}   r}   ræ  r‰   rà  á
  sŒ   



	
	






rà  )“rI  Ú
__future__r   Zsympy.external.gmpyr   Zsympy.utilities.exceptionsr   Zsympy.core.numbersr   Zsympy.core.sympifyr   Zsympy.polys.polyutilsr   r   Zsympy.polys.domainsr	   r
   r   Zsympy.polys.polyerrorsr   r   r   r   Zsympy.polys.densebasicr   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   Zsympy.polys.densearithr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   Zsympy.polys.densetoolsrJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   Zsympy.polys.euclidtoolsrY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   Zsympy.polys.sqfreetoolsrc   rd   re   rf   rg   rh   ri   Zsympy.polys.factortoolsrj   rk   rl   rm   Zsympy.polys.rootisolationrn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   Ú__annotations__r|   r{   r~   rŽ   rŒ   rÇ  rÃ  râ  rà  r}   r}   r}   r‰   Ú<module>   s`   ŒlD0
$4

        O   v        