+
    iE                          R t ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
 ^RIHtHtHt ^RIHt R tRR
 ltR t]
RR l4       tR	# )z,Computing integral bases for number fields. )Poly)AlgebraicField)ZZ)QQ)public)ModuleEndomorphismModuleHomomorphism
PowerBasis) extract_fundamental_discriminantc                   V P                   p\        WR7      pVP                  4       w  rEV^8X  g   Q h\        ^W!R7      pV F  w  rxWg,          pK  	  W6,          p	\        V\        R7      p
\        V	\        R7      pW,          V ,
          V,          p\        WR7      pTpWi3 F  pVP	                  V4      pK  	  W>,          pVP                  4       pVV3# )zn
Apply the "Dedekind criterion" to test whether the order needs to be
enlarged relative to a given prime *p*.
modulusdomain)genr   factor_listr   gcddegree)TpxT_barlcflg_barti_bar_h_barghff_barZ_barbU_barms   &&                ~/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/sympy/polys/numberfields/basis.py_apply_Dedekind_criterionr'      s    
 	
AE FB7N7A!E	 NEU2AU2A	
qAEE^		! NEA!8O    Nc                   a V P                   pSf   VoSV8  d   SV,          oK  \        V V3R l4      pVP                  VR7      # )a  
Compute the nilradical mod *p* for a given order *H*, and prime *p*.

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

This is the ideal $I$ in $H/pH$ consisting of all elements some positive
power of which is zero in this quotient ring, i.e. is a multiple of *p*.

Parameters
==========

H : :py:class:`~.Submodule`
    The given order.
p : int
    The rational prime.
q : int, optional
    If known, the smallest power of *p* that is $>=$ the dimension of *H*.
    If not provided, we compute it here.

Returns
=======

:py:class:`~.Module` representing the nilradical mod *p* in *H*.

References
==========

.. [1] Cohen, H. *A Course in Computational Algebraic Number Theory*.
(See Lemma 6.1.6.)

c                    < V S,          # N )r   qs   &r&   <lambda>"nilradical_mod_p.<locals>.<lambda>K   s	    !Q$r(   r   )nr   kernel)Hr   r-   r0   phis   &&f  r&   nilradical_mod_pr4   %   sF    B 	
Ay!eFA
Q
/C::a:  r(   c                  a
 \        WVR7      pV P                  P                  V P                  VP                  ,          V P                  R7      pWAV ,          ,           pVP                  4       o
\        V S
V
3R l4      pVP                  VR7      pV P                  P                  V P                  VP                  ,          V P                  V,          R7      pW,           p	W3# )z<
Perform the second enlargement in the Round Two algorithm.
)r-   )denomc                 &   < SP                  V 4      # r+   )inner_endomorphism)r   Es   &r&   r.   %_second_enlargement.<locals>.<lambda>W   s    Q-A-A!-Dr(   r   )r4   parentsubmodule_from_matrixmatrixr6   endomorphism_ringr   r1   )r2   r   r-   IpBCr3   gammaGH1r9   s   &&&       @r&   _second_enlargementrE   O   s     
!!	$B	&&qxx"))';177&KA	aCA	A
Q#D
ECJJqJ!E	&&qxx%,,'>aggPQk&RA	
B6Mr(   c                d   Rp\        V \        4      '       d   Y P                  P                  4       rV P                  '       d.   V P
                  '       d   V P                  \        \        39  d   \        R4      hV P                  4       w  rV P                  4       pV P                  4       p\        P                  ! \        V4      4      p\        V4      w  r7\!        T;'       g    T 4      pVP#                  4       p	Rp
V'       d   VP%                  4       w  r\'        W4      w  rV^ 8X  d   K0  VP)                  \+        V\        R7      4      pV	P-                  W,          V	,          VR7      p	W8:  d   Kx  TpVV8  d   VV,          pK  \/        WV4      w  pp
VV	8w  g   K  Tp	\/        WV4      w  pp
K  V
e   \        V\0        4      '       d   WX&   T	pRVn        RVn        VVP6                  P9                  4       ^,          ,          VP:                  ^V,          ,          ,          pVV3# )a
  
Zassenhaus's "Round 2" algorithm.

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

Carry out Zassenhaus's "Round 2" algorithm on an irreducible polynomial
*T* over :ref:`ZZ` or :ref:`QQ`. This computes an integral basis and the
discriminant for the field $K = \mathbb{Q}[x]/(T(x))$.

Alternatively, you may pass an :py:class:`~.AlgebraicField` instance, in
place of the polynomial *T*, in which case the algorithm is applied to the
minimal polynomial for the field's primitive element.

Ordinarily this function need not be called directly, as one can instead
access the :py:meth:`~.AlgebraicField.maximal_order`,
:py:meth:`~.AlgebraicField.integral_basis`, and
:py:meth:`~.AlgebraicField.discriminant` methods of an
:py:class:`~.AlgebraicField`.

Examples
========

Working through an AlgebraicField:

>>> from sympy import Poly, QQ
>>> from sympy.abc import x
>>> T = Poly(x ** 3 + x ** 2 - 2 * x + 8)
>>> K = QQ.alg_field_from_poly(T, "theta")
>>> print(K.maximal_order())
Submodule[[2, 0, 0], [0, 2, 0], [0, 1, 1]]/2
>>> print(K.discriminant())
-503
>>> print(K.integral_basis(fmt='sympy'))
[1, theta, theta/2 + theta**2/2]

Calling directly:

>>> from sympy import Poly
>>> from sympy.abc import x
>>> from sympy.polys.numberfields.basis import round_two
>>> T = Poly(x ** 3 + x ** 2 - 2 * x + 8)
>>> print(round_two(T))
(Submodule[[2, 0, 0], [0, 2, 0], [0, 1, 1]]/2, -503)

The nilradicals mod $p$ that are sometimes computed during the Round Two
algorithm may be useful in further calculations. Pass a dictionary under
`radicals` to receive these:

>>> T = Poly(x**3 + 3*x**2 + 5)
>>> rad = {}
>>> ZK, dK = round_two(T, radicals=rad)
>>> print(rad)
{3: Submodule[[-1, 1, 0], [-1, 0, 1]]}

Parameters
==========

T : :py:class:`~.Poly`, :py:class:`~.AlgebraicField`
    Either (1) the irreducible polynomial over :ref:`ZZ` or :ref:`QQ`
    defining the number field, or (2) an :py:class:`~.AlgebraicField`
    representing the number field itself.

radicals : dict, optional
    This is a way for any $p$-radicals (if computed) to be returned by
    reference. If desired, pass an empty dictionary. If the algorithm
    reaches the point where it computes the nilradical mod $p$ of the ring
    of integers $Z_K$, then an $\mathbb{F}_p$-basis for this ideal will be
    stored in this dictionary under the key ``p``. This can be useful for
    other algorithms, such as prime decomposition.

Returns
=======

Pair ``(ZK, dK)``, where:

    ``ZK`` is a :py:class:`~sympy.polys.numberfields.modules.Submodule`
    representing the maximal order.

    ``dK`` is the discriminant of the field $K = \mathbb{Q}[x]/(T(x))$.

See Also
========

.AlgebraicField.maximal_order
.AlgebraicField.integral_basis
.AlgebraicField.discriminant

References
==========

.. [1] Cohen, H. *A Course in Computational Algebraic Number Theory.*

NzDRound 2 requires an irreducible univariate polynomial over ZZ or QQ.r   )hnf_modulusT)
isinstancer   extminpoly_of_elementis_univariateis_irreducibler   r   r   
ValueError)make_monic_over_integers_by_scaling_rootsr   discriminant
from_sympyabsr
   r	   whole_submodulepopitemr'   element_from_polyr   addrE   dict_starts_with_unity_is_sq_maxrank_HNFr=   detr6   )r   radicalsKr   r0   D	D_modulusFZthetar2   nilradr   er$   r%   Ur-   rD   ZKdKs   &&                  r&   	round_twore   ^   s   @ 	A!^$$%%**,188B8#_``668DA	
A	Ac!f%I ,A.DAQF AF
yy{,Q26 $$T%%;<
 EE!&1*)E46 !eFA(q1
FAgA,Q15JB j488	
B B B
biimmo"
"rxxAE':	:Br6Mr(   r+   )__doc__sympy.polys.polytoolsr   "sympy.polys.domains.algebraicfieldr   sympy.polys.domains.integerringr   !sympy.polys.domains.rationalfieldr   sympy.utilities.decoratorr   modulesr   r   r	   	utilitiesr
   r'   r4   rE   re   r,   r(   r&   <module>rn      sF    2 & = . 0 , G G 72'!T W Wr(   