Ë
    7^(h¤M  ã                   ó`  — d Z ddlmZmZmZmZmZmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z, ddl-m.Z.m/Z/ d„ Z0d	„ Z1d
„ Z2d„ Z3d„ Z4d„ Z5d„ Z6d„ Z7d„ Z8d„ Z9d„ Z:d„ Z;dd„Z<dd„Z=dd„Z>dd„Z?dd„Z@dd„ZAd„ ZBd„ ZCy)z8Square-free decomposition algorithms and related tools. é    )
Údup_negÚdmp_negÚdup_subÚdmp_subÚdup_mulÚdmp_mulÚdup_quoÚdmp_quoÚdup_mul_groundÚdmp_mul_ground)Ú	dup_stripÚdup_LCÚdmp_ground_LCÚ
dmp_zero_pÚ
dmp_groundÚ
dup_degreeÚ
dmp_degreeÚdmp_degree_inÚdmp_degree_listÚ	dmp_raiseÚ
dmp_injectÚdup_convert)	Údup_diffÚdmp_diffÚdmp_diff_inÚ	dup_shiftÚ	dmp_shiftÚ	dup_monicÚdmp_ground_monicÚdup_primitiveÚdmp_ground_primitive)Údup_inner_gcdÚdmp_inner_gcdÚdup_gcdÚdmp_gcdÚdmp_resultantÚdmp_primitive)Úgf_sqf_listÚgf_sqf_part)ÚMultivariatePolynomialErrorÚDomainErrorc                 óH   — t        d„ |D «       «      }|t        | «      k(  sJ ‚y)z=Sanity check the degrees of a computed factorization in K[x].c              3   ó>   K  — | ]  \  }}|t        |«      z  –— Œ y ­w)N)r   )Ú.0ÚfacÚks      úU/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/polys/sqfreetools.pyú	<genexpr>z%_dup_check_degrees.<locals>.<genexpr>$   s   è ø€ Ò9¡h s¨Aˆa”*˜S“/Õ!Ñ9ùs   ‚N)Úsumr   )ÚfÚresultÚdegs      r1   Ú_dup_check_degreesr7   "   s$   € ä
Ñ9°&Ô9Ó
9€CØ”*˜Q“-ÒÐÑó    c                 óÊ   — dg|dz   z  }|D ]5  \  }}t        ||«      }t        ||«      D ��cg c]  \  }}|||z  z   ‘Œ }}}Œ7 t        |«      t        | |«      k(  sJ ‚yc c}}w )z=Sanity check the degrees of a computed factorization in K[X].r   é   N)r   ÚzipÚtuple)	r4   Úur5   Údegsr/   r0   Údegs_facÚd1Úd2s	            r1   Ú_dmp_check_degreesrB   (   sv   € àˆ3�!�a‘%‰=€DØò ?‰ˆˆQÜ" 3¨Ó*ˆÜ*-¨d°HÓ*=×>¡  B��Q˜‘V“Ð>ˆÒ>ð?ô �‹;œ/¨!¨QÓ/Ò/Ð/Ñ/ùó ?s   ­Ac           
      óL   — | syt        t        | t        | d|«      |«      «       S )a  
    Return ``True`` if ``f`` is a square-free polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_sqf_p(x**2 - 2*x + 1)
    False
    >>> R.dup_sqf_p(x**2 - 1)
    True

    Tr:   )r   r$   r   )r4   ÚKs     r1   Ú	dup_sqf_prE   1   s*   € ñ  Øäœg a¬°!°Q¸Ó):¸AÓ>Ó?Ð?Ð?r8   c                 ó¼   — t        | |«      ryt        |dz   «      D ]>  }t        | d|||«      }t        ||«      rŒt        | |||«      }t	        |||«      dk7  sŒ> y y)a  
    Return ``True`` if ``f`` is a square-free polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_sqf_p(x**2 + 2*x*y + y**2)
    False
    >>> R.dmp_sqf_p(x**2 + y**2)
    True

    Tr:   r   F)r   Úranger   r%   r   )r4   r=   rD   ÚiÚfpÚgcds         r1   Ú	dmp_sqf_prK   G   sp   € ô  �!�QÔØä�1�Q‘3‹Zò 
ˆä˜˜A˜q ! QÓ'ˆä�b˜!ÔØä�a˜˜Q Ó"ˆä˜˜a Ó# qÓ(Ùð
ð r8   c                 ó^  — |j                   st        d«      ‚dt        |j                  j	                  «       dd|j
                  «      }}	 t        | d|d¬«      \  }}t        ||d|j
                  «      }t        ||j
                  «      rnt        | |j                   |«      |dz   }} Œ_|| |fS )ag  
    Find a shift of `f` in `K[x]` that has square-free norm.

    The domain `K` must be an algebraic number field `k(a)` (see :ref:`QQ(a)`).

    Returns `(s,g,r)`, such that `g(x)=f(x-sa)`, `r(x)=\text{Norm}(g(x))` and
    `r` is a square-free polynomial over `k`.

    Examples
    ========

    We first create the algebraic number field `K=k(a)=\mathbb{Q}(\sqrt{3})`
    and rings `K[x]` and `k[x]`:

    >>> from sympy.polys import ring, QQ
    >>> from sympy import sqrt

    >>> K = QQ.algebraic_field(sqrt(3))
    >>> R, x = ring("x", K)
    >>> _, X = ring("x", QQ)

    We can now find a square free norm for a shift of `f`:

    >>> f = x**2 - 1
    >>> s, g, r = R.dup_sqf_norm(f)

    The choice of shift `s` is arbitrary and the particular values returned for
    `g` and `r` are determined by `s`.

    >>> s == 1
    True
    >>> g == x**2 - 2*sqrt(3)*x + 2
    True
    >>> r == X**4 - 8*X**2 + 4
    True

    The invariants are:

    >>> g == f.shift(-s*K.unit)
    True
    >>> g.norm() == r
    True
    >>> r.is_squarefree
    True

    Explanation
    ===========

    This is part of Trager's algorithm for factorizing polynomials over
    algebraic number fields. In particular this function is algorithm
    ``sqfr_norm`` from [Trager76]_.

    See Also
    ========

    dmp_sqf_norm:
        Analogous function for multivariate polynomials over ``k(a)``.
    dmp_norm:
        Computes the norm of `f` directly without any shift.
    dup_ext_factor:
        Function implementing Trager's algorithm that uses this.
    sympy.polys.polytools.sqf_norm:
        High-level interface for using this function.
    úground domain must be algebraicr   r:   T©Úfront)Úis_Algebraicr+   r   ÚmodÚto_listÚdomr   r&   rE   r   Úunit)r4   rD   ÚsÚgÚhÚ_Úrs          r1   Údup_sqf_normrZ   i   s¤   € ðB �>Š>ÜÐ;Ó<Ð<àŒi˜Ÿ™Ÿ™›¨¨A¨q¯u©uÓ5€q€Aà
Ü˜!˜Q ¨Ô.‰ˆˆ1Ü˜!˜Q  1§5¡5Ó)ˆä�Q˜Ÿ™ÔØä˜Q §¡ ¨Ó+¨Q°©UˆqˆAð ð ˆa�ˆ7€Nr8   c           	   #   óÄ  K  — |dz   }dg|z  }|| f–— |j                   }t        | |«      }t        t        |t	        |dz   «      «      «      D ��cg c]  \  }}|dkD  sŒ|‘Œ }	}}|	D ]>  }|j                  «       }
d|
|<   |
D �cg c]  }| |z  ‘Œ
 }}t        | |||«      }|
|f–— Œ@ d}	 |dz  }|g|z  }| |z  g|z  }t        | |||«      }||f–— Œ*c c}}w c c}w ­w)z9Generate a sequence of candidate shifts for dmp_sqf_norm.r:   r   )rT   r   Úsortedr;   rG   Úcopyr   )r4   r=   rD   ÚnÚs0ÚaÚdÚdirH   Úvar_indicesÚs1Ús1iÚa1Úf1ÚjÚsjÚajÚfjs                     r1   Ú_dmp_sqf_norm_shiftsrl   »   s  è ø€ ð 	
ˆA‰€AØ
ˆˆq‰€BØ
ˆaˆ%‚Kð 	
�‰€Aô 	˜˜1Ó€AÜ"(¬¨Q´°a¸±c³
Ó);Ó"<×G™˜˜QÀÀQÃ’1ÐG€KÑGð ò ˆØ�W‰W‹YˆØˆˆ1‰Ø "Ö#˜ˆqˆb�‹fÐ#ˆÐ#Ü�q˜"˜a Ó#ˆØ�"ˆf‹ðð 	
€AØ
Ø	ˆQ‰ˆØˆS�1‰WˆØˆb�‰dˆV�a‰ZˆÜ�q˜"˜a Ó#ˆØ�"ˆfŠð ùó Hùò $ùs%   ‚AC ÁCÁCÁ"!C ÂCÂAC c                 ó†  — |st        | |«      \  }}}|g||fS |j                  st        d«      ‚t        |j                  j                  «       |dz   d|j                  «      }t        | ||«      D ]K  \  }} t        | ||d¬«      \  }}t        |||dz   |j                  «      }t        |||j                  «      sŒK n | fS )a  
    Find a shift of ``f`` in ``K[X]`` that has square-free norm.

    The domain `K` must be an algebraic number field `k(a)` (see :ref:`QQ(a)`).

    Returns `(s,g,r)`, such that `g(x_1,x_2,\cdots)=f(x_1-s_1 a, x_2 - s_2 a,
    \cdots)`, `r(x)=\text{Norm}(g(x))` and `r` is a square-free polynomial over
    `k`.

    Examples
    ========

    We first create the algebraic number field `K=k(a)=\mathbb{Q}(i)` and rings
    `K[x,y]` and `k[x,y]`:

    >>> from sympy.polys import ring, QQ
    >>> from sympy import I

    >>> K = QQ.algebraic_field(I)
    >>> R, x, y = ring("x,y", K)
    >>> _, X, Y = ring("x,y", QQ)

    We can now find a square free norm for a shift of `f`:

    >>> f = x*y + y**2
    >>> s, g, r = R.dmp_sqf_norm(f)

    The choice of shifts ``s`` is arbitrary and the particular values returned
    for ``g`` and ``r`` are determined by ``s``.

    >>> s
    [0, 1]
    >>> g == x*y - I*x + y**2 - 2*I*y - 1
    True
    >>> r == X**2*Y**2 + X**2 + 2*X*Y**3 + 2*X*Y + Y**4 + 2*Y**2 + 1
    True

    The required invariants are:

    >>> g == f.shift_list([-si*K.unit for si in s])
    True
    >>> g.norm() == r
    True
    >>> r.is_squarefree
    True

    Explanation
    ===========

    This is part of Trager's algorithm for factorizing polynomials over
    algebraic number fields. In particular this function is a multivariate
    generalization of algorithm ``sqfr_norm`` from [Trager76]_.

    See Also
    ========

    dup_sqf_norm:
        Analogous function for univariate polynomials over ``k(a)``.
    dmp_norm:
        Computes the norm of `f` directly without any shift.
    dmp_ext_factor:
        Function implementing Trager's algorithm that uses this.
    sympy.polys.polytools.sqf_norm:
        High-level interface for using this function.
    rM   r:   r   TrN   )rZ   rP   r+   r   rQ   rR   rS   rl   r   r&   rK   )r4   r=   rD   rU   rV   rY   rW   rX   s           r1   Údmp_sqf_normrn   ã   sÅ   € ñD Ü˜q !Ó$‰ˆˆ1ˆaØˆs�A�qˆyÐà�>Š>ÜÐ;Ó<Ð<ä�!—%‘%—-‘-“/ 1 q¡5¨!¨Q¯U©UÓ3€Aä$ Q¨¨1Ó-ò ‰ˆˆ1ä˜!˜Q ¨Ô.‰ˆˆ1Ü˜!˜Q  A¡ q§u¡uÓ-ˆä�Q˜˜1Ÿ5™5Õ!Ùðð ˆa�ˆ7€Nr8   c                 óð   — |j                   st        d«      ‚t        |j                  j	                  «       |dz   d|j
                  «      }t        | ||d¬«      \  }}t        |||dz   |j
                  «      S )aE	  
    Norm of ``f`` in ``K[X]``, often not square-free.

    The domain `K` must be an algebraic number field `k(a)` (see :ref:`QQ(a)`).

    Examples
    ========

    We first define the algebraic number field `K = k(a) = \mathbb{Q}(\sqrt{2})`:

    >>> from sympy import QQ, sqrt
    >>> from sympy.polys.sqfreetools import dmp_norm
    >>> k = QQ
    >>> K = k.algebraic_field(sqrt(2))

    We can now compute the norm of a polynomial `p` in `K[x,y]`:

    >>> p = [[K(1)], [K(1),K.unit]]                  # x + y + sqrt(2)
    >>> N = [[k(1)], [k(2),k(0)], [k(1),k(0),k(-2)]] # x**2 + 2*x*y + y**2 - 2
    >>> dmp_norm(p, 1, K) == N
    True

    In higher level functions that is:

    >>> from sympy import expand, roots, minpoly
    >>> from sympy.abc import x, y
    >>> from math import prod
    >>> a = sqrt(2)
    >>> e = (x + y + a)
    >>> e.as_poly([x, y], extension=a).norm()
    Poly(x**2 + 2*x*y + y**2 - 2, x, y, domain='QQ')

    This is equal to the product of the expressions `x + y + a_i` where the
    `a_i` are the conjugates of `a`:

    >>> pa = minpoly(a)
    >>> pa
    _x**2 - 2
    >>> rs = roots(pa, multiple=True)
    >>> rs
    [sqrt(2), -sqrt(2)]
    >>> n = prod(e.subs(a, r) for r in rs)
    >>> n
    (x + y - sqrt(2))*(x + y + sqrt(2))
    >>> expand(n)
    x**2 + 2*x*y + y**2 - 2

    Explanation
    ===========

    Given an algebraic number field `K = k(a)` any element `b` of `K` can be
    represented as polynomial function `b=g(a)` where `g` is in `k[x]`. If the
    minimal polynomial of `a` over `k` is `p_a` then the roots `a_1`, `a_2`,
    `\cdots` of `p_a(x)` are the conjugates of `a`. The norm of `b` is the
    product `g(a1) \times g(a2) \times \cdots` and is an element of `k`.

    As in [Trager76]_ we extend this norm to multivariate polynomials over `K`.
    If `b(x)` is a polynomial in `k(a)[X]` then we can think of `b` as being
    alternately a function `g_X(a)` where `g_X` is an element of `k[X][y]` i.e.
    a polynomial function with coefficients that are elements of `k[X]`. Then
    the norm of `b` is the product `g_X(a1) \times g_X(a2) \times \cdots` and
    will be an element of `k[X]`.

    See Also
    ========

    dmp_sqf_norm:
        Compute a shift of `f` so that the `\text{Norm}(f)` is square-free.
    sympy.polys.polytools.Poly.norm:
        Higher-level function that calls this.
    rM   r:   r   TrN   )rP   r+   r   rQ   rR   rS   r   r&   )r4   r=   rD   rV   rW   rX   s         r1   Údmp_normrp   9  sg   € ðP �>Š>ÜÐ;Ó<Ð<ä�!—%‘%—-‘-“/ 1 q¡5¨!¨Q¯U©UÓ3€AÜ�a˜˜A TÔ*�D€A€qä˜˜A˜q 1™u a§e¡eÓ,Ð,r8   c                 ó    — t        | ||j                  «      } t        | |j                  |j                  «      }t        ||j                  |«      S )z3Compute square-free part of ``f`` in ``GF(p)[x]``. )r   rS   r)   rQ   )r4   rD   rV   s      r1   Údup_gf_sqf_partrr   Š  s=   € ä�A�q˜!Ÿ%™%Ó €AÜ�A�q—u‘u˜aŸe™eÓ$€AÜ�q˜!Ÿ%™% Ó#Ð#r8   c                 ó   — t        d«      ‚)z3Compute square-free part of ``f`` in ``GF(p)[X]``. ú+multivariate polynomials over finite fields©ÚNotImplementedError©r4   r=   rD   s      r1   Údmp_gf_sqf_partrx   ‘  ó   € ä
ÐKÓ
LÐLr8   c                 ó   — |j                   rt        | |«      S | s| S |j                  t        | |«      «      rt	        | |«      } t        | t        | d|«      |«      }t        | ||«      }|j                  rt        ||«      S t        ||«      d   S )a  
    Returns square-free part of a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_sqf_part(x**3 - 3*x - 2)
    x**2 - x - 2

    See Also
    ========

    sympy.polys.polytools.Poly.sqf_part
    r:   )Úis_FiniteFieldrr   Úis_negativer   r   r$   r   r	   Úis_Fieldr   r    )r4   rD   rJ   Úsqfs       r1   Údup_sqf_partr   –  sŠ   € ð$ 	×ÒÜ˜q !Ó$Ð$áØˆà‡}�}”V˜A˜q“\Ô"Ü�A�q‹Mˆä
�!”X˜a  AÓ&¨Ó
*€CÜ
�!�S˜!Ó
€Cà‡z‚zÜ˜˜aÓ Ð ä˜S !Ó$ QÑ'Ð'r8   c                 óŒ  — |st        | |«      S |j                  rt        | ||«      S t        | |«      r| S |j	                  t        | ||«      «      rt        | ||«      } | }t        |dz   «      D ]  }t        |t        | d|||«      ||«      }Œ t        | |||«      }|j                  rt        |||«      S t        |||«      d   S )zç
    Returns square-free part of a polynomial in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> R.dmp_sqf_part(x**3 + 2*x**2*y + x*y**2)
    x**2 + x*y

    r:   )r   r{   rx   r   r|   r   r   rG   r%   r   r
   r}   r   r!   )r4   r=   rD   rJ   rH   r~   s         r1   Údmp_sqf_partr�   º  sÑ   € ñ Ü˜A˜qÓ!Ð!à×ÒÜ˜q ! QÓ'Ð'ä�!�QÔØˆà‡}�}”] 1 a¨Ó+Ô,Ü�A�q˜!Óˆà
€CÜ�1�Q‘3‹Zò =ˆÜ�cœ; q¨!¨Q°°1Ó5°q¸!Ó<‰ð=ä
�!�S˜!˜QÓ
€Cà‡z‚zÜ  Q¨Ó*Ð*ä# C¨¨AÓ.¨qÑ1Ð1r8   c                 ó8  — | }t        | ||j                  «      } t        | |j                  |j                  |¬«      \  }}t	        |«      D ]$  \  }\  } }t        | |j                  |«      |f||<   Œ& t        ||«       |j                  ||j                  «      |fS )z<Compute square-free decomposition of ``f`` in ``GF(p)[x]``. ©Úall)r   rS   r(   rQ   Ú	enumerater7   Úconvert)r4   rD   r„   Úf_origÚcoeffÚfactorsrH   r0   s           r1   Údup_gf_sqf_listrŠ   ß  s’   € à€Fä�A�q˜!Ÿ%™%Ó €Aä   A§E¡E¨1¯5©5°cÔ:�N€Eˆ7ä˜wÓ'ò 3‰	ˆ‰6ˆAˆqÜ! ! Q§U¡U¨AÓ.°Ð2ˆ�Š
ð3ô �v˜wÔ'à�9‰9�U˜AŸE™EÓ" GÐ+Ð+r8   c                 ó   — t        d«      ‚)z<Compute square-free decomposition of ``f`` in ``GF(p)[X]``. rt   ru   )r4   r=   rD   r„   s       r1   Údmp_gf_sqf_listrŒ   ï  ry   r8   c                 óT  — |j                   rt        | ||¬«      S | }|j                  rt        | |«      }t	        | |«      } n9t        | |«      \  }} |j                  t        | |«      «      rt        | |«      } | }t        | «      dk  r|g fS g d}}t        | d|«      }t        | ||«      \  }}	}
	 t        |	d|«      }t        |
||«      }|s|j                  |	|f«       n:t        |	||«      \  }}	}
|st        |«      dkD  r|j                  ||f«       |dz  }Œjt        ||«       ||fS )a÷  
    Return square-free decomposition of a polynomial in ``K[x]``.

    Uses Yun's algorithm from [Yun76]_.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> f = 2*x**5 + 16*x**4 + 50*x**3 + 76*x**2 + 56*x + 16

    >>> R.dup_sqf_list(f)
    (2, [(x + 1, 2), (x + 2, 3)])
    >>> R.dup_sqf_list(f, all=True)
    (2, [(1, 1), (x + 1, 2), (x + 2, 3)])

    See Also
    ========

    dmp_sqf_list:
        Corresponding function for multivariate polynomials.
    sympy.polys.polytools.sqf_list:
        High-level function for square-free factorization of expressions.
    sympy.polys.polytools.Poly.sqf_list:
        Analogous method on :class:`~.Poly`.

    References
    ==========

    [Yun76]_
    rƒ   r   r:   )r{   rŠ   r}   r   r   r    r|   r   r   r   r"   r   Úappendr7   )r4   rD   r„   r‡   rˆ   r5   rH   rW   rV   ÚpÚqra   s               r1   Údup_sqf_listr‘   ô  s?  € ðD 	×ÒÜ˜q !¨Ô-Ð-à€Fà‡z‚zÜ�q˜!“ˆÜ�a˜‹O‰ä   AÓ&‰ˆˆqà�=‰=œ  1›Ô&Ü˜˜1“ˆAØ�FˆEä�!ƒ}˜ÒØ�bˆyÐà�AˆA€Fä��A�qÓ€AÜ˜A˜q !Ó$�G€A€qˆ!à
Ü�Q˜˜1ÓˆÜ�A�q˜!ÓˆáØ�M‰M˜1˜a˜&Ô!Øä  1 aÓ(‰ˆˆ1ˆaá”*˜Q“- !Ò#Ø�M‰M˜1˜a˜&Ô!à	ˆQ‰ˆð ô �v˜vÔ&à�&ˆ=Ðr8   c                 ó¢   — t        | ||¬«      \  }}|r)|d   d   dk(  rt        |d   d   ||«      }|dfg|dd z   S t        |g«      }|dfg|z   S )a�  
    Return square-free decomposition of a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> f = 2*x**5 + 16*x**4 + 50*x**3 + 76*x**2 + 56*x + 16

    >>> R.dup_sqf_list_include(f)
    [(2, 1), (x + 1, 2), (x + 2, 3)]
    >>> R.dup_sqf_list_include(f, all=True)
    [(2, 1), (x + 1, 2), (x + 2, 3)]

    rƒ   r   r:   N)r‘   r   r   )r4   rD   r„   rˆ   r‰   rV   s         r1   Údup_sqf_list_includer“   A  sr   € ô$ " ! Q¨CÔ0�N€Eˆ7á�7˜1‘:˜a‘= AÒ%Ü˜7 1™: a™=¨%°Ó3ˆØ�A�ˆx˜' ! "˜+Ñ%Ð%ä�u�gÓˆØ�A�ˆx˜'Ñ!Ð!r8   c                 óh  — |st        | ||¬«      S |j                  rt        | |||¬«      S | }|j                  rt	        | ||«      }t        | ||«      } n<t        | ||«      \  }} |j                  t	        | ||«      «      rt        | ||«      } | }t        | |«      }|dk  r|g fS t        | ||«      \  }} i }|dk7  rt        | d||«      }	t        | |	||«      \  }
}}d}	 t        |d||«      }t        ||||«      }	t        |	|«      r|||<   n.t        ||	||«      \  }
}}|st        |
|«      dkD  r|
||<   |dz  }Œ\t        ||dz
  ||¬«      \  }}||z  }|D ]&  \  }}|g}||v rt!        ||   |||«      ||<   Œ"|||<   Œ( t#        |«      D �cg c]	  }||   |f‘Œ }}t%        |||«       ||fS c c}w )a1  
    Return square-free decomposition of a polynomial in `K[X]`.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> f = x**5 + 2*x**4*y + x**3*y**2

    >>> R.dmp_sqf_list(f)
    (1, [(x + y, 2), (x, 3)])
    >>> R.dmp_sqf_list(f, all=True)
    (1, [(1, 1), (x + y, 2), (x, 3)])

    Explanation
    ===========

    Uses Yun's algorithm for univariate polynomials from [Yun76]_ recursively.
    The multivariate polynomial is treated as a univariate polynomial in its
    leading variable. Then Yun's algorithm computes the square-free
    factorization of the primitive and the content is factored recursively.

    It would be better to use a dedicated algorithm for multivariate
    polynomials instead.

    See Also
    ========

    dup_sqf_list:
        Corresponding function for univariate polynomials.
    sympy.polys.polytools.sqf_list:
        High-level function for square-free factorization of expressions.
    sympy.polys.polytools.Poly.sqf_list:
        Analogous method on :class:`~.Poly`.
    rƒ   r   r:   )r‘   r{   rŒ   r}   r   r   r!   r|   r   r   r'   r   r#   r   r   Údmp_sqf_listr   r\   rB   )r4   r=   rD   r„   r‡   rˆ   r6   Úcontentr5   rW   rV   r�   r�   rH   ra   Úcoeff_contentÚresult_contentr/   s                     r1   r•   r•   ]  s  € ñL Ü˜A˜q cÔ*Ð*à×ÒÜ˜q ! Q¨CÔ0Ð0à€Fà‡z‚zÜ˜a  AÓ&ˆÜ˜Q  1Ó%‰ä'¨¨1¨aÓ0‰ˆˆqà�=‰=œ q¨!¨QÓ/Ô0Ü˜˜1˜aÓ ˆAØ�FˆEä
�Q˜Ó
€CØ
ˆQ‚wØ�bˆyÐô ˜q ! QÓ'�J€GˆQà€Fà
ˆa‚xä�Q˜˜1˜aÓ ˆÜ  1 a¨Ó+‰ˆˆ1ˆaàˆàÜ˜˜A˜q !Ó$ˆAÜ˜˜1˜a Ó#ˆAä˜!˜QÔØ��q‘	Øä# A q¨!¨QÓ/‰GˆAˆq�!á”j  AÓ&¨Ò*Ø��q‘	à�‰FˆAð ô %1°¸!¸A¹#¸qÀcÔ$JÑ!€M�>à	ˆ]Ñ€Eð !ò ‰ˆˆQØˆeˆØ�‰;Ü  q¡	¨3°°1Ó5ˆF�1ŠIàˆF�1ŠIðô '-¨V£nÖ5 ˆv�a‰y˜!ŠnÐ5€FÐ5ä�v˜q &Ô)à�&ˆ=Ðùò	 6s   ÆF/c                 óÆ   — |st        | ||¬«      S t        | |||¬«      \  }}|r*|d   d   dk(  rt        |d   d   |||«      }|dfg|dd z   S t        ||«      }|dfg|z   S )ah  
    Return square-free decomposition of a polynomial in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    >>> f = x**5 + 2*x**4*y + x**3*y**2

    >>> R.dmp_sqf_list_include(f)
    [(1, 1), (x + y, 2), (x, 3)]
    >>> R.dmp_sqf_list_include(f, all=True)
    [(1, 1), (x + y, 2), (x, 3)]

    rƒ   r   r:   N)r“   r•   r   r   )r4   r=   rD   r„   rˆ   r‰   rV   s          r1   Údmp_sqf_list_includerš   É  sˆ   € ñ$ Ü# A q¨cÔ2Ð2ä! ! Q¨¨sÔ3�N€Eˆ7á�7˜1‘:˜a‘= AÒ%Ü˜7 1™: a™=¨%°°AÓ6ˆØ�A�ˆx˜' ! "˜+Ñ%Ð%ä�u˜aÓ ˆØ�A�ˆx˜'Ñ!Ð!r8   c           
      ól  — | st        d«      ‚t        | |«      } t        | «      sg S t        | t	        | |j
                  |«      |«      }t        ||«      }t        |«      D ]1  \  }\  }}t        |t	        | ||«       |«      |«      }||dz   f||<   Œ3 t        | ||«      } t        | «      s|S | dfg|z   S )zû
    Compute greatest factorial factorization of ``f`` in ``K[x]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x = ring("x", ZZ)

    >>> R.dup_gff_list(x**5 + 2*x**4 - x**3 - 2*x**2)
    [(x, 1), (x + 2, 4)]

    zDgreatest factorial factorization doesn't exist for a zero polynomialr:   )
Ú
ValueErrorr   r   r$   r   ÚoneÚdup_gff_listr…   r   r	   )r4   rD   rV   ÚHrH   rW   r0   s          r1   rž   rž   è  sÆ   € ñ ÜÐ_Ó`Ð`ä�!�Q‹€Aä�aŒ=Øˆ	ä�A”y  A§E¡E¨1Ó-¨qÓ1ˆÜ˜˜AÓˆä" 1›ò 	‰IˆA‰v��1Ü˜œ9 Q©¨1«¨¨qÓ1°1Ó5ˆAØ�q˜1‘u�:ˆAˆaŠDð	ô �A�q˜!Óˆä˜!Œ}ØˆHà˜�F�8˜a‘<Ðr8   c                 ó4   — |st        | |«      S t        | «      ‚)z¯
    Compute greatest factorial factorization of ``f`` in ``K[X]``.

    Examples
    ========

    >>> from sympy.polys import ring, ZZ
    >>> R, x,y = ring("x,y", ZZ)

    )rž   r*   rw   s      r1   Údmp_gff_listr¡     s   € ñ Ü˜A˜qÓ!Ð!ä)¨!Ó,Ð,r8   N)F)DÚ__doc__Úsympy.polys.densearithr   r   r   r   r   r   r	   r
   r   r   Úsympy.polys.densebasicr   r   r   r   r   r   r   r   r   r   r   r   Úsympy.polys.densetoolsr   r   r   r   r   r   r   r    r!   Úsympy.polys.euclidtoolsr"   r#   r$   r%   r&   r'   Úsympy.polys.galoistoolsr(   r)   Úsympy.polys.polyerrorsr*   r+   r7   rB   rE   rK   rZ   rl   rn   rp   rr   rx   r   r�   rŠ   rŒ   r‘   r“   r•   rš   rž   r¡   © r8   r1   ú<module>rª      sÄ   ðÙ >÷$÷ $÷ $÷÷ ÷ ó ÷)÷ )õ )÷
"÷ "÷÷ò
 ò0ò@ò,òDOòd%òPSòlN-òb$òMò
!(òH"2óJ,ó Mó
JóZ"ó8ióX"ò>" óJ-r8   