
    Ed-                        d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
  G d de
          ZddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- dd	l.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM dd
lNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ ddl]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZg ddlhmiZimjZjmkZkmlZlmmZmmnZnmoZo ddlpmqZqmrZrmsZsmtZt ddlumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZ ddlmZmZ d Z G d de
e          Zd Z G d de
e          Zd Z G d de
e          ZdS )z1OO layer for several polynomial representations.     )oo)CantSympify)CoercionFailedNotReversibleNotInvertible)PicklableWithSlotsc                   :    e Zd ZdZd Zd Zd Zed             ZdS )GenericPolyz5Base class for low-level polynomial representations. c                 Z    |                      | j                                                  S zMake the ground domain a ring. )
set_domaindomget_ringfs    7lib/python3.11/site-packages/sympy/polys/polyclasses.pyground_to_ringzGenericPoly.ground_to_ring   s     ||AENN,,---    c                 Z    |                      | j                                                  S z Make the ground domain a field. )r   r   	get_fieldr   s    r   ground_to_fieldzGenericPoly.ground_to_field        ||AEOO--...r   c                 Z    |                      | j                                                  S zMake the ground domain exact. )r   r   	get_exactr   s    r   ground_to_exactzGenericPoly.ground_to_exact   r   r   c                 >     |r|\  }} fd|D             }|r||fS |S )Nc                 0    g | ]\  }} |          |fS  r    ).0gkpers      r   
<listcomp>z/GenericPoly._perify_factors.<locals>.<listcomp>   s)    555DAqSSVVQK555r   r    )r$   resultincludecoefffactorss   `    r   _perify_factorszGenericPoly._perify_factors   sD     	$#NE75555G555 	'>!Nr   N)	__name__
__module____qualname____doc__r   r   r   classmethodr*   r    r   r   r
   r
   
   sb        ??. . ./ / // / / 	 	 [	 	 	r   r
   )!dmp_validate
dup_normal
dmp_normaldup_convertdmp_convertdmp_from_sympy	dup_strip
dup_degreedmp_degree_indmp_degree_listdmp_negative_pdup_LCdmp_ground_LCdup_TCdmp_ground_TCdmp_ground_nthdmp_one
dmp_ground
dmp_zero_p	dmp_one_pdmp_ground_pdup_from_dictdmp_from_dictdmp_to_dictdmp_deflate
dmp_inject	dmp_ejectdmp_terms_gcddmp_list_termsdmp_excludedmp_slice_indmp_permutedmp_to_tuple)dmp_add_grounddmp_sub_grounddmp_mul_grounddmp_quo_grounddmp_exquo_grounddmp_absdup_negdmp_negdup_adddmp_adddup_subdmp_subdup_muldmp_muldmp_sqrdup_powdmp_powdmp_pdivdmp_premdmp_pquo
dmp_pexquodmp_divdup_remdmp_remdmp_quo	dmp_exquodmp_add_muldmp_sub_muldmp_max_normdmp_l1_normdmp_l2_norm_squared)dmp_clear_denomsdmp_integrate_indmp_diff_indmp_eval_in
dup_revertdmp_ground_truncdmp_ground_contentdmp_ground_primitivedmp_ground_monicdmp_composedup_decompose	dup_shiftdup_transformdmp_lift)
dup_half_gcdex	dup_gcdex
dup_invertdmp_subresultantsdmp_resultantdmp_discriminantdmp_inner_gcddmp_gcddmp_lcm
dmp_cancel)dup_gff_listdmp_norm	dmp_sqf_pdmp_sqf_normdmp_sqf_partdmp_sqf_listdmp_sqf_list_include)dup_cyclotomic_pdmp_irreducible_pdmp_factor_listdmp_factor_list_include)dup_isolate_real_roots_sqfdup_isolate_real_rootsdup_isolate_all_roots_sqfdup_isolate_all_rootsdup_refine_real_rootdup_count_real_rootsdup_count_complex_roots	dup_sturmdup_cauchy_upper_bounddup_cauchy_lower_bounddup_mignotte_sep_bound_squared)UnificationFailedPolynomialErrorc                 B    t          t          | ||          ||          S N)DMPr2   )replevr   s      r   init_normal_DMPr      s     z#sC((#s333r   c                      e Zd ZdZdZddZd Zd Zd Zdd	Z	e
dd
            Ze
dd            Ze
d             Ze
d             ZddZddZd Zd Zd Ze
d             Ze
dd            Zd Zd Zd Zd ZddZddZddZdd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*d+ Z+d, Z,d- Z-d. Z.d/ Z/d0 Z0d1 Z1d2 Z2d3 Z3d4 Z4d5 Z5d6 Z6d7 Z7d8 Z8d9 Z9d: Z:d; Z;dd<Z<d= Z=d> Z>d? Z?d@ Z@dA ZAdB ZBdC ZCdD ZDdE ZEdF ZFdG ZGddIZHddJZIddKZJdL ZKdM ZLdN ZMdO ZNdP ZOddQZPdR ZQdS ZRdT ZSdU ZTddWZUdX ZVdY ZWdZ ZXd[ ZYd\ ZZd] Z[d^ Z\d_ Z]d` Z^da Z_db Z`dc Zadd Zbde Zcdf Zddg ZeddhZfddiZgdj Zhdk ZiddlZjddmZkddnZlddoZmendp             Zoendq             Zpendr             Zqends             Zrendt             Zsendu             Ztendv             Zuendw             Zvendx             Zwendy             Zxendz             Zyend{             Zzd| Z{d} Z|d~ Z}d Z~d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZddZd Zd Zd Zd Zd Zd ZdS )r   z)Dense Multivariate Polynomials over `K`. )r   r   r   ringNc                 (   |at          |          t          u rt          |||          }nKt          |t                    s#t          |                    |          |          }nt          |          \  }}|| _        || _	        || _
        || _        d S r   )typedictrF   
isinstancelistrA   convertr0   r   r   r   r   )selfr   r   r   r   s        r   __init__zDMP.__init__   s     	)CyyD  8#Cc22T** 8 S!1!1377#C((HC			r   c                 P    | j         j        d| j        d| j        d| j        dS N(, ))	__class__r+   r   r   r   r   s    r   __repr__zDMP.__repr__   s.    #$;#7#7#7qvvvNNr   c                     t          | j        j        |                                 | j        | j        | j        f          S r   )hashr   r+   to_tupler   r   r   r   s    r   __hash__zDMP.__hash__   s.    Q[)1::<<qvNOOOr   c                 8   t          |t                    r| j        |j        k    rt          d| d|          | j        |j        k    r0| j        |j        k    r | j        | j        | j        | j        |j        fS | j        | j                            |j                  }}| j        |j        $                    |j                  n|j        t          | j        || j        |          }t          |j        ||j        |          }||dffd	}|||||fS )z7Unify representations of two multivariate polynomials. Cannot unify  with NFc                 >    |r	|s| S |dz  }t          | ||          S N   r   )r   r   r   killr   s       r   r$   zDMP.unify.<locals>.per   s5     ! !"
q3S$///r   )
r   r   r   r   r   r   r$   r   unifyr4   )r   r"   r   r   FGr$   r   s          @r   r   z	DMP.unify   s3   !S!! 	HQUae^ 	H##AA$FGGG5AE> 	'af. 	'5!%qu44uaekk!%00C6Dv " "::af--DD6DAE3s33AAE3s33A c 0 0 0 0 0 0 S!Q&&r   Fc                 n    | j         }|r	|s|S |dz  }|| j        }|| j        }t          ||||          S z.Create a DMP out of the given representation. r   )r   r   r   r   )r   r   r   r   r   r   s         r   r$   zDMP.per   sY    e 	 
q 	%C 	6D3S$'''r   c                 &    t          d|||          S Nr   r   clsr   r   r   s       r   zerozDMP.zero       1c3%%%r   c                 &    t          d|||          S r   r   r   s       r   onezDMP.one   r   r   c                 <     | t          ||d|          ||          S )zCCreate an instance of ``cls`` given a list of native coefficients. N)r4   r   r   r   r   s       r   	from_listzDMP.from_list   s&     s;sCs33S#>>>r   c                 :     | t          |||          ||          S )zBCreate an instance of ``cls`` given a list of SymPy coefficients. )r5   r   s       r   from_sympy_listzDMP.from_sympy_list   s$     s>#sC00#s;;;r   c                 F    t          | j        | j        | j        |          S )AConvert ``f`` to a dict representation with native coefficients. r   )rG   r   r   r   )r   r   s     r   to_dictzDMP.to_dict   s    15!%T::::r   c                     t          | j        | j        | j        |          }|                                D ]"\  }}| j                            |          ||<   #|S )@Convert ``f`` to a dict representation with SymPy coefficients. r   )rG   r   r   r   itemsto_sympy)r   r   r   r#   vs        r   to_sympy_dictzDMP.to_sympy_dict   sW    !%D999IIKK 	' 	'DAqU^^A&&CFF
r   c                     | j         S zAConvert ``f`` to a list representation with native coefficients. r   r   s    r   to_listzDMP.to_list   	    ur   c                 2      fd  j                   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   s7    	 	 	 	 	 	 #"15)))r   c                 6    t          | j        | j                  S )x
        Convert ``f`` to a tuple representation with native coefficients.

        This is needed for hashing.
        )rP   r   r   r   s    r   r   zDMP.to_tuple  s     AE15)))r   c                 :     | t          |||          ||          S )zBConstruct and instance of ``cls`` from a ``dict`` representation. )rF   r   s       r   	from_dictzDMP.from_dict  s$     s=c3//c:::r   c           
      v    t          t          t          t          ||                              |||          S r   )r   r   r   zip)r   monomscoeffsr   r   r   s         r   from_monoms_coeffszDMP.from_monoms_coeffs  s0    4S001122CdCCCr   c                 Z    |                      | j                                                  S r   )r   r   r   r   s    r   to_ringzDMP.to_ring  s     yy))***r   c                 Z    |                      | j                                                  S r   )r   r   r   r   s    r   to_fieldzDMP.to_field!       yy**+++r   c                 Z    |                      | j                                                  S r   )r   r   r   r   s    r   to_exactzDMP.to_exact%  r   r   c                     | j         |k    r| S t          t          | j        | j        | j         |          || j                  S )z$Convert the ground domain of ``f``. )r   r   r4   r   r   )r   r   s     r   r   zDMP.convert)  s>    5C< 	JH{15!%<<c15IIIr   r   c           
      n    |                      t          | j        |||| j        | j                            S )z1Take a continuous subsequence of terms of ``f``. )r$   rN   r   r   r   )r   mnjs       r   slicez	DMP.slice0  s,    uu\!%Aq!%??@@@r   c                 Z    d t          | j        | j        | j        |          D             S )z;Returns all non-zero coefficients from ``f`` in lex order. c                     g | ]\  }}|S r    r    )r!   _cs      r   r%   zDMP.coeffs.<locals>.<listcomp>6      QQQtq!QQQr   orderrL   r   r   r   r   r  s     r   r   z
DMP.coeffs4  -    QQ~aeQUAEOOOQQQQr   c                 Z    d t          | j        | j        | j        |          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>:  r  r   r  r	  r
  s     r   r   z
DMP.monoms8  r  r   c                 F    t          | j        | j        | j        |          S )z4Returns all non-zero terms from ``f`` in lex order. r  r	  r
  s     r   termsz	DMP.terms<  s    aeQUAE????r   c                 n    | j         s | s| j        j        gS d | j        D             S t	          d          )z%Returns all coefficients from ``f``. c                     g | ]}|S r    r    )r!   r  s     r   r%   z"DMP.all_coeffs.<locals>.<listcomp>F  s    +++q+++r   &multivariate polynomials not supported)r   r   r   r   r   r   s    r   
all_coeffszDMP.all_coeffs@  sF    u 	L ,
|#++AE++++!"JKKKr   c                     | j         s=t          | j                  dk     rdgS fdt          | j                  D             S t	          d          )z"Returns all monomials from ``f``. r   r   c                 "    g | ]\  }}|z
  fS r    r    r!   ir  r   s      r   r%   z"DMP.all_monoms.<locals>.<listcomp>R  s#    @@@da!a%@@@r   r  )r   r7   r   	enumerater   r   r   s    @r   
all_monomszDMP.all_monomsJ  sd    u 	L15!!A1u Av@@@@i.>.>@@@@!"JKKKr   c                     | j         sIt          | j                  dk     rd| j        j        fgS fdt          | j                  D             S t          d          )z Returns all terms from a ``f``. r   r  c                 &    g | ]\  }}|z
  f|fS r    r    r  s      r   r%   z!DMP.all_terms.<locals>.<listcomp>^  s'    EEE41a1q5(AEEEr   r  )r   r7   r   r   r   r  r   r  s    @r   	all_termszDMP.all_termsV  so    u 	L15!!A1u Fquz*++EEEE9QU3C3CEEEE!"JKKKr   c                     |                      t          | j        | j        | j                  | j        j                  S )z-Convert algebraic coefficients to rationals. r   )r$   r}   r   r   r   r   s    r   liftzDMP.liftb  s.    uuXaeQUAE22	uBBBr   c                 v    t          | j        | j        | j                  \  }}||                     |          fS )z2Reduce degree of `f` by mapping `x_i^m` to `y_i`. )rH   r   r   r   r$   r   Jr   s      r   deflatezDMP.deflatef  s1    15!%//1!%%(({r   c                     t          | j        | j        | j        |          \  }}|                     || j        j        |          S )z,Inject ground domain generators into ``f``. front)rI   r   r   r   r   )r   r(  r   r   s       r   injectz
DMP.injectk  s<    AE15!%u===3{{1aei---r   c                     t          | j        | j        ||          }|                     ||| j        t	          |j                  z
            S )z2Eject selected generators into the ground domain. r'  )rJ   r   r   r   lensymbols)r   r   r(  r   s       r   ejectz	DMP.ejectp  sC    aeQUCu555{{1c153s{+;+;#;<<<r   c                     t          | j        | j        | j                  \  }}}||                     || j        |          fS )ao  
        Remove useless generators from ``f``.

        Returns the removed generators and the new excluded ``f``.

        Examples
        ========

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

        >>> DMP([[[ZZ(1)]], [[ZZ(1)], [ZZ(2)]]], ZZ).exclude()
        ([2], DMP([[1], [1, 2]], ZZ, None))

        )rM   r   r   r   r   )r   r$  r   us       r   excludezDMP.excludeu  s>      aeQUAE221a!++a****r   c                 j    |                      t          | j        || j        | j                            S )a  
        Returns a polynomial in `K[x_{P(1)}, ..., x_{P(n)}]`.

        Examples
        ========

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

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

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

        )r$   rO   r   r   r   )r   Ps     r   permutezDMP.permute  s*    " uu[15!%88999r   c                 v    t          | j        | j        | j                  \  }}||                     |          fS )z/Remove GCD of terms from the polynomial ``f``. )rK   r   r   r   r$   r#  s      r   	terms_gcdzDMP.terms_gcd  s1    QUAE15111!%%(({r   c                     |                      t          | j        | j                            |          | j        | j                            S )z.Add an element of the ground domain to ``f``. )r$   rQ   r   r   r   r   r   r  s     r   
add_groundzDMP.add_ground  6    uu^AE15==+;+;QUAEJJKKKr   c                     |                      t          | j        | j                            |          | j        | j                            S )z5Subtract an element of the ground domain from ``f``. )r$   rR   r   r   r   r   r7  s     r   
sub_groundzDMP.sub_ground  r9  r   c                     |                      t          | j        | j                            |          | j        | j                            S )z5Multiply ``f`` by a an element of the ground domain. )r$   rS   r   r   r   r   r7  s     r   
mul_groundzDMP.mul_ground  r9  r   c                     |                      t          | j        | j                            |          | j        | j                            S )z8Quotient of ``f`` by a an element of the ground domain. )r$   rT   r   r   r   r   r7  s     r   
quo_groundzDMP.quo_ground  r9  r   c                     |                      t          | j        | j                            |          | j        | j                            S )z>Exact quotient of ``f`` by a an element of the ground domain. )r$   rU   r   r   r   r   r7  s     r   exquo_groundzDMP.exquo_ground  7    uu%aeQU]]1-=-=quaeLLMMMr   c                 h    |                      t          | j        | j        | j                            S )z)Make all coefficients in ``f`` positive. )r$   rV   r   r   r   r   s    r   abszDMP.abs  &    uuWQUAE1511222r   c                 h    |                      t          | j        | j        | j                            S )"Negate all coefficients in ``f``. )r$   rX   r   r   r   r   s    r   negzDMP.neg  rE  r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z2Add two multivariate polynomials ``f`` and ``g``. )r   rZ   r   r"   r   r   r$   r   r   s          r   addzDMP.add  :    ggajjS#q!s71ac**+++r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z7Subtract two multivariate polynomials ``f`` and ``g``. )r   r\   rJ  s          r   subzDMP.sub  rL  r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z7Multiply two multivariate polynomials ``f`` and ``g``. )r   r^   rJ  s          r   mulzDMP.mul  rL  r   c                 h    |                      t          | j        | j        | j                            S )z(Square a multivariate polynomial ``f``. )r$   r_   r   r   r   r   s    r   sqrzDMP.sqr  rE  r   c                     t          |t                    r4|                     t          | j        || j        | j                            S t          dt          |          z            )+Raise ``f`` to a non-negative power ``n``. ``int`` expected, got %s)	r   intr$   ra   r   r   r   	TypeErrorr   r  s     r   powzDMP.pow  sU    a 	B5515!%889996a@AAAr   c                     |                      |          \  }}}}}t          ||||          \  }} ||           ||          fS )z/Polynomial pseudo-division of ``f`` and ``g``. )r   rb   	r   r"   r   r   r$   r   r   qrs	            r   pdivzDMP.pdiv  sM    ggajjS#q!1c3''1s1vvss1vv~r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z0Polynomial pseudo-remainder of ``f`` and ``g``. )r   rc   rJ  s          r   premzDMP.prem  :    ggajjS#q!s8Aq#s++,,,r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z/Polynomial pseudo-quotient of ``f`` and ``g``. )r   rd   rJ  s          r   pquozDMP.pquo  r`  r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z5Polynomial exact pseudo-quotient of ``f`` and ``g``. )r   re   rJ  s          r   pexquoz
DMP.pexquo  s:    ggajjS#q!s:aC--...r   c                     |                      |          \  }}}}}t          ||||          \  }} ||           ||          fS )z7Polynomial division with remainder of ``f`` and ``g``. )r   rf   rZ  s	            r   divzDMP.div  sM    ggajjS#q!q!S#&&1s1vvss1vv~r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z2Computes polynomial remainder of ``f`` and ``g``. )r   rh   rJ  s          r   remzDMP.rem  rL  r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z1Computes polynomial quotient of ``f`` and ``g``. )r   ri   rJ  s          r   quozDMP.quo  rL  r   c                     |                      |          \  }}}}} |t          ||||                    }| j        r!|| j        vrddlm}  || || j                  |S )z7Computes polynomial exact quotient of ``f`` and ``g``. r   ExactQuotientFailed)r   rj   r   sympy.polys.polyerrorsrm  )	r   r"   r   r   r$   r   r   resrm  s	            r   exquoz	DMP.exquo  s    ggajjS#q!c)Aq#s++,,6 	4c' 	4BBBBBB%%aAF333
r   c                     t          |t                    rt          | j        || j                  S t          dt          |          z            )z0Returns the leading degree of ``f`` in ``x_j``. rU  )r   rV  r8   r   r   rW  r   )r   r   s     r   degreez
DMP.degree  sE    a 	B 151116a@AAAr   c                 6    t          | j        | j                  S )z$Returns a list of degrees of ``f``. )r9   r   r   r   s    r   degree_listzDMP.degree_list  s    quae,,,r   c                 X    t          d |                                 D                       S )z#Returns the total degree of ``f``. c              3   4   K   | ]}t          |          V  d S r   sum)r!   r   s     r   	<genexpr>z#DMP.total_degree.<locals>.<genexpr>  s(      ..a3q66......r   )maxr   r   s    r   total_degreezDMP.total_degree  s'    ..188::......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        | j        t          |          z   | j
                  S )z&Return homogeneous polynomial of ``f``r   r   )r{  r+  r  rx  r   tupler   r   r   rV  r   )	r   stdr&   
new_symboltermdr  ls	            r   
homogenizezDMP.homogenize  s    ^^3qwwyy|A///
GGII 	+ 	+DDGA2v F +)-atAw!~&&aMM!	#'7uQxx  615!%#j//"916BBBr   c                     | j         rt           S |                                 }t          |d                   }|D ]}t          |          }||k    r dS |S )z(Returns the homogeneous order of ``f``. r   N)is_zeror   r   rx  )r   r   tdegmonom_tdegs        r   homogeneous_orderzDMP.homogeneous_order&  sh    9 	3J6!9~~ 	 	EJJE} tt r   c                 B    t          | j        | j        | j                  S z*Returns the leading coefficient of ``f``. )r<   r   r   r   r   s    r   LCzDMP.LC6      QUAE15111r   c                 B    t          | j        | j        | j                  S z+Returns the trailing coefficient of ``f``. )r>   r   r   r   r   s    r   TCzDMP.TC:  r  r   c                     t          d |D                       r!t          | j        || j        | j                  S t          d          )z+Returns the ``n``-th coefficient of ``f``. c              3   @   K   | ]}t          |t                    V  d S r   )r   rV  )r!   r   s     r   ry  zDMP.nth.<locals>.<genexpr>@  s,      --az!S!!------r   za sequence of integers expected)allr?   r   r   r   rW  )r   Ns     r   nthzDMP.nth>  sJ    --1----- 	?!!%AE15999=>>>r   c                 B    t          | j        | j        | j                  S )zReturns maximum norm of ``f``. )rm   r   r   r   r   s    r   max_normzDMP.max_normE  s    AE15!%000r   c                 B    t          | j        | j        | j                  S )zReturns l1 norm of ``f``. )rn   r   r   r   r   s    r   l1_normzDMP.l1_normI  s    15!%///r   c                 B    t          | j        | j        | j                  S )z!Return squared l2 norm of ``f``. )ro   r   r   r   r   s    r   l2_norm_squaredzDMP.l2_norm_squaredM  s    "15!%777r   c                 v    t          | j        | j        | j                  \  }}||                     |          fS )z0Clear denominators, but keep the ground domain. )rp   r   r   r   r$   )r   r(   r   s      r   clear_denomszDMP.clear_denomsQ  s1    #AE15!%88qaeeAhhr   r   c           	      <   t          |t                    st          dt          |          z            t          |t                    st          dt          |          z            |                     t          | j        ||| j        | j                            S )zEComputes the ``m``-th order indefinite integral of ``f`` in ``x_j``. rU  )	r   rV  rW  r   r$   rq   r   r   r   r   r   r   s      r   	integratezDMP.integrateV  s    !S!! 	B6a@AAA!S!! 	B6a@AAAuu%aeQ15!%@@AAAr   c           	      <   t          |t                    st          dt          |          z            t          |t                    st          dt          |          z            |                     t          | j        ||| j        | j                            S )z<Computes the ``m``-th order derivative of ``f`` in ``x_j``. rU  )	r   rV  rW  r   r$   rr   r   r   r   r  s      r   diffzDMP.diff`  s    !S!! 	B6a@AAA!S!! 	B6a@AAAuu[1aeQU;;<<<r   c           	         t          |t                    st          dt          |          z            |                     t          | j        | j                            |          || j	        | j                  d          S )z5Evaluates ``f`` at the given point ``a`` in ``x_j``. rU  Tr   )
r   rV  rW  r   r$   rs   r   r   r   r   )r   ar   s      r   evalzDMP.evalj  sx    !S!! 	B6a@AAAuu[EMM!a/ /59  ; ; 	;r   c                     |                      |          \  }}}}}|s*t          |||          \  }} ||           ||          fS t          d          )z2Half extended Euclidean algorithm, if univariate. univariate polynomial expected)r   r~   
ValueError)	r   r"   r   r   r$   r   r   r~  hs	            r   
half_gcdexzDMP.half_gcdexr  sb    ggajjS#q! 	?!!Q,,DAq3q6633q66>!=>>>r   c                     |                      |          \  }}}}}|s5t          |||          \  }}}	 ||           ||           ||	          fS t          d          )z-Extended Euclidean algorithm, if univariate. r  )r   r   r  )
r   r"   r   r   r$   r   r   r~  tr  s
             r   gcdexz	DMP.gcdex|  so    ggajjS#q! 	?1c**GAq!3q6633q6633q66))=>>>r   c                     |                      |          \  }}}}}|s |t          |||                    S t          d          )z(Invert ``f`` modulo ``g``, if possible. r  )r   r   r  rJ  s          r   invertz
DMP.invert  sO    ggajjS#q! 	?3z!Q,,---=>>>r   c                     | j         s.|                     t          | j        || j                            S t          d          )z"Compute ``f**(-1)`` mod ``x**n``. r  )r   r$   rt   r   r   r  r  s     r   revertz
DMP.revert  s=    u 	?55AE1ae44555=>>>r   c                     |                      |          \  }}}}}t          ||||          }t          t          ||                    S )z7Computes subresultant PRS sequence of ``f`` and ``g``. )r   r   r   map)r   r"   r   r   r$   r   r   Rs           r   subresultantszDMP.subresultants  sE    ggajjS#q!aC--CQKK   r   c                     |                      |          \  }}}}}|rAt          |||||          \  }}	 ||d          t          t          ||	                    fS  |t          ||||          d          S )z/Computes resultant of ``f`` and ``g`` via PRS. )
includePRSTr  )r   r   r   r  )
r   r"   r  r   r   r$   r   r   ro  r  s
             r   	resultantzDMP.resultant  s    ggajjS#q! 	:"1acjIIIFC3s&&&Sa[[(9(999s=AsC00t<<<<r   c                 l    |                      t          | j        | j        | j                  d          S )z Computes discriminant of ``f``. Tr  )r$   r   r   r   r   r   s    r   discriminantzDMP.discriminant  s+    uu%aeQUAE::uFFFr   c                     |                      |          \  }}}}}t          ||||          \  }}}	 ||           ||           ||	          fS )z4Returns GCD of ``f`` and ``g`` and their cofactors. )r   r   )
r   r"   r   r   r$   r   r   r  cffcfgs
             r   	cofactorszDMP.cofactors  sZ    ggajjS#q!#Aq#s333s1vvss3xxS))r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z+Returns polynomial GCD of ``f`` and ``g``. )r   r   rJ  s          r   gcdzDMP.gcd  rL  r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z+Returns polynomial LCM of ``f`` and ``g``. )r   r   rJ  s          r   lcmzDMP.lcm  rL  r   Tc                     |                      |          \  }}}}}|rt          ||||d          \  }}nt          ||||d          \  }}	}} ||           ||          }}|r||fS ||	||fS )z6Cancel common factors in a rational function ``f/g``. T)r'   F)r   r   )
r   r"   r'   r   r   r$   r   r   cFcGs
             r   cancelz
DMP.cancel  s    ggajjS#q! 	EaCd;;;DAqq%aCeDDDLBAqs1vvss1vv1 	 a4Kr1a<r   c                     |                      t          | j        | j                            |          | j        | j                            S )z&Reduce ``f`` modulo a constant ``p``. )r$   ru   r   r   r   r   )r   ps     r   truncz	DMP.trunc  rB  r   c                 h    |                      t          | j        | j        | j                            S )z'Divides all coefficients by ``LC(f)``. )r$   rx   r   r   r   r   s    r   monicz	DMP.monic  s'    uu%aeQUAE::;;;r   c                 B    t          | j        | j        | j                  S )z(Returns GCD of polynomial coefficients. )rv   r   r   r   r   s    r   contentzDMP.content  s    !!%666r   c                 v    t          | j        | j        | j                  \  }}||                     |          fS )z/Returns content and a primitive form of ``f``. )rw   r   r   r   r$   )r   contr   s      r   	primitivezDMP.primitive  s1    &quaeQU;;aQUU1XX~r   c                 n    |                      |          \  }}}}} |t          ||||                    S )z4Computes functional composition of ``f`` and ``g``. )r   ry   rJ  s          r   composezDMP.compose  s:    ggajjS#q!s;q!S#..///r   c           	          | j         s:t          t          | j        t	          | j        | j                                      S t          d          )z,Computes functional decomposition of ``f``. r  )r   r   r  r$   rz   r   r   r  r   s    r   	decomposezDMP.decompose  sC    u 	?AE=#>#>??@@@=>>>r   c                     | j         sF|                     t          | j        | j                            |          | j                            S t          d          )z/Efficiently compute Taylor shift ``f(x + a)``. r  )r   r$   r{   r   r   r   r  )r   r  s     r   shiftz	DMP.shift  sK    u 	?5515!%--*:*:AEBBCCC=>>>r   c                 j   | j         rt          d          |                    |          \  }}}}}|                      ||||                    \  }}}}} ||||                               ||||                    \  }}}}}|s |t          ||||                    S t          d          )z5Evaluate functional transformation ``q**n * f(p/q)``.r  )r   r  r   r|   )	r   r  r[  r   r   r$   r2  Qr   s	            r   	transformzDMP.transform  s    5 	?=>>>ggajjS#q!ggcc!S#&6&677S#q!!c!S#..44SSC5E5EFFS#q! 	?3}Q1c22333=>>>r   c           	          | j         s:t          t          | j        t	          | j        | j                                      S t          d          )z&Computes the Sturm sequence of ``f``. r  )r   r   r  r$   r   r   r   r  r   s    r   sturmz	DMP.sturm  sC    u 	?AE9QUAE#:#:;;<<<=>>>r   c                 b    | j         st          | j        | j                  S t	          d          )z7Computes the Cauchy upper bound on the roots of ``f``. r  )r   r   r   r   r  r   s    r   cauchy_upper_boundzDMP.cauchy_upper_bound  /    u 	?)!%777=>>>r   c                 b    | j         st          | j        | j                  S t	          d          )z?Computes the Cauchy lower bound on the nonzero roots of ``f``. r  )r   r   r   r   r  r   s    r   cauchy_lower_boundzDMP.cauchy_lower_bound  r  r   c                 b    | j         st          | j        | j                  S t	          d          )zBComputes the squared Mignotte bound on root separations of ``f``. r  )r   r   r   r   r  r   s    r   mignotte_sep_bound_squaredzDMP.mignotte_sep_bound_squared  s/    u 	?1!%???=>>>r   c                 |      j         s& fdt           j         j                  D             S t	          d          )z4Computes greatest factorial factorization of ``f``. c                 D    g | ]\  }}                     |          |fS r    r$   r!   r"   r#   r   s      r   r%   z DMP.gff_list.<locals>.<listcomp>  s+    KKKtq!aeeAhh]KKKr   r  )r   r   r   r   r  r   s   `r   gff_listzDMP.gff_list  sD    u 	?KKKK|AE15/I/IKKKK=>>>r   c                     t          | j        | j        | j                  }|                     || j        j                  S )zComputes ``Norm(f)``.r   )r   r   r   r   r$   )r   r\  s     r   normzDMP.norm  s3    QUAE15))uuQAEIu&&&r   c                     t          | j        | j        | j                  \  }}}||                     |          |                     || j        j                  fS )z$Computes square-free norm of ``f``. r   )r   r   r   r   r$   )r   r~  r"   r\  s       r   sqf_normzDMP.sqf_norm"  sJ    quaeQU331a!%%((AEE!E3333r   c                 h    |                      t          | j        | j        | j                            S )z$Computes square-free part of ``f``. )r$   r   r   r   r   r   s    r   sqf_partzDMP.sqf_part'  s&    uu\!%66777r   c                 l     t           j         j         j        |          \  }}| fd|D             fS )0Returns a list of square-free factors of ``f``. c                 D    g | ]\  }}                     |          |fS r    r  r  s      r   r%   z DMP.sqf_list.<locals>.<listcomp>.  +    ;;;$!Qq1;;;r   )r   r   r   r   )r   r  r(   r)   s   `   r   sqf_listzDMP.sqf_list+  s@    %aeQUAE3??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.sqf_list_include.<locals>.<listcomp>3  +    44441a!%%((A444r   )r   r   r   r   )r   r  r)   s   `  r   sqf_list_includezDMP.sqf_list_include0  s6    &quaeQUC@@444474444r   c                 j     t           j         j         j                  \  }}| fd|D             fS )0Returns a list of irreducible factors of ``f``. c                 D    g | ]\  }}                     |          |fS r    r  r  s      r   r%   z#DMP.factor_list.<locals>.<listcomp>8  r  r   )r   r   r   r   )r   r(   r)   s   `  r   factor_listzDMP.factor_list5  s>    (qu==w;;;;';;;;;r   c                 `     t           j         j         j                  } fd|D             S )r  c                 D    g | ]\  }}                     |          |fS r    r  r  s      r   r%   z+DMP.factor_list_include.<locals>.<listcomp>=  r  r   )r   r   r   r   )r   r)   s   ` r   factor_list_includezDMP.factor_list_include:  s4    )!%>>444474444r   c                 2   | j         s|s@|st          | j        | j        ||||          S t	          | j        | j        ||||          S |st          | j        | j        ||||          S t          | j        | j        ||||          S t          d          )z0Compute isolating intervals for roots of ``f``. )epsinfsupfastz1Cannot isolate roots of a multivariate polynomial)r   r   r   r   r   r   r   r   )r   r  r  r  r  r  sqfs          r   	intervalszDMP.intervals?  s    u 	E 	i j1!%CSVY`deeee5aeQUQTZ]dhiiii i03CUX_cdddd4QUAEsPSY\cghhhh!CE E Er   c           	      n    | j         s t          | j        ||| j        |||          S t	          d          )zu
        Refine an isolating interval to the given precision.

        ``eps`` should be a rational number.

        )r  stepsr  z1Cannot refine a root of a multivariate polynomial)r   r   r   r   r   )r   r~  r  r  r  r  s         r   refine_rootzDMP.refine_rootP  sI     u 	E'q!QU5W[\\\\!CE E Er   c                 <    t          | j        | j        ||          S )z<Return the number of real roots of ``f`` in ``[inf, sup]``. r  r  )r   r   r   r   r  r  s      r   count_real_rootszDMP.count_real_roots]  s    #AE15csCCCCr   c                 <    t          | j        | j        ||          S )z?Return the number of complex roots of ``f`` in ``[inf, sup]``. r  )r   r   r   r  s      r   count_complex_rootszDMP.count_complex_rootsa  s    &quae#FFFFr   c                 6    t          | j        | j                  S )z0Returns ``True`` if ``f`` is a zero polynomial. rB   r   r   r   s    r   r  zDMP.is_zeroe       !%'''r   c                 B    t          | j        | j        | j                  S )z0Returns ``True`` if ``f`` is a unit polynomial. )rC   r   r   r   r   s    r   is_onez
DMP.is_onej       qu---r   c                 8    t          | j        d| j                  S )>Returns ``True`` if ``f`` is an element of the ground domain. N)rD   r   r   r   s    r   	is_groundzDMP.is_groundo  s     AE4///r   c                 B    t          | j        | j        | j                  S )z7Returns ``True`` if ``f`` is a square-free polynomial. )r   r   r   r   r   s    r   is_sqfz
DMP.is_sqft  r  r   c                 r    | j                             t          | j        | j        | j                             S )z=Returns ``True`` if the leading coefficient of ``f`` is one. )r   r  r<   r   r   r   s    r   is_moniczDMP.is_monicy  s*     u||M!%>>???r   c                 r    | j                             t          | j        | j        | j                             S )zAReturns ``True`` if the GCD of the coefficients of ``f`` is one. )r   r  rv   r   r   r   s    r   is_primitivezDMP.is_primitive~  s+     u||.quaeQUCCDDDr   c                     t          d t          | j        | j        | j                                                  D                       S )z:Returns ``True`` if ``f`` is linear in all its variables. c              3   <   K   | ]}t          |          d k    V  dS )r   Nrw  r!   r  s     r   ry  z DMP.is_linear.<locals>.<genexpr>  ,      XXu3u::?XXXXXXr   r  rG   r   r   r   keysr   s    r   	is_linearzDMP.is_linear  ?     XXAE15!%0P0P0U0U0W0WXXXXXXr   c                     t          d t          | j        | j        | j                                                  D                       S )z=Returns ``True`` if ``f`` is quadratic in all its variables. c              3   <   K   | ]}t          |          d k    V  dS )   Nrw  r!  s     r   ry  z#DMP.is_quadratic.<locals>.<genexpr>  r"  r   r#  r   s    r   is_quadraticzDMP.is_quadratic  r&  r   c                 L    t          |                                           dk    S )z8Returns ``True`` if ``f`` is zero or has only one term. r   )r+  r   r   s    r   is_monomialzDMP.is_monomial  s     199;;1$$r   c                 .    |                                  duS )z7Returns ``True`` if ``f`` is a homogeneous polynomial. N)r  r   s    r   is_homogeneouszDMP.is_homogeneous  s     ""$$D00r   c                 B    t          | j        | j        | j                  S )z:Returns ``True`` if ``f`` has no factors over its domain. )r   r   r   r   r   s    r   is_irreduciblezDMP.is_irreducible  s     !qu555r   c                 H    | j         st          | j        | j                  S dS )z6Returns ``True`` if ``f`` is a cyclotomic polynomial. F)r   r   r   r   r   s    r   is_cyclotomiczDMP.is_cyclotomic  s'     u 	#AE151115r   c                 *    |                                  S r   )rD  r   s    r   __abs__zDMP.__abs__      uuwwr   c                 *    |                                  S r   rH  r   s    r   __neg__zDMP.__neg__  r5  r   c                    t          |t                    s	 |                     t          | j                            |          | j                            }nl# t          $ r
 t          cY S t          t          f$ rF | j        <	 | j                            |          }n # t          t          f$ r t          cY cY S w xY wY nw xY w|                     |          S r   )r   r   r$   rA   r   r   r   rW  NotImplementedr   NotImplementedErrorr   rK  r   r"   s     r   __add__zDMP.__add__      !S!! 
	.	.EE*QU]]1%5%5qu==>> & & &%%%%"$78 . . .6 ..FNN1--*,?@ . . .------.	. uuQxx<   A A C+CBCB;6C:B;;C Cc                 ,    |                      |          S r   r=  r<  s     r   __radd__zDMP.__radd__      yy||r   c                    t          |t                    s	 |                     t          | j                            |          | j                            }nl# t          $ r
 t          cY S t          t          f$ rF | j        <	 | j                            |          }n # t          t          f$ r t          cY cY S w xY wY nw xY w|                     |          S r   )r   r   r$   rA   r   r   r   rW  r:  r   r;  r   rN  r<  s     r   __sub__zDMP.__sub__  r>  r?  c                 .    |                       |          S r   rA  r<  s     r   __rsub__zDMP.__rsub__      ||Ar   c                 ~   t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S t          t          f$ rX | j        G	 |                     | j        	                    |                    cY S # t          t          f$ r Y nw xY wt
          cY S w xY wr   )
r   r   rP  r=  rW  r:  r   r;  r   r   r<  s     r   __mul__zDMP.__mul__  s    a 	&5588O
&||A& & & &%%%%"$78 & & &6  uuQV^^A%6%677777*,?@   %%%%&;   A B<B<,,BB<B/,B<.B//
B<;B<c                 ~   t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S t          t          f$ rX | j        G	 |                     | j        	                    |                    cY S # t          t          f$ r Y nw xY wt
          cY S w xY wr   )
r   r   rp  r=  rW  r:  r   r;  r   r   r<  s     r   __truediv__zDMP.__truediv__  s    a 	&771::
&||A& & & &%%%%"$78 & & &6  wwqv~~a'8'899999*,?@   %%%%&rK  c                     t          |t                    r|                    |           S | j        E	 | j                            |                              |           S # t
          t          f$ r Y nw xY wt          S r   )r   r   rp  r   r   r   r;  r:  r<  s     r   __rtruediv__zDMP.__rtruediv__  s    a 	771::V 	v~~a((..q111"$78   s   ,A   A43A4c                 ,    |                      |          S r   rJ  r<  s     r   __rmul__zDMP.__rmul__  rC  r   c                 ,    |                      |          S r   rX  r  s     r   __pow__zDMP.__pow__      uuQxxr   c                 ,    |                      |          S r   rf  r<  s     r   
__divmod__zDMP.__divmod__  rV  r   c                 ,    |                      |          S r   rh  r<  s     r   __mod__zDMP.__mod__  rV  r   c                     t          |t                    r|                     |          S 	 |                     |          S # t          $ r
 t
          cY S w xY wr   )r   r   rj  r?  rW  r:  r<  s     r   __floordiv__zDMP.__floordiv__  s_    a 	&5588O&||A& & & &%%%%&s   A AAc                     	 |                      |          \  }}}}}| j        |j        k    r||k    S n# t          $ r Y nw xY wdS NF)r   r   r   r   r"   r  r   r   s        r   __eq__z
DMP.__eq__  se    	GGAJJMAq!Qu~ Av  	 	 	D	 us   04 
A Ac                     | |k     S r   r    r<  s     r   __ne__z
DMP.__ne__  s    6zr   c                 <    |s| |k    S |                      |          S r   )
_strict_eqr   r"   stricts      r   eqzDMP.eq  s#     	#6M<<??"r   c                 2    |                      ||           S )N)rh  )ri  rg  s      r   nezDMP.ne!  s    44&4))))r   c                     t          || j                  o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r   r   r   r   r   r<  s     r   rf  zDMP._strict_eq$  sE    !Q[)) aequn 	r   c                 D    |                      |          \  }}}}}||k     S r   r   ra  s        r   __lt__z
DMP.__lt__)  $    

1aA1ur   c                 D    |                      |          \  }}}}}||k    S r   rn  ra  s        r   __le__z
DMP.__le__-  $    

1aAAvr   c                 D    |                      |          \  }}}}}||k    S r   rn  ra  s        r   __gt__z
DMP.__gt__1  rp  r   c                 D    |                      |          \  }}}}}||k    S r   rn  ra  s        r   __ge__z
DMP.__ge__5  rs  r   c                 8    t          | j        | j                   S r   r  r   s    r   __bool__zDMP.__bool__9      aeQU++++r   NN)NFNr   Fr  )r   r   T)FNNNFF)NNF)r+   r,   r-   r.   	__slots__r   r   r   r   r$   r/   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r  r  r!  r%  r)  r-  r0  r3  r5  r8  r;  r=  r?  rA  rD  rH  rK  rN  rP  rR  rX  r]  r_  rb  rd  rf  rh  rj  rp  rr  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  propertyr  r  r  r  r  r  r%  r*  r,  r.  r0  r2  r4  r8  r=  rB  rE  rG  rJ  rM  rO  rR  rU  rY  r\  r^  rb  rd  ri  rk  rf  ro  rr  ru  rw  ry  r    r   r   r   r      s
       33-I   O O OP P P' ' '<( ( ( ($ & & & [& & & & [& ? ? [? < < [<; ; ; ;     * * ** * * ; ; [; D D D [D+ + +, , ,, , ,J J JA A A AR R R RR R R R@ @ @ @L L L
L 
L 
L
L 
L 
LC C C  
. . . .
= = = =
+ + +&: : :&  
L L LL L LL L LL L LN N N3 3 33 3 3, , ,
, , ,
, , ,
3 3 3B B B  - - -
- - -
/ / /
  , , ,
, , ,
  B B B B- - -/ / /C C C&   2 2 22 2 2? ? ?1 1 10 0 08 8 8  
B B B B= = = =; ; ; ;? ? ?? ? ?? ? ?? ? ?! ! != = = =G G G* * *, , ,
, , ,
        N N N< < <7 7 7  
0 0 0
? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?' ' '
4 4 4
8 8 8< < < <
5 5 5 5
< < <
5 5 5
E E E E"E E E ED D D DG G G G ( ( X( . . X. 0 0 X0 . . X. @ @ X@ E E XE Y Y XY Y Y XY % % X% 1 1 X1 6 6 X6   X            & & & & & &           & & &	 	 	  # # # #* * * *  
        , , , , ,r   r   c                 b    t          t          | ||          t          |||          ||          S r   )DMFr2   )numdenr   r   s       r   init_normal_DMFr  =  s5    z#sC((#sC((#s4 4 4r   c                   z   e Zd ZdZdZd.dZed.d            Zed/d            Zd Z	d Z
d	 Zd
 Zd0dZd1dZed/d            Zed/d            Zd Zd Zd Zd Zd Zd Zd Zd Zd Ze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(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/dS )3r  z'Dense Multivariate Fractions over `K`. )r  r  r   r   r   Nc                     |                      |||          \  }}}t          ||||          \  }}|| _        || _        || _        || _        || _        d S r   )_parser   r  r  r   r   r   )r   r   r   r   r   r  r  s          r   r   zDMF.__init__G  s[    Cc22S#c3S11S			r   c                     |                      |||          \  }}}t                              |           }||_        ||_        ||_        ||_        ||_        |S r   )r  object__new__r  r  r   r   r   )r   r   r   r   r   r  r  objs           r   newzDMF.newQ  sV    

3S11S#nnS!!
r   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   rF   r0   r  rB   ZeroDivisionErrorr@   r:   rX   r   rA   r   )r   r   r   r   r  r  num_levden_levs           r   r  z
DMF._parse_  s   c5!! &	$HC Fc4(( 7'S#66Cc4(( 7'S#66C+C00W+C00Wg% F!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           
      `    | j         j        d| j        d| j        d| j        d| j        d
S )Nz((r   z), r   )r   r+   r  r  r   r   r   s    r   r   zDMF.__repr__  s;    )*)=)=)=quuuaeee)*8 	8r   c                     t          | j        j        t          | j        | j                  t          | j        | j                  | j        | j        | j        f          S r   )	r   r   r+   rP   r  r   r  r   r   r   s    r   r   zDMF.__hash__  sM    Q[)<qu+E+E&&quaf> ? ? 	?r   c                     t          |t                    r j        |j        k    rt          d d|           j        |j        k    r7 j        |j        k    r' j         j         j         j         j        f|j	        fS  j         j        
                    |j                  c} j        |j        $
                    |j                  n|j        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   NTFc                     |r|s| |z  S |dz
  }|rt          | ||          \  } }j                            | |f|          S Nr   r   r   r   r  r  r  r  r   r   r   r   r   s        r   r$   zDMF.poly_unify.<locals>.per  d     & &"3w!Ag >)#sC==HC{Sz3$GGGr   )r   r   r   r   r   r   r$   r  r  r   r   r4   r   r"   r   r   r   r$   r   r   s   `     @@r   
poly_unifyzDMF.poly_unify  sk   !S!! 	HQUae^ 	H##AA$FGGG5AE> 	'af. 	'E15!%!%??uaekk!%00HC6Dv " "::af--DD6DQUC44QUC446A AE3s33A%)3 
H 
H 
H 
H 
H 
H 
H 
H S!Q&&r   c                     t          |t                    r j        |j        k    rt          d d|           j        |j        k    r> j        |j        k    r. j         j         j         j         j        f|j        |j        ffS  j         j        	                    |j                  c} j        |j        $	                    |j                  n|j        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   NTFc                     |r|s| |z  S |dz
  }|rt          | ||          \  } }j                            | |f|          S r  r  r  s        r   r$   zDMF.frac_unify.<locals>.per  r  r   )r   r  r   r   r   r   r$   r  r  r   r4   r  s   `     @@r   
frac_unifyzDMF.frac_unify  s   !S!! 	HQUae^ 	H##AA$FGGG5AE> 	'af. 	'E15!%!%*+%9 9 uaekk!%00HC6Dv " "::af--DD6DQUC44QUC446A QUC44QUC446A &*3 
H 
H 
H 
H 
H 
H 
H 
H S!Q&&r   TFc                     | j         | j        }}|r|s||z  S |dz  }|rt          ||||          \  }}|| j        }| j                            ||f|||          S )z.Create a DMF out of the given representation. r   Nr  )r   r   r   r   r   r  )r   r  r  r  r   r   r   r   s           r   r$   zDMF.per  s    5!%S 	 3wq 	6!#sC55HC 	6D{Sz3$???r   c                 R    | j         }|r	|s|S |dz  }t          || j        |          S r   )r   r   r   )r   r   r   r   s       r   half_perzDMF.half_per  s;    e 	 
q3s###r   c                 4    |                      d|||          S )Nr   r  r  r   s       r   r   zDMF.zero      wwq#sw...r   c                 4    |                      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   numerz	DMF.numer      zz!%   r   c                 6    |                      | j                  S )z"Returns the denominator of ``f``. )r  r  r   s    r   denomz	DMF.denom  r  r   c                 B    |                      | j        | j                  S )z4Remove common factors from ``f.num`` and ``f.den``. )r$   r  r  r   s    r   r  z
DMF.cancel	  s    uuQUAE"""r   c                 x    |                      t          | j        | j        | j                  | j        d          S )rG  Fr  )r$   rX   r  r   r   r  r   s    r   rH  zDMF.neg  s.    uuWQUAE151115uGGGr   c           	         t          |t                    r4|                     |          \  }}}\  }}}t          |||||          |}	}nj|                     |          \  }}}}
}|
|c\  }}\  }}t          t          ||||          t          ||||          ||          }t          ||||          }	 |||	          S )z0Add two multivariate fractions ``f`` and ``g``. )r   r   r  rk   r  rZ   r^   r   r"   r   r   r$   F_numF_denr   r  r  r   G_numG_dens                r   rK  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  rl   r  r\   r^   r  s                r   rN  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   rP  zDMF.mul/  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            )rT  r   Fr  rU  )
r   rV  r  r  r$   ra   r   r   rW  r   )r   r   r  r  s       r   rX  zDMF.pow=  s    a 	BuaeC1u +!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          ||||          }	 |||	          }| j        !|| j        vrddlm}  || || j                  |S )z0Computes quotient of fractions ``f`` and ``g``. Nr   rl  )r   r   r  r^   r  r   rn  rm  )r   r"   r   r   r$   r  r  r   r  r  r   r  r  ro  rm  s                  r   rj  zDMF.quoH  s    a 	2/0||A,Cc>E51geQS99CC"#,,q//Cc1a-.*NUENUE%S11C%S11Cc#smm6 	4#QV"3 	4BBBBBB%%aAF333
r   c                     |r6| j         /| j                             |           st          | | j                   |                     | j        | j        d          }|S )z&Computes inverse of a fraction ``f``. NFr  )r   is_unitr   r$   r  r  )r   checkro  s      r   r  z
DMF.invert\  sZ     	+QV 	+q0A0A 	+16***eeAE15e//
r   c                 6    t          | j        | j                  S )z.Returns ``True`` if ``f`` is a zero fraction. rB   r  r   r   s    r   r  zDMF.is_zeroc  r  r   c                     t          | j        | j        | j                  ot          | j        | j        | j                  S )z.Returns ``True`` if ``f`` is a unit fraction. )rC   r  r   r   r  r   s    r   r  z
DMF.is_oneh  s8     qu-- +aeQUAE**	+r   c                 *    |                                  S r   r7  r   s    r   r8  zDMF.__neg__n  r5  r   c                    t          |t          t          f          r|                     |          S 	 |                     |                     |                    S # t
          $ r
 t          cY S t          t          f$ rX | j	        G	 |                     | j	        
                    |                    cY S # t          t          f$ r Y nw xY wt          cY S w xY wr   )r   r   r  rK  r  rW  r:  r   r;  r   r   r<  s     r   r=  zDMF.__add__q      a#s$$ 	5588O
	"55A''' 	" 	" 	"!!!! 34 	" 	" 	"v 55!2!233333&(;<   D!!!!	";   'A C.C,B52C5C	CC		
CCc                 ,    |                      |          S r   rA  r<  s     r   rB  zDMF.__radd__  rC  r   c                    t          |t          t          f          r|                     |          S 	 |                     |                     |                    S # t
          $ r
 t          cY S t          t          f$ rX | j	        G	 |                     | j	        
                    |                    cY S # t          t          f$ r Y nw xY wt          cY S w xY wr   )r   r   r  rN  r  rW  r:  r   r;  r   r   r<  s     r   rE  zDMF.__sub__  r  r  c                 .    |                       |          S r   rA  r<  s     r   rG  zDMF.__rsub__  rH  r   c                    t          |t          t          f          r|                     |          S 	 |                     |                     |                    S # t
          $ r
 t          cY S t          t          f$ rX | j	        G	 |                     | j	        
                    |                    cY S # t          t          f$ r Y nw xY wt          cY S w xY wr   )r   r   r  rP  r  rW  r:  r   r;  r   r   r<  s     r   rJ  zDMF.__mul__  r  r  c                 ,    |                      |          S r   rQ  r<  s     r   rR  zDMF.__rmul__  rC  r   c                 ,    |                      |          S r   rT  r  s     r   rU  zDMF.__pow__  rV  r   c                    t          |t          t          f          r|                     |          S 	 |                     |                     |                    S # t
          $ r
 t          cY S t          t          f$ rX | j	        G	 |                     | j	        
                    |                    cY S # t          t          f$ r Y nw xY wt          cY S w xY wr   )r   r   r  rj  r  rW  r:  r   r;  r   r   r<  s     r   rM  zDMF.__truediv__  r  r  c                     |                      d          |z  }| j        r!|| j        vrddlm}  ||| | j                  |S )NF)r  r   rl  )r  r   rn  rm  )r   r"   r\  rm  s       r   rO  zDMF.__rtruediv__  s`    KKeK$$Q&9 	:$)+ 	:BBBBBB%%aty999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 r`  r   r   r  r   rC   r   r  r   r   r"   r  r  r  r   r   s          r   rb  z
DMF.__eq__  s    	!S!! 	"-.\\!__*1a%5AE> I$UAE1599HeqjHI !"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   rd  z
DMF.__ne__  s    	!S!! 	"-.\\!__*1a%5AE> O )% > > M5A:NNO !"Q1aA5AE> "6M  	 	 	D	 ts   A$B '1B 
B'&B'c                 D    |                      |          \  }}}}}||k     S r   r  ra  s        r   ro  z
DMF.__lt__  $    Q1aA1ur   c                 D    |                      |          \  }}}}}||k    S r   r  ra  s        r   rr  z
DMF.__le__  $    Q1aAAvr   c                 D    |                      |          \  }}}}}||k    S r   r  ra  s        r   ru  z
DMF.__gt__  r  r   c                 D    |                      |          \  }}}}}||k    S r   r  ra  s        r   rw  z
DMF.__ge__  r  r   c                 8    t          | j        | j                   S r   r  r   s    r   ry  zDMF.__bool__  rz  r   r{  r   )TFNr|  r}  )0r+   r,   r-   r.   r~  r   r/   r  r  r   r   r  r  r$   r  r   r   r  r  r  rH  rK  rN  rP  rX  rj  rp  r  r  r  r  r8  r=  rB  rE  rG  rJ  rR  rU  rM  rO  rb  rd  ro  rr  ru  rw  ry  r    r   r   r  r  B  s       114I       [ ) ) ) [)V8 8 8? ? ?!' !' !'F#' #' #'J@ @ @ @$
$ 
$ 
$ 
$ / / / [/ / / / [/! ! !! ! !# # #H H H      	B 	B 	B  $ E    ( ( X( + + X+
  " " "   " " "   " " "     " " "     "  "        , , , , ,r   r  c                 \    t          t          | |          t          ||          |          S r   )ANPr1   r   modr   s      r   init_normal_ANPr    s/    z#s###s##S* * *r   c                      e Zd ZdZdZd Zd Zd Zd Zd1dZ	e
d	             Ze
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eZ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*d' Z+d( Z,d) Z-d* Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4dS )2r  z1Dense Algebraic Number Polynomials over a field. r  c                    t          |          t          u rt          |          | _        nNt	          |t
                    rfd|D             }n                    |          g}t          |          | _        t	          |t                    r|j        | _	        n?t	          |t                    rt          |          | _	        nt          |          | _	        | _
        d S )Nc                 :    g | ]}                     |          S r    )r   )r!   r  r   s     r   r%   z ANP.__init__.<locals>.<listcomp>
  s#    333!s{{1~~333r   )r   r   rE   r   r   r   r   r6   r   r  r   )r   r   r  r   s      `r   r   zANP.__init__  s    99 	&$S#..DHH#t$$ )3333s333{{3''( ~~DHc3 	*wDHH#t$$ *(c22$S>>r   c                 P    | j         j        d| j        d| j        d| j        dS r   )r   r+   r   r  r   r   s    r   r   zANP.__repr__  s.    #$;#7#7#7quuuMMr   c                     t          | j        j        |                                 t	          | j        d          | j        f          S r   )r   r   r+   r   rP   r  r   r   s    r   r   zANP.__hash__  s6    Q[)1::<<aeQ9O9OQRQVWXXXr   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   <lambda>zANP.unify.<locals>.<lambda>5  s    c#sC00 r   )	r   r  r  r   r   r$   r   r   r3   )r   r"   r   r   r$   r   r  s        @@r   r   z	ANP.unify   s   !S!! 	HQUae^ 	H##AA$FGGG5AE> 	15!%qu44%++ae$$CAE15#..AAE15#..Aae|  qu  !!%44!%<  %CC%C00000CCAs""r   Nc                 @    t          ||p| j        |p| j                  S r   )r  r  r   )r   r   r  r   s       r   r$   zANP.per9  s     3quclQU333r   c                 $    t          d||          S r   r  r   r  r   s      r   r   zANP.zero<      1c3r   c                 $    t          d||          S r   r  r  s      r   r   zANP.one@  r  r   c                 8    t          | j        d| j                  S )r   r   )rG   r   r   r   s    r   r   zANP.to_dictD  s    15!QU+++r   c                     t          | j        d| j                  }|                                D ]"\  }}| j                            |          ||<   #|S )r   r   )rG   r   r   r   r   )r   r   r#   r   s       r   r   zANP.to_sympy_dictH  sP    !%AE**IIKK 	' 	'DAqU^^A&&CFF
r   c                     | j         S r   r   r   s    r   r   zANP.to_listQ  r   r   c                 *      fd j         D             S )r   c                 D    g | ]}j                             |          S r    )r   r   )r!   r  r   s     r   r%   z%ANP.to_sympy_list.<locals>.<listcomp>W  s'    333q""333r   r   r   s   `r   r   zANP.to_sympy_listU  s    3333AE3333r   c                 ,    t          | j        d          S )r   r   )rP   r   r   s    r   r   zANP.to_tupleY  s     AE1%%%r   c           
      ~    t          t          t          t          |j        |                              ||          S r   )r  r6   r   r  r   )r   r   r  r   s       r   r   zANP.from_lista  s0    9T#ck3"7"788993DDDr   c                 \    |                      t          | j        | j                            S r   )r$   rW   r   r   r   s    r   rH  zANP.nege  s"    uuWQUAE**+++r   c                 l    |                      |          \  }}}}} |t          |||                    S r   )r   rY   r   r"   r   r$   r   r   r  s          r   rK  zANP.addh  8    ggajjS!Qs71a%%&&&r   c                 l    |                      |          \  }}}}} |t          |||                    S r   )r   r[   r  s          r   rN  zANP.subl  r  r   c           	          |                      |          \  }}}}} |t          t          |||          ||                    S r   )r   rg   r]   r  s          r   rP  zANP.mulp  sD    ggajjS!Qs771a--sC88999r   c           	      P   t          |t                    rs|dk     r$t          | j        | j        | j                  | }}n| j        }|                     t          t          ||| j                  | j        | j                            S t          dt          |          z            )rT  r   rU  )r   rV  r   r   r  r   r$   rg   r`   rW  r   )r   r   r   s      r   rX  zANP.powt  s    a 	B1u !!%661E55Aqu!5!5quaeDDEEE6a@AAAr   c                     |                      |          \  }}}}} |t          t          |t          |||          |          ||                    |                     ||          fS r   )r   rg   r]   r   r   r  s          r   rf  zANP.div  sh    ggajjS!QGGAz!S#'>'>DDc3OOPPRSRXRXY\^aRbRbccr   c                     |                      |          \  }}}}}t          |||          \  }}||j        gk    r|                     ||          S t	          d          )Nzzero divisor)r   r~   r   r   r   )r   r"   r   r  r   r  r~  r  s           r   rh  zANP.rem  sc    GGAJJQ1cac**1	> 	066#s###///r   c                     |                      |          \  }}}}} |t          t          |t          |||          |          ||                    S r   )r   rg   r]   r   r  s          r   rj  zANP.quo  sP    ggajjS!Qs771jC&=&=sCCS#NNOOOr   c                 6    t          | j        | j                  S r  )r;   r   r   r   s    r   r  zANP.LC      aeQU###r   c                 6    t          | j        | j                  S r  )r=   r   r   r   s    r   r  zANP.TC  r  r   c                     |  S )z6Returns ``True`` if ``f`` is a zero algebraic number. r    r   s    r   r  zANP.is_zero  s     ur   c                 .    | j         | j        j        gk    S )z6Returns ``True`` if ``f`` is a unit algebraic number. )r   r   r   r   s    r   r  z
ANP.is_one  s     u##r   c                 B    | j          pt          | j                   dk    S )r  r   )r   r+  r   s    r   r  zANP.is_ground  s     5y+CJJ!O+r   c                     | S r   r    r   s    r   __pos__zANP.__pos__  s    r   c                 *    |                                  S r   r7  r   s    r   r8  zANP.__neg__  r5  r   c                     t          |t                    r|                     |          S 	 |                     |                     |                    S # t          t
          f$ r
 t          cY S w xY wr   )r   r  rK  r$   r   rW  r:  r<  s     r   r=  zANP.__add__  n    a 	&5588O&uuQUU1XX&"I. & & &%%%%&   'A A/.A/c                 ,    |                      |          S r   rA  r<  s     r   rB  zANP.__radd__  rC  r   c                     t          |t                    r|                     |          S 	 |                     |                     |                    S # t          t
          f$ r
 t          cY S w xY wr   )r   r  rN  r$   r   rW  r:  r<  s     r   rE  zANP.__sub__  r  r  c                 .    |                       |          S r   rA  r<  s     r   rG  zANP.__rsub__  rH  r   c                     t          |t                    r|                     |          S 	 |                     |                     |                    S # t          t
          f$ r
 t          cY S w xY wr   )r   r  rP  r$   r   rW  r:  r<  s     r   rJ  zANP.__mul__  r  r  c                 ,    |                      |          S r   rQ  r<  s     r   rR  zANP.__rmul__  rC  r   c                 ,    |                      |          S r   rT  r  s     r   rU  zANP.__pow__  rV  r   c                 ,    |                      |          S r   rX  r<  s     r   rY  zANP.__divmod__  rV  r   c                 ,    |                      |          S r   r[  r<  s     r   r\  zANP.__mod__  rV  r   c                     t          |t                    r|                     |          S 	 |                     |                     |                    S # t          t
          f$ r
 t          cY S w xY wr   )r   r  rj  r$   r   rW  r:  r<  s     r   rM  zANP.__truediv__  r  r  c                 h    	 |                      |          \  }}}}}||k    S # t          $ r Y dS w xY wr`  r   r   ra  s        r   rb  z
ANP.__eq__  sK    	GGAJJMAq!Q6M  	 	 	55	    # 
11c                 h    	 |                      |          \  }}}}}||k    S # t          $ r Y dS w xY wr  r  ra  s        r   rd  z
ANP.__ne__  sK    	GGAJJMAq!Q6M  	 	 	44	r  c                 D    |                      |          \  }}}}}||k     S r   rn  ra  s        r   ro  z
ANP.__lt__  rp  r   c                 D    |                      |          \  }}}}}||k    S r   rn  ra  s        r   rr  z
ANP.__le__  rs  r   c                 D    |                      |          \  }}}}}||k    S r   rn  ra  s        r   ru  z
ANP.__gt__  rp  r   c                 D    |                      |          \  }}}}}||k    S r   rn  ra  s        r   rw  z
ANP.__ge__  rs  r   c                 *    t          | j                  S r   )boolr   r   s    r   ry  zANP.__bool__  s    AE{{r   r{  )5r+   r,   r-   r.   r~  r   r   r   r   r$   r/   r   r   r   r   r   r   r   r   rH  rK  rN  rP  rX  rf  rh  rj  rp  r  r  r  r  r  r  r  r8  r=  rB  rE  rG  rJ  rR  rU  rY  r\  rM  rb  rd  ro  rr  ru  rw  ry  r    r   r   r  r    s(       ;;%I  ,N N NY Y Y# # #24 4 4 4     [      [ , , ,    4 4 4& & & E E [E, , ,' ' '' ' ': : :
B 
B 
Bd d d0 0 0P P P E$ $ $$ $ $   X $ $ X$ , , X,    & & &  & & &  & & &        & & &                r   r  N)r.   sympy.core.numbersr   sympy.core.sympifyr   rn  r   r   r   sympy.polys.polyutilsr   r
   sympy.polys.densebasicr0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   sympy.polys.densearithrQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   sympy.polys.densetoolsrp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   sympy.polys.euclidtoolsr~   r   r   r   r   r   r   r   r   r   sympy.polys.sqfreetoolsr   r   r   r   r   r   r   sympy.polys.factortoolsr   r   r   r   sympy.polys.rootisolationr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r    r   r   <module>r%     sf   7 7 " ! ! ! ! ! * * * * * * O O O O O O O O O O 4 4 4 4 4 4    $   6                                                                     .                                                                 4                                                       ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (. . . . . . . . . . . .$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $       
4 4 4h, h, h, h, h,
k h, h, h,V4 4 4
u, u, u, u, u,
k u, u, u,p* * *
I I I I I
k I I I I Ir   