
    go                   :   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
          ZdS )#z1OO layer for several polynomial representations.     )annotations)GROUND_TYPES)sympy_deprecation_warning)oo)CantSympify)PicklableWithSlots_sort_factors)DomainZZQQ)CoercionFailedExactQuotientFailedDomainErrorNotInvertible)!ninfdmp_validate
dup_normal
dmp_normaldup_convertdmp_convertdmp_from_sympy	dup_stripdmp_degree_indmp_degree_listdmp_negative_pdmp_ground_LCdmp_ground_TCdmp_ground_nthdmp_one
dmp_grounddmp_zero
dmp_zero_p	dmp_one_pdmp_ground_pdup_from_dictdmp_from_dictdmp_to_dictdmp_deflate
dmp_inject	dmp_ejectdmp_terms_gcddmp_list_termsdmp_exclude	dup_slicedmp_slice_indmp_permutedmp_to_tuple)dmp_add_grounddmp_sub_grounddmp_mul_grounddmp_quo_grounddmp_exquo_grounddmp_absdmp_negdmp_adddmp_subdmp_muldmp_sqrdmp_powdmp_pdivdmp_premdmp_pquo
dmp_pexquodmp_divdmp_remdmp_quo	dmp_exquodmp_add_muldmp_sub_muldmp_max_normdmp_l1_normdmp_l2_norm_squared)dmp_clear_denomsdmp_integrate_indmp_diff_indmp_eval_in
dup_revertdmp_ground_truncdmp_ground_contentdmp_ground_primitivedmp_ground_monicdmp_composedup_decompose	dup_shift	dmp_shiftdup_transformdmp_lift)
dup_half_gcdex	dup_gcdex
dup_invertdmp_subresultantsdmp_resultantdmp_discriminantdmp_inner_gcddmp_gcddmp_lcm
dmp_cancel)dup_gff_listdmp_norm	dmp_sqf_pdmp_sqf_normdmp_sqf_partdmp_sqf_listdmp_sqf_list_include)dup_cyclotomic_pdmp_irreducible_pdmp_factor_listdmp_factor_list_include)dup_isolate_real_roots_sqfdup_isolate_real_rootsdup_isolate_all_roots_sqfdup_isolate_all_rootsdup_refine_real_rootdup_count_real_rootsdup_count_complex_roots	dup_sturmdup_cauchy_upper_bounddup_cauchy_lower_bounddup_mignotte_sep_bound_squared)UnificationFailedPolynomialErrorztuple[Domain, ...]_flint_domainsflintN c                  Z   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/Z0d0 Z1d1 Z2d2 Z3d3 Z4d4 Z5d5 Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;d; Z<d< Z=d= Z>d> Z?d? Z@d@ ZAdA ZBdB ZCdC ZDdD ZEdE ZFdF ZGdG ZHdH ZIdI ZJdJ ZKdK ZLdL ZMdM ZNdN ZOdO ZPdP ZQdQ ZRdR ZSdS ZTdT ZUdU ZVdV ZWdW ZXdX ZYdY ZZdZ Z[dd[Z\d\ Z]d] Z^d^ Z_d_ Z`d` Zada Zbdb Zcdc Zddd Zede Zfdf Zgdg Zhdh ZiddjZjdk ZkddlZldm ZmddnZndo Zodp Zpdq Zqdr Zrds Zsdt Ztdu Zudv Zvdw Zwdx Zxdy Zydz Zzdd{Z{dd|Z|d} 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҄ ZdS )DMP)Dense Multivariate Polynomials over `K`. r~   Nc                    |t          |          \  }}n4t          |t                    st          dt	          |          z            |                     |||          S )Nzexpected list, got %s)r   
isinstancelistr   typenewclsrepdomlevs       S/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/polys/polyclasses.py__new__zDMP.__new__   s]    ;#C((HCC&& 	F !8499!DEEEwwsC%%%    c                    t           +|dk    r%|t          v rt                              |||          S t                              |||          S Nr   )r}   r|   	DUP_Flint_new
DMP_Pythonr   s       r   r   zDMP.new   sI     axxC>11 ~~c3444sC---r   c                N    t          ddd           |                                 S )z!Get the representation of ``f``. ay  
        Accessing the ``DMP.rep`` attribute is deprecated. The internal
        representation of ``DMP`` instances can now be ``DUP_Flint`` when the
        ground types are ``flint``. In this case the ``DMP`` instance does not
        have a ``rep`` attribute. Use ``DMP.to_list()`` instead. Using
        ``DMP.to_list()`` also works in previous versions of SymPy.
        z1.13zdmp-rep)deprecated_since_versionactive_deprecations_target)r   to_listfs    r   r   zDMP.rep   s8     	" # &,'0		
 		
 		
 		
 yy{{r   c                    t           Yt          | t                    rD| j        dk    r9| j        t
          v r+t                              | 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.
        Nr   )	r}   r   r   r   r   r|   r   r   _repr   s    r   to_bestzDMP.to_best   sS     !Z(( ;QUaZZAE^<S<S }}QVQUAE:::r   c                    t          t                    sJ t          |t                    r|dk    sJ fd ||           d S )Nr   c                    t          | t                    sJ |dk    rt          fd| D                       sJ d S | D ]} ||dz
             d S )Nr   c              3  B   K   | ]}                     |          V  d S N)of_type).0cr   s     r   	<genexpr>z;DMP._validate_args.<locals>.validate_rep.<locals>.<genexpr>   s-      77a3;;q>>777777r      )r   r   all)r   r   rr   validate_reps      r   r   z(DMP._validate_args.<locals>.validate_rep   s    c4(((((axx777737777777777 - -A LC!G,,,,- -r   )r   r
   int)r   r   r   r   r   s     ` @r   _validate_argszDMP._validate_args   sn    #v&&&&&#s##0q	- 	- 	- 	- 	- 	- 	S#r   c                R    t          |||          }|                     |||          S r   )r&   r   r   r   r   r   s       r   	from_dictzDMP.from_dict   s)    Cc**wwsC%%%r   c                P    |                      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7cBBBr   c                N    |                      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44c3???r   c           
     l     | t          t          t          ||                              ||          S r   )dictr   zip)r   monomscoeffsr   r   s        r   from_monoms_coeffszDMP.from_monoms_coeffs   s0    s4S001122C===r   c                   | j         |k    r| S | j        st          |                     |          S t	          | t
                    rE|t          v r|                     |          S |                                                     |          S t	          | t                    rE|t          v r'|                     |          	                                S |                     |          S t          d          )z0Convert ``f`` to a ``DMP`` over the new domain. Nzunreachable code)r   r   r}   _convertr   r   r|   to_DMP_Pythonr   to_DUP_FlintRuntimeErrorr   r   s     r   convertzDMP.convert   s    5C<<HU 	3em::c??"9%% 	3n$$zz#&((11#666:&& 	3n$$zz#33555zz#&12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                @    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                Z    | j         j        d|                                 d| j        dS N(, ))	__class____name__r   r   r   s    r   __repr__zDMP.__repr__  s,     {333QYY[[[[!%%%HHr   c                t    t          | j        j        |                                 | j        | j        f          S r   )hashr   r   to_tupler   r   r   s    r   __hash__zDMP.__hash__  s*    Q[)1::<<FGGGr   c                D    |                                  | j        | j        fS r   )r   r   r   selfs    r   __getnewargs__zDMP.__getnewargs__
  s    ||~~tx11r   c                    t           z*Construct a new ground instance of ``f``. r   r   coeffs     r   
ground_newzDMP.ground_new      !!r   c                0   t          |t                    r| j        |j        k    rt          d| d|          | j        |j        k    rI| 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  s    !S!! 	HQUae^^##AA$FGGG5AE>>%++ae$$C		#A		#A!tr   Fc                `    t          |                                 | 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;;qu4@@@@r   c                    |                      |          }|                                D ]"\  }}| 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!  sN    iiTi""IIKK 	' 	'DAqU^^A&&CFF
r   c                L      fd                                             S )@Convert ``f`` to a list representation with SymPy coefficients. c                    g }| D ]c}t          |t                    r|                     |                     6|                    j                            |                     d|S r   )r   r   appendr   r   )r   outvalr   sympify_nested_lists      r   r   z.DMP.to_sympy_list.<locals>.sympify_nested_list,  sr    C 4 4c4(( 4JJ223778888JJqu~~c223333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                Z    |                      | j                                                  S )zMake the ground domain a ring. )r   r   get_ringr   s    r   to_ringzDMP.to_ringC  s     yy))***r   c                Z    |                      | j                                                  S )z Make the ground domain a field. )r   r   	get_fieldr   s    r   to_fieldzDMP.to_fieldG       yy**+++r   c                Z    |                      | j                                                  S )zMake the ground domain exact. )r   r   	get_exactr   s    r   to_exactzDMP.to_exactK  r  r   r   c                n    | j         s|s|                     ||          S |                     |||          S z1Take a continuous subsequence of terms of ``f``. )r   _slice
_slice_levr   mnjs       r   slicez	DMP.sliceO  s;    u 	)Q 	)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                B    d |                      |          D             S )z;Returns all non-zero coefficients from ``f`` in lex order. c                    g | ]\  }}|S r~   r~   )r   _r   s      r   
<listcomp>zDMP.coeffs.<locals>.<listcomp>^      555tq!555r   ordertermsr   r  s     r   r   z
DMP.coeffs\  $    55qwwUw335555r   c                B    d |                      |          D             S )z8Returns all non-zero monomials from ``f`` in lex order. c                    g | ]\  }}|S r~   r~   )r   r  r  s      r   r  zDMP.monoms.<locals>.<listcomp>b  r  r   r  r  r  s     r   r   z
DMP.monoms`  r   r   c                t    | j         rd| j        dz   z  }|| j        j        fgS |                     |          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    9 	)quqy)J,--88%8(((r   c                    t           r   r   r  s     r   r'  z
DMP._termsl  r   r   c                    | j         rt          d          | s| j        j        gS t	          |                                           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  sF    5 	L!"JKKK 	%EJ<		$$$r   c                    | j         rt          d          |                                 dk     rdgS fdt          |                                           D             S )z"Returns all monomials from ``f``. r+  r   r%  c                "    g | ]\  }}|z
  fS r~   r~   r   ir   r  s      r   r  z"DMP.all_monoms.<locals>.<listcomp>  s#    BBB$!Qa!eXBBBr   )r   r{   degree	enumerater   r   r  s    @r   
all_monomszDMP.all_monomsy  sd    5 	L!"JKKKHHJJq556MBBBB)AIIKK*@*@BBBBr   c                    | j         rt          d          |                                 dk     rd| j        j        fgS fdt          |                                           D             S )z Returns all terms from a ``f``. r+  r   r%  c                &    g | ]\  }}|z
  f|fS r~   r~   r/  s      r   r  z!DMP.all_terms.<locals>.<listcomp>  s'    GGGtq!q1uh]GGGr   )r   r{   r1  r   r   r2  r   r3  s    @r   	all_termszDMP.all_terms  so    5 	L!"JKKKHHJJq5515:&''GGGGy/E/EGGGGr   c                N    |                                                                  S z-Convert algebraic coefficients to rationals. )_liftr   r   s    r   liftzDMP.lift  s    wwyy  """r   c                    t           r   r   r   s    r   r:  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   rE  s      r   ejectz	DMP.eject  r   r   c                \    |                                  \  }}||                                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   rM  zDMP._exclude  r   r   c                ,    |                      |          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   rU  s     r   rT  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                \    |                      | j                            |                    S z.Add an element of the ground domain to ``f``. )_add_groundr   r   r   r   s     r   
add_groundzDMP.add_ground  "    }}QU]]1--...r   c                \    |                      | j                            |                    S z5Subtract an element of the ground domain from ``f``. )_sub_groundr   r   rf  s     r   
sub_groundzDMP.sub_ground  rh  r   c                \    |                      | j                            |                    S z5Multiply ``f`` by a an element of the ground domain. )_mul_groundr   r   rf  s     r   
mul_groundzDMP.mul_ground  rh  r   c                \    |                      | j                            |                    S z8Quotient of ``f`` by a an element of the ground domain. )_quo_groundr   r   rf  s     r   
quo_groundzDMP.quo_ground  rh  r   c                \    |                      | j                            |                    S z>Exact quotient of ``f`` by a an element of the ground domain. )_exquo_groundr   r   rf  s     r   exquo_groundzDMP.exquo_ground  s"    qu}}Q//000r   c                \    |                      |          \  }}|                    |          S z2Add two multivariate polynomials ``f`` and ``g``. )r   _addr   r   rP  Gs       r   addzDMP.add  %    {{1~~1vvayyr   c                \    |                      |          \  }}|                    |          S z7Subtract two multivariate polynomials ``f`` and ``g``. )r   _subr|  s       r   subzDMP.sub  r  r   c                \    |                      |          \  }}|                    |          S z7Multiply two multivariate polynomials ``f`` and ``g``. )r   _mulr|  s       r   mulzDMP.mul  r  r   c                *    |                                  S (Square a multivariate polynomial ``f``. )_sqrr   s    r   sqrzDMP.sqr  s    vvxxr   c                    t          |t                    st          dt          |          z            |                     |          S )+Raise ``f`` to a non-negative power ``n``. ``int`` expected, got %s)r   r   	TypeErrorr   _powr3  s     r   powzDMP.pow  s?    !S!! 	B6a@AAAvvayyr   c                \    |                      |          \  }}|                    |          S /Polynomial pseudo-division of ``f`` and ``g``. )r   _pdivr|  s       r   pdivzDMP.pdiv	  %    {{1~~1wwqzzr   c                \    |                      |          \  }}|                    |          S 0Polynomial pseudo-remainder of ``f`` and ``g``. )r   _premr|  s       r   premzDMP.prem  r  r   c                \    |                      |          \  }}|                    |          S /Polynomial pseudo-quotient of ``f`` and ``g``. )r   _pquor|  s       r   pquozDMP.pquo  r  r   c                \    |                      |          \  }}|                    |          S 5Polynomial exact pseudo-quotient of ``f`` and ``g``. )r   _pexquor|  s       r   pexquoz
DMP.pexquo  s%    {{1~~1yy||r   c                \    |                      |          \  }}|                    |          S z7Polynomial division with remainder of ``f`` and ``g``. )r   _divr|  s       r   divzDMP.div  r  r   c                \    |                      |          \  }}|                    |          S z2Computes polynomial remainder of ``f`` and ``g``. )r   _remr|  s       r   remzDMP.rem"  r  r   c                \    |                      |          \  }}|                    |          S z1Computes polynomial quotient of ``f`` and ``g``. )r   _quor|  s       r   quozDMP.quo'  r  r   c                \    |                      |          \  }}|                    |          S z7Computes polynomial exact quotient of ``f`` and ``g``. )r   _exquor|  s       r   exquoz	DMP.exquo,  s%    {{1~~1xx{{r   c                    t           r   r   rf  s     r   re  zDMP._add_ground1  r   r   c                    t           r   r   rf  s     r   rk  zDMP._sub_ground4  r   r   c                    t           r   r   rf  s     r   ro  zDMP._mul_ground7  r   r   c                    t           r   r   rf  s     r   rs  zDMP._quo_ground:  r   r   c                    t           r   r   rf  s     r   rw  zDMP._exquo_ground=  r   r   c                    t           r   r   r   r   s     r   r{  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   r3  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                    t          |t                    st          dt          |          z            |                     |          S )0Returns the leading degree of ``f`` in ``x_j``. r  )r   r   r  r   _degreer   r  s     r   r1  z
DMP.degreeg  s?    !S!! 	B6a@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                   |                                  }i }|t          |                                 d         d                   k    }|                                 D ]z}t          |d                   }||k     r||z
  }nd}|r|d         ||d         |fz   <   =t	          |d                   }||xx         |z  cc<   |d         |t          |          <   {t                              || 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dr0  ls	            r   
homogenizezDMP.homogenizey  s    ^^3qwwyy|A///
GGII 	+ 	+DDGA2vvF +)-atAw!~&&aMM!	#'7uQxx  }}VQUS__%<aeDDDr   c                    | j         rt           S |                                 }t          |d                   }|D ]}t          |          }||k    r dS |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  se    9 	3J6!9~~ 	 	EJJE}}tt  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|                     |          S t          d          )+Returns the ``n``-th coefficient of ``f``. c              3  @   K   | ]}t          |t                    V  d S r   )r   r   )r   r  s     r   r   zDMP.nth.<locals>.<genexpr>  s,      --az!S!!------r   za sequence of integers expected)r   _nthr  r   Ns     r   nthzDMP.nth  s@    --1----- 	?66!99=>>>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   r   c                    t          |t                    st          dt          |          z            t          |t                    st          dt          |          z            |                     ||          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  sp    !S!! 	B6a@AAA!S!! 	B6a@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            |                     ||          S )<Computes the ``m``-th order derivative of ``f`` in ``x_j``. r  )r   r   r  r   _diffr  s      r   diffzDMP.diff  sn    !S!! 	B6a@AAA!S!! 	B6a@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|                     ||          S |                     |          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  s    !S!! 	>6a@AAAq////AE////81<===5 	;;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                    |                      |          \  }}|j        rt          d          |                    |          S )2Half extended Euclidean algorithm, if univariate. univariate polynomial expected)r   r   r  _half_gcdexr|  s       r   
half_gcdexzDMP.half_gcdex  s@    {{1~~15 	?=>>>}}Qr   c                    t           r   r   r  s     r   r  zDMP._half_gcdex  r   r   c                    |                      |          \  }}|j        rt          d          |j        j        st          d          |                    |          S )-Extended Euclidean algorithm, if univariate. r  zground domain must be a field)r   r   r  r   is_Fieldr   _gcdexr|  s       r   gcdexz	DMP.gcdex  sY    {{1~~15 	?=>>>u~ 	?=>>>xx{{r   c                    t           r   r   r  s     r   r!  z
DMP._gcdex  r   r   c                    |                      |          \  }}|j        rt          d          |                    |          S )(Invert ``f`` modulo ``g``, if possible. r  )r   r   r  _invertr|  s       r   invertz
DMP.invert  s>    {{1~~15 	?=>>>yy||r   c                    t           r   r   r  s     r   r&  zDMP._invert  r   r   c                X    | j         rt          d          |                     |          S )"Compute ``f**(-1)`` mod ``x**n``. r  )r   r  _revertr3  s     r   revertz
DMP.revert  s+    5 	?=>>>yy||r   c                    t           r   r   r3  s     r   r+  zDMP._revert  r   r   c                \    |                      |          \  }}|                    |          S 7Computes subresultant PRS sequence of ``f`` and ``g``. )r   _subresultantsr|  s       r   subresultantszDMP.subresultants  s)    {{1~~1"""r   c                    t           r   r   r  s     r   r1  zDMP._subresultants   r   r   c                    |                      |          \  }}|r|                    |          S |                    |          S )/Computes resultant of ``f`` and ``g`` via PRS. )r   _resultant_includePRS
_resultant)r   r   
includePRSrP  r}  s        r   	resultantzDMP.resultant#  sA    {{1~~1 	#**1---<<??"r   c                    t           r   r   )r   r   r8  s      r   r7  zDMP._resultant+  r   r   c                    t            Computes discriminant of ``f``. r   r   s    r   discriminantzDMP.discriminant.  r   r   c                \    |                      |          \  }}|                    |          S z4Returns GCD of ``f`` and ``g`` and their cofactors. )r   
_cofactorsr|  s       r   	cofactorszDMP.cofactors2  s%    {{1~~1||Ar   c                    t           r   r   r  s     r   rA  zDMP._cofactors7  r   r   c                \    |                      |          \  }}|                    |          S z+Returns polynomial GCD of ``f`` and ``g``. )r   _gcdr|  s       r   gcdzDMP.gcd:  r  r   c                    t           r   r   r  s     r   rF  zDMP._gcd?  r   r   c                \    |                      |          \  }}|                    |          S +Returns polynomial LCM of ``f`` and ``g``. )r   _lcmr|  s       r   lcmzDMP.lcmB  r  r   c                    t           r   r   r  s     r   rL  zDMP._lcmG  r   r   Tc                    |                      |          \  }}|r|                    |          S |                    |          S 6Cancel common factors in a rational function ``f/g``. )r   _cancel_include_cancel)r   r   includerP  r}  s        r   cancelz
DMP.cancelJ  sA    {{1~~1 	 $$Q'''99Q<<r   c                    t           r   r   r  s     r   rS  zDMP._cancelS  r   r   c                    t           r   r   r  s     r   rR  zDMP._cancel_includeV  r   r   c                \    |                      | 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   r[  s     r   rZ  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                \    |                      |          \  }}|                    |          S z4Computes functional composition of ``f`` and ``g``. )r   _composer|  s       r   composezDMP.composel  s%    {{1~~1zz!}}r   c                    t           r   r   r  s     r   rj  zDMP._composeq  r   r   c                V    | j         rt          d          |                                 S ),Computes functional decomposition of ``f``. r  )r   r  
_decomposer   s    r   	decomposezDMP.decomposet  s)    5 	?=>>>||~~r   c                    t           r   r   r   s    r   ro  zDMP._decompose{  r   r   c                    | j         rt          d          |                     | j                            |                    S )/Efficiently compute Taylor shift ``f(x + a)``. r  )r   r  _shiftr   r   r  s     r   shiftz	DMP.shift~  s;    5 	?=>>>xxa(()))r   c                J      fd|D             }                      |          S )/Efficiently compute Taylor shift ``f(X + A)``. c                D    g | ]}j                             |          S r~   )r   r   )r   air   s     r   r  z"DMP.shift_list.<locals>.<listcomp>  s'    +++2QU]]2+++r   )_shift_listr  s   ` r   
shift_listzDMP.shift_list  s.    +++++++}}Qr   c                    t           r   r   r  s     r   rt  z
DMP._shift  r   r   c                    | j         rt          d          |                    |          \  }}|                     |          \  }}|                    |          \  }}|                    ||          S )5Evaluate functional transformation ``q**n * f(p/q)``.r  )r   r  r   
_transform)r   r\  qrV  QrP  s         r   	transformzDMP.transform  sh    5 	?=>>>{{1~~1{{1~~1{{1~~1||Aq!!!r   c                    t           r   r   r   r\  r  s      r   r  zDMP._transform  r   r   c                V    | j         rt          d          |                                 S )&Computes the Sturm sequence of ``f``. r  )r   r  _sturmr   s    r   sturmz	DMP.sturm  s)    5 	?=>>>xxzzr   c                    t           r   r   r   s    r   r  z
DMP._sturm  r   r   c                V    | j         rt          d          |                                 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  -    5 	?=>>>$$&&&r   c                    t           r   r   r   s    r   r  zDMP._cauchy_upper_bound  r   r   c                V    | j         rt          d          |                                 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                V    | j         rt          d          |                                 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-    5 	?=>>>,,...r   c                    t           r   r   r   s    r   r  zDMP._mignotte_sep_bound_squared  r   r   c                V    | j         rt          d          |                                 S )4Computes greatest factorial factorization of ``f``. r  )r   r  	_gff_listr   s    r   gff_listzDMP.gff_list  s)    5 	?=>>>{{}}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|                     ||||          S |r|s|                     ||||          S |s|r|                     ||||          S |                     ||||          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    5 	W!"UVVV 	O3 	O++#D+QQQ 	O 	O''CSc'MMM 	O 	O,,#3T,RRR((Scs(N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                b    | j         rt          d          |                     |||||          S )zu
        Refine an isolating interval to the given precision.

        ``eps`` should be a rational number.

        z1Cannot refine a root of a multivariate polynomialr  stepsr  )r   r{   _refine_real_rootr   r  tr  r  r  s         r   refine_rootzDMP.refine_root  sH     5 	E!CE E E ""1aSD"I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                *    |                                  S r   )r^  r   s    r   __abs__zDMP.__abs__W      uuwwr   c                *    |                                  S r   rb  r   s    r   __neg__zDMP.__neg__Z  r  r   c                    t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S w xY wr   )r   r   r~  rg  r   NotImplementedr  s     r   __add__zDMP.__add__]  _    a 	&5588O&||A&! & & &%%%%&   A AAc                ,    |                      |          S r   r  r  s     r   __radd__zDMP.__radd__f      yy||r   c                    t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S w xY wr   )r   r   r  rl  r   r  r  s     r   __sub__zDMP.__sub__i  r  r  c                .    |                       |          S r   r	  r  s     r   __rsub__zDMP.__rsub__r      ||Ar   c                    t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S w xY wr   )r   r   r  rp  r   r  r  s     r   __mul__zDMP.__mul__u  r  r  c                ,    |                      |          S r   r  r  s     r   __rmul__zDMP.__rmul__~  r  r   c                    t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S w xY wr   )r   r   r  rp  r   r  r  s     r   __truediv__zDMP.__truediv__  s`    a 	&771::&||A&! & & &%%%%&r  c                    t          |t                    r|                    |           S 	 |                                                     |                              |           S # t
          $ r
 t          cY S w xY wr   )r   r   r  r   rp  r   r  r  s     r   __rtruediv__zDMP.__rtruediv__  sz    a 	&771::&vvxx**1--33A666! & & &%%%%&s   9A& &A:9A:c                ,    |                      |          S r   r  r3  s     r   __pow__zDMP.__pow__      uuQxxr   c                ,    |                      |          S r   r  r  s     r   
__divmod__zDMP.__divmod__  r  r   c                ,    |                      |          S r   r  r  s     r   __mod__zDMP.__mod__  r  r   c                    t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S w xY wr   )r   r   r  rt  r  r  r  s     r   __floordiv__zDMP.__floordiv__  s_    a 	&5588O&||A& & & &%%%%&r  c                    | |u rdS t          |t                    st          S 	 |                     |          \  }}|                    |          S # t
          $ r Y dS w xY w)NTF)r   r   r  r   
_strict_eqrz   r|  s       r   __eq__z
DMP.__eq__  sv    664!S!! 	"!!	#;;q>>DAq <<??" ! 	 	 	55	s   A 
AAc                    t           r   r   r  s     r   r'  zDMP._strict_eq  r   r   c                <    |s| |k    S |                      |          S r   )r'  r   r   stricts      r   eqzDMP.eq  s#     	#6M<<??"r   c                2    |                      ||           S )N)r,  )r-  r+  s      r   nezDMP.ne  s    44&4))))r   c                    |                      |          \  }}|                                |                                k     S r   r   r   r|  s       r   __lt__z
DMP.__lt__  0    {{1~~1yy{{QYY[[((r   c                    |                      |          \  }}|                                |                                k    S r   r1  r|  s       r   __le__z
DMP.__le__  0    {{1~~1yy{{aiikk))r   c                    |                      |          \  }}|                                |                                k    S r   r1  r|  s       r   __gt__z
DMP.__gt__  r3  r   c                    |                      |          \  }}|                                |                                k    S r   r1  r|  s       r   __ge__z
DMP.__ge__  r6  r   c                    | j          S r   )r&  r   s    r   __bool__zDMP.__bool__  s    9}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,  r4  r7  r;  r:  r@  rF  rK  rQ  rM  rW  rT  r[  r^  rb  rg  rl  rp  rt  rx  r~  r  r  r  r  r  r  r  r  r  r  r  r  re  rk  ro  rs  rw  r{  r  r  r  r  r  r  r  r  r  r  r  r  r1  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r!  r'  r&  r,  r+  r2  r1  r9  r7  r>  rB  rA  rG  rF  rM  rL  rU  rS  rR  r]  rZ  ra  rd  rg  rk  rj  rp  ro  ru  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  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r   r#  r%  r(  r'  r-  r/  r2  r5  r8  r:  r<  r~   r   r   r   r      s       33I& & & & 	. 	. [	.   X 
 
 
   [ & & [& C C [C @ @ [@ > > [>3 3 3&" " " , , [, 0 0 [0" " "I I IH H H2 2 2" " "
 
 
A A A A   0 0 0" " "" " "+ + +, , ,, , ,) ) ) )" " "" " "6 6 6 66 6 6 6) ) ) )" " " "% % %
C 
C 
C
H 
H 
H# # #" " "" " "" " " "" " " "  &" " "  &" " "" " "" " "" " "/ / // / // / // / /1 1 1  
  
  
      
  
  
  
  
  
  
  
" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "" " "   " " "" " "" " "E E E&   " " "" " "? ? ?" " "" " "" " "" " "" " "" " " "" " "   " " "
 
 
 
" " "" " "     " " "
 
 
" " "  " " "  " " "# # #
" " "# # # #" " " "" " "  
" " "  
" " "  
" " "       " " "" " "* * *" " "" " "" " "" " "  
" " "  " " "* * *     
" " "	" 	" 	"" " "  " " "' ' '" " "' ' '" " "/ / /" " "  " " "" " "" " "" " "" " " "" " " "" " "" " "O O O O" " "" " "" " "" " "J J J J" " "" " " "" " " " " " X" " " X" " " X" " " X" " " X" " " X" " " X" " " X" " " X" " " X" " " X" " " X"    & & &  & & &  & & &  & & && & &      & & &
# 
# 
#" " "# # # #* * * *) ) )* * *) ) )* * *    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drdZd Zd ZdsdZdsd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-dtd.Z.d/ Z/d0 Z0d1 Z1d2 Z2d3 Z3d4 Z4d5 Z5d6 Z6d7 Z7dud9Z8dud:Z9d; Z:d< Z;d= Z<d> Z=d? Z>d@ Z?dA Z@dB ZAdC ZBdD ZCdE ZDdF ZEdG ZFdH ZGdI ZHdJ ZIdK ZJdL ZKdM ZLdN ZMdO ZNdP ZOdQ ZPdR ZQdS ZRdT ZSdU ZTdV ZUdW ZVdX ZWdY ZXdZ ZYdsd[ZZdsd\Z[d] Z\d^ Z]d_ Z^d` Z_da Z`db Zadc ZbdvddZcdvdeZdeedf             Zfeedg             Zgeedh             Zheedi             Zieedj             Zjeedk             Zkeedl             Zleedm             Zmeedn             Zneedo             Zoeedp             Zpeedq             ZqdS )wr   r   )r   r   r   c                d    t                               |           }||_        ||_        ||_        |S r   )objectr   r   r   r   )r   r   r   r   objs        r   r   zDMP_Python._new  s-    nnS!!
r   c                    t          |           t          |          k    rdS | j        |j        k    o| j        |j        k    o| j        |j        k    S NF)r   r   r   r   r  s     r   r'  zDMP_Python._strict_eq  sG    77d1gg5u~E!%15.EQVqv5EEr   c                D    |                      || j        | j                  S ).Create a DMP out of the given representation. )r   r   r   r   r   s     r   perzDMP_Python.per  s    vvc15!%(((r   c                j    |                      t          || j                  | j        | j                  S r   )r   r    r   r   r   s     r   r   zDMP_Python.ground_new  s(    vvj..qu===r   c                B    |                      | j        | j                  S r   )r   r   r   r   s    r   r   zDMP_Python._one  s    uuQUAE"""r   c                    t          |t                    r j        |j        k    rt          d d|           j        |j        k    r  j         j         j         j        |j        fS  j         j                            |j                  ct           j         j                  }t          |j        |j                  } fd}|||fS )z7Unify representations of two multivariate polynomials. r   r   c                2                         |           S r   )r   )r   r   r   r   s    r   rP  zDMP_Python.unify.<locals>.per  s    vvc3,,,r   )	r   r   r   rz   r   rP  r   r   r   )r   r   rP  r}  rP  r   r   s   `    @@r   r   zDMP_Python.unify  s     !S!! 	HQUae^^##AA$FGGG5AE>>5!%66uaekk!%00HCAFC44AAFC44A- - - - - - - S!Q&&r   c                X    t                               | 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    ~~afaeQU333r   c                *    t          | j                  S r   )r   r   r   s    r   r   zDMP_Python.to_list  s    AF||r   c                6    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    AFAE***r   c                x    |                      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  s.    vvk!&!%<<c15IIIr   c                |    t          | j        ||| j                  }|                     || j        | j                  S r  )r.   r   r   r   r   )r   r  r  r   s       r   r  zDMP_Python._slice  s3    1ae,,vvc15!%(((r   c                    t          | 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  s9    161aAE1599vvc15!%(((r   Nc                F    t          | j        | j        | j        |          S )r$  r  )r,   r   r   r   r  s     r   r'  zDMP_Python._terms  s    afaeQU%@@@@r   c                    t          | j        | j        | j                  }|                     || j        j        | j                  S r9  )rY   r   r   r   r   r   r   s     r   r:  zDMP_Python._lift   s5    QVQUAE**vvaAE***r   c                v    t          | j        | j        | j                  \  }}||                     |          fS r>  )r(   r   r   r   rP  rN  s      r   r@  zDMP_Python.deflate%  s1    1615!%001!%%(({r   Fc                    t          | j        | j        | j        |          \  }}|                     || j        j        |          S )rC  rE  )r)   r   r   r   r   )r   rE  rP  r   s       r   rF  zDMP_Python.inject*  s<    AFAE15>>>3vvaC(((r   c                    t          | j        | j        ||          }|                     ||| j        t	          |j                  z
            S )rI  rb  )r*   r   r   r   r  symbols)r   r   rE  rP  s       r   rK  zDMP_Python.eject0  sC    afaeS666vvaaec#+&6&66777r   c                    t          | j        | j        | j                  \  }}}||                     || j        |          fS z&Remove useless generators from ``f``. )r-   r   r   r   r   )r   rO  rP  us       r   rM  zDMP_Python._exclude6  s<    afaeQU331a!&&AE1%%%%r   c                j    |                      t          | j        || j        | j                            S z6Returns a polynomial in `K[x_{P(1)}, ..., x_{P(n)}]`. )rP  r0   r   r   r   rU  s     r   rT  zDMP_Python._permute<  s(    uu[AE1599:::r   c                v    t          | j        | j        | j                  \  }}||                     |          fS rZ  )r+   r   r   r   rP  rN  s      r   r[  zDMP_Python.terms_gcd@  s1    QVQUAE221!%%(({r   c                j    |                      t          | j        || j        | j                            S rd  )rP  r2   r   r   r   rf  s     r   re  zDMP_Python._add_groundE  (    uu^AFAquae<<===r   c                j    |                      t          | j        || j        | j                            S rj  )rP  r3   r   r   r   rf  s     r   rk  zDMP_Python._sub_groundI  rl  r   c                j    |                      t          | j        || j        | j                            S rn  )rP  r4   r   r   r   rf  s     r   ro  zDMP_Python._mul_groundM  rl  r   c                j    |                      t          | j        || j        | j                            S rr  )rP  r5   r   r   r   rf  s     r   rs  zDMP_Python._quo_groundQ  rl  r   c                j    |                      t          | j        || j        | j                            S rv  )rP  r6   r   r   r   rf  s     r   rw  zDMP_Python._exquo_groundU  )    uu%afa>>???r   c                h    |                      t          | j        | j        | j                            S r]  )rP  r7   r   r   r   r   s    r   r^  zDMP_Python.absY  &    uuWQVQUAE22333r   c                h    |                      t          | j        | j        | j                            S r`  )rP  r8   r   r   r   r   s    r   rb  zDMP_Python.neg]  rs  r   c                t    |                      t          | j        |j        | j        | j                            S rz  )rP  r9   r   r   r   r  s     r   r{  zDMP_Python._adda  *    uuWQVQVQUAE::;;;r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  r:   r   r   r   r  s     r   r  zDMP_Python._sube  rv  r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  r;   r   r   r   r  s     r   r  zDMP_Python._muli  rv  r   c                h    |                      t          | j        | j        | j                            S r  )rP  r<   r   r   r   r   s    r   r  zDMP_Python.sqrm  rs  r   c                j    |                      t          | j        || j        | j                            S r  )rP  r=   r   r   r   r3  s     r   r  zDMP_Python._powq  s(    uuWQVQqu55666r   c                    t          | j        |j        | j        | j                  \  }}|                     |          |                     |          fS r  )r>   r   r   r   rP  r   r   r  r   s       r   r  zDMP_Python._pdivu  s@    qu551uuQxxq!!r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  r?   r   r   r   r  s     r   r  zDMP_Python._premz  *    uuXafafaeQU;;<<<r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  r@   r   r   r   r  s     r   r  zDMP_Python._pquo~  r  r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  rA   r   r   r   r  s     r   r  zDMP_Python._pexquo  s*    uuZqu==>>>r   c                    t          | j        |j        | j        | j                  \  }}|                     |          |                     |          fS r  )rB   r   r   r   rP  r}  s       r   r  zDMP_Python._div  s@    qvqvquae441uuQxxq!!r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  rC   r   r   r   r  s     r   r  zDMP_Python._rem  rv  r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  rD   r   r   r   r  s     r   r  zDMP_Python._quo  rv  r   c                t    |                      t          | j        |j        | j        | j                            S r  )rP  rE   r   r   r   r  s     r   r  zDMP_Python._exquo  s*    uuYqvqvquae<<===r   r   c                8    t          | j        || j                  S )r  )r   r   r   r  s     r   r  zDMP_Python._degree  s    QVQ...r   c                6    t          | j        | j                  S r  )r   r   r   r   s    r   r  zDMP_Python.degree_list  s    qvqu---r   c                X    t          d |                                 D                       S )r  c              3  4   K   | ]}t          |          V  d S r   r  )r   r  s     r   r   z*DMP_Python.total_degree.<locals>.<genexpr>  s(      ..a3q66......r   )maxr   r   s    r   r  zDMP_Python.total_degree  s'    ..188::......r   c                B    t          | j        | j        | j                  S r  )r   r   r   r   r   s    r   r  zDMP_Python.LC      QVQUAE222r   c                B    t          | j        | j        | j                  S r  )r   r   r   r   r   s    r   r  zDMP_Python.TC  r  r   c                D    t          | j        || j        | j                  S r  )r   r   r   r   r  s     r   r  zDMP_Python._nth  s    afa666r   c                B    t          | j        | j        | j                  S r  )rH   r   r   r   r   s    r   r  zDMP_Python.max_norm  s    AFAE15111r   c                B    t          | j        | j        | j                  S r  )rI   r   r   r   r   s    r   r  zDMP_Python.l1_norm  s    1615!%000r   c                B    t          | j        | j        | j                  S r  )rJ   r   r   r   r   s    r   r  zDMP_Python.l2_norm_squared  s    "1615!%888r   c                v    t          | j        | j        | j                  \  }}||                     |          fS r  )rK   r   r   r   rP  )r   r   rP  s      r   r  zDMP_Python.clear_denoms  s1    #AFAE1599qaeeAhhr   r   c           	     l    |                      t          | j        ||| j        | j                            S )r  )rP  rL   r   r   r   r  s      r   r  zDMP_Python._integrate  s+    uu%afaAE15AABBBr   c           	     l    |                      t          | j        ||| j        | j                            S )r
  )rP  rM   r   r   r   r  s      r   r  zDMP_Python._diff  s*    uu[Aquae<<===r   c                v    t          | j        | j                            |          d| j        | j                  S r   )rN   r   r   r   r   r  s     r   r  zDMP_Python._eval  s,    1615==#3#3QquEEEr   c                    t          | 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  sI    !&!%--"2"2AquaeDDuuS!%+++r   c                    t          | j        |j        | j                  \  }}|                     |          |                     |          fS )r  )rZ   r   r   rP  r   r   r  hs       r   r  zDMP_Python._half_gcdex  s<    afafae441uuQxxq!!r   c                    t          | j        |j        | j                  \  }}}|                     |          |                     |          |                     |          fS )r  )r[   r   r   rP  )r   r   r  r  r  s        r   r!  zDMP_Python._gcdex  sJ    AFAFAE221auuQxxq15588++r   c                l    t          | j        |j        | j                  }|                     |          S )r%  )r\   r   r   rP  )r   r   r  s      r   r&  zDMP_Python._invert  s(    qvqvqu--uuQxxr   c                ^    |                      t          | j        || j                            S r*  )rP  rO   r   r   r3  s     r   r+  zDMP_Python._revert  s$    uuZ1511222r   c                    t          | j        |j        | j        | j                  }t	          t          | j        |                    S r/  )r]   r   r   r   r   maprP  r   r   Rs      r   r1  zDMP_Python._subresultants  s5    afafaeQU;;CqMM"""r   c                    t          | j        |j        | j        | j        d          \  }}| j        r$|                     || j        | j        dz
            }|t          t          | j        |                    fS )r5  T)r8  r   )r^   r   r   r   r   r   r  rP  r   r   resr  s       r   r6  z DMP_Python._resultant_includePRS  sj    qvqvquaeMMMQ5 	/%%QUAEAI..CDQUA''''r   c                    t          | j        |j        | j        | j                  }| j        r$|                     || j        | j        dz
            }|S r  )r^   r   r   r   r   )r   r   r  s      r   r7  zDMP_Python._resultant  sI    AFAFAE15995 	/%%QUAEAI..C
r   c                    t          | j        | j        | j                  }| j        r$|                     || j        | j        dz
            }|S )r=  r   )r_   r   r   r   r   )r   r  s     r   r>  zDMP_Python.discriminant  sE    qvquae445 	/%%QUAEAI..C
r   c                    t          | j        |j        | j        | j                  \  }}}|                     |          |                     |          |                     |          fS r@  )r`   r   r   r   rP  )r   r   r  cffcfgs        r   rA  zDMP_Python._cofactors  sN    #AFAFAE15AA3uuQxxsQUU3ZZ//r   c                t    |                      t          | j        |j        | j        | j                            S rE  )rP  ra   r   r   r   r  s     r   rF  zDMP_Python._gcd   rv  r   c                t    |                      t          | j        |j        | j        | j                            S rJ  )rP  rb   r   r   r   r  s     r   rL  zDMP_Python._lcm  rv  r   c                    t          | j        |j        | j        | j        d          \  }}}}|||                     |          |                     |          fS )rQ  FrT  rc   r   r   r   rP  r   r   cFcGrP  r}  s         r   rS  zDMP_Python._cancel  sM    !!&!&!%NNNB12quuQxxq))r   c                    t          | j        |j        | j        | j        d          \  }}|                     |          |                     |          fS )rQ  Tr  r  r|  s       r   rR  zDMP_Python._cancel_include  sE    !&!&!%EEE1uuQxxq!!r   c                j    |                      t          | j        || j        | j                            S rY  )rP  rP   r   r   r   r[  s     r   rZ  zDMP_Python._trunc  rq  r   c                h    |                      t          | j        | j        | j                            S r`  )rP  rS   r   r   r   r   s    r   ra  zDMP_Python.monic  s'    uu%afaeQU;;<<<r   c                B    t          | j        | j        | j                  S rc  )rQ   r   r   r   r   s    r   rd  zDMP_Python.content  s    !!&!%777r   c                v    t          | j        | j        | j                  \  }}||                     |          fS rf  )rR   r   r   r   rP  )r   contrP  s      r   rg  zDMP_Python.primitive  s1    &qvquae<<aQUU1XX~r   c                t    |                      t          | j        |j        | j        | j                            S ri  )rP  rT   r   r   r   r  s     r   rj  zDMP_Python._compose#  s*    uu[>>???r   c           	     v    t          t          | j        t          | j        | j                                      S )rn  )r   r  rP  rU   r   r   r   s    r   ro  zDMP_Python._decompose'  s*    C}QVQU;;<<===r   c                ^    |                      t          | j        || j                            S rs  )rP  rV   r   r   r  s     r   rt  zDMP_Python._shift+  s$    uuYqvq!%00111r   c                j    |                      t          | j        || j        | j                            S )rw  )rP  rW   r   r   r   r  s     r   rz  zDMP_Python._shift_list/  s(    uuYqvq!%77888r   c                t    |                      t          | j        |j        |j        | j                            S r~  )rP  rX   r   r   r  s      r   r  zDMP_Python._transform3  s*    uu]16161615AABBBr   c           	     v    t          t          | j        t          | j        | j                                      S )r  )r   r  rP  rv   r   r   r   s    r   r  zDMP_Python._sturm7  s*    Cy7788999r   c                6    t          | j        | j                  S r  )rw   r   r   r   s    r   r  zDMP_Python._cauchy_upper_bound;      %afae444r   c                6    t          | j        | j                  S r  )rx   r   r   r   s    r   r  zDMP_Python._cauchy_lower_bound?  r  r   c                6    t          | j        | j                  S r  )ry   r   r   r   s    r   r  z&DMP_Python._mignotte_sep_bound_squaredC  s    -afae<<<r   c                P      fdt           j         j                  D             S )r  c                D    g | ]\  }}                     |          |fS r~   rP  r   r   r   r   s      r   r  z(DMP_Python._gff_list.<locals>.<listcomp>I  s+    HHH41a!%%((AHHHr   )rd   r   r   r   s   `r   r  zDMP_Python._gff_listG  s+    HHHH<+F+FHHHHr   c                    t          | j        | j        | j                  }|                     || j        j        | j                  S r  )re   r   r   r   r   r_  s     r   r  zDMP_Python.normK  s5    QVQUAE**uuQ	15)))r   c                    t          | j        | j        | j                  \  }}}||                     |          |                     || j        j        | j                  fS r  )rg   r   r   r   rP  r   )r   r  r   r   s       r   r  zDMP_Python.sqf_normP  sL    qvquae441a!%%((AEE!QUY6666r   c                h    |                      t          | j        | j        | j                            S r  )rP  rh   r   r   r   r   s    r   r  zDMP_Python.sqf_partU  s&    uu\!&!%77888r   c                l     t           j         j         j        |          \  }}| fd|D             fS )r  c                D    g | ]\  }}                     |          |fS r~   r  r  s      r   r  z'DMP_Python.sqf_list.<locals>.<listcomp>\  +    ;;;$!Qq1;;;r   )ri   r   r   r   r   r   r   factorss   `   r   r  zDMP_Python.sqf_listY  s@    %afaeQUC@@w;;;;';;;;;r   c                b     t           j         j         j        |          } fd|D             S )r  c                D    g | ]\  }}                     |          |fS r~   r  r  s      r   r  z/DMP_Python.sqf_list_include.<locals>.<listcomp>a  +    44441a!%%((A444r   )rj   r   r   r   r   r   r  s   `  r   r  zDMP_Python.sqf_list_include^  s6    &qvquaeSAA444474444r   c                j     t           j         j         j                  \  }}| fd|D             fS )r  c                D    g | ]\  }}                     |          |fS r~   r  r  s      r   r  z*DMP_Python.factor_list.<locals>.<listcomp>f  r  r   )rm   r   r   r   )r   r   r  s   `  r   r  zDMP_Python.factor_listc  s>    (>>w;;;;';;;;;r   c                `     t           j         j         j                  } fd|D             S )r  c                D    g | ]\  }}                     |          |fS r~   r  r  s      r   r  z2DMP_Python.factor_list_include.<locals>.<listcomp>k  r  r   )rn   r   r   r   r   r  s   ` r   r  zDMP_Python.factor_list_includeh  s4    )!&!%??444474444r   c                @    t          | j        | j        ||||          S Nr  )rp   r   r   r  s        r   r  zDMP_Python._isolate_real_rootsm  s"    %afae#3UYZZZZr   c                @    t          | j        | j        ||||          S r  )ro   r   r   r  s        r   r  z"DMP_Python._isolate_real_roots_sqfp  s"    )!&!%ScsY]^^^^r   c                @    t          | j        | j        ||||          S r  )rr   r   r   r  s        r   r  zDMP_Python._isolate_all_rootss  s"    $QVQU#TXYYYYr   c                @    t          | j        | j        ||||          S r  )rq   r   r   r  s        r   r  z!DMP_Python._isolate_all_roots_sqfv  s"    (CScX\]]]]r   c           	     B    t          | j        ||| j        |||          S )Nr  )rs   r   r   r  s         r   r  zDMP_Python._refine_real_rooty  s$    #AFAq!%STXYYYYr   c                <    t          | j        | j        ||          S r  r  r  )rt   r   r   r  s      r   r  zDMP_Python.count_real_roots|  s    #AFAEsDDDDr   c                <    t          | j        | j        ||          S r  r  )ru   r   r   r  s      r   r  zDMP_Python.count_complex_roots  s    &qvqu#3GGGGr   c                6    t          | j        | j                  S r  )r"   r   r   r   s    r   r&  zDMP_Python.is_zero  s     !&!%(((r   c                B    t          | j        | j        | j                  S r  )r#   r   r   r   r   s    r   r  zDMP_Python.is_one       ...r   c                8    t          | j        d| j                  S )r  N)r$   r   r   r   s    r   r  zDMP_Python.is_ground  s     AFD!%000r   c                B    t          | j        | j        | j                  S r  )rf   r   r   r   r   s    r   r  zDMP_Python.is_sqf  r  r   c                r    | j                             t          | j        | j        | j                             S r  )r   r  r   r   r   r   s    r   r  zDMP_Python.is_monic  s*     u||M!&!%??@@@r   c                r    | j                             t          | j        | j        | j                             S r  )r   r  rQ   r   r   r   s    r   r  zDMP_Python.is_primitive  s+     u||.qvquaeDDEEEr   c                    t          d t          | j        | j        | j                                                  D                       S )r  c              3  <   K   | ]}t          |          d k    V  dS )r   Nr  r   r  s     r   r   z'DMP_Python.is_linear.<locals>.<genexpr>  ,      YYu3u::?YYYYYYr   r   r'   r   r   r   keysr   s    r   r  zDMP_Python.is_linear  ?     YYAFAE150Q0Q0V0V0X0XYYYYYYr   c                    t          d t          | j        | j        | j                                                  D                       S )r  c              3  <   K   | ]}t          |          d k    V  dS )   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                L    t          |                                           dk    S )r  r   )r  r   r   s    r   r  zDMP_Python.is_monomial  s     199;;1$$r   c                .    |                                  duS )r  N)r  r   s    r   r  zDMP_Python.is_homogeneous  s     ""$$D00r   c                B    t          | j        | j        | j                  S r  )rl   r   r   r   r   s    r   r  zDMP_Python.is_irreducible  s     !666r   c                H    | j         st          | j        | j                  S dS )r  F)r   rk   r   r   r   s    r   r  zDMP_Python.is_cyclotomic  s'     u 	#AFAE2225r   r   r=  r%  r>  r@  )rr   rA  rB  rC  rD  rE  r   r'  rP  r   r   r   r   r   r   r   r  r  r'  r:  r@  rF  rK  rM  rT  r[  re  rk  ro  rs  rw  r^  rb  r{  r  r  r  r  r  r  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  r6  r7  r>  rA  rF  rL  rS  rR  rZ  ra  rd  rg  rj  ro  rt  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rF  r&  r  r  r  r  r  r  r  r  r  r  r  r~   r   r   r   r     ss       33&I  [F F F
) ) )> > ># # #' ' '(4 4 4  + + +J J J) ) )
) ) )
A A A A+ + +
  
) ) ) )8 8 8 8& & &; ; ;  
> > >> > >> > >> > >@ @ @4 4 44 4 4< < << < << < <4 4 47 7 7" " "
= = == = =? ? ?" " "
< < << < <> > >/ / / /. . ./ / /3 3 33 3 37 7 72 2 21 1 19 9 9  
C C C C> > > >F F F, , ," " "
, , ,
  
3 3 3# # #
( ( (    0 0 0
< < << < <* * *
" " "
@ @ @= = =8 8 8  
@ @ @> > >2 2 29 9 9C C C: : :5 5 55 5 5= = =I I I* * *
7 7 7
9 9 9< < < <
5 5 5 5
< < <
5 5 5
[ [ [_ _ _Z Z Z^ ^ ^Z Z ZE E E EH H H H ) ) X) / / X/ 1 1 X1 / / X/ A A XA F F XF Z Z XZ Z Z XZ % % X% 1 1 X1 7 7 X7   X  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dudZd Zd ZdvdZdvd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/ Z0d0 Z1dwd1Z2d2 Z3d3 Z4d4 Z5d5 Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;dxd<Z<dxd=Z=d> Z>d? Z?d@ Z@dA ZAdB ZBdC ZCdD ZDdE ZEdF ZFdG ZGdH ZHdI ZIdJ ZJdK ZKdL ZLdM ZMdN ZNdO ZOdP ZPdQ ZQdR ZRdS ZSdT ZTdU ZUdV ZVdW ZWdX ZXdY ZYdZ ZZd[ Z[d\ Z\dvd]Z]dvd^Z^d_ Z_d` Z`da Zadb Zbdc Zcdd Zdde Zedf ZfdydgZgdydhZheidi             Zjeidj             Zkeidk             Zleidl             Zmeidm             Zneidn             Zoeido             Zpeidp             Zqeidq             Zreidr             Zseids             Zteidt             ZudS )zr   r   r   )r   r   _clsc                R    | j         |                                 | j        | j        ffS r   )r   r   r   r   r   s    r   
__reduce__zDUP_Flint.__reduce__  s"    ~$(CCCr   c                n    |                      |d d d         ||          }|                     ||          S N)_flint_polyfrom_repr   s       r   r   zDUP_Flint._new  s5    ooc$$B$ic22||C%%%r   c                F    | j                                         ddd         S )r   Nr  )r   r   r   s    r   r   zDUP_Flint.to_list  s    v}}ttt$$r   c                h    |t           v sJ |dk    sJ |                     |          } ||          S r   )r|   _get_flint_poly_cls)r   r   r   r   	flint_clss        r   r  zDUP_Flint._flint_poly  sA    n$$$$axxxx++C00	y~~r   c                r    |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  s<    9 	N?"Y 	N?"FLMMMr   c                H   |j         r)t          |t          j                  sJ t          j        }nB|j        r)t          |t          j                  sJ t          j        }nt          d|z            t                              |           }||_	        ||_
        ||_        |S )z,Create a DMP from the given representation. r  )r  r   r}   r  r  r  r   rI  r   r   r   r   )r   r   r   r   rJ  s        r   r  zDUP_Flint.from_rep  s     9 	Nc5?33333?DDY 	Nc5?33333?DDFLMMMnnS!!
r   c                    t          |           t          |          k    rdS | j        |j        k    o| j        |j        k    S rL  )r   r   r   r  s     r   r'  zDUP_Flint._strict_eq  s:    77d1gg5u~2!&AF"22r   c                `    |                      |                     |g          | j                  S r   r  r   r   r   s     r   r   zDUP_Flint.ground_new   s$    zz!&&%//15111r   c                @    |                      | j        j                  S r   )r   r   r   r   s    r   r   zDUP_Flint._one  s    ||AEI&&&r   c                    t           )z*Unify representations of two polynomials. )r   r  s     r   r   zDUP_Flint.unify  s    r   c                r    t                               |                                 | 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{{AE15999r   c                D    t          |                                           S rX  )r  r   r   s    r   r   zDUP_Flint.to_tuple  s    QYY[[!!!r   c                n   |t           k    r=| j        t          k    r-|                     t	          j        | j                  |          S |t          k    rI| j        t           k    r9|                                                     |          	                                S t          d| j         d|           )rZ  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    "99"::eoaf55s;;;BYY15B;;??$$--c22??AAALAELLsLLMMMr   c                    | j                                         ||         }|                     |                     |          | j                  S r  )r   r   r  r   r   )r   r  r  r   s       r   r  zDUP_Flint._slice  s:    1%zz!&&..!%000r   c                    t           r  r   r  s       r   r  zDUP_Flint._slice_lev"  r  r   Nc                    ||j         dk    r;d t          | j                                                  D             }|ddd         S |                                                     |          S )r$  Nlexc                "    g | ]\  }}||f|fS r~   r~   )r   r  r   s      r   r  z$DUP_Flint._terms.<locals>.<listcomp>*  s'    MMMDAq!MtQiMMMr   r  r  )aliasr2  r   r   r   r'  )r   r  r  s      r   r'  zDUP_Flint._terms'  sk    =EK500MMIafmmoo,F,FMMME2; ??$$++%+888r   c                    t           r9  r   r   s    r   r:  zDUP_Flint._lift5  r  r   c                    | j         rd| fS | j                                        \  }}|f|                     || j                  fS )r?  )r   )r&  r   	deflationr  r   )r   r   r  s      r   r@  zDUP_Flint.deflate:  sK     9 	7Nv!!1tQZZ15))))r   Fc                    t           rB  r   rD  s     r   rF  zDUP_Flint.injectG  r  r   c                    t           rH  r   rJ  s      r   rK  zDUP_Flint.ejectL  r  r   c                    t           rf  r   r   s    r   rM  zDUP_Flint._excludeQ  r  r   c                    t           ri  r   rU  s     r   rT  zDUP_Flint._permuteV  r  r   c                    |                                                                  \  }}||                                fS rZ  )r   r[  r   rN  s      r   r[  zDUP_Flint.terms_gcd[  s8       **,,1!..""""r   c                H    |                      | j        |z   | j                  S rd  r  r   r   rf  s     r   re  zDUP_Flint._add_grounda      zz!&1*ae,,,r   c                H    |                      | j        |z
  | j                  S rj  r*  rf  s     r   rk  zDUP_Flint._sub_grounde  r+  r   c                H    |                      | j        |z  | j                  S rn  r*  rf  s     r   ro  zDUP_Flint._mul_groundi  r+  r   c                H    |                      | j        |z  | j                  S rr  r*  rf  s     r   rs  zDUP_Flint._quo_groundm      zz!&A+qu---r   c                    t          | j        |          \  }}|rt          | |          |                     || j                  S rv  )divmodr   r   r  r   )r   r   r  r   s       r   rw  zDUP_Flint._exquo_groundq  sE    afa  1 	,%a+++zz!QU###r   c                r    |                                                                                                  S r]  )r   r^  r   r   s    r   r^  zDUP_Flint.absx  s*      $$&&33555r   c                D    |                      | j         | j                  S r`  r*  r   s    r   rb  zDUP_Flint.neg|  s    zz16'15)))r   c                R    |                      | j        |j        z   | j                  S rz  r*  r  s     r   r{  zDUP_Flint._add       zz!&16/15111r   c                R    |                      | j        |j        z
  | j                  S r  r*  r  s     r   r  zDUP_Flint._sub  r5  r   c                R    |                      | j        |j        z  | j                  S r  r*  r  s     r   r  zDUP_Flint._mul  r5  r   c                H    |                      | j        dz  | j                  S )r  r  r*  r   s    r   r  zDUP_Flint.sqr  r/  r   c                H    |                      | j        |z  | j                  S r{  r*  r3  s     r   r  zDUP_Flint._pow  r/  r   c                0   |                                  |                                 z
  dz   }t          |                                |z  | j        z  |j                  \  }}|                     || j                  |                     || j                  fS )r  r   )r1  r1  r  r   r  r   r   r   r  r  r   s        r   r  zDUP_Flint._pdiv  st    HHJJ#a'addffai!&(!&111zz!QU##QZZ15%9%999r   c                    |                                  |                                 z
  dz   }|                                |z  | j        z  |j        z  }|                     || j                  S )r  r   r1  r  r   r  r   )r   r   r  r  s       r   r  zDUP_Flint._prem  sV    HHJJ#a'TTVVQY16)zz!QU###r   c                    |                                  |                                 z
  dz   }|                                |z  | j        z  |j        z  }|                     || j                  S )r  r   r=  )r   r   r  r   s       r   r  zDUP_Flint._pquo  sV    HHJJ#a'TTVVQYAF*zz!QU###r   c                   |                                  |                                 z
  dz   }t          |                                |z  | j        z  |j                  \  }}|rt	          | |          |                     || j                  S )r  r   )r1  r1  r  r   r   r  r   r;  s        r   r  zDUP_Flint._pexquo  sw    HHJJ#a'addffai!&(!&111 	,%a+++zz!QU###r   c                   | j         j        rSt          | j        |j                  \  }}|                     || j                   |                     || j                   fS |                                                     |                                          \  }}|                                |                                fS r  )r   r   r1  r   r  r   r  r   r}  s       r   r  zDUP_Flint._div  s    5> 	6!&!&))DAq::a''Aqu)=)=== ??$$))!//*;*;<<DAq>>##Q^^%5%555r   c                R    |                      | j        |j        z  | j                  S r  r*  r  s     r   r  zDUP_Flint._rem  r5  r   c                R    |                      | j        |j        z  | j                  S r  r*  r  s     r   r  zDUP_Flint._quo  s!    zz!&AF*AE222r   c                Z    |                      |          \  }}|rt          | |          |S r  )r  r   r}  s       r   r  zDUP_Flint._exquo  s2    vvayy1 	,%a+++r   c                R    | j                                         }|dk    rt          }|S )r  r  )r   r1  r   )r   r  r  s      r   r  zDUP_Flint._degree  s$    FMMOO77Ar   c                ,    |                                  fS r  r  r   s    r   r  zDUP_Flint.degree_list  s    r   c                *    |                                  S r  rF  r   s    r   r  zDUP_Flint.total_degree  s    yy{{r   c                J    | j         | j                                                  S r  r   r1  r   s    r   r  zDUP_Flint.LC  s    vafmmoo&&r   c                    | j         d         S )r  r   r   r   s    r   r  zDUP_Flint.TC  s    vayr   c                $    |\  }| j         |         S r  rK  )r   r  r  s      r   r  zDUP_Flint._nth  s    vayr   c                N    |                                                                  S r  )r   r  r   s    r   r  zDUP_Flint.max_norm  s      ))+++r   c                N    |                                                                  S r  )r   r  r   s    r   r  zDUP_Flint.l1_norm  s      ((***r   c                N    |                                                                  S r  )r   r  r   s    r   r  zDUP_Flint.l2_norm_squared  s      00222r   c                    | j                                         }|                     |                     | j                                                   | j                  }||fS r  )r   denomr  r   numerr   )r   rQ  rR  s      r   r  zDUP_Flint.clear_denoms  sF    

166!&,,..111599e|r   r   c                0   |dk    sJ | j         j        rH| j        }t          |          D ]}|                                }|                     || j                   S |                                                     ||                                          S )r  r   )r  r  )	r   r  r   rangeintegralr  r   r  r   r   r  r  r   r0  s        r   r  zDUP_Flint._integrate  s    Avvvv5; 	I&C1XX % %llnn::c15)))??$$//!q/99FFHHHr   c                    |dk    sJ | j         }t          |          D ]}|                                }|                     || j                  S )z1Computes the ``m``-th order derivative of ``f``. r   )r   rT  
derivativer  r   rV  s        r   r  zDUP_Flint._diff   sR    Avvvvfq 	# 	#A..""CCzz#qu%%%r   c                P    |                                                      |          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                    |                                                      |                                           \  }}|                                |                                fS )z#Half extended Euclidean algorithm. )r   r  r   r  s       r   r  zDUP_Flint._half_gcdex  sL      ,,Q__->->??1~~!1!111r   c                    | 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  sZ    &++af%%1azz!QU##QZZ15%9%91::a;O;OOOr   c                V   | j         j        rS| j                            |j                  \  }}}|dk    rt	          d          |                     || j                   S |                                                     |                                                                          S )r%  r   zero divisor)	r   r  r   r]  r   r  r   r&  r   )r   r   rG  F_invr  s        r   r&  zDUP_Flint._invert  s    5; 	OFKK//MCaxx#N333::eQU+++??$$,,Q__->->??LLNNNr   c                t    |                                                      |                                          S r  )r   r+  r   r3  s     r   r+  zDUP_Flint._revert#  s,      ((++88:::r   c                    |                                                      |                                           }d |D             S )r0  c                6    g | ]}|                                 S r~   r   r   r   s     r   r  z,DUP_Flint._subresultants.<locals>.<listcomp>*  s"    ...a!!...r   )r   r1  r  s      r   r1  zDUP_Flint._subresultants'  s=    OO,,Q__->->??..1....r   c                    |                                                      |                                           \  }}|d |D             fS )r5  c                6    g | ]}|                                 S r~   rd  re  s     r   r  z3DUP_Flint._resultant_includePRS.<locals>.<listcomp>/  s"    3331ann&&333r   )r   r6  r  s       r   r6  zDUP_Flint._resultant_includePRS,  sG    ""889J9JKKQ3333333r   c                t    |                                                      |                                           S )z'Computes resultant of ``f`` and ``g``. )r   r7  r  s     r   r7  zDUP_Flint._resultant1  s*      ++AOO,=,=>>>r   c                N    |                                                                  S r<  )r   r>  r   s    r   r>  zDUP_Flint.discriminant5  s      --///r   c                    |                      |          }||                     |          |                    |          fS r@  )rG  r  )r   r   r  s      r   rA  zDUP_Flint._cofactors9  s2    EE!HH!''!**aggajj((r   c                r    |                      | j                            |j                  | j                  S rE  )r  r   rG  r   r  s     r   rF  zDUP_Flint._gcd>  s(    zz!&**QV,,ae444r   c                \   | r|s|                      | j        j                  S |                     |                              |                     |                    }|j        j        r|                                }n,|                                dk     r|	                                }|S )rK  r   )
r   r   r   r  r  rF  r   ra  r  rb  )r   r   r  s      r   rL  zDUP_Flint._lcmB  s      	,a 	,<<
+++FF1IIQVVAYY''5> 			AATTVVaZZAr   c                   | j         |j         cxk    rt          t          fv sn J | j         j        r/|                                 \  }}|                                \  }}n| j         j        | }}|j         j        |}}|                    |          }||z  ||z  }}|                    |          }|                    |          |                    |          }}|	                                dk     }|	                                dk     }	|r+|	r)|
                                |
                                }}n3|r| |
                                }}n|	r| |
                                }}||||fS )rQ  r   )r   r   r   r  r  r   rG  rF  r  r  rb  )
r   r   r  rP  r  r}  cHHf_negg_negs
             r   rS  zDUP_Flint._cancelQ  s]    u))))"b))))))5; 	!NN$$EBNN$$EBEIqBEIqBVVBZZr28BFF1IIwwqzz1771::1

 	!U 	!5577AEEGGqAA 	!CBB 	!CB2q!|r   c                    |                      |          \  }}}}|                    |          |                    |          fS rP  )rS  ro  r  s         r   rR  zDUP_Flint._cancel_includep  s<    yy||B1}}R  !--"3"333r   c                t    |                                                      |                                          S rY  )r   rZ  r   r[  s     r   rZ  zDUP_Flint._truncu  s,      ''**77999r   c                P    |                      |                                           S r`  )rw  r  r   s    r   ra  zDUP_Flint.monicy  s    qttvv&&&r   c                N    |                                                                  S rc  )r   rd  r   s    r   rd  zDUP_Flint.content}  s        ((***r   c                \    |                                  }|                     |          }||fS rf  )rd  rw  )r   r  prims      r   rg  zDUP_Flint.primitive  s*    yy{{t$$Tzr   c                h    |                      |                     |j                  | j                  S ri  r*  r  s     r   rj  zDUP_Flint._compose  s$    zz!&&..!%000r   c                b    d |                                                                  D             S )rn  c                6    g | ]}|                                 S r~   rd  re  s     r   r  z(DUP_Flint._decompose.<locals>.<listcomp>  s"    KKKa!!KKKr   )r   ro  r   s    r   ro  zDUP_Flint._decompose  s,    KK1??+<+<+G+G+I+IKKKKr   c                    |                      || j        j        g          }|                     |                     |          | j                  S r  )r   r   r   r  r   )r   r  x_plus_as      r   rt  zDUP_Flint._shift  s=    661aei.))zz!&&**AE222r   c                    |                                  |                                 |                                 }}}|                    ||                                          S r  )r   r  r   )r   r\  r  rP  rV  r  s         r   r  zDUP_Flint._transform  sM    //##Q__%6%68I8Ia1{{1a  --///r   c                b    d |                                                                  D             S )r  c                6    g | ]}|                                 S r~   rd  re  s     r   r  z$DUP_Flint._sturm.<locals>.<listcomp>  s"    GGGa!!GGGr   )r   r  r   s    r   r  zDUP_Flint._sturm  s,    GG1??+<+<+C+C+E+EGGGGr   c                N    |                                                                  S r  )r   r  r   s    r   r  zDUP_Flint._cauchy_upper_bound        44666r   c                N    |                                                                  S r  )r   r  r   s    r   r  zDUP_Flint._cauchy_lower_bound  r  r   c                N    |                                                                  S r  )r   r  r   s    r   r  z%DUP_Flint._mignotte_sep_bound_squared  s      <<>>>r   c                f    |                                  }d |                                D             S )r  c                @    g | ]\  }}|                                 |fS r~   rd  r   r   r   s      r   r  z'DUP_Flint._gff_list.<locals>.<listcomp>  s+    AAA41a!..""A&AAAr   )r   r  )r   rP  s     r   r  zDUP_Flint._gff_list  s-    OOAA1::<<AAAAr   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                v    |                      |                     |                                                     S r  )r  rF  r  r   s    r   r  zDUP_Flint.sqf_part  s(    xxqwwyy))***r   c                t    |                                                      |          \  }}|d |D             fS )r  r   c                @    g | ]\  }}|                                 |fS r~   rd  r  s      r   r  z&DUP_Flint.sqf_list.<locals>.<listcomp>  s+    CCC$!Q))1-CCCr   )r   r  r  s       r   r  zDUP_Flint.sqf_list  s@    **333<<wCC'CCCCCr   c                j    |                                                      |          }d |D             S )r  r  c                @    g | ]\  }}|                                 |fS r~   rd  r  s      r   r  z.DUP_Flint.sqf_list_include.<locals>.<listcomp>  +    <<<41a!..""A&<<<r   )r   r  r  s      r   r  zDUP_Flint.sqf_list_include  s6    //##444==<<7<<<<r   c                     j         j        r+ j                                        \  }} fd|D             }n j         j        rk j                                        \  }} fd|D             }g }|D ];\  }}|                                \  }}|||z  z  }|                    ||f           <nt          d j         z                                 |          }||fS )r  c                P    g | ]"\  }}                     |j                  |f#S r~   r  r   r  s      r   r  z)DUP_Flint.factor_list.<locals>.<listcomp>  s2    GGGdaAqu--q1GGGr   c                P    g | ]"\  }}                     |j                  |f#S r~   r  r  s      r   r  z)DUP_Flint.factor_list.<locals>.<listcomp>  s2    MMMDAqqzz!QU33Q7MMMr   r  )	r   r  r   factorr  r  r   r   r	   )r   r   r  factors_monicr   r   r  s   `      r   r  zDUP_Flint.factor_list  s    5; 	PV]]__NE7GGGGgGGGGGU[ 	P V]]__NE7MMMMGMMMM G% ' '1~~''1A1v&&&&' FNOOO //'**g~r   c                f    |                                                                  }d |D             S )r  c                @    g | ]\  }}|                                 |fS r~   rd  r  s      r   r  z1DUP_Flint.factor_list_include.<locals>.<listcomp>  r  r   )r   r  r  s     r   r  zDUP_Flint.factor_list_include  s3     //##7799<<7<<<<r   c                f     d |D             }t          |d          } fdfd|D             S )z+Sort a list of factors to canonical order. c                @    g | ]\  }}|                                 |fS r~   r   r  s      r   r  z+DUP_Flint._sort_factors.<locals>.<listcomp>  s)    :::AQYY[[!$:::r   T)multiplec                r                                             | d d d                   j                  S r  r  )r   r   s    r   <lambda>z)DUP_Flint._sort_factors.<locals>.<lambda>  s+    AFF1TTrT7OOQU!C!C r   c                0    g | ]\  }} |          |fS r~   r~   )r   r   r   to_dup_flints      r   r  z+DUP_Flint._sort_factors.<locals>.<listcomp>  s*    ;;;$!Q,,q//1%;;;r   )r	   )r   r  r  s   ` @r   r	   zDUP_Flint._sort_factors  sS     ;::::$777CCCC;;;;';;;;r   c                V    |                                                      ||||          S r   )r   r  r  s        r   r  zDUP_Flint._isolate_real_roots  s&      44S#sDIIIr   c                V    |                                                      ||||          S r   )r   r  r  s        r   r  z!DUP_Flint._isolate_real_roots_sqf  s&      88c3MMMr   c                V    |                                                      ||||          S r   )r   r  r  s        r   r  zDUP_Flint._isolate_all_roots  s&      33Cc4HHHr   c                V    |                                                      ||||          S r   )r   r  r  s        r   r  z DUP_Flint._isolate_all_roots_sqf	  s&      77S#tLLLr   c                X    |                                                      |||||          S r   )r   r  r  s         r   r  zDUP_Flint._refine_real_root	  s(      221aeTJJJr   c                T    |                                                      ||          S r  )r   r  r  s      r   r  zDUP_Flint.count_real_roots	  s%      11cs1CCCr   c                T    |                                                      ||          S r  )r   r  r  s      r   r  zDUP_Flint.count_complex_roots	  s%      44#4FFFr   c                    | j          S r  rK  r   s    r   r&  zDUP_Flint.is_zero	  s     6zr   c                ,    | j         | j        j        k    S r  )r   r   r   r   s    r   r  zDUP_Flint.is_one	  s     v""r   c                <    | j                                         dk    S )r  r   rI  r   s    r   r  zDUP_Flint.is_ground	       v}}!##r   c                <    | j                                         dk    S )r  r   rI  r   s    r   r  zDUP_Flint.is_linear	  r  r   c                <    | j                                         dk    S )r  r  rI  r   s    r   r  zDUP_Flint.is_quadratic#	  r  r   c                4    |                                  j        S r  )r   r  r   s    r   r  zDUP_Flint.is_monomial(	  s       ,,r   c                F    |                                  | j        j        k    S r  )r  r   r   r   s    r   r  zDUP_Flint.is_monic-	  s     ttvv""r   c                4    |                                  j        S r  )r   r  r   s    r   r  zDUP_Flint.is_primitive2	  s       --r   c                4    |                                  j        S r  )r   r  r   s    r   r  zDUP_Flint.is_homogeneous7	         //r   c                4    |                                  j        S r  )r   r  r   s    r   r  zDUP_Flint.is_sqf<	  s       ''r   c                4    |                                  j        S r  )r   r  r   s    r   r  zDUP_Flint.is_irreducibleA	  r  r   c                    | j         j        r&t          | j                                                  S |                                 j        S r  )r   r  boolr   r  r   r   s    r   r  zDUP_Flint.is_cyclotomicF	  s?     5; 	3,,..///??$$22r   r   r=  r%  r>  r@  )vr   rA  rB  rC  r   rD  r  rE  r   r   r  r
  r  r'  r   r   r   r   r   r   r  r  r'  r:  r@  rF  rK  rM  rT  r[  re  rk  ro  rs  rw  r^  rb  r{  r  r  r  r  r  r  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  r6  r7  r>  rA  rF  rL  rS  rR  rZ  ra  rd  rg  rj  ro  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r	   r  r  r  r  r  r  r  rF  r&  r  r  r  r  r  r  r  r  r  r  r  r~   r   r   r   r     s       33
C'ID D D & & [&% % %   [ N N [N   [&3 3 3
2 2 2' ' '  : : :" " "N N N1 1 1
" " "
9 9 9 9" " "
* * *" " " "
" " " "
" " "
" " "
# # #- - -- - -- - -. . .$ $ $6 6 6* * *2 2 22 2 22 2 2. . .. . .: : :$ $ $$ $ $$ $ $6 6 62 2 23 3 3            ' ' '    
, , ,+ + +3 3 3  	I 	I 	I 	I& & & &* * *" " "2 2 2
P P P
O O O; ; ;/ / /
4 4 4
? ? ?0 0 0) ) )
5 5 5    >4 4 4
: : :' ' '+ + +
  1 1 1L L L3 3 3
0 0 0
H H H7 7 77 7 7? ? ?B B B
" " "
" " "
+ + +D D D D
= = = =
  <	= 	= 	=< < <J J JN N NI I IM M MK K KD D D DG G G G   X # # X# $ $ X$ $ $ X$ $ $ X$ - - X- # # X# . . X. 0 0 X0 ( ( X( 0 0 X0 3 3 X3 3 3r   r   c                b    t          t          | ||          t          |||          ||          S r   )DMFr   numdenr   r   s       r   init_normal_DMFr  O	  s5    z#sC((#sC((#s4 4 4r   c                     e Zd ZdZdZd0dZed0d            Zd Zed0d            Z	d Z
d	 Zd
 Zd Zd1dZd2d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d3d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/ Z1dS )4r  z'Dense Multivariate Fractions over `K`. r  Nc                    |                      |||          \  }}}t          ||||          \  }}|| _        || _        || _        || _        d S r   )_parserc   r  r  r   r   )r   r   r   r   r  r  s         r   __init__zDMF.__init__Y	  sT    Cc22S#c3S11Sr   c                    |                      |||          \  }}}t                              |           }||_        ||_        ||_        ||_        |S r   )r  rI  r   r  r  r   r   )r   r   r   r   r  r  rJ  s          r   r   zDMF.newb	  sO    

3S11S#nnS!!
r   c                D    |                      || j        | j                  S r   )r   r   r   )r   r   s     r   r   zDMF.ground_newo	  s    xxTXtx000r   c                L   t          |t                    r|\  }}|Mt          |t                    rt          |||          }t          |t                    rt          |||          }n<t	          |          \  }}t	          |          \  }}||k    r|}nt          d          t          ||          rt          d          t          ||          rt          ||          }nt          |||          r"t          |||          }t          |||          }n|}|`t          |t                    rt          |||          }nKt          |t                    s#t          |                    |          |          }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(( 7'S#66Cc4(( 7'S#66C+C00W+C00Wg%%!CC$%DEEE#s## @'(>???#s## 1c3''!#sC00 1!#sC00C!#sC00CCc4(( <'S#66CC#C.. <$S[[%5%5s;;C',,S#s##CC}r   c                P    | 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%9%91555!%%%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__	  sI    Q[)<qu+E+E&&qu6 7 7 	7r   c                     t          |t                    r j        |j        k    rt          d d|           j        |j        k    r' j         j         j         j         j        f|j        fS  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                            | |f|          S r  rc   r   r   r  r  rU  killr   r   r   s        r   rP  zDMF.poly_unify.<locals>.per	  `     & &"3w!Ag >)#sC==HC{Sz3<<<r   )r   r   r   rz   r   rP  r  r  r   r   r   r   r   r   rP  r}  rP  r   s   `     @r   
poly_unifyzDMF.poly_unify	  s   !S!! 	HQUae^^##AA$FGGG5AE>>E15!%!%@@uaekk!%00HCQUC44QUC446A AFC44A%)3 
= 
= 
= 
= 
= 
= 
= S!Q&&r   c                F    t          |t                    r j        |j        k    rt          d d|           j        |j        k    r. j         j         j         j         j        f|j        |j        ffS  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                            | |f|          S r  r  r  s        r   rP  zDMF.frac_unify.<locals>.per	  r  r   )
r   r  r   rz   r   rP  r  r  r   r   r  s   `     @r   
frac_unifyzDMF.frac_unify	  s:   !S!! 	HQUae^^##AA$FGGG5AE>>E15!%!%*+%9 9 uaekk!%00HCQUC44QUC446A QUC44QUC446A &*3 
= 
= 
= 
= 
= 
= 
= S!Q&&r   TFc                    | j         | j        }}|r|s||z  S |dz  }|rt          ||||          \  }}| j                            ||f||          S )z.Create a DMF out of the given representation. r   )r   r   rc   r   r   )r   r  r  rU  r  r   r   s          r   rP  zDMF.per	  sl    5!%S 	 3wq 	6!#sC55HC{Sz3444r   c                R    | j         }|r	|s|S |dz  }t          || j        |          S )rN  r   )r   r   r   )r   r   r  r   s       r   half_perzDMF.half_per	  s;    e 	 
q3s###r   c                0    |                      d||          S r   r   r   s      r   r   zDMF.zero	      wwq#s###r   c                0    |                      d||          S r  r  r   s      r   r   zDMF.one 
  r  r   c                6    |                      | j                  S )z Returns the numerator of ``f``. )r  r  r   s    r   rR  z	DMF.numer
      zz!%   r   c                6    |                      | j                  S )z"Returns the denominator of ``f``. )r  r  r   s    r   rQ  z	DMF.denom
  r  r   c                B    |                      | j        | j                  S )z4Remove common factors from ``f.num`` and ``f.den``. )rP  r  r  r   s    r   rU  z
DMF.cancel
  s    uuQUAE"""r   c                x    |                      t          | j        | j        | j                  | j        d          S )ra  FrU  )rP  r8   r  r   r   r  r   s    r   rb  zDMF.neg
  s.    uuWQUAE151115uGGGr   c                2    | |                      |          z   S rd  )r   rf  s     r   rg  zDMF.add_ground
  s    1<<??""r   c           	        t          |t                    r4|                     |          \  }}}\  }}}t          |||||          |}	}nj|                     |          \  }}}}
}|
|c\  }}\  }}t          t          ||||          t          ||||          ||          }t          ||||          }	 |||	          S )z0Add two multivariate fractions ``f`` and ``g``. )r   r   r  rF   r  r9   r;   r   r   r   r   rP  F_numF_denr}  r  r  rP  G_numG_dens                r   r~  zDMF.add
      a 		2/0||A,Cc>E51"5%C==uCC"#,,q//Cc1a-.*NUENUE'%S99!%S993E EC%S11Cs3}}r   c           	        t          |t                    r4|                     |          \  }}}\  }}}t          |||||          |}	}nj|                     |          \  }}}}
}|
|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                    r3|                     |          \  }}}\  }}}t          ||||          |}	}nJ|                     |          \  }}}}
}|
|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 	2/0||A,Cc>E51uac22ECC"#,,q//Cc1a-.*NUENUE%S11C%S11Cs3}}r   c           	     8   t          |t                    rg| j        | j        }}|dk     r||| }}}|                     t          ||| j        | j                  t          ||| j        | j                  d          S t          dt          |          z            )r  r   Fr  r  )
r   r   r  r  rP  r=   r   r   r  r   )r   r  r  r  s       r   r  zDMF.powD
  s    a 	BuaeC1uu!3!S55a66 a66u  F F F 6a@AAAr   c                >   t          |t                    r3|                     |          \  }}}\  }}}|t          ||||          }	}nJ|                     |          \  }}}}
}|
|c\  }}\  }}t          ||||          }t          ||||          }	 |||	          S )z0Computes quotient of fractions ``f`` and ``g``. r  r  s                r   r  zDMF.quoO
  s    a 	2/0||A,Cc>E51geQS99CC"#,,q//Cc1a-.*NUENUE%S11C%S11Cs3}}r   c                F    |                      | j        | j        d          S )z&Computes inverse of a fraction ``f``. Fr  )rP  r  r  )r   checks     r   r'  z
DMF.invert_
  s    uuQUAE%u000r   c                6    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                  o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
  s8     qu-- +aeQUAE**	+r   c                *    |                                  S r   r  r   s    r   r  zDMF.__neg__n
  r  r   c                j   t          |t          t          f          r|                     |          S || j        v r-|                     | j                            |                    S 	 |                     |                     |                    S # t          t          t          f$ r
 t          cY S w xY wr   )r   r   r  r~  r   rg  r   r  r  r   r   r  r  s     r   r  zDMF.__add__q
  s    a#s$$ 	25588O!%ZZ<<a 0 0111	"55A'''>+>? 	" 	" 	"!!!!	"s   )'B B21B2c                ,    |                      |          S r   r	  r  s     r   r
  zDMF.__radd__|
  r  r   c                    t          |t          t          f          r|                     |          S 	 |                     |                     |                    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__
  w    a#s$$ 	5588O	"55A'''>+>? 	" 	" 	"!!!!	"   'A A<;A<c                .    |                       |          S r   r	  r  s     r   r  zDMF.__rsub__
  r  r   c                    t          |t          t          f          r|                     |          S 	 |                     |                     |                    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                ,    |                      |          S r   r  r  s     r   r  zDMF.__rmul__
  r  r   c                ,    |                      |          S r   r  r3  s     r   r  zDMF.__pow__
  r  r   c                    t          |t          t          f          r|                     |          S 	 |                     |                     |                    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                4    |                      d          |z  S )NF)r  )r'  )r   r   s     r   r  zDMF.__rtruediv__
  s    {{{''))r   c                V   	 t          |t                    rP|                     |          \  }}}\  }}}| j        |j        k    r!t	          || j        | j                  o||k    S n1|                     |          \  }}}}}| j        |j        k    r||k    S n# t          $ r Y nw xY wdS rL  r   r   r  r   r#   r   r  rz   r   r   r  r  r  r}  rP  s          r   r(  z
DMF.__eq__
  s    	!S!! 	"-.\\!__*1a%5AE>>$UAE1599HeqjH " !"Q1aA5AE>>6M  	 	 	D	 us   A#B &1B 
B&%B&c                X   	 t          |t                    rQ|                     |          \  }}}\  }}}| j        |j        k    r"t	          || j        | j                  o||k     S n1|                     |          \  }}}}}| j        |j        k    r||k    S n# t          $ r Y nw xY wdS )NTr  r  s          r   __ne__z
DMF.__ne__
  s    	!S!! 	"-.\\!__*1a%5AE>> )% > > M5A:NN " !"Q1aA5AE>>6M  	 	 	D	 ts   A$B '1B 
B'&B'c                D    |                      |          \  }}}}}||k     S r   r  r   r   r  rP  r}  s        r   r2  z
DMF.__lt__
  $    Q1aA1ur   c                D    |                      |          \  }}}}}||k    S r   r  r  s        r   r5  z
DMF.__le__
  $    Q1aAAvr   c                D    |                      |          \  }}}}}||k    S r   r  r  s        r   r8  z
DMF.__gt__
  r  r   c                D    |                      |          \  }}}}}||k    S r   r  r  s        r   r:  z
DMF.__ge__
  r  r   c                8    t          | j        | j                   S r   r  r   s    r   r<  zDMF.__bool__
  s    aeQU++++r   r   )TFr=  r?  )2r   rA  rB  rC  rD  r  rE  r   r   r  r   r   r  r  rP  r  r   r   rR  rQ  rU  rb  rg  r~  r  r  r  r  r  r'  rF  r&  r  r  r  r
  r  r  r  r  r  r  r  r(  r  r2  r5  r8  r:  r<  r~   r   r   r  r  T	  s       11,I    
 
 
 [
1 1 1 ) ) ) [)VP P P7 7 7' ' ':' ' '>5 5 5 5
$ 
$ 
$ 
$ $ $ [$ $ $ [$! ! !! ! !# # #H H H# # #      	B 	B 	B   E1 1 1 1 ( ( X( + + X+
  	" 	" 	"  " " "  " " "    " " "* * *  "  "        , , , , ,r   r  c                \    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                L   t          |t                    rnt          |          t          u r t          t	          |          d          }nXt          |t
                    rfd|D             }n                    |          g}t          t          |          d          }t          |t                    rnSt          |t                    r t          t	          |          d          }nt          t          |          d          }|                     ||          S )Nr   c                :    g | ]}                     |          S r~   )r   )r   r  r   s     r   r  zANP.__new__.<locals>.<listcomp>
  s#    333!s{{1~~333r   )	r   r   r   r   r%   r   r   r   r   r   r   r  r   s      `r   r   zANP.__new__
  s   c3 		.#YY$mC--sA66CC#t$$ )3333s333{{3''(innc1--Cc3 	.T"" 	.mC--sA66CCinnc1--CwwsC%%%r   c                    |j         |j         cxk    r|k    sn t          d          t                                          |           }||_        ||_        ||_         |S )NzInconsistent domain)r   r   superr   r   r  )r   r   r  r   rJ  r   s        r   r   zANP.new
  sd    37))))c))))4555ggooc""
r   c                8    t           | j        | j        | j        ffS r   )r  r   r  r   r   s    r   r  zANP.__reduce__  s    TXtx222r   c                4    | j                                         S r   r   r   r   s    r   r   zANP.rep  s    y  """r   c                *    |                                  S r   )mod_to_listr   s    r   r  zANP.mod  s    !!!r   c                    | j         S r   rK  r   s    r   to_DMPz
ANP.to_DMP  
    yr   c                    | j         S r   )r  r   s    r   
mod_to_DMPzANP.mod_to_DMP  r  r   c                D    |                      || j        | j                  S r   )r   r  r   rO  s     r   rP  zANP.per  s    uuS!&!%(((r   c                    | j         j        d| j                                        d| j                                        d| j        dS r   )r   r   r   r   r  r   r   s    r   r   zANP.__repr__  sJ    #$;#7#7#79I9I9I9I16>>K[K[K[K[]^]b]b]bccr   c                    t          | j        j        |                                 | j                                        | j        f          S r   )r   r   r   r   r  r   r   s    r   r   zANP.__hash__  s4    Q[)1::<<9J9JAERSSSr   c                    | j         |k    r| S |                     | 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"  sD    5C<<H55,,afnnS.A.A3GGGr   c                6   t          |t                    r| j        |j        k    rt          d| d|          | j        |j        k    r | j        | j        | j        |j        | j        fS | j                            |j                  t          | j        | j                  }t          |j        |j                  }| j        k    r'|j        k    rt          | j        | j                  n| j        k    r| j        n|j        fd}|||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0 r   )	r   r  r  rz   r   rP  r   r   r   )r   r   rP  r}  rP  r   r  s        @@r   r   z	ANP.unify)  s    !S!! 	HQUae^^##AA$FGGG5AE>>5!%qu44%++ae$$CAE15#..AAE15#..Aae||qu!!%44!%<<%CC%C00000CCAs""r   c                \   t          |t                    r| j        |j        k    rt          d| d|          | j        |j        k    rI| 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!! 	HQVqv%5%5##AA$FGGG 5AE>>%++ae$$C		#A		#Avqvqvqu,,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                4    | j                                         S )r   )r   r   r   s    r   r   zANP.to_dict[      v~~r   c                    t          | j        d| j                  }|                                D ]"\  }}| j                            |          ||<   #|S )r   r   )r'   r   r   r   r   )r   r   r   r   s       r   r   zANP.to_sympy_dict_  sP    !%AE**IIKK 	' 	'DAqU^^A&&CFF
r   c                4    | j                                         S r   r  r   s    r   r   zANP.to_listh  r.  r   c                4    | 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                D      fd                                  D             S )r   c                D    g | ]}j                             |          S r~   )r   r   )r   r   r   s     r   r  z%ANP.to_sympy_list.<locals>.<listcomp>r  s'    999q""999r   r   r   s   `r   r   zANP.to_sympy_listp  s%    9999AIIKK9999r   c                4    | j                                         S r   )r   r   r   s    r   r   zANP.to_tuplet  s     v   r   c           
     ~    t          t          t          t          |j        |                              ||          S r   )r  r   r   r  r   r  s       r   r   zANP.from_list|  s0    9T#ck3"7"788993DDDr   c                \    |                      | j                            |                    S rd  )rP  r   rg  rf  s     r   rg  zANP.add_ground  $    uuQV&&q))***r   c                \    |                      | j                            |                    S rj  )rP  r   rl  rf  s     r   rl  zANP.sub_ground  r7  r   c                \    |                      | j                            |                    S )z3Multiply ``f`` by an element of the ground domain. )rP  r   rp  rf  s     r   rp  zANP.mul_ground  r7  r   c                \    |                      | j                            |                    S )z6Quotient of ``f`` by an element of the ground domain. )rP  r   rt  rf  s     r   rt  zANP.quo_ground  r7  r   c                Z    |                      | j                                                  S r   )rP  r   rb  r   s    r   rb  zANP.neg  s    uuQVZZ\\"""r   c                    |                      |          \  }}}}|                     |                    |          ||          S r   )r(  r   r~  r   r   rP  r}  r  r   s         r   r~  zANP.add  9    Q1c3uuQUU1XXsC(((r   c                    |                      |          \  }}}}|                     |                    |          ||          S r   )r(  r   r  r=  s         r   r  zANP.sub  r>  r   c                    |                      |          \  }}}}|                     |                    |                              |          ||          S r   )r(  r   r  r  r=  s         r   r  zANP.mul  sE    Q1c3uuQUU1XX\\#&&S111r   c                P   t          |t                    st          dt          |          z            | j        }| j        }|dk     r|                    |          | }}|                     |                    |          	                    | j                  || j
                  S )r  r  r   )r   r   r  r   r  r   r'  r   r  r  r   )r   r  r  rP  s       r   r  zANP.pow  s    !S!! 	B6a@AAAfFq5588C==1"qA uuQUU1XX\\!&))3666r   c                    |                      |          \  }}}}|                     |                    |                    |                                        |          ||          S r   )r(  r   r  r'  r  r=  s         r   r  z	ANP.exquo  sS    Q1c3uuQUU188C==))--c22C===r   c                l    |                      |          |                     | j        | j                  fS r   )r  r   r  r   r  s     r   r  zANP.div  s)    wwqzz166!&!%0000r   c                ,    |                      |          S r   )r  r  s     r   r  zANP.quo  s    wwqzzr   c                    |                      |          \  }}}}|                    |          \  }}|j        r|                     ||          S t	          d          )Nr_  )r(  r  r  r   r   )r   r   rP  r}  r  r   r  r  s           r   r  zANP.rem  sX    Q1c3||A18 	066#s###///r   c                4    | j                                         S r  )r   r  r   s    r   r  zANP.LC      vyy{{r   c                4    | j                                         S r  )r   r  r   s    r   r  zANP.TC  rG  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     v~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     v}r   c                    | j         j        S r  )r   r  r   s    r   r  zANP.is_ground  s     vr   c                    | S r   r~   r   s    r   __pos__zANP.__pos__  s    r   c                *    |                                  S r   r  r   s    r   r  zANP.__neg__  r  r   c                    t          |t                    r|                     |          S 	 | j                            |          }|                     |          S # t          $ r
 t          cY S w xY wr   )r   r  r~  r   r   rg  r   r  r  s     r   r  zANP.__add__  v    a 	5588O	#a  A <<??"  	" 	" 	"!!!!	"   A A/.A/c                ,    |                      |          S r   r	  r  s     r   r
  zANP.__radd__  r  r   c                    t          |t                    r|                     |          S 	 | j                            |          }|                     |          S # t          $ r
 t          cY S w xY wr   )r   r  r  r   r   rl  r   r  r  s     r   r  zANP.__sub__  rP  rQ  c                .    |                       |          S r   r	  r  s     r   r  zANP.__rsub__  r  r   c                    t          |t                    r|                     |          S 	 | j                            |          }|                     |          S # t          $ r
 t          cY S w xY wr   )r   r  r  r   r   rp  r   r  r  s     r   r  zANP.__mul__  rP  rQ  c                ,    |                      |          S r   r  r  s     r   r  zANP.__rmul__  r  r   c                ,    |                      |          S r   r  r3  s     r   r  zANP.__pow__  r  r   c                ,    |                      |          S r   r  r  s     r   r   zANP.__divmod__  r  r   c                ,    |                      |          S r   r"  r  s     r   r#  zANP.__mod__
  r  r   c                    t          |t                    r|                     |          S 	 | j                            |          }|                     |          S # t          $ r
 t          cY S w xY wr   )r   r  r  r   r   rt  r   r  r  s     r   r  zANP.__truediv__  rP  rQ  c                t    	 |                      |          \  }}}}n# t          $ r
 t          cY S w xY w||k    S r   r(  rz   r  r   r   rP  r}  r  s        r   r(  z
ANP.__eq__  P    	"QJAq!QQ  	" 	" 	"!!!!	"Av    11c                t    	 |                      |          \  }}}}n# t          $ r
 t          cY S w xY w||k    S r   r\  r]  s        r   r  z
ANP.__ne__  r^  r_  c                B    |                      |          \  }}}}||k     S r   r(  r]  s        r   r2  z
ANP.__lt__%  "    [[^^
1a1ur   c                B    |                      |          \  }}}}||k    S r   rb  r]  s        r   r5  z
ANP.__le__)  "    [[^^
1aAvr   c                B    |                      |          \  }}}}||k    S r   rb  r]  s        r   r8  z
ANP.__gt__-  rc  r   c                B    |                      |          \  }}}}||k    S r   rb  r]  s        r   r:  z
ANP.__ge__1  re  r   c                *    t          | j                  S r   )r  r   r   s    r   r<  zANP.__bool__5  s    AF||r   )Cr   rA  rB  rC  rD  r   rE  r   r  rF  r   r  r  r  rP  r   r   r   r   r(  r   r   r   r   r   r  r   r   r   rg  rl  rp  rt  rb  r~  r  r  r  r  r  r  r  r  r  r&  r  r  rM  r  r  r
  r  r  r  r  r  r   r#  r  r(  r  r2  r5  r8  r:  r<  __classcell__)r   s   @r   r  r  
  s!       ;;'I& & &*     [3 3 3 # # X# " " X"    ) ) )d d dT T TH H H# # #:- - -     [      [                  : : :! ! ! E E [E+ + ++ + ++ + ++ + +# # #) ) )) ) )2 2 27 7 7> > >1 1 1  0 0 0       X   X     X     # # #  # # #  # # #        # # #                  r   r  )rC  
__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>rz     s
   7 7 7 " " " " " " , , , , , , @ @ @ @ @ @ ! ! ! ! ! ! * * * * * * C C C C C C C C . . . . . . . . . .                                                                                0                                                     4                                 "                       ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (. . . . . . . . . . . .$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $       
 # " " "7LLL"XNNEND D D D D+ D D DN"p p p p p p p pfH
3 H
3 H
3 H
3 H
3 H
3 H
3 H
3V4 4 4
E, E, E, E, E,
k E, E, E,P* * *
U U U U U+ U U U U Ur   