
    wgo                      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mZmZmZmZmZmZmZ ddlmZmZ ded<   edk(  r	ddlZeefZndZdZ G d de
      Z G d de      Z G d de      Zd Z G d dee
      Zd  Z G d! d"e
      Zy)#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                     e Zd ZdZdZddZed        Zed        Z	d Z
ed        Zed	        Zed
        Zed        Zed        Zd Zd Zed        Zed        Zd Zd Zd Zd Zd Zd ZddZddZd Zd Zd Zd Zd Z d Z!ddZ"d  Z#d! Z$dd"Z%dd#Z&dd$Z'dd%Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.dd,Z/dd-Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6d4 Z7d5 Z8d6 Z9d7 Z:d8 Z;d9 Z<d: Z=d; Z>d< Z?d= Z@d> ZAd? ZBd@ ZCdA ZDdB ZEdC ZFdD ZGdE ZHdF ZIdG ZJdH ZKdI ZLdJ ZMdK ZNdL ZOdM ZPdN ZQdO ZRdP ZSdQ ZTdR ZUdS ZVdT ZWdU ZXdV ZYdW ZZdX Z[ddYZ\dZ Z]d[ Z^d\ Z_d] Z`d^ Zad_ Zbd` Zcda Zddb Zedc Zfdd Zgde Zhdf ZiddgZjdh ZkddiZldj ZmddkZndl Zodm Zpdn Zqdo Zrdp Zsdq Ztdr Zuds Zvdt Zwdu Zxdv Zydw ZzddxZ{ddyZ|dz Z}d{ Z~d| Zd} Zd~ Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZddZd Zd ZddZd Zd Zd Zd ZddZd ZddZddZed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdÄ ZdĄ Zdń ZdƄ ZdǄ ZddȄZddɄZdʄ Zd˄ Zd̄ Zd̈́ Zd΄ Zy)DMP)Dense Multivariate Polynomials over `K`. r~   Nc                    |t        |      \  }}n't        |t              st        dt	        |      z        | j                  |||      S )Nzexpected list, got %s)r   
isinstancelistr   typenewclsrepdomlevs       \/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/polys/polyclasses.py__new__zDMP.__new__   sG    ;#C(HCC& !849!DEEwwsC%%    c                    t         $|dk(  r|t        v rt        j                  |||      S t        j                  |||      S Nr   )r}   r|   	DUP_Flint_new
DMP_Pythonr   s       r   r   zDMP.new   s>     axC>1 ~~c344sC--r   c                >    t        ddd       | j                         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)deprecated_since_versionactive_deprecations_target)r   to_listfs    r   r   zDMP.rep   s'     	" # &,'0		
 yy{r   c                    t         ft        | t              rV| j                  dk(  rG| j                  t
        v r5t        j                  | j                  | j                  | j                        S | S )zConvert 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.
        r   )	r}   r   r   r   r   r|   r   r   _repr   s    r   to_bestzDMP.to_best   sM     !Z(QUUaZAEE^<S }}QVVQUUAEE::r   c                x    t        t              sJ t        |t              r|dk\  sJ fd ||       y )Nr   c                    t        | t              sJ |dk(  rt        fd| D              sJ y | D ]  } ||dz
          y )Nr   c              3  @   K   | ]  }j                  |        y wN)of_type).0cr   s     r   	<genexpr>z;DMP._validate_args.<locals>.validate_rep.<locals>.<genexpr>   s     7a3;;q>7s      )r   r   all)r   r   rr   validate_reps      r   r   z(DMP._validate_args.<locals>.validate_rep   sK    c4(((ax737777 -A C!G,-r   )r   r
   int)r   r   r   r   r   s     ` @r   _validate_argszDMP._validate_args   s:    #v&&&#s#q00	- 	S#r   c                B    t        |||      }| j                  |||      S r   )r&   r   r   r   r   r   s       r   	from_dictzDMP.from_dict   s#    Cc*wwsC%%r   c                @    | j                  t        ||d|      ||      S )zCCreate an instance of ``cls`` given a list of native coefficients. N)r   r   r   s       r   	from_listzDMP.from_list   s"     ww{3T37cBBr   c                >    | j                  t        |||      ||      S )zBCreate an instance of ``cls`` given a list of SymPy coefficients. )r   r   r   s       r   from_sympy_listzDMP.from_sympy_list   s      ww~c34c3??r   c           
     N     | t        t        t        ||                  ||      S r   )dictr   zip)r   monomscoeffsr   r   s        r   from_monoms_coeffszDMP.from_monoms_coeffs   s"    4S012C==r   c                   | j                   |k(  r| S | j                  st        | j                  |      S t	        | t
              r8|t        v r| j                  |      S | j                         j                  |      S t	        | t              r8|t        v r| j                  |      j                         S | j                  |      S t        d      )z0Convert ``f`` to a ``DMP`` over the new domain. zunreachable code)r   r   r}   _convertr   r   r|   to_DMP_Pythonr   to_DUP_FlintRuntimeErrorr   r   s     r   convertzDMP.convert   s    55C<HUUem::c?"9%n$zz#&(11#66:&n$zz#3355zz#&122r   c                    t         r   NotImplementedErrorr   s     r   r   zDMP._convert       !!r   c                .    t        t        |      ||      S r   )r   r!   r   r   r   s      r   zerozDMP.zero   s    8C=#s++r   c                0    t        t        ||      ||      S r   )r   r   r   s      r   onezDMP.one   s    73$c3//r   c                    t         r   r   r   s    r   _onezDMP._one  r   r   c                p    | j                   j                  d| j                         d| j                  dS N(, ))	__class____name__r   r   r   s    r   __repr__zDMP.__repr__  s#     {{33QYY[!%%HHr   c                    t        | j                  j                  | j                         | j                  | j
                  f      S r   )hashr   r   to_tupler   r   r   s    r   __hash__zDMP.__hash__  s.    Q[[))1::<FGGr   c                P    | j                         | j                  | j                  fS r   )r   r   r   selfs    r   __getnewargs__zDMP.__getnewargs__
  s    ||~txx11r   c                    t         z*Construct a new ground instance of ``f``. r   r   coeffs     r   
ground_newzDMP.ground_new      !!r   c                >   t        |t              r| j                  |j                  k7  rt        d| d|      | j                  |j                  k7  rG| j                  j                  |j                        }| j                  |      } |j                  |      }| |fS z7Unify and return ``DMP`` instances of ``f`` and ``g``. Cannot unify  with )r   r   r   rz   r   unifyr   r   gr   s      r   	unify_DMPzDMP.unify_DMP  sr    !S!QUUaee^#A$FGG55AEE>%%++aee$C		#A		#A!tr   c                d    t        | j                         | j                  | j                  |      S )AConvert ``f`` to a dict representation with native coefficients. r   )r'   r   r   r   )r   r   s     r   to_dictzDMP.to_dict  s!    199;quu4@@r   c                    | j                  |      }|j                         D ]#  \  }}| j                  j                  |      ||<   % |S )@Convert ``f`` to a dict representation with SymPy coefficients. r   )r   itemsr   to_sympy)r   r   r   kvs        r   to_sympy_dictzDMP.to_sympy_dict!  sH    iiTi"IIK 	'DAqUU^^A&CF	' 
r   c                >      fd  j                               S )@Convert ``f`` to a list representation with SymPy coefficients. c                    g }| D ]T  }t        |t              r|j                   |             +|j                  j                  j	                  |             V |S r   )r   r   appendr   r   )r   outvalr   sympify_nested_lists      r   r   z.DMP.to_sympy_list.<locals>.sympify_nested_list,  sS    C 4c4(JJ2378JJquu~~c23	4
 Jr   )r   )r   r   s   `@r   to_sympy_listzDMP.to_sympy_list*  s    	 #199;//r   c                    t         AConvert ``f`` to a list representation with native coefficients. r   r   s    r   r   zDMP.to_list7  r   r   c                    t         zx
        Convert ``f`` to a tuple representation with native coefficients.

        This is needed for hashing.
        r   r   s    r   r   zDMP.to_tuple;  s
     "!r   c                T    | j                  | j                  j                               S )zMake the ground domain a ring. )r   r   get_ringr   s    r   to_ringzDMP.to_ringC  s    yy)**r   c                T    | j                  | j                  j                               S )z Make the ground domain a field. )r   r   	get_fieldr   s    r   to_fieldzDMP.to_fieldG      yy*++r   c                T    | j                  | j                  j                               S )zMake the ground domain exact. )r   r   	get_exactr   s    r   to_exactzDMP.to_exactK  r  r   c                h    | j                   s|s| j                  ||      S | j                  |||      S z1Take a continuous subsequence of terms of ``f``. )r   _slice
_slice_levr   mnjs       r   slicez	DMP.sliceO  s.    uuQ88Aq>!<<1a((r   c                    t         r   r   )r   r  r  s      r   r  z
DMP._sliceV  r   r   c                    t         r   r   r  s       r   r  zDMP._slice_levY  r   r   c                X    | j                  |      D cg c]  \  }}|	 c}}S c c}}w )z;Returns all non-zero coefficients from ``f`` in lex order. orderterms)r   r  _r   s       r   r   z
DMP.coeffs\  %     wwUw35tq!555   &c                X    | j                  |      D cg c]  \  }}|	 c}}S c c}}w )z8Returns all non-zero monomials from ``f`` in lex order. r  r  )r   r  r  r  s       r   r   z
DMP.monoms`  r  r  c                    | j                   r+d| j                  dz   z  }|| j                  j                  fgS | j	                  |      S )4Returns all non-zero terms from ``f`` in lex order. r   r   r  )is_zeror   r   r   _terms)r   r  
zero_monoms      r   r  z	DMP.termsd  sB    99quuqy)J,--88%8((r   c                    t         r   r   r   r  s     r   r"  z
DMP._termsl  r   r   c                    | j                   rt        d      | s| j                  j                  gS t	        | j                               S )z%Returns all coefficients from ``f``. &multivariate polynomials not supported)r   r{   r   r   r   r   r   s    r   
all_coeffszDMP.all_coeffso  s9    55!"JKKEEJJ<		$$r   c                    | j                   rt        d      | j                         }|dk  rdgS t        | j	                               D cg c]  \  }}||z
  f c}}S c c}}w )z"Returns all monomials from ``f``. r'  r   r   )r   r{   degree	enumerater   r   r  ir   s       r   
all_monomszDMP.all_monomsy  sW    55!"JKKHHJq56M*3AIIK*@B$!Qa!eXBBBs   A c                    | j                   rt        d      | j                         }|dk  rd| j                  j                  fgS t        | j                               D cg c]  \  }}||z
  f|f c}}S c c}}w )z Returns all terms from a ``f``. r'  r   r   )r   r{   r*  r   r   r+  r   r,  s       r   	all_termszDMP.all_terms  sj    55!"JKKHHJq5155::&''/8/EGtq!q1uh]GGGs   "A8c                >    | j                         j                         S z-Convert algebraic coefficients to rationals. )_liftr   r   s    r   liftzDMP.lift  s    wwy  ""r   c                    t         r   r   r   s    r   r3  z	DMP._lift  r   r   c                    t         2Reduce degree of `f` by mapping `x_i^m` to `y_i`. r   r   s    r   deflatezDMP.deflate  r   r   c                    t         ,Inject ground domain generators into ``f``. r   r   fronts     r   injectz
DMP.inject  r   r   c                    t         2Eject selected generators into the ground domain. r   r   r   r>  s      r   ejectz	DMP.eject  r   r   c                L    | j                         \  }}||j                         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Fs      r   excludezDMP.exclude  s#      zz|1!))+~r   c                    t         r   r   r   s    r   rF  zDMP._exclude  r   r   c                $    | j                  |      S )a  
        Returns a polynomial in `K[x_{P(1)}, ..., x_{P(n)}]`.

        Examples
        ========

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

        >>> DMP([[[ZZ(2)], [ZZ(1), ZZ(0)]], [[]]], ZZ).permute([1, 0, 2])
        DMP_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   Ps     r   permutezDMP.permute  s    " zz!}r   c                    t         r   r   rN  s     r   rM  zDMP._permute  r   r   c                    t         z/Remove GCD of terms from the polynomial ``f``. r   r   s    r   	terms_gcdzDMP.terms_gcd  r   r   c                    t         z)Make all coefficients in ``f`` positive. r   r   s    r   abszDMP.abs  r   r   c                    t         "Negate all coefficients in ``f``. r   r   s    r   negzDMP.neg  r   r   c                V    | j                  | j                  j                  |            S z.Add an element of the ground domain to ``f``. )_add_groundr   r   r   r   s     r   
add_groundzDMP.add_ground      }}QUU]]1-..r   c                V    | j                  | j                  j                  |            S z5Subtract an element of the ground domain from ``f``. )_sub_groundr   r   r_  s     r   
sub_groundzDMP.sub_ground  ra  r   c                V    | j                  | j                  j                  |            S z5Multiply ``f`` by a an element of the ground domain. )_mul_groundr   r   r_  s     r   
mul_groundzDMP.mul_ground  ra  r   c                V    | j                  | j                  j                  |            S z8Quotient of ``f`` by a an element of the ground domain. )_quo_groundr   r   r_  s     r   
quo_groundzDMP.quo_ground  ra  r   c                V    | j                  | j                  j                  |            S z>Exact quotient of ``f`` by a an element of the ground domain. )_exquo_groundr   r   r_  s     r   exquo_groundzDMP.exquo_ground  s    quu}}Q/00r   c                L    | j                  |      \  }}|j                  |      S z2Add two multivariate polynomials ``f`` and ``g``. )r   _addr   r   rI  Gs       r   addzDMP.add  !    {{1~1vvayr   c                L    | j                  |      \  }}|j                  |      S z7Subtract two multivariate polynomials ``f`` and ``g``. )r   _subru  s       r   subzDMP.sub  rx  r   c                L    | j                  |      \  }}|j                  |      S z7Multiply two multivariate polynomials ``f`` and ``g``. )r   _mulru  s       r   mulzDMP.mul  rx  r   c                "    | j                         S (Square a multivariate polynomial ``f``. )_sqrr   s    r   sqrzDMP.sqr  s    vvxr   c                r    t        |t              st        dt        |      z        | j	                  |      S )+Raise ``f`` to a non-negative power ``n``. ``int`` expected, got %s)r   r   	TypeErrorr   _powr   r  s     r   powzDMP.pow  s/    !S!6a@AAvvayr   c                L    | j                  |      \  }}|j                  |      S /Polynomial pseudo-division of ``f`` and ``g``. )r   _pdivru  s       r   pdivzDMP.pdiv	  !    {{1~1wwqzr   c                L    | j                  |      \  }}|j                  |      S 0Polynomial pseudo-remainder of ``f`` and ``g``. )r   _premru  s       r   premzDMP.prem  r  r   c                L    | j                  |      \  }}|j                  |      S /Polynomial pseudo-quotient of ``f`` and ``g``. )r   _pquoru  s       r   pquozDMP.pquo  r  r   c                L    | j                  |      \  }}|j                  |      S 5Polynomial exact pseudo-quotient of ``f`` and ``g``. )r   _pexquoru  s       r   pexquoz
DMP.pexquo  s!    {{1~1yy|r   c                L    | j                  |      \  }}|j                  |      S z7Polynomial division with remainder of ``f`` and ``g``. )r   _divru  s       r   divzDMP.div  rx  r   c                L    | j                  |      \  }}|j                  |      S z2Computes polynomial remainder of ``f`` and ``g``. )r   _remru  s       r   remzDMP.rem"  rx  r   c                L    | j                  |      \  }}|j                  |      S z1Computes polynomial quotient of ``f`` and ``g``. )r   _quoru  s       r   quozDMP.quo'  rx  r   c                L    | j                  |      \  }}|j                  |      S z7Computes polynomial exact quotient of ``f`` and ``g``. )r   _exquoru  s       r   exquoz	DMP.exquo,  s!    {{1~1xx{r   c                    t         r   r   r_  s     r   r^  zDMP._add_ground1  r   r   c                    t         r   r   r_  s     r   rd  zDMP._sub_ground4  r   r   c                    t         r   r   r_  s     r   rh  zDMP._mul_ground7  r   r   c                    t         r   r   r_  s     r   rl  zDMP._quo_ground:  r   r   c                    t         r   r   r_  s     r   rp  zDMP._exquo_ground=  r   r   c                    t         r   r   r   r   s     r   rt  zDMP._add@  r   r   c                    t         r   r   r  s     r   r{  zDMP._subC  r   r   c                    t         r   r   r  s     r   r  zDMP._mulF  r   r   c                    t         r   r   r   s    r   r  zDMP._sqrI  r   r   c                    t         r   r   r  s     r   r  zDMP._powL  r   r   c                    t         r   r   r  s     r   r  z	DMP._pdivO  r   r   c                    t         r   r   r  s     r   r  z	DMP._premR  r   r   c                    t         r   r   r  s     r   r  z	DMP._pquoU  r   r   c                    t         r   r   r  s     r   r  zDMP._pexquoX  r   r   c                    t         r   r   r  s     r   r  zDMP._div[  r   r   c                    t         r   r   r  s     r   r  zDMP._rem^  r   r   c                    t         r   r   r  s     r   r  zDMP._quoa  r   r   c                    t         r   r   r  s     r   r  z
DMP._exquod  r   r   c                r    t        |t              st        dt        |      z        | j	                  |      S )0Returns the leading degree of ``f`` in ``x_j``. r  )r   r   r  r   _degreer   r  s     r   r*  z
DMP.degreeg  s/    !S!6a@AAyy|r   c                    t         r   r   r  s     r   r  zDMP._degreen  r   r   c                    t         z$Returns a list of degrees of ``f``. r   r   s    r   degree_listzDMP.degree_listq  r   r   c                    t         #Returns the total degree of ``f``. r   r   s    r   total_degreezDMP.total_degreeu  r   r   c                   | j                         }i }|t        | j                         d   d         k(  }| j                         D ][  }t        |d         }||k  r||z
  }nd}|r|d   ||d   |fz   <   0t	        |d         }||xx   |z  cc<   |d   |t        |      <   ] t        j                  || j                  t        |      z   | j                        S )z&Return homogeneous polynomial of ``f``r   r   )r  lenr  sumr   tupler   r   r   r   r   )	r   stdresult
new_symboltermdr-  ls	            r   
homogenizezDMP.homogenizey  s    ^^3qwwy|A//
GGI 	+DDGA2vF)-atAw!~&aM!	#'7uQx 	+ }}VQUUS_%<aeeDDr   c                    | j                   rt         S | j                         }t        |d         }|D ]  }t        |      }||k7  s y |S )z(Returns the homogeneous order of ``f``. r   N)r!  r   r   r  )r   r   tdegmonom_tdegs        r   homogeneous_orderzDMP.homogeneous_order  sQ    993J6!9~ 	EJE}		 r   c                    t         z*Returns the leading coefficient of ``f``. r   r   s    r   LCzDMP.LC  r   r   c                    t         +Returns the trailing coefficient of ``f``. r   r   s    r   TCzDMP.TC  r   r   c                ^    t        d |D              r| j                  |      S t        d      )+Returns the ``n``-th coefficient of ``f``. c              3  <   K   | ]  }t        |t                y wr   )r   r   )r   r  s     r   r   zDMP.nth.<locals>.<genexpr>  s     -az!S!-s   za sequence of integers expected)r   _nthr  r   Ns     r   nthzDMP.nth  s*    -1--66!9=>>r   c                    t         r   r   r  s     r   r  zDMP._nth  r   r   c                    t         zReturns maximum norm of ``f``. r   r   s    r   max_normzDMP.max_norm  r   r   c                    t         zReturns l1 norm of ``f``. r   r   s    r   l1_normzDMP.l1_norm  r   r   c                    t         z!Return squared l2 norm of ``f``. r   r   s    r   l2_norm_squaredzDMP.l2_norm_squared  r   r   c                    t         z0Clear denominators, but keep the ground domain. r   r   s    r   clear_denomszDMP.clear_denoms  r   r   c                    t        |t              st        dt        |      z        t        |t              st        dt        |      z        | j	                  ||      S )EComputes the ``m``-th order indefinite integral of ``f`` in ``x_j``. r  )r   r   r  r   
_integrater   r  r  s      r   	integratezDMP.integrate  sQ    !S!6a@AA!S!6a@AA||Aq!!r   c                    t         r   r   r   s      r   r  zDMP._integrate  r   r   c                    t        |t              st        dt        |      z        t        |t              st        dt        |      z        | j	                  ||      S )<Computes the ``m``-th order derivative of ``f`` in ``x_j``. r  )r   r   r  r   _diffr   s      r   diffzDMP.diff  sP    !S!6a@AA!S!6a@AAwwq!}r   c                    t         r   r   r   s      r   r  z	DMP._diff  r   r   c                    t        |t              st        dt        |      z        d|cxk  r| j                  k  sn t        d|z        | j                  r| j                  ||      S | j                  |      S )z5Evaluates ``f`` at the given point ``a`` in ``x_j``. r  r   zinvalid variable index %s)r   r   r  r   r   
ValueError	_eval_lev_evalr   ar  s      r   evalzDMP.eval  sg    !S!6a@AAq/AEE/81<==55;;q!$$771:r   c                    t         r   r   r   r  s     r   r  z	DMP._eval  r   r   c                    t         r   r   r  s      r   r
  zDMP._eval_lev  r   r   c                z    | j                  |      \  }}|j                  rt        d      |j                  |      S )2Half extended Euclidean algorithm, if univariate. univariate polynomial expected)r   r   r	  _half_gcdexru  s       r   
half_gcdexzDMP.half_gcdex  s5    {{1~155=>>}}Qr   c                    t         r   r   r  s     r   r  zDMP._half_gcdex  r   r   c                    | j                  |      \  }}|j                  rt        d      |j                  j                  st        d      |j                  |      S )-Extended Euclidean algorithm, if univariate. r  zground domain must be a field)r   r   r	  r   is_Fieldr   _gcdexru  s       r   gcdexz	DMP.gcdex  sK    {{1~155=>>uu~~=>>xx{r   c                    t         r   r   r  s     r   r  z
DMP._gcdex  r   r   c                z    | j                  |      \  }}|j                  rt        d      |j                  |      S )(Invert ``f`` modulo ``g``, if possible. r  )r   r   r	  _invertru  s       r   invertz
DMP.invert  s4    {{1~155=>>yy|r   c                    t         r   r   r  s     r   r   zDMP._invert  r   r   c                R    | j                   rt        d      | j                  |      S )"Compute ``f**(-1)`` mod ``x**n``. r  )r   r	  _revertr  s     r   revertz
DMP.revert  s#    55=>>yy|r   c                    t         r   r   r  s     r   r%  zDMP._revert  r   r   c                L    | j                  |      \  }}|j                  |      S z7Computes subresultant PRS sequence of ``f`` and ``g``. )r   _subresultantsru  s       r   subresultantszDMP.subresultants  s$    {{1~1""r   c                    t         r   r   r  s     r   r*  zDMP._subresultants   r   r   c                r    | j                  |      \  }}|r|j                  |      S |j                  |      S /Computes resultant of ``f`` and ``g`` via PRS. )r   _resultant_includePRS
_resultant)r   r   
includePRSrI  rv  s        r   	resultantzDMP.resultant#  s5    {{1~1**1--<<?"r   c                    t         r   r   )r   r   r2  s      r   r1  zDMP._resultant+  r   r   c                    t          Computes discriminant of ``f``. r   r   s    r   discriminantzDMP.discriminant.  r   r   c                L    | j                  |      \  }}|j                  |      S z4Returns GCD of ``f`` and ``g`` and their cofactors. )r   
_cofactorsru  s       r   	cofactorszDMP.cofactors2  s!    {{1~1||Ar   c                    t         r   r   r  s     r   r;  zDMP._cofactors7  r   r   c                L    | j                  |      \  }}|j                  |      S z+Returns polynomial GCD of ``f`` and ``g``. )r   _gcdru  s       r   gcdzDMP.gcd:  rx  r   c                    t         r   r   r  s     r   r@  zDMP._gcd?  r   r   c                L    | j                  |      \  }}|j                  |      S +Returns polynomial LCM of ``f`` and ``g``. )r   _lcmru  s       r   lcmzDMP.lcmB  rx  r   c                    t         r   r   r  s     r   rF  zDMP._lcmG  r   r   c                r    | j                  |      \  }}|r|j                  |      S |j                  |      S 6Cancel common factors in a rational function ``f/g``. )r   _cancel_include_cancel)r   r   includerI  rv  s        r   cancelz
DMP.cancelJ  s5    {{1~1$$Q''99Q<r   c                    t         r   r   r  s     r   rM  zDMP._cancelS  r   r   c                    t         r   r   r  s     r   rL  zDMP._cancel_includeV  r   r   c                V    | j                  | j                  j                  |            S z&Reduce ``f`` modulo a constant ``p``. )_truncr   r   r   ps     r   truncz	DMP.truncY  s    xxa())r   c                    t         r   r   rU  s     r   rT  z
DMP._trunc]  r   r   c                    t         z'Divides all coefficients by ``LC(f)``. r   r   s    r   monicz	DMP.monic`  r   r   c                    t         z(Returns GCD of polynomial coefficients. r   r   s    r   contentzDMP.contentd  r   r   c                    t         z/Returns content and a primitive form of ``f``. r   r   s    r   	primitivezDMP.primitiveh  r   r   c                L    | j                  |      \  }}|j                  |      S z4Computes functional composition of ``f`` and ``g``. )r   _composeru  s       r   composezDMP.composel  s!    {{1~1zz!}r   c                    t         r   r   r  s     r   rd  zDMP._composeq  r   r   c                P    | j                   rt        d      | j                         S ),Computes functional decomposition of ``f``. r  )r   r	  
_decomposer   s    r   	decomposezDMP.decomposet  s!    55=>>||~r   c                    t         r   r   r   s    r   ri  zDMP._decompose{  r   r   c                    | j                   rt        d      | j                  | j                  j	                  |            S )/Efficiently compute Taylor shift ``f(x + a)``. r  )r   r	  _shiftr   r   r  s     r   shiftz	DMP.shift~  s1    55=>>xxa())r   c                ~    |D cg c]  }| j                   j                  |       }}| j                  |      S c c}w z/Efficiently compute Taylor shift ``f(X + A)``. )r   r   _shift_list)r   r  ais      r   
shift_listzDMP.shift_list  s6    )*+2QUU]]2++}}Q ,s   ":c                    t         r   r   r  s     r   rn  z
DMP._shift  r   r   c                    | j                   rt        d      |j                  |      \  }}| j                  |      \  }}|j                  |      \  }}|j                  ||      S )5Evaluate functional transformation ``q**n * f(p/q)``.r  )r   r	  r   
_transform)r   rV  qrO  QrI  s         r   	transformzDMP.transform  sY    55=>>{{1~1{{1~1{{1~1||Aq!!r   c                    t         r   r   r   rV  ry  s      r   rx  zDMP._transform  r   r   c                P    | j                   rt        d      | j                         S )&Computes the Sturm sequence of ``f``. r  )r   r	  _sturmr   s    r   sturmz	DMP.sturm  s!    55=>>xxzr   c                    t         r   r   r   s    r   r  z
DMP._sturm  r   r   c                P    | j                   rt        d      | j                         S )7Computes the Cauchy upper bound on the roots of ``f``. r  )r   r	  _cauchy_upper_boundr   s    r   cauchy_upper_boundzDMP.cauchy_upper_bound  $    55=>>$$&&r   c                    t         r   r   r   s    r   r  zDMP._cauchy_upper_bound  r   r   c                P    | j                   rt        d      | j                         S )?Computes the Cauchy lower bound on the nonzero roots of ``f``. r  )r   r	  _cauchy_lower_boundr   s    r   cauchy_lower_boundzDMP.cauchy_lower_bound  r  r   c                    t         r   r   r   s    r   r  zDMP._cauchy_lower_bound  r   r   c                P    | j                   rt        d      | j                         S )BComputes the squared Mignotte bound on root separations of ``f``. r  )r   r	  _mignotte_sep_bound_squaredr   s    r   mignotte_sep_bound_squaredzDMP.mignotte_sep_bound_squared  s$    55=>>,,..r   c                    t         r   r   r   s    r   r  zDMP._mignotte_sep_bound_squared  r   r   c                P    | j                   rt        d      | j                         S )4Computes greatest factorial factorization of ``f``. r  )r   r	  	_gff_listr   s    r   gff_listzDMP.gff_list  s!    55=>>{{}r   c                    t         r   r   r   s    r   r  zDMP._gff_list  r   r   c                    t         zComputes ``Norm(f)``.r   r   s    r   normzDMP.norm  r   r   c                    t         z$Computes square-free norm of ``f``. r   r   s    r   sqf_normzDMP.sqf_norm  r   r   c                    t         z$Computes square-free part of ``f``. r   r   s    r   sqf_partzDMP.sqf_part  r   r   c                    t         0Returns a list of square-free factors of ``f``. r   r   r   s     r   sqf_listzDMP.sqf_list  r   r   c                    t         r  r   r  s     r   sqf_list_includezDMP.sqf_list_include  r   r   c                    t         0Returns a list of irreducible factors of ``f``. r   r   s    r   factor_listzDMP.factor_list  r   r   c                    t         r  r   r   s    r   factor_list_includezDMP.factor_list_include  r   r   c                    | j                   rt        d      |r|r| j                  ||||      S |r|s| j                  ||||      S |s|r| j	                  ||||      S | j                  ||||      S )z0Compute isolating intervals for roots of ``f``. z1Cannot isolate roots of a multivariate polynomialepsinfsupfast)r   r{   _isolate_all_roots_sqf_isolate_all_roots_isolate_real_roots_sqf_isolate_real_roots)r   r   r  r  r  r  sqfs          r   	intervalszDMP.intervals  s    55!"UVV3++#D+QQ''CSc'MM,,#3T,RR((Scs(NNr   c                    t         r   r   r   r  r  r  r  s        r   r  zDMP._isolate_all_roots  r   r   c                    t         r   r   r  s        r   r  zDMP._isolate_all_roots_sqf  r   r   c                    t         r   r   r  s        r   r  zDMP._isolate_real_roots  r   r   c                    t         r   r   r  s        r   r  zDMP._isolate_real_roots_sqf   r   r   c                \    | j                   rt        d      | j                  |||||      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   r{   _refine_real_rootr   r  tr  r  r  s         r   refine_rootzDMP.refine_root  s;     55!CE E ""1aSD"IIr   c                    t         r   r   r  s         r   r  zDMP._refine_real_root  r   r   c                    t         )<Return the number of real roots of ``f`` in ``[inf, sup]``. r   r   r  r  s      r   count_real_rootszDMP.count_real_roots  r   r   c                    t         )?Return the number of complex roots of ``f`` in ``[inf, sup]``. r   r  s      r   count_complex_rootszDMP.count_complex_roots  r   r   c                    t         z0Returns ``True`` if ``f`` is a zero polynomial. r   r   s    r   r!  zDMP.is_zero  
     "!r   c                    t         z0Returns ``True`` if ``f`` is a unit polynomial. r   r   s    r   is_onez
DMP.is_one   r  r   c                    t         >Returns ``True`` if ``f`` is an element of the ground domain. r   r   s    r   	is_groundzDMP.is_ground%  r  r   c                    t         z7Returns ``True`` if ``f`` is a square-free polynomial. r   r   s    r   is_sqfz
DMP.is_sqf*  r  r   c                    t         z=Returns ``True`` if the leading coefficient of ``f`` is one. r   r   s    r   is_moniczDMP.is_monic/  r  r   c                    t         zAReturns ``True`` if the GCD of the coefficients of ``f`` is one. r   r   s    r   is_primitivezDMP.is_primitive4  r  r   c                    t         ):Returns ``True`` if ``f`` is linear in all its variables. r   r   s    r   	is_linearzDMP.is_linear9  r  r   c                    t         )=Returns ``True`` if ``f`` is quadratic in all its variables. r   r   s    r   is_quadraticzDMP.is_quadratic>  r  r   c                    t         8Returns ``True`` if ``f`` is zero or has only one term. r   r   s    r   is_monomialzDMP.is_monomialC  r  r   c                    t         7Returns ``True`` if ``f`` is a homogeneous polynomial. r   r   s    r   is_homogeneouszDMP.is_homogeneousH  r  r   c                    t         z:Returns ``True`` if ``f`` has no factors over its domain. r   r   s    r   is_irreduciblezDMP.is_irreducibleM  r  r   c                    t         6Returns ``True`` if ``f`` is a cyclotomic polynomial. r   r   s    r   is_cyclotomiczDMP.is_cyclotomicR  r  r   c                "    | j                         S r   )rW  r   s    r   __abs__zDMP.__abs__W      uuwr   c                "    | j                         S r   r[  r   s    r   __neg__zDMP.__neg__Z  r  r   c                    t        |t              r| j                  |      S 	 | j                  |      S # t        $ r	 t
        cY S w xY wr   )r   r   rw  r`  r   NotImplementedr  s     r   __add__zDMP.__add__]  A    a558O&||A&! &%%&   4 AAc                $    | j                  |      S r   r  r  s     r   __radd__zDMP.__radd__f      yy|r   c                    t        |t              r| j                  |      S 	 | j                  |      S # t        $ r	 t
        cY S w xY wr   )r   r   r|  re  r   r  r  s     r   __sub__zDMP.__sub__i  r  r   c                &    |  j                  |      S r   r  r  s     r   __rsub__zDMP.__rsub__r      ||Ar   c                    t        |t              r| j                  |      S 	 | j                  |      S # t        $ r	 t
        cY S w xY wr   )r   r   r  ri  r   r  r  s     r   __mul__zDMP.__mul__u  r  r   c                $    | j                  |      S r   r  r  s     r   __rmul__zDMP.__rmul__~  r  r   c                    t        |t              r| j                  |      S 	 | j                  |      S # t        $ r	 t
        cY S w xY wr   )r   r   r  ri  r   r  r  s     r   __truediv__zDMP.__truediv__  sB    a771:&||A&! &%%&r   c                    t        |t              r|j                  |       S 	 | j                         j	                  |      j                  |       S # t
        $ r	 t        cY S w xY wr   )r   r   r  r   ri  r   r  r  s     r   __rtruediv__zDMP.__rtruediv__  sV    a771:&vvx**1-33A66! &%%&s   -A A#"A#c                $    | j                  |      S r   r  r  s     r   __pow__zDMP.__pow__      uuQxr   c                $    | j                  |      S r   r  r  s     r   
__divmod__zDMP.__divmod__  r  r   c                $    | j                  |      S r   r  r  s     r   __mod__zDMP.__mod__  r  r   c                    t        |t              r| j                  |      S 	 | j                  |      S # t        $ r	 t
        cY S w xY wr   )r   r   r  rm  r  r  r  s     r   __floordiv__zDMP.__floordiv__  sA    a558O&||A& &%%&r   c                    | |u ryt        |t              st        S 	 | j                  |      \  }}|j	                  |      S # t
        $ r Y yw xY w)NTF)r   r   r  r   
_strict_eqrz   ru  s       r   __eq__z
DMP.__eq__  sV    6!S!!!	#;;q>DAq <<?" ! 		s   A 	AAc                    t         r   r   r  s     r   r   zDMP._strict_eq  r   r   c                2    |s| |k(  S | j                  |      S r   )r   r   r   stricts      r   eqzDMP.eq  s    6M<<?"r   c                *    | j                  ||       S )N)r%  )r&  r$  s      r   nezDMP.ne  s    44&4)))r   c                l    | j                  |      \  }}|j                         |j                         k  S r   r   r   ru  s       r   __lt__z
DMP.__lt__  *    {{1~1yy{QYY[((r   c                l    | j                  |      \  }}|j                         |j                         k  S r   r*  ru  s       r   __le__z
DMP.__le__  *    {{1~1yy{aiik))r   c                l    | j                  |      \  }}|j                         |j                         kD  S r   r*  ru  s       r   __gt__z
DMP.__gt__  r,  r   c                l    | j                  |      \  }}|j                         |j                         k\  S r   r*  ru  s       r   __ge__z
DMP.__ge__  r/  r   c                    | j                    S r   )r!  r   s    r   __bool__zDMP.__bool__  s    99}r   r   Fr   r   r   T)FNNNFF)NNFNN)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.  r0  r4  r3  r9  r?  rD  rJ  rF  rP  rM  rT  rW  r[  r`  re  ri  rm  rq  rw  r|  r  r  r  r  r  r  r  r  r  r  r  r^  rd  rh  rl  rp  rt  r{  r  r  r  r  r  r  r  r  r  r  r  r*  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r!  r   r&  r%  r+  r*  r3  r1  r8  r<  r;  rA  r@  rG  rF  rO  rM  rL  rW  rT  r[  r^  ra  re  rd  rj  ri  ro  rt  rn  r{  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r  r  r  r  r  r  r  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  r3  r5  r~   r   r   r   r      sH   3I& 	. 	.   
   & & C C @ @ > >3&" , , 0 0"IH2"
A0""+,,)""66)"%
C
H#""""&"&""""////1










"""""""""""""""""""""E& ""?""""""""
"" "
"""#
"#""
"
"
" ""*""""
""* 
"	"""'"'"/"""""""""O""""J""" " " " " " " " " " " " " " " " " " " " " " " " "&&&&&&
#"#*)*)*r   r   c                  ,   e Zd ZdZdZed        Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd ZdodZd Zd ZdpdZdpdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-dqd,Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7drd6Z8drd7Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdB ZDdC ZEdD ZFdE ZGdF ZHdG ZIdH ZJdI ZKdJ ZLdK ZMdL ZNdM ZOdN ZPdO ZQdP ZRdQ ZSdR ZTdS ZUdT ZVdU ZWdV ZXdW ZYdpdXZZdpdYZ[dZ Z\d[ Z]d\ Z^d] Z_d^ Z`d_ Zad` ZbdsdaZcdsdbZdeedc        Zfeedd        Zgeede        Zheedf        Zieedg        Zjeedh        Zkeedi        Zleedj        Zmeedk        Zneedl        Zoeedm        Zpeedn        Zqy)tr   r   )r   r   r   c                Z    t         j                  |       }||_        ||_        ||_        |S r   )objectr   r   r   r   )r   r   r   r   objs        r   r   zDMP_Python._new  s*    nnS!
r   c                    t        |       t        |      k7  ry| j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S NF)r   r   r   r   r  s     r   r   zDMP_Python._strict_eq  sJ    7d1guu~E!%%155.EQVVqvv5EEr   c                P    | j                  || j                  | j                        S ).Create a DMP out of the given representation. )r   r   r   r   r   s     r   perzDMP_Python.per  s    vvc155!%%((r   c                x    | j                  t        || j                        | j                  | j                        S r   )r   r    r   r   r   s     r   r   zDMP_Python.ground_new  s(    vvj.quu==r   c                N    | j                  | j                  | j                        S r   )r   r   r   r   s    r   r   zDMP_Python._one  s    uuQUUAEE""r   c                (    t        |t              r j                  |j                  k7  rt        d d|       j                  |j                  k(  r9 j                   j                   j
                   j                  |j                  fS  j                   j                  j                  |j                        ct         j                   j                        }t        |j                  |j                        } fd}|||fS )z7Unify representations of two multivariate polynomials. r   r   c                *    j                  |       S r   )r   )r   r   r   r   s    r   rI  zDMP_Python.unify.<locals>.per  s    vvc3,,r   )	r   r   r   rz   r   rI  r   r   r   )r   r   rI  rv  rI  r   r   s   `    @@r   r   zDMP_Python.unify  s     !S!QUUaee^#A$FGG55AEE>55!%%66uuaeekk!%%0HCAFFC4AAFFC4A- S!Q&&r   c                l    t         j                  | j                  | j                  | j                        S )z)Convert ``f`` to a Flint representation. )r   r   r   r   r   r   s    r   r   zDMP_Python.to_DUP_Flint  s!    ~~affaeeQUU33r   c                ,    t        | j                        S r   )r   r   r   s    r   r   zDMP_Python.to_list  s    AFF|r   c                B    t        | j                  | j                        S zBConvert ``f`` to a tuple representation with native coefficients. )r1   r   r   r   s    r   r   zDMP_Python.to_tuple
  s    AFFAEE**r   c                    | j                  t        | j                  | j                  | j                  |      || j                        S )$Convert the ground domain of ``f``. )r   r   r   r   r   r   s     r   r   zDMP_Python._convert  s0    vvk!&&!%%<c155IIr   c                    t        | j                  ||| j                        }| j                  || j                  | j                        S r  )r.   r   r   r   r   )r   r  r  r   s       r   r  zDMP_Python._slice  s5    1aee,vvc155!%%((r   c                    t        | j                  |||| j                  | j                        }| j	                  || j                  | j                        S r  )r/   r   r   r   r   )r   r  r  r  r   s        r   r  zDMP_Python._slice_lev  s=    1661aAEE1559vvc155!%%((r   Nc                \    t        | j                  | j                  | j                  |      S )r  r  )r,   r   r   r   r%  s     r   r"  zDMP_Python._terms  s    affaeeQUU%@@r   c                    t        | j                  | j                  | j                        }| j	                  || j                  j                  | j                        S r2  )rY   r   r   r   r   r   r   s     r   r3  zDMP_Python._lift   s;    QVVQUUAEE*vvaAEE**r   c                    t        | j                  | j                  | j                        \  }}|| j	                  |      fS r7  )r(   r   r   r   rI  rG  s      r   r9  zDMP_Python.deflate%  s2    166155!%%01!%%({r   c                    t        | j                  | j                  | j                  |      \  }}| j	                  || j                  j                  |      S )r<  r>  )r)   r   r   r   r   )r   r>  rI  r   s       r   r?  zDMP_Python.inject*  s=    AFFAEE155>3vvaC((r   c                    t        | j                  | j                  ||      }| j                  ||| j                  t	        |j
                        z
        S )rB  r[  )r*   r   r   r   r  symbols)r   r   r>  rI  s       r   rD  zDMP_Python.eject0  s?    affaeeS6vvaaeec#++&6677r   c                    t        | j                  | j                  | j                        \  }}}|| j	                  || j                  |      fS z&Remove useless generators from ``f``. )r-   r   r   r   r   )r   rH  rI  us       r   rF  zDMP_Python._exclude6  s>    affaeeQUU31a!&&AEE1%%%r   c                x    | j                  t        | j                  || j                  | j                              S z6Returns a polynomial in `K[x_{P(1)}, ..., x_{P(n)}]`. )rI  r0   r   r   r   rN  s     r   rM  zDMP_Python._permute<  s(    uu[AEE1559::r   c                    t        | j                  | j                  | j                        \  }}|| j	                  |      fS rS  )r+   r   r   r   rI  rG  s      r   rT  zDMP_Python.terms_gcd@  s2    QVVQUUAEE21!%%({r   c                x    | j                  t        | j                  || j                  | j                              S r]  )rI  r2   r   r   r   r_  s     r   r^  zDMP_Python._add_groundE  (    uu^AFFAquuaee<==r   c                x    | j                  t        | j                  || j                  | j                              S rc  )rI  r3   r   r   r   r_  s     r   rd  zDMP_Python._sub_groundI  re  r   c                x    | j                  t        | j                  || j                  | j                              S rg  )rI  r4   r   r   r   r_  s     r   rh  zDMP_Python._mul_groundM  re  r   c                x    | j                  t        | j                  || j                  | j                              S rk  )rI  r5   r   r   r   r_  s     r   rl  zDMP_Python._quo_groundQ  re  r   c                x    | j                  t        | j                  || j                  | j                              S ro  )rI  r6   r   r   r   r_  s     r   rp  zDMP_Python._exquo_groundU  )    uu%affa>??r   c                v    | j                  t        | j                  | j                  | j                              S rV  )rI  r7   r   r   r   r   s    r   rW  zDMP_Python.absY  &    uuWQVVQUUAEE233r   c                v    | j                  t        | j                  | j                  | j                              S rY  )rI  r8   r   r   r   r   s    r   r[  zDMP_Python.neg]  rl  r   c                    | j                  t        | j                  |j                  | j                  | j                              S rs  )rI  r9   r   r   r   r  s     r   rt  zDMP_Python._adda  ,    uuWQVVQVVQUUAEE:;;r   c                    | j                  t        | j                  |j                  | j                  | j                              S rz  )rI  r:   r   r   r   r  s     r   r{  zDMP_Python._sube  ro  r   c                    | j                  t        | j                  |j                  | j                  | j                              S r~  )rI  r;   r   r   r   r  s     r   r  zDMP_Python._muli  ro  r   c                v    | j                  t        | j                  | j                  | j                              S r  )rI  r<   r   r   r   r   s    r   r  zDMP_Python.sqrm  rl  r   c                x    | j                  t        | j                  || j                  | j                              S r  )rI  r=   r   r   r   r  s     r   r  zDMP_Python._powq  s(    uuWQVVQquu566r   c                    t        | j                  |j                  | j                  | j                        \  }}| j	                  |      | j	                  |      fS r  )r>   r   r   r   rI  r   r   ry  r   s       r   r  zDMP_Python._pdivu  sA    quu51uuQxq!!r   c                    | j                  t        | j                  |j                  | j                  | j                              S r  )rI  r?   r   r   r   r  s     r   r  zDMP_Python._premz  ,    uuXaffaffaeeQUU;<<r   c                    | j                  t        | j                  |j                  | j                  | j                              S r  )rI  r@   r   r   r   r  s     r   r  zDMP_Python._pquo~  rx  r   c                    | j                  t        | j                  |j                  | j                  | j                              S r  )rI  rA   r   r   r   r  s     r   r  zDMP_Python._pexquo  s,    uuZquu=>>r   c                    t        | j                  |j                  | j                  | j                        \  }}| j	                  |      | j	                  |      fS r  )rB   r   r   r   rI  rv  s       r   r  zDMP_Python._div  sA    qvvqvvquuaee41uuQxq!!r   c                    | j                  t        | j                  |j                  | j                  | j                              S r  )rI  rC   r   r   r   r  s     r   r  zDMP_Python._rem  ro  r   c                    | j                  t        | j                  |j                  | j                  | j                              S r  )rI  rD   r   r   r   r  s     r   r  zDMP_Python._quo  ro  r   c                    | j                  t        | j                  |j                  | j                  | j                              S r  )rI  rE   r   r   r   r  s     r   r  zDMP_Python._exquo  s,    uuYqvvqvvquuaee<==r   c                D    t        | j                  || j                        S )r  )r   r   r   r  s     r   r  zDMP_Python._degree  s    QVVQ..r   c                B    t        | j                  | j                        S r  )r   r   r   r   s    r   r  zDMP_Python.degree_list  s    qvvquu--r   c                B    t        d | j                         D              S )r  c              3  2   K   | ]  }t        |        y wr   r  )r   r  s     r   r   z*DMP_Python.total_degree.<locals>.<genexpr>  s     .a3q6.s   )maxr   r   s    r   r  zDMP_Python.total_degree  s    .188:...r   c                X    t        | j                  | j                  | j                        S r  )r   r   r   r   r   s    r   r  zDMP_Python.LC      QVVQUUAEE22r   c                X    t        | j                  | j                  | j                        S r  )r   r   r   r   r   s    r   r  zDMP_Python.TC  r  r   c                Z    t        | j                  || j                  | j                        S r  )r   r   r   r   r  s     r   r  zDMP_Python._nth  s    affa66r   c                X    t        | j                  | j                  | j                        S r  )rH   r   r   r   r   s    r   r  zDMP_Python.max_norm  s    AFFAEE15511r   c                X    t        | j                  | j                  | j                        S r  )rI   r   r   r   r   s    r   r  zDMP_Python.l1_norm  s    166155!%%00r   c                X    t        | j                  | j                  | j                        S r  )rJ   r   r   r   r   s    r   r  zDMP_Python.l2_norm_squared  s    "166155!%%88r   c                    t        | j                  | j                  | j                        \  }}|| j	                  |      fS r  )rK   r   r   r   rI  )r   r   rI  s      r   r  zDMP_Python.clear_denoms  s2    #AFFAEE1559qaeeAhr   c           	     z    | j                  t        | j                  ||| j                  | j                              S )r  )rI  rL   r   r   r   r   s      r   r  zDMP_Python._integrate  s+    uu%affaAEE155ABBr   c           	     z    | j                  t        | j                  ||| j                  | j                              S )r  )rI  rM   r   r   r   r   s      r   r  zDMP_Python._diff  s*    uu[Aquuaee<==r   c                    t        | j                  | j                  j                  |      d| j                  | j                        S r   )rN   r   r   r   r   r  s     r   r  zDMP_Python._eval  s.    166155==#3QquuEEr   c                    t        | j                  | j                  j                  |      || j                  | j                        }| j                  || j                  | j                  dz
        S Nr   )rN   r   r   r   r   r   )r   r  r  r   s       r   r
  zDMP_Python._eval_lev  sL    !&&!%%--"2AquuaeeDuuS!%%++r   c                    t        | j                  |j                  | j                        \  }}| j                  |      | j                  |      fS )r  )rZ   r   r   rI  r   r   r  hs       r   r  zDMP_Python._half_gcdex  s;    affaffaee41uuQxq!!r   c                    t        | j                  |j                  | j                        \  }}}| j                  |      | j                  |      | j                  |      fS )r  )r[   r   r   rI  )r   r   r  r  r  s        r   r  zDMP_Python._gcdex  sG    AFFAFFAEE21auuQxq1558++r   c                z    t        | j                  |j                  | j                        }| j                  |      S )r  )r\   r   r   rI  )r   r   r  s      r   r   zDMP_Python._invert  s)    qvvqvvquu-uuQxr   c                b    | j                  t        | j                  || j                              S r$  )rI  rO   r   r   r  s     r   r%  zDMP_Python._revert  s"    uuZ155122r   c                    t        | j                  |j                  | j                  | j                        }t	        t        | j                  |            S r)  )r]   r   r   r   r   maprI  r   r   Rs      r   r*  zDMP_Python._subresultants  s7    affaffaeeQUU;CqM""r   c                &   t        | j                  |j                  | j                  | j                  d      \  }}| j                  r*| j	                  || j                  | j                  dz
        }|t        t        | j                  |            fS )r/  T)r2  r   )r^   r   r   r   r   r   r  rI  r   r   resr  s       r   r0  z DMP_Python._resultant_includePRS  sg    qvvqvvquuaeeMQ55%%QUUAEEAI.CDQUUA'''r   c                    t        | j                  |j                  | j                  | j                        }| j                  r*| j	                  || j                  | j                  dz
        }|S r  )r^   r   r   r   r   )r   r   r  s      r   r1  zDMP_Python._resultant  sL    AFFAFFAEE155955%%QUUAEEAI.C
r   c                    t        | j                  | j                  | j                        }| j                  r*| j	                  || j                  | j                  dz
        }|S )r7  r   )r_   r   r   r   r   )r   r  s     r   r8  zDMP_Python.discriminant  sF    qvvquuaee455%%QUUAEEAI.C
r   c                    t        | j                  |j                  | j                  | j                        \  }}}| j	                  |      | j	                  |      | j	                  |      fS r:  )r`   r   r   r   rI  )r   r   r  cffcfgs        r   r;  zDMP_Python._cofactors  sM    #AFFAFFAEE155A3uuQxsQUU3Z//r   c                    | j                  t        | j                  |j                  | j                  | j                              S r?  )rI  ra   r   r   r   r  s     r   r@  zDMP_Python._gcd   ro  r   c                    | j                  t        | j                  |j                  | j                  | j                              S rD  )rI  rb   r   r   r   r  s     r   rF  zDMP_Python._lcm  ro  r   c                    t        | j                  |j                  | j                  | j                  d      \  }}}}||| j	                  |      | j	                  |      fS )rK  FrN  rc   r   r   r   rI  r   r   cFcGrI  rv  s         r   rM  zDMP_Python._cancel  sK    !!&&!&&!%%NB12quuQxq))r   c                    t        | j                  |j                  | j                  | j                  d      \  }}| j	                  |      | j	                  |      fS )rK  Tr  r  ru  s       r   rL  zDMP_Python._cancel_include  sC    !&&!&&!%%E1uuQxq!!r   c                x    | j                  t        | j                  || j                  | j                              S rS  )rI  rP   r   r   r   rU  s     r   rT  zDMP_Python._trunc  rj  r   c                v    | j                  t        | j                  | j                  | j                              S rZ  )rI  rS   r   r   r   r   s    r   r[  zDMP_Python.monic  s'    uu%affaeeQUU;<<r   c                X    t        | j                  | j                  | j                        S r]  )rQ   r   r   r   r   s    r   r^  zDMP_Python.content  s    !!&&!%%77r   c                    t        | j                  | j                  | j                        \  }}|| j	                  |      fS r`  )rR   r   r   r   rI  )r   contrI  s      r   ra  zDMP_Python.primitive  s2    &qvvquuaee<aQUU1X~r   c                    | j                  t        | j                  |j                  | j                  | j                              S rc  )rI  rT   r   r   r   r  s     r   rd  zDMP_Python._compose#  s,    uu[>??r   c           	     |    t        t        | j                  t        | j                  | j
                                    S rh  )r   r  rI  rU   r   r   r   s    r   ri  zDMP_Python._decompose'  s'    C}QVVQUU;<==r   c                b    | j                  t        | j                  || j                              S rm  )rI  rV   r   r   r  s     r   rn  zDMP_Python._shift+  s"    uuYqvvq!%%011r   c                x    | j                  t        | j                  || j                  | j                              S rq  )rI  rW   r   r   r   r  s     r   rr  zDMP_Python._shift_list/  s(    uuYqvvq!%%788r   c                    | j                  t        | j                  |j                  |j                  | j                              S rw  )rI  rX   r   r   r}  s      r   rx  zDMP_Python._transform3  s,    uu]166166166155ABBr   c           	     |    t        t        | j                  t        | j                  | j
                                    S r  )r   r  rI  rv   r   r   r   s    r   r  zDMP_Python._sturm7  s'    Cy7899r   c                B    t        | j                  | j                        S r  )rw   r   r   r   s    r   r  zDMP_Python._cauchy_upper_bound;      %affaee44r   c                B    t        | j                  | j                        S r  )rx   r   r   r   s    r   r  zDMP_Python._cauchy_lower_bound?  r  r   c                B    t        | j                  | j                        S r  )ry   r   r   r   s    r   r  z&DMP_Python._mignotte_sep_bound_squaredC  s    -affaee<<r   c                    t        | j                  | j                        D cg c]  \  }}| j                  |      |f c}}S c c}}w r  )rd   r   r   rI  )r   r   r   s      r   r  zDMP_Python._gff_listG  s5    +7+FH41a!%%(AHHHs   Ac                    t        | j                  | j                  | j                        }| j	                  || j                  j                  | j                        S r  )re   r   r   r   r   rX  s     r   r  zDMP_Python.normK  s;    QVVQUUAEE*uuQ		155))r   c                    t        | j                  | j                  | j                        \  }}}|| j	                  |      | j                  || j                  j                  | j                        fS r  )rg   r   r   r   rI  r   )r   r  r   r   s       r   r  zDMP_Python.sqf_normP  sP    qvvquuaee41a!%%(AEE!QUUYY666r   c                v    | j                  t        | j                  | j                  | j                              S r  )rI  rh   r   r   r   r   s    r   r  zDMP_Python.sqf_partU  s&    uu\!&&!%%788r   c                    t        | j                  | j                  | j                  |      \  }}||D cg c]  \  }}| j	                  |      |f c}}fS c c}}w r  )ri   r   r   r   rI  r   r   r   factorsr   r   s         r   r  zDMP_Python.sqf_listY  sK    %affaeeQUUC@w';$!Qq1;;;;s   Ac                    t        | j                  | j                  | j                  |      }|D cg c]  \  }}| j	                  |      |f c}}S c c}}w r  )rj   r   r   r   rI  r   r   r  r   r   s        r   r  zDMP_Python.sqf_list_include^  sB    &qvvquuaeeSA+2441a!%%(A444s   Ac                    t        | j                  | j                  | j                        \  }}||D cg c]  \  }}| j	                  |      |f c}}fS c c}}w r  )rm   r   r   r   rI  )r   r   r  r   r   s        r   r  zDMP_Python.factor_listc  sI    (>w';$!Qq1;;;;s   Ac                    t        | j                  | j                  | j                        }|D cg c]  \  }}| j	                  |      |f c}}S c c}}w r  )rn   r   r   r   rI  r   r  r   r   s       r   r  zDMP_Python.factor_list_includeh  s@    )!&&!%%?+2441a!%%(A444s   Ac                L    t        | j                  | j                  ||||      S Nr  )rp   r   r   r  s        r   r  zDMP_Python._isolate_real_rootsm  s     %affaee#3UYZZr   c                L    t        | j                  | j                  ||||      S r  )ro   r   r   r  s        r   r  z"DMP_Python._isolate_real_roots_sqfp  s     )!&&!%%ScsY]^^r   c                L    t        | j                  | j                  ||||      S r  )rr   r   r   r  s        r   r  zDMP_Python._isolate_all_rootss  s     $QVVQUU#TXYYr   c                L    t        | j                  | j                  ||||      S r  )rq   r   r   r  s        r   r  z!DMP_Python._isolate_all_roots_sqfv  s     (CScX\]]r   c           	     N    t        | j                  ||| j                  |||      S )Nr  )rs   r   r   r  s         r   r  zDMP_Python._refine_real_rooty  s"    #AFFAq!%%STXYYr   c                H    t        | j                  | j                  ||      S r  r  r  )rt   r   r   r  s      r   r  zDMP_Python.count_real_roots|  s    #AFFAEEsDDr   c                H    t        | j                  | j                  ||      S r  r  )ru   r   r   r  s      r   r  zDMP_Python.count_complex_roots  s    &qvvquu#3GGr   c                B    t        | j                  | j                        S r  )r"   r   r   r   s    r   r!  zDMP_Python.is_zero  s     !&&!%%((r   c                X    t        | j                  | j                  | j                        S r  )r#   r   r   r   r   s    r   r  zDMP_Python.is_one       ..r   c                D    t        | j                  d| j                        S )r  N)r$   r   r   r   s    r   r  zDMP_Python.is_ground  s     AFFD!%%00r   c                X    t        | j                  | j                  | j                        S r  )rf   r   r   r   r   s    r   r  zDMP_Python.is_sqf  r  r   c                    | j                   j                  t        | j                  | j                  | j                               S r  )r   r  r   r   r   r   s    r   r  zDMP_Python.is_monic  s,     uu||M!&&!%%?@@r   c                    | j                   j                  t        | j                  | j                  | j                               S r  )r   r  rQ   r   r   r   s    r   r  zDMP_Python.is_primitive  s-     uu||.qvvquuaeeDEEr   c                    t        d t        | j                  | j                  | j                        j                         D              S )r  c              3  8   K   | ]  }t        |      d k    yw)r   Nr  r   r  s     r   r   z'DMP_Python.is_linear.<locals>.<genexpr>       Yu3u:?Y   r   r'   r   r   r   keysr   s    r   r  zDMP_Python.is_linear  3     YAFFAEE1550Q0V0V0XYYYr   c                    t        d t        | j                  | j                  | j                        j                         D              S )r  c              3  8   K   | ]  }t        |      d k    yw)   Nr  r  s     r   r   z*DMP_Python.is_quadratic.<locals>.<genexpr>  r  r  r  r   s    r   r  zDMP_Python.is_quadratic  r  r   c                :    t        | j                               dk  S )r  r   )r  r   r   s    r   r  zDMP_Python.is_monomial  s     199;1$$r   c                &    | j                         duS )r  N)r  r   s    r   r  zDMP_Python.is_homogeneous  s     ""$D00r   c                X    t        | j                  | j                  | j                        S r  )rl   r   r   r   r   s    r   r  zDMP_Python.is_irreducible  s     !66r   c                \    | j                   s t        | j                  | j                        S y)r  F)r   rk   r   r   r   s    r   r  zDMP_Python.is_cyclotomic  s#     uu#AFFAEE22r   r   r6  r   r7  r9  )rr   r:  r;  r<  r=  r>  r   r   rI  r   r   r   r   r   r   r   r  r  r"  r3  r9  r?  rD  rF  rM  rT  r^  rd  rh  rl  rp  rW  r[  rt  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r   r%  r*  r0  r1  r8  r;  r@  rF  rM  rL  rT  r[  r^  ra  rd  ri  rn  rr  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r?  r!  r  r  r  r  r  r  r  r  r  r  r  r~   r   r   r   r     s   3&I F
)>#'(4+J)
)
A+

)8&;
>>>>@44<<<47"
==?"
<<>/./337219
C>F,"
,

3#
(0
<<*
"
@=8
@>29C:55=I*
7
9<
5
<
5
[_Z^ZEH ) ) / / 1 1 / / A A F F Z Z Z Z % % 1 1 7 7  r   r   c                  `   e Zd ZdZdZdZd Zed        Zd Z	ed        Z
ed        Zed	        Zd
 Zd Zd Zd Zd Zd Zd Zd Zd ZdsdZd Zd ZdtdZdtdZd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1dud0Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;dvd:Z<dvd;Z=d< Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdB ZDdC ZEdD ZFdE ZGdF ZHdG ZIdH ZJdI ZKdJ ZLdK ZMdL ZNdM ZOdN ZPdO ZQdP ZRdQ ZSdR ZTdS ZUdT ZVdU ZWdV ZXdW ZYdX ZZdY Z[dZ Z\dtd[Z]dtd\Z^d] Z_d^ Z`d_ Zad` Zbda Zcdb Zddc Zedd ZfdwdeZgdwdfZheidg        Zjeidh        Zkeidi        Zleidj        Zmeidk        Zneidl        Zoeidm        Zpeidn        Zqeido        Zreidp        Zseidq        Zteidr        Zuy)xr   r   r   )r   r   _clsc                h    | j                   | j                         | j                  | j                  ffS r   )r   r   r   r   r   s    r   
__reduce__zDUP_Flint.__reduce__  s&    ~~$((CCCr   c                X    | j                  |d d d   ||      }| j                  ||      S N)_flint_polyfrom_repr   s       r   r   zDUP_Flint._new  s-    ooc$B$ic2||C%%r   c                B    | j                   j                         ddd   S )r   Nr  )r   r   r   s    r   r   zDUP_Flint.to_list  s    vv}}tt$$r   c                V    |t         v sJ |dk(  sJ | j                  |      } ||      S r   )r|   _get_flint_poly_cls)r   r   r   r   	flint_clss        r   r  zDUP_Flint._flint_poly  s5    n$$$axx++C0	~r   c                    |j                   rt        j                  S |j                  rt        j                  S t        d|z        )N%Domain %s is not supported with flint)is_ZZr}   	fmpz_polyis_QQ	fmpq_polyr   )r   r   s     r   r  zDUP_Flint._get_flint_poly_cls  s5    99??"YY??"FLMMr   c                Z   |j                   r-t        |t        j                        sJ t        j                  }nG|j                  r-t        |t        j
                        sJ t        j
                  }nt        d|z        t        j                  |       }||_	        ||_
        ||_        |S )z,Create a DMP from the given representation. r  )r  r   r}   r  r  r  r   rB  r   r   r   r  )r   r   r   r  rC  s        r   r  zDUP_Flint.from_rep  s     99c5??333??DYYc5??333??DFLMMnnS!
r   c                    t        |       t        |      k7  ry| j                  |j                  k(  xr | j                  |j                  k(  S rE  )r   r   r   r  s     r   r   zDUP_Flint._strict_eq  s9    7d1guu~2!&&AFF"22r   c                Z    | j                  | j                  |g      | j                        S r   r  r  r   r   s     r   r   zDUP_Flint.ground_new   s!    zz!&&%/15511r   c                L    | j                  | j                  j                        S r   )r   r   r   r   s    r   r   zDUP_Flint._one  s    ||AEEII&&r   c                    t         )z*Unify representations of two polynomials. )r   r  s     r   r   zDUP_Flint.unify  s    r   c                t    t         j                  | j                         | j                  | j                        S )z1Convert ``f`` to a Python native representation. )r   r   r   r   r   r   s    r   r   zDUP_Flint.to_DMP_Python  s#    qyy{AEE15599r   c                4    t        | j                               S rQ  )r  r   r   s    r   r   zDUP_Flint.to_tuple  s    QYY[!!r   c                `   |t         k(  rB| j                  t        k(  r/| j                  t	        j
                  | j                        |      S |t        k(  r@| j                  t         k(  r-| j                         j                  |      j                         S t        d| j                   d|       )rS  zDUP_Flint: Cannot convert z to )r   r   r   r  r}   r  r   r   r   r   r   r   s     r   r   zDUP_Flint._convert  s    "9"::eooaff5s;;BY155B;??$--c2??AA!;AEE7$seLMMr   c                    | j                   j                         || }| j                  | j                  |      | j                        S r  )r   r   r  r  r   )r   r  r  r   s       r   r  zDUP_Flint._slice  s5    1%zz!&&.!%%00r   c                    t         r  r   r  s       r   r  zDUP_Flint._slice_lev"  r  r   Nc                    ||j                   dk(  rCt        | j                  j                               D cg c]  \  }}|s	|f|f }}}|ddd   S | j	                         j                  |      S c c}}w )r  Nlexr  r  )aliasr+  r   r   r   r"  )r   r  r  r   r  s        r   r"  zDUP_Flint._terms'  sq    =EKK50,5affmmo,FMDAq!tQiMEM2; ??$++%+88 Ns   
A5A5c                    t         r2  r   r   s    r   r3  zDUP_Flint._lift5  r  r   c                    | j                   rd| fS | j                  j                         \  }}|f| j                  || j                        fS )r8  )r   )r!  r   	deflationr  r   )r   r   r  s      r   r9  zDUP_Flint.deflate:  sF     997Nvv!1tQZZ155)))r   c                    t         r;  r   r=  s     r   r?  zDUP_Flint.injectG  r  r   c                    t         rA  r   rC  s      r   rD  zDUP_Flint.ejectL  r  r   c                    t         r_  r   r   s    r   rF  zDUP_Flint._excludeQ  r  r   c                    t         rb  r   rN  s     r   rM  zDUP_Flint._permuteV  r  r   c                h    | j                         j                         \  }}||j                         fS rS  )r   rT  r   rG  s      r   rT  zDUP_Flint.terms_gcd[  s/      **,1!.."""r   c                T    | j                  | j                  |z   | j                        S r]  r  r   r   r_  s     r   r^  zDUP_Flint._add_grounda      zz!&&1*aee,,r   c                T    | j                  | j                  |z
  | j                        S rc  r  r_  s     r   rd  zDUP_Flint._sub_grounde  r  r   c                T    | j                  | j                  |z  | j                        S rg  r  r_  s     r   rh  zDUP_Flint._mul_groundi  r  r   c                T    | j                  | j                  |z  | j                        S rk  r  r_  s     r   rl  zDUP_Flint._quo_groundm      zz!&&A+quu--r   c                    t        | j                  |      \  }}|rt        | |      | j                  || j                        S ro  )divmodr   r   r  r   )r   r   ry  r   s       r   rp  zDUP_Flint._exquo_groundq  s;    affa 1%a++zz!QUU##r   c                Z    | j                         j                         j                         S rV  )r   rW  r   r   s    r   rW  zDUP_Flint.absx  s!     $$&3355r   c                P    | j                  | j                   | j                        S rY  r  r   s    r   r[  zDUP_Flint.neg|  s    zz166'155))r   c                h    | j                  | j                  |j                  z   | j                        S rs  r  r  s     r   rt  zDUP_Flint._add  #    zz!&&166/15511r   c                h    | j                  | j                  |j                  z
  | j                        S rz  r  r  s     r   r{  zDUP_Flint._sub  r(  r   c                h    | j                  | j                  |j                  z  | j                        S r~  r  r  s     r   r  zDUP_Flint._mul  r(  r   c                T    | j                  | j                  dz  | j                        S )r  r  r  r   s    r   r  zDUP_Flint.sqr  r"  r   c                T    | j                  | j                  |z  | j                        S rt  r  r  s     r   r  zDUP_Flint._pow  r"  r   c                (   | j                         |j                         z
  dz   }t        |j                         |z  | j                  z  |j                        \  }}| j	                  || j
                        | j	                  || j
                        fS )r  r   )r*  r$  r  r   r  r   r   r   r  ry  r   s        r   r  zDUP_Flint._pdiv  sm    HHJ#a'addfai!&&(!&&11zz!QUU#QZZ155%999r   c                    | j                         |j                         z
  dz   }|j                         |z  | j                  z  |j                  z  }| j                  || j                        S )r  r   r*  r  r   r  r   )r   r   r  ry  s       r   r  zDUP_Flint._prem  sS    HHJ#a'TTVQY166)zz!QUU##r   c                    | j                         |j                         z
  dz   }|j                         |z  | j                  z  |j                  z  }| j                  || j                        S )r  r   r0  )r   r   r  r   s       r   r  zDUP_Flint._pquo  sS    HHJ#a'TTVQYAFF*zz!QUU##r   c                   | j                         |j                         z
  dz   }t        |j                         |z  | j                  z  |j                        \  }}|rt	        | |      | j                  || j                        S )r  r   )r*  r$  r  r   r   r  r   r.  s        r   r  zDUP_Flint._pexquo  si    HHJ#a'addfai!&&(!&&11%a++zz!QUU##r   c                   | j                   j                  r[t        | j                  |j                        \  }}| j	                  || j                         | j	                  || j                         fS | j                         j                  |j                               \  }}|j                         |j                         fS r  )r   r  r$  r   r  r   r  r   rv  s       r   r  zDUP_Flint._div  s    55>>!&&!&&)DAq::a'Aquu)=== ??$))!//*;<DAq>>#Q^^%555r   c                h    | j                  | j                  |j                  z  | j                        S r  r  r  s     r   r  zDUP_Flint._rem  r(  r   c                h    | j                  | j                  |j                  z  | j                        S r  r  r  s     r   r  zDUP_Flint._quo  s$    zz!&&AFF*AEE22r   c                J    | j                  |      \  }}|rt        | |      |S r  )r  r   rv  s       r   r  zDUP_Flint._exquo  s(    vvay1%a++r   c                P    | j                   j                         }|dk(  rt        }|S )r  r  )r   r*  r   )r   r  r  s      r   r  zDUP_Flint._degree  s"    FFMMO7Ar   c                $    | j                         fS r  r  r   s    r   r  zDUP_Flint.degree_list  s    r   c                "    | j                         S r  r9  r   s    r   r  zDUP_Flint.total_degree  s    yy{r   c                P    | j                   | j                   j                            S r  r   r*  r   s    r   r  zDUP_Flint.LC  s    vvaffmmo&&r   c                     | j                   d   S )r  r   r   r   s    r   r  zDUP_Flint.TC  s    vvayr   c                (    |\  }| j                   |   S r  r>  )r   r  r  s      r   r  zDUP_Flint._nth  s    vvayr   c                >    | j                         j                         S r  )r   r  r   s    r   r  zDUP_Flint.max_norm  s     ))++r   c                >    | j                         j                         S r  )r   r  r   s    r   r  zDUP_Flint.l1_norm  s     ((**r   c                >    | j                         j                         S r  )r   r  r   s    r   r  zDUP_Flint.l2_norm_squared  s     0022r   c                    | j                   j                         }| j                  | j                  | j                   j	                               | j
                        }||fS r  )r   denomr  r  numerr   )r   rD  rE  s      r   r  zDUP_Flint.clear_denoms  sB    

166!&&,,.11559e|r   c                *   |dk(  sJ | j                   j                  rH| j                  }t        |      D ]  }|j	                         } | j                  || j                         S | j                         j                  ||      j                         S )r  r   )r  r  )	r   r  r   rangeintegralr  r   r  r   r   r  r  r   r-  s        r   r  zDUP_Flint._integrate  sz    Avv55;;&&C1X %lln%::c155))??$//!q/9FFHHr   c                    |dk(  sJ | j                   }t        |      D ]  }|j                         } | j                  || j                        S )z1Computes the ``m``-th order derivative of ``f``. r   )r   rG  
derivativer  r   rI  s        r   r  zDUP_Flint._diff   sJ    Avvffq 	#A.."C	#zz#quu%%r   c                @    | j                         j                  |      S r   )r   r  r  s     r   r  zDUP_Flint._eval  s     &&q))r   c                    t         r   r   r  s      r   r
  zDUP_Flint._eval_lev  r   r   c                    | j                         j                  |j                               \  }}|j                         |j                         fS )z#Half extended Euclidean algorithm. )r   r  r   r  s       r   r  zDUP_Flint._half_gcdex  s=     ,,Q__->?1~~!111r   c                    | j                   j                  |j                         \  }}}| j                  || j                        | j                  || j                        | j                  || j                        fS )zExtended Euclidean algorithm. )r   xgcdr  r   )r   r   r  r  r  s        r   r  zDUP_Flint._gcdex  sX    &&++aff%1azz!QUU#QZZ155%91::a;OOOr   c                N   | j                   j                  rU| j                  j                  |j                        \  }}}|dk7  rt	        d      | j                  || j                         S | j                         j                  |j                               j                         S )r  r   zero divisor)	r   r  r   rP  r   r  r   r   r   )r   r   rA  F_invr  s        r   r   zDUP_Flint._invert  sx    55;;FFKK/MCax#N33::eQUU++??$,,Q__->?LLNNr   c                \    | j                         j                  |      j                         S r  )r   r%  r   r  s     r   r%  zDUP_Flint._revert#  s#     ((+88::r   c                    | j                         j                  |j                               }|D cg c]  }|j                          c}S c c}w r)  )r   r*  r   r  s      r   r*  zDUP_Flint._subresultants'  s;    OO,,Q__->?+,.a!...s   Ac                    | j                         j                  |j                               \  }}||D cg c]  }|j                          c}fS c c}w r.  )r   r0  r   r  s       r   r0  zDUP_Flint._resultant_includePRS,  sD    "889JKQ31ann&3333s   Ac                \    | j                         j                  |j                               S )z'Computes resultant of ``f`` and ``g``. )r   r1  r  s     r   r1  zDUP_Flint._resultant1  s!     ++AOO,=>>r   c                >    | j                         j                         S r6  )r   r8  r   s    r   r8  zDUP_Flint.discriminant5  s     --//r   c                j    | j                  |      }|| j                  |      |j                  |      fS r:  )rA  r  )r   r   r  s      r   r;  zDUP_Flint._cofactors9  s,    EE!H!''!*aggaj((r   c                    | j                  | j                  j                  |j                        | j                        S r?  )r  r   rA  r   r  s     r   r@  zDUP_Flint._gcd>  s(    zz!&&**QVV,aee44r   c                L   | r|s%| j                  | j                  j                        S | j                  |      j	                  | j                  |            }|j                  j                  r|j                         }|S |j                         dk  r|j                         }|S )rE  r   )
r   r   r   r  r  r@  r  r[  r  r[  )r   r   r  s      r   rF  zDUP_Flint._lcmB  s|     a<<

++FF1IQVVAY'55>>	A  TTVaZAr   c                   | j                   |j                   cxk(  rt        t        fv sJ  J | j                   j                  r'| j	                         \  }}|j	                         \  }}n0| j                   j
                  | }}|j                   j
                  |}}|j                  |      }||z  ||z  }}|j                  |      }|j                  |      |j                  |      }}|j                         dk  }|j                         dk  }	|r#|	r!|j                         |j                         }}n+|r| |j                         }}n|	r| |j                         }}||||fS )rK  r   )r   r   r   r  r  r   rA  r@  r  r  r[  )
r   r   r  rI  r  rv  cHHf_negg_negs
             r   rM  zDUP_Flint._cancelQ  s(    uu)"b)))))55;;NN$EBNN$EBEEIIqBEEIIqBVVBZr28BFF1Iwwqz1771:1

U557AEEGqACBCB2q!|r   c                r    | j                  |      \  }}}}|j                  |      |j                  |      fS rJ  )rM  rh  r  s         r   rL  zDUP_Flint._cancel_includep  s4    yy|B1}}R !--"333r   c                \    | j                         j                  |      j                         S rS  )r   rT  r   rU  s     r   rT  zDUP_Flint._truncu  s#     ''*7799r   c                @    | j                  | j                               S rZ  )rp  r  r   s    r   r[  zDUP_Flint.monicy  s    qttv&&r   c                >    | j                         j                         S r]  )r   r^  r   s    r   r^  zDUP_Flint.content}  s      ((**r   c                L    | j                         }| j                  |      }||fS r`  )r^  rp  )r   r  prims      r   ra  zDUP_Flint.primitive  s%    yy{t$Tzr   c                l    | j                  | j                  |j                        | j                        S rc  r  r  s     r   rd  zDUP_Flint._compose  s#    zz!&&.!%%00r   c                    | j                         j                         D cg c]  }|j                          c}S c c}w r  )r   ri  r   r  s     r   ri  zDUP_Flint._decompose  s-    +,??+<+G+G+IKa!KKK   ;c                    | j                  || j                  j                  g      }| j                  | j	                  |      | j                        S r  )r  r   r   r  r   )r   r  x_plus_as      r   rn  zDUP_Flint._shift  s:    661aeeii.)zz!&&*AEE22r   c                    | j                         |j                         |j                         }}}|j                  ||      j                         S r  )r   r{  r   )r   rV  ry  rI  rO  rz  s         r   rx  zDUP_Flint._transform  s>    //#Q__%68Ia1{{1a --//r   c                    | j                         j                         D cg c]  }|j                          c}S c c}w r  )r   r  r   r  s     r   r  zDUP_Flint._sturm  s-    +,??+<+C+C+EGa!GGGri  c                >    | j                         j                         S r  )r   r  r   s    r   r  zDUP_Flint._cauchy_upper_bound       4466r   c                >    | j                         j                         S r  )r   r  r   s    r   r  zDUP_Flint._cauchy_lower_bound  ro  r   c                >    | j                         j                         S r  )r   r  r   s    r   r  z%DUP_Flint._mignotte_sep_bound_squared  s     <<>>r   c                    | j                         }|j                         D cg c]  \  }}|j                         |f c}}S c c}}w r  )r   r  r   )r   rI  r   r   s       r   r  zDUP_Flint._gff_list  s8    OO34::<A41a!.."A&AAA   Ac                    t         r  r   r   s    r   r  zDUP_Flint.norm  r  r   c                    t         r  r   r   s    r   r  zDUP_Flint.sqf_norm  r  r   c                ^    | j                  | j                  | j                                     S r  )r  r@  r  r   s    r   r  zDUP_Flint.sqf_part  s     xxqwwy)**r   c                    | j                         j                  |      \  }}||D cg c]  \  }}|j                         |f c}}fS c c}}w r  )r   )r   r  r   r  s         r   r  zDUP_Flint.sqf_list  sI    *333<w'C$!Q)1-CCCCs   Ac                    | j                         j                  |      }|D cg c]  \  }}|j                         |f c}}S c c}}w rx  )r   r  r   r  s        r   r  zDUP_Flint.sqf_list_include  s@    //#444=3:<41a!.."A&<<<s   Ac                x   | j                   j                  rN| j                  j                         \  }}|D cg c]#  \  }}| j	                  || j                         |f% }}}n| j                   j
                  r| j                  j                         \  }}|D cg c]#  \  }}| j	                  || j                         |f% }}}g }|D ]3  \  }}|j                         \  }}|||z  z  }|j                  ||f       5 nt        d| j                   z        | j                  |      }||fS c c}}w c c}}w )r  r  )
r   r  r   factorr  r  r  r   r   r	   )r   r   r  r   r   factors_monicr  s          r   r  zDUP_Flint.factor_list  s    55;;VV]]_NE7>EGdaAquu-q1GGGUU[[ VV]]_NE7DKMDAqqzz!QUU3Q7MMM G% '1~~'1A1v&' FNOO //'*g~- H Ns   (D0(D6c                    | j                         j                         }|D cg c]  \  }}|j                         |f c}}S c c}}w r  )r   r  r   r  s       r   r  zDUP_Flint.factor_list_include  s=     //#7793:<41a!.."A&<<<rs  c                     |D cg c]  \  }}|j                         |f }}}t        |d      } fd}|D cg c]  \  }} ||      |f c}}S c c}}w c c}}w )z+Sort a list of factors to canonical order. T)multiplec                f    j                  j                  | d d d         j                        S r  r	  )r   r   s    r   <lambda>z)DUP_Flint._sort_factors.<locals>.<lambda>  s&    AFF1TrT7OQUU!C r   )r   r	   )r   r  r   r   to_dup_flints   `    r   r	   zDUP_Flint._sort_factors  s`     29:AQYY[!$::$7C29;$!Q,q/1%;; ; <s
   AAc                F    | j                         j                  ||||      S r   )r   r  r  s        r   r  zDUP_Flint._isolate_real_roots  s      44S#sDIIr   c                F    | j                         j                  ||||      S r   )r   r  r  s        r   r  z!DUP_Flint._isolate_real_roots_sqf  s      88c3MMr   c                F    | j                         j                  ||||      S r   )r   r  r  s        r   r  zDUP_Flint._isolate_all_roots  s      33Cc4HHr   c                F    | j                         j                  ||||      S r   )r   r  r  s        r   r  z DUP_Flint._isolate_all_roots_sqf	  s      77S#tLLr   c                H    | j                         j                  |||||      S r   )r   r  r  s         r   r  zDUP_Flint._refine_real_root	  s"     221aeTJJr   c                D    | j                         j                  ||      S r  )r   r  r  s      r   r  zDUP_Flint.count_real_roots	  s     11cs1CCr   c                D    | j                         j                  ||      S r  )r   r  r  s      r   r  zDUP_Flint.count_complex_roots	  s     44#4FFr   c                    | j                    S r  r>  r   s    r   r!  zDUP_Flint.is_zero	  s     66zr   c                H    | j                   | j                  j                  k(  S r  )r   r   r   r   s    r   r  zDUP_Flint.is_one	  s     vv""r   c                <    | j                   j                         dk  S )r  r   r<  r   s    r   r  zDUP_Flint.is_ground	       vv}}!##r   c                <    | j                   j                         dk  S )r  r   r<  r   s    r   r  zDUP_Flint.is_linear	  r  r   c                <    | j                   j                         dk  S )r  r  r<  r   s    r   r  zDUP_Flint.is_quadratic#	  r  r   c                6    | j                         j                  S r  )r   r  r   s    r   r  zDUP_Flint.is_monomial(	  s      ,,,r   c                P    | j                         | j                  j                  k(  S r  )r  r   r   r   s    r   r  zDUP_Flint.is_monic-	  s     ttv""r   c                6    | j                         j                  S r  )r   r  r   s    r   r  zDUP_Flint.is_primitive2	  s      ---r   c                6    | j                         j                  S r  )r   r  r   s    r   r  zDUP_Flint.is_homogeneous7	        ///r   c                6    | j                         j                  S r  )r   r  r   s    r   r  zDUP_Flint.is_sqf<	  s      '''r   c                6    | j                         j                  S r  )r   r  r   s    r   r  zDUP_Flint.is_irreducibleA	  r  r   c                    | j                   j                  r#t        | j                  j	                               S | j                         j                  S r  )r   r  boolr   r  r   r   s    r   r  zDUP_Flint.is_cyclotomicF	  s:     55;;,,.//??$222r   r   r6  r   r7  r9  )vr   r:  r;  r<  r   r=  r  r>  r   r   r  r  r  r   r   r   r   r   r   r   r  r  r"  r3  r9  r?  rD  rF  rM  rT  r^  rd  rh  rl  rp  rW  r[  rt  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r   r%  r*  r0  r1  r8  r;  r@  rF  rM  rL  rT  r[  r^  ra  rd  ri  rn  rx  r  r  r  r  r  r  r  r  r  r  r  r  r	   r  r  r  r  r  r  r  r?  r!  r  r  r  r  r  r  r  r  r  r  r  r~   r   r   r   r     s7   3
C'ID & &%   N N  &3
2':"N1
"
9"
*"
"
"
"
#---.$6*222..:$$$623 '
,+3	I&*"2
P
O;/
4
?0)
5>4
:'+
1L3
0
H77?B
"
"
+D
=
<	=<JNIMKDG   # # $ $ $ $ $ $ - - # # . . 0 0 ( ( 0 0 3 3r   r   c                J    t        t        | ||      t        |||      ||      S r   )DMFr   numdenr   r   s       r   init_normal_DMFr  O	  s*    z#sC(#sC(#s4 4r   c                  \   e Zd ZdZdZd.dZed.d       Zd Zed.d       Z	d Z
d	 Zd
 Zd Zd/dZd0dZed        Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZeZd1dZed        Zed        Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d& Z*d' Z+d( Z,d) Z-d* Z.d+ Z/d, Z0d- Z1y)2r  z'Dense Multivariate Fractions over `K`. r  Nc                    | j                  |||      \  }}}t        ||||      \  }}|| _        || _        || _        || _        y r   )_parserc   r  r  r   r   )r   r   r   r   r  r  s         r   __init__zDMF.__init__Y	  sJ    Cc2S#c3S1Sr   c                    | j                  |||      \  }}}t        j                  |       }||_        ||_        ||_        ||_        |S r   )r  rB  r   r  r  r   r   )r   r   r   r   r  r  rC  s          r   r   zDMF.newb	  sI    

3S1S#nnS!
r   c                P    | j                  || j                  | j                        S r   )r   r   r   )r   r   s     r   r   zDMF.ground_newo	  s    xxTXXtxx00r   c                   t        |t              r|\  }}|;t        |t              rt        |||      }t        |t              r=t        |||      }n/t	        |      \  }}t	        |      \  }}||k(  r|}nt        d      t        ||      rt        d      t        ||      rt        ||      }nt        |||      rt        |||      }t        |||      }nh|}|Jt        |t              rt        |||      }n:t        |t              s*t        |j                  |      |      }nt	        |      \  }}t        ||      }|||fS )Nzinconsistent number of levelszfraction denominator)r   r  r   r&   r   r	  r"   ZeroDivisionErrorr   r   r8   r   r    r   )r   r   r   r   r  r  num_levden_levs           r   r  z
DMF._parser	  s:   c5!HCc4('S#6Cc4('S#6C+C0W+C0Wg%!C$%DEE#s#'(>??#s#c3'!#sC0!#sC0C!#sC0CCc4('S#6C#C.$S[[%5s;C',S#s#CC}r   c                    | j                   j                  d| j                  d| j                  d| j                  dS )Nz((r   z), r   )r   r   r  r  r   r   s    r   r   zDMF.__repr__	  s'    %&[[%9%9155!%%OOr   c                    t        | j                  j                  t        | j                  | j
                        t        | j                  | j
                        | j
                  | j                  f      S r   )r   r   r   r1   r  r   r  r   r   s    r   r   zDMF.__hash__	  sO    Q[[))<quu+E&quu6 7 	7r   c                    t        |t              r j                  |j                  k7  rt        d d|       j                  |j                  k(  rE j                   j                   j
                   j                   j                  f|j                  fS  j                   j                  j                  |j                        c}t         j                  | j                        t         j                  | j                        f}t        |j                  ||j                        }dd|f fd	}||||fS )z0Unify a multivariate fraction and a polynomial. r   r   TFc                    |r|s| |z  S |dz
  }|rt        | ||      \  } }j                  j                  | |f|      S r  rc   r   r   r  r  rO  killr   r   r   s        r   rI  zDMF.poly_unify.<locals>.per	  M    "3w!Ag)#sC=HC{{Sz3<<r   )r   r   r   rz   r   rI  r  r  r   r   r   r   r   r   rI  rv  rI  r   s   `     @r   
poly_unifyzDMF.poly_unify	  s    !S!QUUaee^#A$FGG55AEE>EE155!%%!%%@@uuaeekk!%%0HCQUUC4QUUC46A AFFC4A%)3 
= S!Q&&r   c                    t        |t              r j                  |j                  k7  rt        d d|       j                  |j                  k(  rQ j                   j                   j
                   j                   j                  f|j                  |j                  ffS  j                   j                  j                  |j                        c}t         j                  | j                        t         j                  | j                        f}t        |j                  ||j                        t        |j                  ||j                        f}dd|f fd	}||||fS )z5Unify representations of two multivariate fractions. r   r   TFc                    |r|s| |z  S |dz
  }|rt        | ||      \  } }j                  j                  | |f|      S r  r  r  s        r   rI  zDMF.frac_unify.<locals>.per	  r  r   )
r   r  r   rz   r   rI  r  r  r   r   r  s   `     @r   
frac_unifyzDMF.frac_unify	  s   !S!QUUaee^#A$FGG55AEE>EE155!%%!%%*+%%9 9 uuaeekk!%%0HCQUUC4QUUC46A QUUC4QUUC46A &*3 
= S!Q&&r   c                    | j                   | j                  }}|r|s||z  S |dz  }|rt        ||||      \  }}| j                  j	                  ||f||      S )z.Create a DMF out of the given representation. r   )r   r   rc   r   r   )r   r  r  rO  r  r   r   s          r   rI  zDMF.per	  s]    55!%%S3wq!#sC5HC{{Sz344r   c                ^    | j                   }|r	|s|S |dz  }t        || j                  |      S )rG  r   )r   r   r   )r   r   r  r   s       r   half_perzDMF.half_per	  s2    ee
q3s##r   c                (    | j                  d||      S r   r   r   s      r   r   zDMF.zero	      wwq#s##r   c                (    | j                  d||      S r  r  r   s      r   r   zDMF.one 
  r  r   c                8    | j                  | j                        S )z Returns the numerator of ``f``. )r  r  r   s    r   rE  z	DMF.numer
      zz!%%  r   c                8    | j                  | j                        S )z"Returns the denominator of ``f``. )r  r  r   s    r   rD  z	DMF.denom
  r  r   c                N    | j                  | j                  | j                        S )z4Remove common factors from ``f.num`` and ``f.den``. )rI  r  r  r   s    r   rO  z
DMF.cancel
  s    uuQUUAEE""r   c                    | j                  t        | j                  | j                  | j                        | j
                  d      S )rZ  FrO  )rI  r8   r  r   r   r  r   s    r   r[  zDMF.neg
  s0    uuWQUUAEE1551155uGGr   c                *    | | j                  |      z   S r]  )r   r_  s     r   r`  zDMF.add_ground
  s    1<<?""r   c           	     8   t        |t              r,| j                  |      \  }}}\  }}}t        |||||      |}	}nV| j	                  |      \  }}}}
}|
|c\  }}\  }}t        t        ||||      t        ||||      ||      }t        ||||      }	 |||	      S )z0Add two multivariate fractions ``f`` and ``g``. )r   r   r  rF   r  r9   r;   r   r   r   r   rI  F_numF_denrv  r  r  rI  G_numG_dens                r   rw  zDMF.add
      a/0||A,Cc>E51"5%C=uC"#,,q/Cc1a-.*NUENUE'%S9!%S93EC%S1C3}r   c           	     8   t        |t              r,| j                  |      \  }}}\  }}}t        |||||      |}	}nV| j	                  |      \  }}}}
}|
|c\  }}\  }}t        t        ||||      t        ||||      ||      }t        ||||      }	 |||	      S )z5Subtract two multivariate fractions ``f`` and ``g``. )r   r   r  rG   r  r:   r;   r  s                r   r|  zDMF.sub'
  r  r   c                   t        |t              r+| j                  |      \  }}}\  }}}t        ||||      |}	}n>| j	                  |      \  }}}}
}|
|c\  }}\  }}t        ||||      }t        ||||      }	 |||	      S )z5Multiply two multivariate fractions ``f`` and ``g``. r   r   r  r;   r  r  s                r   r  zDMF.mul6
  s    a/0||A,Cc>E51uac2EC"#,,q/Cc1a-.*NUENUE%S1C%S1C3}r   c           	     @   t        |t              rx| j                  | j                  }}|dk  r||| }}}| j	                  t        ||| j                  | j                        t        ||| j                  | j                        d      S t        dt        |      z        )r  r   Fr  r  )
r   r   r  r  rI  r=   r   r   r  r   )r   r  r  r  s       r   r  zDMF.powD
  s    auuaeeC1u!3!S55a6 a6u  F F 6a@AAr   c                   t        |t              r+| j                  |      \  }}}\  }}}|t        ||||      }	}n>| j	                  |      \  }}}}
}|
|c\  }}\  }}t        ||||      }t        ||||      }	 |||	      S )z0Computes quotient of fractions ``f`` and ``g``. r  r  s                r   r  zDMF.quoO
  s    a/0||A,Cc>E51geQS9C"#,,q/Cc1a-.*NUENUE%S1C%S1C3}r   c                R    | j                  | j                  | j                  d      S )z&Computes inverse of a fraction ``f``. Fr  )rI  r  r  )r   checks     r   r!  z
DMF.invert_
  s    uuQUUAEE%u00r   c                B    t        | j                  | j                        S )z.Returns ``True`` if ``f`` is a zero fraction. r"   r  r   r   s    r   r!  zDMF.is_zeroc
  s     !%%''r   c                    t        | j                  | j                  | j                        xr+ t        | j                  | j                  | j                        S )z.Returns ``True`` if ``f`` is a unit fraction. )r#   r  r   r   r  r   s    r   r  z
DMF.is_oneh
  s>     quu- +aeeQUUAEE*	+r   c                "    | j                         S r   r  r   s    r   r  zDMF.__neg__n
  r  r   c                B   t        |t        t        f      r| j                  |      S || j                  v r*| j                  | j                  j                  |            S 	 | j                  | j                  |            S # t        t        t        f$ r	 t        cY S w xY wr   )r   r   r  rw  r   r`  r   r  r  r   r   r  r  s     r   r  zDMF.__add__q
  s}    a#s$558O!%%Z<<a 011	"55A''>+>? 	"!!	"s   !B BBc                $    | j                  |      S r   r  r  s     r   r  zDMF.__radd__|
  r  r   c                    t        |t        t        f      r| j                  |      S 	 | j                  | j	                  |            S # t
        t        t        f$ r	 t        cY S w xY wr   )	r   r   r  r|  r  r  r   r   r  r  s     r   r  zDMF.__sub__
  V    a#s$558O	"55A''>+>? 	"!!	"   A	 	A&%A&c                &    |  j                  |      S r   r  r  s     r   r  zDMF.__rsub__
  r	  r   c                    t        |t        t        f      r| j                  |      S 	 | j                  | j	                  |            S # t
        t        t        f$ r	 t        cY S w xY wr   )	r   r   r  r  r  r  r   r   r  r  s     r   r  zDMF.__mul__
  r  r  c                $    | j                  |      S r   r  r  s     r   r  zDMF.__rmul__
  r  r   c                $    | j                  |      S r   r  r  s     r   r  zDMF.__pow__
  r  r   c                    t        |t        t        f      r| j                  |      S 	 | j                  | j	                  |            S # t
        t        t        f$ r	 t        cY S w xY wr   )	r   r   r  r  r  r  r   r   r  r  s     r   r  zDMF.__truediv__
  r  r  c                ,    | j                  d      |z  S )NF)r  )r!  )r   r   s     r   r  zDMF.__rtruediv__
  s    {{{'))r   c                d   	 t        |t              r[| j                  |      \  }}}\  }}}| j                  |j                  k(  r]t	        || j                  | j
                        xr ||k(  S | j                  |      \  }}}}}| j                  |j                  k(  r||k(  S y# t        $ r Y yw xY wrE  r   r   r  r   r#   r   r  rz   r   r   r  r  r  rv  rI  s          r   r!  z
DMF.__eq__
  s    	!S!-.\\!_*1a%55AEE>$UAEE1559HeqjH !Q1aA55AEE>6M  ! 		s   A*B# -4B# #	B/.B/c                f   	 t        |t              r\| j                  |      \  }}}\  }}}| j                  |j                  k(  r^t	        || j                  | j
                        xr ||k(   S | j                  |      \  }}}}}| j                  |j                  k(  r||k7  S y# t        $ r Y yw xY w)NTr  r  s          r   __ne__z
DMF.__ne__
  s    	!S!-.\\!_*1a%55AEE> )% > M5A:NN !Q1aA55AEE>6M  ! 		s   A+B$ .4B$ $	B0/B0c                :    | j                  |      \  }}}}}||k  S r   r  r   r   r  rI  rv  s        r   r+  z
DMF.__lt__
  "    Q1aA1ur   c                :    | j                  |      \  }}}}}||k  S r   r  r  s        r   r.  z
DMF.__le__
  "    Q1aAAvr   c                :    | j                  |      \  }}}}}||kD  S r   r  r  s        r   r1  z
DMF.__gt__
  r  r   c                :    | j                  |      \  }}}}}||k\  S r   r  r  s        r   r3  z
DMF.__ge__
  r  r   c                D    t        | j                  | j                         S r   r  r   s    r   r5  zDMF.__bool__
  s    aeeQUU+++r   r   )TFr6  r8  )2r   r:  r;  r<  r=  r  r>  r   r   r  r   r   r  r  rI  r  r   r   rE  rD  rO  r[  r`  rw  r|  r  r  r  r  r!  r?  r!  r  r  r  r  r  r  r  r  r  r  r  r!  r  r+  r.  r1  r3  r5  r~   r   r   r  r  T	  sA   1,I 
 
1 ) )VP7':'>5
$ $ $ $ $!!#H#	B E1 ( ( + +
	""""*"",r   r  c                D    t        t        | |      t        ||      |      S r   )ANPr   )r   modr   s      r   init_normal_ANPr  
  s$    z#s##s#S* *r   c                      e Zd ZdZdZd Ze fd       Zd Ze	d        Z
e	d        Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zed        Zed        Zd Zd Zd Zd Zd Zd Zed        Zd Zd Zd Zd Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d& Z*d' Z+e	d(        Z,e	d)        Z-e	d*        Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4d1 Z5d2 Z6d3 Z7d4 Z8d5 Z9d6 Z:d7 Z;d8 Z<d9 Z=d: Z>d; Z?d< Z@d= ZA xZBS )>r  z1Dense Algebraic Number Polynomials over a field. )r   _modr   c                   t        |t              rnt        |      t        u rt        t	        ||      |d      }nWt        |t
              r|D cg c]  }|j                  |       }}n|j                  |      g}t        t        |      |d      }t        |t              rn>t        |t              rt        t	        ||      |d      }nt        t        |      |d      }| j                  |||      S c c}w r   )	r   r   r   r   r%   r   r   r   r   )r   r   r  r   r  s        r   r   zANP.__new__
  s    c3#Y$mC-sA6C#t$/23!s{{1~33{{3'(inc1-Cc3T"mC-sA6Cinc1-CwwsC%% 4s   C4c                    |j                   |j                   cxk(  r|k(  st        d       t        d      t        |   |       }||_        ||_        ||_         |S )NzInconsistent domain)r   r   superr   r   r  )r   r   r  r   rC  r   s        r   r   zANP.new
  s]    377)c)455 *455goc"
r   c                T    t         | j                  | j                  | j                  ffS r   )r  r   r  r   r   s    r   r  zANP.__reduce__  s     TXXtxx222r   c                6    | j                   j                         S r   r   r   r   s    r   r   zANP.rep  s    yy  ""r   c                "    | j                         S r   )mod_to_listr   s    r   r  zANP.mod  s    !!r   c                    | j                   S r   r>  r   s    r   to_DMPz
ANP.to_DMP      yyr   c                    | j                   S r   )r  r   s    r   
mod_to_DMPzANP.mod_to_DMP  r  r   c                P    | j                  || j                  | j                        S r   )r   r  r   rH  s     r   rI  zANP.per  s    uuS!&&!%%((r   c                    | j                   j                  d| j                  j                         d| j                  j                         d| j
                  dS r   )r   r   r   r   r  r   r   s    r   r   zANP.__repr__  s8    #$;;#7#79I166>>K[]^]b]bccr   c                    t        | j                  j                  | j                         | j                  j                         | j
                  f      S r   )r   r   r   r   r  r   r   s    r   r   zANP.__hash__  s5    Q[[))1::<9JAEERSSr   c                    | j                   |k(  r| S | j                  | j                  j                  |      | j                  j                  |      |      S )z.Convert ``f`` to a ``ANP`` over a new domain. )r   r   r   r   r  r   s     r   r   zANP.convert"  s?    55C<H55,affnnS.A3GGr   c                   t        |t              r| j                  |j                  k7  rt        d| d|      | j                  |j                  k(  r9| j                  | j
                  | j                  |j                  | j                  fS | j                  j                  |j                        t        | j                  | j                        }t        |j                  |j                        }| j                  k7  r1|j                  k7  r"t        | j                  | j                        n(| j                  k(  r| j                  n|j                  fd}|||fS )z0Unify representations of two algebraic numbers. r   r   c                    t        |       S r   r  )r   r   r  s    r   r  zANP.unify.<locals>.<lambda>B  s    c#sC0 r   )	r   r  r  rz   r   rI  r   r   r   )r   r   rI  rv  rI  r   r  s        @@r   r   z	ANP.unify)  s    !S!QUUaee^#A$FGG55AEE>55!%%quu44%%++aee$CAEE155#.AAEE155#.Aaee|quu!!%%4!%%<%%C%%C0CCAs""r   c                   t        |t              r| j                  |j                  k7  rt        d| d|      | j                  |j                  k7  rG| j                  j                  |j                        }| j                  |      } |j                  |      }| j                  |j                  | j                  | j                  fS r   )r   r  r  rz   r   r   r   r   r   s      r   	unify_ANPzANP.unify_ANPF  s    !S!QVVqvv%5#A$FGG 55AEE>%%++aee$C		#A		#Avvqvvqvvquu,,r   c                    t        d||      S r   r  r   r  r   s      r   r   zANP.zeroS      1c3r   c                    t        d||      S r  r  r  s      r   r   zANP.oneW  r  r   c                6    | j                   j                         S )r   )r   r   r   s    r   r   zANP.to_dict[      vv~~r   c                    t        | j                  d| j                        }|j                         D ]#  \  }}| j                  j	                  |      ||<   % |S )r   r   )r'   r   r   r   r   )r   r   r   r   s       r   r   zANP.to_sympy_dict_  sN    !%%AEE*IIK 	'DAqUU^^A&CF	' 
r   c                6    | j                   j                         S r   r  r   s    r   r   zANP.to_listh  r  r   c                6    | j                   j                         S )z5Return ``f.mod`` as a list with native coefficients. )r  r   r   s    r   r  zANP.mod_to_listl  r  r   c                z    | j                         D cg c]  }| j                  j                  |       c}S c c}w )r   )r   r   r   r_  s     r   r   zANP.to_sympy_listp  s)    ,-IIK9q"999s   "8c                6    | j                   j                         S r   )r   r   r   s    r   r   zANP.to_tuplet  s     vv  r   c           
     h    t        t        t        t        |j                  |                  ||      S r   )r  r   r   r  r   )r   r   r  r   s       r   r   zANP.from_list|  s&    9T#ckk3"7893DDr   c                V    | j                  | j                  j                  |            S r]  )rI  r   r`  r_  s     r   r`  zANP.add_ground       uuQVV&&q)**r   c                V    | j                  | j                  j                  |            S rc  )rI  r   re  r_  s     r   re  zANP.sub_ground  r  r   c                V    | j                  | j                  j                  |            S )z3Multiply ``f`` by an element of the ground domain. )rI  r   ri  r_  s     r   ri  zANP.mul_ground  r  r   c                V    | j                  | j                  j                  |            S )z6Quotient of ``f`` by an element of the ground domain. )rI  r   rm  r_  s     r   rm  zANP.quo_ground  r  r   c                T    | j                  | j                  j                               S r   )rI  r   r[  r   s    r   r[  zANP.neg  s    uuQVVZZ\""r   c                r    | j                  |      \  }}}}| j                  |j                  |      ||      S r   )r
  r   rw  r   r   rI  rv  r  r   s         r   rw  zANP.add  2    Q1c3uuQUU1XsC((r   c                r    | j                  |      \  }}}}| j                  |j                  |      ||      S r   )r
  r   r|  r  s         r   r|  zANP.sub  r  r   c                    | j                  |      \  }}}}| j                  |j                  |      j                  |      ||      S r   )r
  r   r  r  r  s         r   r  zANP.mul  s;    Q1c3uuQUU1X\\#&S11r   c                <   t        |t              st        dt        |      z        | j                  }| j
                  }|dk  r|j                  |      | }}| j                  |j                  |      j                  | j                        || j                        S )r  r  r   )r   r   r  r   r  r   r!  r   r  r  r   )r   r  r  rI  s       r   r  zANP.pow  s{    !S!6a@AAffFFq588C=1"qA uuQUU1X\\!&&)366r   c                    | j                  |      \  }}}}| j                  |j                  |j                  |            j	                  |      ||      S r   )r
  r   r  r!  r  r  s         r   r  z	ANP.exquo  sF    Q1c3uuQUU188C=)--c2C==r   c                p    | j                  |      | j                  | j                  | j                        fS r   )r  r   r  r   r  s     r   r  zANP.div  s(    wwqz166!&&!%%000r   c                $    | j                  |      S r   )r  r  s     r   r  zANP.quo  s    wwqzr   c                    | j                  |      \  }}}}|j                  |      \  }}|j                  r| j                  ||      S t	        d      )NrR  )r
  r  r  r   r   )r   r   rI  rv  r  r   r  r  s           r   r  zANP.rem  sK    Q1c3||A18866#s##//r   c                6    | j                   j                         S r  )r   r  r   s    r   r  zANP.LC      vvyy{r   c                6    | j                   j                         S r  )r   r  r   s    r   r  zANP.TC  r(  r   c                .    | j                   j                  S )z6Returns ``True`` if ``f`` is a zero algebraic number. )r   r!  r   s    r   r!  zANP.is_zero  s     vv~~r   c                .    | j                   j                  S )z6Returns ``True`` if ``f`` is a unit algebraic number. )r   r  r   s    r   r  z
ANP.is_one  s     vv}}r   c                .    | j                   j                  S r  )r   r  r   s    r   r  zANP.is_ground  s     vvr   c                    | S r   r~   r   s    r   __pos__zANP.__pos__  s    r   c                "    | j                         S r   r  r   s    r   r  zANP.__neg__  r  r   c                    t        |t              r| j                  |      S 	 | j                  j	                  |      }| j                  |      S # t        $ r	 t        cY S w xY wr   )r   r  rw  r   r   r`  r   r  r  s     r   r  zANP.__add__  W    a558O	#a A <<?"  	"!!	"   A A! A!c                $    | j                  |      S r   r  r  s     r   r  zANP.__radd__  r  r   c                    t        |t              r| j                  |      S 	 | j                  j	                  |      }| j                  |      S # t        $ r	 t        cY S w xY wr   )r   r  r|  r   r   re  r   r  r  s     r   r  zANP.__sub__  r1  r2  c                &    |  j                  |      S r   r  r  s     r   r  zANP.__rsub__  r	  r   c                    t        |t              r| j                  |      S 	 | j                  j	                  |      }| j                  |      S # t        $ r	 t        cY S w xY wr   )r   r  r  r   r   ri  r   r  r  s     r   r  zANP.__mul__  r1  r2  c                $    | j                  |      S r   r  r  s     r   r  zANP.__rmul__  r  r   c                $    | j                  |      S r   r  r  s     r   r  zANP.__pow__  r  r   c                $    | j                  |      S r   r  r  s     r   r  zANP.__divmod__  r  r   c                $    | j                  |      S r   r  r  s     r   r  zANP.__mod__
  r  r   c                    t        |t              r| j                  |      S 	 | j                  j	                  |      }| j                  |      S # t        $ r	 t        cY S w xY wr   )r   r  r  r   r   rm  r   r  r  s     r   r  zANP.__truediv__  r1  r2  c                d    	 | j                  |      \  }}}}||k(  S # t        $ r	 t        cY S w xY wr   r
  rz   r  r   r   rI  rv  r  s        r   r!  z
ANP.__eq__  >    	"QJAq!Q Av ! 	"!!	"    //c                d    	 | j                  |      \  }}}}||k7  S # t        $ r	 t        cY S w xY wr   r=  r>  s        r   r  z
ANP.__ne__  r?  r@  c                8    | j                  |      \  }}}}||k  S r   r
  r>  s        r   r+  z
ANP.__lt__%       [[^
1a1ur   c                8    | j                  |      \  }}}}||k  S r   rC  r>  s        r   r.  z
ANP.__le__)       [[^
1aAvr   c                8    | j                  |      \  }}}}||kD  S r   rC  r>  s        r   r1  z
ANP.__gt__-  rD  r   c                8    | j                  |      \  }}}}||k\  S r   rC  r>  s        r   r3  z
ANP.__ge__1  rF  r   c                ,    t        | j                        S r   )r  r   r   s    r   r5  zANP.__bool__5  s    AFF|r   )Cr   r:  r;  r<  r=  r   r>  r   r  r?  r   r  r  r  rI  r   r   r   r   r
  r   r   r   r   r   r  r   r   r   r`  re  ri  rm  r[  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.  r1  r3  r5  __classcell__)r   s   @r   r  r  
  s   ;'I&*  3 # # " ")dTH#:-           :! E E++++#))27>10        ####r   r  )r<  
__future__r   sympy.external.gmpyr   sympy.utilities.exceptionsr   sympy.core.numbersr   sympy.core.sympifyr   sympy.polys.polyutilsr   r	   sympy.polys.domainsr
   r   r   sympy.polys.polyerrorsr   r   r   r   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/   r0   r1   sympy.polys.densearithr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   sympy.polys.densetoolsrK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   sympy.polys.euclidtoolsrZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   sympy.polys.sqfreetoolsrd   re   rf   rg   rh   ri   rj   sympy.polys.factortoolsrk   rl   rm   rn   sympy.polys.rootisolationro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   __annotations__r}   r|   r   r   r   r  r  r  r  r~   r   r   <module>r[     sQ   7 " , @ ! * C . .         0      4    "  ( ( (. .$ $ $ $
 # "7"XNEND+ DN"p pfH
3 H
3V4
E,
k E,P*
U+ Ur   