§
    OŠtj¨  ã                   óú  — d Z ddlmZ ddl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 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) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZT ddlUmVZVmWZWmXZX dd	lYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` dd
lambZb ddlcmdZd ddlemfZfmgZgmhZhmiZi ddljmkZk ddllmmZnmoZpmqZr edk    rddlsmtZt ndZtd„ Zud„ Zvd„ Zwd„ Zxd„ Zyd„ Zzd„ Z{d„ Z|d„ Z}d8d„Z~d„ Zd„ Z€d„ Z�d „ Z‚d!„ Zƒd"„ Z„d#„ Z…d$„ Z†d%„ Z‡d&„ Zˆd'„ Z‰d9d(„ZŠd)„ Z‹d*„ ZŒd+„ Z�d,„ ZŽd-„ Z�d.„ Z�d/„ Z‘d0„ Z’d1„ Z“d2„ Z”d3„ Z•d4„ Z–d5„ Z—d6„ Z˜d7„ Z™dS ):z:Polynomial factorization routines in characteristic zero. é    )ÚGROUND_TYPES)Ú_randint)Úgf_from_int_polyÚgf_to_int_polyÚ	gf_lshiftÚ
gf_add_mulÚgf_mulÚgf_divÚgf_remÚgf_gcdexÚgf_sqf_pÚgf_factor_sqfÚ	gf_factor)Údup_LCÚdmp_LCÚdmp_ground_LCÚdup_TCÚdup_convertÚdmp_convertÚ
dup_degreeÚ
dmp_degreeÚdmp_degree_inÚdmp_degree_listÚdmp_from_dictÚ
dmp_zero_pÚdmp_oneÚdmp_nestÚ	dmp_raiseÚ	dup_stripÚ
dmp_groundÚdup_inflateÚdmp_excludeÚdmp_includeÚ
dmp_injectÚ	dmp_ejectÚdup_terms_gcdÚdmp_terms_gcd)Údup_negÚdmp_negÚdup_addÚdmp_addÚdup_subÚdmp_subÚdup_mulÚdmp_mulÚdup_sqrÚdmp_powÚdup_divÚdmp_divÚdup_quoÚdmp_quoÚ
dmp_expandÚdmp_add_mulÚdup_sub_mulÚdmp_sub_mulÚ
dup_lshiftÚdup_max_normÚdmp_max_normÚdup_l1_normÚdup_mul_groundÚdmp_mul_groundÚdup_quo_groundÚdmp_quo_ground)Údup_clear_denomsÚdmp_clear_denomsÚ	dup_truncÚdmp_ground_truncÚdup_contentÚ	dup_monicÚdmp_ground_monicÚdup_primitiveÚdmp_ground_primitiveÚdmp_eval_tailÚdmp_eval_inÚdmp_diff_eval_inÚ	dup_shiftÚ	dmp_shiftÚ
dup_mirror)Údmp_primitiveÚdup_inner_gcdÚdmp_inner_gcd)Ú	dup_sqf_pÚdup_sqf_normÚdmp_sqf_normÚdup_sqf_partÚdmp_sqf_partÚ_dup_check_degreesÚ_dmp_check_degrees)Ú_sort_factors)Úquery)ÚExtraneousFactorsÚDomainErrorÚCoercionFailedÚEvaluationFailed)Úsubsets)ÚceilÚlogÚlog2Úflint)Ú	fmpz_polyNc                 óÌ   — g }|D ]Q}d}	 t          | ||¦  «        \  }}|s||dz   }} nnŒ |dk    rt          d¦  «        ‚|                     ||f¦  «         ŒRt          |¦  «        S )z¥
    Determine multiplicities of factors for a univariate polynomial
    using trial division.

    An error will be raised if any factor does not divide ``f``.
    r   Té   útrial division failed)r2   ÚRuntimeErrorÚappendr[   )ÚfÚfactorsÚKÚresultÚfactorÚkÚqÚrs           úU/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/polys/factortools.pyÚdup_trial_divisionru   X   s—   € ð €Fàð #ð #ˆØˆð	Ý˜1˜f aÑ(Ô(‰DˆAˆqàð Ø˜!˜a™%�1��àð	ð �Š6ˆ6ÝÐ6Ñ7Ô7Ð7à�Š�v˜q�kÑ"Ô"Ð"Ð"å˜Ñ Ô Ð ó    c                 óê   — g }|D ]`}d}	 t          | |||¦  «        \  }}t          ||¦  «        r||dz   }} nnŒ/|dk    rt          d¦  «        ‚|                     ||f¦  «         Œat	          |¦  «        S )z§
    Determine multiplicities of factors for a multivariate polynomial
    using trial division.

    An error will be raised if any factor does not divide ``f``.
    r   Trh   ri   )r3   r   rj   rk   r[   )	rl   rm   Úurn   ro   rp   rq   rr   rs   s	            rt   Údmp_trial_divisionry   t   s£   € ð €Fàð #ð #ˆØˆð	Ý˜1˜f a¨Ñ+Ô+‰DˆAˆqå˜!˜QÑÔð Ø˜!˜a™%�1��àð	ð �Š6ˆ6ÝÐ6Ñ7Ô7Ð7à�Š�v˜q�kÑ"Ô"Ð"Ð"å˜Ñ Ô Ð rv   c                 ó¾  — ddl m} t          | ¦  «        }t          |dz  ¦  «        }t          |dz  ¦  «        }|                     t          d„ | D ¦   «         ¦  «        ¦  «        } ||dz
  |¦  «        } ||dz
  |dz
  ¦  «        }|                     t          | |¦  «        ¦  «        }	||z  ||	z  z   }
|
t          | |¦  «        z  }
t          |
dz  ¦  «        dz  }
|
S )aÍ  
    The Knuth-Cohen variant of Mignotte bound for
    univariate polynomials in ``K[x]``.

    Examples
    ========

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

    >>> f = x**3 + 14*x**2 + 56*x + 64
    >>> R.dup_zz_mignotte_bound(f)
    152

    By checking ``factor(f)`` we can see that max coeff is 8

    Also consider a case that ``f`` is irreducible for example
    ``f = 2*x**2 + 3*x + 4``. To avoid a bug for these cases, we return the
    bound plus the max coefficient of ``f``

    >>> f = 2*x**2 + 3*x + 4
    >>> R.dup_zz_mignotte_bound(f)
    6

    Lastly, to see the difference between the new and the old Mignotte bound
    consider the irreducible polynomial:

    >>> f = 87*x**7 + 4*x**6 + 80*x**5 + 17*x**4 + 9*x**3 + 12*x**2 + 49*x + 26
    >>> R.dup_zz_mignotte_bound(f)
    744

    The new Mignotte bound is 744 whereas the old one (SymPy 1.5.1) is 1937664.


    References
    ==========

    ..[1] [Abbott13]_

    r   )Úbinomialé   c              3   ó    K  — | ]	}|d z  V — Œ
dS )r|   N© ©Ú.0Úcfs     rt   ú	<genexpr>z(dup_zz_mignotte_bound.<locals>.<genexpr>¿   s&   è è € Ð0Ð0 r˜R ™UÐ0Ð0Ð0Ð0Ð0Ð0rv   rh   )	Ú(sympy.functions.combinatorial.factorialsr{   r   Ú_ceilÚsqrtÚsumÚabsr   r;   )rl   rn   r{   ÚdÚdeltaÚdelta2Ú	eucl_normÚt1Út2ÚlcÚbounds              rt   Údup_zz_mignotte_boundr�   �   s÷   € ðR BÐAÐAÐAÐAÐAÝ�1‰Œ€AÝ�!�a‘%‰LŒL€EÝ�5˜1‘9ÑÔ€Fð —’�Ð0Ð0¨QÐ0Ñ0Ô0Ñ0Ô0Ñ2Ô2€Ið 
ˆ�%˜!‘)˜VÑ	$Ô	$€BØ	ˆ�%˜!‘)˜V a™ZÑ	(Ô	(€Bà	
�Š�v�a˜‰|Œ|Ñ	Ô	€BØ�‰N˜R "™WÑ$€EØ	�\˜!˜QÑÔÑ€EÝ�%˜!‘)ÑÔ˜qÑ €Eà€Lrv   c                 óô   — t          | ||¦  «        }t          t          | ||¦  «        ¦  «        }t          t	          | |¦  «        ¦  «        }|                      ||dz   ¦  «        ¦  «        d|z  z  |z  |z  S )z7Mignotte bound for multivariate polynomials in `K[X]`. rh   r|   )r<   r‡   r   r†   r   r…   )rl   rx   rn   ÚaÚbÚns         rt   Údmp_zz_mignotte_boundr•   Ì   st   € å�Q˜˜1ÑÔ€AÝ�M˜!˜Q Ñ"Ô"Ñ#Ô#€AÝ�O˜A˜qÑ!Ô!Ñ"Ô"€Aà�6Š6�!�!�A˜‘E‘(”(ÑÔ˜A˜q™DÑ  Ñ" 1Ñ$Ð$rv   c                 óØ  — | dz  }t          ||||¦  «        }t          |||¦  «        }t          t          |||¦  «        ||¦  «        \  }	}
t          |	||¦  «        }	t          |
||¦  «        }
t	          t          |||¦  «        t          |	||¦  «        |¦  «        }t          t	          |||¦  «        ||¦  «        }t          t	          ||
|¦  «        ||¦  «        }t	          t          |||¦  «        t          |||¦  «        |¦  «        }t          t          ||j        g|¦  «        ||¦  «        }t          t          |||¦  «        ||¦  «        \  }}t          |||¦  «        }t          |||¦  «        }t	          t          |||¦  «        t          |||¦  «        |¦  «        }t          t          |||¦  «        ||¦  «        }t          t          |||¦  «        ||¦  «        }||||fS )a
  
    One step in Hensel lifting in `Z[x]`.

    Given positive integer `m` and `Z[x]` polynomials `f`, `g`, `h`, `s`
    and `t` such that::

        f = g*h (mod m)
        s*g + t*h = 1 (mod m)

        lc(f) is not a zero divisor (mod m)
        lc(h) = 1

        deg(f) = deg(g) + deg(h)
        deg(s) < deg(h)
        deg(t) < deg(g)

    returns polynomials `G`, `H`, `S` and `T`, such that::

        f = G*H (mod m**2)
        S*G + T*H = 1 (mod m**2)

    References
    ==========

    .. [1] [Gathen99]_

    r|   )r8   rD   r2   r.   r*   r,   Úone)Úmrl   ÚgÚhÚsÚtrn   ÚMÚerr   rs   rx   ÚGÚHr“   Úcrˆ   ÚSÚTs                      rt   Údup_zz_hensel_stepr¤   Õ   sÕ  € ð8 	
ˆ1‰€Aå�A�q˜!˜QÑÔ€AÝ�!�Q˜ÑÔ€Aå•7˜1˜a Ñ#Ô# Q¨Ñ*Ô*�D€A€qå�!�Q˜ÑÔ€AÝ�!�Q˜ÑÔ€Aå•˜˜1˜aÑ Ô ¥'¨!¨Q°Ñ"2Ô"2°AÑ6Ô6€AÝ•'˜!˜Q Ñ"Ô" A qÑ)Ô)€AÝ•'˜!˜Q Ñ"Ô" A qÑ)Ô)€Aå•˜˜1˜aÑ Ô ¥'¨!¨Q°Ñ"2Ô"2°AÑ6Ô6€AÝ•'˜!˜aœe˜W aÑ(Ô(¨!¨QÑ/Ô/€Aå•7˜1˜a Ñ#Ô# Q¨Ñ*Ô*�D€A€qå�!�Q˜ÑÔ€AÝ�!�Q˜ÑÔ€Aå•˜˜1˜aÑ Ô ¥'¨!¨Q°Ñ"2Ô"2°AÑ6Ô6€AÝ•'˜!˜Q Ñ"Ô" A qÑ)Ô)€AÝ•'˜!˜Q Ñ"Ô" A qÑ)Ô)€Aàˆa��Aˆ:Ðrv   c           
      óÀ  — t          |¦  «        }t          ||¦  «        }|dk    rCt          ||                     || |z  ¦  «        d         |¦  «        }t	          || |z  |¦  «        gS | }|dz  }	t          t          t          |¦  «        ¦  «        ¦  «        }
t          |g| ¦  «        }|d|	…         D ]"}t          |t          || ¦  «        | |¦  «        }Œ#t          ||	         | ¦  «        }||	dz   d…         D ]"}t          |t          || ¦  «        | |¦  «        }Œ#t          ||| |¦  «        \  }}}t          || ¦  «        }t          || ¦  «        }t          || ¦  «        }t          || ¦  «        }t          d|
dz   ¦  «        D ]"}t          |||||||¦  «        |dz  c\  }}}}}Œ#t          | ||d|	…         ||¦  «        t          | |||	d…         ||¦  «        z   S )añ  
    Multifactor Hensel lifting in `Z[x]`.

    Given a prime `p`, polynomial `f` over `Z[x]` such that `lc(f)`
    is a unit modulo `p`, monic pair-wise coprime polynomials `f_i`
    over `Z[x]` satisfying::

        f = lc(f) f_1 ... f_r (mod p)

    and a positive integer `l`, returns a list of monic polynomials
    `F_1,\ F_2,\ \dots,\ F_r` satisfying::

       f = lc(f) F_1 ... F_r (mod p**l)

       F_i = f_i (mod p), i = 1..r

    References
    ==========

    .. [1] [Gathen99]_

    rh   r   r|   N)Úlenr   r>   ÚgcdexrD   Úintr„   Ú_log2r   r	   r   r   Úranger¤   Údup_zz_hensel_lift)Úprl   Úf_listÚlrn   rs   rŽ   ÚFr˜   rq   rˆ   r™   Úf_irš   r›   rœ   Ú_s                    rt   r«   r«     s  € õ. 	ˆF‰Œ€AÝ	��1‰Œ€BàˆA‚v€vÝ˜1˜aŸgšg b¨!¨Q©$Ñ/Ô/°Ô2°AÑ6Ô6ˆÝ˜1˜a ™d AÑ&Ô&Ð(Ð(à	€AØ	ˆQ‰€AÝ�E•%˜‘(”(‰OŒOÑÔ€Aå˜"˜˜qÑ!Ô!€Aà�b�q�bŒzð 6ð 6ˆÝ�1Õ& s¨AÑ.Ô.°°1Ñ5Ô5ˆˆå˜ œ AÑ&Ô&€Aà�a˜!‘e�f�fŒ~ð 6ð 6ˆÝ�1Õ& s¨AÑ.Ô.°°1Ñ5Ô5ˆˆå�q˜!˜Q Ñ"Ô"�G€A€qˆ!å�q˜!ÑÔ€AÝ�q˜!ÑÔ€AÝ�q˜!ÑÔ€AÝ�q˜!ÑÔ€Aå�1�a˜!‘e‰_Œ_ð Hð HˆÝ,¨Q°°1°a¸¸A¸qÑAÔAÀ1ÀaÁ4ˆ‰ˆˆAˆq�!�a�aå˜a  F¨2¨A¨2¤J°°1Ñ5Ô5Ý
˜Q  6¨!¨"¨"¤:¨q°!Ñ
4Ô
4ñ5ð 5rv   c                 ó8   — ||dz  k    r||z
  }|sdS | |z  dk    S )Nr|   Tr   r~   )Úfcrr   Úpls      rt   Ú_test_plrµ   G  s3   € Øˆ2�‰7‚{€{Ø�‰FˆØð ØˆtØ�‰6�QŠ;Ðrv   c           
      ót  ‡‡ — t          | ¦  «        }|dk    r| gS ddlm} | d         }t          | |¦  «        }t	          | |¦  «        }t          t          |                      ||dz   ¦  «        ¦  «        d|z  z  |z  |z  ¦  «        ¦  «        }t          |dz   d|z  z  |d|z  dz
  z  z  ¦  «        }t          t          dt          |¦  «        z  ¦  «        ¦  «        }	t          d|	z  t          |	¦  «        z  ¦  «        }
g }t          d|
dz   ¦  «        D ]¤} ||¦  «        r	||z  dk    rŒ|                     |¦  «        }t          | |¦  «        }t          |||¦  «        sŒNt          |||¦  «        d         }|                     ||f¦  «         t#          |¦  «        dk     st#          |¦  «        dk    r nŒ¥t%          |d	„ ¬
¦  «        \  Š }t          t          t          d|z  dz   ‰ ¦  «        ¦  «        ¦  «        }ˆ fd„|D ¦   «         }t'          ‰ | |||¦  «        }t          t#          |¦  «        ¦  «        }t)          |¦  «        }g d}}‰ |z  }d|z  t#          |¦  «        k    �rÇt+          ||¦  «        D �]™Š|dk    r0d}‰D ]}|||         d         z  }Œ||z  }t-          |||¦  «        sŒ8nZ|g}‰D ]}t/          |||         |¦  «        }Œt1          |||¦  «        }t3          ||¦  «        d         }|d         }|r
||z  dk    rŒ“|g}t)          ‰¦  «        Š|‰z
  }|dk    r0|g}‰D ]}t/          |||         |¦  «        }Œt1          |||¦  «        }|D ]}t/          |||         |¦  «        }Œt1          |||¦  «        }t5          ||¦  «        }t5          ||¦  «        }||z  |k    rc|}ˆfd„|D ¦   «         }t3          ||¦  «        d         }t3          ||¦  «        d         } |                     |¦  «         t	          | |¦  «        } n�Œ›|dz  }d|z  t#          |¦  «        k    �°Ç|| gz   S )z4Factor primitive square-free polynomials in `Z[x]`. rh   r   )Úisprimeéÿÿÿÿr|   é   é   é   c                 ó,   — t          | d         ¦  «        S )Nrh   )r¦   )Úxs    rt   ú<lambda>z#dup_zz_zassenhaus.<locals>.<lambda>p  s   € ¥3 q¨¤t¡9¤9€ rv   )Úkeyc                 ó0   •— g | ]}t          |‰¦  «        ‘ŒS r~   )r   )r€   Úffr¬   s     €rt   ú
<listcomp>z%dup_zz_zassenhaus.<locals>.<listcomp>t  s#   ø€ Ð4Ð4Ð4¨�~˜b !Ñ$Ô$Ð4Ð4Ð4rv   c                 ó   •— g | ]}|‰v¯|‘Œ	S r~   r~   )r€   Úir¢   s     €rt   rÂ   z%dup_zz_zassenhaus.<locals>.<listcomp>¨  s   ø€ Ð>Ð>Ð> !°1¸A°:°:˜A°:°:°:rv   )r   Úsympy.ntheoryr·   r;   r   r¨   r‡   r…   r„   r©   Ú_logrª   Úconvertr   r   r   rk   r¦   Úminr«   Úsetra   rµ   r.   rD   rI   r=   )!rl   rn   r”   r·   r³   ÚAr“   ÚBÚCÚgammar�   r’   Úpxr¯   ÚfsqfxÚfsqfr®   Úmodularr™   Úsorted_Tr£   rm   r›   r´   rr   rÄ   rŸ   r    ÚT_SÚG_normÚH_normr¢   r¬   s!                                  @@rt   Údup_zz_zassenhausrÖ   N  s¿  øø€ å�1‰Œ€AàˆA‚v€vØˆsˆ
à%Ð%Ð%Ð%Ð%Ð%à	
ˆ2Œ€BÝ�Q˜ÑÔ€AÝˆq�!‰Œ€AÝ�C�—’�q�q˜˜Q™‘x”xÑ Ô   A¡Ñ% aÑ'¨Ñ)Ñ*Ô*Ñ+Ô+€AÝˆQ�‰U�a˜‘c‰N˜1˜q ™s Q™w™<Ñ'Ñ(Ô(€AÝ•�a�˜a™œ‘jÑ!Ô!Ñ"Ô"€EÝ��%‘�˜U™œÑ#Ñ$Ô$€EØ
€Aõ �A�u˜q‘yÑ!Ô!ð ð ˆØˆw�r‰{Œ{ð 	˜a "™f¨šk˜kØà�YŠY�r‰]Œ]ˆå˜Q Ñ#Ô#ˆå˜˜2˜qÑ!Ô!ð 	ØÝ˜a  QÑ'Ô'¨Ô*ˆØ	�Š�"�e�ÑÔÐÝˆu‰:Œ:˜Š?ˆ?�c !™fœf qšj˜jØˆEð )å�!Ð,Ð,Ð-Ñ-Ô-�G€A€tå�E•$�q˜‘s˜Q‘w Ñ"Ô"Ñ#Ô#Ñ$Ô$€Aà4Ð4Ð4Ð4¨tÐ4Ñ4Ô4€Gå˜1˜a ¨!¨QÑ/Ô/€Aå•S˜‘V”V‰}Œ}€HÝˆH‰Œ€AØ�QˆQ€GØ	
ˆA‰€Bà
ˆA‰#•�Q‘”Š-‰-Ý˜ 1Ñ%Ô%ð 4	ñ 4	ˆAð
 �AŠvˆvØ�Øð #ð #�AØ˜!˜Aœ$˜rœ(™
�A�AØ˜‘F�Ý  A rÑ*Ô*ð Øðð �C�Øð ,ð ,�AÝ  1 Q¤4¨Ñ+Ô+�A�AÝ˜a  QÑ'Ô'�Ý! ! QÑ'Ô'¨Ô*�Ø�b”E�Øð ˜˜a™ 1š˜Øà�ˆAÝ�A‘”ˆAØ�a‘%ˆCà�AŠvˆvØ�C�Øð ,ð ,�AÝ  1 Q¤4¨Ñ+Ô+�A�AÝ˜a  QÑ'Ô'�àð (ð (�Ý˜A˜q œt QÑ'Ô'��å˜!˜R Ñ#Ô#ˆAå   AÑ&Ô&ˆFÝ   AÑ&Ô&ˆFà�f‰} Ò!Ð!Ø�Ø>Ð>Ð>Ð> xÐ>Ñ>Ô>�å! ! QÑ'Ô'¨Ô*�Ý! ! QÑ'Ô'¨Ô*�à—’˜qÑ!Ô!Ð!Ý˜1˜a‘L”L�à�ñ "ð �‰FˆAðk ˆA‰#•�Q‘”Š-‰-ðn �a�S‰=Ðrv   c                 ó  — t          | |¦  «        }t          | |¦  «        }t          | dd…         |¦  «        }|rEddlm}  |t          |¦  «        ¦  «        }|                     ¦   «         D ]}||z  r||dz  z  r dS ŒdS dS )z2Test irreducibility using Eisenstein's criterion. rh   Nr   ©Ú	factorintr|   T)r   r   rF   rÅ   rÙ   r¨   Úkeys)rl   rn   rŽ   ÚtcÚe_fcrÙ   Úe_ffr¬   s           rt   Údup_zz_irreducible_prÞ   ·  s°   € å	��1‰Œ€BÝ	��1‰Œ€Bå�q˜˜˜”u˜aÑ Ô €Dàð Ø+Ð+Ð+Ð+Ð+Ð+Øˆy�˜T™œÑ#Ô#ˆà—’‘”ð 	ð 	ˆAØ�Q‘ð ˜R ! Q¡$™Yð Ø�t�tøðð ð	ð 	rv   Fc                 ó�  — |j         r:	 ||                     ¦   «         }}t          | ||¦  «        } n# t          $ r Y dS w xY w|j        sdS t          | |¦  «        }t          | |¦  «        }|dk    s|dk    r|dk    rdS |s)t          | |¦  «        \  }}||j        k    s	|| dfgk    rdS t          | ¦  «        }g g }
}	t          |dd¦  «        D ]}|	                     d| |         ¦  «         Œt          |dz
  dd¦  «        D ]}|
                     d| |         ¦  «         Œt          t          |	¦  «        |¦  «        }	t          t          |
¦  «        |¦  «        }
t          |	t          |
d|¦  «        |¦  «        }|                     t          ||¦  «        ¦  «        rt#          ||¦  «        }|| k    rdS t%          | |¦  «        }	|                     t          |	|¦  «        ¦  «        rt#          |	|¦  «        }	||	k    rt'          |	|¦  «        rdS t)          ||¦  «        }t          ||¦  «        |k    rt'          ||¦  «        rdS dS )ad  
    Efficiently test if ``f`` is a cyclotomic polynomial.

    Examples
    ========

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

    >>> f = x**16 + x**14 - x**10 + x**8 - x**6 + x**2 + 1
    >>> R.dup_cyclotomic_p(f)
    False

    >>> g = x**16 + x**14 - x**10 - x**8 - x**6 + x**2 + 1
    >>> R.dup_cyclotomic_p(g)
    True

    References
    ==========

    Bradford, Russell J., and James H. Davenport. "Effective tests for
    cyclotomic polynomials." In International Symposium on Symbolic and
    Algebraic Computation, pp. 244-251. Springer, Berlin, Heidelberg, 1988.

    Frh   r¸   éþÿÿÿr   T)Úis_QQÚget_ringr   r_   Úis_ZZr   r   Údup_factor_listr—   r   rª   Úinsertr0   r   r,   r:   Úis_negativer(   rP   Údup_cyclotomic_prW   )rl   rn   ÚirreducibleÚK0rŽ   rÛ   Úcoeffrm   r”   r™   rš   rÄ   r¯   rŸ   s                 rt   rç   rç   Ç  sn  € ð4 	„wð ð	Ø�q—z’z‘|”|�ˆBÝ˜A˜r 1Ñ%Ô%ˆAˆAøÝð 	ð 	ð 	Ø�5�5ð	øøøàŒWð Øˆuå	��1‰Œ€BÝ	��1‰Œ€Bà	ˆQ‚w€w�2˜’8�8  a¢ Øˆuàð Ý(¨¨AÑ.Ô.‰ˆˆwà�A”EŠ>ˆ>˜W¨!¨Q¨¨Ò0Ð0Ø�5å�1‰Œ€AØˆr€q€Aå�1�b˜"ÑÔð ð ˆØ	�Š��A�a”DÑÔÐÐå�1�q‘5˜"˜bÑ!Ô!ð ð ˆØ	�Š��A�a”DÑÔÐÐå•	˜!‘”˜aÑ Ô €AÝ•	˜!‘”˜aÑ Ô €Aå�•:˜a  AÑ&Ô&¨Ñ*Ô*€Aà‡}‚}•V˜A˜q‘\”\Ñ"Ô"ð Ý�A�q‰MŒMˆàˆA‚v€vØˆtå�1�aÑÔ€Aà‡}‚}•V˜A˜q‘\”\Ñ"Ô"ð Ý�A�q‰MŒMˆàˆA‚v€vÕ" 1 aÑ(Ô(€vØˆtå�Q˜ÑÔ€Aåˆq�!�}„}˜ÒÐÕ.¨q°!Ñ4Ô4ÐØˆtàˆ5s   ‰'1 ±
?¾?c                 óä   — ddl m} |j        |j         g} || ¦  «                             ¦   «         D ]<\  }}t	          t          |||¦  «        ||¦  «        }t          |||dz
  z  |¦  «        }Œ=|S )z1Efficiently generate n-th cyclotomic polynomial. r   rØ   rh   )rÅ   rÙ   r—   Úitemsr4   r!   )r”   rn   rÙ   rš   r¬   rq   s         rt   Údup_zz_cyclotomic_polyrí     s‡   € à'Ð'Ð'Ð'Ð'Ð'Ø	
Œ�”�ˆ€Aà�	˜!‘”×"Ò"Ñ$Ô$ð *ð *‰ˆˆ1Ý•K  1 aÑ(Ô(¨!¨QÑ/Ô/ˆÝ˜˜1˜q 1™u™: qÑ)Ô)ˆˆà€Hrv   c                 ó2  ‡‡— ddl m} ‰j        ‰j         gg} || ¦  «                             ¦   «         D ]`\  Š}ˆˆfd„|D ¦   «         }|                     |¦  «         t          d|¦  «        D ]&}ˆˆfd„|D ¦   «         }|                     |¦  «         Œ'Œa|S )Nr   rØ   c           	      óP   •— g | ]"}t          t          |‰‰¦  «        |‰¦  «        ‘Œ#S r~   )r4   r!   )r€   rš   rn   r¬   s     €€rt   rÂ   z-_dup_cyclotomic_decompose.<locals>.<listcomp>,  s1   ø€ Ð>Ð>Ð>°a�g•k ! Q¨Ñ*Ô*¨A¨qÑ1Ô1Ð>Ð>Ð>rv   rh   c                 ó2   •— g | ]}t          |‰‰¦  «        ‘ŒS r~   )r!   )r€   rr   rn   r¬   s     €€rt   rÂ   z-_dup_cyclotomic_decompose.<locals>.<listcomp>0  s%   ø€ Ð3Ð3Ð3¨1•+˜a  AÑ&Ô&Ð3Ð3Ð3rv   )rÅ   rÙ   r—   rì   Úextendrª   )r”   rn   rÙ   r    rq   ÚQrÄ   r¬   s    `     @rt   Ú_dup_cyclotomic_decomposeró   &  sÊ   øø€ Ø'Ð'Ð'Ð'Ð'Ð'à
Œ%�!”%�ˆÐ€Aà�	˜!‘”×"Ò"Ñ$Ô$ð ð ‰ˆˆ1Ø>Ð>Ð>Ð>Ð>¸1Ð>Ñ>Ô>ˆØ	�Š�‰Œˆå�q˜!‘”ð 	ð 	ˆAØ3Ð3Ð3Ð3Ð3°Ð3Ñ3Ô3ˆAØ�HŠH�Q‰KŒKˆKˆKð	ð €Hrv   c                 óœ  — t          | |¦  «        t          | |¦  «        }}t          | ¦  «        dk    rdS |dk    s|dvrdS t          d„ | dd…         D ¦   «         ¦  «        rdS t          | ¦  «        }t	          ||¦  «        }|                     |¦  «        s|S g }t	          d|z  |¦  «        D ]}||vr|                     |¦  «         Œ|S )aø  
    Efficiently factor polynomials `x**n - 1` and `x**n + 1` in `Z[x]`.

    Given a univariate polynomial `f` in `Z[x]` returns a list of factors
    of `f`, provided that `f` is in the form `x**n - 1` or `x**n + 1` for
    `n >= 1`. Otherwise returns None.

    Factorization is performed using cyclotomic decomposition of `f`,
    which makes this method much faster that any other direct factorization
    approach (e.g. Zassenhaus's).

    References
    ==========

    .. [1] [Weisstein09]_

    r   Nrh   )r¸   rh   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S )N)Úboolr   s     rt   r‚   z+dup_zz_cyclotomic_factor.<locals>.<genexpr>P  s(   è è € Ð
&Ð
&˜�4�‰8Œ8Ð
&Ð
&Ð
&Ð
&Ð
&Ð
&rv   r¸   r|   )r   r   r   Úanyró   Úis_onerk   )rl   rn   Úlc_fÚtc_fr”   r¯   r    rš   s           rt   Údup_zz_cyclotomic_factorrû   6  sè   € õ$ ˜˜1‘”�v a¨™|œ|ˆ$€Då�!�}„}˜ÒÐØˆtàˆq‚y€y�D Ð'Ð'Øˆtå
Ð
&Ð
&˜a  " œgÐ
&Ñ
&Ô
&Ñ&Ô&ð Øˆtå�1‰Œ€AÝ! ! QÑ'Ô'€Aà�8Š8�D‰>Œ>ð 	Øˆàˆå*¨1¨Q©3°Ñ2Ô2ð 	ð 	ˆAØ˜ˆzˆzØ—’˜‘”�øàˆrv   c                 ó’  — t          | |¦  «        \  }}t          |¦  «        }t          ||¦  «        dk     r| t          ||¦  «        }}|dk    r|g fS |dk    r||gfS t	          d¦  «        rt          ||¦  «        r||gfS d}t	          d¦  «        rt          ||¦  «        }|€t          ||¦  «        }|t          |d¬¦  «        fS )z:Factor square-free (non-primitive) polynomials in `Z[x]`. r   rh   ÚUSE_IRREDUCIBLE_IN_FACTORNÚUSE_CYCLOTOMIC_FACTORF)Úmultiple)	rI   r   r   r(   r\   rÞ   rû   rÖ   r[   )rl   rn   Úcontr™   r”   rm   s         rt   Údup_zz_factor_sqfr  b  sí   € å˜A˜qÑ!Ô!�G€Dˆ!å�1‰Œ€Aåˆa��|„|�aÒÐØ�%�  A™œˆaˆàˆA‚v€vØ�RˆxˆØ	
ˆaŠˆØ�a�SˆyÐåÐ(Ñ)Ô)ð Ý  1Ñ%Ô%ð 	Ø˜!˜�9Ðà€GåÐ$Ñ%Ô%ð 1Ý*¨1¨aÑ0Ô0ˆà€Ý# A qÑ)Ô)ˆà•˜w°Ð7Ñ7Ô7Ð7Ð7rv   c                 óŒ  — t           dk    rLt          | ddd…         ¦  «        }|                     ¦   «         \  }}d„ |D ¦   «         }|t          |¦  «        fS t	          | |¦  «        \  }}t          |¦  «        }t          ||¦  «        dk     r| t          ||¦  «        }}|dk    r|g fS |dk    r||dfgfS t          d¦  «        rt          ||¦  «        r||dfgfS t          ||¦  «        }d}t          d¦  «        rt          ||¦  «        }|€t          ||¦  «        }t          | ||¦  «        }t          | |¦  «         ||fS )	a  
    Factor (non square-free) polynomials in `Z[x]`.

    Given a univariate polynomial `f` in `Z[x]` computes its complete
    factorization `f_1, ..., f_n` into irreducibles over integers::

                f = content(f) f_1**k_1 ... f_n**k_n

    The factorization is computed by reducing the input polynomial
    into a primitive square-free polynomial and factoring it using
    Zassenhaus algorithm. Trial division is used to recover the
    multiplicities of factors.

    The result is returned as a tuple consisting of::

              (content(f), [(f_1, k_1), ..., (f_n, k_n))

    Examples
    ========

    Consider the polynomial `f = 2*x**4 - 2`::

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

        >>> R.dup_zz_factor(2*x**4 - 2)
        (2, [(x - 1, 1), (x + 1, 1), (x**2 + 1, 1)])

    In result we got the following factorization::

                 f = 2 (x - 1) (x + 1) (x**2 + 1)

    Note that this is a complete factorization over integers,
    however over Gaussian integers we can factor the last term.

    By default, polynomials `x**n - 1` and `x**n + 1` are factored
    using cyclotomic decomposition to speedup computations. To
    disable this behaviour set cyclotomic=False.

    References
    ==========

    .. [1] [Gathen99]_

    re   Nr¸   c                 óR   — g | ]$\  }}|                      ¦   «         d d d…         |f‘Œ%S )Nr¸   )Úcoeffs)r€   ÚfacÚexps      rt   rÂ   z!dup_zz_factor.<locals>.<listcomp>°  s4   € ÐEÐEÐE±°°c�C—J’J‘L”L   2 Ô&¨Ð,ÐEÐEÐErv   r   rh   rý   rþ   )r   rf   rp   r[   rI   r   r   r(   r\   rÞ   rW   rû   rÖ   ru   rY   )rl   rn   Úf_flintr   rm   r™   r”   r    s           rt   Údup_zz_factorr    su  € õ\ �wÒÐÝ˜A˜d˜d ˜dœGÑ$Ô$ˆØŸšÑ(Ô(‰ˆˆgØEÐE¸WÐEÑEÔEˆØ•] 7Ñ+Ô+Ð+Ð+å˜A˜qÑ!Ô!�G€Dˆ!å�1‰Œ€Aåˆa��|„|�aÒÐØ�%�  A™œˆaˆàˆA‚v€vØ�RˆxˆØ	
ˆaŠˆØ�q˜!�f�Xˆ~ÐåÐ(Ñ)Ô)ð "Ý  1Ñ%Ô%ð 	"Ø˜1˜a˜&˜�>Ð!å�Q˜ÑÔ€AØ€AåÐ$Ñ%Ô%ð +Ý$ Q¨Ñ*Ô*ˆà€yÝ˜a Ñ#Ô#ˆå   A qÑ)Ô)€Gå�q˜'Ñ"Ô"Ð"à�ˆ=Ðrv   c                 ó  — ||z  g}| D ]x}t          |¦  «        }t          |¦  «        D ]B}|dk    r!|                     ||¦  «        }||z  }|dk    °!|                     |¦  «        r  dS ŒC|                     |¦  «         Œy|dd…         S )z,Wang/EEZ: Compute a set of valid divisors.  rh   N)r‡   ÚreversedÚgcdrø   rk   )ÚEÚcsÚctrn   ro   rr   rs   s          rt   Údmp_zz_wang_non_divisorsr  Ó  s³   € à�"‰uˆY€Fàð ð ˆÝ�‰FŒFˆå˜&Ñ!Ô!ð 	ð 	ˆAØ�q’&�&Ø—E’E˜!˜Q‘K”K�Ø˜‘F�ð �q’&�&ð �xŠx˜‰{Œ{ð Ø�t�t�tðð 	�Š�aÑÔÐÐà�!�"�"Œ:Ðrv   c                 óÚ  ‡‡‡— t          t          | ‰¦  «        ‰|dz
  ‰¦  «        st          d¦  «        ‚t          | ‰|‰¦  «        }t          |‰¦  «        st          d¦  «        ‚t	          |‰¦  «        \  }}‰                     t          |‰¦  «        ¦  «        r| t          |‰¦  «        }}|dz
  Šˆˆˆfd„|D ¦   «         }	t          |	||‰¦  «        }
|
�|||	fS t          d¦  «        ‚)z2Wang/EEZ: Test evaluation points for suitability. rh   zno luckc                 ó:   •— g | ]\  }}t          |‰‰‰¦  «        ‘ŒS r~   )rK   )r€   rœ   r±   rÊ   rn   Úvs      €€€rt   rÂ   z+dmp_zz_wang_test_points.<locals>.<listcomp>ø  s+   ø€ Ð3Ð3Ð3©¨¨1�-˜˜1˜a Ñ
#Ô
#Ð3Ð3Ð3rv   )	rK   r   r`   rT   rI   ræ   r   r(   r  )rl   r£   r  rÊ   rx   rn   r™   r¡   rš   r  ÚDr  s      ` `     @rt   Údmp_zz_wang_test_pointsr  ç  s  øøø€ å�  1™œ q¨!¨a©%°Ñ3Ô3ð *Ý˜yÑ)Ô)Ð)å�a˜˜A˜qÑ!Ô!€Aå�Q˜‰?Œ?ð *Ý˜yÑ)Ô)Ð)å˜˜AÑÔ�D€A€qà‡}‚}•V˜A˜q‘\”\Ñ"Ô"ð !Øˆr•7˜1˜a‘=”=ˆ1ˆà	ˆA‰€Aà3Ð3Ð3Ð3Ð3Ð3°Ð3Ñ3Ô3€AÝ   A r¨1Ñ-Ô-€Aà€}Ø�!�Qˆwˆå˜yÑ)Ô)Ð)rv   c                 óÆ  — g dgt          |¦  «        z  |dz
  }
}	}|D ]¾}t          |
|¦  «        }t          ||¦  «        |z  }t          t	          t          |¦  «        ¦  «        ¦  «        D ]Z}d||         ||         c}}\  }}||z  s||z  |dz   }}||z  ¯|dk    r(t          |t          |||
|¦  «        |
|¦  «        dc}|	|<   Œ[|                     |¦  «         Œ¿t          |	¦  «        st          ‚g g }}t          ||¦  «        D ]´\  }}t          |||
|¦  «        }t          ||¦  «        }|                     |¦  «        r||z  }n6|                     ||¦  «        }||z  ||z  }}t          |||¦  «        ||z  }}t          |||
|¦  «        }|                     |¦  «         |                     |¦  «         Œµ|                     |¦  «        r| ||fS g g }}t          ||¦  «        D ]O\  }}|                     t          |||
|¦  «        ¦  «         |                     t          ||d|¦  «        ¦  «         ŒPt          | |t          |¦  «        dz
  z  ||¦  «        } | ||fS )z0Wang/EEZ: Compute correct leading coefficients. r   rh   )r¦   r   r   r
  rª   r/   r1   rk   Úallr]   ÚziprK   rø   r  r>   r?   )rl   r£   r  r  r    rÊ   rx   rn   rÌ   ÚJr  rš   r¡   rˆ   rÄ   rq   rž   rœ   r±   ÚCCÚHHrŽ   Úccr™   ÚCCCÚHHHs                             rt   Údmp_zz_wang_lead_coeffsr    s•  € à�1�#•c˜!‘f”f‘*˜a !™eˆ!€q€Aàð ð ˆÝ�A�q‰MŒMˆÝ�1�a‰LŒL˜‰Oˆå�%¥ A¡¤™-œ-Ñ(Ô(ð 	Cð 	CˆAØ˜a œd A a¤DˆLˆAˆq‘&�1�aà˜1‘uð #Ø˜!‘t˜Q ™U�1�ð ˜1‘uð #ð �AŠvˆvÝ! !¥W¨Q°°1°aÑ%8Ô%8¸!¸QÑ?Ô?À���1�Q‘4øà	�Š�‰Œˆˆåˆq‰6Œ6ð  ÝÐà�ˆ€Bå�A�q‘	”	ð ð ‰ˆˆ1Ý˜!˜Q  1Ñ%Ô%ˆÝ�A�q‰\Œ\ˆà�8Š8�B‰<Œ<ð 	3Ø�Q‘ˆBˆBà—’�b˜!‘”ˆAØ�q‘D˜"˜a™%ˆrˆAÝ" 1 a¨Ñ+Ô+¨R°©UˆrˆAå˜1˜b ! QÑ'Ô'ˆà
�	Š	�!‰ŒˆØ
�	Š	�!‰Œˆˆà‡x‚x��|„|ð Ø�"�bˆyÐà�2ˆ€Cå�B˜‘”ð 0ð 0‰ˆˆ1Ø�
Š
•> ! R¨¨AÑ.Ô.Ñ/Ô/Ð/Ø�
Š
•> ! R¨¨AÑ.Ô.Ñ/Ô/Ð/Ð/å�q˜"�s 1™vœv¨™zÑ*¨A¨qÑ1Ô1€Aàˆc�3ˆ;Ðrv   c           
      óþ  — t          | ¦  «        dk    r«| \  }}t          ||¦  «        }t          ||¦  «        }t          ||||¦  «        \  }}	}
t          |||¦  «        }t          |	||¦  «        }	t	          ||||¦  «        \  }}t          |	||||¦  «        }	t          ||¦  «        }t          |	|¦  «        }	||	g}�n>| d         g}
t          | dd…         ¦  «        D ]-}|
                     dt          ||
d         |¦  «        ¦  «         Œ.g dgg}}t          | |
¦  «        D ]O\  }}t          ||g|d         g d|d|¦  «        \  }	}|                     |	¦  «         |                     |¦  «         ŒPg ||d         gz   }}t          || ¦  «        D ]k\  }}t          ||¦  «        }t          ||¦  «        }t          t          |||¦  «        |||¦  «        }t          ||¦  «        }|                     |¦  «         Œl|S )z2Wang/EEZ: Solve univariate Diophantine equations. r|   r¸   rh   r   )r¦   r   r   r   r
   r   r   r
  rå   r.   r  Údmp_zz_diophantinerk   r   )r¯   r˜   r¬   rn   r’   r“   rl   r™   r›   rœ   rŸ   rr   ro   r¢   r£   rs   s                   rt   Údup_zz_diophantiner!  7  s  € å
ˆ1�v„v�‚{€{Ø‰ˆˆ1å˜Q Ñ"Ô"ˆÝ˜Q Ñ"Ô"ˆå˜1˜a  AÑ&Ô&‰ˆˆ1ˆaå�a˜˜AÑÔˆÝ�a˜˜AÑÔˆå�a˜˜A˜qÑ!Ô!‰ˆˆ1å�q˜!˜Q  1Ñ%Ô%ˆå˜1˜aÑ Ô ˆÝ˜1˜aÑ Ô ˆà�Q�ˆ‰àˆrŒUˆGˆå˜!˜A˜b˜Dœ'Ñ"Ô"ð 	-ð 	-ˆAØ�HŠH�Q�  1 Q¤4¨Ñ+Ô+Ñ,Ô,Ð,Ð,à�Q�C�5ˆ1ˆå˜˜1‘I”Ið 	ð 	‰DˆAˆqÝ% q¨! f¨a°¬e°R¸¸A¸qÀ!ÑDÔD‰DˆAˆqØ�HŠH�Q‰KŒKˆKØ�HŠH�Q‰KŒKˆKˆKà˜˜Q˜rœU˜G™�ˆå˜˜1‘I”Ið 	ð 	‰DˆAˆqÝ   AÑ&Ô&ˆAÝ   AÑ&Ô&ˆAå•y  A qÑ)Ô)¨1¨a°Ñ3Ô3ˆAÝ˜q !Ñ$Ô$ˆAà�MŠM˜!ÑÔÐÐà€Mrv   c           
      ót  ‡‡‡‡— |s¤d„ | D ¦   «         }t          |¦  «        }t          |¦  «        D ]w\  }	}
|
sŒt          | ||	z
  ‰‰¦  «        }t          t          ||¦  «        ¦  «        D ]<\  }\  }}t	          ||
‰¦  «        }t          t          ||‰¦  «        ‰‰¦  «        ||<   Œ=Œx�n�t          |¦  «        }t          | ‰‰¦  «        }|d         |dd…         }}g g }}| D ]M}| 	                    t          ||‰‰¦  «        ¦  «         | 	                    t          |||‰‰¦  «        ¦  «         ŒNt          |||‰‰¦  «        }‰dz
  Št          ||||‰‰‰¦  «        }ˆˆfd„|D ¦   «         }t          ||¦  «        D ]\  }}t          |||‰‰¦  «        }Œt          |‰‰‰¦  «        }t          ‰j        | g|‰¦  «        }t#          |‰¦  «        }t%          d|¦  «        D �]E}t'          |‰¦  «        r �n1t)          ||‰‰¦  «        }t+          ||dz   ||‰‰¦  «        }t'          |‰¦  «        söt-          |‰                      ‰|¦  «        dz   ¦  «        ‰‰¦  «        }t          ||||‰‰‰¦  «        }t          |¦  «        D ]*\  }	}t)          t1          |d‰‰¦  «        |‰‰¦  «        ||	<   Œ+t          t          ||¦  «        ¦  «        D ]\  }	\  }}t3          ||‰‰¦  «        ||	<   Œt          ||¦  «        D ]\  }}t          |||‰‰¦  «        }Œt          |‰‰‰¦  «        }�ŒGˆˆˆfd„|D ¦   «         }|S )z4Wang/EEZ: Solve multivariate Diophantine equations. c                 ó   — g | ]}g ‘ŒS r~   r~   )r€   r±   s     rt   rÂ   z&dmp_zz_diophantine.<locals>.<listcomp>j  s   € ÐÐÐ�QˆbÐÐÐrv   r¸   Nrh   c                 ó4   •— g | ]}t          |d ‰‰¦  «        ‘ŒS ©rh   )r   )r€   r›   rn   r  s     €€rt   rÂ   z&dmp_zz_diophantine.<locals>.<listcomp>†  s'   ø€ Ð0Ð0Ð0¨�i˜˜1˜a Ñ#Ô#Ð0Ð0Ð0rv   r   c                 ó4   •— g | ]}t          |‰‰‰¦  «        ‘ŒS r~   )rE   )r€   r›   rn   r¬   rx   s     €€€rt   rÂ   z&dmp_zz_diophantine.<locals>.<listcomp>¦  s(   ø€ Ð7Ð7Ð7¨qÕ˜q ! Q¨Ñ*Ô*Ð7Ð7Ð7rv   )r   Ú	enumerater!  r  r>   rD   r*   r¦   r6   rk   r5   rL   r   r9   rE   r   r—   r   rª   r   r/   rM   rA   Ú	factorialr   r+   )r¯   r¡   rÊ   rˆ   r¬   rx   rn   r¢   r”   rÄ   rê   r£   Újr›   rœ   rž   r’   rË   rŸ   rl   rÌ   r“   r˜   r�   rq   r  s       ```                  @rt   r   r   g  s¸  øøøø€ àð =8ØÐ˜!ÐÑÔˆÝ�q‰MŒMˆå! !™œð 	9ð 	9‰HˆAˆuØð Øå" 1 a¨!¡e¨Q°Ñ2Ô2ˆAå&¥s¨1¨a¡y¤yÑ1Ô1ð 9ð 9‘	�‘6�A�qÝ" 1 e¨QÑ/Ô/�Ý ¥¨¨A¨qÑ!1Ô!1°1°aÑ8Ô8��!‘�ð9ñ	9õ �‰FŒFˆÝ�q˜!˜QÑÔˆà�Œu�a˜˜˜”fˆ1ˆØ�2ˆ1ˆàð 	1ð 	1ˆAØ�HŠH•W˜Q  1 aÑ(Ô(Ñ)Ô)Ð)Ø�HŠH•[  A q¨!¨QÑ/Ô/Ñ0Ô0Ð0Ð0å˜˜1˜a  AÑ&Ô&ˆà�‰Eˆå˜q ! Q¨¨1¨a°Ñ3Ô3ˆØ0Ð0Ð0Ð0Ð0¨QÐ0Ñ0Ô0ˆå˜˜1‘I”Ið 	+ð 	+‰DˆAˆqÝ˜A˜q ! Q¨Ñ*Ô*ˆAˆAå˜Q  1 aÑ(Ô(ˆå�a”e˜a˜R�[ ! QÑ'Ô'ˆÝ�A�q‰MŒMˆå�q˜!‘”ð 	1ñ 	1ˆAÝ˜!˜QÑÔð Ø‘å˜˜1˜a Ñ#Ô#ˆAÝ   A¨¡E¨1¨a°°AÑ6Ô6ˆAå˜a Ñ#Ô#ð 1Ý" 1 a§k¢k°!°!°A±$´$¸±(Ñ&;Ô&;¸QÀÑBÔB�Ý& q¨!¨Q°°1°a¸Ñ;Ô;�å% a™LœLð Cð C‘D�A�qÝ"¥9¨Q°°1°aÑ#8Ô#8¸!¸QÀÑBÔB�A�a‘D�Då!*­3¨q°!©9¬9Ñ!5Ô!5ð /ð /‘I�A‘v˜˜1Ý" 1 a¨¨AÑ.Ô.�A�a‘D�Då  1™IœIð 3ð 3‘D�A�qÝ# A q¨!¨Q°Ñ2Ô2�A�Aå$ Q¨¨1¨aÑ0Ô0�ùà7Ð7Ð7Ð7Ð7Ð7°AÐ7Ñ7Ô7ˆà€Hrv   c                 ó†  — | gt          |¦  «        |dz
  }	}}t          |¦  «        }t          t          |dd…         ¦  «        ¦  «        D ]M\  }
}t	          |d         |||
z
  ||
z
  |¦  «        }|                     dt          |||	|
z
  |¦  «        ¦  «         ŒNt          t          | |¦  «        dd…         ¦  «        }t          t          d|dz   ¦  «        ||¦  «        D �]C\  }}}t          |¦  «        |dz
  }}|d|dz
  …         ||dz
  d…         }}t          t          ||¦  «        ¦  «        D ]Q\  }
\  }}t          t          |||	|¦  «        ||dz
  |¦  «        }|gt          |dd…         d|dz
  |¦  «        z   ||
<   ŒRt          |j        | g||¦  «        }t          ||¦  «        }t!          |t#          |||¦  «        ||¦  «        }t%          |||¦  «        }t          d|¦  «        D �]2}t'          ||¦  «        r �nt)          ||||¦  «        }t+          ||dz   ||||¦  «        }t'          ||dz
  ¦  «        sàt-          ||                      ||¦  «        dz   ¦  «        |dz
  |¦  «        }t1          ||||||dz
  |¦  «        }t          t          ||¦  «        ¦  «        D ]C\  }
\  }}t3          |t          |d|dz
  |¦  «        |||¦  «        }t          ||||¦  «        ||
<   ŒDt!          |t#          |||¦  «        ||¦  «        }t          ||||¦  «        }�Œ4�ŒEt#          |||¦  «        | k    rt4          ‚|S )z-Wang/EEZ: Parallel Hensel lifting algorithm. rh   Nr   r|   )r¦   Úlistr'  r
  rL   rå   rE   Úmaxr   r  rª   rK   r   r   r—   r   r-   r6   r   r   r/   rM   rA   r(  r   r7   r]   )rl   r    ÚLCrÊ   r¬   rx   rn   r¢   r”   r  rÄ   r’   r›   rˆ   r)  rŸ   ÚwÚIr  rš   rŽ   r˜   r�   r¡   Údjrq   rÌ   r£   rœ   s                                rt   Údmp_zz_wang_hensel_liftingr1  «  sd  € àˆc•3�q‘6”6˜1˜q™5ˆ!€q€AåˆQ‰Œ€Aå�( 1 Q R R¤5™/œ/Ñ*Ô*ð 6ð 6‰ˆˆ1Ý˜˜!œ˜a  Q¡¨¨A©¨qÑ1Ô1ˆØ	�Š�Õ$ Q¨¨1¨q©5°!Ñ4Ô4Ñ5Ô5Ð5Ð5å�O˜A˜qÑ!Ô! ! " "Ô%Ñ&Ô&€Aå•u˜Q  A¡‘”¨¨1Ñ-Ô-ð  1ñ  1‰ˆˆ1ˆaÝ�A‰wŒw˜˜A™ˆ1ˆà��!�a‘%�Œy˜!˜A ™E˜F˜Fœ)ˆ1ˆå#¥C¨¨2¡J¤JÑ/Ô/ð 	8ð 	8‰JˆA‰w��2Ý!¥-°°A°q¸!Ñ"<Ô"<¸aÀÀQÁÈÑJÔJˆBØ�4�) A a b b¤E¨1¨a°!©e°QÑ7Ô7Ñ7ˆAˆa‰DˆDå�a”e˜a˜R�[ ! QÑ'Ô'ˆÝ�A�q‰MŒMˆå�A•z ! Q¨Ñ*Ô*¨A¨qÑ1Ô1ˆå˜1˜a Ñ#Ô#ˆå�q˜"‘”ð 	1ñ 	1ˆAÝ˜!˜QÑÔð Ø‘å˜˜1˜a Ñ#Ô#ˆAÝ   A¨¡E¨1¨a°°AÑ6Ô6ˆAå˜a  Q¡Ñ'Ô'ð 	1Ý" 1 a§k¢k°!°!°A±$´$¸±(Ñ&;Ô&;¸QÀ¹UÀAÑFÔF�Ý& q¨!¨Q°°1°a¸!±e¸QÑ?Ô?�å!*­3¨q°!©9¬9Ñ!5Ô!5ð 8ð 8‘I�A‘v˜˜1Ý# A¥y°°A°q¸1±u¸aÑ'@Ô'@À!ÀQÈÑJÔJ�AÝ+¨A¨q°!°QÑ7Ô7�A�a‘D�Då˜A�z¨!¨Q°Ñ2Ô2°A°qÑ9Ô9�Ý$ Q¨¨1¨aÑ0Ô0�ùùå�!�Q˜ÑÔ˜aÒÐÝÐàˆrv   c           
      óÐ  ‡‡‡— ddl m} t          |¦  «        Št          t	          | ‰¦  «        |dz
  ‰¦  «        \  }}t          | |‰¦  «        } ‰ ||¦  «        ¦  «        }	‰€|dk    rdŠndŠt          ¦   «         g ‰j        g|z  df\  }
}}}	 t          | ||||‰¦  «        \  }}}t          |‰¦  «        \  }}t          |¦  «        }|dk    r| gS |||||fg}n# t          $ r Y nw xY wt          d¦  «        }t          d¦  «        }t          d¦  «        }t          |¦  «        |k     �rt          |¦  «        D ]ñ}ˆˆˆfd	„t          |¦  «        D ¦   «         }t          |¦  «        |
vr#|
                     t          |¦  «        ¦  «         nŒT	 t          | ||||‰¦  «        \  }}}n# t          $ r Y Œzw xY wt          |‰¦  «        \  }}t          |¦  «        }|�||k    r||k     rg |}}nŒ´n|}|dk    r| gc S |                     |||||f¦  «         t          |¦  «        |k    r nŒò‰|z  Št          |¦  «        |k     �°d
\  }}}|D ],\  }}}}}t#          |‰¦  «        }|�||k     r|}|}n|}|dz  }Œ-||         \  }}}}}| }	 t%          | ||||||‰¦  «        \  } }}t'          | ||||	|‰¦  «        }nC# t(          $ r6 t          d¦  «        rt+          ||‰‰dz   ¦  «        cY S t)          d¦  «        ‚w xY wg }|D ]`} t-          | |‰¦  «        \  }} ‰                     t1          | |‰¦  «        ¦  «        rt3          | |‰¦  «        } |                     | ¦  «         Œa|S )a`  
    Factor primitive square-free polynomials in `Z[X]`.

    Given a multivariate polynomial `f` in `Z[x_1,...,x_n]`, which is
    primitive and square-free in `x_1`, computes factorization of `f` into
    irreducibles over integers.

    The procedure is based on Wang's Enhanced Extended Zassenhaus
    algorithm. The algorithm works by viewing `f` as a univariate polynomial
    in `Z[x_2,...,x_n][x_1]`, for which an evaluation mapping is computed::

                      x_2 -> a_2, ..., x_n -> a_n

    where `a_i`, for `i = 2, \dots, n`, are carefully chosen integers.  The
    mapping is used to transform `f` into a univariate polynomial in `Z[x_1]`,
    which can be factored efficiently using Zassenhaus algorithm. The last
    step is to lift univariate factors to obtain true multivariate
    factors. For this purpose a parallel Hensel lifting procedure is used.

    The parameter ``seed`` is passed to _randint and can be used to seed randint
    (when an integer) or (for testing purposes) can be a sequence of numbers.

    References
    ==========

    .. [1] [Wang78]_
    .. [2] [Geddes92]_

    r   )Ú	nextprimerh   Nr|   ÚEEZ_NUMBER_OF_CONFIGSÚEEZ_NUMBER_OF_TRIESÚEEZ_MODULUS_STEPc                 ó<   •— g | ]} ‰ ‰‰ ‰¦  «        ¦  «        ‘ŒS r~   r~   )r€   r±   rn   ÚmodÚrandints     €€€rt   rÂ   zdmp_zz_wang.<locals>.<listcomp>"  s1   ø€ Ð;Ð;Ð;¨A�!�!�G�G˜S˜D #Ñ&Ô&Ñ'Ô'Ð;Ð;Ð;rv   )Nr   r   ÚEEZ_RESTART_IF_NEEDEDz3we need to restart algorithm with better parameters)rÅ   r3  r   Údmp_zz_factorr   r•   rÉ   Úzeror  r  r¦   r`   r\   rª   ÚtupleÚaddrk   r;   r  r1  r]   Údmp_zz_wangrJ   ræ   r   r)   ) rl   rx   rn   r8  Úseedr3  r  r£   r“   r¬   ÚhistoryÚconfigsrÊ   rs   r  r›   r  r±   r    Úeez_num_configsÚeez_num_triesÚeez_mod_stepÚrrÚs_normÚs_argrÄ   Ú_s_normÚorig_fr-  rm   ro   r9  s      ``                           @rt   r?  r?  ß  sp  øøø€ ð< (Ð'Ð'Ð'Ð'Ð'å�t‰nŒn€Gå�&  A™,œ,¨¨A©¨qÑ1Ô1�E€Bˆå˜a  AÑ&Ô&€AØ	ˆˆ)ˆ)�A‰,Œ,‰Œ€Aà
€{Ø�Š6ˆ6ØˆCˆCàˆCå ™UœU B¨¬¨°©
°DÐ8Ñ€GˆW�a˜ðÝ*¨1¨a°°Q¸¸1Ñ=Ô=‰ˆˆAˆqå   AÑ&Ô&‰ˆˆ1å�‰FŒFˆà�Š6ˆ6Ø�3ˆJà�r˜1˜a Ð#Ð$ˆˆøÝð ð ð Øˆðøøøõ Ð3Ñ4Ô4€OÝÐ/Ñ0Ô0€MÝÐ+Ñ,Ô,€Lå
ˆg‰,Œ,˜Ò
(Ñ
(Ý�}Ñ%Ô%ð "	 ð "	 ˆAØ;Ð;Ð;Ð;Ð;Ð;µ°q±´Ð;Ñ;Ô;ˆAå�Q‰xŒx˜wÐ&Ð&Ø—’�E !™HœHÑ%Ô%Ð%Ð%àðÝ2°1°a¸¸QÀÀ1ÑEÔE‘��A�q�qøÝ#ð ð ð Ø�ðøøøõ % Q¨Ñ*Ô*‰DˆAˆqå�Q‘”ˆBàˆ}Ø˜’7�7Ø˜A’v�vØ%'¨ ˜˜à ð	 ð �à�AŠvˆvØ�s�
�
�
à�NŠN˜A˜r 1 a¨Ð+Ñ,Ô,Ð,å�7‰|Œ|˜Ò.Ð.Ø�ð /ð �<ÑˆCõG ˆg‰,Œ,˜Ò
(Ñ
(ðJ "Ñ€FˆE�1à ð 
ð 
‰ˆˆ1ˆa��AÝ˜q !Ñ$Ô$ˆàÐØ˜ÒÐØ �Ø�øàˆFà	ˆQ‰ˆˆà˜U”^�N€A€rˆ1ˆa�Ø€FðGÝ*¨1¨a°°Q¸¸1¸aÀÑCÔC‰ˆˆ1ˆbÝ,¨Q°°2°q¸!¸QÀÑBÔBˆˆøÝð Gð Gð GÝÐ(Ñ)Ô)ð 	GÝ˜v q¨!¨S°1©WÑ5Ô5Ð5Ð5Ð5å#ØEñGô Gð Gð	Gøøøð €Fàð ð ˆÝ# A q¨!Ñ,Ô,‰ˆˆ1à�=Š=� q¨!¨QÑ/Ô/Ñ0Ô0ð 	!Ý˜˜1˜aÑ Ô ˆAà�Š�aÑÔÐÐà€Ms=   ÂAC ÃC Ã
C*Ã)C*ÆF+Æ+
F8Æ7F8Ê/J> Ê>.K>Ë.K>c                 óš  — |st          | |¦  «        S t          | |¦  «        r	|j        g fS t          | ||¦  «        \  }}t	          |||¦  «        dk     r| t          |||¦  «        }}t          d„ t          ||¦  «        D ¦   «         ¦  «        r|g fS t          |||¦  «        \  }}g }t          ||¦  «        dk    r4t          |||¦  «        }t          |||¦  «        }t          | |||¦  «        }t          ||dz
  |¦  «        d         D ]\  }}|                     d|g|f¦  «         Œt          | ||¦  «         |t!          |¦  «        fS )aÜ  
    Factor (non square-free) polynomials in `Z[X]`.

    Given a multivariate polynomial `f` in `Z[x]` computes its complete
    factorization `f_1, \dots, f_n` into irreducibles over integers::

                 f = content(f) f_1**k_1 ... f_n**k_n

    The factorization is computed by reducing the input polynomial
    into a primitive square-free polynomial and factoring it using
    Enhanced Extended Zassenhaus (EEZ) algorithm. Trial division
    is used to recover the multiplicities of factors.

    The result is returned as a tuple consisting of::

             (content(f), [(f_1, k_1), ..., (f_n, k_n))

    Consider polynomial `f = 2*(x**2 - y**2)`::

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

        >>> R.dmp_zz_factor(2*x**2 - 2*y**2)
        (2, [(x - y, 1), (x + y, 1)])

    In result we got the following factorization::

                    f = 2 (x - y) (x + y)

    References
    ==========

    .. [1] [Gathen99]_

    r   c              3   ó"   K  — | ]
}|d k    V — ŒdS ©r   Nr~   ©r€   rˆ   s     rt   r‚   z dmp_zz_factor.<locals>.<genexpr>œ  ó&   è è € Ð
1Ð
1�aˆ1�Š6Ð
1Ð
1Ð
1Ð
1Ð
1Ð
1rv   rh   )r  r   r<  rJ   r   r)   r  r   rQ   r   rX   r?  ry   r;  rå   rZ   r[   )	rl   rx   rn   r   r™   rŸ   rm   r    rq   s	            rt   r;  r;  m  s~  € ðH ð #Ý˜Q Ñ"Ô"Ð"å�!�QÑÔð ØŒv�rˆzÐå" 1 a¨Ñ+Ô+�G€Dˆ!å�Q˜˜1ÑÔ Ò!Ð!Ø�%�  A qÑ)Ô)ˆaˆå
Ð
1Ð
1�?¨1¨aÑ0Ô0Ð
1Ñ
1Ô
1Ñ1Ô1ð Ø�Rˆxˆå˜˜A˜qÑ!Ô!�D€A€qà€Gå�!�QÑÔ˜!ÒÐÝ˜˜A˜qÑ!Ô!ˆÝ˜˜1˜aÑ Ô ˆÝ$ Q¨¨1¨aÑ0Ô0ˆå˜a  Q¡¨Ñ*Ô*¨1Ô-ð $ð $‰ˆˆ1Ø�Š�q˜A˜3 ˜(Ñ#Ô#Ð#Ð#å�q˜!˜WÑ%Ô%Ð%à•˜wÑ'Ô'Ð'Ð'rv   c                 óÈ   ‡‡— ‰                      ¦   «         Št          | ‰‰¦  «        } t          | ‰¦  «        \  }}ˆˆfd„|D ¦   «         }‰                     |‰¦  «        }||fS )z>Factor univariate polynomials into irreducibles in `QQ_I[x]`. c                 ó<   •— g | ]\  }}t          |‰‰¦  «        |f‘ŒS r~   )r   )r€   r  rÄ   ré   ÚK1s      €€rt   rÂ   z#dup_qq_i_factor.<locals>.<listcomp>¶  s.   ø€ ÐCÐCÐC±°°a•˜C  RÑ(Ô(¨!Ð,ÐCÐCÐCrv   )Úas_AlgebraicFieldr   rä   rÇ   )rl   ré   rê   rm   rR  s    `  @rt   Údup_qq_i_factorrT  °  st   øø€ ð 
×	Ò	Ñ	Ô	€BÝ�A�r˜2ÑÔ€AÝ$ Q¨Ñ+Ô+�N€Eˆ7ØCÐCÐCÐCÐC¸7ÐCÑCÔC€GØ�JŠJ�u˜bÑ!Ô!€EØ�'ˆ>Ðrv   c                 óx  — |                      ¦   «         }t          | ||¦  «        } t          | |¦  «        \  }}g }|D ]b\  }}t          ||¦  «        \  }}	t          |	||¦  «        }
t	          |
d|¦  «        \  }}|||z  z  ||z  z  }|                     ||f¦  «         Œc|}|                     ||¦  «        }||fS )z>Factor univariate polynomials into irreducibles in `ZZ_I[x]`. r   )Ú	get_fieldr   rT  rB   rJ   rk   rÇ   )rl   ré   rR  rê   rm   Únew_factorsr  rÄ   Ú	fac_denomÚfac_numÚfac_num_ZZ_IÚcontentÚfac_prims                rt   Údup_zz_i_factorr]  »  sÜ   € ð 
�Š‰Œ€BÝ�A�r˜2ÑÔ€AÝ$ Q¨Ñ+Ô+�N€Eˆ7à€KØð *ð *‰ˆˆQå-¨c°2Ñ6Ô6Ñˆ	�7Ý" 7¨B°Ñ3Ô3ˆÝ0°¸qÀ"ÑEÔEÑˆ�à˜ A™Ñ%¨)°q©.Ñ8ˆØ×Ò˜H a˜=Ñ)Ô)Ð)Ð)à€GØ�JŠJ�u˜bÑ!Ô!€EØ�'ˆ>Ðrv   c                 óÐ   ‡‡‡— ‰                      ¦   «         Št          | ‰‰‰¦  «        } t          | ‰‰¦  «        \  }}ˆˆˆfd„|D ¦   «         }‰                     |‰¦  «        }||fS )z@Factor multivariate polynomials into irreducibles in `QQ_I[X]`. c                 ó>   •— g | ]\  }}t          |‰‰‰¦  «        |f‘ŒS r~   )r   )r€   r  rÄ   ré   rR  rx   s      €€€rt   rÂ   z#dmp_qq_i_factor.<locals>.<listcomp>×  s0   ø€ ÐFÐFÐF±F°C¸•˜C  B¨Ñ+Ô+¨QÐ/ÐFÐFÐFrv   )rS  r   Údmp_factor_listrÇ   )rl   rx   ré   rê   rm   rR  s    ``  @rt   Údmp_qq_i_factorra  Ñ  s|   øøø€ ð 
×	Ò	Ñ	Ô	€BÝ�A�q˜"˜bÑ!Ô!€AÝ$ Q¨¨2Ñ.Ô.�N€Eˆ7ØFÐFÐFÐFÐFÐF¸gÐFÑFÔF€GØ�JŠJ�u˜bÑ!Ô!€EØ�'ˆ>Ðrv   c                 ó€  — |                      ¦   «         }t          | |||¦  «        } t          | ||¦  «        \  }}g }|D ]d\  }}t          |||¦  «        \  }	}
t          |
|||¦  «        }t	          |||¦  «        \  }}|||z  z  |	|z  z  }|                     ||f¦  «         Œe|}|                     ||¦  «        }||fS )z@Factor multivariate polynomials into irreducibles in `ZZ_I[X]`. )rV  r   ra  rC   rJ   rk   rÇ   )rl   rx   ré   rR  rê   rm   rW  r  rÄ   rX  rY  rZ  r[  r\  s                 rt   Údmp_zz_i_factorrc  Ü  sä   € ð 
�Š‰Œ€BÝ�A�q˜"˜bÑ!Ô!€AÝ$ Q¨¨2Ñ.Ô.�N€Eˆ7à€KØð *ð *‰ˆˆQå-¨c°1°bÑ9Ô9Ñˆ	�7Ý" 7¨A¨r°2Ñ6Ô6ˆÝ0°¸qÀ"ÑEÔEÑˆ�à˜ A™Ñ%¨)°q©.Ñ8ˆØ×Ò˜H a˜=Ñ)Ô)Ð)Ð)à€GØ�JŠJ�u˜bÑ!Ô!€EØ�'ˆ>Ðrv   c                 óh  — t          | ¦  «        t          | |¦  «        }}t          | |¦  «        } |dk    r|g fS |dk    r|| dfgfS t          | |¦  «        | }} t	          | |¦  «        \  }}}t          ||j        ¦  «        }t          |¦  «        dk    r|| |t          | ¦  «        z  fgfS ||j        z  }	t          |¦  «        D ]I\  }
\  }}t          ||j        |¦  «        }t          |||¦  «        \  }}}t          ||	|¦  «        }|||
<   ŒJt          |||¦  «        }t          ||¦  «         ||fS )aN	  Factor univariate polynomials over algebraic number fields.

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

    Examples
    ========

    First define the algebraic number field `K = \mathbb{Q}(\sqrt{2})`:

    >>> from sympy import QQ, sqrt
    >>> from sympy.polys.factortools import dup_ext_factor
    >>> K = QQ.algebraic_field(sqrt(2))

    We can now factorise the polynomial `x^2 - 2` over `K`:

    >>> p = [K(1), K(0), K(-2)] # x^2 - 2
    >>> p1 = [K(1), -K.unit]    # x - sqrt(2)
    >>> p2 = [K(1), +K.unit]    # x + sqrt(2)
    >>> dup_ext_factor(p, K) == (K.one, [(p1, 1), (p2, 1)])
    True

    Usually this would be done at a higher level:

    >>> from sympy import factor
    >>> from sympy.abc import x
    >>> factor(x**2 - 2, extension=sqrt(2))
    (x - sqrt(2))*(x + sqrt(2))

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

    Uses Trager's algorithm. In particular this function is algorithm
    ``alg_factor`` from [Trager76]_.

    If `f` is a polynomial in `k(a)[x]` then its norm `g(x)` is a polynomial in
    `k[x]`. If `g(x)` is square-free and has irreducible factors `g_1(x)`,
    `g_2(x)`, `\cdots` then the irreducible factors of `f` in `k(a)[x]` are
    given by `f_i(x) = \gcd(f(x), g_i(x))` where the GCD is computed in
    `k(a)[x]`.

    The first step in Trager's algorithm is to find an integer shift `s` so
    that `f(x-sa)` has square-free norm. Then the norm is factorized in `k[x]`
    and the GCD of (shifted) `f` with each factor gives the shifted factors of
    `f`. At the end the shift is undone to recover the unshifted factors of `f`
    in `k(a)[x]`.

    The algorithm reduces the problem of factorization in `k(a)[x]` to
    factorization in `k[x]` with the main additional steps being to compute the
    norm (a resultant calculation in `k[x,y]`) and some polynomial GCDs in
    `k(a)[x]`.

    In practice in SymPy the base field `k` will be the rationals :ref:`QQ` and
    this function factorizes a polynomial with coefficients in an algebraic
    number field  like `\mathbb{Q}(\sqrt{2})`.

    See Also
    ========

    dmp_ext_factor:
        Analogous function for multivariate polynomials over ``k(a)``.
    dup_sqf_norm:
        Subroutine ``sqfr_norm`` also from [Trager76]_.
    sympy.polys.polytools.factor:
        The high-level function that ultimately uses this function as needed.
    r   rh   )r   r   rG   rW   rU   Údup_factor_list_includeÚdomr¦   Úunitr'  r   rR   rN   ru   rY   )rl   rn   r”   rŽ   r¯   r›   r™   rs   rm   r    rÄ   rp   r±   rš   s                 rt   Údup_ext_factorrh  ò  sW  € õD �q‰MŒM�6 ! Q™<œ<€r€Aå�!�Q‰Œ€AàˆA‚v€vØ�2ˆvˆØˆA‚v€vØ�Q˜�F�8ˆ|Ðå˜˜1ÑÔ˜q€q€AÝ˜1˜aÑ Ô �G€A€qˆ!å% a¨¬Ñ/Ô/€Gå
ˆ7�|„|�qÒÐØ�Q˜�: a™=œ=Ñ(Ð)Ð*Ð*Ð*à	ˆ!Œ&‰€Aå# GÑ,Ô,ð ð ‰ˆ‰;ˆF�AÝ˜ ¤ qÑ)Ô)ˆÝ  1 aÑ(Ô(‰ˆˆ1ˆaÝ�a˜˜AÑÔˆØˆ�‰
ˆ
å   G¨QÑ/Ô/€Gå�q˜'Ñ"Ô"Ð"àˆwˆ;Ðrv   c                 óŽ  ‡— |st          | ‰¦  «        S t          | |‰¦  «        }t          | |‰¦  «        } t          d„ t	          | |¦  «        D ¦   «         ¦  «        r|g fS t          | |‰¦  «        | }} t          | |‰¦  «        \  }}}t          ||‰j        ¦  «        }t          |¦  «        dk    r| g}njt          |¦  «        D ]Z\  }	\  }
}t          |
|‰j        ‰¦  «        }t          |||‰¦  «        \  }}}ˆfd„|D ¦   «         }t          |||‰¦  «        }|||	<   Œ[t          |||‰¦  «        }t          |||¦  «         ||fS )a®  Factor multivariate polynomials over algebraic number fields.

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

    Examples
    ========

    First define the algebraic number field `K = \mathbb{Q}(\sqrt{2})`:

    >>> from sympy import QQ, sqrt
    >>> from sympy.polys.factortools import dmp_ext_factor
    >>> K = QQ.algebraic_field(sqrt(2))

    We can now factorise the polynomial `x^2 y^2 - 2` over `K`:

    >>> p = [[K(1),K(0),K(0)], [], [K(-2)]] # x**2*y**2 - 2
    >>> p1 = [[K(1),K(0)], [-K.unit]]       # x*y - sqrt(2)
    >>> p2 = [[K(1),K(0)], [+K.unit]]       # x*y + sqrt(2)
    >>> dmp_ext_factor(p, 1, K) == (K.one, [(p1, 1), (p2, 1)])
    True

    Usually this would be done at a higher level:

    >>> from sympy import factor
    >>> from sympy.abc import x, y
    >>> factor(x**2*y**2 - 2, extension=sqrt(2))
    (x*y - sqrt(2))*(x*y + sqrt(2))

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

    This is Trager's algorithm for multivariate polynomials. In particular this
    function is algorithm ``alg_factor`` from [Trager76]_.

    See :func:`dup_ext_factor` for explanation.

    See Also
    ========

    dup_ext_factor:
        Analogous function for univariate polynomials over ``k(a)``.
    dmp_sqf_norm:
        Multivariate version of subroutine ``sqfr_norm`` also from [Trager76]_.
    sympy.polys.polytools.factor:
        The high-level function that ultimately uses this function as needed.
    c              3   ó"   K  — | ]
}|d k    V — ŒdS rM  r~   rN  s     rt   r‚   z!dmp_ext_factor.<locals>.<genexpr>‰  rO  rv   rh   c                 ó$   •— g | ]}|‰j         z  ‘ŒS r~   )rg  )r€   Úsirn   s     €rt   rÂ   z"dmp_ext_factor.<locals>.<listcomp>—  s   ø€ Ð'Ð'Ð'˜r��A”F‘Ð'Ð'Ð'rv   )rh  r   rH   r  r   rX   rV   Údmp_factor_list_includerf  r¦   r'  r   rS   rO   ry   rZ   )rl   rx   rn   rŽ   r¯   r›   r™   rs   rm   rÄ   rp   r±   rš   r’   ro   s     `            rt   Údmp_ext_factorrn  T  s~  ø€ ð^ ð $Ý˜a Ñ#Ô#Ð#å	�q˜!˜QÑ	Ô	€BÝ˜˜A˜qÑ!Ô!€Aå
Ð
1Ð
1�?¨1¨aÑ0Ô0Ð
1Ñ
1Ô
1Ñ1Ô1ð Ø�2ˆvˆå˜˜1˜aÑ Ô  !€q€AÝ˜1˜a Ñ#Ô#�G€A€qˆ!å% a¨¨A¬EÑ2Ô2€Gå
ˆ7�|„|�qÒÐØ�#ˆˆå'¨Ñ0Ô0ð 	ð 	‰NˆA‰{�˜Ý˜F A q¤u¨aÑ0Ô0ˆAÝ# A q¨!¨QÑ/Ô/‰GˆAˆq�!Ø'Ð'Ð'Ð' QÐ'Ñ'Ô'ˆAÝ˜!˜Q  1Ñ%Ô%ˆAØˆG�A‰JˆJå  7¨A¨qÑ1Ô1€Få�q˜!˜VÑ$Ô$Ð$àˆvˆ:Ðrv   c                 ó
  — t          | ||j        ¦  «        } t          | |j        |j        ¦  «        \  }}t	          |¦  «        D ]#\  }\  } }t          | |j        |¦  «        |f||<   Œ$|                     ||j        ¦  «        |fS )z2Factor univariate polynomials over finite fields. )r   rf  r   r8  r'  rÇ   )rl   rn   rê   rm   rÄ   rq   s         rt   Údup_gf_factorrp  ¢  s†   € å�A�q˜!œ%Ñ Ô €Aå˜q !¤%¨¬Ñ/Ô/�N€Eˆ7å˜wÑ'Ô'ð 3ð 3‰	ˆ‰6ˆAˆqÝ! ! Q¤U¨AÑ.Ô.°Ð2ˆ�‰
ˆ
à�9Š9�U˜AœEÑ"Ô" GÐ+Ð+rv   c                 ó    — t          d¦  «        ‚)z4Factor multivariate polynomials over finite fields. z+multivariate polynomials over finite fields)ÚNotImplementedError)rl   rx   rn   s      rt   Údmp_gf_factorrs  ®  s   € å
ÐKÑ
LÔ
LÐLrv   c                 óÌ  — t          | |¦  «        \  }} t          | |¦  «        \  }} |j        rt          | |¦  «        \  }}�ni|j        rt          | |¦  «        \  }}�nM|j        rt          | |¦  «        \  }}�n1|j        rt          | |¦  «        \  }}�n|j
        s(||                     ¦   «         }}t          | ||¦  «        } nd}|j        r:|                     ¦   «         }t          | ||¦  «        \  }} t          | ||¦  «        } n|}|j        rt#          | |¦  «        \  }}n�|j        rwt'          | d|¦  «        \  } }	t)          | |	|j        ¦  «        \  }}t-          |¦  «        D ]\  }
\  } }t/          | |	|¦  «        |f||
<   Œ|                     ||j        ¦  «        }nt3          d|z  ¦  «        ‚|j        rït-          |¦  «        D ]\  }
\  } }t          | ||¦  «        |f||
<   Œ|                     ||¦  «        }|                     ||¦  «        }|r“t-          |¦  «        D ]k\  }
\  } }t7          | |¦  «        }t9          | ||¦  «        } t          | ||¦  «        } | |f||
<   |                     ||                     ||¦  «        ¦  «        }Œl|                     ||¦  «        }|}|r$|                     d|j         |j!        g|f¦  «         ||z  tE          |¦  «        fS )ú;Factor univariate polynomials into irreducibles in `K[x]`. Nr   ú#factorization not supported over %s)#r&   rI   Úis_FiniteFieldrp  Úis_Algebraicrh  Úis_GaussianRingr]  Úis_GaussianFieldrT  Úis_ExactÚ	get_exactr   Úis_Fieldrâ   rB   rã   r  Úis_Polyr$   r`  rf  r'  r%   rÇ   r^   Úquor;   r@   ÚmulÚpowrå   r—   r<  r[   )rl   ré   r)  r   rê   rm   Ú
K0_inexactrn   Údenomrx   rÄ   rq   Úmax_norms                rt   rä   rä   ³  s)  € å˜˜BÑÔ�D€A€qÝ˜A˜rÑ"Ô"�G€Dˆ!à	Ôð 5 Ý& q¨"Ñ-Ô-‰ˆˆw‰wØ	Œð 3 Ý'¨¨2Ñ.Ô.‰ˆˆw‰wØ	Ô	ð 1 Ý(¨¨BÑ/Ô/‰ˆˆw‰wØ	Ô	ð / Ý(¨¨BÑ/Ô/‰ˆˆw‰wàŒ{ð 	Ø §¢¡¤˜ˆJÝ˜A˜z¨2Ñ.Ô.ˆAˆAàˆJàŒ;ð 	Ø—’‘”ˆAå'¨¨2¨qÑ1Ô1‰HˆE�1Ý˜A˜r 1Ñ%Ô%ˆAˆAàˆAàŒ7ð 	JÝ*¨1¨aÑ0Ô0‰NˆE�7�7ØŒYð 
	JÝ˜a  AÑ&Ô&‰DˆAˆqå,¨Q°°1´5Ñ9Ô9‰NˆE�7å& wÑ/Ô/ð 5ð 5‘	�‘6�A�qÝ'¨¨1¨aÑ0Ô0°!Ð4�˜‘
�
à—I’I˜e Q¤UÑ+Ô+ˆEˆEåÐCÀbÑHÑIÔIÐIàŒ;ð 	 Ý& wÑ/Ô/ð 8ð 8‘	�‘6�A�qÝ)¨!¨Q°Ñ3Ô3°QÐ7�˜‘
�
à—J’J˜u aÑ(Ô(ˆEØ—F’F˜5 %Ñ(Ô(ˆEàð 	 Ý!*¨7Ñ!3Ô!3ð ?ð ?‘I�A‘v˜˜1Ý+¨A¨rÑ2Ô2�HÝ& q¨(°BÑ7Ô7�AÝ# A r¨:Ñ6Ô6�AØ"# Q �G˜A‘JØŸFšF 5¨"¯&ª&°¸1Ñ*=Ô*=Ñ>Ô>�E�Eà"×*Ò*¨5°"Ñ5Ô5�Ø�àð 2Ø�Š�q˜BœF B¤GÐ,¨aÐ0Ñ1Ô1Ð1à�‰:•} WÑ-Ô-Ð-Ð-rv   c                 óÄ   — t          | |¦  «        \  }}|st          |g¦  «        dfgS t          |d         d         ||¦  «        }||d         d         fg|dd…         z   S )ru  rh   r   N)rä   r   r>   )rl   rn   rê   rm   r™   s        rt   re  re  õ  sq   € å$ Q¨Ñ*Ô*�N€Eˆ7àð 2Ý˜E˜7Ñ#Ô# QÐ'Ð(Ð(å˜7 1œ: aœ=¨%°Ñ3Ô3ˆØ�G˜A”J˜q”MÐ"Ð# g¨a¨b¨b¤kÑ1Ð1rv   c           	      ó  — |st          | |¦  «        S t          | ||¦  «        \  }} t          | ||¦  «        \  }} |j        rt	          | ||¦  «        \  }}�n¸|j        rt          | ||¦  «        \  }}�n›|j        rt          | ||¦  «        \  }}�n~|j	        rt          | ||¦  «        \  }}�na|j        s)||                     ¦   «         }}t          | |||¦  «        } nd}|j        r<|                     ¦   «         }t!          | |||¦  «        \  }	} t          | |||¦  «        } n|}|j        rYt%          | ||¦  «        \  }
} }t'          | ||¦  «        \  }}t)          |¦  «        D ]\  }\  } }t+          | |
||¦  «        |f||<   Œ n�|j        rwt/          | ||¦  «        \  } }t1          | ||j        ¦  «        \  }}t)          |¦  «        D ]\  }\  } }t5          | ||¦  «        |f||<   Œ|                     ||j        ¦  «        }nt9          d|z  ¦  «        ‚|j        rót)          |¦  «        D ]\  }\  } }t          | |||¦  «        |f||<   Œ |                     ||¦  «        }|                     ||	¦  «        }|r–t)          |¦  «        D ]n\  }\  } }t=          | ||¦  «        }t?          | |||¦  «        } t          | |||¦  «        } | |f||<   |                      || !                    ||¦  «        ¦  «        }Œo|                     ||¦  «        }|}t)          tE          |¦  «        ¦  «        D ]G\  }}|sŒd||z
  z  dz   d|z  z   |j#        i}| $                    dtK          |||¦  «        |f¦  «         ŒH||z  tM          |¦  «        fS )ú=Factor multivariate polynomials into irreducibles in `K[X]`. Nrv  )r   r%  r   )'rä   r'   rJ   rw  rs  rx  rn  ry  rc  rz  ra  r{  r|  r   r}  râ   rC   rã   r"   r;  r'  r#   r~  r$   r`  rf  r%   rÇ   r^   r  r<   rA   r€  r�  r
  r—   rå   r   r[   )rl   rx   ré   r  r   rê   rm   r‚  rn   rƒ  Úlevelsr  rÄ   rq   r„  r)  Úterms                    rt   r`  r`     s   € àð &Ý˜q "Ñ%Ô%Ð%å˜˜A˜rÑ"Ô"�D€A€qÝ" 1 a¨Ñ,Ô,�G€Dˆ!à	Ôð 9 Ý& q¨!¨RÑ0Ô0‰ˆˆw‰wØ	Œð 7 Ý'¨¨1¨bÑ1Ô1‰ˆˆw‰wØ	Ô	ð 5 Ý(¨¨A¨rÑ2Ô2‰ˆˆw‰wØ	Ô	ð 3 Ý(¨¨A¨rÑ2Ô2‰ˆˆw‰wàŒ{ð 	Ø §¢¡¤˜ˆJÝ˜A˜q *¨bÑ1Ô1ˆAˆAàˆJàŒ;ð 	Ø—’‘”ˆAå'¨¨1¨b°!Ñ4Ô4‰HˆE�1Ý˜A˜q " aÑ(Ô(ˆAˆAàˆAàŒ7ð 	JÝ& q¨!¨QÑ/Ô/‰LˆF�A�qÝ*¨1¨a°Ñ3Ô3‰NˆE�7å& wÑ/Ô/ð ?ð ?‘	�‘6�A�qÝ)¨!¨V°Q¸Ñ:Ô:¸AÐ>�˜‘
�
ð?àŒYð 
	JÝ˜a  AÑ&Ô&‰DˆAˆqå,¨Q°°1´5Ñ9Ô9‰NˆE�7å& wÑ/Ô/ð 5ð 5‘	�‘6�A�qÝ'¨¨1¨aÑ0Ô0°!Ð4�˜‘
�
à—I’I˜e Q¤UÑ+Ô+ˆEˆEåÐCÀbÑHÑIÔIÐIàŒ;ð 	 Ý& wÑ/Ô/ð ;ð ;‘	�‘6�A�qÝ)¨!¨Q°°2Ñ6Ô6¸Ð:�˜‘
�
à—J’J˜u aÑ(Ô(ˆEØ—F’F˜5 %Ñ(Ô(ˆEàð 	 Ý!*¨7Ñ!3Ô!3ð ?ð ?‘I�A‘v˜˜1Ý+¨A¨q°"Ñ5Ô5�HÝ& q¨(°A°rÑ:Ô:�AÝ# A q¨"¨jÑ9Ô9�AØ"# Q �G˜A‘JØŸFšF 5¨"¯&ª&°¸1Ñ*=Ô*=Ñ>Ô>�E�Eà"×*Ò*¨5°"Ñ5Ô5�Ø�å�( 1™+œ+Ñ&Ô&ð ;ð ;‰ˆˆ1Øð 	Øà�a˜!‘e‘˜tÑ# d¨1¡fÑ,¨b¬fÐ5ˆØ�Š�q�=¨¨q°"Ñ5Ô5°qÐ9Ñ:Ô:Ð:Ð:à�‰:•} WÑ-Ô-Ð-Ð-rv   c                 óì   — |st          | |¦  «        S t          | ||¦  «        \  }}|st          ||¦  «        dfgS t          |d         d         |||¦  «        }||d         d         fg|dd…         z   S )r‡  rh   r   N)re  r`  r    r?   )rl   rx   rn   rê   rm   r™   s         rt   rm  rm  M  s�   € àð -Ý& q¨!Ñ,Ô,Ð,å$ Q¨¨1Ñ-Ô-�N€Eˆ7àð 2Ý˜E 1Ñ%Ô% qÐ)Ð*Ð*å˜7 1œ: aœ=¨%°°AÑ6Ô6ˆØ�G˜A”J˜q”MÐ"Ð# g¨a¨b¨b¤kÑ1Ð1rv   c                 ó$   — t          | d|¦  «        S )z_
    Returns ``True`` if a univariate polynomial ``f`` has no factors
    over its domain.
    r   )Údmp_irreducible_p)rl   rn   s     rt   Údup_irreducible_pr�  [  s   € õ
 ˜Q  1Ñ%Ô%Ð%rv   c                 ó~   — t          | ||¦  «        \  }}|sdS t          |¦  «        dk    rdS |d         \  }}|dk    S )za
    Returns ``True`` if a multivariate polynomial ``f`` has no factors
    over its domain.
    Trh   Fr   )r`  r¦   )rl   rx   rn   r±   rm   rq   s         rt   rŒ  rŒ  c  sR   € õ
 !  A qÑ)Ô)�J€A€wàð ØˆtÝ	ˆW‰Œ˜Ò	Ð	Øˆuà�qŒz‰ˆˆ1Ø�AŠvˆrv   )F)NN)šÚ__doc__Úsympy.external.gmpyr   Úsympy.core.randomr   Úsympy.polys.galoistoolsr   r   r   r   r	   r
   r   r   r   r   r   Úsympy.polys.densebasicr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Úsympy.polys.densearithr(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   Úsympy.polys.densetoolsrB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   Úsympy.polys.euclidtoolsrQ   rR   rS   Úsympy.polys.sqfreetoolsrT   rU   rV   rW   rX   rY   rZ   Úsympy.polys.polyutilsr[   Úsympy.polys.polyconfigr\   Úsympy.polys.polyerrorsr]   r^   r_   r`   Úsympy.utilitiesra   Úmathrb   r„   rc   rÆ   rd   r©   re   rf   ru   ry   r�   r•   r¤   r«   rµ   rÖ   rÞ   rç   rí   ró   rû   r  r  r  r  r  r!  r   r1  r?  r;  rT  r]  ra  rc  rh  rn  rp  rs  rä   re  r`  rm  r�  rŒ  r~   rv   rt   ú<module>r�     s:  ðØ @Ð @à ,Ð ,Ð ,Ð ,Ð ,Ð ,à &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð"ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð"$ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð$&ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &ð"ð "ð "ð "ð "ð "ð "ð "ð "ð "ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 0Ð /Ð /Ð /Ð /Ð /Ø (Ð (Ð (Ð (Ð (Ð (ðFð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð $Ð #Ð #Ð #Ð #Ð #à :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ð �7ÒÐØÐÐÐÐÐÐà€Ið!ð !ð !ð8!ð !ð !ð8:ð :ð :ðx%ð %ð %ð6ð 6ð 6ðr75ð 75ð 75ðrð ð ðfð fð fðRð ð ð Pð Pð Pð Pðf	ð 	ð 	ðð ð ð )ð )ð )ðX8ð 8ð 8ð:Qð Qð Qðhð ð ð(*ð *ð *ð43ð 3ð 3ðl-ð -ð -ð`Að Að AðH1ð 1ð 1ðhKð Kð Kð Kð\@(ð @(ð @(ðFð ð ðð ð ð,ð ð ðð ð ð,_ð _ð _ðDKð Kð Kð\	,ð 	,ð 	,ðMð Mð Mð
?.ð ?.ð ?.ðD2ð 2ð 2ðJ.ð J.ð J.ðZ2ð 2ð 2ð&ð &ð &ðð ð ð ð rv   