From cfd28073b293e8ed43b07a0abc354e9c3bccbb80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Thu, 19 Dec 2024 22:51:49 -0300 Subject: [PATCH] sagemath: update to 10.5. --- .../sagemath/patches/36641-sympy_1.13.patch | 76 - .../sagemath/patches/37884-gap_4.13.1.patch | 203 -- .../sagemath/patches/38250-numpy_2.0.patch | 587 ----- .../sagemath/patches/38344-ecm_7.0.6.patch | 43 - .../sagemath/patches/38749-pari_2.17.patch | 2297 +++++++++++++++++ .../38940-fix_flaky_simplicial_set_test.patch | 73 + .../patches/38962-eclib_20241112.patch | 70 + .../patches/39145-python_3.13_re.sub.patch | 39 + .../patches/39147-python_3.13_doctest.patch | 58 + .../patches/39178-giac_1.9.0.998.patch | 20 + .../patches/39182-python_3.13_iter.patch | 28 + ...9184-python_3.13_produce_latex_macro.patch | 54 + .../39185-python_3.13_find_replacements.patch | 22 + .../39187-python_3.13_tests_output.patch | 142 + .../39201-python_3.13_fix_spyx_tmp.patch | 36 + srcpkgs/sagemath/patches/get_patches | 21 +- srcpkgs/sagemath/patches/numpy_2.1a.patch | 28 - srcpkgs/sagemath/patches/numpy_2.1b.patch | 229 -- srcpkgs/sagemath/patches/zz-32bit-test.patch | 30 + .../patches/zz-fix-doctest-order.patch | 17 + srcpkgs/sagemath/template | 16 +- 21 files changed, 2912 insertions(+), 1177 deletions(-) delete mode 100644 srcpkgs/sagemath/patches/36641-sympy_1.13.patch delete mode 100644 srcpkgs/sagemath/patches/37884-gap_4.13.1.patch delete mode 100644 srcpkgs/sagemath/patches/38250-numpy_2.0.patch delete mode 100644 srcpkgs/sagemath/patches/38344-ecm_7.0.6.patch create mode 100644 srcpkgs/sagemath/patches/38749-pari_2.17.patch create mode 100644 srcpkgs/sagemath/patches/38940-fix_flaky_simplicial_set_test.patch create mode 100644 srcpkgs/sagemath/patches/38962-eclib_20241112.patch create mode 100644 srcpkgs/sagemath/patches/39145-python_3.13_re.sub.patch create mode 100644 srcpkgs/sagemath/patches/39147-python_3.13_doctest.patch create mode 100644 srcpkgs/sagemath/patches/39178-giac_1.9.0.998.patch create mode 100644 srcpkgs/sagemath/patches/39182-python_3.13_iter.patch create mode 100644 srcpkgs/sagemath/patches/39184-python_3.13_produce_latex_macro.patch create mode 100644 srcpkgs/sagemath/patches/39185-python_3.13_find_replacements.patch create mode 100644 srcpkgs/sagemath/patches/39187-python_3.13_tests_output.patch create mode 100644 srcpkgs/sagemath/patches/39201-python_3.13_fix_spyx_tmp.patch delete mode 100644 srcpkgs/sagemath/patches/numpy_2.1a.patch delete mode 100644 srcpkgs/sagemath/patches/numpy_2.1b.patch create mode 100644 srcpkgs/sagemath/patches/zz-32bit-test.patch create mode 100644 srcpkgs/sagemath/patches/zz-fix-doctest-order.patch diff --git a/srcpkgs/sagemath/patches/36641-sympy_1.13.patch b/srcpkgs/sagemath/patches/36641-sympy_1.13.patch deleted file mode 100644 index 625c582cdd4..00000000000 --- a/srcpkgs/sagemath/patches/36641-sympy_1.13.patch +++ /dev/null @@ -1,76 +0,0 @@ -diff --git a/build/pkgs/sympy/requirements.txt b/build/pkgs/sympy/requirements.txt -new file mode 100644 -index 00000000000..3ef8f90b550 -diff --git a/src/sage/doctest/forker.py b/src/sage/doctest/forker.py -index 7e9eab2ff2e..43365cd645e 100644 ---- a/src/sage/doctest/forker.py -+++ b/src/sage/doctest/forker.py -@@ -150,14 +150,15 @@ def init_sage(controller=None): - sage: from sympy.printing.pretty.pretty import PrettyPrinter - sage: s = sympify('+x^'.join(str(i) for i in range(30))) - sage: print(PrettyPrinter(settings={'wrap_line': True}).doprint(s)) -- 29 28 27 26 25 24 23 22 21 20 19 18 17 -- x + x + x + x + x + x + x + x + x + x + x + x + x + -+ 29 28 27 26 25 24 23 22 21 20 19 18 17 ↪ -+ x + x + x + x + x + x + x + x + x + x + x + x + x + ↪ - -- 16 15 14 13 12 11 10 9 8 7 6 5 4 3 -- x + x + x + x + x + x + x + x + x + x + x + x + x + x + x -+ ↪ 16 15 14 13 12 11 10 9 8 7 6 5 4 3 ↪ -+ ↪ x + x + x + x + x + x + x + x + x + x + x + x + x + x + ↪ - -- 2 -- + x -+ ↪ 2 -+ ↪ x + x -+ - - The displayhook sorts dictionary keys to simplify doctesting of - dictionary output:: -diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py -index 010c61febe0..bbccbd20032 100644 ---- a/src/sage/functions/hypergeometric.py -+++ b/src/sage/functions/hypergeometric.py -@@ -124,7 +124,7 @@ - sage: maxima(hypergeometric([1, 1, 1], [3, 3, 3], x)) # needs sage.symbolic - hypergeometric([1,1,1],[3,3,3],_SAGE_VAR_x) - sage: hypergeometric((5, 4), (4, 4), 3)._sympy_() # needs sympy sage.symbolic -- hyper((5, 4), (4, 4), 3) -+ hyper((5,), (4,), 3) - sage: hypergeometric((5, 4), (4, 4), 3)._mathematica_init_() # needs sage.symbolic - 'HypergeometricPFQ[{5,4},{4,4},3]' - -diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx -index a92fe241355..f62311423be 100644 ---- a/src/sage/symbolic/expression.pyx -+++ b/src/sage/symbolic/expression.pyx -@@ -1167,7 +1167,7 @@ cdef class Expression(Expression_abc): - sage: unicode_art(SR(13 - I)) - 13 - ⅈ - sage: unicode_art(SR(1.3 - I)) -- 1.3 - ⅈ -+ 1.3 - 1.0⋅ⅈ - sage: unicode_art(cos(I)) - cosh(1) - -diff --git a/src/sage/typeset/ascii_art.py b/src/sage/typeset/ascii_art.py -index 28024405d27..458fa8724a3 100644 ---- a/src/sage/typeset/ascii_art.py -+++ b/src/sage/typeset/ascii_art.py -@@ -44,11 +44,12 @@ - sage: shell.run_cell('%display ascii_art') - sage: shell.run_cell("i = var('i')") # needs sage.symbolic - sage: shell.run_cell('sum(factorial(i)*x^i, i, 0, 10)') # needs sage.symbolic -- 10 9 8 7 6 5 4 3 -- 3628800*x + 362880*x + 40320*x + 5040*x + 720*x + 120*x + 24*x + 6*x -+ 10 9 8 7 6 5 4 3 > -+ 3628800*x + 362880*x + 40320*x + 5040*x + 720*x + 120*x + 24*x + 6*x > - -- 2 -- + 2*x + x + 1 -+ > 2 -+ > + 2*x + x + 1 -+ - sage: shell.run_cell('3/(7*x)') # needs sage.symbolic - 3 - --- diff --git a/srcpkgs/sagemath/patches/37884-gap_4.13.1.patch b/srcpkgs/sagemath/patches/37884-gap_4.13.1.patch deleted file mode 100644 index 1550d47e243..00000000000 --- a/srcpkgs/sagemath/patches/37884-gap_4.13.1.patch +++ /dev/null @@ -1,203 +0,0 @@ -diff --git a/src/sage/algebras/fusion_rings/fusion_double.py b/src/sage/algebras/fusion_rings/fusion_double.py -index 7ce086f70d0..954513572c3 100644 ---- a/src/sage/algebras/fusion_rings/fusion_double.py -+++ b/src/sage/algebras/fusion_rings/fusion_double.py -@@ -133,7 +133,7 @@ class FusionDouble(CombinatorialFreeModule): - sage: G = SmallPermutationGroup(16,9) - sage: F = FusionDouble(G, prefix="b",inject_variables=True) - sage: b13^2 # long time (4s) -- b0 + b2 + b4 + b15 + b16 + b17 + b18 + b24 + b26 + b27 -+ b0 + b3 + b4 - - """ - @staticmethod -diff --git a/src/sage/categories/simplicial_sets.py b/src/sage/categories/simplicial_sets.py -index e714a4571c4..a2b87a729d1 100644 ---- a/src/sage/categories/simplicial_sets.py -+++ b/src/sage/categories/simplicial_sets.py -@@ -593,9 +593,9 @@ def _canonical_twisting_operator(self): - sage: X = simplicial_sets.Torus() - sage: d = X._canonical_twisting_operator() - sage: d -- {(s_0 v_0, sigma_1): f3, (sigma_1, s_0 v_0): f2*f3^-1, (sigma_1, sigma_1): f2} -+ {(s_0 v_0, sigma_1): f2, (sigma_1, s_0 v_0): f1*f2^-1, (sigma_1, sigma_1): f1} - sage: list(d.values())[0].parent() -- Multivariate Laurent Polynomial Ring in f2, f3 over Integer Ring -+ Multivariate Laurent Polynomial Ring in f1, f2 over Integer Ring - sage: Y = simplicial_sets.RealProjectiveSpace(2) - sage: d2 = Y._canonical_twisting_operator() - sage: d2 -@@ -677,10 +677,10 @@ def twisted_chain_complex(self, twisting_operator=None, dimensions=None, augment - sage: X = simplicial_sets.Torus() - sage: C = X.twisted_chain_complex() - sage: C.differential(1) -- [ f3 - 1 f2*f3^-1 - 1 f2 - 1] -+ [ f2 - 1 f1*f2^-1 - 1 f1 - 1] - sage: C.differential(2) -- [ 1 f2*f3^-1] -- [ f3 1] -+ [ 1 f1*f2^-1] -+ [ f2 1] - [ -1 -1] - sage: C.differential(3) - [] -@@ -848,29 +848,29 @@ def twisted_homology(self, n, reduced=False): - sage: # needs sage.graphs - sage: Y = simplicial_sets.Torus() - sage: Y.twisted_homology(1) -- Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring -+ Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f1, f1inv, f2, f2inv over Integer Ring - Generated by the rows of the matrix: - [ 1 0 0 0 0] - [ 0 1 0 0 0] - [ 0 0 1 0 0] - [ 0 0 0 1 0] - [ 0 0 0 0 1] -+ [f1*f1inv - 1 0 0 0 0] -+ [ 0 f1*f1inv - 1 0 0 0] -+ [ 0 0 f1*f1inv - 1 0 0] -+ [ 0 0 0 f1*f1inv - 1 0] -+ [ 0 0 0 0 f1*f1inv - 1] - [f2*f2inv - 1 0 0 0 0] - [ 0 f2*f2inv - 1 0 0 0] - [ 0 0 f2*f2inv - 1 0 0] - [ 0 0 0 f2*f2inv - 1 0] - [ 0 0 0 0 f2*f2inv - 1] -- [f3*f3inv - 1 0 0 0 0] -- [ 0 f3*f3inv - 1 0 0 0] -- [ 0 0 f3*f3inv - 1 0 0] -- [ 0 0 0 f3*f3inv - 1 0] -- [ 0 0 0 0 f3*f3inv - 1] - sage: Y.twisted_homology(2) -- Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring -+ Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f1, f1inv, f2, f2inv over Integer Ring - Generated by the rows of the matrix: - [] - sage: Y.twisted_homology(1, reduced=True) -- Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring -+ Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f1, f1inv, f2, f2inv over Integer Ring - Generated by the rows of the matrix: - [1 0 0 0 0] - [0 1 0 0 0] -diff --git a/src/sage/combinat/matrices/latin.py b/src/sage/combinat/matrices/latin.py -index 936edcc6ea4..c06a53d9afd 100644 ---- a/src/sage/combinat/matrices/latin.py -+++ b/src/sage/combinat/matrices/latin.py -@@ -2453,7 +2453,7 @@ def p3_group_bitrade_generators(p): - EXAMPLES:: - - sage: from sage.combinat.matrices.latin import * -- sage: p3_group_bitrade_generators(3) -+ sage: p3_group_bitrade_generators(3) # random output - ((2,6,7)(3,8,9), - (1,2,3)(4,7,8)(5,6,9), - (1,9,2)(3,7,4)(5,8,6), -diff --git a/src/sage/groups/cubic_braid.py b/src/sage/groups/cubic_braid.py -index 257b400f1c7..36423c756aa 100644 ---- a/src/sage/groups/cubic_braid.py -+++ b/src/sage/groups/cubic_braid.py -@@ -282,7 +282,7 @@ def _richcmp_(self, other, op): - EXAMPLES:: - - sage: CBG3 = CubicBraidGroup(3) -- sage: sorted(CBG3) # indirect doctest -+ sage: sorted(CBG3) # indirect doctest, random output - [(c0*c1^-1)^2, c0*c1^-1*c0, c0^-1*c1*c0^-1, c0^-1*c1^-1*c0, - c1*c0^-1*c1, c0^-1*c1^-1*c0^-1, c0^-1*c1^-1, c1^-1*c0*c1^-1, - c0*c1^-1*c0^-1, c0^-1*c1, c0^-1*c1*c0, c0*c1^-1, c1*c0^-1, -diff --git a/src/sage/groups/finitely_presented.py b/src/sage/groups/finitely_presented.py -index 4bb52ee4efb..85f572fac6c 100644 ---- a/src/sage/groups/finitely_presented.py -+++ b/src/sage/groups/finitely_presented.py -@@ -1344,8 +1344,8 @@ def abelianization_map(self): - sage: H = G.quotient([g1^2, g2*g1*g2^(-1)*g1^(-1), g1*g3^(-2), g0^4]) - sage: H.abelianization_map() - Group morphism: -- From: Finitely presented group < g0, g1, g2, g3 | g1^2, g2*g1*g2^-1*g1^-1, g1*g3^-2, g0^4 > -- To: Finitely presented group < f2, f3, f4 | f2^-1*f3^-1*f2*f3, f2^-1*f4^-1*f2*f4, f3^-1*f4^-1*f3*f4, f2^4, f3^4 > -+ From: Finitely presented group < g0, g1, g2, g3 | g1^2, g2*g1*g2^-1*g1^-1, g1*g3^-2, g0^4 > -+ To: Finitely presented group < f1, f2, f3 | f1^4, f2^-1*f1^-1*f2*f1, f2^4, f3^-1*f1^-1*f3*f1, f3^-1*f2^-1*f3*f2 > - sage: g = FreeGroup(0) / [] - sage: g.abelianization_map() - Group endomorphism of Finitely presented group < | > -@@ -1394,10 +1394,10 @@ def abelianization_to_algebra(self, ring=QQ): - Defining g0, g1, g2, g3 - sage: H = G.quotient([g1^2, g2*g1*g2^(-1)*g1^(-1), g1*g3^(-2), g0^4]) - sage: H.abelianization_to_algebra() -- (Finitely presented group < f2, f3, f4 | f2^-1*f3^-1*f2*f3, f2^-1*f4^-1*f2*f4, -- f3^-1*f4^-1*f3*f4, f2^4, f3^4 >, -- Multivariate Laurent Polynomial Ring in f2, f3, f4 over Rational Field, -- [f2^4 - 1, f3^4 - 1], [f2^-1*f3^-2, f3^-2, f4, f3]) -+ (Finitely presented group < f1, f2, f3 | f1^4, f2^-1*f1^-1*f2*f1, f2^4, f3^-1*f1^-1*f3*f1, f3^-1*f2^-1*f3*f2 >, -+ Multivariate Laurent Polynomial Ring in f1, f2, f3 over Rational Field, -+ [f1^4 - 1, f2^4 - 1], -+ [f1^3*f2^2, f2^2, f3, f2]) - sage: g=FreeGroup(0) / [] - sage: g.abelianization_to_algebra() - (Finitely presented group < | >, Rational Field, [], []) -@@ -1673,7 +1673,7 @@ def abelian_alexander_matrix(self, ring=QQ, simplified=True): - [] - sage: G = FreeGroup(3)/[(2, 1, 1), (1, 2, 2, 3, 3)] - sage: A, ideal = G.abelian_alexander_matrix(simplified=True); A -- [-f3^2 - f3^4 - f3^6 f3^3 + f3^6] -+ [-f1^2 - f1^4 - f1^6 f1^3 + f1^6] - sage: g = FreeGroup(1) / [] - sage: g.abelian_alexander_matrix() - ([], []) -@@ -1773,11 +1773,11 @@ def characteristic_varieties(self, ring=QQ, matrix_ideal=None, groebner=False): - 3: Ideal (1) of Multivariate Laurent Polynomial Ring in f1, f2 over Integer Ring} - sage: G = FreeGroup(2)/[(1,2,1,-2,-1,-2)] - sage: G.characteristic_varieties() -- {0: Ideal (0) of Univariate Laurent Polynomial Ring in f2 over Rational Field, -- 1: Ideal (-1 + 2*f2 - 2*f2^2 + f2^3) of Univariate Laurent Polynomial Ring in f2 over Rational Field, -- 2: Ideal (1) of Univariate Laurent Polynomial Ring in f2 over Rational Field} -+ {0: Ideal (0) of Univariate Laurent Polynomial Ring in f1 over Rational Field, -+ 1: Ideal (-1 + 2*f1 - 2*f1^2 + f1^3) of Univariate Laurent Polynomial Ring in f1 over Rational Field, -+ 2: Ideal (1) of Univariate Laurent Polynomial Ring in f1 over Rational Field} - sage: G.characteristic_varieties(groebner=True) -- {0: [0], 1: [-1 + f2, 1 - f2 + f2^2], 2: []} -+ {0: [0], 1: [-1 + f1, 1 - f1 + f1^2], 2: []} - sage: G = FreeGroup(2)/[3 * (1, ), 2 * (2, )] - sage: G.characteristic_varieties(groebner=True) - {0: [-1 + F1, 1 + F1, 1 - F1 + F1^2, 1 + F1 + F1^2], 1: [1 - F1 + F1^2], 2: []} -diff --git a/src/sage/groups/perm_gps/permgroup_named.py b/src/sage/groups/perm_gps/permgroup_named.py -index c1f2683907b..d219e104a2c 100644 ---- a/src/sage/groups/perm_gps/permgroup_named.py -+++ b/src/sage/groups/perm_gps/permgroup_named.py -@@ -3468,16 +3468,14 @@ class SmallPermutationGroup(PermutationGroup_generic): - sage: G = SmallPermutationGroup(12,4); G - Group of order 12 and GAP Id 4 as a permutation group - sage: G.gens() -- ((1,2)(3,5)(4,10)(6,8)(7,12)(9,11), -- (1,3)(2,5)(4,7)(6,9)(8,11)(10,12), -- (1,4,8)(2,6,10)(3,7,11)(5,9,12)) -+ ((4,5), (1,2), (3,4,5)) - sage: G.character_table() # needs sage.rings.number_field - [ 1 1 1 1 1 1] -- [ 1 -1 -1 1 1 -1] -+ [ 1 -1 1 -1 1 -1] - [ 1 -1 1 1 -1 1] -- [ 1 1 -1 1 -1 -1] -- [ 2 0 -2 -1 0 1] -- [ 2 0 2 -1 0 -1] -+ [ 1 1 1 -1 -1 -1] -+ [ 2 0 -1 -2 0 1] -+ [ 2 0 -1 2 0 -1] - sage: def numgps(n): return ZZ(libgap.NumberSmallGroups(n)) - sage: all(SmallPermutationGroup(n,k).id() == [n,k] - ....: for n in [1..64] for k in [1..numgps(n)]) -@@ -3486,11 +3484,11 @@ class SmallPermutationGroup(PermutationGroup_generic): - sage: H.is_abelian() - False - sage: [H.centralizer(g) for g in H.conjugacy_classes_representatives()] -- [Subgroup generated by [(1,2)(3,6)(4,5), (1,3,5)(2,4,6)] of -+ [Subgroup generated by [(1,3), (2,3)] of - (Group of order 6 and GAP Id 1 as a permutation group), -- Subgroup generated by [(1,2)(3,6)(4,5)] of -+ Subgroup generated by [(2,3)] of - (Group of order 6 and GAP Id 1 as a permutation group), -- Subgroup generated by [(1,3,5)(2,4,6), (1,5,3)(2,6,4)] of -+ Subgroup generated by [(1,2,3)] of - (Group of order 6 and GAP Id 1 as a permutation group)] - """ - diff --git a/srcpkgs/sagemath/patches/38250-numpy_2.0.patch b/srcpkgs/sagemath/patches/38250-numpy_2.0.patch deleted file mode 100644 index e28fd857afc..00000000000 --- a/srcpkgs/sagemath/patches/38250-numpy_2.0.patch +++ /dev/null @@ -1,587 +0,0 @@ -diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py -index 28f81d7b798..d184c52bf19 100644 ---- a/src/sage/arith/misc.py -+++ b/src/sage/arith/misc.py -@@ -2277,7 +2277,7 @@ def power_mod(a, n, m): - - sage: from numpy import int32 # needs numpy - sage: power_mod(int32(2), int32(390), int32(391)) # needs numpy -- 285 -+ ...285... - sage: from gmpy2 import mpz - sage: power_mod(mpz(2), mpz(390), mpz(391)) - mpz(285) -diff --git a/src/sage/calculus/interpolators.pyx b/src/sage/calculus/interpolators.pyx -index 221b52369e2..bb0be7bab0c 100644 ---- a/src/sage/calculus/interpolators.pyx -+++ b/src/sage/calculus/interpolators.pyx -@@ -27,6 +27,9 @@ Development supported by NSF award No. 0702939. - import numpy as np - cimport numpy as np - -+if int(np.version.short_version[0]) > 1: -+ np.set_printoptions(legacy="1.25") -+ - from math import pi - cdef double TWOPI = 2*pi - -diff --git a/src/sage/calculus/riemann.pyx b/src/sage/calculus/riemann.pyx -index 6ec80d89aa7..c09d93c4260 100644 ---- a/src/sage/calculus/riemann.pyx -+++ b/src/sage/calculus/riemann.pyx -@@ -44,6 +44,9 @@ from sage.calculus.integration import numerical_integral - import numpy as np - cimport numpy as np - -+if int(np.version.short_version[0]) > 1: -+ np.set_printoptions(legacy="1.25") -+ - from math import pi - from math import sin - from math import cos -diff --git a/src/sage/combinat/fully_packed_loop.py b/src/sage/combinat/fully_packed_loop.py -index b198fed0c0d..b3ebd206cd2 100644 ---- a/src/sage/combinat/fully_packed_loop.py -+++ b/src/sage/combinat/fully_packed_loop.py -@@ -66,6 +66,9 @@ def _make_color_list(n, colors=None, color_map=None, randomize=False): - r""" - TESTS:: - -+ sage: import numpy as np -+ sage: if int(np.version.short_version[0]) > 1: -+ ....: np.set_printoptions(legacy="1.25") - sage: from sage.combinat.fully_packed_loop import _make_color_list - sage: _make_color_list(5) - sage: _make_color_list(5, ['blue', 'red']) -diff --git a/src/sage/env.py b/src/sage/env.py -index 722649ab3da..abb9b19f9e3 100644 ---- a/src/sage/env.py -+++ b/src/sage/env.py -@@ -296,7 +296,7 @@ def sage_include_directories(use_sources=False): - sage: import sage.env - sage: sage.env.sage_include_directories() - ['...', -- '.../numpy/core/include', -+ '.../numpy/...core/include', - '.../include/python...'] - - To check that C/C++ files are correctly found, we verify that we can -diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py -index e100ba3ee23..2a03bb68f67 100644 ---- a/src/sage/functions/special.py -+++ b/src/sage/functions/special.py -@@ -217,6 +217,9 @@ class SphericalHarmonic(BuiltinFunction): - sage: spherical_harmonic(1, 1, pi/2, pi).n() # abs tol 1e-14 # needs sage.symbolic - 0.345494149471335 - sage: from scipy.special import sph_harm # NB: arguments x and y are swapped # needs scipy -+ sage: import numpy as np # needs scipy -+ sage: if int(np.version.short_version[0]) > 1: # needs scipy -+ ....: np.set_printoptions(legacy="1.25") # needs scipy - sage: sph_harm(1, 1, pi.n(), (pi/2).n()) # abs tol 1e-14 # needs scipy sage.symbolic - (0.3454941494713355-4.231083042742082e-17j) - -diff --git a/src/sage/graphs/generators/classical_geometries.py b/src/sage/graphs/generators/classical_geometries.py -index da04362eef3..957f88d2061 100644 ---- a/src/sage/graphs/generators/classical_geometries.py -+++ b/src/sage/graphs/generators/classical_geometries.py -@@ -1315,7 +1315,7 @@ def CossidentePenttilaGraph(q): - - from sage.libs.gap.libgap import libgap - adj_list = libgap.function_factory("""function(q) -- local z, e, so, G, nu, G1, G0, B, T, s, O1, O2, x; -+ local z, e, so, G, nu, G1, G0, B, T, s, O1, O2, x, sqo; - LoadPackage("grape"); - G0:=SO(3,q^2); - so:=GeneratorsOfGroup(G0); -diff --git a/src/sage/graphs/generic_graph.py b/src/sage/graphs/generic_graph.py -index 063931ae274..0bafbd00564 100644 ---- a/src/sage/graphs/generic_graph.py -+++ b/src/sage/graphs/generic_graph.py -@@ -18420,6 +18420,9 @@ def shortest_path_all_pairs(self, by_weight=False, algorithm=None, - M = self.adjacency_matrix(vertices=int_to_vertex) - - # We call the Floyd-Warshall method from SciPy -+ import numpy # to ensure numpy 2.0 compatibility -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") - from numpy import array as np_array - from scipy.sparse.csgraph import floyd_warshall - dd, pp = floyd_warshall(np_array(M), directed=self.is_directed(), -diff --git a/src/sage/graphs/graph_generators_pyx.pyx b/src/sage/graphs/graph_generators_pyx.pyx -index 033e8b22adc..04b20d3229b 100644 ---- a/src/sage/graphs/graph_generators_pyx.pyx -+++ b/src/sage/graphs/graph_generators_pyx.pyx -@@ -57,7 +57,7 @@ def RandomGNP(n, p, bint directed=False, bint loops=False, seed=None): - - sage: from numpy import mean # needs numpy - sage: abs(mean([RandomGNP(200, .2).density() for i in range(30)]) - .2) < .001 # needs numpy -- True -+ ...True... - sage: RandomGNP(150, .2, loops=True) - Traceback (most recent call last): - ... -diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx -index a810418389c..c38df5412f0 100644 ---- a/src/sage/matrix/matrix1.pyx -+++ b/src/sage/matrix/matrix1.pyx -@@ -705,12 +705,15 @@ cdef class Matrix(Matrix0): - Type ``numpy.typecodes`` for a list of the possible - typecodes:: - -- sage: import numpy # needs numpy -- sage: sorted(numpy.typecodes.items()) # needs numpy -+ sage: import numpy # needs numpy -+ sage: numpy.typecodes.items() # needs numpy # random - [('All', '?bhilqpBHILQPefdgFDGSUVOMm'), ('AllFloat', 'efdgFDG'), -- ('AllInteger', 'bBhHiIlLqQpP'), ('Character', 'c'), ('Complex', 'FDG'), -- ('Datetime', 'Mm'), ('Float', 'efdg'), ('Integer', 'bhilqp'), -- ('UnsignedInteger', 'BHILQP')] -+ ... -+ -+ For instance, you can see possibilities for real floating point numbers:: -+ -+ sage: numpy.typecodes['Float'] # needs numpy -+ 'efdg' - - Alternatively, numpy automatically calls this function (via - the magic :meth:`__array__` method) to convert Sage matrices -diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx -index d71d22ac1f7..b6f297a3510 100644 ---- a/src/sage/modules/free_module_element.pyx -+++ b/src/sage/modules/free_module_element.pyx -@@ -555,7 +555,11 @@ def vector(arg0, arg1=None, arg2=None, sparse=None, immutable=False): - R = None - - try: -+ import numpy - from numpy import ndarray -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") -+ - except ImportError: - pass - else: -@@ -1188,7 +1192,11 @@ cdef class FreeModuleElement(Vector): # abstract base class - over Rational Field to numpy array of type <... 'float'>: - setting an array element with a sequence. - """ -+ import numpy - from numpy import array -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") -+ - try: - return array(self, dtype=dtype) - except ValueError as e: -diff --git a/src/sage/numerical/optimize.py b/src/sage/numerical/optimize.py -index e3d94d1746e..7ae8ca4966f 100644 ---- a/src/sage/numerical/optimize.py -+++ b/src/sage/numerical/optimize.py -@@ -155,6 +155,10 @@ def find_root(f, a, b, xtol=10e-13, rtol=2.0**-50, maxiter=100, full_output=Fals - b = max(s_1, s_2) - - import scipy.optimize -+ import numpy -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") -+ - g = lambda x: float(f(x)) - brentqRes = scipy.optimize.brentq(g, a, b, - full_output=full_output, xtol=xtol, rtol=rtol, maxiter=maxiter) -@@ -288,6 +292,10 @@ def find_local_minimum(f, a, b, tol=1.48e-08, maxfun=500): - a = float(a) - b = float(b) - import scipy.optimize -+ import numpy -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") -+ - xmin, fval, iter, funcalls = scipy.optimize.fminbound(f, a, b, full_output=1, xtol=tol, maxfun=maxfun) - return fval, xmin - -@@ -376,6 +384,8 @@ def minimize(func, x0, gradient=None, hessian=None, algorithm="default", - sage: def rosen(x): # The Rosenbrock function - ....: return sum(100.0r*(x[1r:]-x[:-1r]**2.0r)**2.0r + (1r-x[:-1r])**2.0r) - sage: import numpy -+ sage: if int(numpy.version.short_version[0]) > 1: -+ ....: numpy.set_printoptions(legacy="1.25") - sage: from numpy import zeros - sage: def rosen_der(x): - ....: xm = x[1r:-1r] -@@ -393,6 +403,9 @@ def minimize(func, x0, gradient=None, hessian=None, algorithm="default", - from sage.structure.element import Expression - from sage.ext.fast_callable import fast_callable - import numpy -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") -+ - from scipy import optimize - if isinstance(func, Expression): - var_list = func.variables() -@@ -530,6 +543,8 @@ def minimize_constrained(func,cons,x0,gradient=None,algorithm='default', **args) - from sage.structure.element import Expression - from sage.ext.fast_callable import fast_callable - import numpy -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") - from scipy import optimize - function_type = type(lambda x,y: x+y) - -@@ -652,6 +667,8 @@ def find_fit(data, model, initial_guess=None, parameters=None, variables=None, s - ``lmdif`` and ``lmder`` algorithms. - """ - import numpy -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") - - if not isinstance(data, numpy.ndarray): - try: -diff --git a/src/sage/plot/arrow.py b/src/sage/plot/arrow.py -index ac1dc79d802..23e2517ca56 100644 ---- a/src/sage/plot/arrow.py -+++ b/src/sage/plot/arrow.py -@@ -53,6 +53,9 @@ def get_minmax_data(self): - - EXAMPLES:: - -+ sage: import numpy # to ensure numpy 2.0 compatibility -+ sage: if int(numpy.version.short_version[0]) > 1: -+ ....: numpy.set_printoptions(legacy="1.25") - sage: from sage.plot.arrow import CurveArrow - sage: b = CurveArrow(path=[[(0,0),(.5,.5),(1,0)],[(.5,1),(0,0)]], - ....: options={}) -diff --git a/src/sage/plot/complex_plot.pyx b/src/sage/plot/complex_plot.pyx -index f1f2671a803..4d71414e1c2 100644 ---- a/src/sage/plot/complex_plot.pyx -+++ b/src/sage/plot/complex_plot.pyx -@@ -1282,15 +1282,13 @@ def rgb_to_hls(rgb): - raise ValueError("Last dimension of input array must be 3; " - "shape {} was found.".format(rgb.shape)) - in_shape = rgb.shape -- rgb = np.array( -- rgb, copy=False, dtype=np.dtype(float), ndmin=2 -- ) -+ rgb = np.asarray(rgb, dtype=np.dtype(float)) - rgb_max = rgb.max(-1) - rgb_min = rgb.min(-1) - l = (rgb_max + rgb_min)/2.0 # lightness - - hls = np.zeros_like(rgb) -- delta = rgb.ptp(-1) -+ delta = np.ptp(rgb, -1) - s = np.zeros_like(delta) - - ipos = delta > 0 -diff --git a/src/sage/plot/graphics.py b/src/sage/plot/graphics.py -index a84d162cb56..94f5db09d83 100644 ---- a/src/sage/plot/graphics.py -+++ b/src/sage/plot/graphics.py -@@ -2754,7 +2754,7 @@ def matplotlib(self, filename=None, - sage: xmin, xmax = sub.get_xlim() - sage: ymin, ymax = sub.get_ylim() - sage: xmin > xmax, ymin > ymax -- (True, True) -+ (...True..., ...True...) - """ - if not isinstance(ticks, (list, tuple)): - ticks = (ticks, None) -diff --git a/src/sage/plot/histogram.py b/src/sage/plot/histogram.py -index fa86a44bd0a..a585cacf9cd 100644 ---- a/src/sage/plot/histogram.py -+++ b/src/sage/plot/histogram.py -@@ -92,6 +92,8 @@ def get_minmax_data(self): - {'xmax': 10.0, 'xmin': 3.0, 'ymax': 0.476190476190..., 'ymin': 0} - """ - import numpy -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") - - # Extract these options (if they are not None) and pass them to - # histogram() -diff --git a/src/sage/plot/multigraphics.py b/src/sage/plot/multigraphics.py -index b583be32317..6be448f1e04 100644 ---- a/src/sage/plot/multigraphics.py -+++ b/src/sage/plot/multigraphics.py -@@ -784,6 +784,9 @@ def _add_subplot(self, figure, index, **options): - True - sage: G.position(1) - (0.2, 0.3, 0.4, 0.1) -+ sage: import numpy # to ensure numpy 2.0 compatibility -+ sage: if int(numpy.version.short_version[0]) > 1: -+ ....: numpy.set_printoptions(legacy="1.25") - sage: ax1.get_position().bounds # tol 1.0e-13 - (0.2, 0.3, 0.4000000000000001, 0.10000000000000003) - -@@ -1295,6 +1298,9 @@ def position(self, index): - sage: g1 = plot(sin(x), (x, -pi, pi)) - sage: g2 = circle((0,1), 1.) - sage: G = graphics_array([g1, g2]) -+ sage: import numpy # to ensure numpy 2.0 compatibility -+ sage: if int(numpy.version.short_version[0]) > 1: -+ ....: numpy.set_printoptions(legacy="1.25") - sage: G.position(0) # tol 5.0e-3 - (0.025045451349937315, - 0.03415488992713045, -diff --git a/src/sage/plot/plot3d/implicit_surface.pyx b/src/sage/plot/plot3d/implicit_surface.pyx -index ce0da48a4e0..f4d5059b620 100644 ---- a/src/sage/plot/plot3d/implicit_surface.pyx -+++ b/src/sage/plot/plot3d/implicit_surface.pyx -@@ -468,6 +468,7 @@ cdef class MarchingCubesTriangles(MarchingCubes): - sage: cube_marcher.y_vertices.tolist() - [[[<1.0, 0.5, 0.0>, None]], [[None, None]]] - sage: cube_marcher.x_vertices.any() # This shouldn't affect the X vertices. -+ ... - """ - (self.y_vertices, self.y_vertices_swapped) = \ - (self.y_vertices_swapped, self.y_vertices) -@@ -574,6 +575,7 @@ cdef class MarchingCubesTriangles(MarchingCubes): - sage: cube_marcher.x_vertices.tolist() - [[None, None], [None, <1.5, 1.0, 1.0>]] - sage: cube_marcher.y_vertices.any() or cube_marcher.z_vertices.any() # This shouldn't affect the Y or Z vertices. -+ ... - """ - cdef bint has_prev = (_prev is not None) - cdef bint has_next = (_next is not None) -diff --git a/src/sage/plot/scatter_plot.py b/src/sage/plot/scatter_plot.py -index 4ad418f040b..781854d372c 100644 ---- a/src/sage/plot/scatter_plot.py -+++ b/src/sage/plot/scatter_plot.py -@@ -63,9 +63,9 @@ def get_minmax_data(self): - sage: s = scatter_plot([[0,1],[2,4],[3.2,6]]) - sage: d = s.get_minmax_data() - sage: d['xmin'] -- 0.0 -+ ...0.0... - sage: d['ymin'] -- 1.0 -+ ...1.0... - """ - return {'xmin': self.xdata.min(), - 'xmax': self.xdata.max(), -diff --git a/src/sage/plot/streamline_plot.py b/src/sage/plot/streamline_plot.py -index 663d3aee70b..d2cb11088c7 100644 ---- a/src/sage/plot/streamline_plot.py -+++ b/src/sage/plot/streamline_plot.py -@@ -71,6 +71,9 @@ def get_minmax_data(self): - EXAMPLES:: - - sage: x, y = var('x y') -+ sage: import numpy # to ensure numpy 2.0 compatibility -+ sage: if int(numpy.version.short_version[0]) > 1: -+ ....: numpy.set_printoptions(legacy="1.25") - sage: d = streamline_plot((.01*x, x+y), (x,10,20), (y,10,20))[0].get_minmax_data() - sage: d['xmin'] - 10.0 -diff --git a/src/sage/probability/probability_distribution.pyx b/src/sage/probability/probability_distribution.pyx -index e2c71af9c25..59ba4a95ab6 100644 ---- a/src/sage/probability/probability_distribution.pyx -+++ b/src/sage/probability/probability_distribution.pyx -@@ -140,6 +140,9 @@ cdef class ProbabilityDistribution: - 1.8, - 2.0] - """ -+ import numpy as np -+ if int(np.version.short_version[0]) > 1: -+ np.set_printoptions(legacy="1.25") - import pylab - ell = [float(self.get_random_element()) for _ in range(num_samples)] - S = pylab.hist(ell, bins, density=True) -diff --git a/src/sage/rings/complex_double.pyx b/src/sage/rings/complex_double.pyx -index c59a2b46d6f..b4dddebb4dc 100644 ---- a/src/sage/rings/complex_double.pyx -+++ b/src/sage/rings/complex_double.pyx -@@ -2558,10 +2558,10 @@ cdef class ComplexToCDF(Morphism): - - sage: # needs numpy - sage: import numpy -- sage: f = CDF.coerce_map_from(numpy.complex_) -- sage: f(numpy.complex_(I)) -+ sage: f = CDF.coerce_map_from(numpy.complex128) -+ sage: f(numpy.complex128(I)) - 1.0*I -- sage: f(numpy.complex_(I)).parent() -+ sage: f(numpy.complex128(I)).parent() - Complex Double Field - """ - def __init__(self, R): -@@ -2578,7 +2578,7 @@ cdef class ComplexToCDF(Morphism): - EXAMPLES:: - - sage: import numpy # needs numpy -- sage: CDF(numpy.complex_(I)) # indirect doctest # needs numpy -+ sage: CDF(numpy.complex128(I)) # indirect doctest # needs numpy - 1.0*I - """ - cdef ComplexDoubleElement z = ComplexDoubleElement.__new__(ComplexDoubleElement) -@@ -2592,7 +2592,7 @@ cdef class ComplexToCDF(Morphism): - EXAMPLES:: - - sage: import numpy # needs numpy -- sage: f = sage.rings.complex_double.ComplexToCDF(numpy.complex_) # needs numpy -+ sage: f = sage.rings.complex_double.ComplexToCDF(numpy.complex128) # needs numpy - sage: f._repr_type() # needs numpy - 'Native' - """ -diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx -index b4a1fa5039b..38c30f7627b 100644 ---- a/src/sage/rings/integer.pyx -+++ b/src/sage/rings/integer.pyx -@@ -593,6 +593,8 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): - Test comparisons with numpy types (see :issue:`13386` and :issue:`18076`):: - - sage: import numpy # needs numpy -+ sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -+ ....: numpy.set_printoptions(legacy="1.25") # needs numpy - sage: numpy.int8('12') == 12 # needs numpy - True - sage: 12 == numpy.int8('12') # needs numpy -diff --git a/src/sage/rings/polynomial/polynomial_element.pyx b/src/sage/rings/polynomial/polynomial_element.pyx -index dcf2af7cdf2..c87eccd44f1 100644 ---- a/src/sage/rings/polynomial/polynomial_element.pyx -+++ b/src/sage/rings/polynomial/polynomial_element.pyx -@@ -8851,7 +8851,7 @@ cdef class Polynomial(CommutativePolynomial): - 'you expect.') - - import numpy -- from numpy.linalg.linalg import LinAlgError -+ from numpy.linalg import LinAlgError - from sage.rings.complex_double import CDF - - numpy_dtype = ('complex' if input_complex else 'double') -diff --git a/src/sage/rings/real_mpfi.pyx b/src/sage/rings/real_mpfi.pyx -index 95b472e912c..76fbfedab95 100644 ---- a/src/sage/rings/real_mpfi.pyx -+++ b/src/sage/rings/real_mpfi.pyx -@@ -231,6 +231,8 @@ specified if given a non-interval and an interval:: - TESTS:: - - sage: import numpy # needs numpy -+ sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -+ ....: numpy.set_printoptions(legacy="1.25") # needs numpy - sage: RIF(2) == numpy.int8('2') # needs numpy - True - sage: numpy.int8('2') == RIF(2) # needs numpy -diff --git a/src/sage/schemes/elliptic_curves/period_lattice_region.pyx b/src/sage/schemes/elliptic_curves/period_lattice_region.pyx -index 8f240627e77..70ce616f92f 100644 ---- a/src/sage/schemes/elliptic_curves/period_lattice_region.pyx -+++ b/src/sage/schemes/elliptic_curves/period_lattice_region.pyx -@@ -77,6 +77,8 @@ cdef class PeriodicRegion: - EXAMPLES:: - - sage: import numpy as np -+ sage: if int(np.version.short_version[0]) > 1: -+ ....: np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((4, 4)) - sage: PeriodicRegion(CDF(2), CDF(2*I), data).is_empty() -@@ -295,6 +297,8 @@ cdef class PeriodicRegion: - EXAMPLES:: - - sage: import numpy as np -+ sage: if int(np.version.short_version[0]) > 1: -+ ....: np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((10, 10)) - sage: data[1:4,1:4] = True -@@ -317,6 +321,8 @@ cdef class PeriodicRegion: - EXAMPLES:: - - sage: import numpy as np -+ sage: if int(np.version.short_version[0]) > 1: -+ ....: np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((4, 4)) - sage: data[1,1] = True -@@ -370,6 +376,8 @@ cdef class PeriodicRegion: - EXAMPLES:: - - sage: import numpy as np -+ sage: if int(np.version.short_version[0]) > 1: -+ ....: np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - - sage: data = np.zeros((20, 20)) -@@ -520,6 +528,8 @@ cdef class PeriodicRegion: - TESTS:: - - sage: import numpy as np -+ sage: if int(np.version.short_version[0]) > 1: -+ ....: np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((4, 4)) - sage: data[1, 1] = True -diff --git a/src/sage/stats/basic_stats.py b/src/sage/stats/basic_stats.py -index b2e6b301bf7..6937f6cb410 100644 ---- a/src/sage/stats/basic_stats.py -+++ b/src/sage/stats/basic_stats.py -@@ -227,6 +227,8 @@ def std(v, bias=False): - - sage: # needs numpy - sage: import numpy -+ sage: if int(numpy.version.short_version[0]) > 1: -+ ....: numpy.set_printoptions(legacy="1.25") - sage: x = numpy.array([1,2,3,4,5]) - sage: std(x, bias=False) - 1.5811388300841898 -@@ -304,6 +306,8 @@ def variance(v, bias=False): - sage: variance([RIF(1.0103, 1.0103), RIF(2)]) - 0.4897530450000000? - sage: import numpy # needs numpy -+ sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -+ ....: numpy.set_printoptions(legacy="1.25") # needs numpy - sage: x = numpy.array([1,2,3,4,5]) # needs numpy - sage: variance(x, bias=False) # needs numpy - 2.5 -diff --git a/src/sage/stats/time_series.pyx b/src/sage/stats/time_series.pyx -index 2e22ec45c69..23adae84fb4 100644 ---- a/src/sage/stats/time_series.pyx -+++ b/src/sage/stats/time_series.pyx -@@ -1718,6 +1718,8 @@ cdef class TimeSeries: - if len(v0) == 1: - return v1[0]/v0[0] - import numpy -+ if int(numpy.version.short_version[0]) > 1: -+ numpy.set_printoptions(legacy="1.25") - coeffs = numpy.polyfit(v0,v1,1) - return coeffs[0] - -diff --git a/src/sage/structure/coerce.pyx b/src/sage/structure/coerce.pyx -index dfbd5ff82fa..955a256e9b4 100644 ---- a/src/sage/structure/coerce.pyx -+++ b/src/sage/structure/coerce.pyx -@@ -520,6 +520,8 @@ cdef class CoercionModel: - Check that :issue:`8426` is fixed (see also :issue:`18076`):: - - sage: import numpy # needs numpy -+ sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -+ ....: numpy.set_printoptions(legacy="1.25") # needs numpy - - sage: # needs sage.rings.real_mpfr - sage: x = polygen(RR) -diff --git a/src/sage/symbolic/function.pyx b/src/sage/symbolic/function.pyx -index 2cb2f09c715..cd89ad2a256 100644 ---- a/src/sage/symbolic/function.pyx -+++ b/src/sage/symbolic/function.pyx -@@ -964,6 +964,9 @@ cdef class BuiltinFunction(Function): - mpc(real='0.83373002513114902', imag='-0.98889770576286506') - - sage: import numpy # needs numpy -+ sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -+ ....: numpy.set_printoptions(legacy="1.25") # needs numpy -+ - sage: sin(numpy.int32(0)) # needs numpy - 0.0 - sage: type(_) # needs numpy -diff --git a/src/sage/symbolic/ring.pyx b/src/sage/symbolic/ring.pyx -index 501b0920898..5b007d9e5fd 100644 ---- a/src/sage/symbolic/ring.pyx -+++ b/src/sage/symbolic/ring.pyx -@@ -1162,6 +1162,8 @@ cdef class NumpyToSRMorphism(Morphism): - We check that :issue:`8949` and :issue:`9769` are fixed (see also :issue:`18076`):: - - sage: import numpy # needs numpy -+ sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -+ ....: numpy.set_printoptions(legacy="1.25") # needs numpy - sage: f(x) = x^2 - sage: f(numpy.int8('2')) # needs numpy - 4 diff --git a/srcpkgs/sagemath/patches/38344-ecm_7.0.6.patch b/srcpkgs/sagemath/patches/38344-ecm_7.0.6.patch deleted file mode 100644 index db0ae903062..00000000000 --- a/srcpkgs/sagemath/patches/38344-ecm_7.0.6.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff --git a/src/sage/interfaces/ecm.py b/src/sage/interfaces/ecm.py -index 99287dec718..98011970404 100644 ---- a/src/sage/interfaces/ecm.py -+++ b/src/sage/interfaces/ecm.py -@@ -508,7 +508,6 @@ def _find_factor(self, n, factor_digits, B1, **kwds): - """ - n = self._validate(n) - kwds.setdefault('c', 1000000000) -- kwds.setdefault('I', 1) - if factor_digits is not None: - B1 = self.recommended_B1(factor_digits) - kwds['one'] = True -diff --git a/src/sage/libs/libecm.pyx b/src/sage/libs/libecm.pyx -index 886a9b816e4..83fb7adaf8d 100644 ---- a/src/sage/libs/libecm.pyx -+++ b/src/sage/libs/libecm.pyx -@@ -149,11 +149,13 @@ def ecmfactor(number, double B1, verbose=False, sigma=0): - Some special cases:: - - sage: ecmfactor(1, 100) -- (True, 1, ...) -+ Traceback (most recent call last): -+ ... -+ ValueError: Input number (1) must be greater than 1 - sage: ecmfactor(0, 100) - Traceback (most recent call last): - ... -- ValueError: Input number (0) must be positive -+ ValueError: Input number (0) must be greater than 1 - """ - cdef mpz_t n, f - cdef int res -@@ -164,8 +166,8 @@ def ecmfactor(number, double B1, verbose=False, sigma=0): - sage_int_number = Integer(number) - sage_int_sigma = Integer(sigma) - -- if number <= 0: -- raise ValueError("Input number (%s) must be positive"%number) -+ if number <= 1: -+ raise ValueError("Input number (%s) must be greater than 1"%number) - - if verbose: - print("Performing one curve with B1=%1.0f" % B1) diff --git a/srcpkgs/sagemath/patches/38749-pari_2.17.patch b/srcpkgs/sagemath/patches/38749-pari_2.17.patch new file mode 100644 index 00000000000..9229b8f9a60 --- /dev/null +++ b/srcpkgs/sagemath/patches/38749-pari_2.17.patch @@ -0,0 +1,2297 @@ +diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py +index 637ed9192bd..12f1760b67f 100644 +--- a/src/sage/arith/misc.py ++++ b/src/sage/arith/misc.py +@@ -2691,9 +2691,10 @@ 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) * (-i - 2)^3 * (i + 1)^3 * (-2*i + 3) * (i + 4) ++ sage: # needs sage.rings.number_field ++ sage: K. = QuadraticField(-1) ++ 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:: + +@@ -2776,7 +2777,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 +3032,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/calculus/calculus.py b/src/sage/calculus/calculus.py +index 64881aba812..cae93ef8bcd 100644 +--- a/src/sage/calculus/calculus.py ++++ b/src/sage/calculus/calculus.py +@@ -794,8 +794,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/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/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/dynamics/arithmetic_dynamics/berkovich_ds.py b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py +index 9734b3767ac..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 (2*a + 1) ++ Fractional ideal (-2*a - 1) + sage: g = f.conjugate(conj, new_ideal=ideal) + sage: g.domain().ideal() +- Fractional ideal (2*a + 1) ++ 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/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/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 bd1095e8c70..2656b56e7f6 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 488a1fb1af5..fb8eebd8118 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 58a376b9c72..b2cbbb152bc 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 b5bc281db4d..2c4f8fa4b24 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 + """ + + +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 +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) +diff --git a/src/sage/libs/pari/tests.py b/src/sage/libs/pari/tests.py +index 1ed571cd4b9..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 + +@@ -1502,7 +1500,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 +1747,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() +@@ -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/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..5c6f41b63c5 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/number_field/S_unit_solver.py b/src/sage/rings/number_field/S_unit_solver.py +index 0ffac369720..836edae5464 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 +@@ -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 + +@@ -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)], ++ 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, 4, 4), (1, 2, 2)], ++ ....: (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, 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)], +- ....: (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, 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)]}} ++ ....: (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 +@@ -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/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/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..8a3a3300534 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 + +@@ -3670,35 +3670,37 @@ def ideals_of_bdd_norm(self, bound): + ....: 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 ++ 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], []] + """ + hnf_ideals = self.pari_nf().ideallist(bound) + d = {} +@@ -3926,8 +3928,10 @@ def primes_of_bounded_norm(self, B): + + 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)] ++ [Fractional ideal (i - 1), ++ Fractional ideal (2*i - 1), ++ Fractional ideal (-2*i - 1), ++ Fractional ideal (3)] + sage: K.primes_of_bounded_norm(1) + [] + sage: x = polygen(QQ, 'x') +@@ -3936,10 +3940,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] +@@ -3989,10 +3993,10 @@ def primes_of_bounded_norm_iter(self, B): + sage: K. = QuadraticField(-1) + sage: it = K.primes_of_bounded_norm_iter(10) + sage: list(it) +- [Fractional ideal (i + 1), ++ [Fractional ideal (i - 1), + Fractional ideal (3), +- Fractional ideal (-i - 2), +- Fractional ideal (2*i + 1)] ++ Fractional ideal (2*i - 1), ++ Fractional ideal (-2*i - 1)] + sage: list(K.primes_of_bounded_norm_iter(1)) + [] + """ +@@ -4317,7 +4321,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) +@@ -4444,10 +4448,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): +@@ -4807,7 +4815,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 +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))] +@@ -4996,7 +5004,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) +@@ -5160,9 +5168,7 @@ def selmer_space(self, S, p, proof=None): + + 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) +@@ -5640,7 +5646,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 +5766,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: + +@@ -5872,10 +5878,9 @@ def factor(self, n): + sage: K.factor(1/3) + (Fractional ideal (3))^-1 + sage: K.factor(1+a) +- Fractional ideal (a + 1) ++ 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)) ++ (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:: + +@@ -5908,9 +5913,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() +@@ -6524,13 +6529,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)] + +@@ -7107,14 +7114,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 +7130,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 +7212,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 +7268,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 +7280,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:: +@@ -7427,7 +7434,7 @@ 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 ++ 6 + """ + from .S_unit_solver import solve_S_unit_equation + return solve_S_unit_equation(self, S, prec, include_exponents, include_bound, proof) +@@ -8782,7 +8789,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 +8797,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 +12736,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 +12753,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..a22b68e6093 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 - 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): + ... +@@ -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 +@@ -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..129d0288024 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 + +@@ -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 + """ +@@ -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 +@@ -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]) +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..d1c055bf549 100644 +--- a/src/sage/rings/number_field/order.py ++++ b/src/sage/rings/number_field/order.py +@@ -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) ++ (-2*I - 1) * (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) * (-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 283db17c84e..a940c95731d 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] +@@ -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 7275a122c06..67caf77dc11 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:: + +@@ -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/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..d1def05ac18 100644 +--- a/src/sage/rings/rational.pyx ++++ b/src/sage/rings/rational.pyx +@@ -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/berkovich/berkovich_space.py b/src/sage/schemes/berkovich/berkovich_space.py +index f5455937b43..1330c408f4a 100644 +--- 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/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..62bbd71e809 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,10 +1485,10 @@ 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) ++ Fractional ideal (6*a) + + A not so well known curve with everywhere good reduction:: + +@@ -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..5b4cdab67e9 100644 +--- a/src/sage/schemes/elliptic_curves/ell_point.py ++++ b/src/sage/schemes/elliptic_curves/ell_point.py +@@ -3054,9 +3054,9 @@ def has_good_reduction(self, P=None): + 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), ++ [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..2b084b57dc6 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 (2*i - 1)) + 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 + +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 da4d5db908f..3c2f93e3355 100644 +--- a/src/sage/symbolic/expression.pyx ++++ b/src/sage/symbolic/expression.pyx +@@ -9799,8 +9799,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:: + diff --git a/srcpkgs/sagemath/patches/38940-fix_flaky_simplicial_set_test.patch b/srcpkgs/sagemath/patches/38940-fix_flaky_simplicial_set_test.patch new file mode 100644 index 00000000000..1ad003d5d48 --- /dev/null +++ b/srcpkgs/sagemath/patches/38940-fix_flaky_simplicial_set_test.patch @@ -0,0 +1,73 @@ +diff --git a/src/sage/categories/simplicial_sets.py b/src/sage/categories/simplicial_sets.py +index 76030be831b..f30ed0ffeb2 100644 +--- a/src/sage/categories/simplicial_sets.py ++++ b/src/sage/categories/simplicial_sets.py +@@ -444,29 +444,31 @@ def covering_map(self, character): + + sage: # needs sage.graphs sage.groups + sage: S1 = simplicial_sets.Sphere(1) +- sage: W = S1.wedge(S1) ++ sage: S1_ = simplicial_sets.Sphere(1) ++ sage: S1_.n_cells(1)[0].rename("sigma_1'") ++ sage: W = S1.wedge(S1_) + sage: G = CyclicPermutationGroup(3) + sage: a, b = W.n_cells(1) + sage: C = W.covering_map({a : G.gen(0), b : G.one()}); C + Simplicial set morphism: + From: Simplicial set with 9 non-degenerate simplices + To: Wedge: (S^1 v S^1) +- Defn: [(*, ()), (*, (1,2,3)), (*, (1,3,2)), (sigma_1, ()), +- (sigma_1, ()), (sigma_1, (1,2,3)), (sigma_1, (1,2,3)), +- (sigma_1, (1,3,2)), (sigma_1, (1,3,2))] +- --> [*, *, *, sigma_1, sigma_1, sigma_1, sigma_1, sigma_1, sigma_1] ++ Defn: [(*, ()), (*, (1,2,3)), (*, (1,3,2)), (sigma_1', ()), ++ (sigma_1', (1,2,3)), (sigma_1', (1,3,2)), (sigma_1, ()), ++ (sigma_1, (1,2,3)), (sigma_1, (1,3,2))] ++ --> [*, *, *, sigma_1', sigma_1', sigma_1', sigma_1, sigma_1, sigma_1] + sage: C.domain() + Simplicial set with 9 non-degenerate simplices + sage: C.domain().face_data() + {(*, ()): None, + (*, (1,2,3)): None, + (*, (1,3,2)): None, ++ (sigma_1', ()): ((*, ()), (*, ())), ++ (sigma_1', (1,2,3)): ((*, (1,2,3)), (*, (1,2,3))), ++ (sigma_1', (1,3,2)): ((*, (1,3,2)), (*, (1,3,2))), + (sigma_1, ()): ((*, (1,2,3)), (*, ())), +- (sigma_1, ()): ((*, ()), (*, ())), + (sigma_1, (1,2,3)): ((*, (1,3,2)), (*, (1,2,3))), +- (sigma_1, (1,2,3)): ((*, (1,2,3)), (*, (1,2,3))), +- (sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2))), +- (sigma_1, (1,3,2)): ((*, (1,3,2)), (*, (1,3,2)))} ++ (sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2)))} + """ + from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet + from sage.topology.simplicial_set_morphism import SimplicialSetMorphism +@@ -530,7 +532,9 @@ def cover(self, character): + + sage: # needs sage.graphs sage.groups + sage: S1 = simplicial_sets.Sphere(1) +- sage: W = S1.wedge(S1) ++ sage: S1_ = simplicial_sets.Sphere(1) ++ sage: S1_.n_cells(1)[0].rename("sigma_1'") ++ sage: W = S1.wedge(S1_) + sage: G = CyclicPermutationGroup(3) + sage: (a, b) = W.n_cells(1) + sage: C = W.cover({a : G.gen(0), b : G.gen(0)^2}) +@@ -538,12 +542,12 @@ def cover(self, character): + {(*, ()): None, + (*, (1,2,3)): None, + (*, (1,3,2)): None, ++ (sigma_1', ()): ((*, (1,3,2)), (*, ())), ++ (sigma_1', (1,2,3)): ((*, ()), (*, (1,2,3))), ++ (sigma_1', (1,3,2)): ((*, (1,2,3)), (*, (1,3,2))), + (sigma_1, ()): ((*, (1,2,3)), (*, ())), +- (sigma_1, ()): ((*, (1,3,2)), (*, ())), + (sigma_1, (1,2,3)): ((*, (1,3,2)), (*, (1,2,3))), +- (sigma_1, (1,2,3)): ((*, ()), (*, (1,2,3))), +- (sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2))), +- (sigma_1, (1,3,2)): ((*, (1,2,3)), (*, (1,3,2)))} ++ (sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2)))} + sage: C.homology(1) # needs sage.modules + Z x Z x Z x Z + sage: C.fundamental_group() diff --git a/srcpkgs/sagemath/patches/38962-eclib_20241112.patch b/srcpkgs/sagemath/patches/38962-eclib_20241112.patch new file mode 100644 index 00000000000..a6eb5ed1d47 --- /dev/null +++ b/srcpkgs/sagemath/patches/38962-eclib_20241112.patch @@ -0,0 +1,70 @@ +diff --git a/src/sage/libs/eclib/__init__.pxd b/src/sage/libs/eclib/__init__.pxd +index d44d4fba865..2673af0613f 100644 +--- a/src/sage/libs/eclib/__init__.pxd ++++ b/src/sage/libs/eclib/__init__.pxd +@@ -55,7 +55,6 @@ cdef extern from "eclib/matrix.h": + cdef cppclass mat: + mat() + mat(mat m) +- scalar* get_entries() + scalar sub(long, long) + long nrows() + long ncols() +@@ -67,7 +66,6 @@ cdef extern from "eclib/smatrix.h": + cdef cppclass smat: + smat() + smat(smat m) +- scalar* get_entries() + scalar sub(long, long) + long nrows() + long ncols() +diff --git a/src/sage/libs/eclib/mat.pyx b/src/sage/libs/eclib/mat.pyx +index bfdeb6ae5c1..989d9d1a70c 100644 +--- a/src/sage/libs/eclib/mat.pyx ++++ b/src/sage/libs/eclib/mat.pyx +@@ -11,7 +11,6 @@ from sage.matrix.matrix_integer_sparse cimport Matrix_integer_sparse + from sage.matrix.matrix_integer_dense cimport Matrix_integer_dense + from sage.rings.integer cimport Integer + +- + cdef class Matrix: + """ + A Cremona Matrix. +@@ -212,8 +211,7 @@ cdef class Matrix: + + """ + cdef long n = self.nrows() +- cdef long i, j, k +- cdef scalar* v = self.M.get_entries() # coercion needed to deal with const ++ cdef long i, j + + cdef Matrix_integer_dense Td + cdef Matrix_integer_sparse Ts +@@ -221,21 +219,19 @@ cdef class Matrix: + # Ugly code... + if sparse: + Ts = MatrixSpace(ZZ, n, sparse=sparse).zero_matrix().__copy__() +- k = 0 + for i from 0 <= i < n: + for j from 0 <= j < n: +- if v[k]: +- Ts.set_unsafe(i, j, Integer(v[k])) +- k += 1 ++ Mij = Integer(self.M.sub(i+1,j+1)) ++ if Mij: ++ Ts.set_unsafe(i, j, Mij) + return Ts + else: + Td = MatrixSpace(ZZ, n, sparse=sparse).zero_matrix().__copy__() +- k = 0 + for i from 0 <= i < n: + for j from 0 <= j < n: +- if v[k]: +- Td.set_unsafe(i, j, Integer(v[k])) +- k += 1 ++ Mij = Integer(self.M.sub(i+1,j+1)) ++ if Mij: ++ Td.set_unsafe(i, j, Mij) + return Td + + diff --git a/srcpkgs/sagemath/patches/39145-python_3.13_re.sub.patch b/srcpkgs/sagemath/patches/39145-python_3.13_re.sub.patch new file mode 100644 index 00000000000..283ef66751f --- /dev/null +++ b/srcpkgs/sagemath/patches/39145-python_3.13_re.sub.patch @@ -0,0 +1,39 @@ +diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py +index d02ae43149f..447b548c1b8 100644 +--- a/src/sage/interfaces/singular.py ++++ b/src/sage/interfaces/singular.py +@@ -1401,7 +1401,7 @@ def _repr_(self): + # this is our cue that singular uses `rp` instead of `ip` + if singular_name_mapping['invlex'] == 'rp' and 'doctest' in str(get_display_manager()): + s = re.sub('^(// .*block.* : ordering )rp$', '\\1ip', +- s, 0, re.MULTILINE) ++ s, flags=re.MULTILINE) + return s + + def __copy__(self): +diff --git a/src/sage/misc/cython.py b/src/sage/misc/cython.py +index c542e0d1919..241078d5f2c 100644 +--- a/src/sage/misc/cython.py ++++ b/src/sage/misc/cython.py +@@ -380,7 +380,7 @@ def cython(filename, verbose=0, compile_message=False, + cython_messages = re.sub( + "^.*The keyword 'nogil' should appear at the end of the function signature line. " + "Placing it before 'except' or 'noexcept' will be disallowed in a future version of Cython.\n", +- "", cython_messages, 0, re.MULTILINE) ++ "", cython_messages, flags=re.MULTILINE) + + sys.stderr.write(cython_messages) + sys.stderr.flush() +diff --git a/src/sage/rings/ring_extension_morphism.pyx b/src/sage/rings/ring_extension_morphism.pyx +index d4aad7f8253..7294e90c319 100644 +--- a/src/sage/rings/ring_extension_morphism.pyx ++++ b/src/sage/rings/ring_extension_morphism.pyx +@@ -461,7 +461,7 @@ cdef class RingExtensionHomomorphism(RingMap): + if self.base_map() is not None: + s += "with map on base ring" + ss = self.base_map()._repr_defn() +- ss = re.sub('\nwith map on base ring:?$', '', ss, 0, re.MULTILINE) ++ ss = re.sub('\nwith map on base ring:?$', '', ss, flags=re.MULTILINE) + if ss != "": s += ":\n" + ss + if s != "" and s[-1] == "\n": + s = s[:-1] diff --git a/srcpkgs/sagemath/patches/39147-python_3.13_doctest.patch b/srcpkgs/sagemath/patches/39147-python_3.13_doctest.patch new file mode 100644 index 00000000000..fcd7f537dd6 --- /dev/null +++ b/srcpkgs/sagemath/patches/39147-python_3.13_doctest.patch @@ -0,0 +1,58 @@ +diff --git a/src/sage/doctest/forker.py b/src/sage/doctest/forker.py +index bf6d49906de..6c36ab47baf 100644 +--- a/src/sage/doctest/forker.py ++++ b/src/sage/doctest/forker.py +@@ -553,6 +553,8 @@ def __init__(self, *args, **kwds): + self.total_walltime_skips = 0 + self.total_performed_tests = 0 + self.total_walltime = 0 ++ if sys.version_info < (3,13): ++ self._stats = self._name2ft + + def _run(self, test, compileflags, out): + """ +@@ -830,7 +832,10 @@ def compiler(example): + self.optionflags = original_optionflags + + # Record and return the number of failures and tries. +- self._DocTestRunner__record_outcome(test, failures, tries) ++ if sys.version_info < (3,13): ++ self._DocTestRunner__record_outcome(test, failures, tries) ++ else: ++ self._DocTestRunner__record_outcome(test, failures, tries, walltime_skips) + self.total_walltime_skips += walltime_skips + self.total_performed_tests += tries + return TestResults(failures, tries) +@@ -931,7 +936,7 @@ def summarize(self, verbose=None): + sage: from sage.doctest.control import DocTestDefaults; DD = DocTestDefaults() + sage: import doctest, sys, os + sage: DTR = SageDocTestRunner(SageOutputChecker(), verbose=False, sage_options=DD, optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS) +- sage: DTR._name2ft['sage.doctest.forker'] = (1,120) ++ sage: DTR._stats['sage.doctest.forker'] = (1,120) + sage: results = DTR.summarize() + ********************************************************************** + 1 item had failures: +@@ -946,8 +951,8 @@ def summarize(self, verbose=None): + passed = [] + failed = [] + totalt = totalf = 0 +- for x in self._name2ft.items(): +- name, (f, t) = x ++ for x in self._stats.items(): ++ name, (f, t, *_) = x + assert f <= t + totalt += t + totalf += f +@@ -972,10 +977,10 @@ def summarize(self, verbose=None): + print(self.DIVIDER, file=m) + print(count_noun(len(failed), "item"), "had failures:", file=m) + failed.sort() +- for thing, (f, t) in failed: ++ for thing, (f, t, *_) in failed: + print(" %3d of %3d in %s" % (f, t, thing), file=m) + if verbose: +- print(count_noun(totalt, "test") + " in " + count_noun(len(self._name2ft), "item") + ".", file=m) ++ print(count_noun(totalt, "test") + " in " + count_noun(len(self._stats), "item") + ".", file=m) + print("%s passed and %s failed." % (totalt - totalf, totalf), file=m) + if totalf: + print("***Test Failed***", file=m) diff --git a/srcpkgs/sagemath/patches/39178-giac_1.9.0.998.patch b/srcpkgs/sagemath/patches/39178-giac_1.9.0.998.patch new file mode 100644 index 00000000000..194afc279ab --- /dev/null +++ b/srcpkgs/sagemath/patches/39178-giac_1.9.0.998.patch @@ -0,0 +1,20 @@ +diff --git a/src/sage/libs/giac/giac.pyx b/src/sage/libs/giac/giac.pyx +index 65279b16504..7c32771bee8 100644 +--- a/src/sage/libs/giac/giac.pyx ++++ b/src/sage/libs/giac/giac.pyx +@@ -382,13 +382,8 @@ def _giac(s): + sage: (1+2*sin(3*x)).solve(x).simplify() + ...list[-pi/18,7*pi/18] + +- sage: libgiac.solve('sin(3*x)>2*sin(x)',x) +- Traceback (most recent call last): +- ... +- RuntimeError: Unable to find numeric values solving equation. For +- trigonometric equations this may be solved using assumptions, e.g. +- assume(x>-pi && xx',x) ++ list[((x>(-sqrt(2))) and (x<0)),x>(sqrt(2))] + + You can also add some hypothesis to a giac symbol:: + diff --git a/srcpkgs/sagemath/patches/39182-python_3.13_iter.patch b/srcpkgs/sagemath/patches/39182-python_3.13_iter.patch new file mode 100644 index 00000000000..feb3267c7ec --- /dev/null +++ b/srcpkgs/sagemath/patches/39182-python_3.13_iter.patch @@ -0,0 +1,28 @@ +diff --git a/src/sage/matroids/extension.pyx b/src/sage/matroids/extension.pyx +index 778e6d6ef70..83b792e8d2b 100644 +--- a/src/sage/matroids/extension.pyx ++++ b/src/sage/matroids/extension.pyx +@@ -211,6 +211,9 @@ cdef class LinearSubclassesIter: + + self._nodes = [first_cut] + ++ def __iter__(self): ++ return self ++ + def __next__(self): + """ + Return the next linear subclass. +diff --git a/src/sage/matroids/set_system.pyx b/src/sage/matroids/set_system.pyx +index d9a2f631fbf..0bf9cb2b7fa 100644 +--- a/src/sage/matroids/set_system.pyx ++++ b/src/sage/matroids/set_system.pyx +@@ -772,6 +772,9 @@ cdef class SetSystemIterator: + self._pointer = -1 + self._len = len(H) + ++ def __iter__(self): ++ return self ++ + def __next__(self): + """ + Return the next subset of a SetSystem. diff --git a/srcpkgs/sagemath/patches/39184-python_3.13_produce_latex_macro.patch b/srcpkgs/sagemath/patches/39184-python_3.13_produce_latex_macro.patch new file mode 100644 index 00000000000..2ae7639faa0 --- /dev/null +++ b/srcpkgs/sagemath/patches/39184-python_3.13_produce_latex_macro.patch @@ -0,0 +1,54 @@ +diff --git a/src/sage/misc/latex_macros.py b/src/sage/misc/latex_macros.py +index fc389b32a72..1cce2fa6f14 100644 +--- a/src/sage/misc/latex_macros.py ++++ b/src/sage/misc/latex_macros.py +@@ -43,6 +43,8 @@ + contain '\newcommand' lines for each of the entries in ``macros``. + """ + ++import importlib ++ + + def produce_latex_macro(name, *sample_args): + r""" +@@ -69,7 +71,7 @@ def produce_latex_macro(name, *sample_args): + sage: produce_latex_macro('GF', 37) + '\\newcommand{\\GF}[1]{\\Bold{F}_{#1}}' + +- If the Sage object is not in the global name space, describe it ++ If the Sage object is not in the global namespace, describe it + like so:: + + sage: produce_latex_macro('sage.rings.finite_rings.finite_field_constructor.FiniteField', 3) +@@ -84,22 +86,16 @@ def produce_latex_macro(name, *sample_args): + else: + module, real_name = names_split + newcommand = '\\newcommand{\\' + real_name + '}' +- count = 0 +- args = "(" +- for x in sample_args: +- count += 1 +- args += str(x) + ',' +- args += ')' +- exec('from ' + module + ' import ' + real_name) +- if count: +- defn = '[' + str(count) + ']{' +- defn += eval('str(LatexCall()(' + real_name + args + '))') + '}' ++ sage_object = getattr(importlib.import_module(module), real_name) ++ if sample_args: ++ defn = '[' + str(len(sample_args)) + ']{' ++ defn += str(LatexCall()(sage_object(*sample_args))) + '}' + else: +- defn = '{' + eval('str(LatexCall()(' + real_name + '))') + '}' +- count = 0 +- for x in sample_args: +- count += 1 +- defn = defn.replace(str(x), "#" + str(count)) ++ defn = '{' + str(LatexCall()(sage_object)) + '}' ++ for i, x in enumerate(sample_args): ++ s = str(x) ++ assert s in defn ++ defn = defn.replace(s, "#" + str(i+1)) + return newcommand + defn + + diff --git a/srcpkgs/sagemath/patches/39185-python_3.13_find_replacements.patch b/srcpkgs/sagemath/patches/39185-python_3.13_find_replacements.patch new file mode 100644 index 00000000000..35b4ee7a442 --- /dev/null +++ b/srcpkgs/sagemath/patches/39185-python_3.13_find_replacements.patch @@ -0,0 +1,22 @@ +diff --git a/src/sage/misc/replace_dot_all.py b/src/sage/misc/replace_dot_all.py +index ea51a9b3159..a43d6c0a929 100644 +--- a/src/sage/misc/replace_dot_all.py ++++ b/src/sage/misc/replace_dot_all.py +@@ -194,14 +194,15 @@ def find_replacements(location, package_regex=None, verbose=False): + to_exec = to_exec.replace("'", '').replace('"', '') + if (to_exec[-1] == ','): + to_exec = to_exec[:-1] +- exec(to_exec) ++ glob = dict() ++ exec(to_exec, glob) + except ModuleNotFoundError as err: + print(f'ModuleNotFoundError: {err} found when trying to execute {to_exec}') + except ImportError as err: + print(f'ImportError: {err} found when trying to execute {to_exec}') + + try: # try to evaluate the list of module names to get a list of the modules themselves which we can call import_statements on +- modules = eval(to_eval) ++ modules = eval(to_eval, glob) + except NameError as err: + print(f'NameError: {err} found when trying to evaluate {to_eval} at {location}:{row_index + 1}') + except SyntaxError as err: diff --git a/srcpkgs/sagemath/patches/39187-python_3.13_tests_output.patch b/srcpkgs/sagemath/patches/39187-python_3.13_tests_output.patch new file mode 100644 index 00000000000..53591e7a3d4 --- /dev/null +++ b/srcpkgs/sagemath/patches/39187-python_3.13_tests_output.patch @@ -0,0 +1,142 @@ +diff --git a/src/sage/categories/map.pyx b/src/sage/categories/map.pyx +index 43e476847d0..0007555326a 100644 +--- a/src/sage/categories/map.pyx ++++ b/src/sage/categories/map.pyx +@@ -275,7 +275,7 @@ cdef class Map(Element): + maps:: + + sage: phi.domain # needs sage.rings.number_field +- ++ + sage: phi._make_strong_references() # needs sage.rings.number_field + sage: print(phi.domain) # needs sage.rings.number_field + The constant function (...) -> Number Field in a +@@ -343,7 +343,7 @@ cdef class Map(Element): + maps:: + + sage: phi.domain # needs sage.rings.number_field +- ++ + sage: phi._make_strong_references() # needs sage.rings.number_field + sage: print(phi.domain) # needs sage.rings.number_field + The constant function (...) -> Number Field in a +diff --git a/src/sage/misc/bindable_class.py b/src/sage/misc/bindable_class.py +index 743b5a19da6..c23ba0c2c43 100644 +--- a/src/sage/misc/bindable_class.py ++++ b/src/sage/misc/bindable_class.py +@@ -113,7 +113,7 @@ class BindableClass(metaclass=ClasscallMetaclass): + Still, documentation works as usual:: + + sage: outer.Inner.__doc__ +- ' some documentation ' ++ '...some documentation ' + + TESTS:: + +diff --git a/src/sage/misc/sagedoc.py b/src/sage/misc/sagedoc.py +index 0505f6039a9..6147ec4983b 100644 +--- a/src/sage/misc/sagedoc.py ++++ b/src/sage/misc/sagedoc.py +@@ -694,7 +694,7 @@ def format(s, embedded=False): + We check that the todo Sphinx extension is correctly activated:: + + sage: sage.misc.sagedoc.format(sage.combinat.ranker.on_fly.__doc__) # needs sphinx +- " Return ... Todo: add tests as in combinat::rankers\n" ++ "...Return ...Todo: add tests as in combinat::rankers\n" + + In the following use case, the ``nodetex`` directive would have been ignored prior + to :issue:`11815`:: +@@ -1135,10 +1135,11 @@ def search_src(string, extra1='', extra2='', extra3='', extra4='', + The following produces an error because the string 'fetch(' is a + malformed regular expression:: + +- sage: print(search_src(" fetch(", "def", interact=False)) +- Traceback (most recent call last): +- ... +- error: missing ), unterminated subpattern at position 6 ++ sage: try: ++ ....: print(search_src(" fetch(", "def", interact=False)) ++ ....: except Exception as e: ++ ....: print(e) ++ missing ), unterminated subpattern at position 6 + + To fix this, *escape* the parenthesis with a backslash:: + +@@ -1186,7 +1187,6 @@ def search_src(string, extra1='', extra2='', extra3='', extra4='', + misc/sagedoc.py:... len(search_src("matrix", interact=False).splitlines())... + misc/sagedoc.py:... len(search_src("matrix", module="sage.calculus", interact=False).splitlines())... + misc/sagedoc.py:... len(search_src("matrix", path_re="calc"... +- misc/sagedoc.py:... print(search_src(" fetch(", "def", interact=False))... + misc/sagedoc.py:... print(search_src(r" fetch\(", "def", interact=False))... + misc/sagedoc.py:... print(search_src(r" fetch\(", "def", "pyx", interact=False))... + misc/sagedoc.py:... s = search_src('Matrix', path_re='matrix', interact=False); s.find('x') > 0... +@@ -1456,7 +1456,7 @@ class _sage_doc: + sage: browse_sage_doc._open("reference", testing=True)[0] # needs sagemath_doc_html + 'http://localhost:8000/doc/live/reference/index.html' + sage: browse_sage_doc(identity_matrix, 'rst')[-107:-47] # needs sage.modules +- 'Full MatrixSpace of 3 by 3 sparse matrices over Integer Ring' ++ '...Full MatrixSpace of 3 by 3 sparse matrices...' + """ + def __init__(self): + """ +diff --git a/src/sage/misc/sageinspect.py b/src/sage/misc/sageinspect.py +index 585112b5061..12f319fc8e3 100644 +--- a/src/sage/misc/sageinspect.py ++++ b/src/sage/misc/sageinspect.py +@@ -1986,7 +1986,7 @@ def sage_getdoc(obj, obj_name='', embedded=False): + + sage: from sage.misc.sageinspect import sage_getdoc + sage: sage_getdoc(identity_matrix)[87:124] # needs sage.modules +- 'Return the n x n identity matrix over' ++ '...the n x n identity matrix...' + sage: def f(a, b, c, d=1): return a+b+c+d + ... + sage: import functools +diff --git a/src/sage/modular/modsym/modsym.py b/src/sage/modular/modsym/modsym.py +index fb46d0edafa..ed7c9285169 100644 +--- a/src/sage/modular/modsym/modsym.py ++++ b/src/sage/modular/modsym/modsym.py +@@ -369,7 +369,7 @@ def ModularSymbols(group=1, + {} + sage: M = ModularSymbols(11,use_cache=True) + sage: sage.modular.modsym.modsym._cache +- {(Congruence Subgroup Gamma0(11), 2, 0, Rational Field): } ++ {(Congruence Subgroup Gamma0(11), 2, 0, Rational Field): } + sage: M is ModularSymbols(11,use_cache=True) + True + sage: M is ModularSymbols(11,use_cache=False) +diff --git a/src/sage/repl/attach.py b/src/sage/repl/attach.py +index b3e20fe61d8..b9997d8f2df 100644 +--- a/src/sage/repl/attach.py ++++ b/src/sage/repl/attach.py +@@ -40,7 +40,7 @@ + ....: traceback.print_exc(file=sys.stdout) + Traceback (most recent call last): + ... +- exec(preparse_file(f.read()) + "\n", globals) ++ exec(preparse_file(f.read()) + "\n", globals)... + File "", line 3, in + ValueError: third + sage: detach(src) +@@ -52,7 +52,7 @@ + ....: traceback.print_exc(file=sys.stdout) + Traceback (most recent call last): + ... +- exec(code, globals) ++ exec(code, globals)... + File ".../foobar...sage.py", line ..., in + raise ValueError("third") # this should appear in the source snippet... + ValueError: third +diff --git a/src/sage/repl/rich_output/pretty_print.py b/src/sage/repl/rich_output/pretty_print.py +index 93833e01cd8..8e00e3d70e4 100644 +--- a/src/sage/repl/rich_output/pretty_print.py ++++ b/src/sage/repl/rich_output/pretty_print.py +@@ -160,7 +160,7 @@ def pretty_print(self): + sage: seq._concatenate_graphs().show(edge_labels=True) # needs sage.graphs sage.plot + Traceback (most recent call last): + ... +- TypeError: ...matplotlib() got an unexpected keyword argument 'edge_labels' ++ TypeError: ...matplotlib() got an unexpected keyword argument 'edge_labels'... + """ + try: + from sage.plot.plot import Graphics diff --git a/srcpkgs/sagemath/patches/39201-python_3.13_fix_spyx_tmp.patch b/srcpkgs/sagemath/patches/39201-python_3.13_fix_spyx_tmp.patch new file mode 100644 index 00000000000..d7107e719e3 --- /dev/null +++ b/srcpkgs/sagemath/patches/39201-python_3.13_fix_spyx_tmp.patch @@ -0,0 +1,36 @@ +diff --git a/src/sage/misc/temporary_file.py b/src/sage/misc/temporary_file.py +index 998260be8eb..820d5cf2e95 100644 +--- a/src/sage/misc/temporary_file.py ++++ b/src/sage/misc/temporary_file.py +@@ -32,7 +32,9 @@ + # as the parent for all temporary files & directories created by them. + # This lets us clean up after those two functions when sage exits normally + # using an atexit hook +-TMP_DIR_FILENAME_BASE = tempfile.TemporaryDirectory() ++# Note that `TemporaryDirectory()` will cleanup on program exit; ++# we keep the atexit hook to be redundant, in case that fails. ++TMP_DIR_FILENAME_BASE = tempfile.TemporaryDirectory(prefix='sage_') + atexit.register(lambda: TMP_DIR_FILENAME_BASE.cleanup()) + + +@@ -533,14 +535,15 @@ def spyx_tmp() -> str: + We cache the result of this function "by hand" so that the same + temporary directory will always be returned. A function is used to + delay creating a directory until (if) it is needed. The temporary +- directory is removed when sage terminates by way of an atexit +- hook. ++ directory is automatically removed when sage terminates. + """ + global _spyx_tmp + if _spyx_tmp: + return _spyx_tmp + +- d = tempfile.TemporaryDirectory() +- _spyx_tmp = os.path.join(d.name, 'spyx') +- atexit.register(lambda: d.cleanup()) ++ # We don't use `tempfile.TemporaryDirectory()` here because it ++ # will be cleaned up on child exit (e.g. for parallel testing) ++ # For some reason this doesn't affect the `TemporaryDirectory` ++ # stored in the global `TMP_DIR_FILENAME_BASE`. ++ _spyx_tmp = tmp_dir(name='spyx_') + return _spyx_tmp diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches index 28162dff8a3..97bf36df52e 100755 --- a/srcpkgs/sagemath/patches/get_patches +++ b/srcpkgs/sagemath/patches/get_patches @@ -27,10 +27,21 @@ get_pr() { # run from patches dir cd $(dirname "$0") -get_pr 36641 "sympy 1.13" -get_pr 37884 "gap 4.13.1" -get_pr 38250 "numpy 2.0" -get_pr 38344 "ecm 7.0.6" - #get_pr 37645 "fix doctest" #get_pr 37885 "cython warnings" + +get_pr 39145 "python 3.13 re.sub" +get_pr 39147 "python 3.13 doctest" +get_pr 39182 "python 3.13 iter" +get_pr 39184 "python 3.13 produce_latex_macro" +get_pr 39185 "python 3.13 find_replacements" +get_pr 39187 "python 3.13 tests output" +get_pr 39201 "python 3.13 fix spyx_tmp" + +get_pr 38749 "pari 2.17" +get_pr 38962 "eclib 20241112" +get_pr 39178 "giac 1.9.0.998" + +get_pr 38940 "fix flaky simplicial set test" + +#get_pr 39142 "fix alarm tests" diff --git a/srcpkgs/sagemath/patches/numpy_2.1a.patch b/srcpkgs/sagemath/patches/numpy_2.1a.patch deleted file mode 100644 index 30e2de99d84..00000000000 --- a/srcpkgs/sagemath/patches/numpy_2.1a.patch +++ /dev/null @@ -1,28 +0,0 @@ -commit 241dc39bd0ba1c056f88bee46a0345d59093eaff -Author: Gonzalo Tornaría -Date: Mon Aug 19 23:25:32 2024 -0300 - - add copy parameter to numpy (needed for v2.1) - -diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx -index c38df5412f0..f587cef651a 100644 ---- a/src/sage/matrix/matrix1.pyx -+++ b/src/sage/matrix/matrix1.pyx -@@ -671,7 +671,7 @@ cdef class Matrix(Matrix0): - entries = [[sib(v, 2) for v in row] for row in self.rows()] - return sib.name('matrix')(self.base_ring(), entries) - -- def numpy(self, dtype=None): -+ def numpy(self, dtype=None, copy=True): - """ - Return the Numpy matrix associated to this matrix. - -@@ -732,7 +732,7 @@ cdef class Matrix(Matrix0): - (3, 4) - """ - import numpy -- A = numpy.matrix(self.list(), dtype=dtype) -+ A = numpy.matrix(self.list(), dtype=dtype, copy=copy) - return numpy.resize(A,(self.nrows(), self.ncols())) - - # Define the magic "__array__" function so that numpy.array(m) can convert diff --git a/srcpkgs/sagemath/patches/numpy_2.1b.patch b/srcpkgs/sagemath/patches/numpy_2.1b.patch deleted file mode 100644 index b77e28361d2..00000000000 --- a/srcpkgs/sagemath/patches/numpy_2.1b.patch +++ /dev/null @@ -1,229 +0,0 @@ -commit 8b32fdb87725c1d67ffb51dadec1c331c7c35f3c -Author: Gonzalo Tornaría -Date: Tue Aug 20 00:05:33 2024 -0300 - - silence np.set_printoptions (for numpy 2.1) - -diff --git a/src/sage/combinat/fully_packed_loop.py b/src/sage/combinat/fully_packed_loop.py -index b3ebd206cd2..48866824224 100644 ---- a/src/sage/combinat/fully_packed_loop.py -+++ b/src/sage/combinat/fully_packed_loop.py -@@ -68,7 +68,7 @@ def _make_color_list(n, colors=None, color_map=None, randomize=False): - - sage: import numpy as np - sage: if int(np.version.short_version[0]) > 1: -- ....: np.set_printoptions(legacy="1.25") -+ ....: _token = np.set_printoptions(legacy="1.25") - sage: from sage.combinat.fully_packed_loop import _make_color_list - sage: _make_color_list(5) - sage: _make_color_list(5, ['blue', 'red']) -diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py -index 2a03bb68f67..30b56722e66 100644 ---- a/src/sage/functions/special.py -+++ b/src/sage/functions/special.py -@@ -219,7 +219,7 @@ class SphericalHarmonic(BuiltinFunction): - sage: from scipy.special import sph_harm # NB: arguments x and y are swapped # needs scipy - sage: import numpy as np # needs scipy - sage: if int(np.version.short_version[0]) > 1: # needs scipy -- ....: np.set_printoptions(legacy="1.25") # needs scipy -+ ....: _token = np.set_printoptions(legacy="1.25") # needs scipy - sage: sph_harm(1, 1, pi.n(), (pi/2).n()) # abs tol 1e-14 # needs scipy sage.symbolic - (0.3454941494713355-4.231083042742082e-17j) - -diff --git a/src/sage/numerical/optimize.py b/src/sage/numerical/optimize.py -index 7ae8ca4966f..4cba22efdba 100644 ---- a/src/sage/numerical/optimize.py -+++ b/src/sage/numerical/optimize.py -@@ -385,7 +385,7 @@ def minimize(func, x0, gradient=None, hessian=None, algorithm="default", - ....: return sum(100.0r*(x[1r:]-x[:-1r]**2.0r)**2.0r + (1r-x[:-1r])**2.0r) - sage: import numpy - sage: if int(numpy.version.short_version[0]) > 1: -- ....: numpy.set_printoptions(legacy="1.25") -+ ....: _token = numpy.set_printoptions(legacy="1.25") - sage: from numpy import zeros - sage: def rosen_der(x): - ....: xm = x[1r:-1r] -diff --git a/src/sage/plot/arrow.py b/src/sage/plot/arrow.py -index 23e2517ca56..7375dcd5d1c 100644 ---- a/src/sage/plot/arrow.py -+++ b/src/sage/plot/arrow.py -@@ -55,7 +55,7 @@ class CurveArrow(GraphicPrimitive): - - sage: import numpy # to ensure numpy 2.0 compatibility - sage: if int(numpy.version.short_version[0]) > 1: -- ....: numpy.set_printoptions(legacy="1.25") -+ ....: _token = numpy.set_printoptions(legacy="1.25") - sage: from sage.plot.arrow import CurveArrow - sage: b = CurveArrow(path=[[(0,0),(.5,.5),(1,0)],[(.5,1),(0,0)]], - ....: options={}) -diff --git a/src/sage/plot/multigraphics.py b/src/sage/plot/multigraphics.py -index 6be448f1e04..004594b77c4 100644 ---- a/src/sage/plot/multigraphics.py -+++ b/src/sage/plot/multigraphics.py -@@ -786,7 +786,7 @@ class MultiGraphics(WithEqualityById, SageObject): - (0.2, 0.3, 0.4, 0.1) - sage: import numpy # to ensure numpy 2.0 compatibility - sage: if int(numpy.version.short_version[0]) > 1: -- ....: numpy.set_printoptions(legacy="1.25") -+ ....: _token = numpy.set_printoptions(legacy="1.25") - sage: ax1.get_position().bounds # tol 1.0e-13 - (0.2, 0.3, 0.4000000000000001, 0.10000000000000003) - -@@ -1300,7 +1300,7 @@ class GraphicsArray(MultiGraphics): - sage: G = graphics_array([g1, g2]) - sage: import numpy # to ensure numpy 2.0 compatibility - sage: if int(numpy.version.short_version[0]) > 1: -- ....: numpy.set_printoptions(legacy="1.25") -+ ....: _token = numpy.set_printoptions(legacy="1.25") - sage: G.position(0) # tol 5.0e-3 - (0.025045451349937315, - 0.03415488992713045, -diff --git a/src/sage/plot/streamline_plot.py b/src/sage/plot/streamline_plot.py -index d2cb11088c7..6d88517cc15 100644 ---- a/src/sage/plot/streamline_plot.py -+++ b/src/sage/plot/streamline_plot.py -@@ -73,7 +73,7 @@ class StreamlinePlot(GraphicPrimitive): - sage: x, y = var('x y') - sage: import numpy # to ensure numpy 2.0 compatibility - sage: if int(numpy.version.short_version[0]) > 1: -- ....: numpy.set_printoptions(legacy="1.25") -+ ....: _token = numpy.set_printoptions(legacy="1.25") - sage: d = streamline_plot((.01*x, x+y), (x,10,20), (y,10,20))[0].get_minmax_data() - sage: d['xmin'] - 10.0 -diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx -index 38c30f7627b..cfb8a5ff5f7 100644 ---- a/src/sage/rings/integer.pyx -+++ b/src/sage/rings/integer.pyx -@@ -594,7 +594,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): - - sage: import numpy # needs numpy - sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -- ....: numpy.set_printoptions(legacy="1.25") # needs numpy -+ ....: _token = numpy.set_printoptions(legacy="1.25") # needs numpy - sage: numpy.int8('12') == 12 # needs numpy - True - sage: 12 == numpy.int8('12') # needs numpy -diff --git a/src/sage/rings/real_mpfi.pyx b/src/sage/rings/real_mpfi.pyx -index 76fbfedab95..57de30c9d18 100644 ---- a/src/sage/rings/real_mpfi.pyx -+++ b/src/sage/rings/real_mpfi.pyx -@@ -232,7 +232,7 @@ TESTS:: - - sage: import numpy # needs numpy - sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -- ....: numpy.set_printoptions(legacy="1.25") # needs numpy -+ ....: _token = numpy.set_printoptions(legacy="1.25") # needs numpy - sage: RIF(2) == numpy.int8('2') # needs numpy - True - sage: numpy.int8('2') == RIF(2) # needs numpy -diff --git a/src/sage/schemes/elliptic_curves/period_lattice_region.pyx b/src/sage/schemes/elliptic_curves/period_lattice_region.pyx -index 70ce616f92f..f604c6d3785 100644 ---- a/src/sage/schemes/elliptic_curves/period_lattice_region.pyx -+++ b/src/sage/schemes/elliptic_curves/period_lattice_region.pyx -@@ -78,7 +78,7 @@ cdef class PeriodicRegion: - - sage: import numpy as np - sage: if int(np.version.short_version[0]) > 1: -- ....: np.set_printoptions(legacy="1.25") -+ ....: _token = np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((4, 4)) - sage: PeriodicRegion(CDF(2), CDF(2*I), data).is_empty() -@@ -298,7 +298,7 @@ cdef class PeriodicRegion: - - sage: import numpy as np - sage: if int(np.version.short_version[0]) > 1: -- ....: np.set_printoptions(legacy="1.25") -+ ....: _token = np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((10, 10)) - sage: data[1:4,1:4] = True -@@ -322,7 +322,7 @@ cdef class PeriodicRegion: - - sage: import numpy as np - sage: if int(np.version.short_version[0]) > 1: -- ....: np.set_printoptions(legacy="1.25") -+ ....: _token = np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((4, 4)) - sage: data[1,1] = True -@@ -377,7 +377,7 @@ cdef class PeriodicRegion: - - sage: import numpy as np - sage: if int(np.version.short_version[0]) > 1: -- ....: np.set_printoptions(legacy="1.25") -+ ....: _token = np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - - sage: data = np.zeros((20, 20)) -@@ -529,7 +529,7 @@ cdef class PeriodicRegion: - - sage: import numpy as np - sage: if int(np.version.short_version[0]) > 1: -- ....: np.set_printoptions(legacy="1.25") -+ ....: _token = np.set_printoptions(legacy="1.25") - sage: from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion - sage: data = np.zeros((4, 4)) - sage: data[1, 1] = True -diff --git a/src/sage/stats/basic_stats.py b/src/sage/stats/basic_stats.py -index 6937f6cb410..fb296e00fb6 100644 ---- a/src/sage/stats/basic_stats.py -+++ b/src/sage/stats/basic_stats.py -@@ -228,7 +228,7 @@ def std(v, bias=False): - sage: # needs numpy - sage: import numpy - sage: if int(numpy.version.short_version[0]) > 1: -- ....: numpy.set_printoptions(legacy="1.25") -+ ....: _token = numpy.set_printoptions(legacy="1.25") - sage: x = numpy.array([1,2,3,4,5]) - sage: std(x, bias=False) - 1.5811388300841898 -@@ -307,7 +307,7 @@ def variance(v, bias=False): - 0.4897530450000000? - sage: import numpy # needs numpy - sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -- ....: numpy.set_printoptions(legacy="1.25") # needs numpy -+ ....: _token = numpy.set_printoptions(legacy="1.25") # needs numpy - sage: x = numpy.array([1,2,3,4,5]) # needs numpy - sage: variance(x, bias=False) # needs numpy - 2.5 -diff --git a/src/sage/structure/coerce.pyx b/src/sage/structure/coerce.pyx -index 955a256e9b4..e5ed6160b79 100644 ---- a/src/sage/structure/coerce.pyx -+++ b/src/sage/structure/coerce.pyx -@@ -521,7 +521,7 @@ cdef class CoercionModel: - - sage: import numpy # needs numpy - sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -- ....: numpy.set_printoptions(legacy="1.25") # needs numpy -+ ....: _token = numpy.set_printoptions(legacy="1.25") # needs numpy - - sage: # needs sage.rings.real_mpfr - sage: x = polygen(RR) -diff --git a/src/sage/symbolic/function.pyx b/src/sage/symbolic/function.pyx -index cd89ad2a256..6fdf6d8ef23 100644 ---- a/src/sage/symbolic/function.pyx -+++ b/src/sage/symbolic/function.pyx -@@ -965,7 +965,7 @@ cdef class BuiltinFunction(Function): - - sage: import numpy # needs numpy - sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -- ....: numpy.set_printoptions(legacy="1.25") # needs numpy -+ ....: _token = numpy.set_printoptions(legacy="1.25") # needs numpy - - sage: sin(numpy.int32(0)) # needs numpy - 0.0 -diff --git a/src/sage/symbolic/ring.pyx b/src/sage/symbolic/ring.pyx -index 5b007d9e5fd..4a096d317e7 100644 ---- a/src/sage/symbolic/ring.pyx -+++ b/src/sage/symbolic/ring.pyx -@@ -1163,7 +1163,7 @@ cdef class NumpyToSRMorphism(Morphism): - - sage: import numpy # needs numpy - sage: if int(numpy.version.short_version[0]) > 1: # needs numpy -- ....: numpy.set_printoptions(legacy="1.25") # needs numpy -+ ....: _token = numpy.set_printoptions(legacy="1.25") # needs numpy - sage: f(x) = x^2 - sage: f(numpy.int8('2')) # needs numpy - 4 diff --git a/srcpkgs/sagemath/patches/zz-32bit-test.patch b/srcpkgs/sagemath/patches/zz-32bit-test.patch new file mode 100644 index 00000000000..03f56d8c3bf --- /dev/null +++ b/srcpkgs/sagemath/patches/zz-32bit-test.patch @@ -0,0 +1,30 @@ +A couple of tests that give different (correct) output on 32-bit + +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 61d0b98509a..dab3186cea4 100644 +--- a/src/sage/rings/number_field/number_field.py ++++ b/src/sage/rings/number_field/number_field.py +@@ -4827,7 +4827,8 @@ class NumberField_generic(WithEqualityById, number_field_base.NumberField): + + 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))] diff --git a/srcpkgs/sagemath/patches/zz-fix-doctest-order.patch b/srcpkgs/sagemath/patches/zz-fix-doctest-order.patch new file mode 100644 index 00000000000..7fb8a4ac672 --- /dev/null +++ b/srcpkgs/sagemath/patches/zz-fix-doctest-order.patch @@ -0,0 +1,17 @@ +--- a/src/sage/rings/number_field/galois_group.py ++++ b/src/sage/rings/number_field/galois_group.py +@@ -994,9 +994,11 @@ class GaloisGroup_v2(GaloisGroup_perm): + 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): + ... diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template index b3835fb2276..82b7e6deae9 100644 --- a/srcpkgs/sagemath/template +++ b/srcpkgs/sagemath/template @@ -1,12 +1,14 @@ # Template file for 'sagemath' pkgname=sagemath -version=10.4 -revision=4 +version=10.5 +revision=1 _pypi_version=${version/.beta/b} _pypi_version=${_pypi_version/.rc/rc} build_style=python3-pep517 hostmakedepends="pkg-config python3-Cython python3-Jinja2 - python3-pkgconfig python3-setuptools python3-wheel" + python3-pkgconfig python3-setuptools python3-wheel + python3-gmpy2 python3-memory_allocator python3-numpy ecl + python3-cypari2 python3-cysignals python3-devel" makedepends="boost-devel brial-devel cliquer-devel ecl eclib-devel ecm-devel fflas-ffpack flintlib-devel gap-devel gd-devel giac-devel glpk-devel gsl-devel iml-devel lcalc-devel libbraiding-devel libhomfly-devel libmpc-devel @@ -24,7 +26,9 @@ depends="eclib-devel fflas-ffpack flintlib-devel gcc-fortran meson gd-devel python3-pplpy python3-primecountpy python3-requests python3-scipy python3-sympy python3-traitlets sage-data-combinatorial_designs python3-conway-polynomials sage-data-elliptic_curves sage-data-graphs - sage-data-polytopes_db sympow tachyon threejs-sage" + sage-data-polytopes_db sympow tachyon threejs-sage + python3-six python3-gmpy2 python3-numpy python3-pexpect python3-Sphinx + python3-Pillow python3-mpmath python3-jupyter_client python3-ptyprocess" checkdepends="$depends python3-pytest pythran python3-Sphinx gdb" short_desc="Open source mathematics software" maintainer="Gonzalo Tornaría " @@ -32,7 +36,7 @@ license="GPL-2.0-or-later" homepage="https://www.sagemath.org/" changelog="https://github.com/sagemath/sage/releases" distfiles="${PYPI_SITE}/s/sagemath-standard/sagemath_standard-${_pypi_version}.tar.gz" -checksum=f6579e85f33bd9bb6e9b991bfc4c49dab1e649858ed9ee41c7cec75cb92d4c62 +checksum=fa0e91cc12754db3cbdf843dbe30252b4378c030825530bc6858ddbcac701096 nocross="due to ntl (eclib, singular), fflas-ffpack, givaro, linbox, sympow, maxima" # main repo `.../src/sage/` is `.../sage/` here @@ -47,7 +51,7 @@ post_install() { mv -T ${DESTDIR}/usr/bin ${DESTDIR}/usr/libexec/sagemath # copy configuration - cp ${FILESDIR}/sage-env-config ${DESTDIR}/usr/libexec/sagemath + vinstall ${FILESDIR}/sage-env-config 644 usr/libexec/sagemath # symlink main binary vmkdir usr/bin