From f59ea663dd7304c3b836ed39effcf30910705774 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Tue, 1 Oct 2024 19:00:00 +0200 Subject: [PATCH 01/26] Fix build with pari 2.17 NEXT_PRIME_VIADIFF is removed in 2.17, port pari_prime_range to pari_PRIMES instead --- src/sage/libs/pari/convert_sage.pyx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/sage/libs/pari/convert_sage.pyx b/src/sage/libs/pari/convert_sage.pyx index 64386bcf632..db6725f39a5 100644 --- a/src/sage/libs/pari/convert_sage.pyx +++ b/src/sage/libs/pari/convert_sage.pyx @@ -573,17 +573,16 @@ cpdef list pari_prime_range(long c_start, long c_stop, bint py_ints=False): sage: pari_prime_range(2, 19) [2, 3, 5, 7, 11, 13, 17] """ - cdef long p = 0 - cdef byteptr pari_prime_ptr = diffptr + cdef ulong i = 1 res = [] - while p < c_start: - NEXT_PRIME_VIADIFF(p, pari_prime_ptr) - while p < c_stop: + while pari_PRIMES[i] < c_start: + i+=1 + while pari_PRIMES[i] < c_stop: if py_ints: - res.append(p) + res.append(pari_PRIMES[i]) else: z = PY_NEW(Integer) - mpz_set_ui(z.value, p) + mpz_set_ui(z.value, pari_PRIMES[i]) res.append(z) - NEXT_PRIME_VIADIFF(p, pari_prime_ptr) + i+=1 return res From dee73345d9b95da299757e20f13392f1fc439acf Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Wed, 2 Oct 2024 23:33:02 +0200 Subject: [PATCH 02/26] Adapt new_gen_from_real_mpfr_element to pari 2.17 changes in precision --- src/sage/libs/pari/convert_sage_real_mpfr.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/libs/pari/convert_sage_real_mpfr.pyx b/src/sage/libs/pari/convert_sage_real_mpfr.pyx index 98db6023dc9..5fd7fba1c47 100644 --- a/src/sage/libs/pari/convert_sage_real_mpfr.pyx +++ b/src/sage/libs/pari/convert_sage_real_mpfr.pyx @@ -28,7 +28,7 @@ cpdef Gen new_gen_from_real_mpfr_element(RealNumber self): # We round up the precision to the nearest multiple of wordsize. cdef int rounded_prec - rounded_prec = (self.prec() + wordsize - 1) & ~(wordsize - 1) + rounded_prec = nbits2prec(self.prec()) # Yes, assigning to self works fine, even in Cython. if rounded_prec > prec: @@ -48,7 +48,7 @@ cpdef Gen new_gen_from_real_mpfr_element(RealNumber self): exponent = mpfr_get_z_exp(mantissa, self.value) # Create a PARI REAL - pari_float = cgetr(2 + rounded_prec / wordsize) + pari_float = cgetr(rounded_prec) pari_float[1] = evalexpo(exponent + rounded_prec - 1) + evalsigne(mpfr_sgn(self.value)) mpz_export(&pari_float[2], NULL, 1, wordsize // 8, 0, 0, mantissa) mpz_clear(mantissa) From 34af90b29ff8102cef42ff5d31ddb723ff627736 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sat, 5 Oct 2024 21:24:38 +0200 Subject: [PATCH 03/26] Update tests output for pari 2.17 --- src/sage/arith/misc.py | 6 +- src/sage/categories/quotient_fields.py | 2 +- .../arithmetic_dynamics/berkovich_ds.py | 4 +- .../arithmetic_dynamics/projective_ds.py | 2 +- src/sage/libs/pari/tests.py | 8 +- src/sage/matrix/matrix2.pyx | 2 +- src/sage/modular/cusps_nf.py | 8 +- src/sage/modular/dirichlet.py | 8 +- src/sage/modular/modsym/p1list_nf.py | 8 +- src/sage/quadratic_forms/binary_qf.py | 8 +- .../finite_rings/finite_field_prime_modn.py | 6 +- src/sage/rings/finite_rings/residue_field.pyx | 41 ++-- .../finite_rings/residue_field_pari_ffelt.pyx | 2 +- src/sage/rings/integer.pyx | 2 +- src/sage/rings/number_field/S_unit_solver.py | 52 ++--- src/sage/rings/number_field/galois_group.py | 4 +- src/sage/rings/number_field/number_field.py | 196 +++++++++--------- .../number_field/number_field_element.pyx | 8 +- .../rings/number_field/number_field_ideal.py | 42 ++-- .../number_field/number_field_ideal_rel.py | 22 +- .../rings/number_field/number_field_rel.py | 16 +- src/sage/rings/number_field/order.py | 8 +- src/sage/rings/number_field/selmer_group.py | 2 +- .../polynomial/polynomial_quotient_ring.py | 46 ++-- src/sage/rings/qqbar.py | 18 +- src/sage/rings/rational.pyx | 4 +- src/sage/schemes/affine/affine_morphism.py | 8 +- src/sage/schemes/elliptic_curves/ell_field.py | 2 +- .../schemes/elliptic_curves/ell_local_data.py | 2 +- .../elliptic_curves/ell_number_field.py | 51 ++--- src/sage/schemes/elliptic_curves/ell_point.py | 8 +- .../elliptic_curves/ell_rational_field.py | 2 +- .../elliptic_curves/gal_reps_number_field.py | 10 +- src/sage/schemes/elliptic_curves/gp_simon.py | 2 +- .../schemes/elliptic_curves/isogeny_class.py | 20 +- .../elliptic_curves/isogeny_small_degree.py | 8 +- .../schemes/plane_conics/con_number_field.py | 4 +- .../schemes/projective/projective_morphism.py | 14 +- .../schemes/projective/projective_point.py | 6 +- src/sage/structure/factorization.py | 8 +- 40 files changed, 336 insertions(+), 334 deletions(-) diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py index 745d5fcbbe7..2e27f03a967 100644 --- a/src/sage/arith/misc.py +++ b/src/sage/arith/misc.py @@ -2693,7 +2693,7 @@ def factor(n, proof=None, int_=False, algorithm='pari', verbose=0, **kwds): sage: K. = QuadraticField(-1) # needs sage.rings.number_field sage: factor(122 - 454*i) # needs sage.rings.number_field - (-i) * (-i - 2)^3 * (i + 1)^3 * (-2*i + 3) * (i + 4) + (-i - 2)^3 * (-i - 1)^3 * (3*i + 2) * (i + 4) To access the data in a factorization:: @@ -2776,7 +2776,7 @@ def radical(n, *args, **kwds): ArithmeticError: radical of 0 is not defined sage: K. = QuadraticField(-1) # needs sage.rings.number_field sage: radical(K(2)) # needs sage.rings.number_field - i + 1 + -i - 1 Tests with numpy and gmpy2 numbers:: @@ -3031,7 +3031,7 @@ def is_squarefree(n): sage: is_squarefree(O(2)) False sage: O(2).factor() - (-I) * (I + 1)^2 + (-I) * (-I - 1)^2 This method fails on domains which are not Unique Factorization Domains:: diff --git a/src/sage/categories/quotient_fields.py b/src/sage/categories/quotient_fields.py index 76f0570a819..0e4d13ef889 100644 --- a/src/sage/categories/quotient_fields.py +++ b/src/sage/categories/quotient_fields.py @@ -100,7 +100,7 @@ def gcd(self, other): sage: R = ZZ.extension(x^2 + 1, names='i') sage: i = R.1 sage: gcd(5, 3 + 4*i) - -i - 2 + 2*i - 1 sage: P. = R[] sage: gcd(t, i) Traceback (most recent call last): diff --git a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py index 0c27d8e2bde..9ab595f4356 100644 --- a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py +++ b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py @@ -690,10 +690,10 @@ def conjugate(self, M, adjugate=False, new_ideal=None): sage: # needs sage.rings.number_field sage: ideal = A.ideal(5).factor()[1][0]; ideal - Fractional ideal (2*a + 1) + Fractional ideal (-a + 2) sage: g = f.conjugate(conj, new_ideal=ideal) sage: g.domain().ideal() - Fractional ideal (2*a + 1) + Fractional ideal (-a + 2) """ if self.domain().is_padic_base(): return DynamicalSystem_Berkovich(self._system.conjugate(M, adjugate=adjugate)) diff --git a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py index a74efd9129a..151f9e71335 100644 --- a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py +++ b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py @@ -1790,7 +1790,7 @@ def primes_of_bad_reduction(self, check=True): sage: P. = ProjectiveSpace(K,1) sage: f = DynamicalSystem_projective([1/3*x^2+1/a*y^2, y^2]) sage: f.primes_of_bad_reduction() # needs sage.rings.function_field - [Fractional ideal (a), Fractional ideal (3)] + [Fractional ideal (-a), Fractional ideal (3)] This is an example where ``check=False`` returns extra primes:: diff --git a/src/sage/libs/pari/tests.py b/src/sage/libs/pari/tests.py index 1ed571cd4b9..bd8dc9641d2 100644 --- a/src/sage/libs/pari/tests.py +++ b/src/sage/libs/pari/tests.py @@ -1502,7 +1502,7 @@ sage: pari(-104).quadclassunit() [6, [6], [Qfb(5, -4, 6)], 1] sage: pari(109).quadclassunit() - [1, [], [], 5.56453508676047] + [1, [], [], 5.56453508676047, -1] sage: pari(10001).quadclassunit() # random generators [16, [16], [Qfb(10, 99, -5, 0.E-38)], 5.29834236561059] sage: pari(10001).quadclassunit()[0] @@ -1749,13 +1749,13 @@ sage: y = QQ['yy'].0; _ = pari(y) # pari has variable ordering rules sage: x = QQ['zz'].0; nf = pari(x^2 + 2).nfinit() sage: nf.nfroots(y^2 + 2) - [Mod(-zz, zz^2 + 2), Mod(zz, zz^2 + 2)] + [Mod(-zz, zz^2 + 2), Mod(zz, zz^2 + 2)]~ sage: nf = pari(x^3 + 2).nfinit() sage: nf.nfroots(y^3 + 2) - [Mod(zz, zz^3 + 2)] + [Mod(zz, zz^3 + 2)]~ sage: nf = pari(x^4 + 2).nfinit() sage: nf.nfroots(y^4 + 2) - [Mod(-zz, zz^4 + 2), Mod(zz, zz^4 + 2)] + [Mod(-zz, zz^4 + 2), Mod(zz, zz^4 + 2)]~ sage: nf = pari('x^2 + 1').nfinit() sage: nf.nfrootsof1() diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx index 3682c2be14e..1a6580f8fc3 100644 --- a/src/sage/matrix/matrix2.pyx +++ b/src/sage/matrix/matrix2.pyx @@ -16584,7 +16584,7 @@ cdef class Matrix(Matrix1): ....: -2*a^2 + 4*a - 2, -2*a^2 + 1, 2*a, a^2 - 6, 3*a^2 - a ]) sage: r,s,p = m._echelon_form_PID() sage: s[2] - (0, 0, -3*a^2 - 18*a + 34, -68*a^2 + 134*a - 53, -111*a^2 + 275*a - 90) + (0, 0, 3*a^2 + 18*a - 34, 68*a^2 - 134*a + 53, 111*a^2 - 275*a + 90) sage: r * m == s and r.det() == 1 True diff --git a/src/sage/modular/cusps_nf.py b/src/sage/modular/cusps_nf.py index 4d120c075da..f3a3ff7e65b 100644 --- a/src/sage/modular/cusps_nf.py +++ b/src/sage/modular/cusps_nf.py @@ -1184,9 +1184,9 @@ def NFCusps_ideal_reps_for_levelN(N, nlists=1): sage: from sage.modular.cusps_nf import NFCusps_ideal_reps_for_levelN sage: NFCusps_ideal_reps_for_levelN(N) [(Fractional ideal (1), - Fractional ideal (67, a + 17), - Fractional ideal (127, a + 48), - Fractional ideal (157, a - 19))] + Fractional ideal (67, -4/7*a^3 + 13/7*a^2 + 39/7*a - 43), + Fractional ideal (127, -4/7*a^3 + 13/7*a^2 + 39/7*a - 42), + Fractional ideal (157, -4/7*a^3 + 13/7*a^2 + 39/7*a + 48))] sage: L = NFCusps_ideal_reps_for_levelN(N, 5) sage: all(len(L[i]) == k.class_number() for i in range(len(L))) True @@ -1244,7 +1244,7 @@ def units_mod_ideal(I): sage: I = k.ideal(5, a + 1) sage: units_mod_ideal(I) [1, - -2*a^2 - 4*a + 1, + 2*a^2 + 4*a - 1, ...] :: diff --git a/src/sage/modular/dirichlet.py b/src/sage/modular/dirichlet.py index 1f6a7a94444..1cf3ccdb611 100644 --- a/src/sage/modular/dirichlet.py +++ b/src/sage/modular/dirichlet.py @@ -2395,13 +2395,13 @@ class DirichletGroupFactory(UniqueFactory): sage: parent(val) Gaussian Integers generated by zeta4 in Cyclotomic Field of order 4 and degree 2 sage: r4_29_0 = r4.residue_field(K(29).factor()[0][0]); r4_29_0(val) - 17 + 12 sage: r4_29_0(val) * GF(29)(3) - 22 + 7 sage: r4_29_0(G.gens()[2].values_on_gens()[2]) * 3 - 22 + 7 sage: parent(r4_29_0(G.gens()[2].values_on_gens()[2]) * 3) - Residue field of Fractional ideal (-2*zeta4 + 5) + Residue field of Fractional ideal (-2*zeta4 - 5) :: diff --git a/src/sage/modular/modsym/p1list_nf.py b/src/sage/modular/modsym/p1list_nf.py index 86d33071974..00bb0979ea4 100644 --- a/src/sage/modular/modsym/p1list_nf.py +++ b/src/sage/modular/modsym/p1list_nf.py @@ -61,7 +61,7 @@ sage: alpha = MSymbol(N, a + 2, 3*a^2) sage: alpha.lift_to_sl2_Ok() - [-1, 4*a^2 - 13*a + 23, a + 2, 5*a^2 + 3*a - 3] + [-a - 1, 15*a^2 - 38*a + 86, a + 2, -a^2 + 9*a - 19] sage: Ok = k.ring_of_integers() sage: M = Matrix(Ok, 2, alpha.lift_to_sl2_Ok()) sage: det(M) @@ -977,11 +977,11 @@ def apply_J_epsilon(self, i, e1, e2=1): sage: N = k.ideal(5, a + 1) sage: P = P1NFList(N) sage: u = k.unit_group().gens_values(); u - [-1, -2*a^2 - 4*a + 1] + [-1, 2*a^2 + 4*a - 1] sage: P.apply_J_epsilon(4, -1) 2 sage: P.apply_J_epsilon(4, u[0], u[1]) - 5 + 1 :: @@ -1122,7 +1122,7 @@ def lift_to_sl2_Ok(N, c, d): sage: M = Matrix(Ok, 2, lift_to_sl2_Ok(N, 0, 7)) Traceback (most recent call last): ... - ValueError: <0> + <7> and the Fractional ideal (7, a) are not coprime. + ValueError: <0> + <7> and the Fractional ideal (7, -4/7*a^3 + 13/7*a^2 + 39/7*a - 19) are not coprime. """ k = N.number_field() # check the input diff --git a/src/sage/quadratic_forms/binary_qf.py b/src/sage/quadratic_forms/binary_qf.py index 1a75f415b64..c89759288b9 100755 --- a/src/sage/quadratic_forms/binary_qf.py +++ b/src/sage/quadratic_forms/binary_qf.py @@ -1646,7 +1646,7 @@ def solve_integer(self, n, *, algorithm='general', _flag=2): sage: Q = BinaryQF([1, 0, 12345]) sage: n = 2^99 + 5273 sage: Q.solve_integer(n) # needs sage.libs.pari - (-67446480057659, 7139620553488) + (67446480057659, 7139620553488) sage: Q.solve_integer(n, algorithm='cornacchia') # needs sage.libs.pari (67446480057659, 7139620553488) sage: timeit('Q.solve_integer(n)') # not tested @@ -1661,7 +1661,7 @@ def solve_integer(self, n, *, algorithm='general', _flag=2): sage: Qs [x^2 + x*y + 6*y^2, 2*x^2 - x*y + 3*y^2, 2*x^2 + x*y + 3*y^2] sage: [Q.solve_integer(3) for Q in Qs] - [None, (0, -1), (0, -1)] + [None, (0, 1), (0, 1)] sage: [Q.solve_integer(5) for Q in Qs] [None, None, None] sage: [Q.solve_integer(6) for Q in Qs] @@ -1741,11 +1741,11 @@ def solve_integer(self, n, *, algorithm='general', _flag=2): sage: # needs sage.libs.pari sage: Q = BinaryQF([1, 0, 5]) sage: Q.solve_integer(126, _flag=1) - [(11, -1), (-1, -5), (-1, 5), (-11, -1)] + [(-11, -1), (-1, -5), (-1, 5), (11, -1)] sage: Q.solve_integer(126, _flag=2) (11, -1) sage: Q.solve_integer(126, _flag=3) - [(11, -1), (-1, -5), (-1, 5), (-11, -1), (-9, -3), (9, -3)] + [(-11, -1), (-9, -3), (-1, -5), (-1, 5), (9, -3), (11, -1)] """ if self.is_negative_definite(): # not supported by PARI return (-self).solve_integer(-n) diff --git a/src/sage/rings/finite_rings/finite_field_prime_modn.py b/src/sage/rings/finite_rings/finite_field_prime_modn.py index d94b0a4335a..0978c7328fe 100644 --- a/src/sage/rings/finite_rings/finite_field_prime_modn.py +++ b/src/sage/rings/finite_rings/finite_field_prime_modn.py @@ -114,9 +114,9 @@ def _coerce_map_from_(self, S): sage: RF13 = K.residue_field(pp) sage: RF13.hom([GF(13)(1)]) Ring morphism: - From: Residue field of Fractional ideal (-w - 18) - To: Finite Field of size 13 - Defn: 1 |--> 1 + From: Residue field of Fractional ideal (w + 18) + To: Finite Field of size 13 + Defn: 1 |--> 1 Check that :issue:`19573` is resolved:: diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 3146f7fd764..a8e77e48b76 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -22,14 +22,13 @@ monogenic (i.e., 2 is an essential discriminant divisor):: sage: # needs sage.rings.number_field sage: K. = NumberField(x^3 + x^2 - 2*x + 8) sage: F = K.factor(2); F - (Fractional ideal (-1/2*a^2 + 1/2*a - 1)) * (Fractional ideal (-a^2 + 2*a - 3)) - * (Fractional ideal (3/2*a^2 - 5/2*a + 4)) + (Fractional ideal (-1/2*a^2 + 1/2*a - 1)) * (Fractional ideal (a^2 - 2*a + 3)) * (Fractional ideal (-3/2*a^2 + 5/2*a - 4)) sage: F[0][0].residue_field() Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1) sage: F[1][0].residue_field() - Residue field of Fractional ideal (-a^2 + 2*a - 3) + Residue field of Fractional ideal (a^2 - 2*a + 3) sage: F[2][0].residue_field() - Residue field of Fractional ideal (3/2*a^2 - 5/2*a + 4) + Residue field of Fractional ideal (-3/2*a^2 + 5/2*a - 4) We can also form residue fields from `\ZZ`:: @@ -126,10 +125,10 @@ First over a small non-prime field:: sage: I = ideal([ubar*X + Y]); I Ideal (ubar*X + Y) of Multivariate Polynomial Ring in X, Y over Residue field in ubar of Fractional ideal - (47, 517/55860*u^5 + 235/3724*u^4 + 9829/13965*u^3 - + 54106/13965*u^2 + 64517/27930*u + 755696/13965) + (47, 4841/93100*u^5 + 34451/139650*u^4 + 303697/69825*u^3 + + 297893/27930*u^2 + 1649764/23275*u + 2633506/69825) sage: I.groebner_basis() # needs sage.libs.singular - [X + (-19*ubar^2 - 5*ubar - 17)*Y] + [X + (-15*ubar^2 + 3*ubar - 2)*Y] And now over a large prime field:: @@ -496,9 +495,9 @@ class ResidueField_generic(Field): sage: # needs sage.rings.number_field sage: I = QQ[i].factor(2)[0][0]; I - Fractional ideal (I + 1) + Fractional ideal (-I - 1) sage: k = I.residue_field(); k - Residue field of Fractional ideal (I + 1) + Residue field of Fractional ideal (-I - 1) sage: type(k) @@ -1008,7 +1007,7 @@ cdef class ReductionMap(Map): sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (a + 1) + To: Residue field of Fractional ideal (-a + 1) sage: cr == r # not implemented True sage: r(2 + a) == cr(2 + a) @@ -1039,7 +1038,7 @@ cdef class ReductionMap(Map): sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (a + 1) + To: Residue field of Fractional ideal (-a + 1) sage: cr == r # not implemented True sage: r(2 + a) == cr(2 + a) @@ -1071,7 +1070,7 @@ cdef class ReductionMap(Map): sage: r = F.reduction_map(); r Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (a + 1) + To: Residue field of Fractional ideal (-a + 1) We test that calling the function also works after copying:: @@ -1083,7 +1082,7 @@ cdef class ReductionMap(Map): Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element 1/2*a - modulo Fractional ideal (a + 1): it has negative valuation + modulo Fractional ideal (-a + 1): it has negative valuation sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; h = t^5 + t^2 + 1 @@ -1105,11 +1104,11 @@ cdef class ReductionMap(Map): sage: # needs sage.rings.number_field sage: K. = NumberField(x^2 + 1) sage: P1, P2 = [g[0] for g in K.factor(5)]; P1, P2 - (Fractional ideal (-i - 2), Fractional ideal (2*i + 1)) + (Fractional ideal (2*i - 1), Fractional ideal (-2*i - 1)) sage: a = 1/(1+2*i) sage: F1, F2 = [g.residue_field() for g in [P1,P2]]; F1, F2 - (Residue field of Fractional ideal (-i - 2), - Residue field of Fractional ideal (2*i + 1)) + (Residue field of Fractional ideal (2*i - 1), + Residue field of Fractional ideal (-2*i - 1)) sage: a.valuation(P1) 0 sage: F1(i/7) @@ -1122,7 +1121,7 @@ cdef class ReductionMap(Map): Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element -2/5*i + 1/5 - modulo Fractional ideal (2*i + 1): it has negative valuation + modulo Fractional ideal (-2*i - 1): it has negative valuation """ # The reduction map is just x |--> F(to_vs(x) * (PB**(-1))) if # either x is integral or the denominator of x is coprime to @@ -1188,8 +1187,7 @@ cdef class ReductionMap(Map): sage: f = k.convert_map_from(K) sage: s = f.section(); s Lifting map: - From: Residue field in abar of - Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) + From: Residue field in abar of Fractional ideal (14*a^4 - 24*a^3 - 26*a^2 + 58*a - 15) To: Number Field in a with defining polynomial x^5 - 5*x + 2 sage: s(k.gen()) a @@ -1424,8 +1422,7 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): sage: f = k.coerce_map_from(K.ring_of_integers()) sage: s = f.section(); s Lifting map: - From: Residue field in abar of - Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) + From: Residue field in abar of Fractional ideal (14*a^4 - 24*a^3 - 26*a^2 + 58*a - 15) To: Maximal Order generated by a in Number Field in a with defining polynomial x^5 - 5*x + 2 sage: s(k.gen()) a @@ -1678,7 +1675,7 @@ cdef class LiftingMap(Section): sage: F. = K.factor(7)[0][0].residue_field() sage: F.lift_map() #indirect doctest Lifting map: - From: Residue field in tmod of Fractional ideal (theta_12^2 + 2) + From: Residue field in tmod of Fractional ideal (2*theta_12^3 + theta_12) To: Maximal Order generated by theta_12 in Cyclotomic Field of order 12 and degree 4 """ return "Lifting" diff --git a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx index e9962c3ccde..90a68c619f6 100644 --- a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx +++ b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx @@ -103,7 +103,7 @@ class ResidueFiniteField_pari_ffelt(ResidueField_generic, FiniteField_pari_ffelt sage: P.residue_class_degree() 2 sage: ff. = P.residue_field(); ff - Residue field in alpha of Fractional ideal (-12*aa^2 + 189*aa - 475) + Residue field in alpha of Fractional ideal (12*aa^2 - 189*aa + 475) sage: type(ff) sage: ff(alpha^2 + 1) diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index 9616e7946bc..bcc45e703a2 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -5585,7 +5585,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): sage: 5.is_norm(K) False sage: n.is_norm(K, element=True) - (True, -4*beta + 6) + (True, 4*beta + 6) sage: n.is_norm(K, element=True)[1].norm() 4 sage: n = 5 diff --git a/src/sage/rings/number_field/S_unit_solver.py b/src/sage/rings/number_field/S_unit_solver.py index 0ffac369720..1260650ef77 100644 --- a/src/sage/rings/number_field/S_unit_solver.py +++ b/src/sage/rings/number_field/S_unit_solver.py @@ -12,10 +12,10 @@ sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^2 + x + 1) sage: S = K.primes_above(3) - sage: expected = [((0, 1), (4, 0), xi + 2, -xi - 1), - ....: ((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), + sage: expected = [((4, 1), (4, 0), xi + 2, -xi - 1), + ....: ((3, -1), (2, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), ....: ((1, 0), (5, 0), xi + 1, -xi), - ....: ((2, 0), (5, 1), xi, -xi + 1)] + ....: ((2, 0), (3, 1), xi, -xi + 1)] sage: sols = solve_S_unit_equation(K, S, 200) sage: eq_up_to_order(sols, expected) True @@ -1448,7 +1448,7 @@ def embedding_to_Kp(a, prime, prec): sage: from sage.rings.number_field.S_unit_solver import embedding_to_Kp sage: K. = QuadraticField(17) sage: p = K.prime_above(13); p - Fractional ideal (-a + 2) + Fractional ideal (a - 2) sage: embedding_to_Kp(a-3, p, 15) -20542890112375827 @@ -1791,10 +1791,10 @@ def sieve_ordering(SUK, q): Residue field of Fractional ideal (2*xi + 1)) sage: sieve_data[2] - ([18, 12, 16, 8], [18, 16, 10, 4], [18, 10, 12, 10]) + ([18, 9, 16, 8], [18, 7, 10, 4], [18, 3, 12, 10]) sage: sieve_data[3] - (648, 2916, 3888) + (972, 972, 3888) """ K = SUK.number_field() @@ -2170,23 +2170,23 @@ def construct_complement_dictionaries(split_primes_list, SUK, verbose=False): sage: SUK = K.S_unit_group(S=K.primes_above(H)) sage: split_primes_list = [3, 7] sage: actual = construct_complement_dictionaries(split_primes_list, SUK) - sage: expected = {3: {(0, 1, 0): [(1, 0, 0), (0, 1, 0)], - ....: (1, 0, 0): [(1, 0, 0), (0, 1, 0)]}, - ....: 7: {(0, 1, 0): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (0, 1, 2): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], - ....: (0, 3, 2): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (0, 3, 4): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], - ....: (0, 5, 0): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], - ....: (0, 5, 4): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (1, 0, 0): [(0, 5, 4), (0, 3, 2), (0, 1, 0)], - ....: (1, 0, 2): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], + sage: expected = {3: {(1, 1, 0): [(1, 0, 0), (1, 1, 0)], + ....: (1, 0, 0): [(1, 0, 0), (1, 1, 0)]}, + ....: 7: {(1, 1, 0): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], + ....: (1, 3, 2): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], + ....: (1, 5, 4): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], ....: (1, 0, 4): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], ....: (1, 2, 0): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], - ....: (1, 2, 2): [(0, 5, 4), (0, 3, 2), (0, 1, 0)], + ....: (1, 4, 2): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], + ....: (1, 1, 2): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], + ....: (1, 3, 4): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], + ....: (1, 5, 0): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], + ....: (1, 0, 2): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], ....: (1, 2, 4): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], ....: (1, 4, 0): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], - ....: (1, 4, 2): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], - ....: (1, 4, 4): [(0, 5, 4), (0, 3, 2), (0, 1, 0)]}} + ....: (1, 0, 0): [(1, 5, 4), (1, 3, 2), (1, 1, 0)], + ....: (1, 2, 2): [(1, 5, 4), (1, 3, 2), (1, 1, 0)], + ....: (1, 4, 4): [(1, 5, 4), (1, 3, 2), (1, 1, 0)]}} sage: all(set(actual[p][vec]) == set(expected[p][vec]) ....: for p in [3, 7] for vec in expected[p]) True @@ -2693,9 +2693,9 @@ def sieve_below_bound(K, S, bound=10, bump=10, split_primes_list=[], verbose=Fal sage: SUK = UnitGroup(K, S=tuple(K.primes_above(3))) sage: S = SUK.primes() sage: sols = sieve_below_bound(K, S, 10) - sage: expected = [((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), - ....: ((0, 1), (4, 0), xi + 2, -xi - 1), - ....: ((2, 0), (5, 1), xi, -xi + 1), + sage: expected = [((3, -1), (2, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), + ....: ((4, 1), (4, 0), xi + 2, -xi - 1), + ....: ((2, 0), (3, 1), xi, -xi + 1), ....: ((1, 0), (5, 0), xi + 1, -xi)] sage: eq_up_to_order(sols, expected) True @@ -2758,10 +2758,10 @@ def solve_S_unit_equation(K, S, prec=106, include_exponents=True, include_bound= sage: K. = NumberField(x^2 + x + 1) sage: S = K.primes_above(3) sage: sols = solve_S_unit_equation(K, S, 200) - sage: expected = [((0, 1), (4, 0), xi + 2, -xi - 1), - ....: ((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), + sage: expected = [((4, 1), (4, 0), xi + 2, -xi - 1), + ....: ((3, -1), (2, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), ....: ((1, 0), (5, 0), xi + 1, -xi), - ....: ((2, 0), (5, 1), xi, -xi + 1)] + ....: ((2, 0), (3, 1), xi, -xi + 1)] sage: eq_up_to_order(sols, expected) True @@ -2769,7 +2769,7 @@ def solve_S_unit_equation(K, S, prec=106, include_exponents=True, include_bound= sage: solutions, bound = solve_S_unit_equation(K, S, 100, include_bound=True) sage: bound - 7 + 6 You can omit the exponent vectors:: diff --git a/src/sage/rings/number_field/galois_group.py b/src/sage/rings/number_field/galois_group.py index c974c3df6ff..ee53ca6d674 100644 --- a/src/sage/rings/number_field/galois_group.py +++ b/src/sage/rings/number_field/galois_group.py @@ -995,8 +995,8 @@ def artin_symbol(self, P): sage: K. = NumberField(x^4 - 2*x^2 + 2, 'a').galois_closure() sage: G = K.galois_group() sage: [G.artin_symbol(P) for P in K.primes_above(7)] - [(1,4)(2,3)(5,8)(6,7), (1,4)(2,3)(5,8)(6,7), - (1,5)(2,6)(3,7)(4,8), (1,5)(2,6)(3,7)(4,8)] + [(1,5)(2,6)(3,7)(4,8), (1,5)(2,6)(3,7)(4,8), + (1,4)(2,3)(5,8)(6,7), (1,4)(2,3)(5,8)(6,7)] sage: G.artin_symbol(17) Traceback (most recent call last): ... diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 767acd8ebc5..715f84da95f 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -3627,7 +3627,7 @@ def fractional_ideal(self, *gens, **kwds): sage: L. = K.extension(x^2 - 3, x^2 + 1) sage: M. = L.extension(x^2 + 1) sage: L.ideal(K.ideal(2, a)) - Fractional ideal (a) + Fractional ideal (-a) sage: M.ideal(K.ideal(2, a)) == M.ideal(a*(b - c)/2) True @@ -3665,40 +3665,29 @@ def ideals_of_bdd_norm(self, bound): sage: x = polygen(QQ, 'x') sage: K. = NumberField(x^2 + 23) - sage: d = K.ideals_of_bdd_norm(10) - sage: for n in d: - ....: print(n) - ....: for I in sorted(d[n]): - ....: print(I) - 1 - Fractional ideal (1) - 2 - Fractional ideal (2, 1/2*a - 1/2) - Fractional ideal (2, 1/2*a + 1/2) - 3 - Fractional ideal (3, 1/2*a - 1/2) - Fractional ideal (3, 1/2*a + 1/2) - 4 - Fractional ideal (2) - Fractional ideal (4, 1/2*a + 3/2) - Fractional ideal (4, 1/2*a + 5/2) - 5 - 6 - Fractional ideal (1/2*a - 1/2) - Fractional ideal (1/2*a + 1/2) - Fractional ideal (6, 1/2*a + 5/2) - Fractional ideal (6, 1/2*a + 7/2) - 7 - 8 - Fractional ideal (4, a - 1) - Fractional ideal (4, a + 1) - Fractional ideal (1/2*a + 3/2) - Fractional ideal (1/2*a - 3/2) - 9 - Fractional ideal (3) - Fractional ideal (9, 1/2*a + 7/2) - Fractional ideal (9, 1/2*a + 11/2) - 10 + sage: d = K.ideals_of_bdd_norm(10); d # random + {1: [Fractional ideal (1)], + 2: [Fractional ideal (2, 1/2*a - 1/2), Fractional ideal (2, 1/2*a + 1/2)], + 3: [Fractional ideal (3, 1/2*a + 1/2), Fractional ideal (3, 1/2*a - 1/2)], + 4: [Fractional ideal (4, 1/2*a + 3/2), + Fractional ideal (2), + Fractional ideal (4, 1/2*a + 5/2)], + 5: [], + 6: [Fractional ideal (6, 1/2*a + 7/2), + Fractional ideal (-1/2*a - 1/2), + Fractional ideal (-1/2*a + 1/2), + Fractional ideal (6, 1/2*a + 5/2)], + 7: [], + 8: [Fractional ideal (1/2*a + 3/2), + Fractional ideal (4, a - 1), + Fractional ideal (4, a + 1), + Fractional ideal (-1/2*a + 3/2)], + 9: [Fractional ideal (9, 1/2*a + 7/2), + Fractional ideal (3), + Fractional ideal (9, 1/2*a + 11/2)], + 10: []} + sage: [[I.norm() for I in sorted(d[n])] for n in d] + [[1], [2, 2], [3, 3], [4, 4, 4], [], [6, 6, 6, 6], [], [8, 8, 8, 8], [9, 9, 9], []] """ hnf_ideals = self.pari_nf().ideallist(bound) d = {} @@ -3925,9 +3914,13 @@ def primes_of_bounded_norm(self, B): EXAMPLES:: sage: K. = QuadraticField(-1) - sage: K.primes_of_bounded_norm(10) - [Fractional ideal (i + 1), Fractional ideal (-i - 2), - Fractional ideal (2*i + 1), Fractional ideal (3)] + sage: P = K.primes_of_bounded_norm(10); P # random + [Fractional ideal (i + 1), + Fractional ideal (i + 2), + Fractional ideal (-i + 2), + Fractional ideal (3)] + sage: [p.norm() for p in P] + [2, 5, 5, 9] sage: K.primes_of_bounded_norm(1) [] sage: x = polygen(QQ, 'x') @@ -3936,10 +3929,10 @@ def primes_of_bounded_norm(self, B): sage: P [Fractional ideal (a), Fractional ideal (a + 1), - Fractional ideal (-a^2 - 1), + Fractional ideal (a^2 + 1), Fractional ideal (a^2 + a - 1), Fractional ideal (2*a + 1), - Fractional ideal (-2*a^2 - a - 1), + Fractional ideal (2*a^2 + a + 1), Fractional ideal (a^2 - 2*a - 1), Fractional ideal (a + 3)] sage: [p.norm() for p in P] @@ -3988,11 +3981,13 @@ def primes_of_bounded_norm_iter(self, B): sage: K. = QuadraticField(-1) sage: it = K.primes_of_bounded_norm_iter(10) - sage: list(it) + sage: l = list(it); l # random [Fractional ideal (i + 1), Fractional ideal (3), - Fractional ideal (-i - 2), - Fractional ideal (2*i + 1)] + Fractional ideal (i + 2), + Fractional ideal (-i + 2)] + sage: [I.norm() for I in l] + [2, 9, 5, 5] sage: list(K.primes_of_bounded_norm_iter(1)) [] """ @@ -4317,7 +4312,7 @@ def pari_nf(self, important=True): sage: k. = NumberField(x^4 - 3/2*x + 5/3); k Number Field in a with defining polynomial x^4 - 3/2*x + 5/3 sage: k.pari_nf() - [y^4 - 324*y + 2160, [0, 2], 48918708, 216, ..., [36, 36*y, y^3 + 6*y^2 - 252, 6*y^2], [1, 0, 0, 252; 0, 1, 0, 0; 0, 0, 0, 36; 0, 0, 6, -36], [1, 0, 0, 0, 0, 0, -18, 42, 0, -18, -46, -60, 0, 42, -60, -60; 0, 1, 0, 0, 1, 0, 2, 0, 0, 2, -11, -1, 0, 0, -1, 9; 0, 0, 1, 0, 0, 0, 6, 6, 1, 6, -5, 0, 0, 6, 0, 0; 0, 0, 0, 1, 0, 6, -6, -6, 0, -6, -1, 2, 1, -6, 2, 0]] + [y^4 - 324*y + 2160, [0, 2], 48918708, 216, ..., [36, 36*y, y^3 + 6*y^2 - 252, -6*y^2], [1, 0, 0, 252; 0, 1, 0, 0; 0, 0, 0, 36; 0, 0, -6, 36], [1, 0, 0, 0, 0, 0, -18, -42, 0, -18, -46, 60, 0, -42, 60, -60; 0, 1, 0, 0, 1, 0, 2, 0, 0, 2, -11, 1, 0, 0, 1, 9; 0, 0, 1, 0, 0, 0, 6, -6, 1, 6, -5, 0, 0, -6, 0, 0; 0, 0, 0, 1, 0, -6, 6, -6, 0, 6, 1, 2, 1, -6, 2, 0]] sage: pari(k) [y^4 - 324*y + 2160, [0, 2], 48918708, 216, ...] sage: gp(k) @@ -4807,7 +4802,7 @@ def _S_class_group_and_units(self, S, proof=True): 1/13*a^2 + 7/13*a - 332/13, -1/13*a^2 + 6/13*a + 345/13, -1, - -2/13*a^2 - 1/13*a + 755/13] + 1/13*a^2 - 19/13*a - 7/13] sage: units[5] in (1/13*a^2 - 19/13*a - 7/13, 1/13*a^2 + 20/13*a - 7/13) True sage: len(units) == 6 @@ -4818,7 +4813,7 @@ def _S_class_group_and_units(self, S, proof=True): sage: K. = NumberField(2*x^2 - 1/3) sage: K._S_class_group_and_units(tuple(K.primes_above(2) + K.primes_above(3))) - ([6*a + 2, 6*a + 3, -1, -12*a + 5], []) + ([...6*a...2, ...6*a...3, -1, ...12*a...5], []) """ K_pari = self.pari_bnf(proof=proof) S_pari = [p.pari_prime() for p in sorted(set(S))] @@ -4996,7 +4991,7 @@ def selmer_generators(self, S, m, proof=True, orders=False): 1/13*a^2 + 7/13*a - 332/13, -1/13*a^2 + 6/13*a + 345/13, -1, - -2/13*a^2 - 1/13*a + 755/13] + 1/13*a^2 - 19/13*a - 7/13] sage: gens[5] in (1/13*a^2 - 19/13*a - 7/13, 1/13*a^2 + 20/13*a - 7/13) True sage: gens[6] in (-1/13*a^2 + 45/13*a - 97/13, 1/13*a^2 - 45/13*a + 97/13) @@ -5153,16 +5148,20 @@ def selmer_space(self, S, p, proof=None): sage: KS2, gens, fromKS2, toKS2 = K.selmer_space([P2, P3, P5], 2) sage: KS2 Vector space of dimension 4 over Finite Field of size 2 - sage: gens - [a + 1, a, 2, -1] + sage: gens # random + [-a - 1, a, 2, -1] + sage: gens in ([-a - 1, a, 2, -1], [a + 1, a, 2, -1]) + True Each generator must have even valuation at primes not in `S`:: - sage: [K.ideal(g).factor() for g in gens] + sage: facgens = [K.ideal(g).factor() for g in gens]; facgens # random [(Fractional ideal (2, a + 1)) * (Fractional ideal (3, a + 1)), Fractional ideal (a), (Fractional ideal (2, a + 1))^2, 1] + sage: facgens[2][0][1] + 2 sage: toKS2(10) (0, 0, 1, 1) @@ -5174,8 +5173,10 @@ def selmer_space(self, S, p, proof=None): sage: KS3, gens, fromKS3, toKS3 = K.selmer_space([P2, P3, P5], 3) sage: KS3 Vector space of dimension 3 over Finite Field of size 3 - sage: gens - [1/2, 1/4*a + 1/4, a] + sage: gens # random + [1/2, -1/4*a - 1/4, a] + sage: gens in ([1/2, -1/4*a - 1/4, a], [1/2, 1/4*a + 1/4, a]) + True An example to show that the group `K(S,2)` may be strictly larger than the group of elements giving extensions unramified @@ -5640,7 +5641,7 @@ def different(self): sage: k. = NumberField(x^2 + 23) sage: d = k.different() sage: d - Fractional ideal (-a) + Fractional ideal (a) sage: d.norm() 23 sage: k.disc() @@ -5760,7 +5761,7 @@ def elements_of_norm(self, n, proof=None) -> list: sage: K.elements_of_norm(3) [] sage: K.elements_of_norm(50) - [-a - 7, 5*a - 5, 7*a + 1] + [7*a - 1, 5*a - 5, -7*a - 1] TESTS: @@ -5871,11 +5872,16 @@ def factor(self, n): sage: K. = NumberField(x^2 + 1) sage: K.factor(1/3) (Fractional ideal (3))^-1 - sage: K.factor(1+a) - Fractional ideal (a + 1) - sage: K.factor(1+a/5) - (Fractional ideal (a + 1)) * (Fractional ideal (-a - 2))^-1 - * (Fractional ideal (2*a + 1))^-1 * (Fractional ideal (-2*a + 3)) + sage: fac = K.factor(1+a); fac # random + Fractional ideal (-a - 1) + sage: len(fac) + 1 + sage: fac = K.factor(1+a/5); fac # random + (Fractional ideal (-a - 1)) * (Fractional ideal (2*a - 1))^-1 * (Fractional ideal (-2*a - 1))^-1 * (Fractional ideal (3*a + 2)) + sage: len(fac) + 4 + sage: product(I[0]^I[1] for I in list(fac)) + Fractional ideal (1/5*a + 1) An example over a relative number field:: @@ -5908,9 +5914,9 @@ def factor(self, n): sage: (fi, fj) = f[::] sage: (fi[1], fj[1]) (1, 1) - sage: fi[0] == L.fractional_ideal(1/2*a*b - a + 1/2) + sage: fi[0] == L.fractional_ideal(-1/2*a*b - a + 1/2) True - sage: fj[0] == L.fractional_ideal(-1/2*a*b - a + 1/2) + sage: fj[0] == L.fractional_ideal(1/2*a*b - a + 1/2) True """ return self.ideal(n).factor() @@ -6507,12 +6513,12 @@ def reduced_basis(self, prec=None): sage: k. = NumberField(x^6 + 2218926655879913714112*x^4 - 32507675650290949030789018433536*x^3 + 4923635504174417014460581055002374467948544*x^2 - 36066074010564497464129951249279114076897746988630016*x + 264187244046129768986806800244258952598300346857154900812365824) sage: new_basis = k.reduced_basis(prec=120) sage: [c.minpoly() for c in new_basis] - [x - 1, - x^2 + x + 1, - x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, - x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, - x^3 - 171*x + 848, - x^6 + 171*x^4 + 1696*x^3 + 29241*x^2 + 145008*x + 719104] + [x^2 + x + 1, + x - 1, + x^6 + 3*x^5 - 102*x^4 - 315*x^3 + 10254*x^2 + 80955*x + 198147, + x^6 + 213*x^4 + 12567*x^2 + 198147, + x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104, + x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104] sage: R = k.order(new_basis) sage: R.discriminant()==k.discriminant() True @@ -7107,14 +7113,14 @@ def units(self, proof=None): sage: K.units(proof=True) # takes forever, not tested ... sage: K.units(proof=False) # result not independently verified - (-a^9 - a + 1, + (a^9 + a - 1, + -a^15 + a^12 - a^10 + a^9 + 2*a^8 - 3*a^7 - a^6 + 3*a^5 - a^4 - 4*a^3 + 3*a^2 + 2*a - 2, + a^15 + a^14 + a^13 + a^12 + a^10 - a^7 - a^6 - a^2 - 1, + 2*a^16 - 3*a^15 + 3*a^14 - 3*a^13 + 3*a^12 - a^11 + a^9 - 3*a^8 + 4*a^7 - 5*a^6 + 6*a^5 - 4*a^4 + 3*a^3 - 2*a^2 - 2*a + 4, -a^16 + a^15 - a^14 + a^12 - a^11 + a^10 + a^8 - a^7 + 2*a^6 - a^4 + 3*a^3 - 2*a^2 + 2*a - 1, - 2*a^16 - a^14 - a^13 + 3*a^12 - 2*a^10 + a^9 + 3*a^8 - 3*a^6 + 3*a^5 + 3*a^4 - 2*a^3 - 2*a^2 + 3*a + 4, - a^15 + a^14 + 2*a^11 + a^10 - a^9 + a^8 + 2*a^7 - a^5 + 2*a^3 - a^2 - 3*a + 1, - -a^16 - a^15 - a^14 - a^13 - a^12 - a^11 - a^10 - a^9 - a^8 - a^7 - a^6 - a^5 - a^4 - a^3 - a^2 + 2, - -2*a^16 + 3*a^15 - 3*a^14 + 3*a^13 - 3*a^12 + a^11 - a^9 + 3*a^8 - 4*a^7 + 5*a^6 - 6*a^5 + 4*a^4 - 3*a^3 + 2*a^2 + 2*a - 4, - a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2, - 2*a^16 + a^15 - a^11 - 3*a^10 - 4*a^9 - 4*a^8 - 4*a^7 - 5*a^6 - 7*a^5 - 8*a^4 - 6*a^3 - 5*a^2 - 6*a - 7) + a^16 - 2*a^15 - 2*a^13 - a^12 - a^11 - 2*a^10 + a^9 - 2*a^8 + 2*a^7 - 3*a^6 - 3*a^4 - 2*a^3 - a^2 - 4*a + 2, + -a^15 - a^14 - 2*a^11 - a^10 + a^9 - a^8 - 2*a^7 + a^5 - 2*a^3 + a^2 + 3*a - 1, + -3*a^16 - 3*a^15 - 3*a^14 - 3*a^13 - 3*a^12 - 2*a^11 - 2*a^10 - 2*a^9 - a^8 + a^7 + 2*a^6 + 3*a^5 + 3*a^4 + 4*a^3 + 6*a^2 + 8*a + 8) TESTS: @@ -7123,7 +7129,7 @@ def units(self, proof=None): sage: K. = NumberField(1/2*x^2 - 1/6) sage: K.units() - (3*a - 2,) + (-3*a + 2,) """ proof = proof_flag(proof) @@ -7205,14 +7211,14 @@ def unit_group(self, proof=None): (u0, u1, u2, u3, u4, u5, u6, u7, u8) sage: U.gens_values() # result not independently verified [-1, - -a^9 - a + 1, + a^9 + a - 1, + -a^15 + a^12 - a^10 + a^9 + 2*a^8 - 3*a^7 - a^6 + 3*a^5 - a^4 - 4*a^3 + 3*a^2 + 2*a - 2, + a^15 + a^14 + a^13 + a^12 + a^10 - a^7 - a^6 - a^2 - 1, + 2*a^16 - 3*a^15 + 3*a^14 - 3*a^13 + 3*a^12 - a^11 + a^9 - 3*a^8 + 4*a^7 - 5*a^6 + 6*a^5 - 4*a^4 + 3*a^3 - 2*a^2 - 2*a + 4, -a^16 + a^15 - a^14 + a^12 - a^11 + a^10 + a^8 - a^7 + 2*a^6 - a^4 + 3*a^3 - 2*a^2 + 2*a - 1, - 2*a^16 - a^14 - a^13 + 3*a^12 - 2*a^10 + a^9 + 3*a^8 - 3*a^6 + 3*a^5 + 3*a^4 - 2*a^3 - 2*a^2 + 3*a + 4, - a^15 + a^14 + 2*a^11 + a^10 - a^9 + a^8 + 2*a^7 - a^5 + 2*a^3 - a^2 - 3*a + 1, - -a^16 - a^15 - a^14 - a^13 - a^12 - a^11 - a^10 - a^9 - a^8 - a^7 - a^6 - a^5 - a^4 - a^3 - a^2 + 2, - -2*a^16 + 3*a^15 - 3*a^14 + 3*a^13 - 3*a^12 + a^11 - a^9 + 3*a^8 - 4*a^7 + 5*a^6 - 6*a^5 + 4*a^4 - 3*a^3 + 2*a^2 + 2*a - 4, - a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2, - 2*a^16 + a^15 - a^11 - 3*a^10 - 4*a^9 - 4*a^8 - 4*a^7 - 5*a^6 - 7*a^5 - 8*a^4 - 6*a^3 - 5*a^2 - 6*a - 7] + a^16 - 2*a^15 - 2*a^13 - a^12 - a^11 - 2*a^10 + a^9 - 2*a^8 + 2*a^7 - 3*a^6 - 3*a^4 - 2*a^3 - a^2 - 4*a + 2, + -a^15 - a^14 - 2*a^11 - a^10 + a^9 - a^8 - 2*a^7 + a^5 - 2*a^3 + a^2 + 3*a - 1, + -3*a^16 - 3*a^15 - 3*a^14 - 3*a^13 - 3*a^12 - 2*a^11 - 2*a^10 - 2*a^9 - a^8 + a^7 + 2*a^6 + 3*a^5 + 3*a^4 + 4*a^3 + 6*a^2 + 8*a + 8] """ proof = proof_flag(proof) @@ -7261,8 +7267,8 @@ def S_unit_group(self, proof=None, S=None): sage: U = K.S_unit_group(S=a); U S-unit group with structure C10 x Z x Z x Z of Number Field in a with defining polynomial x^4 - 10*x^3 + 100*x^2 - 375*x + 1375 - with S = (Fractional ideal (5, 1/275*a^3 + 4/55*a^2 - 5/11*a + 5), - Fractional ideal (11, 1/275*a^3 + 4/55*a^2 - 5/11*a + 9)) + with S = (Fractional ideal (5, -7/275*a^3 + 1/11*a^2 - 9/11*a), + Fractional ideal (11, -7/275*a^3 + 1/11*a^2 - 9/11*a + 3)) sage: U.gens() (u0, u1, u2, u3) sage: U.gens_values() # random @@ -7273,8 +7279,8 @@ def S_unit_group(self, proof=None, S=None): sage: [u.multiplicative_order() for u in U.gens()] [10, +Infinity, +Infinity, +Infinity] sage: U.primes() - (Fractional ideal (5, 1/275*a^3 + 4/55*a^2 - 5/11*a + 5), - Fractional ideal (11, 1/275*a^3 + 4/55*a^2 - 5/11*a + 9)) + (Fractional ideal (5, -7/275*a^3 + 1/11*a^2 - 9/11*a), + Fractional ideal (11, -7/275*a^3 + 1/11*a^2 - 9/11*a + 3)) With the default value of `S`, the S-unit group is the same as the global unit group:: @@ -7426,8 +7432,8 @@ def S_unit_solutions(self, S=[], prec=106, include_exponents=False, include_boun sage: # needs sage.rings.padics sage: solutions, bound = K.S_unit_solutions(S, prec=100, include_bound=True) - sage: bound - 7 + sage: bound in (6, 7) + True """ from .S_unit_solver import solve_S_unit_equation return solve_S_unit_equation(self, S, prec, include_exponents, include_bound, proof) @@ -8782,7 +8788,7 @@ def subfields(self, degree=0, name=None): (Number Field in a1 with defining polynomial x^2 - 2, Ring morphism: From: Number Field in a1 with defining polynomial x^2 - 2 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a1 |--> a^2 + 3/2, None), + Defn: a1 |--> -a^2 - 3/2, None), (Number Field in a2 with defining polynomial x^2 + 4, Ring morphism: From: Number Field in a2 with defining polynomial x^2 + 4 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 @@ -8790,14 +8796,14 @@ def subfields(self, degree=0, name=None): (Number Field in a3 with defining polynomial x^2 + 2, Ring morphism: From: Number Field in a3 with defining polynomial x^2 + 2 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a3 |--> 2*a^3 + 5*a, None), + Defn: a3 |--> -2*a^3 - 5*a, None), (Number Field in a4 with defining polynomial x^4 + 1, Ring morphism: From: Number Field in a4 with defining polynomial x^4 + 1 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a4 |--> a^3 + 1/2*a^2 + 5/2*a + 3/4, Ring morphism: + Defn: a4 |--> -a^3 - 1/2*a^2 - 5/2*a - 3/4, Ring morphism: From: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 To: Number Field in a4 with defining polynomial x^4 + 1 - Defn: a |--> -1/2*a4^3 + a4^2 - 1/2*a4) + Defn: a |--> 1/2*a4^3 + a4^2 + 1/2*a4) ] """ return self._subfields_helper(degree=degree, name=name, @@ -12729,12 +12735,12 @@ def _splitting_classes_gens_(K, m, d): sage: L = K.subfields(20)[0][0] sage: L.conductor() # needs sage.groups 101 - sage: _splitting_classes_gens_(L,101,20) # needs sage.libs.gap # optional - gap_package_polycyclic + sage: _splitting_classes_gens_(L,101,20) # optional - gap_package_polycyclic, needs sage.libs.gap [95] sage: K = CyclotomicField(44) sage: L = K.subfields(4)[0][0] - sage: _splitting_classes_gens_(L,44,4) # needs sage.libs.gap # optional - gap_package_polycyclic + sage: _splitting_classes_gens_(L,44,4) # optional - gap_package_polycyclic, needs sage.libs.gap [37] sage: K = CyclotomicField(44) @@ -12746,7 +12752,7 @@ def _splitting_classes_gens_(K, m, d): with zeta44_0 = 3.837971894457990? sage: L.conductor() # needs sage.groups 11 - sage: _splitting_classes_gens_(L,11,5) # needs sage.libs.gap # optional - gap_package_polycyclic + sage: _splitting_classes_gens_(L,11,5) # optional - gap_package_polycyclic, needs sage.libs.gap [10] """ from sage.groups.abelian_gps.abelian_group import AbelianGroup diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 27432813b2b..1a676ee087b 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -1954,14 +1954,14 @@ cdef class NumberFieldElement(NumberFieldElement_base): sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^2 + 1) sage: (6*i + 6).factor() - (-i) * (i + 1)^3 * 3 + (i) * (-i - 1)^3 * 3 In the following example, the class number is 2. If a factorization in prime elements exists, we will find it:: sage: K. = NumberField(x^2 - 10) sage: factor(169*a + 531) - (-6*a - 19) * (-3*a - 1) * (-2*a + 9) + (-6*a - 19) * (2*a - 9) * (3*a + 1) sage: factor(K(3)) Traceback (most recent call last): ... @@ -4238,7 +4238,7 @@ cdef class NumberFieldElement(NumberFieldElement_base): sage: P5s = F(5).support() sage: P5s - [Fractional ideal (-t^2 - 1), Fractional ideal (t^2 - 2*t - 1)] + [Fractional ideal (t^2 + 1), Fractional ideal (t^2 - 2*t - 1)] sage: all(5 in P5 for P5 in P5s) True sage: all(P5.is_prime() for P5 in P5s) @@ -4487,7 +4487,7 @@ cdef class NumberFieldElement(NumberFieldElement_base): sage: f = Qi.embeddings(K)[0] sage: a = f(2+3*i) * (2-zeta)^2 sage: a.descend_mod_power(Qi,2) - [-2*i + 3, 3*i + 2] + [3*i + 2, 2*i - 3] An absolute example:: diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py index 3686840ccba..d22ded6f164 100644 --- a/src/sage/rings/number_field/number_field_ideal.py +++ b/src/sage/rings/number_field/number_field_ideal.py @@ -75,7 +75,7 @@ class NumberFieldIdeal(Ideal_generic): Fractional ideal (3) sage: F = pari(K).idealprimedec(5) sage: K.ideal(F[0]) - Fractional ideal (2*i + 1) + Fractional ideal (-2*i - 1) TESTS: @@ -236,7 +236,7 @@ def _richcmp_(self, other, op): sage: K. = NumberField(x^2 + 3); K Number Field in a with defining polynomial x^2 + 3 sage: f = K.factor(15); f - (Fractional ideal (1/2*a + 3/2))^2 * (Fractional ideal (5)) + (Fractional ideal (-a))^2 * (Fractional ideal (5)) sage: (f[0][0] < f[1][0]) True sage: (f[0][0] == f[0][0]) @@ -273,7 +273,7 @@ def _mul_(self, other): sage: A = K.ideal([5, 2 + I]) sage: B = K.ideal([13, 5 + 12*I]) sage: A*B - Fractional ideal (4*I - 7) + Fractional ideal (-4*I + 7) sage: (K.ideal(3 + I) * K.ideal(7 + I)).gens() (10*I + 20,) @@ -683,17 +683,17 @@ def free_module(self): sage: I.free_module() Free module of degree 4 and rank 4 over Integer Ring User basis matrix: - [ 4 0 0 0] - [ -3 7 -1 1] - [ 3 7 1 1] - [ 0 -10 0 -2] + [ 4 0 0 0] + [ 3 7 1 1] + [ 0 10 0 2] + [ 3 -7 1 -1] sage: J = I^(-1); J.free_module() Free module of degree 4 and rank 4 over Integer Ring User basis matrix: [ 1/4 0 0 0] - [-3/16 7/16 -1/16 1/16] [ 3/16 7/16 1/16 1/16] - [ 0 -5/8 0 -1/8] + [ 0 5/8 0 1/8] + [ 3/16 -7/16 1/16 -1/16] An example of intersecting ideals by intersecting free modules.:: @@ -790,7 +790,7 @@ def gens_reduced(self, proof=None): sage: J.is_principal() False sage: J.gens_reduced() - (5, a) + (5, -a) sage: all(j.parent() is K for j in J.gens()) True sage: all(j.parent() is K for j in J.gens_reduced()) @@ -2416,9 +2416,9 @@ def denominator(self): sage: I = K.ideal((3+4*i)/5); I Fractional ideal (4/5*i + 3/5) sage: I.denominator() - Fractional ideal (2*i + 1) + Fractional ideal (-2*i - 1) sage: I.numerator() - Fractional ideal (-i - 2) + Fractional ideal (2*i - 1) sage: I.numerator().is_integral() and I.denominator().is_integral() True sage: I.numerator() + I.denominator() == K.unit_ideal() @@ -2447,9 +2447,9 @@ def numerator(self): sage: I = K.ideal((3+4*i)/5); I Fractional ideal (4/5*i + 3/5) sage: I.denominator() - Fractional ideal (2*i + 1) + Fractional ideal (-2*i - 1) sage: I.numerator() - Fractional ideal (-i - 2) + Fractional ideal (2*i - 1) sage: I.numerator().is_integral() and I.denominator().is_integral() True sage: I.numerator() + I.denominator() == K.unit_ideal() @@ -3164,11 +3164,11 @@ def _p_quotient(self, p): Partially defined quotient map from Number Field in i with defining polynomial x^2 + 1 to an explicit vector space representation for the quotient of - the ring of integers by (p,I) for the ideal I=Fractional ideal (-i - 2). + the ring of integers by (p,I) for the ideal I=Fractional ideal (2*i - 1). sage: lift Lifting map to Gaussian Integers generated by i in Number Field in i with defining polynomial x^2 + 1 - from quotient of integers by Fractional ideal (-i - 2) + from quotient of integers by Fractional ideal (2*i - 1) """ return quotient_char_p(self, p) @@ -3213,11 +3213,11 @@ def residue_field(self, names=None): sage: K. = NumberField(x^2 + 1) sage: P1, P2 = [g[0] for g in K.factor(5)]; P1, P2 - (Fractional ideal (-i - 2), Fractional ideal (2*i + 1)) + (Fractional ideal (2*i - 1), Fractional ideal (-2*i - 1)) sage: a = 1/(1+2*i) sage: F1, F2 = [g.residue_field() for g in [P1, P2]]; F1, F2 - (Residue field of Fractional ideal (-i - 2), - Residue field of Fractional ideal (2*i + 1)) + (Residue field of Fractional ideal (2*i - 1), + Residue field of Fractional ideal (-2*i - 1)) sage: a.valuation(P1) 0 sage: F1(i/7) @@ -3230,7 +3230,7 @@ def residue_field(self, names=None): Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element -2/5*i + 1/5 - modulo Fractional ideal (2*i + 1): it has negative valuation + modulo Fractional ideal (-2*i - 1): it has negative valuation An example with a relative number field:: @@ -3491,7 +3491,7 @@ def quotient_char_p(I, p): [] sage: I = K.factor(13)[0][0]; I - Fractional ideal (-2*i + 3) + Fractional ideal (3*i + 2) sage: I.residue_class_degree() 1 sage: quotient_char_p(I, 13)[0] diff --git a/src/sage/rings/number_field/number_field_ideal_rel.py b/src/sage/rings/number_field/number_field_ideal_rel.py index 7f6cfd9b1b7..0bae4e74e13 100644 --- a/src/sage/rings/number_field/number_field_ideal_rel.py +++ b/src/sage/rings/number_field/number_field_ideal_rel.py @@ -11,7 +11,7 @@ sage: G = [from_A(z) for z in I.gens()]; G [7, -2*b*a - 1] sage: K.fractional_ideal(G) - Fractional ideal ((1/2*b + 2)*a - 1/2*b + 2) + Fractional ideal ((-1/2*b + 2)*a - 1/2*b - 2) sage: K.fractional_ideal(G).absolute_norm().factor() 7^2 @@ -277,7 +277,7 @@ def gens_reduced(self): sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] sage: P.gens_reduced() - (2, -15*a*b + 3*a + 1) + (2, -15*a*b - 3*a + 1) """ try: # Compute the single generator, if it exists @@ -385,7 +385,7 @@ def relative_norm(self): sage: K. = NumberField(x^2 + 6) sage: L. = K.extension(K['x'].gen()^4 + a) sage: N = L.ideal(b).relative_norm(); N - Fractional ideal (-a) + Fractional ideal (a) sage: N.parent() Monoid of ideals of Number Field in a with defining polynomial x^2 + 6 sage: N.ring() @@ -410,7 +410,7 @@ def relative_norm(self): sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] sage: P.relative_norm() - Fractional ideal (6*a + 2) + Fractional ideal (6*a - 2) """ L = self.number_field() K = L.base_field() @@ -529,7 +529,7 @@ def ideal_below(self): sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] sage: P.ideal_below() - Fractional ideal (6*a + 2) + Fractional ideal (6*a - 2) """ L = self.number_field() K = L.base_field() @@ -548,14 +548,12 @@ def factor(self): sage: x = polygen(ZZ, 'x') sage: K. = QQ.extension([x^2 + 11, x^2 - 5]) sage: K.factor(5) - (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 3/4))^2 - * (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 7/4))^2 + (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 3/4))^2 * (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 7/4))^2 sage: K.ideal(5).factor() - (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 3/4))^2 - * (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 7/4))^2 + (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 3/4))^2 * (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 7/4))^2 sage: K.ideal(5).prime_factors() - [Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 3/4), - Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 7/4)] + [Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 3/4), + Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 7/4)] sage: PQ. = QQ[] sage: F. = NumberFieldTower([X^2 - 2, X^2 - 3]) @@ -914,7 +912,7 @@ def is_NumberFieldFractionalIdeal_rel(x): sage: is_NumberFieldFractionalIdeal_rel(I) True sage: N = I.relative_norm(); N - Fractional ideal (-a) + Fractional ideal (a) sage: is_NumberFieldFractionalIdeal_rel(N) False """ diff --git a/src/sage/rings/number_field/number_field_rel.py b/src/sage/rings/number_field/number_field_rel.py index 7ea070b113e..a1d5ab38176 100644 --- a/src/sage/rings/number_field/number_field_rel.py +++ b/src/sage/rings/number_field/number_field_rel.py @@ -233,21 +233,21 @@ def __init__(self, base, polynomial, name, sage: l. = k.extension(5*x^2 + 3); l Number Field in b with defining polynomial 5*x^2 + 3 over its base field sage: l.pari_rnf() - [x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4), ..., y^4 + 6*y^2 + 1, x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4)], [0, 0]] + [x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4), ..., y^4 + 6*y^2 + 1, x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4)], [0, 0]] sage: b b sage: l. = k.extension(x^2 + 3/5); l Number Field in b with defining polynomial x^2 + 3/5 over its base field sage: l.pari_rnf() - [x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4), ..., y^4 + 6*y^2 + 1, x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4)], [0, 0]] + [x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4), ..., y^4 + 6*y^2 + 1, x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4)], [0, 0]] sage: b b sage: l. = k.extension(x - 1/a0); l Number Field in b with defining polynomial x + 1/2*a0 over its base field sage: l.pari_rnf() - [x, [4, -x^3 - x^2 - 7*x - 3, -x^3 + x^2 - 7*x + 3, 2*x^3 + 10*x], ..., [x^4 + 6*x^2 + 1, -x, -1, y^4 + 6*y^2 + 1, x], [0, 0]] + [x, [4, -x^3 + x^2 - 7*x + 3, -2*x^3 - 10*x, x^3 + x^2 + 7*x + 3], ..., [x^4 + 6*x^2 + 1, -x, -1, y^4 + 6*y^2 + 1, x], [0, 0]] sage: b -1/2*a0 @@ -1635,9 +1635,9 @@ def _pari_relative_structure(self): sage: K. = NumberField(x^2 + 1) sage: L. = K.extension(x^2 - 1/2) sage: L._pari_relative_structure() - (x^2 + Mod(-y, y^2 + 1), - Mod(Mod(1/2*y - 1/2, y^2 + 1)*x, x^2 + Mod(-y, y^2 + 1)), - Mod(Mod(-y - 1, y^2 + 1)*x, Mod(1, y^2 + 1)*x^2 + Mod(-1/2, y^2 + 1))) + (x^2 + Mod(y, y^2 + 1), + Mod(Mod(-1/2*y - 1/2, y^2 + 1)*x, x^2 + Mod(y, y^2 + 1)), + Mod(Mod(y - 1, y^2 + 1)*x, x^2 + Mod(-1/2, y^2 + 1))) An example where both fields are defined by non-integral or non-monic polynomials:: @@ -1937,7 +1937,7 @@ def absolute_polynomial(self): sage: k.relative_polynomial() x^2 + 1/3 sage: k.pari_relative_polynomial() - x^2 + Mod(y, y^2 + 1)*x - 1 + x^2 + Mod(-y, y^2 + 1)*x - 1 """ return QQ['x'](self._pari_rnfeq()[0]) @@ -2724,7 +2724,7 @@ def uniformizer(self, P, others='positive'): sage: x = polygen(ZZ, 'x') sage: K. = NumberField([x^2 + 23, x^2 - 3]) sage: P = K.prime_factors(5)[0]; P - Fractional ideal (5, 1/2*a + b - 5/2) + Fractional ideal (5, -1/2*a + b + 5/2) sage: u = K.uniformizer(P) sage: u.valuation(P) 1 diff --git a/src/sage/rings/number_field/order.py b/src/sage/rings/number_field/order.py index 55db3bbbcbf..8b69baf5464 100644 --- a/src/sage/rings/number_field/order.py +++ b/src/sage/rings/number_field/order.py @@ -495,7 +495,7 @@ def fractional_ideal(self, *args, **kwds): sage: K. = NumberField(x^2 + 2) sage: R = K.maximal_order() sage: R.fractional_ideal(2/3 + 7*a, a) - Fractional ideal (1/3*a) + Fractional ideal (-1/3*a) """ return self.number_field().fractional_ideal(*args, **kwds) @@ -569,7 +569,7 @@ def __mul__(self, right): sage: k. = NumberField(x^2 + 5077); G = k.class_group(); G Class group of order 22 with structure C22 of Number Field in a with defining polynomial x^2 + 5077 sage: G.0 ^ -9 - Fractional ideal class (43, a + 13) + Fractional ideal class (67, a + 45) sage: Ok = k.maximal_order(); Ok Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 5077 sage: Ok * (11, a + 7) @@ -2918,7 +2918,7 @@ def GaussianIntegers(names='I', latex_name='i'): sage: ZZI Gaussian Integers generated by I in Number Field in I with defining polynomial x^2 + 1 with I = 1*I sage: factor(3 + I) - (-I) * (I + 1) * (2*I + 1) + (-I) * (I - 2) * (-I + 1) sage: CC(I) 1.00000000000000*I sage: I.minpoly() @@ -2949,7 +2949,7 @@ def EisensteinIntegers(names='omega'): with defining polynomial x^2 + x + 1 with omega = -0.50000000000000000? + 0.866025403784439?*I sage: factor(3 + omega) - (-1) * (-omega - 3) + (omega + 1) * (-2*omega + 1) sage: CC(omega) -0.500000000000000 + 0.866025403784439*I sage: omega.minpoly() diff --git a/src/sage/rings/number_field/selmer_group.py b/src/sage/rings/number_field/selmer_group.py index 5204cfc80b6..33f23ff8f2c 100644 --- a/src/sage/rings/number_field/selmer_group.py +++ b/src/sage/rings/number_field/selmer_group.py @@ -71,7 +71,7 @@ def _ideal_generator(I): sage: K. = QuadraticField(-11) sage: [_ideal_generator(K.prime_above(p)) for p in primes(25)] - [2, 1/2*a - 1/2, -1/2*a - 3/2, 7, -a, 13, 17, 19, 1/2*a + 9/2] + [2, 1/2*a - 1/2, -1/2*a - 3/2, 7, a, 13, 17, 19, 1/2*a + 9/2] """ try: return I.gens_reduced()[0] diff --git a/src/sage/rings/polynomial/polynomial_quotient_ring.py b/src/sage/rings/polynomial/polynomial_quotient_ring.py index e12977e8464..c5bf39a1c73 100644 --- a/src/sage/rings/polynomial/polynomial_quotient_ring.py +++ b/src/sage/rings/polynomial/polynomial_quotient_ring.py @@ -1429,13 +1429,13 @@ def S_class_group(self, S, proof=True): sage: R. = K[] sage: S. = R.quotient(x^2 + 23) sage: S.S_class_group([]) - [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)] + [((2, a + 1, -1/2*xbar + 3/2, 1/2*a*xbar - 1/2*a + 1), 6)] sage: S.S_class_group([K.ideal(3, a-1)]) [] sage: S.S_class_group([K.ideal(2, a+1)]) [] sage: S.S_class_group([K.ideal(a)]) - [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)] + [((2, a + 1, -1/2*xbar + 3/2, 1/2*a*xbar - 1/2*a + 1), 6)] Now we take an example over a nontrivial base with two factors, each contributing to the class group:: @@ -1495,14 +1495,14 @@ def S_class_group(self, S, proof=True): sage: C = S.S_class_group([]) sage: C[:2] [((1/4*xbar^2 + 31/4, - (-1/8*a + 1/8)*xbar^2 - 31/8*a + 31/8, - 1/16*xbar^3 + 1/16*xbar^2 + 31/16*xbar + 31/16, - -1/16*a*xbar^3 + (1/16*a + 1/8)*xbar^2 - 31/16*a*xbar + 31/16*a + 31/8), + (1/8*a + 1/8)*xbar^2 + 31/8*a + 31/8, + -1/16*xbar^3 + 3/16*xbar^2 - 31/16*xbar + 93/16, + 1/16*a*xbar^3 + (-1/16*a + 1/8)*xbar^2 + 31/16*a*xbar - 31/16*a + 31/8), 6), ((-1/4*xbar^2 - 23/4, - (1/8*a - 1/8)*xbar^2 + 23/8*a - 23/8, - -1/16*xbar^3 - 1/16*xbar^2 - 23/16*xbar - 23/16, - 1/16*a*xbar^3 + (-1/16*a - 1/8)*xbar^2 + 23/16*a*xbar - 23/16*a - 23/8), + (-1/8*a - 1/8)*xbar^2 - 23/8*a - 23/8, + 1/16*xbar^3 + 1/16*xbar^2 + 23/16*xbar + 23/16, + -1/16*a*xbar^3 + (1/16*a - 1/8)*xbar^2 - 23/16*a*xbar + 23/16*a - 23/8), 6)] sage: C[2][1] 2 @@ -1514,11 +1514,11 @@ def S_class_group(self, S, proof=True): ....: 1/16*a*xbar^3 - 1/16*a*xbar^2 + 23/16*a*xbar - 23/16*a) sage: gens[0] == expected_gens[0] True - sage: gens[1] in (expected_gens[1], expected_gens[1]/2 + expected_gens[0]/2) + sage: gens[1] in (expected_gens[1], expected_gens[1]/2 + expected_gens[0]/2, -expected_gens[1]/2 + expected_gens[0]/2) True - sage: gens[2] in (expected_gens[2], expected_gens[2] + expected_gens[0]/2) + sage: gens[2] in (expected_gens[2], expected_gens[2] + expected_gens[0]/2, -expected_gens[2] + expected_gens[0]/2) True - sage: gens[3] in (expected_gens[3], expected_gens[3] + expected_gens[0]/2) + sage: gens[3] in (expected_gens[3], expected_gens[3] + expected_gens[0]/2, -expected_gens[3] + expected_gens[0]/2) True """ fields, isos, iso_classes = self._S_decomposition(tuple(S)) @@ -1611,7 +1611,7 @@ def class_group(self, proof=True): sage: R. = K[] sage: S. = R.quotient(x^2 + 23) sage: S.class_group() - [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)] + [((2, a + 1, -1/2*xbar + 3/2, 1/2*a*xbar - 1/2*a + 1), 6)] Here is an example of a product of number fields, both of which contribute to the class group:: @@ -1711,19 +1711,19 @@ def S_units(self, S, proof=True): with defining polynomial x^2 + 3 with a = 1.732050807568878?*I with modulus y^3 + 5 sage: [u for u, o in L.S_units([]) if o is Infinity] - [(-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + [(-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] sage: [u for u, o in L.S_units([K.ideal(1/2*a - 3/2)]) ....: if o is Infinity] [(-1/6*a - 1/2)*b^2 + (1/3*a - 1)*b + 4/3*a, - (-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + (-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] sage: [u for u, o in L.S_units([K.ideal(2)]) if o is Infinity] [(1/2*a - 1/2)*b^2 + (a + 1)*b + 3, - (1/6*a + 1/2)*b^2 + (-1/3*a + 1)*b - 5/6*a + 1/2, (1/6*a + 1/2)*b^2 + (-1/3*a + 1)*b - 5/6*a - 1/2, - (-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + 1/3*a*b^2 + (1/3*a + 1)*b - 1/6*a + 3/2, + (-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] Note that all the returned values live where we expect them to:: @@ -1808,8 +1808,8 @@ def units(self, proof=True): with defining polynomial x^2 + 3 with a = 1.732050807568878?*I with modulus y^3 + 5 sage: [u for u, o in L.units() if o is Infinity] - [(-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + [(-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] sage: L. = K.extension(y^3 + 5) sage: L.unit_group() Unit group with structure C6 x Z x Z of @@ -1817,8 +1817,8 @@ def units(self, proof=True): sage: L.unit_group().gens() # abstract generators (u0, u1, u2) sage: L.unit_group().gens_values()[1:] - [(-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + [(-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] Note that all the returned values live where we expect them to:: diff --git a/src/sage/rings/qqbar.py b/src/sage/rings/qqbar.py index 300d64b8279..08c04e6e234 100644 --- a/src/sage/rings/qqbar.py +++ b/src/sage/rings/qqbar.py @@ -2776,11 +2776,12 @@ def number_field_elements_from_algebraics(numbers, minimal=False, To: Algebraic Real Field Defn: a |--> 1.732050807568878?) sage: number_field_elements_from_algebraics((rt2,qqI)) # needs sage.symbolic - (Number Field in a with defining polynomial y^4 + 1, [-a^3 + a, a^2], + (Number Field in a with defining polynomial y^4 + 1, + [a^3 - a, a^2], Ring morphism: - From: Number Field in a with defining polynomial y^4 + 1 - To: Algebraic Field - Defn: a |--> 0.7071067811865475? + 0.7071067811865475?*I) + From: Number Field in a with defining polynomial y^4 + 1 + To: Algebraic Field + Defn: a |--> -0.7071067811865475? - 0.7071067811865475?*I) Note that for the first example, where \sage does not realize that the number is real, we get a homomorphism to ``QQbar``:: @@ -4590,8 +4591,7 @@ def _exact_field(self): Number Field in a with defining polynomial y^4 - 20*y^2 + 81 with a in -3.789313782671036? sage: (QQbar(7)^(3/5))._exact_field() - Number Field in a with defining polynomial - y^5 - 2*y^4 - 18*y^3 + 38*y^2 + 82*y - 181 with a in 2.554256611698490? + Number Field in a with defining polynomial y^5 - 7 with a in 1.475773161594552? """ sd = self._descr if isinstance(sd, (ANRational, ANExtensionElement)): @@ -4611,7 +4611,7 @@ def _exact_value(self): sage: (sqrt(QQbar(2)) + sqrt(QQbar(19)))._exact_value() -1/9*a^3 + a^2 + 11/9*a - 10 where a^4 - 20*a^2 + 81 = 0 and a in -3.789313782671036? sage: (QQbar(7)^(3/5))._exact_value() - 2*a^4 + 2*a^3 - 34*a^2 - 17*a + 150 where a^5 - 2*a^4 - 18*a^3 + 38*a^2 + 82*a - 181 = 0 and a in 2.554256611698490? + a^3 where a^5 - 7 = 0 and a in 1.475773161594552? """ sd = self._descr if isinstance(sd, (ANRational, ANExtensionElement)): @@ -7839,8 +7839,8 @@ def handle_sage_input(self, sib, coerce, is_qqbar): sage: sage_input(v, verify=True) # Verified R. = QQ[] - v = QQbar.polynomial_root(AA.common_polynomial(y^8 - y^7 + y^5 - y^4 + y^3 - y + 1), CIF(RIF(RR(0.91354545764260087), RR(0.91354545764260098)), RIF(RR(0.40673664307580015), RR(0.40673664307580021)))) - v^5 + v^3 + v = QQbar.polynomial_root(AA.common_polynomial(y^8 - y^7 + y^5 - y^4 + y^3 - y + 1), CIF(RIF(RR(0.66913060635885813), RR(0.66913060635885824)), RIF(-RR(0.74314482547739424), -RR(0.74314482547739413)))) + v^6 + v^5 sage: v = QQbar(sqrt(AA(2))) sage: v.exactify() sage: sage_input(v, verify=True) diff --git a/src/sage/rings/rational.pyx b/src/sage/rings/rational.pyx index 272650abeef..0dbe3453dd2 100644 --- a/src/sage/rings/rational.pyx +++ b/src/sage/rings/rational.pyx @@ -1446,7 +1446,7 @@ cdef class Rational(sage.structure.element.FieldElement): sage: 0.is_norm(K) True sage: (1/7).is_norm(K, element=True) - (True, 1/7*beta + 3/7) + (True, -3/7*beta + 5/7) sage: (1/10).is_norm(K, element=True) (False, None) sage: (1/691).is_norm(QQ, element=True) @@ -1558,7 +1558,7 @@ cdef class Rational(sage.structure.element.FieldElement): EXAMPLES:: sage: QQ(2)._bnfisnorm(QuadraticField(-1, 'i')) # needs sage.rings.number_field - (i + 1, 1) + (-i + 1, 1) sage: x = polygen(QQ, 'x') sage: 7._bnfisnorm(NumberField(x^3 - 2, 'b')) # needs sage.rings.number_field (1, 7) diff --git a/src/sage/schemes/affine/affine_morphism.py b/src/sage/schemes/affine/affine_morphism.py index 0eba4c662ec..2208cefca1d 100755 --- a/src/sage/schemes/affine/affine_morphism.py +++ b/src/sage/schemes/affine/affine_morphism.py @@ -1158,13 +1158,11 @@ def reduce_base_field(self): sage: H = End(A) sage: f = H([QQbar(3^(1/3))*x^2 + QQbar(sqrt(-2))]) # needs sage.symbolic sage: f.reduce_base_field() # needs sage.symbolic - Scheme endomorphism of Affine Space of dimension 1 over Number - Field in a with defining polynomial y^6 + 6*y^4 - 6*y^3 + 12*y^2 + 36*y + 17 - with a = 1.442249570307409? + 1.414213562373095?*I + Scheme endomorphism of Affine Space of dimension 1 over Number Field in a with defining polynomial y^6 + 6*y^4 - 6*y^3 + 12*y^2 + 36*y + 17 with a = 1.442249570307409? - 1.414213562373095?*I Defn: Defined on coordinates by sending (x) to ((-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 - 772/269*a - - 1092/269)*x^2 + (48/269*a^5 - 27/269*a^4 + 320/269*a^3 - 468/269*a^2 - + 1041/269*a + 1092/269)) + - 1092/269)*x^2 + (-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 + - 1041/269*a - 1092/269)) :: diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index a63dbf57809..84a719adfbb 100755 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -902,7 +902,7 @@ def division_field(self, n, names='t', map=False, **kwds): by y^2 = x^3 + 5*a0*x^2 + (-200*a0^2)*x + (-42000*a0^2+42000*a0+126000) over Number Field in a0 with defining polynomial x^3 - 3*x^2 + 3*x + 9 sage: K. = E.division_field(3, simplify_all=True); K - Number Field in b with defining polynomial x^12 - 25*x^10 + 130*x^8 + 645*x^6 + 1050*x^4 + 675*x^2 + 225 + Number Field in b with defining polynomial x^12 + 5*x^10 + 40*x^8 + 315*x^6 + 750*x^4 + 675*x^2 + 2025 Some higher-degree examples:: diff --git a/src/sage/schemes/elliptic_curves/ell_local_data.py b/src/sage/schemes/elliptic_curves/ell_local_data.py index 7434659b5a2..df076ed62b6 100755 --- a/src/sage/schemes/elliptic_curves/ell_local_data.py +++ b/src/sage/schemes/elliptic_curves/ell_local_data.py @@ -1161,7 +1161,7 @@ def check_prime(K, P): sage: check_prime(K, a + 1) Fractional ideal (a + 1) sage: [check_prime(K, P) for P in K.primes_above(31)] - [Fractional ideal (5/2*a + 1/2), Fractional ideal (5/2*a - 1/2)] + [Fractional ideal (-5/2*a - 1/2), Fractional ideal (-5/2*a + 1/2)] sage: L. = NumberField(x^2 + 3) sage: check_prime(K, L.ideal(5)) Traceback (most recent call last): diff --git a/src/sage/schemes/elliptic_curves/ell_number_field.py b/src/sage/schemes/elliptic_curves/ell_number_field.py index eea2e5cc243..aab39b49932 100755 --- a/src/sage/schemes/elliptic_curves/ell_number_field.py +++ b/src/sage/schemes/elliptic_curves/ell_number_field.py @@ -229,9 +229,9 @@ def simon_two_descent(self, verbose=0, lim1=2, lim3=4, limtriv=2, sage: E == loads(dumps(E)) True sage: E.simon_two_descent() - (2, 2, [(0 : 0 : 1), (1/18*a + 7/18 : -5/54*a - 17/54 : 1)]) + (2, 2, [(0 : 0 : 1), (1/8*a + 5/8 : -3/16*a - 7/16 : 1)]) sage: E.simon_two_descent(lim1=5, lim3=5, limtriv=10, maxprob=7, limbigprime=10) - (2, 2, [(-1 : 0 : 1), (-2 : -1/2*a - 1/2 : 1)]) + (2, 2, [(-1 : 0 : 1), (1/2*a - 5/2 : -1/2*a - 13/2 : 1)]) :: @@ -277,7 +277,7 @@ def simon_two_descent(self, verbose=0, lim1=2, lim3=4, limtriv=2, sage: E.simon_two_descent() # long time (4s on sage.math, 2013) (3, 3, - [(1/8*zeta43_0^2 - 3/8*zeta43_0 - 1/4 : -5/16*zeta43_0^2 + 7/16*zeta43_0 + 1/8 : 1), + [(-1/2*zeta43_0^2 - 1/2*zeta43_0 + 7 : -3/2*zeta43_0^2 - 5/2*zeta43_0 + 18 : 1), (0 : 0 : 1)]) """ verbose = int(verbose) @@ -872,7 +872,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): sage: K. = NumberField(x^2 + 1) sage: E = EllipticCurve([1 + i, 0, 1, 0, 0]) sage: E.local_data() - [Local data at Fractional ideal (2*i + 1): + [Local data at Fractional ideal (-2*i - 1): Reduction type: bad non-split multiplicative Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1 @@ -880,7 +880,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): Conductor exponent: 1 Kodaira Symbol: I1 Tamagawa Number: 1, - Local data at Fractional ideal (-2*i + 3): + Local data at Fractional ideal (3*i + 2): Reduction type: bad split multiplicative Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1 @@ -898,7 +898,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): Kodaira Symbol: I0 Tamagawa Number: 1 sage: E.local_data(2*i + 1) - Local data at Fractional ideal (2*i + 1): + Local data at Fractional ideal (-2*i - 1): Reduction type: bad non-split multiplicative Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1 @@ -1456,8 +1456,10 @@ def kodaira_symbol(self, P, proof=None): sage: K. = NumberField(x^2 - 5) sage: E = EllipticCurve([20, 225, 750, 625*a + 6875, 31250*a + 46875]) sage: bad_primes = E.discriminant().support(); bad_primes - [Fractional ideal (-a), Fractional ideal (7/2*a - 81/2), - Fractional ideal (-a - 52), Fractional ideal (2)] + [Fractional ideal (-a), + Fractional ideal (-7/2*a + 81/2), + Fractional ideal (-a - 52), + Fractional ideal (2)] sage: [E.kodaira_symbol(P) for P in bad_primes] [I0, I1, I1, II] sage: K. = QuadraticField(-11) @@ -1483,7 +1485,7 @@ def conductor(self): sage: K. = NumberField(x^2 + 1) sage: EllipticCurve([i, i - 1, i + 1, 24*i + 15, 14*i + 35]).conductor() - Fractional ideal (21*i - 3) + Fractional ideal (3*i + 21) sage: K. = NumberField(x^2 - x + 3) sage: EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor() Fractional ideal (-6*a) @@ -2584,8 +2586,8 @@ def isogeny_class(self, reducible_primes=None, algorithm='Billerey', minimal_mod sage: [E1.ainvs() for E1 in C] [(0, 0, 0, 0, -27), (0, 0, 0, 0, 1), - (i + 1, i, i + 1, -i + 3, 4*i), - (i + 1, i, i + 1, -i + 33, -58*i)] + (i + 1, i, 0, 3, -i), + (i + 1, i, 0, 33, 91*i)] The matrix of degrees of cyclic isogenies between curves:: @@ -2616,13 +2618,13 @@ class :class:`EllipticCurveIsogeny` allowed composition. In sage: [((i,j), isogs[i][j].x_rational_map()) ....: for i in range(4) for j in range(4) if isogs[i][j] != 0] [((0, 1), (1/9*x^3 - 12)/x^2), - ((0, 3), (-1/2*i*x^2 + i*x - 12*i)/(x - 3)), + ((0, 3), (1/2*i*x^2 - 2*i*x + 15*i)/(x - 3)), ((1, 0), (x^3 + 4)/x^2), - ((1, 2), (-1/2*i*x^2 - i*x - 2*i)/(x + 1)), - ((2, 1), (1/2*i*x^2 - x)/(x + 3/2*i)), - ((2, 3), (x^3 + 4*i*x^2 - 10*x - 10*i)/(x^2 + 4*i*x - 4)), - ((3, 0), (1/2*i*x^2 + x + 4*i)/(x - 5/2*i)), - ((3, 2), (1/9*x^3 - 4/3*i*x^2 - 34/3*x + 226/9*i)/(x^2 - 8*i*x - 16))] + ((1, 2), (1/2*i*x^2 + i)/(x + 1)), + ((2, 1), (-1/2*i*x^2 - 1/2*i)/(x - 1/2*i)), + ((2, 3), (x^3 - 2*i*x^2 - 7*x + 4*i)/(x^2 - 2*i*x - 1)), + ((3, 0), (-1/2*i*x^2 + 2*x - 5/2*i)/(x + 7/2*i)), + ((3, 2), (1/9*x^3 + 2/3*i*x^2 - 13/3*x - 116/9*i)/(x^2 + 10*i*x - 25))] The isogeny class may be visualized by obtaining its graph and plotting it:: @@ -3103,10 +3105,10 @@ def is_isogenous(self, other, proof=True, maxnorm=100): sage: K. = QuadraticField(-1) sage: E1 = EllipticCurve([i + 1, 0, 1, -240*i - 400, -2869*i - 2627]) sage: E1.conductor() - Fractional ideal (-4*i - 7) + Fractional ideal (4*i + 7) sage: E2 = EllipticCurve([1+i,0,1,0,0]) sage: E2.conductor() - Fractional ideal (-4*i - 7) + Fractional ideal (4*i + 7) sage: E1.is_isogenous(E2) # long time True sage: E1.is_isogenous(E2, proof=False) # faster (~170ms) @@ -3433,8 +3435,8 @@ def lll_reduce(self, points, height_matrix=None, precision=None): sage: Q = E(0,-1) sage: E.lll_reduce([P,Q]) ( - [0 1] - [(0 : -1 : 1), (-2 : -1/2*a - 1/2 : 1)], [1 0] + [ 0 -1] + [(0 : -1 : 1), (-2 : 1/2*a - 1/2 : 1)], [ 1 0] ) :: @@ -3445,9 +3447,10 @@ def lll_reduce(self, points, height_matrix=None, precision=None): ....: E.point([-17/18*a - 1/9, -109/108*a - 277/108])] sage: E.lll_reduce(points) ( - [(-a + 4 : -3*a + 7 : 1), (-17/18*a - 1/9 : 109/108*a + 277/108 : 1)], - [ 1 0] - [ 1 -1] + [(-a + 4 : -3*a + 7 : 1), (-17/18*a - 1/9 : -109/108*a - 277/108 : 1)], + + [1 0] + [1 1] ) """ r = len(points) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index d9b7189552e..a3962575963 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -2679,10 +2679,10 @@ def has_good_reduction(self, P=None): sage: K. = NumberField(x^2 + 1) sage: E = EllipticCurve(K, [0,1,0,-160,308]) sage: P = E(26, -120) - sage: E.discriminant().support() - [Fractional ideal (i + 1), - Fractional ideal (-i - 2), - Fractional ideal (2*i + 1), + sage: E.discriminant().support() # random + [Fractional ideal (-i - 1), + Fractional ideal (2*i - 1), + Fractional ideal (-2*i - 1), Fractional ideal (3)] sage: [E.tamagawa_exponent(p) for p in E.discriminant().support()] [1, 4, 4, 4] diff --git a/src/sage/schemes/elliptic_curves/ell_rational_field.py b/src/sage/schemes/elliptic_curves/ell_rational_field.py index d00187d49a2..fd8980f8b0d 100755 --- a/src/sage/schemes/elliptic_curves/ell_rational_field.py +++ b/src/sage/schemes/elliptic_curves/ell_rational_field.py @@ -1848,7 +1848,7 @@ def simon_two_descent(self, verbose=0, lim1=5, lim3=50, limtriv=3, sage: E = EllipticCurve('389a1') sage: E._known_points = [] # clear cached points sage: E.simon_two_descent() - (2, 2, [(5/4 : 5/8 : 1), (-3/4 : 7/8 : 1)]) + (2, 2, [(-3/4 : 7/8 : 1), (5/4 : 5/8 : 1)]) sage: E = EllipticCurve('5077a1') sage: E.simon_two_descent() (3, 3, [(1 : 0 : 1), (2 : 0 : 1), (0 : 2 : 1)]) diff --git a/src/sage/schemes/elliptic_curves/gal_reps_number_field.py b/src/sage/schemes/elliptic_curves/gal_reps_number_field.py index a4eb66a6df7..8b597e41595 100755 --- a/src/sage/schemes/elliptic_curves/gal_reps_number_field.py +++ b/src/sage/schemes/elliptic_curves/gal_reps_number_field.py @@ -800,17 +800,17 @@ def deg_one_primes_iter(K, principal_only=False): [Fractional ideal (2, a + 1), Fractional ideal (3, a + 1), Fractional ideal (3, a + 2), - Fractional ideal (a), + Fractional ideal (-a), Fractional ideal (7, a + 3), Fractional ideal (7, a + 4)] sage: it = deg_one_primes_iter(K, True) sage: [next(it) for _ in range(6)] - [Fractional ideal (a), - Fractional ideal (-2*a + 3), - Fractional ideal (2*a + 3), + [Fractional ideal (-a), + Fractional ideal (2*a - 3), + Fractional ideal (-2*a - 3), Fractional ideal (a + 6), Fractional ideal (a - 6), - Fractional ideal (-3*a + 4)] + Fractional ideal (3*a - 4)] """ # imaginary quadratic fields have no principal primes of norm < disc / 4 start = K.discriminant().abs() // 4 if principal_only and K.signature() == (0,1) else 2 diff --git a/src/sage/schemes/elliptic_curves/gp_simon.py b/src/sage/schemes/elliptic_curves/gp_simon.py index 6be377e2f74..4134ae1b7a6 100644 --- a/src/sage/schemes/elliptic_curves/gp_simon.py +++ b/src/sage/schemes/elliptic_curves/gp_simon.py @@ -49,7 +49,7 @@ def simon_two_descent(E, verbose=0, lim1=None, lim3=None, limtriv=None, doctest:warning...: DeprecationWarning: please use the 2-descent algorithm over QQ inside pari See https://github.com/sagemath/sage/issues/38461 for details. - (2, 2, [(5/4 : 5/8 : 1), (-3/4 : 7/8 : 1)]) + (2, 2, [(-3/4 : 7/8 : 1), (5/4 : 5/8 : 1)]) TESTS:: diff --git a/src/sage/schemes/elliptic_curves/isogeny_class.py b/src/sage/schemes/elliptic_curves/isogeny_class.py index 13edc68a022..a83fd8705ac 100755 --- a/src/sage/schemes/elliptic_curves/isogeny_class.py +++ b/src/sage/schemes/elliptic_curves/isogeny_class.py @@ -223,8 +223,8 @@ def _repr_(self): sage: C.curves [Elliptic Curve defined by y^2 = x^3 + (-27) over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, Elliptic Curve defined by y^2 = x^3 + 1 over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, - Elliptic Curve defined by y^2 + (i+1)*x*y + (i+1)*y = x^3 + i*x^2 + (-i+3)*x + 4*i over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, - Elliptic Curve defined by y^2 + (i+1)*x*y + (i+1)*y = x^3 + i*x^2 + (-i+33)*x + (-58*i) over Number Field in i with defining polynomial x^2 + 1 with i = 1*I] + Elliptic Curve defined by y^2 + (i+1)*x*y = x^3 + i*x^2 + 3*x + (-i) over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, + Elliptic Curve defined by y^2 + (i+1)*x*y = x^3 + i*x^2 + 33*x + 91*i over Number Field in i with defining polynomial x^2 + 1 with i = 1*I] """ if self._label: return "Elliptic curve isogeny class %s" % (self._label) @@ -615,8 +615,8 @@ def __init__(self, E, reducible_primes=None, algorithm='Billerey', minimal_model sage: [E1.ainvs() for E1 in C] [(0, 0, 0, 0, -27), (0, 0, 0, 0, 1), - (i + 1, i, i + 1, -i + 3, 4*i), - (i + 1, i, i + 1, -i + 33, -58*i)] + (i + 1, i, 0, 3, -i), + (i + 1, i, 0, 33, 91*i)] The matrix of degrees of cyclic isogenies between curves:: @@ -647,13 +647,13 @@ class :class:`EllipticCurveIsogeny` allowed composition. In sage: [((i,j), isogs[i][j].x_rational_map()) ....: for i in range(4) for j in range(4) if isogs[i][j] != 0] [((0, 1), (1/9*x^3 - 12)/x^2), - ((0, 3), (-1/2*i*x^2 + i*x - 12*i)/(x - 3)), + ((0, 3), (1/2*i*x^2 - 2*i*x + 15*i)/(x - 3)), ((1, 0), (x^3 + 4)/x^2), - ((1, 2), (-1/2*i*x^2 - i*x - 2*i)/(x + 1)), - ((2, 1), (1/2*i*x^2 - x)/(x + 3/2*i)), - ((2, 3), (x^3 + 4*i*x^2 - 10*x - 10*i)/(x^2 + 4*i*x - 4)), - ((3, 0), (1/2*i*x^2 + x + 4*i)/(x - 5/2*i)), - ((3, 2), (1/9*x^3 - 4/3*i*x^2 - 34/3*x + 226/9*i)/(x^2 - 8*i*x - 16))] + ((1, 2), (1/2*i*x^2 + i)/(x + 1)), + ((2, 1), (-1/2*i*x^2 - 1/2*i)/(x - 1/2*i)), + ((2, 3), (x^3 - 2*i*x^2 - 7*x + 4*i)/(x^2 - 2*i*x - 1)), + ((3, 0), (-1/2*i*x^2 + 2*x - 5/2*i)/(x + 7/2*i)), + ((3, 2), (1/9*x^3 + 2/3*i*x^2 - 13/3*x - 116/9*i)/(x^2 + 10*i*x - 25))] sage: K. = QuadraticField(-1) sage: E = EllipticCurve([1+i, -i, i, 1, 0]) diff --git a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py index 6a0194fb0f9..90f7382a94e 100755 --- a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py +++ b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py @@ -886,15 +886,15 @@ def isogenies_5_0(E, minimal_models=True): from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by - y^2 + y = x^3 + (241565/32*a^5-362149/48*a^4+180281/24*a^3-9693307/4*a^2+14524871/6*a-7254985/3)*x - + (1660391123/192*a^5-829315373/96*a^4+77680504/9*a^3-66622345345/24*a^2+33276655441/12*a-24931615912/9) + y^2 + y = x^3 + (643/8*a^5-15779/48*a^4-32939/24*a^3-71989/2*a^2+214321/6*a-112115/3)*x + + (2901961/96*a^5+4045805/48*a^4+12594215/18*a^3-30029635/6*a^2+15341626/3*a-38944312/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320, Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by - y^2 + y = x^3 + (47519/32*a^5-72103/48*a^4+32939/24*a^3-1909753/4*a^2+2861549/6*a-1429675/3)*x - + (-131678717/192*a^5+65520419/96*a^4-12594215/18*a^3+5280985135/24*a^2-2637787519/12*a+1976130088/9) + y^2 + y = x^3 + (-1109/8*a^5-53873/48*a^4-180281/24*a^3-14491/2*a^2+35899/6*a-43745/3)*x + + (-17790679/96*a^5-60439571/48*a^4-77680504/9*a^3+1286245/6*a^2-4961854/3*a-73854632/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320] """ F = E.base_field() diff --git a/src/sage/schemes/plane_conics/con_number_field.py b/src/sage/schemes/plane_conics/con_number_field.py index e09a1f60262..69fe9960c3d 100755 --- a/src/sage/schemes/plane_conics/con_number_field.py +++ b/src/sage/schemes/plane_conics/con_number_field.py @@ -121,7 +121,7 @@ def has_rational_point(self, point=False, obstruction=False, sage: K. = QuadraticField(-1) sage: C = Conic(K, [1, 3, -5]) sage: C.has_rational_point(point=True, obstruction=True) - (False, Fractional ideal (-i - 2)) + (False, Fractional ideal (i + 2)) sage: C.has_rational_point(algorithm='rnfisnorm') False sage: C.has_rational_point(algorithm='rnfisnorm', obstruction=True, @@ -135,7 +135,7 @@ def has_rational_point(self, point=False, obstruction=False, sage: L. = NumberField(x^3 - 5) sage: C = Conic(L, [1, 2, -3]) sage: C.has_rational_point(point=True, algorithm='rnfisnorm') - (True, (5/3 : -1/3 : 1)) + (True, (-5/3 : 1/3 : 1)) sage: K. = NumberField(x^4+2) sage: Conic(QQ, [4,5,6]).has_rational_point() diff --git a/src/sage/schemes/projective/projective_morphism.py b/src/sage/schemes/projective/projective_morphism.py index 20031e81a41..fcbb0c01e82 100755 --- a/src/sage/schemes/projective/projective_morphism.py +++ b/src/sage/schemes/projective/projective_morphism.py @@ -928,7 +928,7 @@ def normalize_coordinates(self, **kwds): Dynamical System of Projective Space of dimension 1 over Number Field in a with defining polynomial 3*x^2 + 1 Defn: Defined on coordinates by sending (z : w) to - ((-3/2*a + 1/2)*z^2 + (-3/2*a + 1/2)*w^2 : (-3/2*a - 3/2)*z*w) + ((3/2*a + 1/2)*z^2 + (3/2*a + 1/2)*w^2 : (-3/2*a + 3/2)*z*w) :: @@ -1728,11 +1728,11 @@ def _number_field_from_algebraics(self): sage: f._number_field_from_algebraics() # needs sage.symbolic Scheme endomorphism of Projective Space of dimension 1 over Number Field in a with defining polynomial y^6 + 6*y^4 - 6*y^3 + 12*y^2 + 36*y + 17 - with a = 1.442249570307409? + 1.414213562373095?*I + with a = 1.442249570307409? - 1.414213562373095?*I Defn: Defined on coordinates by sending (x : y) to ((-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 - 772/269*a - - 1092/269)*x^2 + (48/269*a^5 - 27/269*a^4 + 320/269*a^3 - 468/269*a^2 - + 1041/269*a + 1092/269)*y^2 : y^2) + - 1092/269)*x^2 + (-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 + - 1041/269*a - 1092/269)*y^2 : y^2) :: @@ -1745,12 +1745,12 @@ def _number_field_from_algebraics(self): Scheme morphism: From: Projective Space of dimension 1 over Number Field in a with defining polynomial y^4 + 3*y^2 + 1 - with a = 0.?e-113 + 0.618033988749895?*I + with a = 0.?e-166 + 1.618033988749895?*I To: Projective Space of dimension 2 over Number Field in a with defining polynomial y^4 + 3*y^2 + 1 - with a = 0.?e-113 + 0.618033988749895?*I + with a = 0.?e-166 + 1.618033988749895?*I Defn: Defined on coordinates by sending (x : y) to - (x^2 + (a^3 + 2*a)*x*y + 3*y^2 : y^2 : (2*a^2 + 3)*x*y) + (x^2 + (-a^3 - 2*a)*x*y + 3*y^2 : y^2 : (-2*a^2 - 3)*x*y) The following was fixed in :issue:`23808`:: diff --git a/src/sage/schemes/projective/projective_point.py b/src/sage/schemes/projective/projective_point.py index 7f941ec6726..b0f443acb4e 100755 --- a/src/sage/schemes/projective/projective_point.py +++ b/src/sage/schemes/projective/projective_point.py @@ -1238,10 +1238,10 @@ def _number_field_from_algebraics(self): sage: P. = ProjectiveSpace(QQbar, 1) sage: Q = P([-1/2*QQbar(sqrt(2)) + QQbar(I), 1]) sage: S = Q._number_field_from_algebraics(); S - (1/2*a^3 + a^2 - 1/2*a : 1) + (-1/2*a^3 + a^2 + 1/2*a : 1) sage: S.codomain() Projective Space of dimension 1 over Number Field in a with defining - polynomial y^4 + 1 with a = 0.7071067811865475? + 0.7071067811865475?*I + polynomial y^4 + 1 with a = -0.7071067811865475? - 0.7071067811865475?*I The following was fixed in :issue:`23808`:: @@ -1251,7 +1251,7 @@ def _number_field_from_algebraics(self): sage: Q = P([-1/2*QQbar(sqrt(2)) + QQbar(I), 1]);Q (-0.7071067811865475? + 1*I : 1) sage: S = Q._number_field_from_algebraics(); S - (1/2*a^3 + a^2 - 1/2*a : 1) + (-1/2*a^3 + a^2 + 1/2*a : 1) sage: T = S.change_ring(QQbar) # Used to fail sage: T (-0.7071067811865475? + 1.000000000000000?*I : 1) diff --git a/src/sage/structure/factorization.py b/src/sage/structure/factorization.py index ab3fa717031..b16822791dc 100644 --- a/src/sage/structure/factorization.py +++ b/src/sage/structure/factorization.py @@ -143,17 +143,17 @@ sage: K. = NumberField(x^2 + 3); K Number Field in a with defining polynomial x^2 + 3 sage: f = K.factor(15); f - (Fractional ideal (1/2*a + 3/2))^2 * (Fractional ideal (5)) + (Fractional ideal (-a))^2 * (Fractional ideal (5)) sage: f.universe() Monoid of ideals of Number Field in a with defining polynomial x^2 + 3 sage: f.unit() Fractional ideal (1) sage: g = K.factor(9); g - (Fractional ideal (1/2*a + 3/2))^4 + (Fractional ideal (-a))^4 sage: f.lcm(g) - (Fractional ideal (1/2*a + 3/2))^4 * (Fractional ideal (5)) + (Fractional ideal (-a))^4 * (Fractional ideal (5)) sage: f.gcd(g) - (Fractional ideal (1/2*a + 3/2))^2 + (Fractional ideal (-a))^2 sage: f.is_integral() True From 48f18f10ae045c9e7938a4bb47695ac21a7b764d Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 6 Oct 2024 11:02:21 +0200 Subject: [PATCH 04/26] Account for random output in some tests --- src/sage/arith/misc.py | 19 +++++++++++++------ .../rings/number_field/number_field_ideal.py | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py index 2e27f03a967..86409ab3243 100644 --- a/src/sage/arith/misc.py +++ b/src/sage/arith/misc.py @@ -2691,9 +2691,14 @@ def factor(n, proof=None, int_=False, algorithm='pari', verbose=0, **kwds): Any object which has a factor method can be factored like this:: - sage: K. = QuadraticField(-1) # needs sage.rings.number_field - sage: factor(122 - 454*i) # needs sage.rings.number_field - (-i - 2)^3 * (-i - 1)^3 * (3*i + 2) * (i + 4) + sage: # needs sage.rings.number_field + sage: K. = QuadraticField(-1) + sage: f = factor(122 - 454*i); f # random + (i) * (i - 1)^3 * (i + 2)^3 * (3*i + 2) * (i + 4) + sage: len(f) + 4 + sage: product(p[0]^p[1] for p in f) * f.unit() + -454*i + 122 To access the data in a factorization:: @@ -2775,8 +2780,10 @@ def radical(n, *args, **kwds): ... ArithmeticError: radical of 0 is not defined sage: K. = QuadraticField(-1) # needs sage.rings.number_field - sage: radical(K(2)) # needs sage.rings.number_field - -i - 1 + sage: r = radical(K(2)); r # random, needs sage.rings.number_field + i - 1 + sage: r.norm() # needs sage.rings.number_field + 2 Tests with numpy and gmpy2 numbers:: @@ -3031,7 +3038,7 @@ def is_squarefree(n): sage: is_squarefree(O(2)) False sage: O(2).factor() - (-I) * (-I - 1)^2 + (...) * (...)^2 This method fails on domains which are not Unique Factorization Domains:: diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py index d22ded6f164..b269045cf96 100644 --- a/src/sage/rings/number_field/number_field_ideal.py +++ b/src/sage/rings/number_field/number_field_ideal.py @@ -2069,7 +2069,7 @@ def ramification_index(self): sage: K. = NumberField(x^2 + 2); K Number Field in a with defining polynomial x^2 + 2 sage: f = K.factor(2); f - (Fractional ideal (a))^2 + (Fractional ideal (...a))^2 sage: f[0][0].ramification_index() 2 sage: K.ideal(13).ramification_index() From ff1b011572e82313dbf2223f92a2ebbf2c024fe6 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 6 Oct 2024 22:52:02 +0200 Subject: [PATCH 05/26] Rename prec_words_to_bits to prec_pari_to_bits --- src/sage/schemes/elliptic_curves/ell_point.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index a3962575963..c76740d8bf2 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -142,7 +142,7 @@ try: from sage.libs.pari.all import pari, PariError - from cypari2.pari_instance import prec_words_to_bits + from cypari2.pari_instance import prec_pari_to_bits except ImportError: PariError = () @@ -3712,7 +3712,7 @@ def elliptic_logarithm(self, embedding=None, precision=100, E_pari = E_work.pari_curve() log_pari = E_pari.ellpointtoz(pt_pari, precision=working_prec) - while prec_words_to_bits(log_pari.precision()) < precision: + while prec_pari_to_bits(log_pari.precision()) < precision: # result is not precise enough, re-compute with double # precision. if the base field is not QQ, this # requires modifying the precision of the embedding, From 14dd5623dc68ae21e8f025ab7f8469007dc55fe6 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 27 Oct 2024 08:36:04 +0100 Subject: [PATCH 06/26] Account for more pari 2.17 random output in some tests --- src/sage/rings/number_field/number_field_ideal_rel.py | 8 ++++++-- src/sage/schemes/elliptic_curves/ell_number_field.py | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/number_field/number_field_ideal_rel.py b/src/sage/rings/number_field/number_field_ideal_rel.py index 0bae4e74e13..eb39f6f4d12 100644 --- a/src/sage/rings/number_field/number_field_ideal_rel.py +++ b/src/sage/rings/number_field/number_field_ideal_rel.py @@ -409,8 +409,10 @@ def relative_norm(self): sage: K. = NumberField(2*x^2 - 1/3) sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] - sage: P.relative_norm() + sage: rn = P.relative_norm(); rn # random Fractional ideal (6*a - 2) + sage: rn in [K.ideal(6*a - 2), K.ideal(-6*a -2)] + True """ L = self.number_field() K = L.base_field() @@ -528,8 +530,10 @@ def ideal_below(self): sage: K. = NumberField(2*x^2 - 1/3) sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] - sage: P.ideal_below() + sage: ib = P.ideal_below(); ib # random Fractional ideal (6*a - 2) + sage: ib in [K.ideal(6*a - 2), K.ideal(-6*a -2)] + True """ L = self.number_field() K = L.base_field() diff --git a/src/sage/schemes/elliptic_curves/ell_number_field.py b/src/sage/schemes/elliptic_curves/ell_number_field.py index aab39b49932..cceab500959 100755 --- a/src/sage/schemes/elliptic_curves/ell_number_field.py +++ b/src/sage/schemes/elliptic_curves/ell_number_field.py @@ -1487,8 +1487,10 @@ def conductor(self): sage: EllipticCurve([i, i - 1, i + 1, 24*i + 15, 14*i + 35]).conductor() Fractional ideal (3*i + 21) sage: K. = NumberField(x^2 - x + 3) - sage: EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor() - Fractional ideal (-6*a) + sage: cond = EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor(); cond # random + Fractional ideal (6*a) + sage: cond == K.ideal(6*a) + True A not so well known curve with everywhere good reduction:: From 23ff7d60446e880520540377e59cc11b2fbba08c Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Wed, 30 Oct 2024 21:53:48 +0100 Subject: [PATCH 07/26] Replace prec_pari_to_bits usage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gonzalo Tornaría --- src/sage/schemes/elliptic_curves/ell_point.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index c76740d8bf2..bed60d063e9 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -3712,7 +3712,7 @@ def elliptic_logarithm(self, embedding=None, precision=100, E_pari = E_work.pari_curve() log_pari = E_pari.ellpointtoz(pt_pari, precision=working_prec) - while prec_pari_to_bits(log_pari.precision()) < precision: + while log_pari.bitprecision() < precision: # result is not precise enough, re-compute with double # precision. if the base field is not QQ, this # requires modifying the precision of the embedding, From fbb32fdfe83dd0f6dc5721a440a692f63a3706f2 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Wed, 30 Oct 2024 21:53:58 +0100 Subject: [PATCH 08/26] Replace prec_pari_to_bits usage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gonzalo Tornaría --- src/sage/schemes/elliptic_curves/ell_point.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index bed60d063e9..6cb6569d5c6 100755 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -142,7 +142,6 @@ try: from sage.libs.pari.all import pari, PariError - from cypari2.pari_instance import prec_pari_to_bits except ImportError: PariError = () From 51c045c8f6de0f16e1bb3d7901cd60d0d3cc7368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Wed, 6 Nov 2024 20:23:24 -0300 Subject: [PATCH 09/26] Fix doctests for pari 2.17 on 32-bit --- src/sage/calculus/calculus.py | 3 +- src/sage/doctest/sources.py | 4 +-- src/sage/interfaces/gp.py | 42 +++++++++----------------- src/sage/interfaces/interface.py | 3 +- src/sage/interfaces/mathematica.py | 3 +- src/sage/interfaces/mathics.py | 3 +- src/sage/interfaces/maxima_abstract.py | 3 +- src/sage/libs/pari/__init__.py | 5 ++- src/sage/libs/pari/tests.py | 11 +++---- src/sage/symbolic/constants.py | 9 ++---- src/sage/symbolic/expression.pyx | 3 +- 11 files changed, 31 insertions(+), 58 deletions(-) diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py index ef4854db676..fc4e92396f0 100644 --- a/src/sage/calculus/calculus.py +++ b/src/sage/calculus/calculus.py @@ -793,8 +793,7 @@ def nintegral(ex, x, a, b, to high precision:: sage: gp.eval('intnum(x=17,42,exp(-x^2)*log(x))') - '2.565728500561051474934096410 E-127' # 32-bit - '2.5657285005610514829176211363206621657 E-127' # 64-bit + '2.5657285005610514829176211363206621657 E-127' sage: old_prec = gp.set_real_precision(50) sage: gp.eval('intnum(x=17,42,exp(-x^2)*log(x))') '2.5657285005610514829173563961304957417746108003917 E-127' diff --git a/src/sage/doctest/sources.py b/src/sage/doctest/sources.py index 7589f62922b..9807c1d5e12 100644 --- a/src/sage/doctest/sources.py +++ b/src/sage/doctest/sources.py @@ -766,11 +766,11 @@ def create_doctests(self, namespace): sage: import sys sage: bitness = '64' if sys.maxsize > (1 << 32) else '32' - sage: gp.get_precision() == 38 # needs sage.libs.pari + sage: sys.maxsize == 2^63 - 1 False # 32-bit True # 64-bit sage: ex = doctests[20].examples[11] - sage: ((bitness == '64' and ex.want == 'True \n') # needs sage.libs.pari + sage: ((bitness == '64' and ex.want == 'True \n') ....: or (bitness == '32' and ex.want == 'False \n')) True diff --git a/src/sage/interfaces/gp.py b/src/sage/interfaces/gp.py index b98c050d889..712a37a6dc6 100644 --- a/src/sage/interfaces/gp.py +++ b/src/sage/interfaces/gp.py @@ -48,11 +48,9 @@ :: sage: gp("a = intnum(x=0,6,sin(x))") - 0.03982971334963397945434770208 # 32-bit - 0.039829713349633979454347702077075594548 # 64-bit + 0.039829713349633979454347702077075594548 sage: gp("a") - 0.03982971334963397945434770208 # 32-bit - 0.039829713349633979454347702077075594548 # 64-bit + 0.039829713349633979454347702077075594548 sage: gp.kill("a") sage: gp("a") a @@ -375,8 +373,7 @@ def get_precision(self): EXAMPLES:: sage: gp.get_precision() - 28 # 32-bit - 38 # 64-bit + 38 """ return self.get_default('realprecision') @@ -396,15 +393,13 @@ def set_precision(self, prec): EXAMPLES:: sage: old_prec = gp.set_precision(53); old_prec - 28 # 32-bit - 38 # 64-bit + 38 sage: gp.get_precision() 57 sage: gp.set_precision(old_prec) 57 sage: gp.get_precision() - 28 # 32-bit - 38 # 64-bit + 38 """ return self.set_default('realprecision', prec) @@ -520,8 +515,7 @@ def set_default(self, var, value): sage: gp.set_default('realprecision', old_prec) 115 sage: gp.get_default('realprecision') - 28 # 32-bit - 38 # 64-bit + 38 """ old = self.get_default(var) self._eval_line('default(%s,%s)' % (var, value)) @@ -547,8 +541,7 @@ def get_default(self, var): sage: gp.get_default('seriesprecision') 16 sage: gp.get_default('realprecision') - 28 # 32-bit - 38 # 64-bit + 38 """ return eval(self._eval_line('default(%s)' % var)) @@ -773,8 +766,7 @@ def _exponent_symbol(self): :: sage: repr(gp(10.^80)).replace(gp._exponent_symbol(), 'e') - '1.0000000000000000000000000000000000000e80' # 64-bit - '1.000000000000000000000000000e80' # 32-bit + '1.0000000000000000000000000000000000000e80' """ return ' E' @@ -800,18 +792,15 @@ def new_with_bits_prec(self, s, precision=0): sage: # needs sage.symbolic sage: pi_def = gp(pi); pi_def - 3.141592653589793238462643383 # 32-bit - 3.1415926535897932384626433832795028842 # 64-bit + 3.1415926535897932384626433832795028842 sage: pi_def.precision() - 28 # 32-bit - 38 # 64-bit + 38 sage: pi_150 = gp.new_with_bits_prec(pi, 150) sage: new_prec = pi_150.precision(); new_prec 48 # 32-bit 57 # 64-bit sage: old_prec = gp.set_precision(new_prec); old_prec - 28 # 32-bit - 38 # 64-bit + 38 sage: pi_150 3.14159265358979323846264338327950288419716939938 # 32-bit 3.14159265358979323846264338327950288419716939937510582098 # 64-bit @@ -819,8 +808,7 @@ def new_with_bits_prec(self, s, precision=0): 48 # 32-bit 57 # 64-bit sage: gp.get_precision() - 28 # 32-bit - 38 # 64-bit + 38 """ if precision: old_prec = self.get_real_precision() @@ -856,11 +844,9 @@ class GpElement(ExpectElement, sage.interfaces.abc.GpElement): sage: loads(dumps(x)) == x False sage: x - 1.047197551196597746154214461 # 32-bit - 1.0471975511965977461542144610931676281 # 64-bit + 1.0471975511965977461542144610931676281 sage: loads(dumps(x)) - 1.047197551196597746154214461 # 32-bit - 1.0471975511965977461542144610931676281 # 64-bit + 1.0471975511965977461542144610931676281 The two elliptic curves look the same, but internally the floating point numbers are slightly different. diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py index 6f2fb118968..4a1884fad02 100644 --- a/src/sage/interfaces/interface.py +++ b/src/sage/interfaces/interface.py @@ -1045,8 +1045,7 @@ def _sage_repr(self): :: sage: gp(10.^80)._sage_repr() - '1.0000000000000000000000000000000000000e80' # 64-bit - '1.000000000000000000000000000e80' # 32-bit + '1.0000000000000000000000000000000000000e80' sage: mathematica('10.^80')._sage_repr() # optional - mathematica '1.e80' diff --git a/src/sage/interfaces/mathematica.py b/src/sage/interfaces/mathematica.py index 39c3aff9dc2..8f3b4a8ba63 100644 --- a/src/sage/interfaces/mathematica.py +++ b/src/sage/interfaces/mathematica.py @@ -187,8 +187,7 @@ Note that this agrees with what the PARI interpreter gp produces:: sage: gp('solve(x=1,2,exp(x)-3*x)') - 1.512134551657842473896739678 # 32-bit - 1.5121345516578424738967396780720387046 # 64-bit + 1.5121345516578424738967396780720387046 Next we find the minimum of a polynomial using the two different ways of accessing Mathematica:: diff --git a/src/sage/interfaces/mathics.py b/src/sage/interfaces/mathics.py index a6d39ad3c14..bd192c8f676 100644 --- a/src/sage/interfaces/mathics.py +++ b/src/sage/interfaces/mathics.py @@ -196,8 +196,7 @@ Note that this agrees with what the PARI interpreter gp produces:: sage: gp('solve(x=1,2,exp(x)-3*x)') - 1.512134551657842473896739678 # 32-bit - 1.5121345516578424738967396780720387046 # 64-bit + 1.5121345516578424738967396780720387046 Next we find the minimum of a polynomial using the two different ways of accessing Mathics:: diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py index b8df280857c..234e9373fca 100644 --- a/src/sage/interfaces/maxima_abstract.py +++ b/src/sage/interfaces/maxima_abstract.py @@ -1489,8 +1489,7 @@ def nintegral(self, var='x', a=0, b=1, high precision very quickly:: sage: gp('intnum(x=0,1,exp(-sqrt(x)))') - 0.5284822353142307136179049194 # 32-bit - 0.52848223531423071361790491935415653022 # 64-bit + 0.52848223531423071361790491935415653022 sage: _ = gp.set_precision(80) sage: gp('intnum(x=0,1,exp(-sqrt(x)))') 0.52848223531423071361790491935415653021675547587292866196865279321015401702040079 diff --git a/src/sage/libs/pari/__init__.py b/src/sage/libs/pari/__init__.py index ccb18792918..c0f6515685a 100644 --- a/src/sage/libs/pari/__init__.py +++ b/src/sage/libs/pari/__init__.py @@ -165,12 +165,11 @@ sage: e = pari([0,0,0,-82,0]).ellinit() sage: eta1 = e.elleta(precision=50)[0] sage: eta1.sage() - 3.6054636014326520859158205642077267748 # 64-bit - 3.605463601432652085915820564 # 32-bit + 3.6054636014326520859158205642077267748 sage: eta1 = e.elleta(precision=150)[0] sage: eta1.sage() 3.605463601432652085915820564207726774810268996598024745444380641429820491740 # 64-bit - 3.60546360143265208591582056420772677481026899659802474544 # 32-bit + 3.605463601432652085915820564207726774810268996598024745444380641430 # 32-bit """ def _get_pari_instance(): diff --git a/src/sage/libs/pari/tests.py b/src/sage/libs/pari/tests.py index bd8dc9641d2..38fee89202b 100644 --- a/src/sage/libs/pari/tests.py +++ b/src/sage/libs/pari/tests.py @@ -94,8 +94,7 @@ [4, 2] sage: int(pari(RealField(63)(2^63 - 1))) # needs sage.rings.real_mpfr - 9223372036854775807 # 32-bit - 9223372036854775807 # 64-bit + 9223372036854775807 sage: int(pari(RealField(63)(2^63 + 2))) # needs sage.rings.real_mpfr 9223372036854775810 @@ -1231,8 +1230,7 @@ sage: e.ellheight([1,0]) 0.476711659343740 sage: e.ellheight([1,0], precision=128).sage() - 0.47671165934373953737948605888465305945902294218 # 32-bit - 0.476711659343739537379486058884653059459022942211150879336 # 64-bit + 0.476711659343739537379486058884653059459022942211150879336 sage: e.ellheight([1, 0], [-1, 1]) 0.418188984498861 @@ -1806,12 +1804,11 @@ sage: e = pari([0,0,0,-82,0]).ellinit() sage: eta1 = e.elleta(precision=50)[0] sage: eta1.sage() - 3.6054636014326520859158205642077267748 # 64-bit - 3.605463601432652085915820564 # 32-bit + 3.6054636014326520859158205642077267748 sage: eta1 = e.elleta(precision=150)[0] sage: eta1.sage() 3.605463601432652085915820564207726774810268996598024745444380641429820491740 # 64-bit - 3.60546360143265208591582056420772677481026899659802474544 # 32-bit + 3.605463601432652085915820564207726774810268996598024745444380641430 # 32-bit sage: from cypari2 import Pari sage: pari = Pari() diff --git a/src/sage/symbolic/constants.py b/src/sage/symbolic/constants.py index 20a293fbb7b..dac8c4bc833 100644 --- a/src/sage/symbolic/constants.py +++ b/src/sage/symbolic/constants.py @@ -38,8 +38,7 @@ sage: gap(pi) pi sage: gp(pi) - 3.141592653589793238462643383 # 32-bit - 3.1415926535897932384626433832795028842 # 64-bit + 3.1415926535897932384626433832795028842 sage: pari(pi) 3.14159265358979 sage: kash(pi) # optional - kash @@ -63,8 +62,7 @@ sage: RealField(15)(a) # 15 *bits* of precision 5.316 sage: gp(a) - 5.316218116357029426750873360 # 32-bit - 5.3162181163570294267508733603616328824 # 64-bit + 5.3162181163570294267508733603616328824 sage: print(mathematica(a)) # optional - mathematica 4 E --- + Pi @@ -882,8 +880,7 @@ class Log2(Constant): sage: maxima(log2).float() 0.6931471805599453 sage: gp(log2) - 0.6931471805599453094172321215 # 32-bit - 0.69314718055994530941723212145817656807 # 64-bit + 0.69314718055994530941723212145817656807 sage: RealField(150)(2).log() 0.69314718055994530941723212145817656807550013 """ diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx index 52da8232dc6..f0d888c2a01 100644 --- a/src/sage/symbolic/expression.pyx +++ b/src/sage/symbolic/expression.pyx @@ -9798,8 +9798,7 @@ cdef class Expression(Expression_abc): :: sage: gp('gamma(1+I)') - 0.4980156681183560427136911175 - 0.1549498283018106851249551305*I # 32-bit - 0.49801566811835604271369111746219809195 - 0.15494982830181068512495513048388660520*I # 64-bit + 0.49801566811835604271369111746219809195 - 0.15494982830181068512495513048388660520*I We plot the familiar plot of this log-convex function:: From a4d1efb81a795e7d08b23ce695102adbeff9556f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Wed, 6 Nov 2024 22:43:13 -0300 Subject: [PATCH 10/26] make reduced_basis() deterministic for pari 2.17 --- src/sage/rings/number_field/number_field.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 3cffd4ce062..ae583e4db6a 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -6514,12 +6514,12 @@ def reduced_basis(self, prec=None): sage: k. = NumberField(x^6 + 2218926655879913714112*x^4 - 32507675650290949030789018433536*x^3 + 4923635504174417014460581055002374467948544*x^2 - 36066074010564497464129951249279114076897746988630016*x + 264187244046129768986806800244258952598300346857154900812365824) sage: new_basis = k.reduced_basis(prec=120) sage: [c.minpoly() for c in new_basis] - [x^2 + x + 1, - x - 1, - x^6 + 3*x^5 - 102*x^4 - 315*x^3 + 10254*x^2 + 80955*x + 198147, - x^6 + 213*x^4 + 12567*x^2 + 198147, - x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104, - x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104] + [x - 1, + x^2 + x + 1, + x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, + x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, + x^3 - 171*x + 848, + x^6 + 171*x^4 + 1696*x^3 + 29241*x^2 + 145008*x + 719104] sage: R = k.order(new_basis) sage: R.discriminant()==k.discriminant() True @@ -6531,13 +6531,15 @@ def reduced_basis(self, prec=None): # the inner product on the Minkowski embedding, which is # faster than computing all the conjugates, etc ... + # flag to disable FLATTER, which is much more unstable than fplll + flag = 1 if pari.version() >= (2,17) else 0 if self.is_totally_real(): from sage.matrix.constructor import matrix M = matrix(ZZ, d, d, [[(x*y).trace() for x in ZK] for y in ZK]) - T = pari(M).qflllgram() + T = pari(M).qflllgram(flag=flag) else: M = self.minkowski_embedding(ZK, prec=prec) - T = pari(M).qflll() + T = pari(M).qflll(flag=flag) return [sum([ZZ(T[i][j]) * ZK[j] for j in range(d)]) for i in range(d)] From bcb9c3d5ffd682c04040bcff82e7d9c423f18a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Thu, 7 Nov 2024 11:01:11 -0300 Subject: [PATCH 11/26] make pari_bnf() deterministic for pari 2.17 --- src/sage/rings/number_field/number_field.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index ae583e4db6a..9add6e91e3e 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -4440,10 +4440,14 @@ def pari_bnf(self, proof=None, units=True): bnf = self._pari_bnf except AttributeError: f = self.pari_polynomial("y") + _saved_rand = pari.getrand() + # make this deterministic, it affects printing of ideals + pari.setrand(1) if units: self._pari_bnf = f.bnfinit(1) else: self._pari_bnf = f.bnfinit() + pari.setrand(_saved_rand) bnf = self._pari_bnf # Certify if needed if proof and not getattr(self, "_pari_bnf_certified", False): From a5c65e198acd280fc5e25eadf63f189cbb4aa233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Thu, 7 Nov 2024 11:45:05 -0300 Subject: [PATCH 12/26] Fix doctests for 'make pari_bnf() deterministic' --- .../arithmetic_dynamics/berkovich_ds.py | 4 +-- src/sage/rings/finite_rings/residue_field.pyx | 12 +++---- src/sage/rings/integer.pyx | 2 +- src/sage/rings/number_field/S_unit_solver.py | 36 +++++++++---------- src/sage/rings/number_field/class_group.py | 4 +-- src/sage/rings/number_field/number_field.py | 2 +- .../number_field/number_field_element.pyx | 4 +-- .../number_field/number_field_ideal_rel.py | 6 ++-- src/sage/rings/number_field/order.py | 8 ++--- src/sage/rings/number_field/selmer_group.py | 6 ++-- .../polynomial/polynomial_quotient_ring.py | 2 +- src/sage/rings/rational.pyx | 4 +-- src/sage/schemes/berkovich/berkovich_space.py | 2 +- .../schemes/plane_conics/con_number_field.py | 2 +- 14 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py index d3f9c3cdf41..4de0e8f6158 100644 --- a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py +++ b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py @@ -690,10 +690,10 @@ def conjugate(self, M, adjugate=False, new_ideal=None): sage: # needs sage.rings.number_field sage: ideal = A.ideal(5).factor()[1][0]; ideal - Fractional ideal (-a + 2) + Fractional ideal (-2*a - 1) sage: g = f.conjugate(conj, new_ideal=ideal) sage: g.domain().ideal() - Fractional ideal (-a + 2) + Fractional ideal (-2*a - 1) """ if self.domain().is_padic_base(): return DynamicalSystem_Berkovich(self._system.conjugate(M, adjugate=adjugate)) diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 4d484603df8..e85444cef11 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -495,9 +495,9 @@ class ResidueField_generic(Field): sage: # needs sage.rings.number_field sage: I = QQ[i].factor(2)[0][0]; I - Fractional ideal (-I - 1) + Fractional ideal (I - 1) sage: k = I.residue_field(); k - Residue field of Fractional ideal (-I - 1) + Residue field of Fractional ideal (I - 1) sage: type(k) @@ -1007,7 +1007,7 @@ cdef class ReductionMap(Map): sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (-a + 1) + To: Residue field of Fractional ideal (a - 1) sage: cr == r # not implemented True sage: r(2 + a) == cr(2 + a) @@ -1038,7 +1038,7 @@ cdef class ReductionMap(Map): sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (-a + 1) + To: Residue field of Fractional ideal (a - 1) sage: cr == r # not implemented True sage: r(2 + a) == cr(2 + a) @@ -1070,7 +1070,7 @@ cdef class ReductionMap(Map): sage: r = F.reduction_map(); r Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (-a + 1) + To: Residue field of Fractional ideal (a - 1) We test that calling the function also works after copying:: @@ -1082,7 +1082,7 @@ cdef class ReductionMap(Map): Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element 1/2*a - modulo Fractional ideal (-a + 1): it has negative valuation + modulo Fractional ideal (a - 1): it has negative valuation sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; h = t^5 + t^2 + 1 diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index 86cbb05c6bf..ffc5ee16e0f 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -5585,7 +5585,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): sage: 5.is_norm(K) False sage: n.is_norm(K, element=True) - (True, 4*beta + 6) + (True, -4*beta + 6) sage: n.is_norm(K, element=True)[1].norm() 4 sage: n = 5 diff --git a/src/sage/rings/number_field/S_unit_solver.py b/src/sage/rings/number_field/S_unit_solver.py index 1260650ef77..836edae5464 100644 --- a/src/sage/rings/number_field/S_unit_solver.py +++ b/src/sage/rings/number_field/S_unit_solver.py @@ -1381,7 +1381,7 @@ def defining_polynomial_for_Kp(prime, prec=106): sage: from sage.rings.number_field.S_unit_solver import defining_polynomial_for_Kp sage: K. = QuadraticField(2) sage: p2 = K.prime_above(7); p2 - Fractional ideal (-2*a + 1) + Fractional ideal (2*a - 1) sage: defining_polynomial_for_Kp(p2, 10) x + 266983762 @@ -2170,23 +2170,23 @@ def construct_complement_dictionaries(split_primes_list, SUK, verbose=False): sage: SUK = K.S_unit_group(S=K.primes_above(H)) sage: split_primes_list = [3, 7] sage: actual = construct_complement_dictionaries(split_primes_list, SUK) - sage: expected = {3: {(1, 1, 0): [(1, 0, 0), (1, 1, 0)], - ....: (1, 0, 0): [(1, 0, 0), (1, 1, 0)]}, - ....: 7: {(1, 1, 0): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (1, 3, 2): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (1, 5, 4): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (1, 0, 4): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], - ....: (1, 2, 0): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], - ....: (1, 4, 2): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], - ....: (1, 1, 2): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], - ....: (1, 3, 4): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], - ....: (1, 5, 0): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], - ....: (1, 0, 2): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], - ....: (1, 2, 4): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], - ....: (1, 4, 0): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], - ....: (1, 0, 0): [(1, 5, 4), (1, 3, 2), (1, 1, 0)], - ....: (1, 2, 2): [(1, 5, 4), (1, 3, 2), (1, 1, 0)], - ....: (1, 4, 4): [(1, 5, 4), (1, 3, 2), (1, 1, 0)]}} + sage: expected = {3: {(0, 1, 0): [(0, 1, 0), (1, 0, 0)], + ....: (1, 0, 0): [(0, 1, 0), (1, 0, 0)]}, + ....: 7: {(0, 1, 0): [(1, 0, 0), (1, 2, 2), (1, 4, 4)], + ....: (0, 1, 2): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], + ....: (0, 3, 2): [(1, 0, 0), (1, 2, 2), (1, 4, 4)], + ....: (0, 3, 4): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], + ....: (0, 5, 0): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], + ....: (0, 5, 4): [(1, 0, 0), (1, 2, 2), (1, 4, 4)], + ....: (1, 0, 0): [(0, 1, 0), (0, 3, 2), (0, 5, 4)], + ....: (1, 0, 2): [(1, 0, 4), (1, 2, 0), (1, 4, 2)], + ....: (1, 0, 4): [(1, 0, 2), (1, 2, 4), (1, 4, 0)], + ....: (1, 2, 0): [(1, 0, 2), (1, 2, 4), (1, 4, 0)], + ....: (1, 2, 2): [(0, 1, 0), (0, 3, 2), (0, 5, 4)], + ....: (1, 2, 4): [(1, 0, 4), (1, 2, 0), (1, 4, 2)], + ....: (1, 4, 0): [(1, 0, 4), (1, 2, 0), (1, 4, 2)], + ....: (1, 4, 2): [(1, 0, 2), (1, 2, 4), (1, 4, 0)], + ....: (1, 4, 4): [(0, 1, 0), (0, 3, 2), (0, 5, 4)]}} sage: all(set(actual[p][vec]) == set(expected[p][vec]) ....: for p in [3, 7] for vec in expected[p]) True diff --git a/src/sage/rings/number_field/class_group.py b/src/sage/rings/number_field/class_group.py index 34a48931f8e..046209ad314 100644 --- a/src/sage/rings/number_field/class_group.py +++ b/src/sage/rings/number_field/class_group.py @@ -524,9 +524,9 @@ def gens_ideals(self): Class group of order 68 with structure C34 x C2 of Number Field in a with defining polynomial x^2 + x + 23899 sage: C.gens() - (Fractional ideal class (7, a + 5), Fractional ideal class (5, a + 3)) + (Fractional ideal class (83, a + 21), Fractional ideal class (15, a + 8)) sage: C.gens_ideals() - (Fractional ideal (7, a + 5), Fractional ideal (5, a + 3)) + (Fractional ideal (83, a + 21), Fractional ideal (15, a + 8)) """ return self.gens_values() diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 9add6e91e3e..57263c839ea 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -7136,7 +7136,7 @@ def units(self, proof=None): sage: K. = NumberField(1/2*x^2 - 1/6) sage: K.units() - (-3*a + 2,) + (3*a + 2,) """ proof = proof_flag(proof) diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 1a676ee087b..a22b68e6093 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -1954,7 +1954,7 @@ cdef class NumberFieldElement(NumberFieldElement_base): sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^2 + 1) sage: (6*i + 6).factor() - (i) * (-i - 1)^3 * 3 + (i - 1)^3 * 3 In the following example, the class number is 2. If a factorization in prime elements exists, we will find it:: @@ -2043,7 +2043,7 @@ cdef class NumberFieldElement(NumberFieldElement_base): 0 sage: R = K.maximal_order() sage: R(i+1).gcd(2) - i + 1 + i - 1 sage: R = K.order(2*i) sage: R(1).gcd(R(4*i)) 1 diff --git a/src/sage/rings/number_field/number_field_ideal_rel.py b/src/sage/rings/number_field/number_field_ideal_rel.py index eb39f6f4d12..11b59d593ec 100644 --- a/src/sage/rings/number_field/number_field_ideal_rel.py +++ b/src/sage/rings/number_field/number_field_ideal_rel.py @@ -189,7 +189,7 @@ def absolute_ideal(self, names='a'): sage: J.absolute_norm() 2 sage: J.ideal_below() - Fractional ideal (b) + Fractional ideal (-b) sage: J.ideal_below().norm() 2 """ @@ -385,7 +385,7 @@ def relative_norm(self): sage: K. = NumberField(x^2 + 6) sage: L. = K.extension(K['x'].gen()^4 + a) sage: N = L.ideal(b).relative_norm(); N - Fractional ideal (a) + Fractional ideal (-a) sage: N.parent() Monoid of ideals of Number Field in a with defining polynomial x^2 + 6 sage: N.ring() @@ -916,7 +916,7 @@ def is_NumberFieldFractionalIdeal_rel(x): sage: is_NumberFieldFractionalIdeal_rel(I) True sage: N = I.relative_norm(); N - Fractional ideal (a) + Fractional ideal (-a) sage: is_NumberFieldFractionalIdeal_rel(N) False """ diff --git a/src/sage/rings/number_field/order.py b/src/sage/rings/number_field/order.py index 3c2809f4201..04afae98241 100644 --- a/src/sage/rings/number_field/order.py +++ b/src/sage/rings/number_field/order.py @@ -496,7 +496,7 @@ def fractional_ideal(self, *args, **kwds): sage: K. = NumberField(x^2 + 2) sage: R = K.maximal_order() sage: R.fractional_ideal(2/3 + 7*a, a) - Fractional ideal (-1/3*a) + Fractional ideal (1/3*a) """ return self.number_field().fractional_ideal(*args, **kwds) @@ -570,7 +570,7 @@ def __mul__(self, right): sage: k. = NumberField(x^2 + 5077); G = k.class_group(); G Class group of order 22 with structure C22 of Number Field in a with defining polynomial x^2 + 5077 sage: G.0 ^ -9 - Fractional ideal class (67, a + 45) + Fractional ideal class (43, a + 13) sage: Ok = k.maximal_order(); Ok Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 5077 sage: Ok * (11, a + 7) @@ -2933,7 +2933,7 @@ def GaussianIntegers(names='I', latex_name='i'): sage: ZZI Gaussian Integers generated by I in Number Field in I with defining polynomial x^2 + 1 with I = 1*I sage: factor(3 + I) - (-I) * (I - 2) * (-I + 1) + (-2*I - 1) * (I - 1) sage: CC(I) 1.00000000000000*I sage: I.minpoly() @@ -2964,7 +2964,7 @@ def EisensteinIntegers(names='omega'): with defining polynomial x^2 + x + 1 with omega = -0.50000000000000000? + 0.866025403784439?*I sage: factor(3 + omega) - (omega + 1) * (-2*omega + 1) + (omega) * (-3*omega - 2) sage: CC(omega) -0.500000000000000 + 0.866025403784439*I sage: omega.minpoly() diff --git a/src/sage/rings/number_field/selmer_group.py b/src/sage/rings/number_field/selmer_group.py index c6054b6824f..a940c95731d 100644 --- a/src/sage/rings/number_field/selmer_group.py +++ b/src/sage/rings/number_field/selmer_group.py @@ -489,9 +489,9 @@ def pSelmerGroup(K, S, p, proof=None, debug=False): sage: [K.ideal(g).factor() for g in gens] [(Fractional ideal (2, a + 1)) * (Fractional ideal (3, a + 1)), - Fractional ideal (a), - (Fractional ideal (2, a + 1))^2, - 1] + Fractional ideal (-a), + (Fractional ideal (2, a + 1))^2, + 1] sage: toKS2(10) (0, 0, 1, 1) diff --git a/src/sage/rings/polynomial/polynomial_quotient_ring.py b/src/sage/rings/polynomial/polynomial_quotient_ring.py index ae3a4b5254c..3a498a6736c 100644 --- a/src/sage/rings/polynomial/polynomial_quotient_ring.py +++ b/src/sage/rings/polynomial/polynomial_quotient_ring.py @@ -1877,7 +1877,7 @@ def selmer_generators(self, S, m, proof=True): sage: D.selmer_generators([K.ideal(2, -a + 1), ....: K.ideal(3, a + 1), ....: K.ideal(a)], 3) - [2, a + 1, -a] + [2, a + 1, a] """ fields, isos, iso_classes = self._S_decomposition(tuple(S)) n = len(fields) diff --git a/src/sage/rings/rational.pyx b/src/sage/rings/rational.pyx index b1d9e64bae0..dab13ccc48b 100644 --- a/src/sage/rings/rational.pyx +++ b/src/sage/rings/rational.pyx @@ -1446,7 +1446,7 @@ cdef class Rational(sage.structure.element.FieldElement): sage: 0.is_norm(K) True sage: (1/7).is_norm(K, element=True) - (True, -3/7*beta + 5/7) + (True, 1/7*beta + 3/7) sage: (1/10).is_norm(K, element=True) (False, None) sage: (1/691).is_norm(QQ, element=True) @@ -1558,7 +1558,7 @@ cdef class Rational(sage.structure.element.FieldElement): EXAMPLES:: sage: QQ(2)._bnfisnorm(QuadraticField(-1, 'i')) # needs sage.rings.number_field - (-i + 1, 1) + (i - 1, 1) sage: x = polygen(QQ, 'x') sage: 7._bnfisnorm(NumberField(x^3 - 2, 'b')) # needs sage.rings.number_field (1, 7) diff --git a/src/sage/schemes/berkovich/berkovich_space.py b/src/sage/schemes/berkovich/berkovich_space.py index f5455937b43..1330c408f4a 100755 --- a/src/sage/schemes/berkovich/berkovich_space.py +++ b/src/sage/schemes/berkovich/berkovich_space.py @@ -201,7 +201,7 @@ def ideal(self): sage: ideal = A.prime_above(5) sage: B = Berkovich_Cp_Projective(A, ideal) sage: B.ideal() - Fractional ideal (-a - 2) + Fractional ideal (2*a - 1) :: diff --git a/src/sage/schemes/plane_conics/con_number_field.py b/src/sage/schemes/plane_conics/con_number_field.py index 69fe9960c3d..2b084b57dc6 100755 --- a/src/sage/schemes/plane_conics/con_number_field.py +++ b/src/sage/schemes/plane_conics/con_number_field.py @@ -121,7 +121,7 @@ def has_rational_point(self, point=False, obstruction=False, sage: K. = QuadraticField(-1) sage: C = Conic(K, [1, 3, -5]) sage: C.has_rational_point(point=True, obstruction=True) - (False, Fractional ideal (i + 2)) + (False, Fractional ideal (2*i - 1)) sage: C.has_rational_point(algorithm='rnfisnorm') False sage: C.has_rational_point(algorithm='rnfisnorm', obstruction=True, From bb38ebf1405c96ba8cde39211f021098f8a494b3 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Tue, 1 Oct 2024 19:00:00 +0200 Subject: [PATCH 13/26] Fix build with pari 2.17 NEXT_PRIME_VIADIFF is removed in 2.17, port pari_prime_range to pari_PRIMES instead --- src/sage/libs/pari/convert_sage.pyx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/sage/libs/pari/convert_sage.pyx b/src/sage/libs/pari/convert_sage.pyx index e26238d7c38..48338e0279c 100644 --- a/src/sage/libs/pari/convert_sage.pyx +++ b/src/sage/libs/pari/convert_sage.pyx @@ -573,17 +573,16 @@ cpdef list pari_prime_range(long c_start, long c_stop, bint py_ints=False): sage: pari_prime_range(2, 19) [2, 3, 5, 7, 11, 13, 17] """ - cdef long p = 0 - cdef byteptr pari_prime_ptr = diffptr + cdef ulong i = 1 res = [] - while p < c_start: - NEXT_PRIME_VIADIFF(p, pari_prime_ptr) - while p < c_stop: + while pari_PRIMES[i] < c_start: + i+=1 + while pari_PRIMES[i] < c_stop: if py_ints: - res.append(p) + res.append(pari_PRIMES[i]) else: z = PY_NEW(Integer) - mpz_set_ui(z.value, p) + mpz_set_ui(z.value, pari_PRIMES[i]) res.append(z) - NEXT_PRIME_VIADIFF(p, pari_prime_ptr) + i+=1 return res From a723576982713c89dd88995657228087304816af Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Wed, 2 Oct 2024 23:33:02 +0200 Subject: [PATCH 14/26] Adapt new_gen_from_real_mpfr_element to pari 2.17 changes in precision --- src/sage/libs/pari/convert_sage_real_mpfr.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/libs/pari/convert_sage_real_mpfr.pyx b/src/sage/libs/pari/convert_sage_real_mpfr.pyx index 98db6023dc9..5fd7fba1c47 100644 --- a/src/sage/libs/pari/convert_sage_real_mpfr.pyx +++ b/src/sage/libs/pari/convert_sage_real_mpfr.pyx @@ -28,7 +28,7 @@ cpdef Gen new_gen_from_real_mpfr_element(RealNumber self): # We round up the precision to the nearest multiple of wordsize. cdef int rounded_prec - rounded_prec = (self.prec() + wordsize - 1) & ~(wordsize - 1) + rounded_prec = nbits2prec(self.prec()) # Yes, assigning to self works fine, even in Cython. if rounded_prec > prec: @@ -48,7 +48,7 @@ cpdef Gen new_gen_from_real_mpfr_element(RealNumber self): exponent = mpfr_get_z_exp(mantissa, self.value) # Create a PARI REAL - pari_float = cgetr(2 + rounded_prec / wordsize) + pari_float = cgetr(rounded_prec) pari_float[1] = evalexpo(exponent + rounded_prec - 1) + evalsigne(mpfr_sgn(self.value)) mpz_export(&pari_float[2], NULL, 1, wordsize // 8, 0, 0, mantissa) mpz_clear(mantissa) From 457daa5e7fa89f90b62f3a7aa9b9263030b39103 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sat, 5 Oct 2024 21:24:38 +0200 Subject: [PATCH 15/26] Update tests output for pari 2.17 --- src/sage/arith/misc.py | 6 +- src/sage/categories/quotient_fields.py | 2 +- .../arithmetic_dynamics/berkovich_ds.py | 4 +- .../arithmetic_dynamics/projective_ds.py | 2 +- src/sage/libs/pari/tests.py | 8 +- src/sage/matrix/matrix2.pyx | 2 +- src/sage/modular/cusps_nf.py | 8 +- src/sage/modular/dirichlet.py | 8 +- src/sage/modular/modsym/p1list_nf.py | 8 +- src/sage/quadratic_forms/binary_qf.py | 8 +- .../finite_rings/finite_field_prime_modn.py | 6 +- src/sage/rings/finite_rings/residue_field.pyx | 41 ++-- .../finite_rings/residue_field_pari_ffelt.pyx | 2 +- src/sage/rings/integer.pyx | 2 +- src/sage/rings/number_field/S_unit_solver.py | 52 ++--- src/sage/rings/number_field/galois_group.py | 4 +- src/sage/rings/number_field/number_field.py | 196 +++++++++--------- .../number_field/number_field_element.pyx | 8 +- .../rings/number_field/number_field_ideal.py | 42 ++-- .../number_field/number_field_ideal_rel.py | 22 +- .../rings/number_field/number_field_rel.py | 16 +- src/sage/rings/number_field/order.py | 8 +- src/sage/rings/number_field/selmer_group.py | 2 +- .../polynomial/polynomial_quotient_ring.py | 46 ++-- src/sage/rings/qqbar.py | 18 +- src/sage/rings/rational.pyx | 4 +- src/sage/schemes/affine/affine_morphism.py | 8 +- src/sage/schemes/elliptic_curves/ell_field.py | 2 +- .../schemes/elliptic_curves/ell_local_data.py | 2 +- .../elliptic_curves/ell_number_field.py | 51 ++--- src/sage/schemes/elliptic_curves/ell_point.py | 8 +- .../elliptic_curves/ell_rational_field.py | 2 +- .../elliptic_curves/gal_reps_number_field.py | 10 +- src/sage/schemes/elliptic_curves/gp_simon.py | 2 +- .../schemes/elliptic_curves/isogeny_class.py | 20 +- .../elliptic_curves/isogeny_small_degree.py | 8 +- .../schemes/plane_conics/con_number_field.py | 4 +- .../schemes/projective/projective_morphism.py | 14 +- .../schemes/projective/projective_point.py | 6 +- src/sage/structure/factorization.py | 8 +- 40 files changed, 336 insertions(+), 334 deletions(-) diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py index 637ed9192bd..a90c00364bb 100644 --- a/src/sage/arith/misc.py +++ b/src/sage/arith/misc.py @@ -2693,7 +2693,7 @@ def factor(n, proof=None, int_=False, algorithm='pari', verbose=0, **kwds): sage: K. = QuadraticField(-1) # needs sage.rings.number_field sage: factor(122 - 454*i) # needs sage.rings.number_field - (-i) * (-i - 2)^3 * (i + 1)^3 * (-2*i + 3) * (i + 4) + (-i - 2)^3 * (-i - 1)^3 * (3*i + 2) * (i + 4) To access the data in a factorization:: @@ -2776,7 +2776,7 @@ def radical(n, *args, **kwds): ArithmeticError: radical of 0 is not defined sage: K. = QuadraticField(-1) # needs sage.rings.number_field sage: radical(K(2)) # needs sage.rings.number_field - i + 1 + -i - 1 Tests with numpy and gmpy2 numbers:: @@ -3031,7 +3031,7 @@ def is_squarefree(n): sage: is_squarefree(O(2)) False sage: O(2).factor() - (-I) * (I + 1)^2 + (-I) * (-I - 1)^2 This method fails on domains which are not Unique Factorization Domains:: diff --git a/src/sage/categories/quotient_fields.py b/src/sage/categories/quotient_fields.py index 76f0570a819..0e4d13ef889 100644 --- a/src/sage/categories/quotient_fields.py +++ b/src/sage/categories/quotient_fields.py @@ -100,7 +100,7 @@ def gcd(self, other): sage: R = ZZ.extension(x^2 + 1, names='i') sage: i = R.1 sage: gcd(5, 3 + 4*i) - -i - 2 + 2*i - 1 sage: P. = R[] sage: gcd(t, i) Traceback (most recent call last): diff --git a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py index 9734b3767ac..d3f9c3cdf41 100644 --- a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py +++ b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py @@ -690,10 +690,10 @@ def conjugate(self, M, adjugate=False, new_ideal=None): sage: # needs sage.rings.number_field sage: ideal = A.ideal(5).factor()[1][0]; ideal - Fractional ideal (2*a + 1) + Fractional ideal (-a + 2) sage: g = f.conjugate(conj, new_ideal=ideal) sage: g.domain().ideal() - Fractional ideal (2*a + 1) + Fractional ideal (-a + 2) """ if self.domain().is_padic_base(): return DynamicalSystem_Berkovich(self._system.conjugate(M, adjugate=adjugate)) diff --git a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py index 591693e5af8..fa9d808fd33 100644 --- a/src/sage/dynamics/arithmetic_dynamics/projective_ds.py +++ b/src/sage/dynamics/arithmetic_dynamics/projective_ds.py @@ -1791,7 +1791,7 @@ def primes_of_bad_reduction(self, check=True): sage: P. = ProjectiveSpace(K,1) sage: f = DynamicalSystem_projective([1/3*x^2+1/a*y^2, y^2]) sage: f.primes_of_bad_reduction() # needs sage.rings.function_field - [Fractional ideal (a), Fractional ideal (3)] + [Fractional ideal (-a), Fractional ideal (3)] This is an example where ``check=False`` returns extra primes:: diff --git a/src/sage/libs/pari/tests.py b/src/sage/libs/pari/tests.py index 1ed571cd4b9..bd8dc9641d2 100644 --- a/src/sage/libs/pari/tests.py +++ b/src/sage/libs/pari/tests.py @@ -1502,7 +1502,7 @@ sage: pari(-104).quadclassunit() [6, [6], [Qfb(5, -4, 6)], 1] sage: pari(109).quadclassunit() - [1, [], [], 5.56453508676047] + [1, [], [], 5.56453508676047, -1] sage: pari(10001).quadclassunit() # random generators [16, [16], [Qfb(10, 99, -5, 0.E-38)], 5.29834236561059] sage: pari(10001).quadclassunit()[0] @@ -1749,13 +1749,13 @@ sage: y = QQ['yy'].0; _ = pari(y) # pari has variable ordering rules sage: x = QQ['zz'].0; nf = pari(x^2 + 2).nfinit() sage: nf.nfroots(y^2 + 2) - [Mod(-zz, zz^2 + 2), Mod(zz, zz^2 + 2)] + [Mod(-zz, zz^2 + 2), Mod(zz, zz^2 + 2)]~ sage: nf = pari(x^3 + 2).nfinit() sage: nf.nfroots(y^3 + 2) - [Mod(zz, zz^3 + 2)] + [Mod(zz, zz^3 + 2)]~ sage: nf = pari(x^4 + 2).nfinit() sage: nf.nfroots(y^4 + 2) - [Mod(-zz, zz^4 + 2), Mod(zz, zz^4 + 2)] + [Mod(-zz, zz^4 + 2), Mod(zz, zz^4 + 2)]~ sage: nf = pari('x^2 + 1').nfinit() sage: nf.nfrootsof1() diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx index dec25a76e54..481fa70bebe 100644 --- a/src/sage/matrix/matrix2.pyx +++ b/src/sage/matrix/matrix2.pyx @@ -16584,7 +16584,7 @@ cdef class Matrix(Matrix1): ....: -2*a^2 + 4*a - 2, -2*a^2 + 1, 2*a, a^2 - 6, 3*a^2 - a ]) sage: r,s,p = m._echelon_form_PID() sage: s[2] - (0, 0, -3*a^2 - 18*a + 34, -68*a^2 + 134*a - 53, -111*a^2 + 275*a - 90) + (0, 0, 3*a^2 + 18*a - 34, 68*a^2 - 134*a + 53, 111*a^2 - 275*a + 90) sage: r * m == s and r.det() == 1 True diff --git a/src/sage/modular/cusps_nf.py b/src/sage/modular/cusps_nf.py index 4d120c075da..f3a3ff7e65b 100644 --- a/src/sage/modular/cusps_nf.py +++ b/src/sage/modular/cusps_nf.py @@ -1184,9 +1184,9 @@ def NFCusps_ideal_reps_for_levelN(N, nlists=1): sage: from sage.modular.cusps_nf import NFCusps_ideal_reps_for_levelN sage: NFCusps_ideal_reps_for_levelN(N) [(Fractional ideal (1), - Fractional ideal (67, a + 17), - Fractional ideal (127, a + 48), - Fractional ideal (157, a - 19))] + Fractional ideal (67, -4/7*a^3 + 13/7*a^2 + 39/7*a - 43), + Fractional ideal (127, -4/7*a^3 + 13/7*a^2 + 39/7*a - 42), + Fractional ideal (157, -4/7*a^3 + 13/7*a^2 + 39/7*a + 48))] sage: L = NFCusps_ideal_reps_for_levelN(N, 5) sage: all(len(L[i]) == k.class_number() for i in range(len(L))) True @@ -1244,7 +1244,7 @@ def units_mod_ideal(I): sage: I = k.ideal(5, a + 1) sage: units_mod_ideal(I) [1, - -2*a^2 - 4*a + 1, + 2*a^2 + 4*a - 1, ...] :: diff --git a/src/sage/modular/dirichlet.py b/src/sage/modular/dirichlet.py index c261a84e8de..8ca797b5f16 100644 --- a/src/sage/modular/dirichlet.py +++ b/src/sage/modular/dirichlet.py @@ -2398,13 +2398,13 @@ class DirichletGroupFactory(UniqueFactory): sage: parent(val) Gaussian Integers generated by zeta4 in Cyclotomic Field of order 4 and degree 2 sage: r4_29_0 = r4.residue_field(K(29).factor()[0][0]); r4_29_0(val) - 17 + 12 sage: r4_29_0(val) * GF(29)(3) - 22 + 7 sage: r4_29_0(G.gens()[2].values_on_gens()[2]) * 3 - 22 + 7 sage: parent(r4_29_0(G.gens()[2].values_on_gens()[2]) * 3) - Residue field of Fractional ideal (-2*zeta4 + 5) + Residue field of Fractional ideal (-2*zeta4 - 5) :: diff --git a/src/sage/modular/modsym/p1list_nf.py b/src/sage/modular/modsym/p1list_nf.py index 86d33071974..00bb0979ea4 100644 --- a/src/sage/modular/modsym/p1list_nf.py +++ b/src/sage/modular/modsym/p1list_nf.py @@ -61,7 +61,7 @@ sage: alpha = MSymbol(N, a + 2, 3*a^2) sage: alpha.lift_to_sl2_Ok() - [-1, 4*a^2 - 13*a + 23, a + 2, 5*a^2 + 3*a - 3] + [-a - 1, 15*a^2 - 38*a + 86, a + 2, -a^2 + 9*a - 19] sage: Ok = k.ring_of_integers() sage: M = Matrix(Ok, 2, alpha.lift_to_sl2_Ok()) sage: det(M) @@ -977,11 +977,11 @@ def apply_J_epsilon(self, i, e1, e2=1): sage: N = k.ideal(5, a + 1) sage: P = P1NFList(N) sage: u = k.unit_group().gens_values(); u - [-1, -2*a^2 - 4*a + 1] + [-1, 2*a^2 + 4*a - 1] sage: P.apply_J_epsilon(4, -1) 2 sage: P.apply_J_epsilon(4, u[0], u[1]) - 5 + 1 :: @@ -1122,7 +1122,7 @@ def lift_to_sl2_Ok(N, c, d): sage: M = Matrix(Ok, 2, lift_to_sl2_Ok(N, 0, 7)) Traceback (most recent call last): ... - ValueError: <0> + <7> and the Fractional ideal (7, a) are not coprime. + ValueError: <0> + <7> and the Fractional ideal (7, -4/7*a^3 + 13/7*a^2 + 39/7*a - 19) are not coprime. """ k = N.number_field() # check the input diff --git a/src/sage/quadratic_forms/binary_qf.py b/src/sage/quadratic_forms/binary_qf.py index 202da0652ff..083bdee237d 100644 --- a/src/sage/quadratic_forms/binary_qf.py +++ b/src/sage/quadratic_forms/binary_qf.py @@ -1646,7 +1646,7 @@ def solve_integer(self, n, *, algorithm='general', _flag=2): sage: Q = BinaryQF([1, 0, 12345]) sage: n = 2^99 + 5273 sage: Q.solve_integer(n) # needs sage.libs.pari - (-67446480057659, 7139620553488) + (67446480057659, 7139620553488) sage: Q.solve_integer(n, algorithm='cornacchia') # needs sage.libs.pari (67446480057659, 7139620553488) sage: timeit('Q.solve_integer(n)') # not tested @@ -1661,7 +1661,7 @@ def solve_integer(self, n, *, algorithm='general', _flag=2): sage: Qs [x^2 + x*y + 6*y^2, 2*x^2 - x*y + 3*y^2, 2*x^2 + x*y + 3*y^2] sage: [Q.solve_integer(3) for Q in Qs] - [None, (0, -1), (0, -1)] + [None, (0, 1), (0, 1)] sage: [Q.solve_integer(5) for Q in Qs] [None, None, None] sage: [Q.solve_integer(6) for Q in Qs] @@ -1741,11 +1741,11 @@ def solve_integer(self, n, *, algorithm='general', _flag=2): sage: # needs sage.libs.pari sage: Q = BinaryQF([1, 0, 5]) sage: Q.solve_integer(126, _flag=1) - [(11, -1), (-1, -5), (-1, 5), (-11, -1)] + [(-11, -1), (-1, -5), (-1, 5), (11, -1)] sage: Q.solve_integer(126, _flag=2) (11, -1) sage: Q.solve_integer(126, _flag=3) - [(11, -1), (-1, -5), (-1, 5), (-11, -1), (-9, -3), (9, -3)] + [(-11, -1), (-9, -3), (-1, -5), (-1, 5), (9, -3), (11, -1)] """ if self.is_negative_definite(): # not supported by PARI return (-self).solve_integer(-n) diff --git a/src/sage/rings/finite_rings/finite_field_prime_modn.py b/src/sage/rings/finite_rings/finite_field_prime_modn.py index d94b0a4335a..0978c7328fe 100644 --- a/src/sage/rings/finite_rings/finite_field_prime_modn.py +++ b/src/sage/rings/finite_rings/finite_field_prime_modn.py @@ -114,9 +114,9 @@ def _coerce_map_from_(self, S): sage: RF13 = K.residue_field(pp) sage: RF13.hom([GF(13)(1)]) Ring morphism: - From: Residue field of Fractional ideal (-w - 18) - To: Finite Field of size 13 - Defn: 1 |--> 1 + From: Residue field of Fractional ideal (w + 18) + To: Finite Field of size 13 + Defn: 1 |--> 1 Check that :issue:`19573` is resolved:: diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index f6f8c08666f..5c0e54c475e 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -22,14 +22,13 @@ monogenic (i.e., 2 is an essential discriminant divisor):: sage: # needs sage.rings.number_field sage: K. = NumberField(x^3 + x^2 - 2*x + 8) sage: F = K.factor(2); F - (Fractional ideal (-1/2*a^2 + 1/2*a - 1)) * (Fractional ideal (-a^2 + 2*a - 3)) - * (Fractional ideal (3/2*a^2 - 5/2*a + 4)) + (Fractional ideal (-1/2*a^2 + 1/2*a - 1)) * (Fractional ideal (a^2 - 2*a + 3)) * (Fractional ideal (-3/2*a^2 + 5/2*a - 4)) sage: F[0][0].residue_field() Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1) sage: F[1][0].residue_field() - Residue field of Fractional ideal (-a^2 + 2*a - 3) + Residue field of Fractional ideal (a^2 - 2*a + 3) sage: F[2][0].residue_field() - Residue field of Fractional ideal (3/2*a^2 - 5/2*a + 4) + Residue field of Fractional ideal (-3/2*a^2 + 5/2*a - 4) We can also form residue fields from `\ZZ`:: @@ -126,10 +125,10 @@ First over a small non-prime field:: sage: I = ideal([ubar*X + Y]); I Ideal (ubar*X + Y) of Multivariate Polynomial Ring in X, Y over Residue field in ubar of Fractional ideal - (47, 517/55860*u^5 + 235/3724*u^4 + 9829/13965*u^3 - + 54106/13965*u^2 + 64517/27930*u + 755696/13965) + (47, 4841/93100*u^5 + 34451/139650*u^4 + 303697/69825*u^3 + + 297893/27930*u^2 + 1649764/23275*u + 2633506/69825) sage: I.groebner_basis() # needs sage.libs.singular - [X + (-19*ubar^2 - 5*ubar - 17)*Y] + [X + (-15*ubar^2 + 3*ubar - 2)*Y] And now over a large prime field:: @@ -496,9 +495,9 @@ class ResidueField_generic(Field): sage: # needs sage.rings.number_field sage: I = QQ[i].factor(2)[0][0]; I - Fractional ideal (I + 1) + Fractional ideal (-I - 1) sage: k = I.residue_field(); k - Residue field of Fractional ideal (I + 1) + Residue field of Fractional ideal (-I - 1) sage: type(k) @@ -1008,7 +1007,7 @@ cdef class ReductionMap(Map): sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (a + 1) + To: Residue field of Fractional ideal (-a + 1) sage: cr == r # not implemented True sage: r(2 + a) == cr(2 + a) @@ -1039,7 +1038,7 @@ cdef class ReductionMap(Map): sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (a + 1) + To: Residue field of Fractional ideal (-a + 1) sage: cr == r # not implemented True sage: r(2 + a) == cr(2 + a) @@ -1071,7 +1070,7 @@ cdef class ReductionMap(Map): sage: r = F.reduction_map(); r Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 - To: Residue field of Fractional ideal (a + 1) + To: Residue field of Fractional ideal (-a + 1) We test that calling the function also works after copying:: @@ -1083,7 +1082,7 @@ cdef class ReductionMap(Map): Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element 1/2*a - modulo Fractional ideal (a + 1): it has negative valuation + modulo Fractional ideal (-a + 1): it has negative valuation sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; h = t^5 + t^2 + 1 @@ -1105,11 +1104,11 @@ cdef class ReductionMap(Map): sage: # needs sage.rings.number_field sage: K. = NumberField(x^2 + 1) sage: P1, P2 = [g[0] for g in K.factor(5)]; P1, P2 - (Fractional ideal (-i - 2), Fractional ideal (2*i + 1)) + (Fractional ideal (2*i - 1), Fractional ideal (-2*i - 1)) sage: a = 1/(1+2*i) sage: F1, F2 = [g.residue_field() for g in [P1,P2]]; F1, F2 - (Residue field of Fractional ideal (-i - 2), - Residue field of Fractional ideal (2*i + 1)) + (Residue field of Fractional ideal (2*i - 1), + Residue field of Fractional ideal (-2*i - 1)) sage: a.valuation(P1) 0 sage: F1(i/7) @@ -1122,7 +1121,7 @@ cdef class ReductionMap(Map): Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element -2/5*i + 1/5 - modulo Fractional ideal (2*i + 1): it has negative valuation + modulo Fractional ideal (-2*i - 1): it has negative valuation """ # The reduction map is just x |--> F(to_vs(x) * (PB**(-1))) if # either x is integral or the denominator of x is coprime to @@ -1188,8 +1187,7 @@ cdef class ReductionMap(Map): sage: f = k.convert_map_from(K) sage: s = f.section(); s Lifting map: - From: Residue field in abar of - Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) + From: Residue field in abar of Fractional ideal (14*a^4 - 24*a^3 - 26*a^2 + 58*a - 15) To: Number Field in a with defining polynomial x^5 - 5*x + 2 sage: s(k.gen()) a @@ -1424,8 +1422,7 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): sage: f = k.coerce_map_from(K.ring_of_integers()) sage: s = f.section(); s Lifting map: - From: Residue field in abar of - Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) + From: Residue field in abar of Fractional ideal (14*a^4 - 24*a^3 - 26*a^2 + 58*a - 15) To: Maximal Order generated by a in Number Field in a with defining polynomial x^5 - 5*x + 2 sage: s(k.gen()) a @@ -1678,7 +1675,7 @@ cdef class LiftingMap(Section): sage: F. = K.factor(7)[0][0].residue_field() sage: F.lift_map() #indirect doctest Lifting map: - From: Residue field in tmod of Fractional ideal (theta_12^2 + 2) + From: Residue field in tmod of Fractional ideal (2*theta_12^3 + theta_12) To: Maximal Order generated by theta_12 in Cyclotomic Field of order 12 and degree 4 """ return "Lifting" diff --git a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx index e9962c3ccde..90a68c619f6 100644 --- a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx +++ b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx @@ -103,7 +103,7 @@ class ResidueFiniteField_pari_ffelt(ResidueField_generic, FiniteField_pari_ffelt sage: P.residue_class_degree() 2 sage: ff. = P.residue_field(); ff - Residue field in alpha of Fractional ideal (-12*aa^2 + 189*aa - 475) + Residue field in alpha of Fractional ideal (12*aa^2 - 189*aa + 475) sage: type(ff) sage: ff(alpha^2 + 1) diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index c9d1ff65bc6..b4aa04b374f 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -5585,7 +5585,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): sage: 5.is_norm(K) False sage: n.is_norm(K, element=True) - (True, -4*beta + 6) + (True, 4*beta + 6) sage: n.is_norm(K, element=True)[1].norm() 4 sage: n = 5 diff --git a/src/sage/rings/number_field/S_unit_solver.py b/src/sage/rings/number_field/S_unit_solver.py index 0ffac369720..1260650ef77 100644 --- a/src/sage/rings/number_field/S_unit_solver.py +++ b/src/sage/rings/number_field/S_unit_solver.py @@ -12,10 +12,10 @@ sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^2 + x + 1) sage: S = K.primes_above(3) - sage: expected = [((0, 1), (4, 0), xi + 2, -xi - 1), - ....: ((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), + sage: expected = [((4, 1), (4, 0), xi + 2, -xi - 1), + ....: ((3, -1), (2, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), ....: ((1, 0), (5, 0), xi + 1, -xi), - ....: ((2, 0), (5, 1), xi, -xi + 1)] + ....: ((2, 0), (3, 1), xi, -xi + 1)] sage: sols = solve_S_unit_equation(K, S, 200) sage: eq_up_to_order(sols, expected) True @@ -1448,7 +1448,7 @@ def embedding_to_Kp(a, prime, prec): sage: from sage.rings.number_field.S_unit_solver import embedding_to_Kp sage: K. = QuadraticField(17) sage: p = K.prime_above(13); p - Fractional ideal (-a + 2) + Fractional ideal (a - 2) sage: embedding_to_Kp(a-3, p, 15) -20542890112375827 @@ -1791,10 +1791,10 @@ def sieve_ordering(SUK, q): Residue field of Fractional ideal (2*xi + 1)) sage: sieve_data[2] - ([18, 12, 16, 8], [18, 16, 10, 4], [18, 10, 12, 10]) + ([18, 9, 16, 8], [18, 7, 10, 4], [18, 3, 12, 10]) sage: sieve_data[3] - (648, 2916, 3888) + (972, 972, 3888) """ K = SUK.number_field() @@ -2170,23 +2170,23 @@ def construct_complement_dictionaries(split_primes_list, SUK, verbose=False): sage: SUK = K.S_unit_group(S=K.primes_above(H)) sage: split_primes_list = [3, 7] sage: actual = construct_complement_dictionaries(split_primes_list, SUK) - sage: expected = {3: {(0, 1, 0): [(1, 0, 0), (0, 1, 0)], - ....: (1, 0, 0): [(1, 0, 0), (0, 1, 0)]}, - ....: 7: {(0, 1, 0): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (0, 1, 2): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], - ....: (0, 3, 2): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (0, 3, 4): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], - ....: (0, 5, 0): [(0, 1, 2), (0, 3, 4), (0, 5, 0)], - ....: (0, 5, 4): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], - ....: (1, 0, 0): [(0, 5, 4), (0, 3, 2), (0, 1, 0)], - ....: (1, 0, 2): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], + sage: expected = {3: {(1, 1, 0): [(1, 0, 0), (1, 1, 0)], + ....: (1, 0, 0): [(1, 0, 0), (1, 1, 0)]}, + ....: 7: {(1, 1, 0): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], + ....: (1, 3, 2): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], + ....: (1, 5, 4): [(1, 0, 0), (1, 4, 4), (1, 2, 2)], ....: (1, 0, 4): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], ....: (1, 2, 0): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], - ....: (1, 2, 2): [(0, 5, 4), (0, 3, 2), (0, 1, 0)], + ....: (1, 4, 2): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], + ....: (1, 1, 2): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], + ....: (1, 3, 4): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], + ....: (1, 5, 0): [(1, 1, 2), (1, 3, 4), (1, 5, 0)], + ....: (1, 0, 2): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], ....: (1, 2, 4): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], ....: (1, 4, 0): [(1, 0, 4), (1, 4, 2), (1, 2, 0)], - ....: (1, 4, 2): [(1, 2, 4), (1, 4, 0), (1, 0, 2)], - ....: (1, 4, 4): [(0, 5, 4), (0, 3, 2), (0, 1, 0)]}} + ....: (1, 0, 0): [(1, 5, 4), (1, 3, 2), (1, 1, 0)], + ....: (1, 2, 2): [(1, 5, 4), (1, 3, 2), (1, 1, 0)], + ....: (1, 4, 4): [(1, 5, 4), (1, 3, 2), (1, 1, 0)]}} sage: all(set(actual[p][vec]) == set(expected[p][vec]) ....: for p in [3, 7] for vec in expected[p]) True @@ -2693,9 +2693,9 @@ def sieve_below_bound(K, S, bound=10, bump=10, split_primes_list=[], verbose=Fal sage: SUK = UnitGroup(K, S=tuple(K.primes_above(3))) sage: S = SUK.primes() sage: sols = sieve_below_bound(K, S, 10) - sage: expected = [((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), - ....: ((0, 1), (4, 0), xi + 2, -xi - 1), - ....: ((2, 0), (5, 1), xi, -xi + 1), + sage: expected = [((3, -1), (2, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), + ....: ((4, 1), (4, 0), xi + 2, -xi - 1), + ....: ((2, 0), (3, 1), xi, -xi + 1), ....: ((1, 0), (5, 0), xi + 1, -xi)] sage: eq_up_to_order(sols, expected) True @@ -2758,10 +2758,10 @@ def solve_S_unit_equation(K, S, prec=106, include_exponents=True, include_bound= sage: K. = NumberField(x^2 + x + 1) sage: S = K.primes_above(3) sage: sols = solve_S_unit_equation(K, S, 200) - sage: expected = [((0, 1), (4, 0), xi + 2, -xi - 1), - ....: ((1, -1), (0, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), + sage: expected = [((4, 1), (4, 0), xi + 2, -xi - 1), + ....: ((3, -1), (2, -1), 1/3*xi + 2/3, -1/3*xi + 1/3), ....: ((1, 0), (5, 0), xi + 1, -xi), - ....: ((2, 0), (5, 1), xi, -xi + 1)] + ....: ((2, 0), (3, 1), xi, -xi + 1)] sage: eq_up_to_order(sols, expected) True @@ -2769,7 +2769,7 @@ def solve_S_unit_equation(K, S, prec=106, include_exponents=True, include_bound= sage: solutions, bound = solve_S_unit_equation(K, S, 100, include_bound=True) sage: bound - 7 + 6 You can omit the exponent vectors:: diff --git a/src/sage/rings/number_field/galois_group.py b/src/sage/rings/number_field/galois_group.py index c974c3df6ff..ee53ca6d674 100644 --- a/src/sage/rings/number_field/galois_group.py +++ b/src/sage/rings/number_field/galois_group.py @@ -995,8 +995,8 @@ def artin_symbol(self, P): sage: K. = NumberField(x^4 - 2*x^2 + 2, 'a').galois_closure() sage: G = K.galois_group() sage: [G.artin_symbol(P) for P in K.primes_above(7)] - [(1,4)(2,3)(5,8)(6,7), (1,4)(2,3)(5,8)(6,7), - (1,5)(2,6)(3,7)(4,8), (1,5)(2,6)(3,7)(4,8)] + [(1,5)(2,6)(3,7)(4,8), (1,5)(2,6)(3,7)(4,8), + (1,4)(2,3)(5,8)(6,7), (1,4)(2,3)(5,8)(6,7)] sage: G.artin_symbol(17) Traceback (most recent call last): ... diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index dbd8e7e2edf..bfde33124d1 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -3627,7 +3627,7 @@ def fractional_ideal(self, *gens, **kwds): sage: L. = K.extension(x^2 - 3, x^2 + 1) sage: M. = L.extension(x^2 + 1) sage: L.ideal(K.ideal(2, a)) - Fractional ideal (a) + Fractional ideal (-a) sage: M.ideal(K.ideal(2, a)) == M.ideal(a*(b - c)/2) True @@ -3665,40 +3665,29 @@ def ideals_of_bdd_norm(self, bound): sage: x = polygen(QQ, 'x') sage: K. = NumberField(x^2 + 23) - sage: d = K.ideals_of_bdd_norm(10) - sage: for n in d: - ....: print(n) - ....: for I in sorted(d[n]): - ....: print(I) - 1 - Fractional ideal (1) - 2 - Fractional ideal (2, 1/2*a - 1/2) - Fractional ideal (2, 1/2*a + 1/2) - 3 - Fractional ideal (3, 1/2*a - 1/2) - Fractional ideal (3, 1/2*a + 1/2) - 4 - Fractional ideal (2) - Fractional ideal (4, 1/2*a + 3/2) - Fractional ideal (4, 1/2*a + 5/2) - 5 - 6 - Fractional ideal (1/2*a - 1/2) - Fractional ideal (1/2*a + 1/2) - Fractional ideal (6, 1/2*a + 5/2) - Fractional ideal (6, 1/2*a + 7/2) - 7 - 8 - Fractional ideal (4, a - 1) - Fractional ideal (4, a + 1) - Fractional ideal (1/2*a + 3/2) - Fractional ideal (1/2*a - 3/2) - 9 - Fractional ideal (3) - Fractional ideal (9, 1/2*a + 7/2) - Fractional ideal (9, 1/2*a + 11/2) - 10 + sage: d = K.ideals_of_bdd_norm(10); d # random + {1: [Fractional ideal (1)], + 2: [Fractional ideal (2, 1/2*a - 1/2), Fractional ideal (2, 1/2*a + 1/2)], + 3: [Fractional ideal (3, 1/2*a + 1/2), Fractional ideal (3, 1/2*a - 1/2)], + 4: [Fractional ideal (4, 1/2*a + 3/2), + Fractional ideal (2), + Fractional ideal (4, 1/2*a + 5/2)], + 5: [], + 6: [Fractional ideal (6, 1/2*a + 7/2), + Fractional ideal (-1/2*a - 1/2), + Fractional ideal (-1/2*a + 1/2), + Fractional ideal (6, 1/2*a + 5/2)], + 7: [], + 8: [Fractional ideal (1/2*a + 3/2), + Fractional ideal (4, a - 1), + Fractional ideal (4, a + 1), + Fractional ideal (-1/2*a + 3/2)], + 9: [Fractional ideal (9, 1/2*a + 7/2), + Fractional ideal (3), + Fractional ideal (9, 1/2*a + 11/2)], + 10: []} + sage: [[I.norm() for I in sorted(d[n])] for n in d] + [[1], [2, 2], [3, 3], [4, 4, 4], [], [6, 6, 6, 6], [], [8, 8, 8, 8], [9, 9, 9], []] """ hnf_ideals = self.pari_nf().ideallist(bound) d = {} @@ -3925,9 +3914,13 @@ def primes_of_bounded_norm(self, B): EXAMPLES:: sage: K. = QuadraticField(-1) - sage: K.primes_of_bounded_norm(10) - [Fractional ideal (i + 1), Fractional ideal (-i - 2), - Fractional ideal (2*i + 1), Fractional ideal (3)] + sage: P = K.primes_of_bounded_norm(10); P # random + [Fractional ideal (i + 1), + Fractional ideal (i + 2), + Fractional ideal (-i + 2), + Fractional ideal (3)] + sage: [p.norm() for p in P] + [2, 5, 5, 9] sage: K.primes_of_bounded_norm(1) [] sage: x = polygen(QQ, 'x') @@ -3936,10 +3929,10 @@ def primes_of_bounded_norm(self, B): sage: P [Fractional ideal (a), Fractional ideal (a + 1), - Fractional ideal (-a^2 - 1), + Fractional ideal (a^2 + 1), Fractional ideal (a^2 + a - 1), Fractional ideal (2*a + 1), - Fractional ideal (-2*a^2 - a - 1), + Fractional ideal (2*a^2 + a + 1), Fractional ideal (a^2 - 2*a - 1), Fractional ideal (a + 3)] sage: [p.norm() for p in P] @@ -3988,11 +3981,13 @@ def primes_of_bounded_norm_iter(self, B): sage: K. = QuadraticField(-1) sage: it = K.primes_of_bounded_norm_iter(10) - sage: list(it) + sage: l = list(it); l # random [Fractional ideal (i + 1), Fractional ideal (3), - Fractional ideal (-i - 2), - Fractional ideal (2*i + 1)] + Fractional ideal (i + 2), + Fractional ideal (-i + 2)] + sage: [I.norm() for I in l] + [2, 9, 5, 5] sage: list(K.primes_of_bounded_norm_iter(1)) [] """ @@ -4317,7 +4312,7 @@ def pari_nf(self, important=True): sage: k. = NumberField(x^4 - 3/2*x + 5/3); k Number Field in a with defining polynomial x^4 - 3/2*x + 5/3 sage: k.pari_nf() - [y^4 - 324*y + 2160, [0, 2], 48918708, 216, ..., [36, 36*y, y^3 + 6*y^2 - 252, 6*y^2], [1, 0, 0, 252; 0, 1, 0, 0; 0, 0, 0, 36; 0, 0, 6, -36], [1, 0, 0, 0, 0, 0, -18, 42, 0, -18, -46, -60, 0, 42, -60, -60; 0, 1, 0, 0, 1, 0, 2, 0, 0, 2, -11, -1, 0, 0, -1, 9; 0, 0, 1, 0, 0, 0, 6, 6, 1, 6, -5, 0, 0, 6, 0, 0; 0, 0, 0, 1, 0, 6, -6, -6, 0, -6, -1, 2, 1, -6, 2, 0]] + [y^4 - 324*y + 2160, [0, 2], 48918708, 216, ..., [36, 36*y, y^3 + 6*y^2 - 252, -6*y^2], [1, 0, 0, 252; 0, 1, 0, 0; 0, 0, 0, 36; 0, 0, -6, 36], [1, 0, 0, 0, 0, 0, -18, -42, 0, -18, -46, 60, 0, -42, 60, -60; 0, 1, 0, 0, 1, 0, 2, 0, 0, 2, -11, 1, 0, 0, 1, 9; 0, 0, 1, 0, 0, 0, 6, -6, 1, 6, -5, 0, 0, -6, 0, 0; 0, 0, 0, 1, 0, -6, 6, -6, 0, 6, 1, 2, 1, -6, 2, 0]] sage: pari(k) [y^4 - 324*y + 2160, [0, 2], 48918708, 216, ...] sage: gp(k) @@ -4807,7 +4802,7 @@ def _S_class_group_and_units(self, S, proof=True): 1/13*a^2 + 7/13*a - 332/13, -1/13*a^2 + 6/13*a + 345/13, -1, - -2/13*a^2 - 1/13*a + 755/13] + 1/13*a^2 - 19/13*a - 7/13] sage: units[5] in (1/13*a^2 - 19/13*a - 7/13, 1/13*a^2 + 20/13*a - 7/13) True sage: len(units) == 6 @@ -4818,7 +4813,7 @@ def _S_class_group_and_units(self, S, proof=True): sage: K. = NumberField(2*x^2 - 1/3) sage: K._S_class_group_and_units(tuple(K.primes_above(2) + K.primes_above(3))) - ([6*a + 2, 6*a + 3, -1, -12*a + 5], []) + ([...6*a...2, ...6*a...3, -1, ...12*a...5], []) """ K_pari = self.pari_bnf(proof=proof) S_pari = [p.pari_prime() for p in sorted(set(S))] @@ -4996,7 +4991,7 @@ def selmer_generators(self, S, m, proof=True, orders=False): 1/13*a^2 + 7/13*a - 332/13, -1/13*a^2 + 6/13*a + 345/13, -1, - -2/13*a^2 - 1/13*a + 755/13] + 1/13*a^2 - 19/13*a - 7/13] sage: gens[5] in (1/13*a^2 - 19/13*a - 7/13, 1/13*a^2 + 20/13*a - 7/13) True sage: gens[6] in (-1/13*a^2 + 45/13*a - 97/13, 1/13*a^2 - 45/13*a + 97/13) @@ -5153,16 +5148,20 @@ def selmer_space(self, S, p, proof=None): sage: KS2, gens, fromKS2, toKS2 = K.selmer_space([P2, P3, P5], 2) sage: KS2 Vector space of dimension 4 over Finite Field of size 2 - sage: gens - [a + 1, a, 2, -1] + sage: gens # random + [-a - 1, a, 2, -1] + sage: gens in ([-a - 1, a, 2, -1], [a + 1, a, 2, -1]) + True Each generator must have even valuation at primes not in `S`:: - sage: [K.ideal(g).factor() for g in gens] + sage: facgens = [K.ideal(g).factor() for g in gens]; facgens # random [(Fractional ideal (2, a + 1)) * (Fractional ideal (3, a + 1)), Fractional ideal (a), (Fractional ideal (2, a + 1))^2, 1] + sage: facgens[2][0][1] + 2 sage: toKS2(10) (0, 0, 1, 1) @@ -5174,8 +5173,10 @@ def selmer_space(self, S, p, proof=None): sage: KS3, gens, fromKS3, toKS3 = K.selmer_space([P2, P3, P5], 3) sage: KS3 Vector space of dimension 3 over Finite Field of size 3 - sage: gens - [1/2, 1/4*a + 1/4, a] + sage: gens # random + [1/2, -1/4*a - 1/4, a] + sage: gens in ([1/2, -1/4*a - 1/4, a], [1/2, 1/4*a + 1/4, a]) + True An example to show that the group `K(S,2)` may be strictly larger than the group of elements giving extensions unramified @@ -5640,7 +5641,7 @@ def different(self): sage: k. = NumberField(x^2 + 23) sage: d = k.different() sage: d - Fractional ideal (-a) + Fractional ideal (a) sage: d.norm() 23 sage: k.disc() @@ -5760,7 +5761,7 @@ def elements_of_norm(self, n, proof=None) -> list: sage: K.elements_of_norm(3) [] sage: K.elements_of_norm(50) - [-a - 7, 5*a - 5, 7*a + 1] + [7*a - 1, 5*a - 5, -7*a - 1] TESTS: @@ -5871,11 +5872,16 @@ def factor(self, n): sage: K. = NumberField(x^2 + 1) sage: K.factor(1/3) (Fractional ideal (3))^-1 - sage: K.factor(1+a) - Fractional ideal (a + 1) - sage: K.factor(1+a/5) - (Fractional ideal (a + 1)) * (Fractional ideal (-a - 2))^-1 - * (Fractional ideal (2*a + 1))^-1 * (Fractional ideal (-2*a + 3)) + sage: fac = K.factor(1+a); fac # random + Fractional ideal (-a - 1) + sage: len(fac) + 1 + sage: fac = K.factor(1+a/5); fac # random + (Fractional ideal (-a - 1)) * (Fractional ideal (2*a - 1))^-1 * (Fractional ideal (-2*a - 1))^-1 * (Fractional ideal (3*a + 2)) + sage: len(fac) + 4 + sage: product(I[0]^I[1] for I in list(fac)) + Fractional ideal (1/5*a + 1) An example over a relative number field:: @@ -5908,9 +5914,9 @@ def factor(self, n): sage: (fi, fj) = f[::] sage: (fi[1], fj[1]) (1, 1) - sage: fi[0] == L.fractional_ideal(1/2*a*b - a + 1/2) + sage: fi[0] == L.fractional_ideal(-1/2*a*b - a + 1/2) True - sage: fj[0] == L.fractional_ideal(-1/2*a*b - a + 1/2) + sage: fj[0] == L.fractional_ideal(1/2*a*b - a + 1/2) True """ return self.ideal(n).factor() @@ -6507,12 +6513,12 @@ def reduced_basis(self, prec=None): sage: k. = NumberField(x^6 + 2218926655879913714112*x^4 - 32507675650290949030789018433536*x^3 + 4923635504174417014460581055002374467948544*x^2 - 36066074010564497464129951249279114076897746988630016*x + 264187244046129768986806800244258952598300346857154900812365824) sage: new_basis = k.reduced_basis(prec=120) sage: [c.minpoly() for c in new_basis] - [x - 1, - x^2 + x + 1, - x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, - x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, - x^3 - 171*x + 848, - x^6 + 171*x^4 + 1696*x^3 + 29241*x^2 + 145008*x + 719104] + [x^2 + x + 1, + x - 1, + x^6 + 3*x^5 - 102*x^4 - 315*x^3 + 10254*x^2 + 80955*x + 198147, + x^6 + 213*x^4 + 12567*x^2 + 198147, + x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104, + x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104] sage: R = k.order(new_basis) sage: R.discriminant()==k.discriminant() True @@ -7107,14 +7113,14 @@ def units(self, proof=None): sage: K.units(proof=True) # takes forever, not tested ... sage: K.units(proof=False) # result not independently verified - (-a^9 - a + 1, + (a^9 + a - 1, + -a^15 + a^12 - a^10 + a^9 + 2*a^8 - 3*a^7 - a^6 + 3*a^5 - a^4 - 4*a^3 + 3*a^2 + 2*a - 2, + a^15 + a^14 + a^13 + a^12 + a^10 - a^7 - a^6 - a^2 - 1, + 2*a^16 - 3*a^15 + 3*a^14 - 3*a^13 + 3*a^12 - a^11 + a^9 - 3*a^8 + 4*a^7 - 5*a^6 + 6*a^5 - 4*a^4 + 3*a^3 - 2*a^2 - 2*a + 4, -a^16 + a^15 - a^14 + a^12 - a^11 + a^10 + a^8 - a^7 + 2*a^6 - a^4 + 3*a^3 - 2*a^2 + 2*a - 1, - 2*a^16 - a^14 - a^13 + 3*a^12 - 2*a^10 + a^9 + 3*a^8 - 3*a^6 + 3*a^5 + 3*a^4 - 2*a^3 - 2*a^2 + 3*a + 4, - a^15 + a^14 + 2*a^11 + a^10 - a^9 + a^8 + 2*a^7 - a^5 + 2*a^3 - a^2 - 3*a + 1, - -a^16 - a^15 - a^14 - a^13 - a^12 - a^11 - a^10 - a^9 - a^8 - a^7 - a^6 - a^5 - a^4 - a^3 - a^2 + 2, - -2*a^16 + 3*a^15 - 3*a^14 + 3*a^13 - 3*a^12 + a^11 - a^9 + 3*a^8 - 4*a^7 + 5*a^6 - 6*a^5 + 4*a^4 - 3*a^3 + 2*a^2 + 2*a - 4, - a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2, - 2*a^16 + a^15 - a^11 - 3*a^10 - 4*a^9 - 4*a^8 - 4*a^7 - 5*a^6 - 7*a^5 - 8*a^4 - 6*a^3 - 5*a^2 - 6*a - 7) + a^16 - 2*a^15 - 2*a^13 - a^12 - a^11 - 2*a^10 + a^9 - 2*a^8 + 2*a^7 - 3*a^6 - 3*a^4 - 2*a^3 - a^2 - 4*a + 2, + -a^15 - a^14 - 2*a^11 - a^10 + a^9 - a^8 - 2*a^7 + a^5 - 2*a^3 + a^2 + 3*a - 1, + -3*a^16 - 3*a^15 - 3*a^14 - 3*a^13 - 3*a^12 - 2*a^11 - 2*a^10 - 2*a^9 - a^8 + a^7 + 2*a^6 + 3*a^5 + 3*a^4 + 4*a^3 + 6*a^2 + 8*a + 8) TESTS: @@ -7123,7 +7129,7 @@ def units(self, proof=None): sage: K. = NumberField(1/2*x^2 - 1/6) sage: K.units() - (3*a - 2,) + (-3*a + 2,) """ proof = proof_flag(proof) @@ -7205,14 +7211,14 @@ def unit_group(self, proof=None): (u0, u1, u2, u3, u4, u5, u6, u7, u8) sage: U.gens_values() # result not independently verified [-1, - -a^9 - a + 1, + a^9 + a - 1, + -a^15 + a^12 - a^10 + a^9 + 2*a^8 - 3*a^7 - a^6 + 3*a^5 - a^4 - 4*a^3 + 3*a^2 + 2*a - 2, + a^15 + a^14 + a^13 + a^12 + a^10 - a^7 - a^6 - a^2 - 1, + 2*a^16 - 3*a^15 + 3*a^14 - 3*a^13 + 3*a^12 - a^11 + a^9 - 3*a^8 + 4*a^7 - 5*a^6 + 6*a^5 - 4*a^4 + 3*a^3 - 2*a^2 - 2*a + 4, -a^16 + a^15 - a^14 + a^12 - a^11 + a^10 + a^8 - a^7 + 2*a^6 - a^4 + 3*a^3 - 2*a^2 + 2*a - 1, - 2*a^16 - a^14 - a^13 + 3*a^12 - 2*a^10 + a^9 + 3*a^8 - 3*a^6 + 3*a^5 + 3*a^4 - 2*a^3 - 2*a^2 + 3*a + 4, - a^15 + a^14 + 2*a^11 + a^10 - a^9 + a^8 + 2*a^7 - a^5 + 2*a^3 - a^2 - 3*a + 1, - -a^16 - a^15 - a^14 - a^13 - a^12 - a^11 - a^10 - a^9 - a^8 - a^7 - a^6 - a^5 - a^4 - a^3 - a^2 + 2, - -2*a^16 + 3*a^15 - 3*a^14 + 3*a^13 - 3*a^12 + a^11 - a^9 + 3*a^8 - 4*a^7 + 5*a^6 - 6*a^5 + 4*a^4 - 3*a^3 + 2*a^2 + 2*a - 4, - a^15 - a^12 + a^10 - a^9 - 2*a^8 + 3*a^7 + a^6 - 3*a^5 + a^4 + 4*a^3 - 3*a^2 - 2*a + 2, - 2*a^16 + a^15 - a^11 - 3*a^10 - 4*a^9 - 4*a^8 - 4*a^7 - 5*a^6 - 7*a^5 - 8*a^4 - 6*a^3 - 5*a^2 - 6*a - 7] + a^16 - 2*a^15 - 2*a^13 - a^12 - a^11 - 2*a^10 + a^9 - 2*a^8 + 2*a^7 - 3*a^6 - 3*a^4 - 2*a^3 - a^2 - 4*a + 2, + -a^15 - a^14 - 2*a^11 - a^10 + a^9 - a^8 - 2*a^7 + a^5 - 2*a^3 + a^2 + 3*a - 1, + -3*a^16 - 3*a^15 - 3*a^14 - 3*a^13 - 3*a^12 - 2*a^11 - 2*a^10 - 2*a^9 - a^8 + a^7 + 2*a^6 + 3*a^5 + 3*a^4 + 4*a^3 + 6*a^2 + 8*a + 8] """ proof = proof_flag(proof) @@ -7261,8 +7267,8 @@ def S_unit_group(self, proof=None, S=None): sage: U = K.S_unit_group(S=a); U S-unit group with structure C10 x Z x Z x Z of Number Field in a with defining polynomial x^4 - 10*x^3 + 100*x^2 - 375*x + 1375 - with S = (Fractional ideal (5, 1/275*a^3 + 4/55*a^2 - 5/11*a + 5), - Fractional ideal (11, 1/275*a^3 + 4/55*a^2 - 5/11*a + 9)) + with S = (Fractional ideal (5, -7/275*a^3 + 1/11*a^2 - 9/11*a), + Fractional ideal (11, -7/275*a^3 + 1/11*a^2 - 9/11*a + 3)) sage: U.gens() (u0, u1, u2, u3) sage: U.gens_values() # random @@ -7273,8 +7279,8 @@ def S_unit_group(self, proof=None, S=None): sage: [u.multiplicative_order() for u in U.gens()] [10, +Infinity, +Infinity, +Infinity] sage: U.primes() - (Fractional ideal (5, 1/275*a^3 + 4/55*a^2 - 5/11*a + 5), - Fractional ideal (11, 1/275*a^3 + 4/55*a^2 - 5/11*a + 9)) + (Fractional ideal (5, -7/275*a^3 + 1/11*a^2 - 9/11*a), + Fractional ideal (11, -7/275*a^3 + 1/11*a^2 - 9/11*a + 3)) With the default value of `S`, the S-unit group is the same as the global unit group:: @@ -7426,8 +7432,8 @@ def S_unit_solutions(self, S=[], prec=106, include_exponents=False, include_boun sage: # needs sage.rings.padics sage: solutions, bound = K.S_unit_solutions(S, prec=100, include_bound=True) - sage: bound - 7 + sage: bound in (6, 7) + True """ from .S_unit_solver import solve_S_unit_equation return solve_S_unit_equation(self, S, prec, include_exponents, include_bound, proof) @@ -8782,7 +8788,7 @@ def subfields(self, degree=0, name=None): (Number Field in a1 with defining polynomial x^2 - 2, Ring morphism: From: Number Field in a1 with defining polynomial x^2 - 2 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a1 |--> a^2 + 3/2, None), + Defn: a1 |--> -a^2 - 3/2, None), (Number Field in a2 with defining polynomial x^2 + 4, Ring morphism: From: Number Field in a2 with defining polynomial x^2 + 4 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 @@ -8790,14 +8796,14 @@ def subfields(self, degree=0, name=None): (Number Field in a3 with defining polynomial x^2 + 2, Ring morphism: From: Number Field in a3 with defining polynomial x^2 + 2 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a3 |--> 2*a^3 + 5*a, None), + Defn: a3 |--> -2*a^3 - 5*a, None), (Number Field in a4 with defining polynomial x^4 + 1, Ring morphism: From: Number Field in a4 with defining polynomial x^4 + 1 To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a4 |--> a^3 + 1/2*a^2 + 5/2*a + 3/4, Ring morphism: + Defn: a4 |--> -a^3 - 1/2*a^2 - 5/2*a - 3/4, Ring morphism: From: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 To: Number Field in a4 with defining polynomial x^4 + 1 - Defn: a |--> -1/2*a4^3 + a4^2 - 1/2*a4) + Defn: a |--> 1/2*a4^3 + a4^2 + 1/2*a4) ] """ return self._subfields_helper(degree=degree, name=name, @@ -12729,12 +12735,12 @@ def _splitting_classes_gens_(K, m, d): sage: L = K.subfields(20)[0][0] sage: L.conductor() # needs sage.groups 101 - sage: _splitting_classes_gens_(L,101,20) # needs sage.libs.gap # optional - gap_package_polycyclic + sage: _splitting_classes_gens_(L,101,20) # optional - gap_package_polycyclic, needs sage.libs.gap [95] sage: K = CyclotomicField(44) sage: L = K.subfields(4)[0][0] - sage: _splitting_classes_gens_(L,44,4) # needs sage.libs.gap # optional - gap_package_polycyclic + sage: _splitting_classes_gens_(L,44,4) # optional - gap_package_polycyclic, needs sage.libs.gap [37] sage: K = CyclotomicField(44) @@ -12746,7 +12752,7 @@ def _splitting_classes_gens_(K, m, d): with zeta44_0 = 3.837971894457990? sage: L.conductor() # needs sage.groups 11 - sage: _splitting_classes_gens_(L,11,5) # needs sage.libs.gap # optional - gap_package_polycyclic + sage: _splitting_classes_gens_(L,11,5) # optional - gap_package_polycyclic, needs sage.libs.gap [10] """ from sage.groups.abelian_gps.abelian_group import AbelianGroup diff --git a/src/sage/rings/number_field/number_field_element.pyx b/src/sage/rings/number_field/number_field_element.pyx index 27432813b2b..1a676ee087b 100644 --- a/src/sage/rings/number_field/number_field_element.pyx +++ b/src/sage/rings/number_field/number_field_element.pyx @@ -1954,14 +1954,14 @@ cdef class NumberFieldElement(NumberFieldElement_base): sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^2 + 1) sage: (6*i + 6).factor() - (-i) * (i + 1)^3 * 3 + (i) * (-i - 1)^3 * 3 In the following example, the class number is 2. If a factorization in prime elements exists, we will find it:: sage: K. = NumberField(x^2 - 10) sage: factor(169*a + 531) - (-6*a - 19) * (-3*a - 1) * (-2*a + 9) + (-6*a - 19) * (2*a - 9) * (3*a + 1) sage: factor(K(3)) Traceback (most recent call last): ... @@ -4238,7 +4238,7 @@ cdef class NumberFieldElement(NumberFieldElement_base): sage: P5s = F(5).support() sage: P5s - [Fractional ideal (-t^2 - 1), Fractional ideal (t^2 - 2*t - 1)] + [Fractional ideal (t^2 + 1), Fractional ideal (t^2 - 2*t - 1)] sage: all(5 in P5 for P5 in P5s) True sage: all(P5.is_prime() for P5 in P5s) @@ -4487,7 +4487,7 @@ cdef class NumberFieldElement(NumberFieldElement_base): sage: f = Qi.embeddings(K)[0] sage: a = f(2+3*i) * (2-zeta)^2 sage: a.descend_mod_power(Qi,2) - [-2*i + 3, 3*i + 2] + [3*i + 2, 2*i - 3] An absolute example:: diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py index 171fba9af6e..c053118ab94 100644 --- a/src/sage/rings/number_field/number_field_ideal.py +++ b/src/sage/rings/number_field/number_field_ideal.py @@ -75,7 +75,7 @@ class NumberFieldIdeal(Ideal_generic): Fractional ideal (3) sage: F = pari(K).idealprimedec(5) sage: K.ideal(F[0]) - Fractional ideal (2*i + 1) + Fractional ideal (-2*i - 1) TESTS: @@ -236,7 +236,7 @@ def _richcmp_(self, other, op): sage: K. = NumberField(x^2 + 3); K Number Field in a with defining polynomial x^2 + 3 sage: f = K.factor(15); f - (Fractional ideal (1/2*a + 3/2))^2 * (Fractional ideal (5)) + (Fractional ideal (-a))^2 * (Fractional ideal (5)) sage: (f[0][0] < f[1][0]) True sage: (f[0][0] == f[0][0]) @@ -273,7 +273,7 @@ def _mul_(self, other): sage: A = K.ideal([5, 2 + I]) sage: B = K.ideal([13, 5 + 12*I]) sage: A*B - Fractional ideal (4*I - 7) + Fractional ideal (-4*I + 7) sage: (K.ideal(3 + I) * K.ideal(7 + I)).gens() (10*I + 20,) @@ -683,17 +683,17 @@ def free_module(self): sage: I.free_module() Free module of degree 4 and rank 4 over Integer Ring User basis matrix: - [ 4 0 0 0] - [ -3 7 -1 1] - [ 3 7 1 1] - [ 0 -10 0 -2] + [ 4 0 0 0] + [ 3 7 1 1] + [ 0 10 0 2] + [ 3 -7 1 -1] sage: J = I^(-1); J.free_module() Free module of degree 4 and rank 4 over Integer Ring User basis matrix: [ 1/4 0 0 0] - [-3/16 7/16 -1/16 1/16] [ 3/16 7/16 1/16 1/16] - [ 0 -5/8 0 -1/8] + [ 0 5/8 0 1/8] + [ 3/16 -7/16 1/16 -1/16] An example of intersecting ideals by intersecting free modules.:: @@ -790,7 +790,7 @@ def gens_reduced(self, proof=None): sage: J.is_principal() False sage: J.gens_reduced() - (5, a) + (5, -a) sage: all(j.parent() is K for j in J.gens()) True sage: all(j.parent() is K for j in J.gens_reduced()) @@ -2417,9 +2417,9 @@ def denominator(self): sage: I = K.ideal((3+4*i)/5); I Fractional ideal (4/5*i + 3/5) sage: I.denominator() - Fractional ideal (2*i + 1) + Fractional ideal (-2*i - 1) sage: I.numerator() - Fractional ideal (-i - 2) + Fractional ideal (2*i - 1) sage: I.numerator().is_integral() and I.denominator().is_integral() True sage: I.numerator() + I.denominator() == K.unit_ideal() @@ -2448,9 +2448,9 @@ def numerator(self): sage: I = K.ideal((3+4*i)/5); I Fractional ideal (4/5*i + 3/5) sage: I.denominator() - Fractional ideal (2*i + 1) + Fractional ideal (-2*i - 1) sage: I.numerator() - Fractional ideal (-i - 2) + Fractional ideal (2*i - 1) sage: I.numerator().is_integral() and I.denominator().is_integral() True sage: I.numerator() + I.denominator() == K.unit_ideal() @@ -3165,11 +3165,11 @@ def _p_quotient(self, p): Partially defined quotient map from Number Field in i with defining polynomial x^2 + 1 to an explicit vector space representation for the quotient of - the ring of integers by (p,I) for the ideal I=Fractional ideal (-i - 2). + the ring of integers by (p,I) for the ideal I=Fractional ideal (2*i - 1). sage: lift Lifting map to Gaussian Integers generated by i in Number Field in i with defining polynomial x^2 + 1 - from quotient of integers by Fractional ideal (-i - 2) + from quotient of integers by Fractional ideal (2*i - 1) """ return quotient_char_p(self, p) @@ -3214,11 +3214,11 @@ def residue_field(self, names=None): sage: K. = NumberField(x^2 + 1) sage: P1, P2 = [g[0] for g in K.factor(5)]; P1, P2 - (Fractional ideal (-i - 2), Fractional ideal (2*i + 1)) + (Fractional ideal (2*i - 1), Fractional ideal (-2*i - 1)) sage: a = 1/(1+2*i) sage: F1, F2 = [g.residue_field() for g in [P1, P2]]; F1, F2 - (Residue field of Fractional ideal (-i - 2), - Residue field of Fractional ideal (2*i + 1)) + (Residue field of Fractional ideal (2*i - 1), + Residue field of Fractional ideal (-2*i - 1)) sage: a.valuation(P1) 0 sage: F1(i/7) @@ -3231,7 +3231,7 @@ def residue_field(self, names=None): Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element -2/5*i + 1/5 - modulo Fractional ideal (2*i + 1): it has negative valuation + modulo Fractional ideal (-2*i - 1): it has negative valuation An example with a relative number field:: @@ -3492,7 +3492,7 @@ def quotient_char_p(I, p): [] sage: I = K.factor(13)[0][0]; I - Fractional ideal (-2*i + 3) + Fractional ideal (3*i + 2) sage: I.residue_class_degree() 1 sage: quotient_char_p(I, 13)[0] diff --git a/src/sage/rings/number_field/number_field_ideal_rel.py b/src/sage/rings/number_field/number_field_ideal_rel.py index 7f6cfd9b1b7..0bae4e74e13 100644 --- a/src/sage/rings/number_field/number_field_ideal_rel.py +++ b/src/sage/rings/number_field/number_field_ideal_rel.py @@ -11,7 +11,7 @@ sage: G = [from_A(z) for z in I.gens()]; G [7, -2*b*a - 1] sage: K.fractional_ideal(G) - Fractional ideal ((1/2*b + 2)*a - 1/2*b + 2) + Fractional ideal ((-1/2*b + 2)*a - 1/2*b - 2) sage: K.fractional_ideal(G).absolute_norm().factor() 7^2 @@ -277,7 +277,7 @@ def gens_reduced(self): sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] sage: P.gens_reduced() - (2, -15*a*b + 3*a + 1) + (2, -15*a*b - 3*a + 1) """ try: # Compute the single generator, if it exists @@ -385,7 +385,7 @@ def relative_norm(self): sage: K. = NumberField(x^2 + 6) sage: L. = K.extension(K['x'].gen()^4 + a) sage: N = L.ideal(b).relative_norm(); N - Fractional ideal (-a) + Fractional ideal (a) sage: N.parent() Monoid of ideals of Number Field in a with defining polynomial x^2 + 6 sage: N.ring() @@ -410,7 +410,7 @@ def relative_norm(self): sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] sage: P.relative_norm() - Fractional ideal (6*a + 2) + Fractional ideal (6*a - 2) """ L = self.number_field() K = L.base_field() @@ -529,7 +529,7 @@ def ideal_below(self): sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] sage: P.ideal_below() - Fractional ideal (6*a + 2) + Fractional ideal (6*a - 2) """ L = self.number_field() K = L.base_field() @@ -548,14 +548,12 @@ def factor(self): sage: x = polygen(ZZ, 'x') sage: K. = QQ.extension([x^2 + 11, x^2 - 5]) sage: K.factor(5) - (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 3/4))^2 - * (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 7/4))^2 + (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 3/4))^2 * (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 7/4))^2 sage: K.ideal(5).factor() - (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 3/4))^2 - * (Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 7/4))^2 + (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 3/4))^2 * (Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 7/4))^2 sage: K.ideal(5).prime_factors() - [Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 3/4), - Fractional ideal (5, (-1/4*b - 1/4)*a + 1/4*b - 7/4)] + [Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 3/4), + Fractional ideal (5, (1/4*b - 1/4)*a + 1/4*b + 7/4)] sage: PQ. = QQ[] sage: F. = NumberFieldTower([X^2 - 2, X^2 - 3]) @@ -914,7 +912,7 @@ def is_NumberFieldFractionalIdeal_rel(x): sage: is_NumberFieldFractionalIdeal_rel(I) True sage: N = I.relative_norm(); N - Fractional ideal (-a) + Fractional ideal (a) sage: is_NumberFieldFractionalIdeal_rel(N) False """ diff --git a/src/sage/rings/number_field/number_field_rel.py b/src/sage/rings/number_field/number_field_rel.py index 7ea070b113e..a1d5ab38176 100644 --- a/src/sage/rings/number_field/number_field_rel.py +++ b/src/sage/rings/number_field/number_field_rel.py @@ -233,21 +233,21 @@ def __init__(self, base, polynomial, name, sage: l. = k.extension(5*x^2 + 3); l Number Field in b with defining polynomial 5*x^2 + 3 over its base field sage: l.pari_rnf() - [x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4), ..., y^4 + 6*y^2 + 1, x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4)], [0, 0]] + [x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4), ..., y^4 + 6*y^2 + 1, x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4)], [0, 0]] sage: b b sage: l. = k.extension(x^2 + 3/5); l Number Field in b with defining polynomial x^2 + 3/5 over its base field sage: l.pari_rnf() - [x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4), ..., y^4 + 6*y^2 + 1, x^2 + (-y^3 + 1/2*y^2 - 6*y + 3/2)*x + (-3/4*y^3 - 1/4*y^2 - 17/4*y - 19/4)], [0, 0]] + [x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4), ..., y^4 + 6*y^2 + 1, x^2 + (5/4*y^3 - 1/4*y^2 + 27/4*y - 3/4)*x + (-9/4*y^3 - 1/4*y^2 - 47/4*y - 7/4)], [0, 0]] sage: b b sage: l. = k.extension(x - 1/a0); l Number Field in b with defining polynomial x + 1/2*a0 over its base field sage: l.pari_rnf() - [x, [4, -x^3 - x^2 - 7*x - 3, -x^3 + x^2 - 7*x + 3, 2*x^3 + 10*x], ..., [x^4 + 6*x^2 + 1, -x, -1, y^4 + 6*y^2 + 1, x], [0, 0]] + [x, [4, -x^3 + x^2 - 7*x + 3, -2*x^3 - 10*x, x^3 + x^2 + 7*x + 3], ..., [x^4 + 6*x^2 + 1, -x, -1, y^4 + 6*y^2 + 1, x], [0, 0]] sage: b -1/2*a0 @@ -1635,9 +1635,9 @@ def _pari_relative_structure(self): sage: K. = NumberField(x^2 + 1) sage: L. = K.extension(x^2 - 1/2) sage: L._pari_relative_structure() - (x^2 + Mod(-y, y^2 + 1), - Mod(Mod(1/2*y - 1/2, y^2 + 1)*x, x^2 + Mod(-y, y^2 + 1)), - Mod(Mod(-y - 1, y^2 + 1)*x, Mod(1, y^2 + 1)*x^2 + Mod(-1/2, y^2 + 1))) + (x^2 + Mod(y, y^2 + 1), + Mod(Mod(-1/2*y - 1/2, y^2 + 1)*x, x^2 + Mod(y, y^2 + 1)), + Mod(Mod(y - 1, y^2 + 1)*x, x^2 + Mod(-1/2, y^2 + 1))) An example where both fields are defined by non-integral or non-monic polynomials:: @@ -1937,7 +1937,7 @@ def absolute_polynomial(self): sage: k.relative_polynomial() x^2 + 1/3 sage: k.pari_relative_polynomial() - x^2 + Mod(y, y^2 + 1)*x - 1 + x^2 + Mod(-y, y^2 + 1)*x - 1 """ return QQ['x'](self._pari_rnfeq()[0]) @@ -2724,7 +2724,7 @@ def uniformizer(self, P, others='positive'): sage: x = polygen(ZZ, 'x') sage: K. = NumberField([x^2 + 23, x^2 - 3]) sage: P = K.prime_factors(5)[0]; P - Fractional ideal (5, 1/2*a + b - 5/2) + Fractional ideal (5, -1/2*a + b + 5/2) sage: u = K.uniformizer(P) sage: u.valuation(P) 1 diff --git a/src/sage/rings/number_field/order.py b/src/sage/rings/number_field/order.py index fd5662048df..f7cdf97401c 100644 --- a/src/sage/rings/number_field/order.py +++ b/src/sage/rings/number_field/order.py @@ -496,7 +496,7 @@ def fractional_ideal(self, *args, **kwds): sage: K. = NumberField(x^2 + 2) sage: R = K.maximal_order() sage: R.fractional_ideal(2/3 + 7*a, a) - Fractional ideal (1/3*a) + Fractional ideal (-1/3*a) """ return self.number_field().fractional_ideal(*args, **kwds) @@ -570,7 +570,7 @@ def __mul__(self, right): sage: k. = NumberField(x^2 + 5077); G = k.class_group(); G Class group of order 22 with structure C22 of Number Field in a with defining polynomial x^2 + 5077 sage: G.0 ^ -9 - Fractional ideal class (43, a + 13) + Fractional ideal class (67, a + 45) sage: Ok = k.maximal_order(); Ok Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 5077 sage: Ok * (11, a + 7) @@ -2935,7 +2935,7 @@ def GaussianIntegers(names='I', latex_name='i'): sage: ZZI Gaussian Integers generated by I in Number Field in I with defining polynomial x^2 + 1 with I = 1*I sage: factor(3 + I) - (-I) * (I + 1) * (2*I + 1) + (-I) * (I - 2) * (-I + 1) sage: CC(I) 1.00000000000000*I sage: I.minpoly() @@ -2966,7 +2966,7 @@ def EisensteinIntegers(names='omega'): with defining polynomial x^2 + x + 1 with omega = -0.50000000000000000? + 0.866025403784439?*I sage: factor(3 + omega) - (-1) * (-omega - 3) + (omega + 1) * (-2*omega + 1) sage: CC(omega) -0.500000000000000 + 0.866025403784439*I sage: omega.minpoly() diff --git a/src/sage/rings/number_field/selmer_group.py b/src/sage/rings/number_field/selmer_group.py index 283db17c84e..c6054b6824f 100644 --- a/src/sage/rings/number_field/selmer_group.py +++ b/src/sage/rings/number_field/selmer_group.py @@ -71,7 +71,7 @@ def _ideal_generator(I): sage: K. = QuadraticField(-11) sage: [_ideal_generator(K.prime_above(p)) for p in primes(25)] - [2, 1/2*a - 1/2, -1/2*a - 3/2, 7, -a, 13, 17, 19, 1/2*a + 9/2] + [2, 1/2*a - 1/2, -1/2*a - 3/2, 7, a, 13, 17, 19, 1/2*a + 9/2] """ try: return I.gens_reduced()[0] diff --git a/src/sage/rings/polynomial/polynomial_quotient_ring.py b/src/sage/rings/polynomial/polynomial_quotient_ring.py index 7275a122c06..b8157ab8615 100644 --- a/src/sage/rings/polynomial/polynomial_quotient_ring.py +++ b/src/sage/rings/polynomial/polynomial_quotient_ring.py @@ -1430,13 +1430,13 @@ def S_class_group(self, S, proof=True): sage: R. = K[] sage: S. = R.quotient(x^2 + 23) sage: S.S_class_group([]) - [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)] + [((2, a + 1, -1/2*xbar + 3/2, 1/2*a*xbar - 1/2*a + 1), 6)] sage: S.S_class_group([K.ideal(3, a-1)]) [] sage: S.S_class_group([K.ideal(2, a+1)]) [] sage: S.S_class_group([K.ideal(a)]) - [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)] + [((2, a + 1, -1/2*xbar + 3/2, 1/2*a*xbar - 1/2*a + 1), 6)] Now we take an example over a nontrivial base with two factors, each contributing to the class group:: @@ -1496,14 +1496,14 @@ def S_class_group(self, S, proof=True): sage: C = S.S_class_group([]) sage: C[:2] [((1/4*xbar^2 + 31/4, - (-1/8*a + 1/8)*xbar^2 - 31/8*a + 31/8, - 1/16*xbar^3 + 1/16*xbar^2 + 31/16*xbar + 31/16, - -1/16*a*xbar^3 + (1/16*a + 1/8)*xbar^2 - 31/16*a*xbar + 31/16*a + 31/8), + (1/8*a + 1/8)*xbar^2 + 31/8*a + 31/8, + -1/16*xbar^3 + 3/16*xbar^2 - 31/16*xbar + 93/16, + 1/16*a*xbar^3 + (-1/16*a + 1/8)*xbar^2 + 31/16*a*xbar - 31/16*a + 31/8), 6), ((-1/4*xbar^2 - 23/4, - (1/8*a - 1/8)*xbar^2 + 23/8*a - 23/8, - -1/16*xbar^3 - 1/16*xbar^2 - 23/16*xbar - 23/16, - 1/16*a*xbar^3 + (-1/16*a - 1/8)*xbar^2 + 23/16*a*xbar - 23/16*a - 23/8), + (-1/8*a - 1/8)*xbar^2 - 23/8*a - 23/8, + 1/16*xbar^3 + 1/16*xbar^2 + 23/16*xbar + 23/16, + -1/16*a*xbar^3 + (1/16*a - 1/8)*xbar^2 - 23/16*a*xbar + 23/16*a - 23/8), 6)] sage: C[2][1] 2 @@ -1515,11 +1515,11 @@ def S_class_group(self, S, proof=True): ....: 1/16*a*xbar^3 - 1/16*a*xbar^2 + 23/16*a*xbar - 23/16*a) sage: gens[0] == expected_gens[0] True - sage: gens[1] in (expected_gens[1], expected_gens[1]/2 + expected_gens[0]/2) + sage: gens[1] in (expected_gens[1], expected_gens[1]/2 + expected_gens[0]/2, -expected_gens[1]/2 + expected_gens[0]/2) True - sage: gens[2] in (expected_gens[2], expected_gens[2] + expected_gens[0]/2) + sage: gens[2] in (expected_gens[2], expected_gens[2] + expected_gens[0]/2, -expected_gens[2] + expected_gens[0]/2) True - sage: gens[3] in (expected_gens[3], expected_gens[3] + expected_gens[0]/2) + sage: gens[3] in (expected_gens[3], expected_gens[3] + expected_gens[0]/2, -expected_gens[3] + expected_gens[0]/2) True """ fields, isos, iso_classes = self._S_decomposition(tuple(S)) @@ -1612,7 +1612,7 @@ def class_group(self, proof=True): sage: R. = K[] sage: S. = R.quotient(x^2 + 23) sage: S.class_group() - [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)] + [((2, a + 1, -1/2*xbar + 3/2, 1/2*a*xbar - 1/2*a + 1), 6)] Here is an example of a product of number fields, both of which contribute to the class group:: @@ -1712,19 +1712,19 @@ def S_units(self, S, proof=True): with defining polynomial x^2 + 3 with a = 1.732050807568878?*I with modulus y^3 + 5 sage: [u for u, o in L.S_units([]) if o is Infinity] - [(-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + [(-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] sage: [u for u, o in L.S_units([K.ideal(1/2*a - 3/2)]) ....: if o is Infinity] [(-1/6*a - 1/2)*b^2 + (1/3*a - 1)*b + 4/3*a, - (-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + (-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] sage: [u for u, o in L.S_units([K.ideal(2)]) if o is Infinity] [(1/2*a - 1/2)*b^2 + (a + 1)*b + 3, - (1/6*a + 1/2)*b^2 + (-1/3*a + 1)*b - 5/6*a + 1/2, (1/6*a + 1/2)*b^2 + (-1/3*a + 1)*b - 5/6*a - 1/2, - (-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + 1/3*a*b^2 + (1/3*a + 1)*b - 1/6*a + 3/2, + (-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] Note that all the returned values live where we expect them to:: @@ -1809,8 +1809,8 @@ def units(self, proof=True): with defining polynomial x^2 + 3 with a = 1.732050807568878?*I with modulus y^3 + 5 sage: [u for u, o in L.units() if o is Infinity] - [(-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + [(-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] sage: L. = K.extension(y^3 + 5) sage: L.unit_group() Unit group with structure C6 x Z x Z of @@ -1818,8 +1818,8 @@ def units(self, proof=True): sage: L.unit_group().gens() # abstract generators (u0, u1, u2) sage: L.unit_group().gens_values()[1:] - [(-1/3*a - 1)*b^2 - 4/3*a*b - 5/6*a + 7/2, - 2/3*a*b^2 + (2/3*a - 2)*b - 5/6*a - 7/2] + [(-1/3*a - 1)*b^2 - 4/3*a*b - 4/3*a + 3, + (-1/3*a - 1)*b^2 + (2/3*a - 2)*b + 13/6*a - 1/2] Note that all the returned values live where we expect them to:: diff --git a/src/sage/rings/qqbar.py b/src/sage/rings/qqbar.py index 3806663eaf0..b7dbede3f97 100644 --- a/src/sage/rings/qqbar.py +++ b/src/sage/rings/qqbar.py @@ -2777,11 +2777,12 @@ def number_field_elements_from_algebraics(numbers, minimal=False, To: Algebraic Real Field Defn: a |--> 1.732050807568878?) sage: number_field_elements_from_algebraics((rt2,qqI)) # needs sage.symbolic - (Number Field in a with defining polynomial y^4 + 1, [-a^3 + a, a^2], + (Number Field in a with defining polynomial y^4 + 1, + [a^3 - a, a^2], Ring morphism: - From: Number Field in a with defining polynomial y^4 + 1 - To: Algebraic Field - Defn: a |--> 0.7071067811865475? + 0.7071067811865475?*I) + From: Number Field in a with defining polynomial y^4 + 1 + To: Algebraic Field + Defn: a |--> -0.7071067811865475? - 0.7071067811865475?*I) Note that for the first example, where \sage does not realize that the number is real, we get a homomorphism to ``QQbar``:: @@ -4660,8 +4661,7 @@ def _exact_field(self): Number Field in a with defining polynomial y^4 - 20*y^2 + 81 with a in -3.789313782671036? sage: (QQbar(7)^(3/5))._exact_field() - Number Field in a with defining polynomial - y^5 - 2*y^4 - 18*y^3 + 38*y^2 + 82*y - 181 with a in 2.554256611698490? + Number Field in a with defining polynomial y^5 - 7 with a in 1.475773161594552? """ sd = self._descr if isinstance(sd, (ANRational, ANExtensionElement)): @@ -4681,7 +4681,7 @@ def _exact_value(self): sage: (sqrt(QQbar(2)) + sqrt(QQbar(19)))._exact_value() -1/9*a^3 + a^2 + 11/9*a - 10 where a^4 - 20*a^2 + 81 = 0 and a in -3.789313782671036? sage: (QQbar(7)^(3/5))._exact_value() - 2*a^4 + 2*a^3 - 34*a^2 - 17*a + 150 where a^5 - 2*a^4 - 18*a^3 + 38*a^2 + 82*a - 181 = 0 and a in 2.554256611698490? + a^3 where a^5 - 7 = 0 and a in 1.475773161594552? """ sd = self._descr if isinstance(sd, (ANRational, ANExtensionElement)): @@ -7925,8 +7925,8 @@ def handle_sage_input(self, sib, coerce, is_qqbar): sage: sage_input(v, verify=True) # Verified R. = QQ[] - v = QQbar.polynomial_root(AA.common_polynomial(y^8 - y^7 + y^5 - y^4 + y^3 - y + 1), CIF(RIF(RR(0.91354545764260087), RR(0.91354545764260098)), RIF(RR(0.40673664307580015), RR(0.40673664307580021)))) - v^5 + v^3 + v = QQbar.polynomial_root(AA.common_polynomial(y^8 - y^7 + y^5 - y^4 + y^3 - y + 1), CIF(RIF(RR(0.66913060635885813), RR(0.66913060635885824)), RIF(-RR(0.74314482547739424), -RR(0.74314482547739413)))) + v^6 + v^5 sage: v = QQbar(sqrt(AA(2))) sage: v.exactify() sage: sage_input(v, verify=True) diff --git a/src/sage/rings/rational.pyx b/src/sage/rings/rational.pyx index 68ee004a251..6be179b37d2 100644 --- a/src/sage/rings/rational.pyx +++ b/src/sage/rings/rational.pyx @@ -1446,7 +1446,7 @@ cdef class Rational(sage.structure.element.FieldElement): sage: 0.is_norm(K) True sage: (1/7).is_norm(K, element=True) - (True, 1/7*beta + 3/7) + (True, -3/7*beta + 5/7) sage: (1/10).is_norm(K, element=True) (False, None) sage: (1/691).is_norm(QQ, element=True) @@ -1558,7 +1558,7 @@ cdef class Rational(sage.structure.element.FieldElement): EXAMPLES:: sage: QQ(2)._bnfisnorm(QuadraticField(-1, 'i')) # needs sage.rings.number_field - (i + 1, 1) + (-i + 1, 1) sage: x = polygen(QQ, 'x') sage: 7._bnfisnorm(NumberField(x^3 - 2, 'b')) # needs sage.rings.number_field (1, 7) diff --git a/src/sage/schemes/affine/affine_morphism.py b/src/sage/schemes/affine/affine_morphism.py index 0eba4c662ec..2208cefca1d 100644 --- a/src/sage/schemes/affine/affine_morphism.py +++ b/src/sage/schemes/affine/affine_morphism.py @@ -1158,13 +1158,11 @@ def reduce_base_field(self): sage: H = End(A) sage: f = H([QQbar(3^(1/3))*x^2 + QQbar(sqrt(-2))]) # needs sage.symbolic sage: f.reduce_base_field() # needs sage.symbolic - Scheme endomorphism of Affine Space of dimension 1 over Number - Field in a with defining polynomial y^6 + 6*y^4 - 6*y^3 + 12*y^2 + 36*y + 17 - with a = 1.442249570307409? + 1.414213562373095?*I + Scheme endomorphism of Affine Space of dimension 1 over Number Field in a with defining polynomial y^6 + 6*y^4 - 6*y^3 + 12*y^2 + 36*y + 17 with a = 1.442249570307409? - 1.414213562373095?*I Defn: Defined on coordinates by sending (x) to ((-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 - 772/269*a - - 1092/269)*x^2 + (48/269*a^5 - 27/269*a^4 + 320/269*a^3 - 468/269*a^2 - + 1041/269*a + 1092/269)) + - 1092/269)*x^2 + (-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 + - 1041/269*a - 1092/269)) :: diff --git a/src/sage/schemes/elliptic_curves/ell_field.py b/src/sage/schemes/elliptic_curves/ell_field.py index 3ff2826f3e7..2fecf7e4696 100644 --- a/src/sage/schemes/elliptic_curves/ell_field.py +++ b/src/sage/schemes/elliptic_curves/ell_field.py @@ -902,7 +902,7 @@ def division_field(self, n, names='t', map=False, **kwds): by y^2 = x^3 + 5*a0*x^2 + (-200*a0^2)*x + (-42000*a0^2+42000*a0+126000) over Number Field in a0 with defining polynomial x^3 - 3*x^2 + 3*x + 9 sage: K. = E.division_field(3, simplify_all=True); K - Number Field in b with defining polynomial x^12 - 25*x^10 + 130*x^8 + 645*x^6 + 1050*x^4 + 675*x^2 + 225 + Number Field in b with defining polynomial x^12 + 5*x^10 + 40*x^8 + 315*x^6 + 750*x^4 + 675*x^2 + 2025 Some higher-degree examples:: diff --git a/src/sage/schemes/elliptic_curves/ell_local_data.py b/src/sage/schemes/elliptic_curves/ell_local_data.py index 7434659b5a2..df076ed62b6 100644 --- a/src/sage/schemes/elliptic_curves/ell_local_data.py +++ b/src/sage/schemes/elliptic_curves/ell_local_data.py @@ -1161,7 +1161,7 @@ def check_prime(K, P): sage: check_prime(K, a + 1) Fractional ideal (a + 1) sage: [check_prime(K, P) for P in K.primes_above(31)] - [Fractional ideal (5/2*a + 1/2), Fractional ideal (5/2*a - 1/2)] + [Fractional ideal (-5/2*a - 1/2), Fractional ideal (-5/2*a + 1/2)] sage: L. = NumberField(x^2 + 3) sage: check_prime(K, L.ideal(5)) Traceback (most recent call last): diff --git a/src/sage/schemes/elliptic_curves/ell_number_field.py b/src/sage/schemes/elliptic_curves/ell_number_field.py index 8af221880b6..64b8a63321b 100644 --- a/src/sage/schemes/elliptic_curves/ell_number_field.py +++ b/src/sage/schemes/elliptic_curves/ell_number_field.py @@ -229,9 +229,9 @@ def simon_two_descent(self, verbose=0, lim1=2, lim3=4, limtriv=2, sage: E == loads(dumps(E)) True sage: E.simon_two_descent() - (2, 2, [(0 : 0 : 1), (1/18*a + 7/18 : -5/54*a - 17/54 : 1)]) + (2, 2, [(0 : 0 : 1), (1/8*a + 5/8 : -3/16*a - 7/16 : 1)]) sage: E.simon_two_descent(lim1=5, lim3=5, limtriv=10, maxprob=7, limbigprime=10) - (2, 2, [(-1 : 0 : 1), (-2 : -1/2*a - 1/2 : 1)]) + (2, 2, [(-1 : 0 : 1), (1/2*a - 5/2 : -1/2*a - 13/2 : 1)]) :: @@ -277,7 +277,7 @@ def simon_two_descent(self, verbose=0, lim1=2, lim3=4, limtriv=2, sage: E.simon_two_descent() # long time (4s on sage.math, 2013) (3, 3, - [(1/8*zeta43_0^2 - 3/8*zeta43_0 - 1/4 : -5/16*zeta43_0^2 + 7/16*zeta43_0 + 1/8 : 1), + [(-1/2*zeta43_0^2 - 1/2*zeta43_0 + 7 : -3/2*zeta43_0^2 - 5/2*zeta43_0 + 18 : 1), (0 : 0 : 1)]) """ verbose = int(verbose) @@ -872,7 +872,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): sage: K. = NumberField(x^2 + 1) sage: E = EllipticCurve([1 + i, 0, 1, 0, 0]) sage: E.local_data() - [Local data at Fractional ideal (2*i + 1): + [Local data at Fractional ideal (-2*i - 1): Reduction type: bad non-split multiplicative Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1 @@ -880,7 +880,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): Conductor exponent: 1 Kodaira Symbol: I1 Tamagawa Number: 1, - Local data at Fractional ideal (-2*i + 3): + Local data at Fractional ideal (3*i + 2): Reduction type: bad split multiplicative Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1 @@ -898,7 +898,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): Kodaira Symbol: I0 Tamagawa Number: 1 sage: E.local_data(2*i + 1) - Local data at Fractional ideal (2*i + 1): + Local data at Fractional ideal (-2*i - 1): Reduction type: bad non-split multiplicative Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1 @@ -1456,8 +1456,10 @@ def kodaira_symbol(self, P, proof=None): sage: K. = NumberField(x^2 - 5) sage: E = EllipticCurve([20, 225, 750, 625*a + 6875, 31250*a + 46875]) sage: bad_primes = E.discriminant().support(); bad_primes - [Fractional ideal (-a), Fractional ideal (7/2*a - 81/2), - Fractional ideal (-a - 52), Fractional ideal (2)] + [Fractional ideal (-a), + Fractional ideal (-7/2*a + 81/2), + Fractional ideal (-a - 52), + Fractional ideal (2)] sage: [E.kodaira_symbol(P) for P in bad_primes] [I0, I1, I1, II] sage: K. = QuadraticField(-11) @@ -1483,7 +1485,7 @@ def conductor(self): sage: K. = NumberField(x^2 + 1) sage: EllipticCurve([i, i - 1, i + 1, 24*i + 15, 14*i + 35]).conductor() - Fractional ideal (21*i - 3) + Fractional ideal (3*i + 21) sage: K. = NumberField(x^2 - x + 3) sage: EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor() Fractional ideal (-6*a) @@ -2584,8 +2586,8 @@ def isogeny_class(self, reducible_primes=None, algorithm='Billerey', minimal_mod sage: [E1.ainvs() for E1 in C] [(0, 0, 0, 0, -27), (0, 0, 0, 0, 1), - (i + 1, i, i + 1, -i + 3, 4*i), - (i + 1, i, i + 1, -i + 33, -58*i)] + (i + 1, i, 0, 3, -i), + (i + 1, i, 0, 33, 91*i)] The matrix of degrees of cyclic isogenies between curves:: @@ -2616,13 +2618,13 @@ class :class:`EllipticCurveIsogeny` allowed composition. In sage: [((i,j), isogs[i][j].x_rational_map()) ....: for i in range(4) for j in range(4) if isogs[i][j] != 0] [((0, 1), (1/9*x^3 - 12)/x^2), - ((0, 3), (-1/2*i*x^2 + i*x - 12*i)/(x - 3)), + ((0, 3), (1/2*i*x^2 - 2*i*x + 15*i)/(x - 3)), ((1, 0), (x^3 + 4)/x^2), - ((1, 2), (-1/2*i*x^2 - i*x - 2*i)/(x + 1)), - ((2, 1), (1/2*i*x^2 - x)/(x + 3/2*i)), - ((2, 3), (x^3 + 4*i*x^2 - 10*x - 10*i)/(x^2 + 4*i*x - 4)), - ((3, 0), (1/2*i*x^2 + x + 4*i)/(x - 5/2*i)), - ((3, 2), (1/9*x^3 - 4/3*i*x^2 - 34/3*x + 226/9*i)/(x^2 - 8*i*x - 16))] + ((1, 2), (1/2*i*x^2 + i)/(x + 1)), + ((2, 1), (-1/2*i*x^2 - 1/2*i)/(x - 1/2*i)), + ((2, 3), (x^3 - 2*i*x^2 - 7*x + 4*i)/(x^2 - 2*i*x - 1)), + ((3, 0), (-1/2*i*x^2 + 2*x - 5/2*i)/(x + 7/2*i)), + ((3, 2), (1/9*x^3 + 2/3*i*x^2 - 13/3*x - 116/9*i)/(x^2 + 10*i*x - 25))] The isogeny class may be visualized by obtaining its graph and plotting it:: @@ -3103,10 +3105,10 @@ def is_isogenous(self, other, proof=True, maxnorm=100): sage: K. = QuadraticField(-1) sage: E1 = EllipticCurve([i + 1, 0, 1, -240*i - 400, -2869*i - 2627]) sage: E1.conductor() - Fractional ideal (-4*i - 7) + Fractional ideal (4*i + 7) sage: E2 = EllipticCurve([1+i,0,1,0,0]) sage: E2.conductor() - Fractional ideal (-4*i - 7) + Fractional ideal (4*i + 7) sage: E1.is_isogenous(E2) # long time True sage: E1.is_isogenous(E2, proof=False) # faster (~170ms) @@ -3433,8 +3435,8 @@ def lll_reduce(self, points, height_matrix=None, precision=None): sage: Q = E(0,-1) sage: E.lll_reduce([P,Q]) ( - [0 1] - [(0 : -1 : 1), (-2 : -1/2*a - 1/2 : 1)], [1 0] + [ 0 -1] + [(0 : -1 : 1), (-2 : 1/2*a - 1/2 : 1)], [ 1 0] ) :: @@ -3445,9 +3447,10 @@ def lll_reduce(self, points, height_matrix=None, precision=None): ....: E.point([-17/18*a - 1/9, -109/108*a - 277/108])] sage: E.lll_reduce(points) ( - [(-a + 4 : -3*a + 7 : 1), (-17/18*a - 1/9 : 109/108*a + 277/108 : 1)], - [ 1 0] - [ 1 -1] + [(-a + 4 : -3*a + 7 : 1), (-17/18*a - 1/9 : -109/108*a - 277/108 : 1)], + + [1 0] + [1 1] ) """ r = len(points) diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index d05196240a1..97509cfd900 100644 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -3053,10 +3053,10 @@ def has_good_reduction(self, P=None): sage: K. = NumberField(x^2 + 1) sage: E = EllipticCurve(K, [0,1,0,-160,308]) sage: P = E(26, -120) - sage: E.discriminant().support() - [Fractional ideal (i + 1), - Fractional ideal (-i - 2), - Fractional ideal (2*i + 1), + sage: E.discriminant().support() # random + [Fractional ideal (-i - 1), + Fractional ideal (2*i - 1), + Fractional ideal (-2*i - 1), Fractional ideal (3)] sage: [E.tamagawa_exponent(p) for p in E.discriminant().support()] [1, 4, 4, 4] diff --git a/src/sage/schemes/elliptic_curves/ell_rational_field.py b/src/sage/schemes/elliptic_curves/ell_rational_field.py index 134531ad1a5..27b33b46e67 100644 --- a/src/sage/schemes/elliptic_curves/ell_rational_field.py +++ b/src/sage/schemes/elliptic_curves/ell_rational_field.py @@ -1863,7 +1863,7 @@ def simon_two_descent(self, verbose=0, lim1=5, lim3=50, limtriv=3, sage: E = EllipticCurve('389a1') sage: E._known_points = [] # clear cached points sage: E.simon_two_descent() - (2, 2, [(5/4 : 5/8 : 1), (-3/4 : 7/8 : 1)]) + (2, 2, [(-3/4 : 7/8 : 1), (5/4 : 5/8 : 1)]) sage: E = EllipticCurve('5077a1') sage: E.simon_two_descent() (3, 3, [(1 : 0 : 1), (2 : 0 : 1), (0 : 2 : 1)]) diff --git a/src/sage/schemes/elliptic_curves/gal_reps_number_field.py b/src/sage/schemes/elliptic_curves/gal_reps_number_field.py index 7824893b05f..609aab5f4bf 100644 --- a/src/sage/schemes/elliptic_curves/gal_reps_number_field.py +++ b/src/sage/schemes/elliptic_curves/gal_reps_number_field.py @@ -800,17 +800,17 @@ def deg_one_primes_iter(K, principal_only=False): [Fractional ideal (2, a + 1), Fractional ideal (3, a + 1), Fractional ideal (3, a + 2), - Fractional ideal (a), + Fractional ideal (-a), Fractional ideal (7, a + 3), Fractional ideal (7, a + 4)] sage: it = deg_one_primes_iter(K, True) sage: [next(it) for _ in range(6)] - [Fractional ideal (a), - Fractional ideal (-2*a + 3), - Fractional ideal (2*a + 3), + [Fractional ideal (-a), + Fractional ideal (2*a - 3), + Fractional ideal (-2*a - 3), Fractional ideal (a + 6), Fractional ideal (a - 6), - Fractional ideal (-3*a + 4)] + Fractional ideal (3*a - 4)] """ # imaginary quadratic fields have no principal primes of norm < disc / 4 start = K.discriminant().abs() // 4 if principal_only and K.signature() == (0,1) else 2 diff --git a/src/sage/schemes/elliptic_curves/gp_simon.py b/src/sage/schemes/elliptic_curves/gp_simon.py index 6be377e2f74..4134ae1b7a6 100644 --- a/src/sage/schemes/elliptic_curves/gp_simon.py +++ b/src/sage/schemes/elliptic_curves/gp_simon.py @@ -49,7 +49,7 @@ def simon_two_descent(E, verbose=0, lim1=None, lim3=None, limtriv=None, doctest:warning...: DeprecationWarning: please use the 2-descent algorithm over QQ inside pari See https://github.com/sagemath/sage/issues/38461 for details. - (2, 2, [(5/4 : 5/8 : 1), (-3/4 : 7/8 : 1)]) + (2, 2, [(-3/4 : 7/8 : 1), (5/4 : 5/8 : 1)]) TESTS:: diff --git a/src/sage/schemes/elliptic_curves/isogeny_class.py b/src/sage/schemes/elliptic_curves/isogeny_class.py index 13edc68a022..a83fd8705ac 100644 --- a/src/sage/schemes/elliptic_curves/isogeny_class.py +++ b/src/sage/schemes/elliptic_curves/isogeny_class.py @@ -223,8 +223,8 @@ def _repr_(self): sage: C.curves [Elliptic Curve defined by y^2 = x^3 + (-27) over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, Elliptic Curve defined by y^2 = x^3 + 1 over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, - Elliptic Curve defined by y^2 + (i+1)*x*y + (i+1)*y = x^3 + i*x^2 + (-i+3)*x + 4*i over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, - Elliptic Curve defined by y^2 + (i+1)*x*y + (i+1)*y = x^3 + i*x^2 + (-i+33)*x + (-58*i) over Number Field in i with defining polynomial x^2 + 1 with i = 1*I] + Elliptic Curve defined by y^2 + (i+1)*x*y = x^3 + i*x^2 + 3*x + (-i) over Number Field in i with defining polynomial x^2 + 1 with i = 1*I, + Elliptic Curve defined by y^2 + (i+1)*x*y = x^3 + i*x^2 + 33*x + 91*i over Number Field in i with defining polynomial x^2 + 1 with i = 1*I] """ if self._label: return "Elliptic curve isogeny class %s" % (self._label) @@ -615,8 +615,8 @@ def __init__(self, E, reducible_primes=None, algorithm='Billerey', minimal_model sage: [E1.ainvs() for E1 in C] [(0, 0, 0, 0, -27), (0, 0, 0, 0, 1), - (i + 1, i, i + 1, -i + 3, 4*i), - (i + 1, i, i + 1, -i + 33, -58*i)] + (i + 1, i, 0, 3, -i), + (i + 1, i, 0, 33, 91*i)] The matrix of degrees of cyclic isogenies between curves:: @@ -647,13 +647,13 @@ class :class:`EllipticCurveIsogeny` allowed composition. In sage: [((i,j), isogs[i][j].x_rational_map()) ....: for i in range(4) for j in range(4) if isogs[i][j] != 0] [((0, 1), (1/9*x^3 - 12)/x^2), - ((0, 3), (-1/2*i*x^2 + i*x - 12*i)/(x - 3)), + ((0, 3), (1/2*i*x^2 - 2*i*x + 15*i)/(x - 3)), ((1, 0), (x^3 + 4)/x^2), - ((1, 2), (-1/2*i*x^2 - i*x - 2*i)/(x + 1)), - ((2, 1), (1/2*i*x^2 - x)/(x + 3/2*i)), - ((2, 3), (x^3 + 4*i*x^2 - 10*x - 10*i)/(x^2 + 4*i*x - 4)), - ((3, 0), (1/2*i*x^2 + x + 4*i)/(x - 5/2*i)), - ((3, 2), (1/9*x^3 - 4/3*i*x^2 - 34/3*x + 226/9*i)/(x^2 - 8*i*x - 16))] + ((1, 2), (1/2*i*x^2 + i)/(x + 1)), + ((2, 1), (-1/2*i*x^2 - 1/2*i)/(x - 1/2*i)), + ((2, 3), (x^3 - 2*i*x^2 - 7*x + 4*i)/(x^2 - 2*i*x - 1)), + ((3, 0), (-1/2*i*x^2 + 2*x - 5/2*i)/(x + 7/2*i)), + ((3, 2), (1/9*x^3 + 2/3*i*x^2 - 13/3*x - 116/9*i)/(x^2 + 10*i*x - 25))] sage: K. = QuadraticField(-1) sage: E = EllipticCurve([1+i, -i, i, 1, 0]) diff --git a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py index 6a0194fb0f9..90f7382a94e 100644 --- a/src/sage/schemes/elliptic_curves/isogeny_small_degree.py +++ b/src/sage/schemes/elliptic_curves/isogeny_small_degree.py @@ -886,15 +886,15 @@ def isogenies_5_0(E, minimal_models=True): from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by - y^2 + y = x^3 + (241565/32*a^5-362149/48*a^4+180281/24*a^3-9693307/4*a^2+14524871/6*a-7254985/3)*x - + (1660391123/192*a^5-829315373/96*a^4+77680504/9*a^3-66622345345/24*a^2+33276655441/12*a-24931615912/9) + y^2 + y = x^3 + (643/8*a^5-15779/48*a^4-32939/24*a^3-71989/2*a^2+214321/6*a-112115/3)*x + + (2901961/96*a^5+4045805/48*a^4+12594215/18*a^3-30029635/6*a^2+15341626/3*a-38944312/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320, Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 over Number Field in a with defining polynomial x^6 - 320*x^3 - 320 to Elliptic Curve defined by - y^2 + y = x^3 + (47519/32*a^5-72103/48*a^4+32939/24*a^3-1909753/4*a^2+2861549/6*a-1429675/3)*x - + (-131678717/192*a^5+65520419/96*a^4-12594215/18*a^3+5280985135/24*a^2-2637787519/12*a+1976130088/9) + y^2 + y = x^3 + (-1109/8*a^5-53873/48*a^4-180281/24*a^3-14491/2*a^2+35899/6*a-43745/3)*x + + (-17790679/96*a^5-60439571/48*a^4-77680504/9*a^3+1286245/6*a^2-4961854/3*a-73854632/9) over Number Field in a with defining polynomial x^6 - 320*x^3 - 320] """ F = E.base_field() diff --git a/src/sage/schemes/plane_conics/con_number_field.py b/src/sage/schemes/plane_conics/con_number_field.py index e09a1f60262..69fe9960c3d 100644 --- a/src/sage/schemes/plane_conics/con_number_field.py +++ b/src/sage/schemes/plane_conics/con_number_field.py @@ -121,7 +121,7 @@ def has_rational_point(self, point=False, obstruction=False, sage: K. = QuadraticField(-1) sage: C = Conic(K, [1, 3, -5]) sage: C.has_rational_point(point=True, obstruction=True) - (False, Fractional ideal (-i - 2)) + (False, Fractional ideal (i + 2)) sage: C.has_rational_point(algorithm='rnfisnorm') False sage: C.has_rational_point(algorithm='rnfisnorm', obstruction=True, @@ -135,7 +135,7 @@ def has_rational_point(self, point=False, obstruction=False, sage: L. = NumberField(x^3 - 5) sage: C = Conic(L, [1, 2, -3]) sage: C.has_rational_point(point=True, algorithm='rnfisnorm') - (True, (5/3 : -1/3 : 1)) + (True, (-5/3 : 1/3 : 1)) sage: K. = NumberField(x^4+2) sage: Conic(QQ, [4,5,6]).has_rational_point() diff --git a/src/sage/schemes/projective/projective_morphism.py b/src/sage/schemes/projective/projective_morphism.py index 20031e81a41..fcbb0c01e82 100644 --- a/src/sage/schemes/projective/projective_morphism.py +++ b/src/sage/schemes/projective/projective_morphism.py @@ -928,7 +928,7 @@ def normalize_coordinates(self, **kwds): Dynamical System of Projective Space of dimension 1 over Number Field in a with defining polynomial 3*x^2 + 1 Defn: Defined on coordinates by sending (z : w) to - ((-3/2*a + 1/2)*z^2 + (-3/2*a + 1/2)*w^2 : (-3/2*a - 3/2)*z*w) + ((3/2*a + 1/2)*z^2 + (3/2*a + 1/2)*w^2 : (-3/2*a + 3/2)*z*w) :: @@ -1728,11 +1728,11 @@ def _number_field_from_algebraics(self): sage: f._number_field_from_algebraics() # needs sage.symbolic Scheme endomorphism of Projective Space of dimension 1 over Number Field in a with defining polynomial y^6 + 6*y^4 - 6*y^3 + 12*y^2 + 36*y + 17 - with a = 1.442249570307409? + 1.414213562373095?*I + with a = 1.442249570307409? - 1.414213562373095?*I Defn: Defined on coordinates by sending (x : y) to ((-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 - 772/269*a - - 1092/269)*x^2 + (48/269*a^5 - 27/269*a^4 + 320/269*a^3 - 468/269*a^2 - + 1041/269*a + 1092/269)*y^2 : y^2) + - 1092/269)*x^2 + (-48/269*a^5 + 27/269*a^4 - 320/269*a^3 + 468/269*a^2 + - 1041/269*a - 1092/269)*y^2 : y^2) :: @@ -1745,12 +1745,12 @@ def _number_field_from_algebraics(self): Scheme morphism: From: Projective Space of dimension 1 over Number Field in a with defining polynomial y^4 + 3*y^2 + 1 - with a = 0.?e-113 + 0.618033988749895?*I + with a = 0.?e-166 + 1.618033988749895?*I To: Projective Space of dimension 2 over Number Field in a with defining polynomial y^4 + 3*y^2 + 1 - with a = 0.?e-113 + 0.618033988749895?*I + with a = 0.?e-166 + 1.618033988749895?*I Defn: Defined on coordinates by sending (x : y) to - (x^2 + (a^3 + 2*a)*x*y + 3*y^2 : y^2 : (2*a^2 + 3)*x*y) + (x^2 + (-a^3 - 2*a)*x*y + 3*y^2 : y^2 : (-2*a^2 - 3)*x*y) The following was fixed in :issue:`23808`:: diff --git a/src/sage/schemes/projective/projective_point.py b/src/sage/schemes/projective/projective_point.py index 88ab4eadcfc..95ee97a7d19 100644 --- a/src/sage/schemes/projective/projective_point.py +++ b/src/sage/schemes/projective/projective_point.py @@ -1246,10 +1246,10 @@ def _number_field_from_algebraics(self): sage: P. = ProjectiveSpace(QQbar, 1) sage: Q = P([-1/2*QQbar(sqrt(2)) + QQbar(I), 1]) sage: S = Q._number_field_from_algebraics(); S - (1/2*a^3 + a^2 - 1/2*a : 1) + (-1/2*a^3 + a^2 + 1/2*a : 1) sage: S.codomain() Projective Space of dimension 1 over Number Field in a with defining - polynomial y^4 + 1 with a = 0.7071067811865475? + 0.7071067811865475?*I + polynomial y^4 + 1 with a = -0.7071067811865475? - 0.7071067811865475?*I The following was fixed in :issue:`23808`:: @@ -1259,7 +1259,7 @@ def _number_field_from_algebraics(self): sage: Q = P([-1/2*QQbar(sqrt(2)) + QQbar(I), 1]);Q (-0.7071067811865475? + 1*I : 1) sage: S = Q._number_field_from_algebraics(); S - (1/2*a^3 + a^2 - 1/2*a : 1) + (-1/2*a^3 + a^2 + 1/2*a : 1) sage: T = S.change_ring(QQbar) # Used to fail sage: T (-0.7071067811865475? + 1.000000000000000?*I : 1) diff --git a/src/sage/structure/factorization.py b/src/sage/structure/factorization.py index ab3fa717031..b16822791dc 100644 --- a/src/sage/structure/factorization.py +++ b/src/sage/structure/factorization.py @@ -143,17 +143,17 @@ sage: K. = NumberField(x^2 + 3); K Number Field in a with defining polynomial x^2 + 3 sage: f = K.factor(15); f - (Fractional ideal (1/2*a + 3/2))^2 * (Fractional ideal (5)) + (Fractional ideal (-a))^2 * (Fractional ideal (5)) sage: f.universe() Monoid of ideals of Number Field in a with defining polynomial x^2 + 3 sage: f.unit() Fractional ideal (1) sage: g = K.factor(9); g - (Fractional ideal (1/2*a + 3/2))^4 + (Fractional ideal (-a))^4 sage: f.lcm(g) - (Fractional ideal (1/2*a + 3/2))^4 * (Fractional ideal (5)) + (Fractional ideal (-a))^4 * (Fractional ideal (5)) sage: f.gcd(g) - (Fractional ideal (1/2*a + 3/2))^2 + (Fractional ideal (-a))^2 sage: f.is_integral() True From 6a374d3f7fb5aa4c645e7e04c60dff611297e0f6 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 6 Oct 2024 11:02:21 +0200 Subject: [PATCH 16/26] Account for random output in some tests --- src/sage/arith/misc.py | 19 +++++++++++++------ .../rings/number_field/number_field_ideal.py | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py index a90c00364bb..28f004873b2 100644 --- a/src/sage/arith/misc.py +++ b/src/sage/arith/misc.py @@ -2691,9 +2691,14 @@ def factor(n, proof=None, int_=False, algorithm='pari', verbose=0, **kwds): Any object which has a factor method can be factored like this:: - sage: K. = QuadraticField(-1) # needs sage.rings.number_field - sage: factor(122 - 454*i) # needs sage.rings.number_field - (-i - 2)^3 * (-i - 1)^3 * (3*i + 2) * (i + 4) + sage: # needs sage.rings.number_field + sage: K. = QuadraticField(-1) + sage: f = factor(122 - 454*i); f # random + (i) * (i - 1)^3 * (i + 2)^3 * (3*i + 2) * (i + 4) + sage: len(f) + 4 + sage: product(p[0]^p[1] for p in f) * f.unit() + -454*i + 122 To access the data in a factorization:: @@ -2775,8 +2780,10 @@ def radical(n, *args, **kwds): ... ArithmeticError: radical of 0 is not defined sage: K. = QuadraticField(-1) # needs sage.rings.number_field - sage: radical(K(2)) # needs sage.rings.number_field - -i - 1 + sage: r = radical(K(2)); r # random, needs sage.rings.number_field + i - 1 + sage: r.norm() # needs sage.rings.number_field + 2 Tests with numpy and gmpy2 numbers:: @@ -3031,7 +3038,7 @@ def is_squarefree(n): sage: is_squarefree(O(2)) False sage: O(2).factor() - (-I) * (-I - 1)^2 + (...) * (...)^2 This method fails on domains which are not Unique Factorization Domains:: diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py index c053118ab94..d6749c3a16a 100644 --- a/src/sage/rings/number_field/number_field_ideal.py +++ b/src/sage/rings/number_field/number_field_ideal.py @@ -2069,7 +2069,7 @@ def ramification_index(self): sage: K. = NumberField(x^2 + 2); K Number Field in a with defining polynomial x^2 + 2 sage: f = K.factor(2); f - (Fractional ideal (a))^2 + (Fractional ideal (...a))^2 sage: f[0][0].ramification_index() 2 sage: K.ideal(13).ramification_index() From 29d8cc2df0aec796057e14541c1a14e91a4f63a0 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 27 Oct 2024 08:36:04 +0100 Subject: [PATCH 17/26] Account for more pari 2.17 random output in some tests --- src/sage/rings/number_field/number_field_ideal_rel.py | 8 ++++++-- src/sage/schemes/elliptic_curves/ell_number_field.py | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/number_field/number_field_ideal_rel.py b/src/sage/rings/number_field/number_field_ideal_rel.py index 0bae4e74e13..eb39f6f4d12 100644 --- a/src/sage/rings/number_field/number_field_ideal_rel.py +++ b/src/sage/rings/number_field/number_field_ideal_rel.py @@ -409,8 +409,10 @@ def relative_norm(self): sage: K. = NumberField(2*x^2 - 1/3) sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] - sage: P.relative_norm() + sage: rn = P.relative_norm(); rn # random Fractional ideal (6*a - 2) + sage: rn in [K.ideal(6*a - 2), K.ideal(-6*a -2)] + True """ L = self.number_field() K = L.base_field() @@ -528,8 +530,10 @@ def ideal_below(self): sage: K. = NumberField(2*x^2 - 1/3) sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] - sage: P.ideal_below() + sage: ib = P.ideal_below(); ib # random Fractional ideal (6*a - 2) + sage: ib in [K.ideal(6*a - 2), K.ideal(-6*a -2)] + True """ L = self.number_field() K = L.base_field() diff --git a/src/sage/schemes/elliptic_curves/ell_number_field.py b/src/sage/schemes/elliptic_curves/ell_number_field.py index 64b8a63321b..f4c46b79133 100644 --- a/src/sage/schemes/elliptic_curves/ell_number_field.py +++ b/src/sage/schemes/elliptic_curves/ell_number_field.py @@ -1487,8 +1487,10 @@ def conductor(self): sage: EllipticCurve([i, i - 1, i + 1, 24*i + 15, 14*i + 35]).conductor() Fractional ideal (3*i + 21) sage: K. = NumberField(x^2 - x + 3) - sage: EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor() - Fractional ideal (-6*a) + sage: cond = EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor(); cond # random + Fractional ideal (6*a) + sage: cond == K.ideal(6*a) + True A not so well known curve with everywhere good reduction:: From 27676696e521b8d5abc1e64cec43d8408012800a Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Tue, 24 Dec 2024 12:05:00 +0100 Subject: [PATCH 18/26] Test output is no longer random --- src/sage/arith/misc.py | 14 +- src/sage/rings/number_field/number_field.py | 127 +++++++++--------- .../rings/number_field/number_field_ideal.py | 2 +- .../number_field/number_field_ideal_rel.py | 16 +-- src/sage/rings/number_field/order.py | 4 +- src/sage/rings/rational.pyx | 2 +- .../elliptic_curves/ell_number_field.py | 4 +- src/sage/schemes/elliptic_curves/ell_point.py | 4 +- 8 files changed, 78 insertions(+), 95 deletions(-) diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py index 28f004873b2..12f1760b67f 100644 --- a/src/sage/arith/misc.py +++ b/src/sage/arith/misc.py @@ -2693,12 +2693,8 @@ def factor(n, proof=None, int_=False, algorithm='pari', verbose=0, **kwds): sage: # needs sage.rings.number_field sage: K. = QuadraticField(-1) - sage: f = factor(122 - 454*i); f # random - (i) * (i - 1)^3 * (i + 2)^3 * (3*i + 2) * (i + 4) - sage: len(f) - 4 - sage: product(p[0]^p[1] for p in f) * f.unit() - -454*i + 122 + sage: f = factor(122 - 454*i); f + (-1) * (i - 1)^3 * (2*i - 1)^3 * (3*i + 2) * (i + 4) To access the data in a factorization:: @@ -2780,10 +2776,8 @@ def radical(n, *args, **kwds): ... ArithmeticError: radical of 0 is not defined sage: K. = QuadraticField(-1) # needs sage.rings.number_field - sage: r = radical(K(2)); r # random, needs sage.rings.number_field + sage: radical(K(2)) # needs sage.rings.number_field i - 1 - sage: r.norm() # needs sage.rings.number_field - 2 Tests with numpy and gmpy2 numbers:: @@ -3038,7 +3032,7 @@ def is_squarefree(n): sage: is_squarefree(O(2)) False sage: O(2).factor() - (...) * (...)^2 + (I) * (I - 1)^2 This method fails on domains which are not Unique Factorization Domains:: diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index b6631cd1519..8a3a3300534 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -3665,27 +3665,40 @@ def ideals_of_bdd_norm(self, bound): sage: x = polygen(QQ, 'x') sage: K. = NumberField(x^2 + 23) - sage: d = K.ideals_of_bdd_norm(10); d # random - {1: [Fractional ideal (1)], - 2: [Fractional ideal (2, 1/2*a - 1/2), Fractional ideal (2, 1/2*a + 1/2)], - 3: [Fractional ideal (3, 1/2*a + 1/2), Fractional ideal (3, 1/2*a - 1/2)], - 4: [Fractional ideal (4, 1/2*a + 3/2), - Fractional ideal (2), - Fractional ideal (4, 1/2*a + 5/2)], - 5: [], - 6: [Fractional ideal (6, 1/2*a + 7/2), - Fractional ideal (-1/2*a - 1/2), - Fractional ideal (-1/2*a + 1/2), - Fractional ideal (6, 1/2*a + 5/2)], - 7: [], - 8: [Fractional ideal (1/2*a + 3/2), - Fractional ideal (4, a - 1), - Fractional ideal (4, a + 1), - Fractional ideal (-1/2*a + 3/2)], - 9: [Fractional ideal (9, 1/2*a + 7/2), - Fractional ideal (3), - Fractional ideal (9, 1/2*a + 11/2)], - 10: []} + sage: d = K.ideals_of_bdd_norm(10) + sage: for n in d: + ....: print(n) + ....: for I in sorted(d[n]): + ....: print(I) + 1 + Fractional ideal (1) + 2 + Fractional ideal (2, 1/2*a - 1/2) + Fractional ideal (2, 1/2*a + 1/2) + 3 + Fractional ideal (3, 1/2*a - 1/2) + Fractional ideal (3, 1/2*a + 1/2) + 4 + Fractional ideal (2) + Fractional ideal (4, 1/2*a + 3/2) + Fractional ideal (4, 1/2*a + 5/2) + 5 + 6 + Fractional ideal (-1/2*a + 1/2) + Fractional ideal (1/2*a + 1/2) + Fractional ideal (6, 1/2*a + 5/2) + Fractional ideal (6, 1/2*a + 7/2) + 7 + 8 + Fractional ideal (4, a - 1) + Fractional ideal (4, a + 1) + Fractional ideal (-1/2*a - 3/2) + Fractional ideal (1/2*a - 3/2) + 9 + Fractional ideal (3) + Fractional ideal (9, 1/2*a + 7/2) + Fractional ideal (9, 1/2*a + 11/2) + 10 sage: [[I.norm() for I in sorted(d[n])] for n in d] [[1], [2, 2], [3, 3], [4, 4, 4], [], [6, 6, 6, 6], [], [8, 8, 8, 8], [9, 9, 9], []] """ @@ -3914,13 +3927,11 @@ def primes_of_bounded_norm(self, B): EXAMPLES:: sage: K. = QuadraticField(-1) - sage: P = K.primes_of_bounded_norm(10); P # random - [Fractional ideal (i + 1), - Fractional ideal (i + 2), - Fractional ideal (-i + 2), + sage: K.primes_of_bounded_norm(10) + [Fractional ideal (i - 1), + Fractional ideal (2*i - 1), + Fractional ideal (-2*i - 1), Fractional ideal (3)] - sage: [p.norm() for p in P] - [2, 5, 5, 9] sage: K.primes_of_bounded_norm(1) [] sage: x = polygen(QQ, 'x') @@ -3981,13 +3992,11 @@ def primes_of_bounded_norm_iter(self, B): sage: K. = QuadraticField(-1) sage: it = K.primes_of_bounded_norm_iter(10) - sage: l = list(it); l # random - [Fractional ideal (i + 1), + sage: list(it) + [Fractional ideal (i - 1), Fractional ideal (3), - Fractional ideal (i + 2), - Fractional ideal (-i + 2)] - sage: [I.norm() for I in l] - [2, 9, 5, 5] + Fractional ideal (2*i - 1), + Fractional ideal (-2*i - 1)] sage: list(K.primes_of_bounded_norm_iter(1)) [] """ @@ -4817,7 +4826,7 @@ def _S_class_group_and_units(self, S, proof=True): sage: K. = NumberField(2*x^2 - 1/3) sage: K._S_class_group_and_units(tuple(K.primes_above(2) + K.primes_above(3))) - ([...6*a...2, ...6*a...3, -1, ...12*a...5], []) + ([6*a + 2, -6*a + 3, -1, -12*a - 5], []) """ K_pari = self.pari_bnf(proof=proof) S_pari = [p.pari_prime() for p in sorted(set(S))] @@ -5152,20 +5161,14 @@ def selmer_space(self, S, p, proof=None): sage: KS2, gens, fromKS2, toKS2 = K.selmer_space([P2, P3, P5], 2) sage: KS2 Vector space of dimension 4 over Finite Field of size 2 - sage: gens # random - [-a - 1, a, 2, -1] - sage: gens in ([-a - 1, a, 2, -1], [a + 1, a, 2, -1]) - True + sage: gens + [a + 1, a, 2, -1] Each generator must have even valuation at primes not in `S`:: - sage: facgens = [K.ideal(g).factor() for g in gens]; facgens # random + sage: [K.ideal(g).factor() for g in gens] [(Fractional ideal (2, a + 1)) * (Fractional ideal (3, a + 1)), - Fractional ideal (a), - (Fractional ideal (2, a + 1))^2, - 1] - sage: facgens[2][0][1] - 2 + Fractional ideal (-a), (Fractional ideal (2, a + 1))^2, 1] sage: toKS2(10) (0, 0, 1, 1) @@ -5177,10 +5180,8 @@ def selmer_space(self, S, p, proof=None): sage: KS3, gens, fromKS3, toKS3 = K.selmer_space([P2, P3, P5], 3) sage: KS3 Vector space of dimension 3 over Finite Field of size 3 - sage: gens # random - [1/2, -1/4*a - 1/4, a] - sage: gens in ([1/2, -1/4*a - 1/4, a], [1/2, 1/4*a + 1/4, a]) - True + sage: gens + [1/2, 1/4*a + 1/4, a] An example to show that the group `K(S,2)` may be strictly larger than the group of elements giving extensions unramified @@ -5876,16 +5877,10 @@ def factor(self, n): sage: K. = NumberField(x^2 + 1) sage: K.factor(1/3) (Fractional ideal (3))^-1 - sage: fac = K.factor(1+a); fac # random - Fractional ideal (-a - 1) - sage: len(fac) - 1 - sage: fac = K.factor(1+a/5); fac # random - (Fractional ideal (-a - 1)) * (Fractional ideal (2*a - 1))^-1 * (Fractional ideal (-2*a - 1))^-1 * (Fractional ideal (3*a + 2)) - sage: len(fac) - 4 - sage: product(I[0]^I[1] for I in list(fac)) - Fractional ideal (1/5*a + 1) + sage: K.factor(1+a) + Fractional ideal (a - 1) + sage: K.factor(1+a/5) + (Fractional ideal (a - 1)) * (Fractional ideal (2*a - 1))^-1 * (Fractional ideal (-2*a - 1))^-1 * (Fractional ideal (3*a + 2)) An example over a relative number field:: @@ -6517,12 +6512,12 @@ def reduced_basis(self, prec=None): sage: k. = NumberField(x^6 + 2218926655879913714112*x^4 - 32507675650290949030789018433536*x^3 + 4923635504174417014460581055002374467948544*x^2 - 36066074010564497464129951249279114076897746988630016*x + 264187244046129768986806800244258952598300346857154900812365824) sage: new_basis = k.reduced_basis(prec=120) sage: [c.minpoly() for c in new_basis] - [x^2 + x + 1, - x - 1, - x^6 + 3*x^5 - 102*x^4 - 315*x^3 + 10254*x^2 + 80955*x + 198147, - x^6 + 213*x^4 + 12567*x^2 + 198147, - x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104, - x^6 + 171*x^4 - 1696*x^3 + 29241*x^2 - 145008*x + 719104] + [x - 1, + x^2 + x + 1, + x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, + x^6 + 3*x^5 - 102*x^4 - 103*x^3 + 10572*x^2 - 59919*x + 127657, + x^3 - 171*x + 848, + x^6 + 171*x^4 + 1696*x^3 + 29241*x^2 + 145008*x + 719104] sage: R = k.order(new_basis) sage: R.discriminant()==k.discriminant() True @@ -7438,8 +7433,8 @@ def S_unit_solutions(self, S=[], prec=106, include_exponents=False, include_boun sage: # needs sage.rings.padics sage: solutions, bound = K.S_unit_solutions(S, prec=100, include_bound=True) - sage: bound in (6, 7) - True + sage: bound + 6 """ from .S_unit_solver import solve_S_unit_equation return solve_S_unit_equation(self, S, prec, include_exponents, include_bound, proof) diff --git a/src/sage/rings/number_field/number_field_ideal.py b/src/sage/rings/number_field/number_field_ideal.py index d6749c3a16a..c053118ab94 100644 --- a/src/sage/rings/number_field/number_field_ideal.py +++ b/src/sage/rings/number_field/number_field_ideal.py @@ -2069,7 +2069,7 @@ def ramification_index(self): sage: K. = NumberField(x^2 + 2); K Number Field in a with defining polynomial x^2 + 2 sage: f = K.factor(2); f - (Fractional ideal (...a))^2 + (Fractional ideal (a))^2 sage: f[0][0].ramification_index() 2 sage: K.ideal(13).ramification_index() diff --git a/src/sage/rings/number_field/number_field_ideal_rel.py b/src/sage/rings/number_field/number_field_ideal_rel.py index bae991c148e..129d0288024 100644 --- a/src/sage/rings/number_field/number_field_ideal_rel.py +++ b/src/sage/rings/number_field/number_field_ideal_rel.py @@ -385,7 +385,7 @@ def relative_norm(self): sage: K. = NumberField(x^2 + 6) sage: L. = K.extension(K['x'].gen()^4 + a) sage: N = L.ideal(b).relative_norm(); N - Fractional ideal (a) + Fractional ideal (-a) sage: N.parent() Monoid of ideals of Number Field in a with defining polynomial x^2 + 6 sage: N.ring() @@ -409,10 +409,8 @@ def relative_norm(self): sage: K. = NumberField(2*x^2 - 1/3) sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] - sage: rn = P.relative_norm(); rn # random - Fractional ideal (6*a - 2) - sage: rn in [K.ideal(6*a - 2), K.ideal(-6*a -2)] - True + sage: P.relative_norm() + Fractional ideal (6*a + 2) """ L = self.number_field() K = L.base_field() @@ -530,10 +528,8 @@ def ideal_below(self): sage: K. = NumberField(2*x^2 - 1/3) sage: L. = K.extension(5*x^2 + 1) sage: P = L.primes_above(2)[0] - sage: ib = P.ideal_below(); ib # random - Fractional ideal (6*a - 2) - sage: ib in [K.ideal(6*a - 2), K.ideal(-6*a -2)] - True + sage: P.ideal_below() + Fractional ideal (6*a + 2) """ L = self.number_field() K = L.base_field() @@ -916,7 +912,7 @@ def is_NumberFieldFractionalIdeal_rel(x): sage: is_NumberFieldFractionalIdeal_rel(I) True sage: N = I.relative_norm(); N - Fractional ideal (a) + Fractional ideal (-a) sage: is_NumberFieldFractionalIdeal_rel(N) False """ diff --git a/src/sage/rings/number_field/order.py b/src/sage/rings/number_field/order.py index 186c44c90ab..d1c055bf549 100644 --- a/src/sage/rings/number_field/order.py +++ b/src/sage/rings/number_field/order.py @@ -496,7 +496,7 @@ def fractional_ideal(self, *args, **kwds): sage: K. = NumberField(x^2 + 2) sage: R = K.maximal_order() sage: R.fractional_ideal(2/3 + 7*a, a) - Fractional ideal (-1/3*a) + Fractional ideal (1/3*a) """ return self.number_field().fractional_ideal(*args, **kwds) @@ -570,7 +570,7 @@ def __mul__(self, right): sage: k. = NumberField(x^2 + 5077); G = k.class_group(); G Class group of order 22 with structure C22 of Number Field in a with defining polynomial x^2 + 5077 sage: G.0 ^ -9 - Fractional ideal class (67, a + 45) + Fractional ideal class (43, a + 13) sage: Ok = k.maximal_order(); Ok Maximal Order generated by a in Number Field in a with defining polynomial x^2 + 5077 sage: Ok * (11, a + 7) diff --git a/src/sage/rings/rational.pyx b/src/sage/rings/rational.pyx index 3300c126629..d1def05ac18 100644 --- a/src/sage/rings/rational.pyx +++ b/src/sage/rings/rational.pyx @@ -1446,7 +1446,7 @@ cdef class Rational(sage.structure.element.FieldElement): sage: 0.is_norm(K) True sage: (1/7).is_norm(K, element=True) - (True, -3/7*beta + 5/7) + (True, 1/7*beta + 3/7) sage: (1/10).is_norm(K, element=True) (False, None) sage: (1/691).is_norm(QQ, element=True) diff --git a/src/sage/schemes/elliptic_curves/ell_number_field.py b/src/sage/schemes/elliptic_curves/ell_number_field.py index f4c46b79133..62bbd71e809 100644 --- a/src/sage/schemes/elliptic_curves/ell_number_field.py +++ b/src/sage/schemes/elliptic_curves/ell_number_field.py @@ -1487,10 +1487,8 @@ def conductor(self): sage: EllipticCurve([i, i - 1, i + 1, 24*i + 15, 14*i + 35]).conductor() Fractional ideal (3*i + 21) sage: K. = NumberField(x^2 - x + 3) - sage: cond = EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor(); cond # random + sage: EllipticCurve([1 + a, -1 + a, 1 + a, -11 + a, 5 - 9*a]).conductor() Fractional ideal (6*a) - sage: cond == K.ideal(6*a) - True A not so well known curve with everywhere good reduction:: diff --git a/src/sage/schemes/elliptic_curves/ell_point.py b/src/sage/schemes/elliptic_curves/ell_point.py index 97509cfd900..5b4cdab67e9 100644 --- a/src/sage/schemes/elliptic_curves/ell_point.py +++ b/src/sage/schemes/elliptic_curves/ell_point.py @@ -3053,8 +3053,8 @@ def has_good_reduction(self, P=None): sage: K. = NumberField(x^2 + 1) sage: E = EllipticCurve(K, [0,1,0,-160,308]) sage: P = E(26, -120) - sage: E.discriminant().support() # random - [Fractional ideal (-i - 1), + sage: E.discriminant().support() + [Fractional ideal (i - 1), Fractional ideal (2*i - 1), Fractional ideal (-2*i - 1), Fractional ideal (3)] From e033512670b578e57d2ceba93a28c52dd236acfd Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Wed, 25 Dec 2024 00:32:56 +0100 Subject: [PATCH 19/26] Fix merge --- src/sage/rings/integer.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index b4aa04b374f..c9d1ff65bc6 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -5585,7 +5585,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): sage: 5.is_norm(K) False sage: n.is_norm(K, element=True) - (True, 4*beta + 6) + (True, -4*beta + 6) sage: n.is_norm(K, element=True)[1].norm() 4 sage: n = 5 From 75f614fd2f1065237fed7d261b6e189b59d68c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Fri, 27 Dec 2024 18:06:11 -0300 Subject: [PATCH 20/26] fix test by sorting (fails on aarch64) --- src/sage/rings/number_field/galois_group.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/sage/rings/number_field/galois_group.py b/src/sage/rings/number_field/galois_group.py index ee53ca6d674..7508594859d 100644 --- a/src/sage/rings/number_field/galois_group.py +++ b/src/sage/rings/number_field/galois_group.py @@ -994,9 +994,11 @@ def artin_symbol(self, P): sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^4 - 2*x^2 + 2, 'a').galois_closure() sage: G = K.galois_group() - sage: [G.artin_symbol(P) for P in K.primes_above(7)] - [(1,5)(2,6)(3,7)(4,8), (1,5)(2,6)(3,7)(4,8), - (1,4)(2,3)(5,8)(6,7), (1,4)(2,3)(5,8)(6,7)] + sage: sorted([G.artin_symbol(P) for P in K.primes_above(7)]) + [(1,4)(2,3)(5,8)(6,7), + (1,4)(2,3)(5,8)(6,7), + (1,5)(2,6)(3,7)(4,8), + (1,5)(2,6)(3,7)(4,8)] sage: G.artin_symbol(17) Traceback (most recent call last): ... From 26f411e5939718d4439325ff669635e5a72d50e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Thu, 26 Dec 2024 15:41:53 -0300 Subject: [PATCH 21/26] fix two 32-bit tests --- src/sage/rings/number_field/bdd_height.py | 3 ++- src/sage/rings/number_field/number_field.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/number_field/bdd_height.py b/src/sage/rings/number_field/bdd_height.py index 45f08aa4711..b88b315fd01 100644 --- a/src/sage/rings/number_field/bdd_height.py +++ b/src/sage/rings/number_field/bdd_height.py @@ -236,7 +236,8 @@ def bdd_norm_pr_ideal_gens(K, norm_list): sage: from sage.rings.number_field.bdd_height import bdd_norm_pr_ideal_gens sage: K. = QuadraticField(123) sage: bdd_norm_pr_ideal_gens(K, range(5)) - {0: [0], 1: [1], 2: [g + 11], 3: [], 4: [2]} + {0: [0], 1: [1], 2: [g + 11], 3: [], 4: [2]} # 64-bit + {0: [0], 1: [1], 2: [g - 11], 3: [], 4: [2]} # 32-bit :: diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 8a3a3300534..c6ecfc2576d 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -4826,7 +4826,8 @@ def _S_class_group_and_units(self, S, proof=True): sage: K. = NumberField(2*x^2 - 1/3) sage: K._S_class_group_and_units(tuple(K.primes_above(2) + K.primes_above(3))) - ([6*a + 2, -6*a + 3, -1, -12*a - 5], []) + ([6*a + 2, -6*a + 3, -1, -12*a - 5], []) # 64-bit + ([6*a + 2, -6*a - 3, -1, -12*a - 5], []) # 32-bit """ K_pari = self.pari_bnf(proof=proof) S_pari = [p.pari_prime() for p in sorted(set(S))] From f5af542dbab2b2962a53bd86c74427ebbce2dfa1 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sat, 4 Jan 2025 22:10:15 +0100 Subject: [PATCH 22/26] Fix rebase --- src/sage/rings/number_field/number_field.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index ce75b009a11..43dbb3b2ab5 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -8789,8 +8789,7 @@ def subfields(self, degree=0, name=None): sage: K. = NumberField(2*x^4 + 6*x^2 + 1/2) sage: K.subfields() - [ - (Number Field in a0 with defining polynomial x, Ring morphism: + [(Number Field in a0 with defining polynomial x, Ring morphism: From: Number Field in a0 with defining polynomial x To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 Defn: 0 |--> 0, None), @@ -8812,8 +8811,7 @@ def subfields(self, degree=0, name=None): Defn: a4 |--> -a^3 - 1/2*a^2 - 5/2*a - 3/4, Ring morphism: From: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 To: Number Field in a4 with defining polynomial x^4 + 1 - Defn: a |--> 1/2*a4^3 + a4^2 + 1/2*a4) - ] + Defn: a |--> 1/2*a4^3 + a4^2 + 1/2*a4)] """ return self._subfields_helper(degree=degree, name=name, both_maps=True, optimize=False) From ce1531d7dbbd2fd41455b1db523fce3e8933a596 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 5 Jan 2025 19:29:50 +0100 Subject: [PATCH 23/26] Fix merge --- src/sage/rings/number_field/number_field.py | 56 ++++++++++++--------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py index 43dbb3b2ab5..65cca411e1a 100644 --- a/src/sage/rings/number_field/number_field.py +++ b/src/sage/rings/number_field/number_field.py @@ -8789,29 +8789,39 @@ def subfields(self, degree=0, name=None): sage: K. = NumberField(2*x^4 + 6*x^2 + 1/2) sage: K.subfields() - [(Number Field in a0 with defining polynomial x, Ring morphism: - From: Number Field in a0 with defining polynomial x - To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: 0 |--> 0, None), - (Number Field in a1 with defining polynomial x^2 - 2, Ring morphism: - From: Number Field in a1 with defining polynomial x^2 - 2 - To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a1 |--> -a^2 - 3/2, None), - (Number Field in a2 with defining polynomial x^2 + 4, Ring morphism: - From: Number Field in a2 with defining polynomial x^2 + 4 - To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a2 |--> 2*a^3 + 7*a, None), - (Number Field in a3 with defining polynomial x^2 + 2, Ring morphism: - From: Number Field in a3 with defining polynomial x^2 + 2 - To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a3 |--> -2*a^3 - 5*a, None), - (Number Field in a4 with defining polynomial x^4 + 1, Ring morphism: - From: Number Field in a4 with defining polynomial x^4 + 1 - To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - Defn: a4 |--> -a^3 - 1/2*a^2 - 5/2*a - 3/4, Ring morphism: - From: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 - To: Number Field in a4 with defining polynomial x^4 + 1 - Defn: a |--> 1/2*a4^3 + a4^2 + 1/2*a4)] + [(Number Field in a0 with defining polynomial x, + Ring morphism: + From: Number Field in a0 with defining polynomial x + To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 + Defn: 0 |--> 0, + None), + (Number Field in a1 with defining polynomial x^2 - 2, + Ring morphism: + From: Number Field in a1 with defining polynomial x^2 - 2 + To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 + Defn: a1 |--> -a^2 - 3/2, + None), + (Number Field in a2 with defining polynomial x^2 + 4, + Ring morphism: + From: Number Field in a2 with defining polynomial x^2 + 4 + To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 + Defn: a2 |--> 2*a^3 + 7*a, + None), + (Number Field in a3 with defining polynomial x^2 + 2, + Ring morphism: + From: Number Field in a3 with defining polynomial x^2 + 2 + To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 + Defn: a3 |--> -2*a^3 - 5*a, + None), + (Number Field in a4 with defining polynomial x^4 + 1, + Ring morphism: + From: Number Field in a4 with defining polynomial x^4 + 1 + To: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 + Defn: a4 |--> -a^3 - 1/2*a^2 - 5/2*a - 3/4, + Ring morphism: + From: Number Field in a with defining polynomial 2*x^4 + 6*x^2 + 1/2 + To: Number Field in a4 with defining polynomial x^4 + 1 + Defn: a |--> 1/2*a4^3 + a4^2 + 1/2*a4)] """ return self._subfields_helper(degree=degree, name=name, both_maps=True, optimize=False) From 427c2ea9105775ec6759bac87f20fc3363942027 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Tue, 7 Jan 2025 08:49:47 +0100 Subject: [PATCH 24/26] Update pari to 2.17.1 --- build/pkgs/pari/checksums.ini | 6 +++--- build/pkgs/pari/package-version.txt | 2 +- build/pkgs/pari/spkg-configure.m4 | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/build/pkgs/pari/checksums.ini b/build/pkgs/pari/checksums.ini index d56c437a2ee..cfb35617995 100644 --- a/build/pkgs/pari/checksums.ini +++ b/build/pkgs/pari/checksums.ini @@ -1,4 +1,4 @@ tarball=pari-VERSION.tar.gz -sha1=377593dfe72df13578ea0a517fcb0f81cc9758d4 -sha256=0efdda7515d9d954f63324c34b34c560e60f73a81c3924a71260a2cc91d5f981 -upstream_url=https://pari.math.u-bordeaux.fr/pub/pari/OLD/${VERSION_MAJOR}.${VERSION_MINOR}/pari-VERSION.tar.gz +sha1=f5f5656a68947ef6a4841d40dd09a72fe96762a5 +sha256=67ba6f3071233725258541e4f174b5efbc64c65ae5115bade9edfc45f1fde5dc +upstream_url=https://pari.math.u-bordeaux.fr/pub/pari/unix/pari-VERSION.tar.gz diff --git a/build/pkgs/pari/package-version.txt b/build/pkgs/pari/package-version.txt index 7a561821071..3f8eb714d02 100644 --- a/build/pkgs/pari/package-version.txt +++ b/build/pkgs/pari/package-version.txt @@ -1 +1 @@ -2.15.5 +2.17.1 diff --git a/build/pkgs/pari/spkg-configure.m4 b/build/pkgs/pari/spkg-configure.m4 index 207487119a6..cb9081c7303 100644 --- a/build/pkgs/pari/spkg-configure.m4 +++ b/build/pkgs/pari/spkg-configure.m4 @@ -1,8 +1,6 @@ SAGE_SPKG_CONFIGURE([pari], [ dnl See gp_version below on how the version is computed from MAJV.MINV.PATCHV - m4_pushdef([SAGE_PARI_MINVER],["134916"])dnl this version and higher allowed - dnl Do not allow Pari 2.17 or later, see #38769: - m4_pushdef([SAGE_PARI_MAXVER],["135424"])dnl this version and higher not allowed + m4_pushdef([SAGE_PARI_MINVER],["135245"])dnl this version and higher allowed SAGE_SPKG_DEPCHECK([gmp readline], [ AC_PATH_PROG([GP], [gp]) if test x$GP = x; then dnl GP test From 252efccc457eb430522a624d806e76ba70d765d5 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Tue, 7 Jan 2025 08:54:19 +0100 Subject: [PATCH 25/26] Update cypari to 2.2.1 --- build/pkgs/cypari/checksums.ini | 4 ++-- build/pkgs/cypari/package-version.txt | 2 +- pyproject.toml | 4 ++-- src/pyproject.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/pkgs/cypari/checksums.ini b/build/pkgs/cypari/checksums.ini index 1ead9490d1a..3794d83334f 100644 --- a/build/pkgs/cypari/checksums.ini +++ b/build/pkgs/cypari/checksums.ini @@ -1,4 +1,4 @@ tarball=cypari2-VERSION.tar.gz -sha1=4e9f14d218bc1cea29e03a2ceec9bf3dfbfd5eb3 -sha256=817606bf661b71d33e1d012421907a4f8fb09dd81b7d3e3ae179b3978020bbf1 +sha1=556d1a16818663ba6e6a3c9d2b14cc907a7eef4c +sha256=aaa017a6a280581902f73cf5ce1695712b6598a032be14cfab81f97c475f83b8 upstream_url=https://files.pythonhosted.org/packages/source/c/cypari2/cypari2-VERSION.tar.gz diff --git a/build/pkgs/cypari/package-version.txt b/build/pkgs/cypari/package-version.txt index ccbccc3dc62..c043eea7767 100644 --- a/build/pkgs/cypari/package-version.txt +++ b/build/pkgs/cypari/package-version.txt @@ -1 +1 @@ -2.2.0 +2.2.1 diff --git a/pyproject.toml b/pyproject.toml index e2b17964399..657064c1716 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ build-backend = 'mesonpy' # Minimum requirements for the build system to execute. requires = [ 'meson-python', - 'cypari2 >=2.1.1', + 'cypari2 >=2.2.1', # cysignals 1.11.2 is the newest version that is available on conda: # https://github.com/conda-forge/cysignals-feedstock/pull/49 'cysignals >=1.11.2', @@ -20,7 +20,7 @@ description = "Sage: Open Source Mathematics Software: Standard Python Library" dependencies = [ 'six >=1.15.0', 'conway-polynomials >=0.8', - 'cypari2 >=2.1.1', + 'cypari2 >=2.2.1', 'cysignals >=1.10.2', 'cython >=3.0, != 3.0.3', 'gmpy2 ~=2.1.b999', diff --git a/src/pyproject.toml b/src/pyproject.toml index 4b70dc133d1..625b08afd7a 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -6,7 +6,7 @@ requires = [ 'setuptools >= 68.1.1', # version constraint for macOS Big Sur support (see https://github.com/sagemath/sage/issues/31050) 'wheel >=0.36.2', - 'cypari2 >=2.1.1', + 'cypari2 >=2.2.1', 'cysignals >=1.10.2', # Exclude 3.0.3 because of https://github.com/cython/cython/issues/5748 'cython >=3.0, != 3.0.3, <4.0', From 1570ab01257cc76adb31e26699fd1cfe42844cab Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Tue, 7 Jan 2025 09:03:45 +0100 Subject: [PATCH 26/26] Restore SAGE_PARI_MAXVER --- build/pkgs/pari/spkg-configure.m4 | 1 + 1 file changed, 1 insertion(+) diff --git a/build/pkgs/pari/spkg-configure.m4 b/build/pkgs/pari/spkg-configure.m4 index cb9081c7303..d9d90e0d421 100644 --- a/build/pkgs/pari/spkg-configure.m4 +++ b/build/pkgs/pari/spkg-configure.m4 @@ -1,6 +1,7 @@ SAGE_SPKG_CONFIGURE([pari], [ dnl See gp_version below on how the version is computed from MAJV.MINV.PATCHV m4_pushdef([SAGE_PARI_MINVER],["135245"])dnl this version and higher allowed + m4_pushdef([SAGE_PARI_MAXVER],["999999"])dnl this version and higher not allowed SAGE_SPKG_DEPCHECK([gmp readline], [ AC_PATH_PROG([GP], [gp]) if test x$GP = x; then dnl GP test