
    Ed9                        d 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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR ddlSmTZTmUZUmVZV ddlWmXZXmYZYmZZZm[Z[m\Z\ dd	l]m^Z^ dd
l_m`Z` ddlambZbmcZcmdZdmeZe ddlfmgZg ddlhmiZjmkZl d Zmd Znd Zod Zpd Zqd Zrd Zsd Ztd Zud5dZvd Zwd Zxd Zyd Zzd Z{d Z|d Z}d  Z~d! Zd" Zd# Zd6d%Zd& Zd' Zd( Zd) Zd* Zd+ Zd, Zd- Zd. Zd/ Zd0 Zd1 Zd2 Zd3 Zd4 Zd$S )7z:Polynomial factorization routines in characteristic zero.     )_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dmp_compose	dup_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)_sort_factors)query)ExtraneousFactorsDomainErrorCoercionFailedEvaluationFailed)subsets)ceillogc                     g }|D ]<}d}	 t          | ||          \  }}|s||dz   }} nn |                    ||f           =t          |          S )zc
    Determine multiplicities of factors for a univariate polynomial
    using trial division.
    r   T   )r1   appendrX   )ffactorsKresultfactorkqrs           7lib/python3.11/site-packages/sympy/polys/factortools.pydup_trial_divisionrm   O   s    
 F # #	1fa((DAq !a%1	 	vqk""""       c                     g }|D ]K}d}	 t          | |||          \  }}t          ||          r||dz   }} nn/|                    ||f           Lt          |          S )ze
    Determine multiplicities of factors for a multivariate polynomial
    using trial division.
    r   Trb   )r2   r   rc   rX   )	rd   re   urf   rg   rh   ri   rj   rk   s	            rl   dmp_trial_divisionrq   f   s    
 F # #	1fa++DAq!Q !a%1	 	vqk""""   rn   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] [Abbott2013]_

    r   )binomial   c                     g | ]}|d z  S )rt    .0cfs     rl   
<listcomp>z)dup_zz_mignotte_bound.<locals>.<listcomp>   s    000b!e000rn   rb   )	(sympy.functions.combinatorial.factorialsrs   r   _ceilsqrtsumabsr   r:   )rd   rf   rs   ddeltadelta2	eucl_normt1t2lcbounds              rl   dup_zz_mignotte_boundr   }   s    P BAAAAA1A!a%LLE519F 00a0002244I 
%!)V	$	$B	%!)VaZ	(	(B	
va||		BNR"W$E	\!QE%!)q ELrn   c                     t          | ||          }t          t          | ||                    }t          t	          | |                    }|                     ||dz                       d|z  z  |z  |z  S )z7Mignotte bound for multivariate polynomials in `K[X]`. rb   rt   )r;   r   r   r~   r   r}   )rd   rp   rf   abns         rl   dmp_zz_mignotte_boundr      st    Q1AM!Q""##AOAq!!""A66!!AE((AqD "1$$rn   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]_

    rt   )r7   rC   r1   r-   r)   r+   one)mrd   ghstrf   Merj   rk   rp   GHr   cr   STs                      rl   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:rn   c           
         t          |          }t          ||          }|dk    rCt          ||                    || |z            d         |          }t	          || |z  |          gS | }|dz  }	t          t          t          |d                              }
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]_

    rb   r   rt   N)lenr   r=   gcdexrC   intr|   _logr   r   r   r   ranger   dup_zz_hensel_lift)prd   f_listlrf   rk   r   Fr   ri   r   r   f_ir   r   r   _s                    rl   r   r      s	   . 	FA	1BAv )1aggb!Q$//2A661adA&&((	A	QAE$q!**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 5rn   c                 8    ||dz  k    r||z
  }|sdS | |z  dk    S )Nrt   Tr   rv   )fcrj   pls      rl   _test_plr   3  s6    27{ F t6Q;rn   c           
      v    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          |d          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-          |||         |          }t/          |||          }t1          ||          d         }|d         }|r
||z  dk    r|g}t'                    |z
  }|dk    r0|g}D ]}t-          |||         |          }t/          |||          }|D ]}t-          |||         |          }t/          |||          }t3          ||          }t3          ||          }||z  |k    rc|}fd|D             }t1          ||          d         }t1          ||          d         } |                    |           t	          | |          } n|dz  }d|z  t!          |          k    || gz   S )z4Factor primitive square-free polynomials in `Z[x]`. rb   r   )isprimert            c                 ,    t          | d                   S )Nrb   )r   )xs    rl   <lambda>z#dup_zz_zassenhaus.<locals>.<lambda>\  s    3qt99 rn   )keyc                 0    g | ]}t          |          S rv   )r   )rx   ffr   s     rl   rz   z%dup_zz_zassenhaus.<locals>.<listcomp>`  s#    444~b!$$444rn   c                     g | ]}|v|	S rv   rv   )rx   ir   s     rl   rz   z%dup_zz_zassenhaus.<locals>.<listcomp>  s"    >>>!1A:>A>>>rn   )r   sympy.ntheoryr   r:   r   r   r   r}   r|   r   r   convertr   r   r   rc   r   minr   setr^   r   r-   rC   rH   r<   )!rd   rf   r   r   r   Ar   BCgammar   r   pxr   fsqfxfsqfr   modularr   sorted_Tr   re   r   r   rj   r   r   r   T_SG_normH_normr   r   s!                                  @@rl   dup_zz_zassenhausr   :  s   1AAv s
%%%%%%	
2BQAq!ACqqQxx  A%a')**++AQUacN1qsQw<'((AaQ

l##$$E%U#$$E
A Auqy!!  wr{{ 	a"fk 	YYr]]Q##2q!! 	aQ''*	"eu::? 	c!ffqj 	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- 51%% 4	 4	A
 Av  # #A!A$r(
AAFAr**  C , ,A1Q4++AAaQ''!!Q''*bE a1 AAAa%CAv (C , ,A1Q4++AAaQ'' ( (AqtQ''!R##A A&&F A&&Ff}! 
>>>>x>>>!!Q''*!!Q''*q!!!1aLL
 FAk A#Q- 5n aS=rn   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. rb   Nr   	factorintrt   T)r   r   rE   r   r   r   keys)rd   rf   r   tce_fcr   e_ffr   s           rl   dup_zz_irreducible_pr     s    	1B	1Bqua  D ++++++yT## 	 	AQ R!Q$Y tt 	 	rn   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.

    Frb   r   r   T)is_QQget_ringr   r\   is_ZZr   r   dup_factor_listr   r   r   insertr/   r   r+   r9   is_negativer'   rO   dup_cyclotomic_prV   )rd   rf   irreducibleK0r   r   coeffre   r   r   r   r   r   r   s                 rl   r   r     s   4 	w 	qzz||BAr1%%AA 	 	 	55	W u	1B	1B	Qw 28 a u (A..wAE> 	W!Q0 	51ArqA1b"  	AaD1q5"b!!  	AaD	!a  A	!a  A:aA&&**A}}VAq\\"" AqMMAv t1aA}}VAq\\"" AqMMAv "1a(( 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   rb   )r   r   r   itemsr3   r    )r   rf   r   r   r   ri   s         rl   dup_zz_cyclotomic_polyr     s    ''''''	
A	!""$$ * *1K1a((!Q//1q1u:q))Hrn   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 rv   )r3   r    )rx   r   rf   r   s     rl   rz   z-_dup_cyclotomic_decompose.<locals>.<listcomp>  s1    >>>agk!Q**Aq11>>>rn   rb   c                 2    g | ]}t          |          S rv   )r    )rx   rj   rf   r   s     rl   rz   z-_dup_cyclotomic_decompose.<locals>.<listcomp>  s%    3331+aA&&333rn   )r   r   r   r   extendr   )r   rf   r   r   ri   Qr   r   s    `     @rl   _dup_cyclotomic_decomposer     s    ''''''
%!%A	!""$$  1>>>>>1>>>	q! 	 	A33333333AHHQKKKK	 Hrn   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   Nrb   )r   rb   c              3   4   K   | ]}t          |          V  d S )N)boolrw   s     rl   	<genexpr>z+dup_zz_cyclotomic_factor.<locals>.<genexpr><  s(      
&
&488
&
&
&
&
&
&rn   r   rt   )r   r   r   anyr   is_onerc   )rd   rf   lc_ftc_fr   r   r   r   s           rl   dup_zz_cyclotomic_factorr   "  s    $ 1va||$D!}} tqy D' t

&
&a"g
&
&
&&& t1A!!Q''A88D>> 	*1Q322 	 	Az rn   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   rb   USE_IRREDUCIBLE_IN_FACTORNUSE_CYCLOTOMIC_FACTORF)multiple)	rH   r   r   r'   rY   r   r   r   rX   )rd   rf   contr   r   re   s         rl   dup_zz_factor_sqfr   N  s    Aq!!GD!1Aa||a '%AaAv Rx	
a aSy()) 1%% 	!9G$%% 1*1a00 *#Aq))w77777rn   c                    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          | ||          }||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]_

    r   rb   r   Nr   )
rH   r   r   r'   rY   r   rV   r   r   rm   )rd   rf   r   r   r   r   re   s          rl   dup_zz_factorr   k  s   \ Aq!!GD!1Aa||a '%AaAv Rx	
a q!fX~()) "1%% 	"1a&>!QAA$%% +$Q** $a## Aq))G=rn   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.  rb   N)r   reversedgcdr   rc   )Ecsctrf   rg   rj   rk   s          rl   dmp_zz_wang_non_divisorsr    s    "uYF  FF&!! 	 	Aq& EE!QKKF q&  xx{{ ttt 	a!"":rn   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. rb   zno luckc                 :    g | ]\  }}t          |          S rv   )rJ   )rx   r   r   r   rf   vs      rl   rz   z+dmp_zz_wang_test_points.<locals>.<listcomp>  s+    3331-1a
#
#333rn   )	rJ   r   r]   rS   rH   r   r   r'   r  )rd   r   r   r   rp   rf   r   r   r   r   Dr  s      ` `     @rl   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)))rn   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   rb   )r   r   r   r   r   r.   r0   rc   allrZ   ziprJ   r   r   r=   r>   )rd   r   r   r   r   r   rp   rf   r   Jr  r   r   r   r   ri   r   r   r   CCHHr   ccr   CCCHHHs                             rl   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 # Av C!!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;rn   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. rt   r   rb   r   )r   r   r   r   r	   r   r   r   r   r-   r	  dmp_zz_diophantinerc   r
   )r   r   r   rf   r   r   rd   r   r   r   r   rj   rg   r   r   rk   s                   rl   dup_zz_diophantiner    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!Mrn   c           
         |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 ]<}t)          |          r n(t+          ||          }t-          ||dz   ||          }t)          |          st/          |                    |dz                       }t          ||||          }t          |          D ]*\  }	}t+          t3          |d          |          ||	<   +t          t          ||                    D ]\  }	\  }}t5          ||          ||	<   t          ||          D ]\  }}t          |||          }t          |          }>fd|D             }|S )z4Wang/EEZ: Solve multivariate Diophantine equations. c                     g | ]}g S rv   rv   )rx   r   s     rl   rz   z&dmp_zz_diophantine.<locals>.<listcomp>M  s    Qbrn   r   Nrb   c                 4    g | ]}t          |d           S rb   )r   )rx   r   rf   r  s     rl   rz   z&dmp_zz_diophantine.<locals>.<listcomp>i  s'    000i1a##000rn   r   c                 4    g | ]}t          |          S rv   )rD   )rx   r   rf   r   rp   s     rl   rz   z&dmp_zz_diophantine.<locals>.<listcomp>  s(    777qq!Q**777rn   )r   	enumerater  r	  r=   rC   r)   r   r5   rc   r4   rK   r  r8   rD   r   r   r   mapr   r   r.   rL   r@   	factorialr   r*   )r   r   r   r   r   rp   rf   r   r   r   r   r   jr   r   r   r   r   r   rd   r   r   r   r   ri   r  s       ```                  @rl   r  r  J  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uQ{{## 	1 	1A!Q 1a##A AE1aA66Aa## 1"1akk!a%&8&8!Q??&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Hrn   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 ]M\  }}}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 ])}t)          ||          r nt+          ||||          }t-          ||dz   ||||          }t)          ||dz
            st/          ||                    |dz             |dz
  |          }t3          ||||||dz
  |          }t          t          ||                    D ]C\  }
\  }}t5          |t          |d|dz
  |          |||          }t          ||||          ||
<   Dt!          |t#          |||          ||          }t          ||||          }+Ot#          |||          | k    rt6          |S )z-Wang/EEZ: Parallel Hensel lifting algorithm. rb   Nr   rt   )r   listr  r   rK   r   rD   maxr   r	  r   rJ   r   r   r   r   r,   r5   r   r  r   r.   rL   r@   r  r  r6   rZ   )rd   r   LCr   r   rp   rf   r   r   r  r   r   r   r   r  r   wIr
  r   r   r   r   r   djri   r   r   r   s                                rl   dmp_zz_wang_hensel_liftingr$    sj   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##uQ||$$ 	1 	1A!Q 1a##A AE1aA66AaQ'' 	1"1akk!a%&8&8!a%CC&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 rn   Nc           
         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   )	nextprimerb   Nrt   EEZ_NUMBER_OF_CONFIGSEEZ_NUMBER_OF_TRIESEEZ_MODULUS_STEPc                 <    g | ]}                       S rv   rv   )rx   r   rf   modrandints     rl   rz   zdmp_zz_wang.<locals>.<listcomp>  s1    ;;;A!!GGSD#&&'';;;rn   )Nr   r   EEZ_RESTART_IF_NEEDEDz3we need to restart algorithm with better parameters)r   r&  r   dmp_zz_factorr   r   r   zeror  r   r   r]   rY   r   tupleaddrc   r:   r  r$  rZ   dmp_zz_wangrI   r   r   r(   ) rd   rp   rf   r+  seedr&  r   r   r   r   historyconfigsr   rk   r   r   r   r   r   eez_num_configseez_num_trieseez_mod_steprrs_norms_argr   _s_normorig_fr   re   rg   r,  s      ``                           @rl   r2  r2    s   < ('''''tnnG&A,,Aq11EBaA&&A	))A,,A
 6 	CCC UUB
D8GWa*1aQ1==Aq A&&1FF6 	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 7 !Av !%' 	! Av 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                 x   |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          |          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   Nrv   rx   r   s     rl   r   z dmp_zz_factor.<locals>.<genexpr>  &      
1
1a16
1
1
1
1
1
1rn   rb   )r   r   r/  rI   r   r(   r  r   rP   r   rW   r2  rq   r.  r   rX   )	rd   rp   rf   r   r   r   re   r   ri   s	            rl   r.  r.  P  sp   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! 1Aq!!1a  $Q1a00aQ**1- $ $1qA3(####w''''rn   c                                                      t          |           } t          |           \  }}fd|D             }                    |          }||fS )z>Factor univariate polynomials into irreducibles in `QQ_I[x]`. c                 <    g | ]\  }}t          |          |fS rv   )r   )rx   facr   r   K1s      rl   rz   z#dup_qq_i_factor.<locals>.<listcomp>  s.    CCCaCR((!,CCCrn   )as_AlgebraicFieldr   r   r   )rd   r   r   re   rF  s    `  @rl   dup_qq_i_factorrH    st     
				BAr2A$Q++NE7CCCCC7CCCGJJub!!E'>rn   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   rH  rA   rI   rc   r   )rd   r   rF  r   re   new_factorsrE  r   	fac_denomfac_numfac_num_ZZ_Icontentfac_prims                rl   dup_zz_i_factorrQ    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'>rn   c                                                      t          |           } t          |           \  }}fd|D             }                    |          }||fS )z@Factor multivariate polynomials into irreducibles in `QQ_I[X]`. c                 >    g | ]\  }}t          |          |fS rv   )r   )rx   rE  r   r   rF  rp   s      rl   rz   z#dmp_qq_i_factor.<locals>.<listcomp>  s0    FFFFCCB++Q/FFFrn   )rG  r   dmp_factor_listr   )rd   rp   r   r   re   rF  s    ``  @rl   dmp_qq_i_factorrU    s|     
				BAq"b!!A$Q2..NE7FFFFFFgFFFGJJub!!E'>rn   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]`. )rJ  r   rU  rB   rI   rc   r   )rd   rp   r   rF  r   re   rK  rE  r   rL  rM  rN  rO  rP  s                 rl   dmp_zz_i_factorrW    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'>rn   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          |||          }||fS )z<Factor univariate polynomials over algebraic number fields. r   rb   )r   r   rF   rV   rT   dup_factor_list_includedomr   unitr  r   rQ   rN   rm   )rd   rf   r   r   r   r   r   rk   re   r   r   rh   r   r   s                 rl   dup_ext_factorr\    sL   qMM6!Q<<rA!QAAv 2vAv QF8|1qqA1a  GAq!%a//G
7||q +Q:a==()***	!&A#G,,  ;FAq))1a((1aaA

 GQ//Gw;rn   c                    |st          | |          S t          | ||          }t          | ||          } t          d t	          | |          D                       r|g fS t          | ||          | }} t          | ||          \  }}}t          |||j                  }t          |          dk    r| g}n}t          |j        ||j        z  g|d|          }	t          |          D ]L\  }
\  }}t          |||j        |          }t          ||||          \  }}}t!          ||	||          }|||
<   M|t#          ||||          fS )z>Factor multivariate polynomials over algebraic number fields. c              3   "   K   | ]
}|d k    V  dS r@  rv   rA  s     rl   r   z!dmp_ext_factor.<locals>.<genexpr>  rB  rn   rb   r   )r\  r   rG   r  r   rW   rU   dmp_factor_list_includerZ  r   r   r   r[  r  r   rR   rM   rq   )rd   rp   rf   r   r   r   r   rk   re   r   r   rh   r   r   s                 rl   dmp_ext_factorr`    sn    $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 	#quah'Aq11'00 	 	NA{FAqua00A#Aq!Q//GAq!Aq!Q''AGAJJ!!Wa3333rn   c                 
   t          | ||j                  } t          | |j        |j                  \  }}t	          |          D ]#\  }\  } }t          | |j        |          |f||<   $|                    ||j                  |fS )z2Factor univariate polynomials over finite fields. )r   rZ  r   r+  r  r   )rd   rf   r   re   r   ri   s         rl   dup_gf_factorrb    s    Aq!%  Aq!%//NE7w'' 3 3	6Aq!!QUA..2

99UAE""G++rn   c                      t          d          )z4Factor multivariate polynomials over finite fields. z+multivariate polynomials over finite fields)NotImplementedError)rd   rp   rf   s      rl   dmp_gf_factorre    s    
K
L
LLrn   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%   rH   is_FiniteFieldrb  is_Algebraicr\  is_GaussianRingrQ  is_GaussianFieldrH  is_Exact	get_exactr   is_Fieldr   rA   r   r   is_Polyr#   rT  rZ  r  r$   r   r[   quor:   r?   mulpowr   r   r/  rX   )rd   r   r  r   r   re   
K0_inexactrf   denomrp   r   ri   max_norms                rl   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----rn   c                     t          | |          \  }}|st          |g          dfgS t          |d         d         ||          }||d         d         fg|dd         z   S )rg  rb   r   N)r   r   r=   )rd   rf   r   re   r   s        rl   rY  rY  c  sq    $Q**NE7 2E7##Q'((71:a=%33GAJqM"#gabbk11rn   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]`. Nrh  )r   r  r   )'r   r&   rI   ri  re  rj  r`  rk  rW  rl  rU  rm  rn  r   ro  r   rB   r   r!   r.  r  r"   rp  r#   rT  rZ  r$   r   r[   rq  r;   r@   rr  rs  r   r   r   r   rX   )rd   rp   r   r
  r   r   re   rt  rf   ru  levelsr  r   ri   rv  r  terms                    rl   rT  rT  n  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----rn   c                     |st          | |          S t          | ||          \  }}|st          ||          dfgS t          |d         d         |||          }||d         d         fg|dd         z   S )ry  rb   r   N)rY  rT  r   r>   )rd   rp   rf   r   re   r   s         rl   r_  r_    s     -&q!,,,$Q1--NE7 2E1%%q)**71:a=%A66GAJqM"#gabbk11rn   c                 $    t          | d|          S )z_
    Returns ``True`` if a univariate polynomial ``f`` has no factors
    over its domain.
    r   )dmp_irreducible_p)rd   rf   s     rl   dup_irreducible_pr    s    
 Q1%%%rn   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.
    Trb   Fr   )rT  r   )rd   rp   rf   r   re   ri   s         rl   r~  r~    sT    
 !Aq))JAw t	W	 uqz1Avrn   )F)NN)__doc__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.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   sympy.polys.densetoolsrA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   sympy.polys.euclidtoolsrP   rQ   rR   sympy.polys.sqfreetoolsrS   rT   rU   rV   rW   sympy.polys.polyutilsrX   sympy.polys.polyconfigrY   sympy.polys.polyerrorsrZ   r[   r\   r]   sympy.utilitiesr^   mathr_   r|   r`   r   rm   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r$  r2  r.  rH  rQ  rU  rW  r\  r`  rb  re  r   rY  rT  r_  r  r~  rv   rn   rl   <module>r     s   @ @ & & & & & &                         " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	" " " " " " " " " "                           
 0 / / / / / ( ( ( ( ( (F F F F F F F F F F F F $ # # # # # + + + + + + + +! ! !.! ! !.9 9 9v% % %6 6 6r75 75 75r  f f fR   P P P Pf	 	 	   ) ) )X8 8 8:H H HV  (* * *43 3 3l- - -`A A AH1 1 1hK K K K\>( >( >(B    ,    ,  >4 4 4<	, 	, 	,M M M
?. ?. ?.D2 2 2J. J. J.Z2 2 2& & &    rn   