
    \hE                          S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJrJrJr  SS	KJr  S
 rSS jrS r\
SS j5       rg)z,Computing integral bases for number fields.     )Poly)AlgebraicField)ZZ)QQ)public   )ModuleEndomorphismModuleHomomorphism
PowerBasis) extract_fundamental_discriminantc                 b   U R                   n[        XS9nUR                  5       u  pEUS:X  d   e[        SX!S9nU H	  u  pxXg-  nM     X6-  n	[        U[        S9n
[        U	[        S9nX-  U -
  U-  n[        XS9nUnXi4 H  nUR	                  U5      nM     X>-  nUR                  5       nUU4$ )zn
Apply the "Dedekind criterion" to test whether the order needs to be
enlarged relative to a given prime *p*.
modulusr   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                     V/var/www/auris/envauris/lib/python3.13/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                    ^ U R                   nTc  UmTU:  a  TU-  mTU:  a  M  [        U U4S j5      nUR                  US9$ )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                    > U T-  $ N )r   qs    r(   <lambda>"nilradical_mod_p.<locals>.<lambda>K   s	    !Q$r*   r   )nr	   kernel)Hr   r/   r2   phis     `  r(   nilradical_mod_pr6   %   sO    B 	
Ay!eFA !e
Q
/C::a:  r*   c                   ^
 [        XUS9nU R                  R                  U R                  UR                  -  U R                  S9nXAU -  -   nUR                  5       m
[        U T
U
4S j5      nUR                  US9nU R                  R                  U R                  UR                  -  U R                  U-  S9nX-   n	X4$ )z<
Perform the second enlargement in the Round Two algorithm.
)r/   )denomc                 &   > TR                  U 5      $ r-   )inner_endomorphism)r   Es    r(   r0   %_second_enlargement.<locals>.<lambda>W   s    Q-A-A!-Dr*   r   )r6   parentsubmodule_from_matrixmatrixr8   endomorphism_ringr
   r3   )r4   r   r/   IpBCr5   gammaGH1r;   s             @r(   _second_enlargementrG   O   s     
!!	$B	&&qxx"))';177&KA	aCA	A
Q#D
ECJJqJ!E	&&qxx%,,'>aggPQk&RA	
B6Mr*   c                 &   Sn[        U [        5      (       a  X R                  R                  5       pU R                  (       a+  U R
                  (       a  U R                  [        [        4;  a  [        S5      eU R                  5       u  pU R                  5       nU R                  5       n[        R                  " [        U5      5      n[        U5      u  p7[!        U=(       d    U 5      nUR#                  5       n	Sn
U(       a  UR%                  5       u  p['        X5      u  pUS:X  a  M.  UR)                  [+        U[        S95      nU	R-                  X-  U	-  US9n	X::  a  Mg  UnUU:  a  UU-  nUU:  a  M  [/        XU5      u  nn
UU	:w  a  Un	[/        XU5      u  nn
UU	:w  a  M  U(       a  M  U
b  [        U[0        5      (       a  XW'   U	nSUl        SUl        UUR6                  R9                  5       S-  -  UR:                  SU-  -  -  nUU4$ )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   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   addrG   dict_starts_with_unity_is_sq_maxrank_HNFr?   detr8   )r   radicalsKr   r2   D	D_modulusFZthetar4   nilradr   er&   r'   Ur/   rF   ZKdKs                       r(   	round_tworh   ^   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 !e(q1
FAgA,Q15JB Ag- !@ 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)   r6   rG   rh   r.   r*   r(   <module>rq      sF    2 & = . 0 , G G 72'!T W Wr*   