
    g                        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 Zd Zd  Zd! Zd" Zd# Zd$ Zd% Zd& Zd' Zd9d(Zd) Zd* Zd+ Zd, Zd- Zd. Zd/ Zd0 Zd1 Zd2 Zd3 Zd4 Zd5 Zd6 Zd7 Zd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           S/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/polys/factortools.pydup_trial_divisionru   X   s     F # #	1fa((DAq !a%1	 666777vqk""""       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 # #	1fa++DAq!Q !a%1	 666777vqk""""   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0rR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%LLE519F 00Q0000022I 
%!)V	$	$B	%!)VaZ	(	(B	
va||		BNR"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OAq!!""A66!!AE((AqD "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Aq!QA!QA71a##Q**DAq!QA!QA1a  '!Q"2"2A66A'!Q""Aq))A'!Q""Aq))A1a  '!Q"2"2A66A'!aeWa((!Q//A71a##Q**DAq!QA!QA1a  '!Q"2"2A66A'!Q""Aq))A'!Q""Aq))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Avv1aggb!Q$//2A661adA&&((	A	QAE%((OOA"q!!Abqbz 6 61&sA..155A&&Aa!eff~ 6 61&sA..155q!Q""GAq!q!Aq!Aq!Aq!A1a!e__ H H,Q1aAqAA1a4Aq!aaaF2A2J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6Q;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    rt+          ||          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   )isprimer|            c                 ,    t          | d                   S )Nrh   )r   )xs    rt   <lambda>z#dup_zz_zassenhaus.<locals>.<lambda>p  s    3qt99 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    >>>!1A::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Avvs
%%%%%%	
2BQAq!ACqqQxx  A%a')**++AQUacN1qsQw<'((Aaaj!!""E%U#$$E
A Auqy!!  wr{{ 	a"fkkYYr]]Q##2q!! 	aQ''*	"eu::??c!ffqjjE )!,,---GAtE$qsQw""##$$A4444t444G1a!Q//ASVV}}HHAQQG	
AB
A#Q--1%% 4	 4	A
 Avv # #A!A$r(
AAFAr**  C , ,A1Q4++AAaQ''!!Q''*bE a1AAAa%CAvvC , ,A1Q4++AAaQ'' ( (AqtQ''!R##A A&&F A&&Ff}!!>>>>x>>>!!Q''*!!Q''*q!!!1aLL " FAk A#Q--n aS=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ua  D ++++++yT## 	 	AQ R!Q$Y tt 	 	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 	qzz||BAr1%%AA 	 	 	55	W u	1B	1B	Qww288au (A..wAE>>W!Q0051ArqA1b"  	AaD1q5"b!!  	AaD	!a  A	!a  A:aA&&**A}}VAq\\"" AqMMAvvt1aA}}VAq\\"" AqMMAvv"1a((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1a((!Q//1q1u: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    >>>agk!Q**Aq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31+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3AHHQKKKK	 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88
&
&
&
&
&
&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va||$D!}}tqyyD''t

&
&a"g
&
&
&&& t1A!!Q''A88D>> 	*1Q322 	 	Azz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    Aq!!GD!1Aa||a%AaAvvRx	
aaSy()) 1%% 	!9G$%% 1*1a00#Aq))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cCJJLL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AdddG$$((gEEWEEE]7++++Aq!!GD!1Aa||a%AaAvvRx	
aq!fX~()) "1%% 	"1a&>!QAA$%% +$Q**ya## Aq))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    "uYF  FF&!! 	 	Aq&&EE!QKKF q&& xx{{ ttt 	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-1a
#
#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Aq!!AQ?? *y)))ADAq}}VAq\\"" !r71a==1	AA333333333A Ar1--A}!Qw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!ff*a!e!qA  AqMM1aLLO%A--(( 	C 	CAadAaDLAq&1a1u #!tQU1 1u # Avv!!WQ1a%8%8!Q??1Q4	q66  BAq		  1!Q1%%Aq\\88B<< 	3QBBb!AqD"a%rA"1a++RUrA1b!Q''
		!
		!xx|| "by2CB 0 01

>!RA..///

>!RA..////q"s1vvz*Aq11Ac3;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   
1vv{{1Q""Q""1aA&&1aaAaAaAq!!1q!Q1%%1a  1a  QrUG!AbD'"" 	- 	-AHHQ1Q4++,,,,QC511II 	 	DAq%q!faeRAq!DDDAqHHQKKKHHQKKKKQrUG1II 	 	DAq A&&A A&&AyAq))1a33Aq!$$AMM!Mrv   c           
      t   |sd | D             }t          |          }t          |          D ]w\  }	}
|
st          | ||	z
            }t          t          ||                    D ]<\  }\  }}t	          ||
          }t          t          ||                    ||<   =xnt          |          }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'          |          st-          |                     |          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    Qb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1a##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7q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!qMM!! 	9 	9HAu "1a!eQ22A&s1ayy11 9 9	6Aq"1eQ// Aq!1!11a88!9	9 FFq!Quaf121 	1 	1AHHWQ1a(()))HH[Aq!Q//00001aA&&Eq!Q1a3300000Q0001II 	+ 	+DAqAq!Q**AAQ1a((aeaR[!Q''AqMMq! 	1 	1A!Q 1a##A AE1aA66Aa## 1"1akk!!A$$(&;&;QBB&q!Q1a;;%aLL C CDAq"9Q1a#8#8!QBBAaDD!*3q!99!5!5 / /IAv1"1aA..AaDD1II 3 3DAq#Aq!Q22AA$Q1a00777777A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
            st-          ||                     ||          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   c3q661q5!qAQA(1QRR5//** 6 61!aQAq11	$Q1q5!445555OAq!!!""%&&AuQA1--  1  11aAwwA1!a%y!AEFF)1#C2JJ// 	8 	8JAw2!-Aq!"<"<aQJJB4)AabbE1a!eQ777AaDDaeaR[!Q''AqMMAz!Q**Aq111a##q" 	1 	1A!Q 1a##A AE1aA66AaQ'' 	1"1akk!!A$$(&;&;QUAFF&q!Q1a!eQ??!*3q!99!5!5 8 8IAv1#AyAq1ua'@'@!QJJA+Aq!Q77AaDDAz!Q22Aq99$Q1a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!!GGSD#&&'';;;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   < ('''''tnnG&A,,Aq11EBaA&&A	))A,,A
{66CCC UUB
D8GWa*1aQ1==Aq A&&1FF663Jr1a#$    344O/00M+,,L
g,,
(
(}%% "	  "	 A;;;;;;q;;;AQxxw&&E!HH%%%%21aQ1EEAqq#    %Q**DAqQB}77Avv%' 	  Avvs


NNAr1a+,,,7||.. / <CG g,,
(
(J "FE1  
 
1aAq!$$ F	QU^NAr1aFG*1aQ1aCC1b,Q2q!QBB G G G()) 	Gvq!S1W55555#EG G G	G F  #Aq!,,1==q!Q//00 	!1a  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
1a1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 vrz"1a++GD!Q1!!%Aq))a

1
1?1a00
1
1
111 RxAq!!DAqG!Q!Aq!!1a  $Q1a00aQ**1- $ $1qA3(####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Ar2A$Q++NE7CCCCC7CCCGJJub!!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Ar2A$Q++NE7K * *Q-c266	7"7B330q"EEA%)q.8Ha=))))GJJub!!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FFC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Aq"b!!A$Q2..NE7FFFFFFgFFFGJJub!!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Aq"b!!A$Q2..NE7K * *Q-c1b99	7"7Ar2660q"EEA%)q.8Ha=))))GJJub!!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 qMM6!Q<<rA!QAAvv2vAvvQF8|1qqA1a  GAq!%a//G
7||qQ:a==()***	!&A#G,,  ;FAq))1a((1aaA

 GQ//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AF'''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Aq!!A

1
1?1a00
1
1
111 2v1a  !qA1a##GAq!%aAE22G
7||q#'00 	 	NA{FAqua00A#Aq!Q//GAq!''''Q'''A!Q1%%AGAJJ7Aq11F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    Aq!%  Aq!%//NE7w'' 3 3	6Aq!!QUA..2

99UAE""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        rt-          |          D ]\  }
\  } }t          | ||          |f||
<   |                    ||          }|                    ||          }|rt-          |          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DAqAr""GD!	 5 &q"--ww	 3 '2..ww		 1 (B//ww		 / (B//ww{ 	JAz2..AAJ; 	A'2q11HE1Ar1%%AAA7 	J*1a00NE77Y 
	JaA&&DAq,Q1599NE7&w// 5 5	6Aq'1a00!4

IIeQU++EECbHIII; 	 &w// 8 8	6Aq)!Q33Q7

JJua((EFF5%((E 	 !*7!3!3 ? ?IAv1+Ar22H&q(B77A#Ar:66A"#QGAJFF5"&&1*=*=>>EE"**5"55 2qBFBG,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**NE7 2E7##Q'((71:a=%33GAJqM"#gabbk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        rt)          |          D ]\  }\  } }t          | |||          |f||<    |                    ||          }|                    ||	          }|rt)          |          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"%%%Ar""DAq"1a,,GD!	 9 &q!R00ww	 7 '1b11ww		 5 (Ar22ww		 3 (Ar22ww{ 	JAq*b11AAJ; 	A'1b!44HE1Aq"a((AAA7 	J&q!Q//LFAq*1a33NE7&w// ? ?	6Aq)!VQ::A>

?Y 
	JaA&&DAq,Q1599NE7&w// 5 5	6Aq'1a00!4

IIeQU++EECbHIII; 	 &w// ; ;	6Aq)!Q266:

JJua((EFF5%((E 	 !*7!3!3 ? ?IAv1+Aq"55H&q(Ar::A#Aq"j99A"#QGAJFF5"&&1*=*=>>EE"**5"55(1++&& ; ;1 	a!et#d1f,bf5q=q"55q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--NE7 2E1%%q)**71:a=%A66GAJqM"#gabbk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    
 !Aq))JAw t	W		uqz1Av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5r  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   