Package: guix-patches;
Reported by: Andreas Enge <andreas <at> enge.fr>
Date: Thu, 13 Feb 2025 15:19:02 UTC
Severity: normal
Tags: patch
Done: Andreas Enge <andreas <at> enge.fr>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 76270 in the body.
You can then email your comments to 76270 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Thu, 13 Feb 2025 15:19:02 GMT) Full text and rfc822 format available.Andreas Enge <andreas <at> enge.fr>
:guix-patches <at> gnu.org
.
(Thu, 13 Feb 2025 15:19:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: guix-patches <at> gnu.org Cc: Andreas Enge <andreas <at> enge.fr> Subject: [PATCH 0/2] Add sage. Date: Thu, 13 Feb 2025 16:13:02 +0100
Andreas Enge (2): gnu: Add maxima-ecl. gnu: Add sage. gnu/local.mk | 2 + gnu/packages/maths.scm | 36 +- gnu/packages/patches/sage-update-eclib.patch | 222 + .../patches/sage-update-pari-gp.patch | 5020 +++++++++++++++++ gnu/packages/sagemath.scm | 152 +- 5 files changed, 5428 insertions(+), 4 deletions(-) create mode 100644 gnu/packages/patches/sage-update-eclib.patch create mode 100644 gnu/packages/patches/sage-update-pari-gp.patch base-commit: 2e72561e788a0bb37ffe887d546a394b70b8c212 -- 2.48.1
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Thu, 13 Feb 2025 15:30:02 GMT) Full text and rfc822 format available.Message #8 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: 76270 <at> debbugs.gnu.org Cc: vicvbcun <guix <at> ikherbers.com>, Guillaume Le Vaillant <glv <at> posteo.net>, Vinicius Monego <monego <at> posteo.net>, Sharlatan Hellseher <sharlatanus <at> gmail.com> Subject: Add sage Date: Thu, 13 Feb 2025 16:29:36 +0100
Hello! The next two commits add SageMath as the package sage to Guix. Sage uses maxima, but needs maxima compiled with the ecl common lisp implementation, which I have added as a new package maxima-ecl in addition to our current maxima, which is compiled with sbcl. Ideally, instead of adding this maxima-ecl, I would just have it replace our current maxima - in this way, we would have only one maxima package; both should have the same functionality anyway. What do you think? I have taken a lot of care to patch the scripts in the sage package so that the references to external binaries become internal with the complete paths /gnu/store/..., so that only few propagated inputs are needed (essentially Python libraries). From inside sage, you can run %singular, %maxima, %gp or %gap to shell out to these external computer algebra systems. In my home profile, the REPL obtained by typing "sage" fails to start, due to some mysterious conflict between, I suppose, propagated python inputs pulled in through other packages. I could work around this by ./pre-inst-env guix shell -C --pure sage and then running "sage" in the Guix shell. The jupyter notebook is directly functional running "sage -n". There are definitely lots of optional packages that could be added as inputs in later steps. In that case, I would suggest that for each new input we come up with a sage command that fails with the current setup and succeeds with the enhanced setup, so as to "prove" that the added inputs are indeed taken into account. (As an example, in a previous iteration, I already had gmp-ecm as an input, but upon inspection it turned out that it was not actually used to factor numbers using ECM, and I had to add the (substitute* "src/sage/env.py" (("\"ecm\"") (string-append "\"" #$gmp-ecm "/bin/ecm\"")) lines to the package.) So far, I have only tried to compile on x86_64, where it succeeds. I would suggest to replace our sbcl maxima package by the ebcl one, and to push sage to master. What do you think? Andreas
andreas <at> enge.fr, bavier <at> posteo.net, sharlatanus <at> gmail.com, guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Thu, 13 Feb 2025 15:33:01 GMT) Full text and rfc822 format available.Message #11 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: 76270 <at> debbugs.gnu.org Cc: vicvbcun <guix <at> ikherbers.com>, Guillaume Le Vaillant <glv <at> posteo.net>, Andreas Enge <andreas <at> enge.fr>, Vinicius Monego <monego <at> posteo.net>, Sharlatan Hellseher <sharlatanus <at> gmail.com> Subject: [PATCH 1/2] gnu: Add maxima-ecl. Date: Thu, 13 Feb 2025 16:31:32 +0100
* gnu/packages/maths.scm (maxima-ecl): New variable. Change-Id: I71a14d064e67aa34fdd7f6eb8499dfbd1dea11b9 --- gnu/packages/maths.scm | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm index 4a1637b952..4dcf986ccc 100644 --- a/gnu/packages/maths.scm +++ b/gnu/packages/maths.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015, 2016, 2019, 2020, 2023, 2024 Andreas Enge <andreas <at> enge.fr> +;;; Copyright © 2013, 2014, 2015, 2016, 2019, 2020, 2023, 2024, 2025 Andreas Enge <andreas <at> enge.fr> ;;; Copyright © 2013 Nikita Karetnikov <nikita <at> karetnikov.org> ;;; Copyright © 2014, 2016, 2017 John Darrington <jmd <at> gnu.org> ;;; Copyright © 2014-2022 Eric Bavier <bavier <at> posteo.net> @@ -5511,6 +5511,40 @@ (define-public maxima ;; GPLv2 only is therefore the smallest subset. (license license:gpl2))) +(define-public maxima-ecl + (package/inherit maxima + (name "maxima-ecl") + (inputs + (modify-inputs (package-inputs maxima) + (delete "sbcl") + (prepend ecl))) + (arguments + (substitute-keyword-arguments (package-arguments maxima) + ((#:configure-flags flags) + #~(list "--enable-ecl")) + ((#:phases phases) + #~(modify-phases #$phases + (add-after 'install 'install-lib + (lambda _ + (let ((lib (string-append + #$output "/lib/maxima/" + #$(package-version this-package) + "/binary-ecl"))) + (install-file "src/binary-ecl/maxima.fas" lib)))) + (replace 'check + (lambda _ + (invoke "sh" "-c" + (string-append + "./maxima-local " + "--lisp=ecl " + "--batch-string=\"run_testsuite();\" " + "| grep -q \"No unexpected errors found\"")))))))) + (description + (string-append + (package-description maxima) + " This package variant uses ECL as the underlying Lisp +implementation.")))) + (define-public wxmaxima (package (name "wxmaxima") -- 2.48.1
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Thu, 13 Feb 2025 15:33:02 GMT) Full text and rfc822 format available.Message #14 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: 76270 <at> debbugs.gnu.org Cc: vicvbcun <guix <at> ikherbers.com>, Guillaume Le Vaillant <glv <at> posteo.net>, Andreas Enge <andreas <at> enge.fr>, Vinicius Monego <monego <at> posteo.net>, Sharlatan Hellseher <sharlatanus <at> gmail.com> Subject: [PATCH 2/2] gnu: Add sage. Date: Thu, 13 Feb 2025 16:31:33 +0100
* gnu/packages/sagemath.scm (sage): New variable. * gnu/packages/patches/sage-update-eclib.patch, gnu/packages/patches/sage-update-pari-gp.patch: New files. * gnu/local.mk (dist_patch_DATA): Register patches. Change-Id: I105c002810aeb22b6f927186cf75ddb2fa162ff4 --- gnu/local.mk | 2 + gnu/packages/patches/sage-update-eclib.patch | 222 + .../patches/sage-update-pari-gp.patch | 5020 +++++++++++++++++ gnu/packages/sagemath.scm | 152 +- 4 files changed, 5393 insertions(+), 3 deletions(-) create mode 100644 gnu/packages/patches/sage-update-eclib.patch create mode 100644 gnu/packages/patches/sage-update-pari-gp.patch diff --git a/gnu/local.mk b/gnu/local.mk index fbca6d4ce8..bbe6fe4fce 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -2204,6 +2204,8 @@ dist_patch_DATA = \ %D%/packages/patches/rw-igraph-0.10.patch \ %D%/packages/patches/rxvt-unicode-fix-cursor-position.patch \ %D%/packages/patches/s7-flint-3.patch \ + %D%/packages/patches/sage-update-eclib.patch \ + %D%/packages/patches/sage-update-pari-gp.patch \ %D%/packages/patches/sajson-for-gemmi-numbers-as-strings.patch \ %D%/packages/patches/sajson-build-with-gcc10.patch \ %D%/packages/patches/sbc-fix-build-non-x86.patch \ diff --git a/gnu/packages/patches/sage-update-eclib.patch b/gnu/packages/patches/sage-update-eclib.patch new file mode 100644 index 0000000000..2303005878 --- /dev/null +++ b/gnu/packages/patches/sage-update-eclib.patch @@ -0,0 +1,222 @@ +From 6dfc26b805d2fb0cafa60f0d778db3d68188b724 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Wed, 13 Nov 2024 14:46:51 +0000 +Subject: [PATCH 1/4] #38960-eclib-upgrade-20241112 + +--- + build/pkgs/eclib/SPKG.rst | 2 +- + build/pkgs/eclib/checksums.ini | 4 ++-- + build/pkgs/eclib/package-version.txt | 2 +- + build/pkgs/eclib/spkg-configure.m4 | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/build/pkgs/eclib/SPKG.rst b/build/pkgs/eclib/SPKG.rst +index 5627fdcb57c..ac8b27b3606 100644 +--- a/build/pkgs/eclib/SPKG.rst ++++ b/build/pkgs/eclib/SPKG.rst +@@ -30,5 +30,5 @@ Upstream Contact + - Author: John Cremona + - Email: john.cremona <at> gmail.com + - Website: +- http://homepages.warwick.ac.uk/staff/J.E.Cremona/mwrank/index.html ++ https://johncremona.github.io/mwrank/index.html + - Repository: https://github.com/JohnCremona/eclib +diff --git a/build/pkgs/eclib/checksums.ini b/build/pkgs/eclib/checksums.ini +index fde4faaee15..b046783341d 100644 +--- a/build/pkgs/eclib/checksums.ini ++++ b/build/pkgs/eclib/checksums.ini +@@ -1,4 +1,4 @@ + tarball=eclib-VERSION.tar.bz2 +-sha1=3028ac95e1b76699f5f9e871ac706cda363ab842 +-sha256=32d116a3e359b0de4f6486c2bb6188bb8b553c8b833f618cc2596484e8b6145a ++sha1=749e4fda3660006a9459f129148d05ba482daa29 ++sha256=30765c27ca1420141f83517897119d0185fea9b31132392170ddae40b060e46f + upstream_url=https://github.com/JohnCremona/eclib/releases/download/vVERSION/eclib-VERSION.tar.bz2 +diff --git a/build/pkgs/eclib/package-version.txt b/build/pkgs/eclib/package-version.txt +index 190b92f716b..353869c3cba 100644 +--- a/build/pkgs/eclib/package-version.txt ++++ b/build/pkgs/eclib/package-version.txt +@@ -1 +1 @@ +-20231212 ++20241112 +diff --git a/build/pkgs/eclib/spkg-configure.m4 b/build/pkgs/eclib/spkg-configure.m4 +index ba5c22fa090..23771dad1bd 100644 +--- a/build/pkgs/eclib/spkg-configure.m4 ++++ b/build/pkgs/eclib/spkg-configure.m4 +@@ -1,7 +1,7 @@ + SAGE_SPKG_CONFIGURE([eclib], [ + SAGE_SPKG_DEPCHECK([ntl pari flint], [ + dnl use existing eclib only if the version reported by pkg-config is recent enough +- m4_pushdef([SAGE_ECLIB_VER],["20231212"]) ++ m4_pushdef([SAGE_ECLIB_VER],["20241112"]) + PKG_CHECK_MODULES([ECLIB], [eclib >= SAGE_ECLIB_VER], [ + AC_CACHE_CHECK([for mwrank version == SAGE_ECLIB_VER], [ac_cv_path_MWRANK], [ + AC_PATH_PROGS_FEATURE_CHECK([MWRANK], [mwrank], [ + +From d38cb48c67c7565572064fd29748c1e8da3b3271 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Tue, 19 Nov 2024 13:51:49 +0000 +Subject: [PATCH 2/4] #38960 fix eclib interface after upgrade + +--- + src/sage/libs/eclib/__init__.pxd | 4 ++-- + src/sage/libs/eclib/mat.pyx | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/sage/libs/eclib/__init__.pxd b/src/sage/libs/eclib/__init__.pxd +index d44d4fba865..84d1fc92275 100644 +--- a/src/sage/libs/eclib/__init__.pxd ++++ b/src/sage/libs/eclib/__init__.pxd +@@ -55,7 +55,7 @@ cdef extern from "eclib/matrix.h": + cdef cppclass mat: + mat() + mat(mat m) +- scalar* get_entries() ++ vector[scalar] get_entries() + scalar sub(long, long) + long nrows() + long ncols() +@@ -67,7 +67,7 @@ cdef extern from "eclib/smatrix.h": + cdef cppclass smat: + smat() + smat(smat m) +- scalar* get_entries() ++ vector[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..e7abe369b2b 100644 +--- a/src/sage/libs/eclib/mat.pyx ++++ b/src/sage/libs/eclib/mat.pyx +@@ -10,7 +10,7 @@ from sage.rings.integer_ring import ZZ + 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 +- ++from libcpp.vector cimport vector + + cdef class Matrix: + """ +@@ -213,7 +213,7 @@ cdef class Matrix: + """ + cdef long n = self.nrows() + cdef long i, j, k +- cdef scalar* v = <scalar*> self.M.get_entries() # coercion needed to deal with const ++ cdef vector[scalar] v = <vector[scalar]> self.M.get_entries() # coercion needed to deal with const + + cdef Matrix_integer_dense Td + cdef Matrix_integer_sparse Ts + +From 4f2cb3f7a943aefd05d4baf7b5845a6fc3dba779 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Wed, 4 Dec 2024 08:35:58 +0000 +Subject: [PATCH 3/4] #38960 simplify eclib interface + +--- + src/sage/libs/eclib/__init__.pxd | 2 -- + src/sage/libs/eclib/mat.pyx | 18 +++++++----------- + 2 files changed, 7 insertions(+), 13 deletions(-) + +diff --git a/src/sage/libs/eclib/__init__.pxd b/src/sage/libs/eclib/__init__.pxd +index 84d1fc92275..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) +- vector[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) +- vector[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 e7abe369b2b..5dbb39faa0e 100644 +--- a/src/sage/libs/eclib/mat.pyx ++++ b/src/sage/libs/eclib/mat.pyx +@@ -10,7 +10,6 @@ from sage.rings.integer_ring import ZZ + 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 +-from libcpp.vector cimport vector + + cdef class Matrix: + """ +@@ -212,8 +211,7 @@ cdef class Matrix: + <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> + """ + cdef long n = self.nrows() +- cdef long i, j, k +- cdef vector[scalar] v = <vector[scalar]> 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 + + + +From 8754c7052084043209c8332d3d1154c26c25ae91 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Wed, 4 Dec 2024 09:20:07 +0000 +Subject: [PATCH 4/4] #38960: fix lint issue + +--- + src/sage/libs/eclib/mat.pyx | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/sage/libs/eclib/mat.pyx b/src/sage/libs/eclib/mat.pyx +index 5dbb39faa0e..989d9d1a70c 100644 +--- a/src/sage/libs/eclib/mat.pyx ++++ b/src/sage/libs/eclib/mat.pyx +@@ -221,7 +221,7 @@ cdef class Matrix: + Ts = MatrixSpace(ZZ, n, sparse=sparse).zero_matrix().__copy__() + for i from 0 <= i < n: + for j from 0 <= j < n: +- Mij = Integer(self.M.sub(i+1,j+1)); ++ Mij = Integer(self.M.sub(i+1,j+1)) + if Mij: + Ts.set_unsafe(i, j, Mij) + return Ts +@@ -229,7 +229,7 @@ cdef class Matrix: + Td = MatrixSpace(ZZ, n, sparse=sparse).zero_matrix().__copy__() + for i from 0 <= i < n: + for j from 0 <= j < n: +- Mij = Integer(self.M.sub(i+1,j+1)); ++ Mij = Integer(self.M.sub(i+1,j+1)) + if Mij: + Td.set_unsafe(i, j, Mij) + return Td diff --git a/gnu/packages/patches/sage-update-pari-gp.patch b/gnu/packages/patches/sage-update-pari-gp.patch new file mode 100644 index 0000000000..741b9b1478 --- /dev/null +++ b/gnu/packages/patches/sage-update-pari-gp.patch @@ -0,0 +1,5020 @@ +diff --git a/build/pkgs/cypari/checksums.ini b/build/pkgs/cypari/checksums.ini +index 1ead9490d1a..3794d83334f 100644 +--- a/build/pkgs/cypari/checksums.ini ++++ b/build/pkgs/cypari/checksums.ini +@@ -1,4 +1,4 @@ + tarball=cypari2-VERSION.tar.gz +-sha1=4e9f14d218bc1cea29e03a2ceec9bf3dfbfd5eb3 +-sha256=817606bf661b71d33e1d012421907a4f8fb09dd81b7d3e3ae179b3978020bbf1 ++sha1=556d1a16818663ba6e6a3c9d2b14cc907a7eef4c ++sha256=aaa017a6a280581902f73cf5ce1695712b6598a032be14cfab81f97c475f83b8 + upstream_url=https://files.pythonhosted.org/packages/source/c/cypari2/cypari2-VERSION.tar.gz +diff --git a/build/pkgs/cypari/package-version.txt b/build/pkgs/cypari/package-version.txt +index ccbccc3dc62..c043eea7767 100644 +--- a/build/pkgs/cypari/package-version.txt ++++ b/build/pkgs/cypari/package-version.txt +@@ -1 +1 @@ +-2.2.0 ++2.2.1 +diff --git a/build/pkgs/cysignals/checksums.ini b/build/pkgs/cysignals/checksums.ini +index 8ba1030ffdf..9c6648af170 100644 +--- a/build/pkgs/cysignals/checksums.ini ++++ b/build/pkgs/cysignals/checksums.ini +@@ -1,4 +1,4 @@ + tarball=cysignals-VERSION.tar.gz +-sha1=76db7aa59d55e867c83b329c017382555253af43 +-sha256=0f1e321e55a07f901c86a36a1e4497f6ff9dfe700681d0130a38c36e4eb238c3 ++sha1=e285e209a3a5f9469cb5ade746c518cd3a600a9b ++sha256=89f7626dbf29db5ab3d6eff15a89978f4eb5193c320e9099bcc157dacdefd1eb + upstream_url=https://files.pythonhosted.org/packages/source/c/cysignals/cysignals-VERSION.tar.gz +diff --git a/build/pkgs/cysignals/dependencies b/build/pkgs/cysignals/dependencies +index cd45ae2076c..d42690aa7b1 100644 +--- a/build/pkgs/cysignals/dependencies ++++ b/build/pkgs/cysignals/dependencies +@@ -1,4 +1,4 @@ +- cython pari | $(PYTHON_TOOLCHAIN) $(PYTHON) ++ cython | $(PYTHON_TOOLCHAIN) meson_python $(PYTHON) + + ---------- + All lines of this file are ignored except the first. +diff --git a/build/pkgs/cysignals/package-version.txt b/build/pkgs/cysignals/package-version.txt +index 3d0e62313ce..81f363239f5 100644 +--- a/build/pkgs/cysignals/package-version.txt ++++ b/build/pkgs/cysignals/package-version.txt +@@ -1 +1 @@ +-1.11.4 ++1.12.3 +diff --git a/build/pkgs/cysignals/spkg-install.in b/build/pkgs/cysignals/spkg-install.in +index 0894611a27e..2e2a9691837 100644 +--- a/build/pkgs/cysignals/spkg-install.in ++++ b/build/pkgs/cysignals/spkg-install.in +@@ -3,9 +3,4 @@ cd src + # #29473: Override -Wp,-D_FORTIFY_SOURCE from Fedora's python3. + export CPPFLAGS="$CPPFLAGS -Wp,-U_FORTIFY_SOURCE" + +-if [ "$SAGE_DEBUG" = yes ]; then +- CYSIGNALS_CONFIGURE="--enable-debug $CYSIGNALS_CONFIGURE" +-fi +- +-sdh_configure $CYSIGNALS_CONFIGURE + sdh_pip_install . +diff --git a/build/pkgs/pari/checksums.ini b/build/pkgs/pari/checksums.ini +index d56c437a2ee..cfb35617995 100644 +--- a/build/pkgs/pari/checksums.ini ++++ b/build/pkgs/pari/checksums.ini +@@ -1,4 +1,4 @@ + tarball=pari-VERSION.tar.gz +-sha1=377593dfe72df13578ea0a517fcb0f81cc9758d4 +-sha256=0efdda7515d9d954f63324c34b34c560e60f73a81c3924a71260a2cc91d5f981 +-upstream_url=https://pari.math.u-bordeaux.fr/pub/pari/OLD/${VERSION_MAJOR}.${VERSION_MINOR}/pari-VERSION.tar.gz ++sha1=f5f5656a68947ef6a4841d40dd09a72fe96762a5 ++sha256=67ba6f3071233725258541e4f174b5efbc64c65ae5115bade9edfc45f1fde5dc ++upstream_url=https://pari.math.u-bordeaux.fr/pub/pari/unix/pari-VERSION.tar.gz +diff --git a/build/pkgs/pari/package-version.txt b/build/pkgs/pari/package-version.txt +index 7a561821071..3f8eb714d02 100644 +--- a/build/pkgs/pari/package-version.txt ++++ b/build/pkgs/pari/package-version.txt +@@ -1 +1 @@ +-2.15.5 ++2.17.1 +diff --git a/build/pkgs/pari/spkg-configure.m4 b/build/pkgs/pari/spkg-configure.m4 +index 207487119a6..d9d90e0d421 100644 +--- a/build/pkgs/pari/spkg-configure.m4 ++++ b/build/pkgs/pari/spkg-configure.m4 +@@ -1,8 +1,7 @@ + SAGE_SPKG_CONFIGURE([pari], [ + dnl See gp_version below on how the version is computed from MAJV.MINV.PATCHV +- m4_pushdef([SAGE_PARI_MINVER],["134916"])dnl this version and higher allowed +- dnl Do not allow Pari 2.17 or later, see #38769: +- m4_pushdef([SAGE_PARI_MAXVER],["135424"])dnl this version and higher not allowed ++ m4_pushdef([SAGE_PARI_MINVER],["135245"])dnl this version and higher allowed ++ m4_pushdef([SAGE_PARI_MAXVER],["999999"])dnl this version and higher not allowed + SAGE_SPKG_DEPCHECK([gmp readline], [ + AC_PATH_PROG([GP], [gp]) + if test x$GP = x; then dnl GP test +diff --git a/environment-3.11-linux-aarch64.yml b/environment-3.11-linux-aarch64.yml +index c17c3395c99..a26cafa98db 100644 +--- a/environment-3.11-linux-aarch64.yml ++++ b/environment-3.11-linux-aarch64.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-aarch64 +-# input_hash: 09e3b72a7aa5c065370cb8a339e14ed42ad43f0c89abc55b38713be2d4560fd9 ++# input_hash: 8682c27c6bd8b3e849271dd9881b907b660025227d849b37e5c7098a5a6a84ab + + channels: + - conda-forge +@@ -9,12 +9,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=h86ecc28_0 +- - arpack=3.9.1=nompi_hd363cd0_101 ++ - arpack=3.9.1=nompi_h6fc4d3a_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2148fe1_1 + - automake=1.17=pl5321h8af1aa0_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hd62202e_0 ++ - bdw-gc=8.2.8=h5ad3122_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=hf1166c9_2 + - binutils_impl_linux-aarch64=2.43=h4c662bb_2 +@@ -28,33 +28,33 @@ dependencies: + - brotli-python=1.1.0=py311h89d996e_2 + - bzip2=1.0.8=h68df207_7 + - c-ares=1.34.4=h86ecc28_0 +- - c-compiler=1.8.0=h6561dab_1 ++ - c-compiler=1.9.0=h6561dab_0 + - ca-certificates=2024.12.14=hcefe29a_0 + - cairo=1.18.2=h83712da_1 + - cddlib=1!0.94m=h719063d_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311h14e8bb7_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=h31becfc_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py311hc07b1fb_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311ha09ea12_0 ++ - coverage=7.6.10=py311ha09ea12_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=heb6c788_1 ++ - cxx-compiler=1.9.0=heb6c788_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311h5ab95f0_0 ++ - cypari2=2.2.1=py311hc8fbf20_0 + - cyrus-sasl=2.1.27=hf6b2984_7 +- - cysignals=1.11.2=py311h644d908_3 ++ - cysignals=1.12.3=py311h89d996e_0 + - cython=3.0.11=py311hac78f04_3 + - dbus=1.13.6=h12b9eeb_3 +- - debugpy=1.8.11=py311h89d996e_0 ++ - debugpy=1.8.12=py311h89d996e_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h2f0025b_0 + - ecl=24.5.10=h5567cc5_0 +- - eclib=20231212=h154513d_1 ++ - eclib=20231212=h4705ef2_2 + - ecm=7.0.5=ha2d0fc4_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -68,14 +68,14 @@ dependencies: + - fontconfig=2.15.0=h8dda3cd_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311h58d527c_0 +- - fortran-compiler=1.8.0=h25a59a9_1 +- - fplll=5.4.5=hb3a790e_0 +- - fpylll=0.6.1=py311h5d3d69a_0 ++ - fonttools=4.55.6=py311h58d527c_0 ++ - fortran-compiler=1.9.0=h25a59a9_0 ++ - fplll=5.5.0=h45c7457_0 ++ - fpylll=0.6.2=py311h2dc1a0e_0 + - freetype=2.12.1=hf0a5ef3_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h1754e88_1 +- - gap-defaults=4.14.0=h8af1aa0_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h1754e88_2 ++ - gap-defaults=4.14.0=h8af1aa0_2 + - gcc=13.3.0=h8a56e6e_1 + - gcc_impl_linux-aarch64=13.3.0=hcdea9b6_1 + - gcc_linux-aarch64=13.3.0=h1cd514b_7 +@@ -84,7 +84,7 @@ dependencies: + - gfortran=13.3.0=h8a56e6e_1 + - gfortran_impl_linux-aarch64=13.3.0=h174a3c4_1 + - gfortran_linux-aarch64=13.3.0=h2809cf8_7 +- - giac=1.9.0.21=h04922a4_1 ++ - giac=1.9.0.21=h6e4ddb9_2 + - givaro=4.2.0=h364d21b_0 + - glpk=5.0=h66325d0_0 + - gmp=6.3.0=h0a1ffab_2 +@@ -95,21 +95,21 @@ dependencies: + - gxx_impl_linux-aarch64=13.3.0=h1211b58_1 + - gxx_linux-aarch64=13.3.0=h2864abd_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hbf49d6b_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h785c1aa_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hf9b3779_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h207f3e5_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h15043fe_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +@@ -117,7 +117,7 @@ dependencies: + - keyutils=1.6.1=h4e544f5_0 + - kiwisolver=1.4.7=py311h75754e6_0 + - krb5=1.21.3=h50a48e9_0 +- - lcalc=2.0.5=he588f68_2 ++ - lcalc=2.0.5=h30a6b3d_3 + - lcms2=2.16=h922389a_0 + - ld_impl_linux-aarch64=2.43=h80caac9_2 + - lerc=4.0.0=h4de3ea5_0 +@@ -131,27 +131,27 @@ dependencies: + - libbrotlidec=1.1.0=h86ecc28_2 + - libbrotlienc=1.1.0=h86ecc28_2 + - libcblas=3.9.0=26_linuxaarch64_openblas +- - libclang-cpp19.1=19.1.6=default_he324ac1_0 +- - libclang13=19.1.6=default_h4390ef5_0 ++ - libclang-cpp19.1=19.1.7=default_he324ac1_0 ++ - libclang13=19.1.7=default_h4390ef5_0 + - libcups=2.3.3=h405e4a8_4 + - libcurl=8.11.1=h6702fde_0 + - libdeflate=1.23=h5e3c512_0 + - libdrm=2.4.124=h86ecc28_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h976ea20_0 + - libegl=1.7.0=hd24410f_2 + - libev=4.33=h31becfc_2 + - libexpat=2.6.4=h5ad3122_0 + - libffi=3.4.2=h3557bc0_5 +- - libflint=3.1.2=h0433c20_101 ++ - libflint=3.1.3.1=hf9b8075_101 + - libgcc=14.2.0=he277a41_1 + - libgcc-devel_linux-aarch64=13.3.0=h0c07274_101 + - libgcc-ng=14.2.0=he9431aa_1 +- - libgd=2.3.3=h6818b27_10 ++ - libgd=2.3.3=hc8d7b1d_11 + - libgfortran=14.2.0=he9431aa_1 + - libgfortran-ng=14.2.0=he9431aa_1 + - libgfortran5=14.2.0=hb6113d0_1 + - libgl=1.7.0=hd24410f_2 +- - libglib=2.82.2=hc486b8e_0 ++ - libglib=2.82.2=hc486b8e_1 + - libglvnd=1.7.0=hd24410f_2 + - libglx=1.7.0=hd24410f_2 + - libgomp=14.2.0=he277a41_1 +@@ -160,7 +160,7 @@ dependencies: + - libjpeg-turbo=3.0.0=h31becfc_1 + - liblapack=3.9.0=26_linuxaarch64_openblas + - liblapacke=3.9.0=26_linuxaarch64_openblas +- - libllvm19=19.1.6=h2edbd07_0 ++ - libllvm19=19.1.7=h2edbd07_0 + - liblzma=5.6.3=h86ecc28_1 + - liblzma-devel=5.6.3=h86ecc28_1 + - libnghttp2=1.64.0=hc8609a4_0 +@@ -169,18 +169,18 @@ dependencies: + - libopenblas=0.3.28=pthreads_h9d3fd7e_1 + - libopengl=1.7.0=hd24410f_2 + - libpciaccess=0.18=h31becfc_0 +- - libpng=1.6.44=hc4a20ef_0 ++ - libpng=1.6.45=hec79eb8_0 + - libpq=17.2=hd56632b_1 + - libsanitizer=13.3.0=ha58e236_1 + - libsodium=1.0.20=h68df207_0 +- - libsqlite=3.47.2=h5eb1b54_0 ++ - libsqlite=3.48.0=h5eb1b54_1 + - libssh2=1.11.1=ha41c0db_0 + - libstdcxx=14.2.0=h3f4de04_1 + - libstdcxx-devel_linux-aarch64=13.3.0=h0c07274_101 + - libstdcxx-ng=14.2.0=hf1166c9_1 + - libtiff=4.7.0=h88f7998_3 + - libuuid=2.38.1=hb4cce97_0 +- - libwebp-base=1.4.0=h31becfc_0 ++ - libwebp-base=1.5.0=h0886dbf_0 + - libxcb=1.17.0=h262b8f6_0 + - libxcrypt=4.4.36=h31becfc_1 + - libxkbcommon=1.7.0=h46f2afe_1 +@@ -188,7 +188,7 @@ dependencies: + - libxslt=1.1.39=h1cc9640_0 + - libzlib=1.3.1=h86ecc28_2 + - linbox=1.7.0=hf74d613_1 +- - llvm-openmp=19.1.6=h013ceaa_0 ++ - llvm-openmp=19.1.7=h013ceaa_0 + - lrcalc=2.1=h5ad3122_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hedfd65a_1006 +@@ -206,22 +206,22 @@ dependencies: + - mpfr=4.2.1=h2305555_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h3f5c77f_3 +- - mysql-libs=9.0.1=h11569fd_3 ++ - mysql-common=9.0.1=h3f5c77f_4 ++ - mysql-libs=9.0.1=h11569fd_4 + - nauty=2.8.8=h31becfc_1 +- - ncurses=6.5=hcccb83c_1 ++ - ncurses=6.5=ha32ae93_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h70be974_0 + - ntl=11.4.3=h0d7519b_1 +- - numpy=1.26.4=py311h69ead2a_0 ++ - numpy=2.2.2=py311h6c2b7b4_0 + - openblas=0.3.28=pthreads_h3a8cbd8_1 + - openjpeg=2.5.3=h3f56577_0 + - openldap=2.6.9=h30c48ee_0 +- - openssl=3.4.0=h86ecc28_0 ++ - openssl=3.4.0=hd08dc88_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hb9de7d4_0 +- - pari=2.15.5=h169c2a7_2_pthread ++ - pari=2.17.1=h45cace7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -231,7 +231,7 @@ dependencies: + - perl=5.32.1=7_h31becfc_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311hb2a0dd2_0 ++ - pillow=11.1.0=py311ha4eaa5e_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h86a87f0_0 + - pkg-config=0.29.2=hce167ba_1009 +@@ -240,18 +240,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h984aac9_1006 +- - pplpy=0.8.9=py311ha3770eb_1 +- - primecount=7.9=hd600fc2_0 +- - primecountpy=0.1.0=py311h098ece5_4 +- - primesieve=11.1=h2f0025b_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311ha879c10_0 ++ - pplpy=0.8.9=py311h3d7cd5b_2 ++ - primecount=7.14=hfe4b40e_0 ++ - primecountpy=0.1.0=py311hc07b1fb_5 ++ - primesieve=12.4=h0a1ffab_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311ha879c10_0 + - pthread-stubs=0.4=h86ecc28_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py311habb2604_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -265,43 +265,43 @@ dependencies: + - pyzmq=26.2.0=py311h826da9f_3 + - qd=2.3.22=h05efe27_1004 + - qhull=2020.2=h70be974_5 +- - qt6-main=6.8.1=h0d3cc05_0 ++ - qt6-main=6.8.1=ha0a94ed_2 + - readline=8.2=h8fc344f_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=h31becfc_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311h5912639_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311h13dcf5b_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hee12f27_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h578a6b9_0 ++ - sqlite=3.48.0=h578a6b9_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hd600fc2_0 +- - sympow=2.023.6=h157afb5_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-aarch64=2.17=h5b4a56d_18 ++ - sympow=2.023.6=h4d450c3_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-aarch64=2.17=h68829e0_18 + - tachyon=0.99b6=ha0bfc61_1002 + - tk=8.6.13=h194ca79_0 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py311h5487e9b_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311ha879c10_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311ha879c10_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h698ed42_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.11-linux.yml b/environment-3.11-linux.yml +index 2d99c14d61c..18b21418a74 100644 +--- a/environment-3.11-linux.yml ++++ b/environment-3.11-linux.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-64 +-# input_hash: 71d6929e3ba448868bcdf30d6cb1d190d88758e7272df5cf428554adbbf0ff6a ++# input_hash: 45c87b39adab7299f4500096956e14d99327f4a9bb48bc2fc7ced5996c569943 + + channels: + - conda-forge +@@ -10,12 +10,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=hb9d3cd8_0 +- - arpack=3.9.1=nompi_h77f6705_101 ++ - arpack=3.9.1=nompi_hf03ea27_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2b4cb7a_1 + - automake=1.17=pl5321ha770c72_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h4bd325d_0 ++ - bdw-gc=8.2.8=h5888daf_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=h4852527_2 + - binutils_impl_linux-64=2.43=h4bf12b8_2 +@@ -29,33 +29,33 @@ dependencies: + - brotli-python=1.1.0=py311hfdbb021_2 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.4=hb9d3cd8_0 +- - c-compiler=1.8.0=h2b85faf_1 ++ - c-compiler=1.9.0=h2b85faf_0 + - ca-certificates=2024.12.14=hbcca054_0 + - cairo=1.18.2=h3394656_1 + - cddlib=1!0.94m=h9202a9a_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311hf29c0ef_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=hd590300_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py311hd18a35c_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311h2dc5d0c_0 ++ - coverage=7.6.10=py311h2dc5d0c_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=h1a2810e_1 ++ - cxx-compiler=1.9.0=h1a2810e_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311hd2352ae_0 ++ - cypari2=2.2.1=py311h8699650_0 + - cyrus-sasl=2.1.27=h54b06d7_7 +- - cysignals=1.11.2=py311h82528dc_3 ++ - cysignals=1.12.3=py311hfdbb021_0 + - cython=3.0.11=py311h55d416d_3 + - dbus=1.13.6=h5008d03_3 +- - debugpy=1.8.11=py311hfdbb021_0 ++ - debugpy=1.8.12=py311hfdbb021_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h59595ed_0 + - ecl=24.5.10=h0f3afd4_0 +- - eclib=20231212=h43e5eba_1 ++ - eclib=20231212=h75fb491_2 + - ecm=7.0.5=h9458935_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -69,14 +69,14 @@ dependencies: + - fontconfig=2.15.0=h7e30c49_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311h2dc5d0c_0 +- - fortran-compiler=1.8.0=h36df796_1 +- - fplll=5.4.5=h384768b_0 +- - fpylll=0.6.1=py311hcfae7cf_0 ++ - fonttools=4.55.6=py311h2dc5d0c_0 ++ - fortran-compiler=1.9.0=h36df796_0 ++ - fplll=5.5.0=hd20a173_0 ++ - fpylll=0.6.2=py311hf0b6740_0 + - freetype=2.12.1=h267a509_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h3b03731_1 +- - gap-defaults=4.14.0=ha770c72_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h3b03731_2 ++ - gap-defaults=4.14.0=ha770c72_2 + - gcc=13.3.0=h9576a4e_1 + - gcc_impl_linux-64=13.3.0=hfea6d02_1 + - gcc_linux-64=13.3.0=hc28eda2_7 +@@ -85,7 +85,7 @@ dependencies: + - gfortran=13.3.0=h9576a4e_1 + - gfortran_impl_linux-64=13.3.0=h10434e7_1 + - gfortran_linux-64=13.3.0=hb919d3a_7 +- - giac=1.9.0.21=h673759e_1 ++ - giac=1.9.0.21=hca478b9_2 + - givaro=4.2.0=hb789bce_0 + - glpk=5.0=h445213a_0 + - gmp=6.3.0=hac33072_2 +@@ -96,21 +96,21 @@ dependencies: + - gxx_impl_linux-64=13.3.0=hdbfa832_1 + - gxx_linux-64=13.3.0=h6834431_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hda332d3_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h4bba637_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=he02047a_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=he44f51b_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h623f65a_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +@@ -118,7 +118,7 @@ dependencies: + - keyutils=1.6.1=h166bdaf_0 + - kiwisolver=1.4.7=py311hd18a35c_0 + - krb5=1.21.3=h659f571_0 +- - lcalc=2.0.5=h5aac1b6_2 ++ - lcalc=2.0.5=h9cf73fc_3 + - lcms2=2.16=hb7c19ff_0 + - ld_impl_linux-64=2.43=h712a8e2_2 + - lerc=4.0.0=h27087fc_0 +@@ -132,27 +132,27 @@ dependencies: + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=26_linux64_openblas +- - libclang-cpp19.1=19.1.6=default_hb5137d0_0 +- - libclang13=19.1.6=default_h9c6a7e4_0 ++ - libclang-cpp19.1=19.1.7=default_hb5137d0_0 ++ - libclang13=19.1.7=default_h9c6a7e4_0 + - libcups=2.3.3=h4637d8d_4 + - libcurl=8.11.1=h332b0f4_0 + - libdeflate=1.23=h4ddbbb0_0 + - libdrm=2.4.124=hb9d3cd8_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h7949ede_0 + - libegl=1.7.0=ha4b6fd6_2 + - libev=4.33=hd590300_2 + - libexpat=2.6.4=h5888daf_0 + - libffi=3.4.2=h7f98852_5 +- - libflint=3.1.2=h6fb9888_101 ++ - libflint=3.1.3.1=h0aae882_101 + - libgcc=14.2.0=h77fa898_1 + - libgcc-devel_linux-64=13.3.0=h84ea5a7_101 + - libgcc-ng=14.2.0=h69a702a_1 +- - libgd=2.3.3=hd3e95f3_10 ++ - libgd=2.3.3=h6f5c62b_11 + - libgfortran=14.2.0=h69a702a_1 + - libgfortran-ng=14.2.0=h69a702a_1 + - libgfortran5=14.2.0=hd5240d6_1 + - libgl=1.7.0=ha4b6fd6_2 +- - libglib=2.82.2=h2ff4ddf_0 ++ - libglib=2.82.2=h2ff4ddf_1 + - libglvnd=1.7.0=ha4b6fd6_2 + - libglx=1.7.0=ha4b6fd6_2 + - libgomp=14.2.0=h77fa898_1 +@@ -161,27 +161,27 @@ dependencies: + - libjpeg-turbo=3.0.0=hd590300_1 + - liblapack=3.9.0=26_linux64_openblas + - liblapacke=3.9.0=26_linux64_openblas +- - libllvm19=19.1.6=ha7bfdaf_0 ++ - libllvm19=19.1.7=ha7bfdaf_0 + - liblzma=5.6.3=hb9d3cd8_1 + - liblzma-devel=5.6.3=hb9d3cd8_1 + - libnghttp2=1.64.0=h161d5f1_0 + - libnsl=2.0.1=hd590300_0 +- - libntlm=1.4=h7f98852_1002 ++ - libntlm=1.8=hb9d3cd8_0 + - libopenblas=0.3.28=pthreads_h94d23a6_1 + - libopengl=1.7.0=ha4b6fd6_2 + - libpciaccess=0.18=hd590300_0 +- - libpng=1.6.44=hadc24fc_0 ++ - libpng=1.6.45=h943b412_0 + - libpq=17.2=h3b95a9b_1 + - libsanitizer=13.3.0=heb74ff8_1 + - libsodium=1.0.20=h4ab18f5_0 +- - libsqlite=3.47.2=hee588c1_0 ++ - libsqlite=3.48.0=hee588c1_1 + - libssh2=1.11.1=hf672d98_0 + - libstdcxx=14.2.0=hc0a3c3a_1 + - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101 + - libstdcxx-ng=14.2.0=h4852527_1 + - libtiff=4.7.0=hd9ff511_3 + - libuuid=2.38.1=h0b41bf4_0 +- - libwebp-base=1.4.0=hd590300_0 ++ - libwebp-base=1.5.0=h851e524_0 + - libxcb=1.17.0=h8a09558_0 + - libxcrypt=4.4.36=hd590300_1 + - libxkbcommon=1.7.0=h2c5496b_1 +@@ -189,7 +189,7 @@ dependencies: + - libxslt=1.1.39=h76b75d6_0 + - libzlib=1.3.1=hb9d3cd8_2 + - linbox=1.7.0=h7298d08_1 +- - llvm-openmp=19.1.6=h024ca30_0 ++ - llvm-openmp=19.1.7=h024ca30_0 + - lrcalc=2.1=h5888daf_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hae5d5c5_1006 +@@ -207,22 +207,22 @@ dependencies: + - mpfr=4.2.1=h90cbb55_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h266115a_3 +- - mysql-libs=9.0.1=he0572af_3 ++ - mysql-common=9.0.1=h266115a_4 ++ - mysql-libs=9.0.1=he0572af_4 + - nauty=2.8.8=hd590300_1 +- - ncurses=6.5=he02047a_1 ++ - ncurses=6.5=h2d0b736_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h297d8ca_0 + - ntl=11.4.3=hef3c4d3_1 +- - numpy=1.26.4=py311h64a7726_0 ++ - numpy=2.2.2=py311h5d046bc_0 + - openblas=0.3.28=pthreads_h6ec200e_1 + - openjpeg=2.5.3=h5fbd93e_0 + - openldap=2.6.9=he970967_0 +- - openssl=3.4.0=hb9d3cd8_0 ++ - openssl=3.4.0=h7b32b05_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h36c2ea0_0 +- - pari=2.15.5=h4d4ae9b_2_pthread ++ - pari=2.17.1=ha40142e_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -232,7 +232,7 @@ dependencies: + - perl=5.32.1=7_hd590300_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311h49e9ac3_0 ++ - pillow=11.1.0=py311h1322bbf_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h29eaf8c_0 + - pkg-config=0.29.2=h4bc722e_1009 +@@ -241,18 +241,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h6ec01c2_1006 +- - pplpy=0.8.9=py311ha9f9f00_1 +- - primecount=7.9=hcb278e6_0 +- - primecountpy=0.1.0=py311h9547e67_4 +- - primesieve=11.1=h59595ed_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311h9ecbd09_0 ++ - pplpy=0.8.9=py311h17071fb_2 ++ - primecount=7.14=h530483c_0 ++ - primecountpy=0.1.0=py311hd18a35c_5 ++ - primesieve=12.4=he02047a_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311h9ecbd09_0 + - pthread-stubs=0.4=hb9d3cd8_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py311h9053184_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -266,43 +266,43 @@ dependencies: + - pyzmq=26.2.0=py311h7deb3e3_3 + - qd=2.3.22=h2cc385e_1004 + - qhull=2020.2=h434a139_5 +- - qt6-main=6.8.1=h9d28a51_0 ++ - qt6-main=6.8.1=h588cce1_2 + - readline=8.2=h8228510_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=hd590300_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311he9a78e4_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311hc1ac118_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hc910cb2_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h9eae976_0 ++ - sqlite=3.48.0=h9eae976_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hcb278e6_0 +- - sympow=2.023.6=hc6ab17c_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-64=2.17=h4a8ded7_18 ++ - sympow=2.023.6=h3028977_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-64=2.17=h0157908_18 + - tachyon=0.99b6=hba7d16a_1002 + - tk=8.6.13=noxft_h4845f30_101 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py311h9ecbd09_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311h9ecbd09_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311h9ecbd09_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h3e06ad9_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.11-macos-x86_64.yml b/environment-3.11-macos-x86_64.yml +index fb34c25a567..b68c0feb98e 100644 +--- a/environment-3.11-macos-x86_64.yml ++++ b/environment-3.11-macos-x86_64.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-64 +-# input_hash: 58971dc791eb5f5f7e12b0e44db07ecd9b2fc48def89f671effaabd2bd0720d6 ++# input_hash: 8fa3ecd8c3d833b875f3db11bdea6e4c970fe7eae9e991e45ec6979be4e7b00f + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_hf81eadf_101 ++ - arpack=3.9.1=nompi_hdfe9103_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hed12c24_1 + - automake=1.17=pl5321h694c41f_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h940c156_0 ++ - bdw-gc=8.2.8=h240833e_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osx64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py311hd89902b_2 + - bzip2=1.0.8=hfdf4475_7 + - c-ares=1.34.4=hf13058a_0 +- - c-compiler=1.8.0=hfc4bf79_1 ++ - c-compiler=1.9.0=h09a7c41_0 + - ca-certificates=2024.12.14=h8857fd0_0 +- - cctools=1010.6=h5b2de21_2 +- - cctools_osx-64=1010.6=hea4301f_2 ++ - cctools=1010.6=hd3558d4_2 ++ - cctools_osx-64=1010.6=h00edd4c_2 + - cddlib=1!0.94m=h0f52abe_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311h137bacd_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_he371ed4_7 +- - clang-17=17.0.6=default_hb173f14_7 +- - clang_impl_osx-64=17.0.6=h1af8efd_23 +- - clang_osx-64=17.0.6=h7e5c614_23 +- - clangxx=17.0.6=default_he371ed4_7 +- - clangxx_impl_osx-64=17.0.6=hc3430b7_23 +- - clangxx_osx-64=17.0.6=h7e5c614_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h179603d_5 ++ - clang-18=18.1.8=default_h0c94c6a_5 ++ - clang_impl_osx-64=18.1.8=h6a44ed1_23 ++ - clang_osx-64=18.1.8=h7e5c614_23 ++ - clangxx=18.1.8=default_h179603d_5 ++ - clangxx_impl_osx-64=18.1.8=h4b7810f_23 ++ - clangxx_osx-64=18.1.8=h7e5c614_23 + - cliquer=1.22=h10d778d_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h1020d70_2 +- - compiler-rt_osx-64=17.0.6=hf2b8a54_2 ++ - compiler-rt=18.1.8=h1020d70_1 ++ - compiler-rt_osx-64=18.1.8=hf2b8a54_1 + - contourpy=1.3.1=py311h4e34fa0_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311ha3cf9ac_0 ++ - coverage=7.6.10=py311ha3cf9ac_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=h385f146_1 ++ - cxx-compiler=1.9.0=h20888b2_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311h4fde0ae_0 +- - cysignals=1.11.2=py311h8a58447_3 ++ - cypari2=2.2.1=py311h29339b9_0 ++ - cysignals=1.12.3=py311hc356e98_0 + - cython=3.0.11=py311h4cb39f0_3 +- - debugpy=1.8.11=py311hc356e98_0 ++ - debugpy=1.8.12=py311hc356e98_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=24.5.10=h56bac16_0 +- - eclib=20231212=h960c116_1 ++ - eclib=20231212=ha63dd29_2 + - ecm=7.0.5=h4f6b447_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h37eeddb_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311ha3cf9ac_0 +- - fortran-compiler=1.8.0=h33d1f46_1 +- - fplll=5.4.5=hb7981ad_0 +- - fpylll=0.6.1=py311h85fbf69_0 ++ - fonttools=4.55.6=py311ha3cf9ac_0 ++ - fortran-compiler=1.9.0=h02557f8_0 ++ - fplll=5.5.0=h6ede486_0 ++ - fpylll=0.6.2=py311h793c761_0 + - freetype=2.12.1=h60636b9_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=hb9686a1_1 +- - gap-defaults=4.14.0=h694c41f_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=hb9686a1_2 ++ - gap-defaults=4.14.0=h694c41f_2 + - gettext=0.22.5=hdfe23c8_3 + - gettext-tools=0.22.5=hdfe23c8_3 + - gf2x=1.3.0=h35ac7d9_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h2c809b3_1 + - gfortran_impl_osx-64=13.2.0=h2bc304d_3 + - gfortran_osx-64=13.2.0=h18f7dce_1 +- - giac=1.9.0.21=h92f3f65_1 ++ - giac=1.9.0.21=h381f543_2 + - givaro=4.2.0=h1b3d6f7_0 + - glpk=5.0=h3cb5acd_0 + - gmp=6.3.0=hf036a51_2 + - gmpy2=2.1.5=py311h7945f45_3 + - gsl=2.7=h93259b0_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=h120a0e1_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h5479cbe_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h61918c1_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h2e86a7b_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kiwisolver=1.4.7=py311hf2f7c97_0 + - krb5=1.21.3=h37d8d59_0 +- - lcalc=2.0.5=h547a6ed_2 ++ - lcalc=2.0.5=h0f747f7_3 + - lcms2=2.16=ha2f27b4_0 +- - ld64=951.9=h0a3eb4e_2 +- - ld64_osx-64=951.9=h5ffbe8e_2 ++ - ld64=951.9=h4e51db5_2 ++ - ld64_osx-64=951.9=hc8d1a19_2 + - lerc=4.0.0=hb486fe8_0 + - libasprintf=0.22.5=hdfe23c8_3 + - libasprintf-devel=0.22.5=hdfe23c8_3 +@@ -130,17 +130,17 @@ dependencies: + - libbrotlidec=1.1.0=h00291cd_2 + - libbrotlienc=1.1.0=h00291cd_2 + - libcblas=3.9.0=26_osx64_openblas +- - libclang-cpp17=17.0.6=default_hb173f14_7 ++ - libclang-cpp18.1=18.1.8=default_h0c94c6a_5 + - libcurl=8.11.1=h5dec5d8_0 +- - libcxx=19.1.6=hf95d169_1 +- - libcxx-devel=17.0.6=h8f8a49f_6 ++ - libcxx=19.1.7=hf95d169_0 ++ - libcxx-devel=18.1.8=h7c275be_7 + - libdeflate=1.23=he65b83e_0 +- - libedit=3.1.20191231=h0678c8f_2 ++ - libedit=3.1.20240808=pl5321ha958ccf_0 + - libev=4.33=h10d778d_2 + - libexpat=2.6.4=h240833e_0 + - libffi=3.4.2=h0d85af4_5 +- - libflint=3.1.2=h1d27844_101 +- - libgd=2.3.3=h2e77e4f_10 ++ - libflint=3.1.3.1=h9ab60bc_101 ++ - libgd=2.3.3=h8555400_11 + - libgettextpo=0.22.5=hdfe23c8_3 + - libgettextpo-devel=0.22.5=hdfe23c8_3 + - libgfortran=5.0.0=13_2_0_h97931a8_3 +@@ -153,23 +153,24 @@ dependencies: + - libjpeg-turbo=3.0.0=h0dc2134_1 + - liblapack=3.9.0=26_osx64_openblas + - liblapacke=3.9.0=26_osx64_openblas +- - libllvm17=17.0.6=hbedff68_1 ++ - libllvm18=18.1.8=h9ce406d_2 + - liblzma=5.6.3=hd471939_1 + - liblzma-devel=5.6.3=hd471939_1 + - libnghttp2=1.64.0=hc7306c3_0 + - libopenblas=0.3.28=openmp_hbf64a52_1 +- - libpng=1.6.44=h4b8f8c9_0 ++ - libpng=1.6.45=h3c4a55f_0 + - libsodium=1.0.20=hfdf4475_0 +- - libsqlite=3.47.2=hdb6dae5_0 ++ - libsqlite=3.48.0=hdb6dae5_1 + - libssh2=1.11.1=h3dc7d44_0 + - libtiff=4.7.0=hb77a491_3 +- - libwebp-base=1.4.0=h10d778d_0 ++ - libwebp-base=1.5.0=h6cf52b4_0 + - libxcb=1.17.0=hf1f96e2_0 + - libxml2=2.13.5=hebb159f_1 + - libzlib=1.3.1=hd23fc13_2 + - linbox=1.7.0=h9325161_1 +- - llvm-openmp=19.1.6=ha54dae1_0 +- - llvm-tools=17.0.6=hbedff68_1 ++ - llvm-openmp=19.1.7=ha54dae1_0 ++ - llvm-tools=18.1.8=h9ce406d_2 ++ - llvm-tools-18=18.1.8=h9ce406d_2 + - lrcalc=2.1=hac325c4_7 + - m4=1.4.18=haf1e3a3_1001 + - m4ri=20140914=hd82a5f3_1006 +@@ -188,18 +189,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h10d778d_1 +- - ncurses=6.5=hf036a51_1 ++ - ncurses=6.5=h0622a9a_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h3c5361c_0 + - ntl=11.4.3=h0ab3c2f_1 +- - numpy=1.26.4=py311hc43a94b_0 ++ - numpy=2.2.2=py311h27c81cd_0 + - openblas=0.3.28=openmp_h30af337_1 + - openjpeg=2.5.3=h7fd6d84_0 +- - openssl=3.4.0=hd471939_0 ++ - openssl=3.4.0=hc426f3f_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hbcb3906_0 +- - pari=2.15.5=h7ba67ff_2_pthread ++ - pari=2.17.1=h1ed0f1a_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -208,7 +209,7 @@ dependencies: + - perl=5.32.1=7_h10d778d_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311h1f68098_0 ++ - pillow=11.1.0=py311h25da234_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hf7e621a_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -216,18 +217,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=ha60d53e_1006 +- - pplpy=0.8.9=py311h922ec50_1 +- - primecount=7.6=ha894c9a_0 +- - primecountpy=0.1.0=py311h5fe6e05_4 +- - primesieve=11.0=hf0c8a7f_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311h1314207_0 ++ - pplpy=0.8.9=py311h221ab62_2 ++ - primecount=7.14=h28dbb38_0 ++ - primecountpy=0.1.0=py311h4e34fa0_5 ++ - primesieve=12.4=hf036a51_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311h4d7f069_0 + - pthread-stubs=0.4=h00291cd_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -246,27 +247,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311h86b91e6_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311h9d25053_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h88f4db0_0 + - singular=4.4.0=h604985e_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h2e4c9dc_0 ++ - sqlite=3.48.0=h2e4c9dc_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hf0c8a7f_0 +- - sympow=2.023.6=h115ba6a_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=h7305399_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=h3a1d103_1002 + - tapi=1300.6.5=h390ca13_0 + - tk=8.6.13=h1abcd95_1 +@@ -274,9 +275,9 @@ dependencies: + - tornado=6.4.2=py311h4d7f069_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311h1314207_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311h4d7f069_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/environment-3.11-macos.yml b/environment-3.11-macos.yml +index ec10b78a4b5..84656e580e0 100644 +--- a/environment-3.11-macos.yml ++++ b/environment-3.11-macos.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-arm64 +-# input_hash: 4396163dbc4fafd471282f306c16bb7bd73ecc3c006335c8faf512742014e1e4 ++# input_hash: 5e8fbac460b9515b4cab214ac84ab31b22e5e12e86962f7770faaa3a3c662466 + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_h593882a_101 ++ - arpack=3.9.1=nompi_h1f29f7c_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hcd07c0c_1 + - automake=1.17=pl5321hce30654_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hc021e02_0 ++ - bdw-gc=8.2.8=h286801f_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osxarm64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py311h3f08180_2 + - bzip2=1.0.8=h99b78c6_7 + - c-ares=1.34.4=h5505292_0 +- - c-compiler=1.8.0=hf48404e_1 ++ - c-compiler=1.9.0=hdf49b6b_0 + - ca-certificates=2024.12.14=hf0a4a13_0 +- - cctools=1010.6=hf67d63f_2 +- - cctools_osx-arm64=1010.6=h623e0ac_2 ++ - cctools=1010.6=h4c9edd9_2 ++ - cctools_osx-arm64=1010.6=h908b477_2 + - cddlib=1!0.94m=h6d7a090_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311h3a79f62_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_h360f5da_7 +- - clang-17=17.0.6=default_h146c034_7 +- - clang_impl_osx-arm64=17.0.6=he47c785_23 +- - clang_osx-arm64=17.0.6=h07b0088_23 +- - clangxx=17.0.6=default_h360f5da_7 +- - clangxx_impl_osx-arm64=17.0.6=h50f59cd_23 +- - clangxx_osx-arm64=17.0.6=h07b0088_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h675cc0c_5 ++ - clang-18=18.1.8=default_h5c12605_5 ++ - clang_impl_osx-arm64=18.1.8=h2ae9ea5_23 ++ - clang_osx-arm64=18.1.8=h07b0088_23 ++ - clangxx=18.1.8=default_h675cc0c_5 ++ - clangxx_impl_osx-arm64=18.1.8=h555f467_23 ++ - clangxx_osx-arm64=18.1.8=h07b0088_23 + - cliquer=1.22=h93a5062_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h856b3c1_2 +- - compiler-rt_osx-arm64=17.0.6=h832e737_2 ++ - compiler-rt=18.1.8=h856b3c1_1 ++ - compiler-rt_osx-arm64=18.1.8=h832e737_1 + - contourpy=1.3.1=py311h210dab8_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311h4921393_0 ++ - coverage=7.6.10=py311h4921393_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=h18dbf2f_1 ++ - cxx-compiler=1.9.0=hba80287_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311h2c49a9d_0 +- - cysignals=1.11.2=py311he42fc87_3 ++ - cypari2=2.2.1=py311haabaa81_0 ++ - cysignals=1.12.3=py311h155a34a_0 + - cython=3.0.11=py311hf7f79b8_3 +- - debugpy=1.8.11=py311h155a34a_0 ++ - debugpy=1.8.12=py311h155a34a_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=23.9.9=h1d9728a_0 +- - eclib=20231212=h3d50bd9_1 ++ - eclib=20231212=hc39b9a7_2 + - ecm=7.0.5=h41d338b_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h1383a14_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311h4921393_0 +- - fortran-compiler=1.8.0=hc3477c4_1 +- - fplll=5.4.5=hb7d509d_0 +- - fpylll=0.6.1=py311h341b96b_0 ++ - fonttools=4.55.6=py311h4921393_0 ++ - fortran-compiler=1.9.0=h5692697_0 ++ - fplll=5.5.0=h2a2278a_0 ++ - fpylll=0.6.2=py311h4044dbd_0 + - freetype=2.12.1=hadb7bae_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h25f1785_1 +- - gap-defaults=4.14.0=hce30654_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h25f1785_2 ++ - gap-defaults=4.14.0=hce30654_2 + - gettext=0.22.5=h8414b35_3 + - gettext-tools=0.22.5=h8414b35_3 + - gf2x=1.3.0=hf8f8af4_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h1ca8e4b_1 + - gfortran_impl_osx-arm64=13.2.0=h252ada1_3 + - gfortran_osx-arm64=13.2.0=h57527a5_1 +- - giac=1.9.0.21=h1c96721_1 ++ - giac=1.9.0.21=h573964a_2 + - givaro=4.2.0=h018886a_0 + - glpk=5.0=h6d7a090_0 + - gmp=6.3.0=h7bae524_2 + - gmpy2=2.1.5=py311hb5d9ff4_3 + - gsl=2.7=h6e638da_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hfee45f7_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h3fe6531_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=hd73f12c_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h347afa1_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kiwisolver=1.4.7=py311h2c37856_0 + - krb5=1.21.3=h237132a_0 +- - lcalc=2.0.5=h4a402bc_2 ++ - lcalc=2.0.5=hdaf6845_3 + - lcms2=2.16=ha0e7c42_0 +- - ld64=951.9=h39a299f_2 +- - ld64_osx-arm64=951.9=h3f9b568_2 ++ - ld64=951.9=h4c6efb1_2 ++ - ld64_osx-arm64=951.9=hfc0fa09_2 + - lerc=4.0.0=h9a09cb3_0 + - libasprintf=0.22.5=h8414b35_3 + - libasprintf-devel=0.22.5=h8414b35_3 +@@ -130,23 +130,23 @@ dependencies: + - libbrotlidec=1.1.0=hd74edd7_2 + - libbrotlienc=1.1.0=hd74edd7_2 + - libcblas=3.9.0=26_osxarm64_openblas +- - libclang-cpp17=17.0.6=default_h146c034_7 ++ - libclang-cpp18.1=18.1.8=default_h5c12605_5 + - libcurl=8.11.1=h73640d1_0 +- - libcxx=19.1.6=ha82da77_1 +- - libcxx-devel=17.0.6=h86353a2_6 ++ - libcxx=19.1.7=ha82da77_0 ++ - libcxx-devel=18.1.8=h6dc3340_7 + - libdeflate=1.23=hec38601_0 +- - libedit=3.1.20191231=hc8eb9b7_2 ++ - libedit=3.1.20240808=pl5321hafb1f1b_0 + - libev=4.33=h93a5062_2 + - libexpat=2.6.4=h286801f_0 + - libffi=3.4.2=h3422bc3_5 +- - libflint=3.1.2=he28cf6d_101 +- - libgd=2.3.3=hac1b3a8_10 ++ - libflint=3.1.3.1=ha3035ea_101 ++ - libgd=2.3.3=hb2c3a21_11 + - libgettextpo=0.22.5=h8414b35_3 + - libgettextpo-devel=0.22.5=h8414b35_3 + - libgfortran=5.0.0=13_2_0_hd922786_3 + - libgfortran-devel_osx-arm64=13.2.0=h5d7a38c_3 + - libgfortran5=13.2.0=hf226fd6_3 +- - libglib=2.82.2=h07bd6cf_0 ++ - libglib=2.82.2=hdff4504_1 + - libhomfly=1.02r6=h93a5062_1 + - libiconv=1.17=h0d3ecfb_2 + - libintl=0.22.5=h8414b35_3 +@@ -154,23 +154,24 @@ dependencies: + - libjpeg-turbo=3.0.0=hb547adb_1 + - liblapack=3.9.0=26_osxarm64_openblas + - liblapacke=3.9.0=26_osxarm64_openblas +- - libllvm17=17.0.6=h5090b49_2 ++ - libllvm18=18.1.8=h5090b49_2 + - liblzma=5.6.3=h39f12f2_1 + - liblzma-devel=5.6.3=h39f12f2_1 + - libnghttp2=1.64.0=h6d7220d_0 + - libopenblas=0.3.28=openmp_hf332438_1 +- - libpng=1.6.44=hc14010f_0 ++ - libpng=1.6.45=h3783ad8_0 + - libsodium=1.0.20=h99b78c6_0 +- - libsqlite=3.47.2=h3f77e49_0 ++ - libsqlite=3.48.0=h3f77e49_1 + - libssh2=1.11.1=h9cc3647_0 + - libtiff=4.7.0=h551f018_3 +- - libwebp-base=1.4.0=h93a5062_0 ++ - libwebp-base=1.5.0=h2471fea_0 + - libxcb=1.17.0=hdb1d25a_0 + - libxml2=2.13.5=h178c5d8_1 + - libzlib=1.3.1=h8359307_2 + - linbox=1.7.0=h9da6ecd_1 +- - llvm-openmp=19.1.6=hdb05f8b_0 +- - llvm-tools=17.0.6=h5090b49_2 ++ - llvm-openmp=19.1.7=hdb05f8b_0 ++ - llvm-tools=18.1.8=h5090b49_2 ++ - llvm-tools-18=18.1.8=h5090b49_2 + - lrcalc=2.1=hf9b8971_7 + - m4=1.4.18=h642e427_1001 + - m4ri=20140914=hc97c1ff_1006 +@@ -189,18 +190,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h93a5062_1 +- - ncurses=6.5=h7bae524_1 ++ - ncurses=6.5=h5e97a16_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h420ef59_0 + - ntl=11.4.3=hbb3f309_1 +- - numpy=1.26.4=py311h7125741_0 ++ - numpy=2.2.2=py311h762c074_0 + - openblas=0.3.28=openmp_hea878ba_1 + - openjpeg=2.5.3=h8a3d83b_0 +- - openssl=3.4.0=h39f12f2_0 ++ - openssl=3.4.0=h81ee809_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h27ca646_0 +- - pari=2.15.5=h4f2304c_2_pthread ++ - pari=2.17.1=h49d18c7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -210,7 +211,7 @@ dependencies: + - perl=5.32.1=7_h4614cfb_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311h3894ae9_0 ++ - pillow=11.1.0=py311hb9ba9e9_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hde07d2e_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -218,18 +219,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h8b147cf_1006 +- - pplpy=0.8.9=py311h3d77d83_1 +- - primecount=7.6=hb6e4faa_0 +- - primecountpy=0.1.0=py311he4fd1f5_4 +- - primesieve=11.0=hb7217d7_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311hae2e1ce_0 ++ - pplpy=0.8.9=py311h911f23a_2 ++ - primecount=7.14=ha84d530_0 ++ - primecountpy=0.1.0=py311h210dab8_5 ++ - primesieve=12.4=h00cdb27_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311h917b07b_0 + - pthread-stubs=0.4=hd74edd7_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -248,27 +249,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311hf056e50_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311h809cfb5_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h44b9a77_0 + - singular=4.4.0=h5a8969a_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=hd7222ec_0 ++ - sqlite=3.48.0=hd7222ec_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hb7217d7_0 +- - sympow=2.023.6=hb0babe8_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=hc13a52f_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=hb8a568e_1002 + - tapi=1300.6.5=h03f4b80_0 + - tk=8.6.13=h5083fa2_1 +@@ -276,9 +277,9 @@ dependencies: + - tornado=6.4.2=py311h917b07b_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311hae2e1ce_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311h917b07b_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/environment-3.12-linux-aarch64.yml b/environment-3.12-linux-aarch64.yml +index b97f90268d1..2446ad05b1c 100644 +--- a/environment-3.12-linux-aarch64.yml ++++ b/environment-3.12-linux-aarch64.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-aarch64 +-# input_hash: 28dba81f3f7cbaa4e6f35a34c9679049f47c3d73414a0a80eda04a53603e8a12 ++# input_hash: 7a6a0ff484e658c4a62a4eaf83b31a521a92aa6e6681138a6c141b28e7fa0c44 + + channels: + - conda-forge +@@ -9,12 +9,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=h86ecc28_0 +- - arpack=3.9.1=nompi_hd363cd0_101 ++ - arpack=3.9.1=nompi_h6fc4d3a_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2148fe1_1 + - automake=1.17=pl5321h8af1aa0_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hd62202e_0 ++ - bdw-gc=8.2.8=h5ad3122_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=hf1166c9_2 + - binutils_impl_linux-aarch64=2.43=h4c662bb_2 +@@ -28,33 +28,33 @@ dependencies: + - brotli-python=1.1.0=py312h6f74592_2 + - bzip2=1.0.8=h68df207_7 + - c-ares=1.34.4=h86ecc28_0 +- - c-compiler=1.8.0=h6561dab_1 ++ - c-compiler=1.9.0=h6561dab_0 + - ca-certificates=2024.12.14=hcefe29a_0 + - cairo=1.18.2=h83712da_1 + - cddlib=1!0.94m=h719063d_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312hac81daf_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=h31becfc_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py312h451a7dd_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h74ce7d3_0 ++ - coverage=7.6.10=py312h74ce7d3_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=heb6c788_1 ++ - cxx-compiler=1.9.0=heb6c788_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h7f7bc3d_0 ++ - cypari2=2.2.1=py312hb80cc37_0 + - cyrus-sasl=2.1.27=hf6b2984_7 +- - cysignals=1.11.2=py312haf3d6d2_3 ++ - cysignals=1.12.3=py312h6f74592_0 + - cython=3.0.11=py312hdfe4e29_3 + - dbus=1.13.6=h12b9eeb_3 +- - debugpy=1.8.11=py312h6f74592_0 ++ - debugpy=1.8.12=py312h6f74592_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h2f0025b_0 + - ecl=24.5.10=h5567cc5_0 +- - eclib=20231212=h154513d_1 ++ - eclib=20231212=h4705ef2_2 + - ecm=7.0.5=ha2d0fc4_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -68,14 +68,14 @@ dependencies: + - fontconfig=2.15.0=h8dda3cd_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312hcc812fe_0 +- - fortran-compiler=1.8.0=h25a59a9_1 +- - fplll=5.4.5=hb3a790e_0 +- - fpylll=0.6.1=py312h8b93be1_0 ++ - fonttools=4.55.6=py312hcc812fe_0 ++ - fortran-compiler=1.9.0=h25a59a9_0 ++ - fplll=5.5.0=h45c7457_0 ++ - fpylll=0.6.2=py312h37c3976_0 + - freetype=2.12.1=hf0a5ef3_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h1754e88_1 +- - gap-defaults=4.14.0=h8af1aa0_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h1754e88_2 ++ - gap-defaults=4.14.0=h8af1aa0_2 + - gcc=13.3.0=h8a56e6e_1 + - gcc_impl_linux-aarch64=13.3.0=hcdea9b6_1 + - gcc_linux-aarch64=13.3.0=h1cd514b_7 +@@ -84,7 +84,7 @@ dependencies: + - gfortran=13.3.0=h8a56e6e_1 + - gfortran_impl_linux-aarch64=13.3.0=h174a3c4_1 + - gfortran_linux-aarch64=13.3.0=h2809cf8_7 +- - giac=1.9.0.21=h04922a4_1 ++ - giac=1.9.0.21=h6e4ddb9_2 + - givaro=4.2.0=h364d21b_0 + - glpk=5.0=h66325d0_0 + - gmp=6.3.0=h0a1ffab_2 +@@ -95,29 +95,29 @@ dependencies: + - gxx_impl_linux-aarch64=13.3.0=h1211b58_1 + - gxx_linux-aarch64=13.3.0=h2864abd_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hbf49d6b_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h785c1aa_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hf9b3779_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h207f3e5_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h15043fe_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kernel-headers_linux-aarch64=4.18.0=h05a177a_18 + - keyutils=1.6.1=h4e544f5_0 +- - kiwisolver=1.4.7=py312h88dc405_0 ++ - kiwisolver=1.4.8=py312h17cf362_0 + - krb5=1.21.3=h50a48e9_0 +- - lcalc=2.0.5=he588f68_2 ++ - lcalc=2.0.5=h30a6b3d_3 + - lcms2=2.16=h922389a_0 + - ld_impl_linux-aarch64=2.43=h80caac9_2 + - lerc=4.0.0=h4de3ea5_0 +@@ -131,27 +131,27 @@ dependencies: + - libbrotlidec=1.1.0=h86ecc28_2 + - libbrotlienc=1.1.0=h86ecc28_2 + - libcblas=3.9.0=26_linuxaarch64_openblas +- - libclang-cpp19.1=19.1.6=default_he324ac1_0 +- - libclang13=19.1.6=default_h4390ef5_0 ++ - libclang-cpp19.1=19.1.7=default_he324ac1_0 ++ - libclang13=19.1.7=default_h4390ef5_0 + - libcups=2.3.3=h405e4a8_4 + - libcurl=8.11.1=h6702fde_0 + - libdeflate=1.23=h5e3c512_0 + - libdrm=2.4.124=h86ecc28_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h976ea20_0 + - libegl=1.7.0=hd24410f_2 + - libev=4.33=h31becfc_2 + - libexpat=2.6.4=h5ad3122_0 + - libffi=3.4.2=h3557bc0_5 +- - libflint=3.1.2=h0433c20_101 ++ - libflint=3.1.3.1=hf9b8075_101 + - libgcc=14.2.0=he277a41_1 + - libgcc-devel_linux-aarch64=13.3.0=h0c07274_101 + - libgcc-ng=14.2.0=he9431aa_1 +- - libgd=2.3.3=h6818b27_10 ++ - libgd=2.3.3=hc8d7b1d_11 + - libgfortran=14.2.0=he9431aa_1 + - libgfortran-ng=14.2.0=he9431aa_1 + - libgfortran5=14.2.0=hb6113d0_1 + - libgl=1.7.0=hd24410f_2 +- - libglib=2.82.2=hc486b8e_0 ++ - libglib=2.82.2=hc486b8e_1 + - libglvnd=1.7.0=hd24410f_2 + - libglx=1.7.0=hd24410f_2 + - libgomp=14.2.0=he277a41_1 +@@ -160,7 +160,7 @@ dependencies: + - libjpeg-turbo=3.0.0=h31becfc_1 + - liblapack=3.9.0=26_linuxaarch64_openblas + - liblapacke=3.9.0=26_linuxaarch64_openblas +- - libllvm19=19.1.6=h2edbd07_0 ++ - libllvm19=19.1.7=h2edbd07_0 + - liblzma=5.6.3=h86ecc28_1 + - liblzma-devel=5.6.3=h86ecc28_1 + - libnghttp2=1.64.0=hc8609a4_0 +@@ -169,18 +169,18 @@ dependencies: + - libopenblas=0.3.28=pthreads_h9d3fd7e_1 + - libopengl=1.7.0=hd24410f_2 + - libpciaccess=0.18=h31becfc_0 +- - libpng=1.6.44=hc4a20ef_0 ++ - libpng=1.6.45=hec79eb8_0 + - libpq=17.2=hd56632b_1 + - libsanitizer=13.3.0=ha58e236_1 + - libsodium=1.0.20=h68df207_0 +- - libsqlite=3.47.2=h5eb1b54_0 ++ - libsqlite=3.48.0=h5eb1b54_1 + - libssh2=1.11.1=ha41c0db_0 + - libstdcxx=14.2.0=h3f4de04_1 + - libstdcxx-devel_linux-aarch64=13.3.0=h0c07274_101 + - libstdcxx-ng=14.2.0=hf1166c9_1 + - libtiff=4.7.0=h88f7998_3 + - libuuid=2.38.1=hb4cce97_0 +- - libwebp-base=1.4.0=h31becfc_0 ++ - libwebp-base=1.5.0=h0886dbf_0 + - libxcb=1.17.0=h262b8f6_0 + - libxcrypt=4.4.36=h31becfc_1 + - libxkbcommon=1.7.0=h46f2afe_1 +@@ -188,7 +188,7 @@ dependencies: + - libxslt=1.1.39=h1cc9640_0 + - libzlib=1.3.1=h86ecc28_2 + - linbox=1.7.0=hf74d613_1 +- - llvm-openmp=19.1.6=h013ceaa_0 ++ - llvm-openmp=19.1.7=h013ceaa_0 + - lrcalc=2.1=h5ad3122_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hedfd65a_1006 +@@ -206,22 +206,22 @@ dependencies: + - mpfr=4.2.1=h2305555_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h3f5c77f_3 +- - mysql-libs=9.0.1=h11569fd_3 ++ - mysql-common=9.0.1=h3f5c77f_4 ++ - mysql-libs=9.0.1=h11569fd_4 + - nauty=2.8.8=h31becfc_1 +- - ncurses=6.5=hcccb83c_1 ++ - ncurses=6.5=ha32ae93_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h70be974_0 + - ntl=11.4.3=h0d7519b_1 +- - numpy=1.26.4=py312h470d778_0 ++ - numpy=2.2.2=py312hce01fe4_0 + - openblas=0.3.28=pthreads_h3a8cbd8_1 + - openjpeg=2.5.3=h3f56577_0 + - openldap=2.6.9=h30c48ee_0 +- - openssl=3.4.0=h86ecc28_0 ++ - openssl=3.4.0=hd08dc88_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hb9de7d4_0 +- - pari=2.15.5=h169c2a7_2_pthread ++ - pari=2.17.1=h45cace7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -231,7 +231,7 @@ dependencies: + - perl=5.32.1=7_h31becfc_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312h5ab5af3_0 ++ - pillow=11.1.0=py312h719f0cf_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h86a87f0_0 + - pkg-config=0.29.2=hce167ba_1009 +@@ -240,18 +240,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h984aac9_1006 +- - pplpy=0.8.9=py312hbd99ab9_1 +- - primecount=7.9=hd600fc2_0 +- - primecountpy=0.1.0=py312h8f0b210_4 +- - primesieve=11.1=h2f0025b_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312hb2c0f52_0 ++ - pplpy=0.8.9=py312h372cae2_2 ++ - primecount=7.14=hfe4b40e_0 ++ - primecountpy=0.1.0=py312h451a7dd_5 ++ - primesieve=12.4=h0a1ffab_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312hb2c0f52_0 + - pthread-stubs=0.4=h86ecc28_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py312hdd999d0_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -265,43 +265,43 @@ dependencies: + - pyzmq=26.2.0=py312h2427ae1_3 + - qd=2.3.22=h05efe27_1004 + - qhull=2020.2=h70be974_5 +- - qt6-main=6.8.1=h0d3cc05_0 ++ - qt6-main=6.8.1=ha0a94ed_2 + - readline=8.2=h8fc344f_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=h31becfc_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312hcbff3fa_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312h9941453_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hee12f27_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h578a6b9_0 ++ - sqlite=3.48.0=h578a6b9_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hd600fc2_0 +- - sympow=2.023.6=h157afb5_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-aarch64=2.17=h5b4a56d_18 ++ - sympow=2.023.6=h4d450c3_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-aarch64=2.17=h68829e0_18 + - tachyon=0.99b6=ha0bfc61_1002 + - tk=8.6.13=h194ca79_0 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py312h52516f5_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312hb2c0f52_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312hb2c0f52_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h698ed42_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.12-linux.yml b/environment-3.12-linux.yml +index 7b2496e151e..f6deedb5a15 100644 +--- a/environment-3.12-linux.yml ++++ b/environment-3.12-linux.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-64 +-# input_hash: 40be535db1c7eaa6a4654bde814ad7958eb5c8b150e3158a6897927158b3bd6f ++# input_hash: ab81a8abe5ec503808a2489bef4941922b01008bd685fc411d26594a68155fbd + + channels: + - conda-forge +@@ -10,12 +10,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=hb9d3cd8_0 +- - arpack=3.9.1=nompi_h77f6705_101 ++ - arpack=3.9.1=nompi_hf03ea27_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2b4cb7a_1 + - automake=1.17=pl5321ha770c72_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h4bd325d_0 ++ - bdw-gc=8.2.8=h5888daf_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=h4852527_2 + - binutils_impl_linux-64=2.43=h4bf12b8_2 +@@ -29,33 +29,33 @@ dependencies: + - brotli-python=1.1.0=py312h2ec8cdc_2 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.4=hb9d3cd8_0 +- - c-compiler=1.8.0=h2b85faf_1 ++ - c-compiler=1.9.0=h2b85faf_0 + - ca-certificates=2024.12.14=hbcca054_0 + - cairo=1.18.2=h3394656_1 + - cddlib=1!0.94m=h9202a9a_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312h06ac9bb_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=hd590300_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py312h68727a3_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h178313f_0 ++ - coverage=7.6.10=py312h178313f_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=h1a2810e_1 ++ - cxx-compiler=1.9.0=h1a2810e_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h597db99_0 ++ - cypari2=2.2.1=py312hb7bab4f_0 + - cyrus-sasl=2.1.27=h54b06d7_7 +- - cysignals=1.11.2=py312h9d3d55b_3 ++ - cysignals=1.12.3=py312h2ec8cdc_0 + - cython=3.0.11=py312h8fd2918_3 + - dbus=1.13.6=h5008d03_3 +- - debugpy=1.8.11=py312h2ec8cdc_0 ++ - debugpy=1.8.12=py312h2ec8cdc_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h59595ed_0 + - ecl=24.5.10=h0f3afd4_0 +- - eclib=20231212=h43e5eba_1 ++ - eclib=20231212=h75fb491_2 + - ecm=7.0.5=h9458935_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -69,14 +69,14 @@ dependencies: + - fontconfig=2.15.0=h7e30c49_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312h178313f_0 +- - fortran-compiler=1.8.0=h36df796_1 +- - fplll=5.4.5=h384768b_0 +- - fpylll=0.6.1=py312h59a3f1e_0 ++ - fonttools=4.55.6=py312h178313f_0 ++ - fortran-compiler=1.9.0=h36df796_0 ++ - fplll=5.5.0=hd20a173_0 ++ - fpylll=0.6.2=py312ha4ee43a_0 + - freetype=2.12.1=h267a509_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h3b03731_1 +- - gap-defaults=4.14.0=ha770c72_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h3b03731_2 ++ - gap-defaults=4.14.0=ha770c72_2 + - gcc=13.3.0=h9576a4e_1 + - gcc_impl_linux-64=13.3.0=hfea6d02_1 + - gcc_linux-64=13.3.0=hc28eda2_7 +@@ -85,7 +85,7 @@ dependencies: + - gfortran=13.3.0=h9576a4e_1 + - gfortran_impl_linux-64=13.3.0=h10434e7_1 + - gfortran_linux-64=13.3.0=hb919d3a_7 +- - giac=1.9.0.21=h673759e_1 ++ - giac=1.9.0.21=hca478b9_2 + - givaro=4.2.0=hb789bce_0 + - glpk=5.0=h445213a_0 + - gmp=6.3.0=hac33072_2 +@@ -96,29 +96,29 @@ dependencies: + - gxx_impl_linux-64=13.3.0=hdbfa832_1 + - gxx_linux-64=13.3.0=h6834431_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hda332d3_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h4bba637_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=he02047a_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=he44f51b_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h623f65a_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kernel-headers_linux-64=3.10.0=he073ed8_18 + - keyutils=1.6.1=h166bdaf_0 +- - kiwisolver=1.4.7=py312h68727a3_0 ++ - kiwisolver=1.4.8=py312h84d6215_0 + - krb5=1.21.3=h659f571_0 +- - lcalc=2.0.5=h5aac1b6_2 ++ - lcalc=2.0.5=h9cf73fc_3 + - lcms2=2.16=hb7c19ff_0 + - ld_impl_linux-64=2.43=h712a8e2_2 + - lerc=4.0.0=h27087fc_0 +@@ -132,27 +132,27 @@ dependencies: + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=26_linux64_openblas +- - libclang-cpp19.1=19.1.6=default_hb5137d0_0 +- - libclang13=19.1.6=default_h9c6a7e4_0 ++ - libclang-cpp19.1=19.1.7=default_hb5137d0_0 ++ - libclang13=19.1.7=default_h9c6a7e4_0 + - libcups=2.3.3=h4637d8d_4 + - libcurl=8.11.1=h332b0f4_0 + - libdeflate=1.23=h4ddbbb0_0 + - libdrm=2.4.124=hb9d3cd8_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h7949ede_0 + - libegl=1.7.0=ha4b6fd6_2 + - libev=4.33=hd590300_2 + - libexpat=2.6.4=h5888daf_0 + - libffi=3.4.2=h7f98852_5 +- - libflint=3.1.2=h6fb9888_101 ++ - libflint=3.1.3.1=h0aae882_101 + - libgcc=14.2.0=h77fa898_1 + - libgcc-devel_linux-64=13.3.0=h84ea5a7_101 + - libgcc-ng=14.2.0=h69a702a_1 +- - libgd=2.3.3=hd3e95f3_10 ++ - libgd=2.3.3=h6f5c62b_11 + - libgfortran=14.2.0=h69a702a_1 + - libgfortran-ng=14.2.0=h69a702a_1 + - libgfortran5=14.2.0=hd5240d6_1 + - libgl=1.7.0=ha4b6fd6_2 +- - libglib=2.82.2=h2ff4ddf_0 ++ - libglib=2.82.2=h2ff4ddf_1 + - libglvnd=1.7.0=ha4b6fd6_2 + - libglx=1.7.0=ha4b6fd6_2 + - libgomp=14.2.0=h77fa898_1 +@@ -161,27 +161,27 @@ dependencies: + - libjpeg-turbo=3.0.0=hd590300_1 + - liblapack=3.9.0=26_linux64_openblas + - liblapacke=3.9.0=26_linux64_openblas +- - libllvm19=19.1.6=ha7bfdaf_0 ++ - libllvm19=19.1.7=ha7bfdaf_0 + - liblzma=5.6.3=hb9d3cd8_1 + - liblzma-devel=5.6.3=hb9d3cd8_1 + - libnghttp2=1.64.0=h161d5f1_0 + - libnsl=2.0.1=hd590300_0 +- - libntlm=1.4=h7f98852_1002 ++ - libntlm=1.8=hb9d3cd8_0 + - libopenblas=0.3.28=pthreads_h94d23a6_1 + - libopengl=1.7.0=ha4b6fd6_2 + - libpciaccess=0.18=hd590300_0 +- - libpng=1.6.44=hadc24fc_0 ++ - libpng=1.6.45=h943b412_0 + - libpq=17.2=h3b95a9b_1 + - libsanitizer=13.3.0=heb74ff8_1 + - libsodium=1.0.20=h4ab18f5_0 +- - libsqlite=3.47.2=hee588c1_0 ++ - libsqlite=3.48.0=hee588c1_1 + - libssh2=1.11.1=hf672d98_0 + - libstdcxx=14.2.0=hc0a3c3a_1 + - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101 + - libstdcxx-ng=14.2.0=h4852527_1 + - libtiff=4.7.0=hd9ff511_3 + - libuuid=2.38.1=h0b41bf4_0 +- - libwebp-base=1.4.0=hd590300_0 ++ - libwebp-base=1.5.0=h851e524_0 + - libxcb=1.17.0=h8a09558_0 + - libxcrypt=4.4.36=hd590300_1 + - libxkbcommon=1.7.0=h2c5496b_1 +@@ -189,7 +189,7 @@ dependencies: + - libxslt=1.1.39=h76b75d6_0 + - libzlib=1.3.1=hb9d3cd8_2 + - linbox=1.7.0=h7298d08_1 +- - llvm-openmp=19.1.6=h024ca30_0 ++ - llvm-openmp=19.1.7=h024ca30_0 + - lrcalc=2.1=h5888daf_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hae5d5c5_1006 +@@ -207,22 +207,22 @@ dependencies: + - mpfr=4.2.1=h90cbb55_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h266115a_3 +- - mysql-libs=9.0.1=he0572af_3 ++ - mysql-common=9.0.1=h266115a_4 ++ - mysql-libs=9.0.1=he0572af_4 + - nauty=2.8.8=hd590300_1 +- - ncurses=6.5=he02047a_1 ++ - ncurses=6.5=h2d0b736_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h297d8ca_0 + - ntl=11.4.3=hef3c4d3_1 +- - numpy=1.26.4=py312heda63a1_0 ++ - numpy=2.2.2=py312h72c5963_0 + - openblas=0.3.28=pthreads_h6ec200e_1 + - openjpeg=2.5.3=h5fbd93e_0 + - openldap=2.6.9=he970967_0 +- - openssl=3.4.0=hb9d3cd8_0 ++ - openssl=3.4.0=h7b32b05_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h36c2ea0_0 +- - pari=2.15.5=h4d4ae9b_2_pthread ++ - pari=2.17.1=ha40142e_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -232,7 +232,7 @@ dependencies: + - perl=5.32.1=7_hd590300_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312h7b63e92_0 ++ - pillow=11.1.0=py312h80c1187_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h29eaf8c_0 + - pkg-config=0.29.2=h4bc722e_1009 +@@ -241,18 +241,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h6ec01c2_1006 +- - pplpy=0.8.9=py312h12a6c6f_1 +- - primecount=7.9=hcb278e6_0 +- - primecountpy=0.1.0=py312h8572e83_4 +- - primesieve=11.1=h59595ed_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312h66e93f0_0 ++ - pplpy=0.8.9=py312h7383a07_2 ++ - primecount=7.14=h530483c_0 ++ - primecountpy=0.1.0=py312h68727a3_5 ++ - primesieve=12.4=he02047a_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312h66e93f0_0 + - pthread-stubs=0.4=hb9d3cd8_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py312h91f0f75_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -266,43 +266,43 @@ dependencies: + - pyzmq=26.2.0=py312hbf22597_3 + - qd=2.3.22=h2cc385e_1004 + - qhull=2020.2=h434a139_5 +- - qt6-main=6.8.1=h9d28a51_0 ++ - qt6-main=6.8.1=h588cce1_2 + - readline=8.2=h8228510_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=hd590300_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312h62794b6_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312h180e4f1_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hc910cb2_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h9eae976_0 ++ - sqlite=3.48.0=h9eae976_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hcb278e6_0 +- - sympow=2.023.6=hc6ab17c_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-64=2.17=h4a8ded7_18 ++ - sympow=2.023.6=h3028977_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-64=2.17=h0157908_18 + - tachyon=0.99b6=hba7d16a_1002 + - tk=8.6.13=noxft_h4845f30_101 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py312h66e93f0_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312h66e93f0_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312h66e93f0_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h3e06ad9_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.12-macos-x86_64.yml b/environment-3.12-macos-x86_64.yml +index 4fccaefb570..94056fd6c91 100644 +--- a/environment-3.12-macos-x86_64.yml ++++ b/environment-3.12-macos-x86_64.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-64 +-# input_hash: 5888a68a5088012ad0dffd6db00812a4e3c24a060219dc73fd975f246c404337 ++# input_hash: ce921f8fe037a17f86cebd1f421ba43e586f9986be056154b1d53d3e0381dec4 + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_hf81eadf_101 ++ - arpack=3.9.1=nompi_hdfe9103_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hed12c24_1 + - automake=1.17=pl5321h694c41f_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h940c156_0 ++ - bdw-gc=8.2.8=h240833e_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osx64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py312h5861a67_2 + - bzip2=1.0.8=hfdf4475_7 + - c-ares=1.34.4=hf13058a_0 +- - c-compiler=1.8.0=hfc4bf79_1 ++ - c-compiler=1.9.0=h09a7c41_0 + - ca-certificates=2024.12.14=h8857fd0_0 +- - cctools=1010.6=h5b2de21_2 +- - cctools_osx-64=1010.6=hea4301f_2 ++ - cctools=1010.6=hd3558d4_2 ++ - cctools_osx-64=1010.6=h00edd4c_2 + - cddlib=1!0.94m=h0f52abe_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312hf857d28_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_he371ed4_7 +- - clang-17=17.0.6=default_hb173f14_7 +- - clang_impl_osx-64=17.0.6=h1af8efd_23 +- - clang_osx-64=17.0.6=h7e5c614_23 +- - clangxx=17.0.6=default_he371ed4_7 +- - clangxx_impl_osx-64=17.0.6=hc3430b7_23 +- - clangxx_osx-64=17.0.6=h7e5c614_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h179603d_5 ++ - clang-18=18.1.8=default_h0c94c6a_5 ++ - clang_impl_osx-64=18.1.8=h6a44ed1_23 ++ - clang_osx-64=18.1.8=h7e5c614_23 ++ - clangxx=18.1.8=default_h179603d_5 ++ - clangxx_impl_osx-64=18.1.8=h4b7810f_23 ++ - clangxx_osx-64=18.1.8=h7e5c614_23 + - cliquer=1.22=h10d778d_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h1020d70_2 +- - compiler-rt_osx-64=17.0.6=hf2b8a54_2 ++ - compiler-rt=18.1.8=h1020d70_1 ++ - compiler-rt_osx-64=18.1.8=hf2b8a54_1 + - contourpy=1.3.1=py312hc47a885_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h3520af0_0 ++ - coverage=7.6.10=py312h3520af0_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=h385f146_1 ++ - cxx-compiler=1.9.0=h20888b2_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h88009e3_0 +- - cysignals=1.11.2=py312h0c1623b_3 ++ - cypari2=2.2.1=py312hcedb801_0 ++ - cysignals=1.12.3=py312haafddd8_0 + - cython=3.0.11=py312h6891801_3 +- - debugpy=1.8.11=py312haafddd8_0 ++ - debugpy=1.8.12=py312haafddd8_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=24.5.10=h56bac16_0 +- - eclib=20231212=h960c116_1 ++ - eclib=20231212=ha63dd29_2 + - ecm=7.0.5=h4f6b447_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h37eeddb_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312h3520af0_0 +- - fortran-compiler=1.8.0=h33d1f46_1 +- - fplll=5.4.5=hb7981ad_0 +- - fpylll=0.6.1=py312ha9f3631_0 ++ - fonttools=4.55.6=py312h3520af0_0 ++ - fortran-compiler=1.9.0=h02557f8_0 ++ - fplll=5.5.0=h6ede486_0 ++ - fpylll=0.6.2=py312hfffdf69_0 + - freetype=2.12.1=h60636b9_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=hb9686a1_1 +- - gap-defaults=4.14.0=h694c41f_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=hb9686a1_2 ++ - gap-defaults=4.14.0=h694c41f_2 + - gettext=0.22.5=hdfe23c8_3 + - gettext-tools=0.22.5=hdfe23c8_3 + - gf2x=1.3.0=h35ac7d9_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h2c809b3_1 + - gfortran_impl_osx-64=13.2.0=h2bc304d_3 + - gfortran_osx-64=13.2.0=h18f7dce_1 +- - giac=1.9.0.21=h92f3f65_1 ++ - giac=1.9.0.21=h381f543_2 + - givaro=4.2.0=h1b3d6f7_0 + - glpk=5.0=h3cb5acd_0 + - gmp=6.3.0=hf036a51_2 + - gmpy2=2.1.5=py312h068713c_3 + - gsl=2.7=h93259b0_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=h120a0e1_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h5479cbe_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h61918c1_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h2e86a7b_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +- - kiwisolver=1.4.7=py312hc5c4d5f_0 ++ - kiwisolver=1.4.8=py312h9275861_0 + - krb5=1.21.3=h37d8d59_0 +- - lcalc=2.0.5=h547a6ed_2 ++ - lcalc=2.0.5=h0f747f7_3 + - lcms2=2.16=ha2f27b4_0 +- - ld64=951.9=h0a3eb4e_2 +- - ld64_osx-64=951.9=h5ffbe8e_2 ++ - ld64=951.9=h4e51db5_2 ++ - ld64_osx-64=951.9=hc8d1a19_2 + - lerc=4.0.0=hb486fe8_0 + - libasprintf=0.22.5=hdfe23c8_3 + - libasprintf-devel=0.22.5=hdfe23c8_3 +@@ -130,17 +130,17 @@ dependencies: + - libbrotlidec=1.1.0=h00291cd_2 + - libbrotlienc=1.1.0=h00291cd_2 + - libcblas=3.9.0=26_osx64_openblas +- - libclang-cpp17=17.0.6=default_hb173f14_7 ++ - libclang-cpp18.1=18.1.8=default_h0c94c6a_5 + - libcurl=8.11.1=h5dec5d8_0 +- - libcxx=19.1.6=hf95d169_1 +- - libcxx-devel=17.0.6=h8f8a49f_6 ++ - libcxx=19.1.7=hf95d169_0 ++ - libcxx-devel=18.1.8=h7c275be_7 + - libdeflate=1.23=he65b83e_0 +- - libedit=3.1.20191231=h0678c8f_2 ++ - libedit=3.1.20240808=pl5321ha958ccf_0 + - libev=4.33=h10d778d_2 + - libexpat=2.6.4=h240833e_0 + - libffi=3.4.2=h0d85af4_5 +- - libflint=3.1.2=h1d27844_101 +- - libgd=2.3.3=h2e77e4f_10 ++ - libflint=3.1.3.1=h9ab60bc_101 ++ - libgd=2.3.3=h8555400_11 + - libgettextpo=0.22.5=hdfe23c8_3 + - libgettextpo-devel=0.22.5=hdfe23c8_3 + - libgfortran=5.0.0=13_2_0_h97931a8_3 +@@ -153,23 +153,24 @@ dependencies: + - libjpeg-turbo=3.0.0=h0dc2134_1 + - liblapack=3.9.0=26_osx64_openblas + - liblapacke=3.9.0=26_osx64_openblas +- - libllvm17=17.0.6=hbedff68_1 ++ - libllvm18=18.1.8=h9ce406d_2 + - liblzma=5.6.3=hd471939_1 + - liblzma-devel=5.6.3=hd471939_1 + - libnghttp2=1.64.0=hc7306c3_0 + - libopenblas=0.3.28=openmp_hbf64a52_1 +- - libpng=1.6.44=h4b8f8c9_0 ++ - libpng=1.6.45=h3c4a55f_0 + - libsodium=1.0.20=hfdf4475_0 +- - libsqlite=3.47.2=hdb6dae5_0 ++ - libsqlite=3.48.0=hdb6dae5_1 + - libssh2=1.11.1=h3dc7d44_0 + - libtiff=4.7.0=hb77a491_3 +- - libwebp-base=1.4.0=h10d778d_0 ++ - libwebp-base=1.5.0=h6cf52b4_0 + - libxcb=1.17.0=hf1f96e2_0 + - libxml2=2.13.5=hebb159f_1 + - libzlib=1.3.1=hd23fc13_2 + - linbox=1.7.0=h9325161_1 +- - llvm-openmp=19.1.6=ha54dae1_0 +- - llvm-tools=17.0.6=hbedff68_1 ++ - llvm-openmp=19.1.7=ha54dae1_0 ++ - llvm-tools=18.1.8=h9ce406d_2 ++ - llvm-tools-18=18.1.8=h9ce406d_2 + - lrcalc=2.1=hac325c4_7 + - m4=1.4.18=haf1e3a3_1001 + - m4ri=20140914=hd82a5f3_1006 +@@ -188,18 +189,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h10d778d_1 +- - ncurses=6.5=hf036a51_1 ++ - ncurses=6.5=h0622a9a_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h3c5361c_0 + - ntl=11.4.3=h0ab3c2f_1 +- - numpy=1.26.4=py312he3a82b2_0 ++ - numpy=2.2.2=py312h6693b03_0 + - openblas=0.3.28=openmp_h30af337_1 + - openjpeg=2.5.3=h7fd6d84_0 +- - openssl=3.4.0=hd471939_0 ++ - openssl=3.4.0=hc426f3f_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hbcb3906_0 +- - pari=2.15.5=h7ba67ff_2_pthread ++ - pari=2.17.1=h1ed0f1a_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -208,7 +209,7 @@ dependencies: + - perl=5.32.1=7_h10d778d_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312h66fe14f_0 ++ - pillow=11.1.0=py312hd9f36e3_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hf7e621a_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -216,18 +217,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=ha60d53e_1006 +- - pplpy=0.8.9=py312hb4417ad_1 +- - primecount=7.6=ha894c9a_0 +- - primecountpy=0.1.0=py312h49ebfd2_4 +- - primesieve=11.0=hf0c8a7f_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312h3d0f464_0 ++ - pplpy=0.8.9=py312h045e30c_2 ++ - primecount=7.14=h28dbb38_0 ++ - primecountpy=0.1.0=py312hc47a885_5 ++ - primesieve=12.4=hf036a51_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312h01d7ebd_0 + - pthread-stubs=0.4=h00291cd_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -246,27 +247,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312h3b0f538_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312hb4e66ee_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h88f4db0_0 + - singular=4.4.0=h604985e_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h2e4c9dc_0 ++ - sqlite=3.48.0=h2e4c9dc_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hf0c8a7f_0 +- - sympow=2.023.6=h115ba6a_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=h7305399_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=h3a1d103_1002 + - tapi=1300.6.5=h390ca13_0 + - tk=8.6.13=h1abcd95_1 +@@ -274,9 +275,9 @@ dependencies: + - tornado=6.4.2=py312h01d7ebd_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312h3d0f464_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312h01d7ebd_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/environment-3.12-macos.yml b/environment-3.12-macos.yml +index 957da365df9..ae5920d5424 100644 +--- a/environment-3.12-macos.yml ++++ b/environment-3.12-macos.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-arm64 +-# input_hash: 0c152106e1e870088723e57e0bd27be66ce0a8f2488067475849ebf869659bbe ++# input_hash: 43b6f301d1166823ad72775146167ccf4e01759b32c0d0726035683651623fd9 + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_h593882a_101 ++ - arpack=3.9.1=nompi_h1f29f7c_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hcd07c0c_1 + - automake=1.17=pl5321hce30654_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hc021e02_0 ++ - bdw-gc=8.2.8=h286801f_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osxarm64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py312hde4cb15_2 + - bzip2=1.0.8=h99b78c6_7 + - c-ares=1.34.4=h5505292_0 +- - c-compiler=1.8.0=hf48404e_1 ++ - c-compiler=1.9.0=hdf49b6b_0 + - ca-certificates=2024.12.14=hf0a4a13_0 +- - cctools=1010.6=hf67d63f_2 +- - cctools_osx-arm64=1010.6=h623e0ac_2 ++ - cctools=1010.6=h4c9edd9_2 ++ - cctools_osx-arm64=1010.6=h908b477_2 + - cddlib=1!0.94m=h6d7a090_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312h0fad829_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_h360f5da_7 +- - clang-17=17.0.6=default_h146c034_7 +- - clang_impl_osx-arm64=17.0.6=he47c785_23 +- - clang_osx-arm64=17.0.6=h07b0088_23 +- - clangxx=17.0.6=default_h360f5da_7 +- - clangxx_impl_osx-arm64=17.0.6=h50f59cd_23 +- - clangxx_osx-arm64=17.0.6=h07b0088_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h675cc0c_5 ++ - clang-18=18.1.8=default_h5c12605_5 ++ - clang_impl_osx-arm64=18.1.8=h2ae9ea5_23 ++ - clang_osx-arm64=18.1.8=h07b0088_23 ++ - clangxx=18.1.8=default_h675cc0c_5 ++ - clangxx_impl_osx-arm64=18.1.8=h555f467_23 ++ - clangxx_osx-arm64=18.1.8=h07b0088_23 + - cliquer=1.22=h93a5062_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h856b3c1_2 +- - compiler-rt_osx-arm64=17.0.6=h832e737_2 ++ - compiler-rt=18.1.8=h856b3c1_1 ++ - compiler-rt_osx-arm64=18.1.8=h832e737_1 + - contourpy=1.3.1=py312hb23fbb9_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h998013c_0 ++ - coverage=7.6.10=py312h998013c_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=h18dbf2f_1 ++ - cxx-compiler=1.9.0=hba80287_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h2da97d0_0 +- - cysignals=1.11.2=py312heab4d4f_3 ++ - cypari2=2.2.1=py312he7c0534_0 ++ - cysignals=1.12.3=py312hd8f9ff3_0 + - cython=3.0.11=py312hde4cb15_2 +- - debugpy=1.8.11=py312hd8f9ff3_0 ++ - debugpy=1.8.12=py312hd8f9ff3_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=23.9.9=h1d9728a_0 +- - eclib=20231212=h3d50bd9_1 ++ - eclib=20231212=hc39b9a7_2 + - ecm=7.0.5=h41d338b_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h1383a14_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312h998013c_0 +- - fortran-compiler=1.8.0=hc3477c4_1 +- - fplll=5.4.5=hb7d509d_0 +- - fpylll=0.6.1=py312h381bdd1_0 ++ - fonttools=4.55.6=py312h998013c_0 ++ - fortran-compiler=1.9.0=h5692697_0 ++ - fplll=5.5.0=h2a2278a_0 ++ - fpylll=0.6.2=py312h03fe13c_0 + - freetype=2.12.1=hadb7bae_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h25f1785_1 +- - gap-defaults=4.14.0=hce30654_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h25f1785_2 ++ - gap-defaults=4.14.0=hce30654_2 + - gettext=0.22.5=h8414b35_3 + - gettext-tools=0.22.5=h8414b35_3 + - gf2x=1.3.0=hf8f8af4_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h1ca8e4b_1 + - gfortran_impl_osx-arm64=13.2.0=h252ada1_3 + - gfortran_osx-arm64=13.2.0=h57527a5_1 +- - giac=1.9.0.21=h1c96721_1 ++ - giac=1.9.0.21=h573964a_2 + - givaro=4.2.0=h018886a_0 + - glpk=5.0=h6d7a090_0 + - gmp=6.3.0=h7bae524_2 + - gmpy2=2.1.5=py312h524cf62_3 + - gsl=2.7=h6e638da_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hfee45f7_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h3fe6531_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=hd73f12c_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h347afa1_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +- - kiwisolver=1.4.7=py312h6142ec9_0 ++ - kiwisolver=1.4.8=py312h2c4a281_0 + - krb5=1.21.3=h237132a_0 +- - lcalc=2.0.5=h4a402bc_2 ++ - lcalc=2.0.5=hdaf6845_3 + - lcms2=2.16=ha0e7c42_0 +- - ld64=951.9=h39a299f_2 +- - ld64_osx-arm64=951.9=h3f9b568_2 ++ - ld64=951.9=h4c6efb1_2 ++ - ld64_osx-arm64=951.9=hfc0fa09_2 + - lerc=4.0.0=h9a09cb3_0 + - libasprintf=0.22.5=h8414b35_3 + - libasprintf-devel=0.22.5=h8414b35_3 +@@ -130,23 +130,23 @@ dependencies: + - libbrotlidec=1.1.0=hd74edd7_2 + - libbrotlienc=1.1.0=hd74edd7_2 + - libcblas=3.9.0=26_osxarm64_openblas +- - libclang-cpp17=17.0.6=default_h146c034_7 ++ - libclang-cpp18.1=18.1.8=default_h5c12605_5 + - libcurl=8.11.1=h73640d1_0 +- - libcxx=19.1.6=ha82da77_1 +- - libcxx-devel=17.0.6=h86353a2_6 ++ - libcxx=19.1.7=ha82da77_0 ++ - libcxx-devel=18.1.8=h6dc3340_7 + - libdeflate=1.23=hec38601_0 +- - libedit=3.1.20191231=hc8eb9b7_2 ++ - libedit=3.1.20240808=pl5321hafb1f1b_0 + - libev=4.33=h93a5062_2 + - libexpat=2.6.4=h286801f_0 + - libffi=3.4.2=h3422bc3_5 +- - libflint=3.1.2=he28cf6d_101 +- - libgd=2.3.3=hac1b3a8_10 ++ - libflint=3.1.3.1=ha3035ea_101 ++ - libgd=2.3.3=hb2c3a21_11 + - libgettextpo=0.22.5=h8414b35_3 + - libgettextpo-devel=0.22.5=h8414b35_3 + - libgfortran=5.0.0=13_2_0_hd922786_3 + - libgfortran-devel_osx-arm64=13.2.0=h5d7a38c_3 + - libgfortran5=13.2.0=hf226fd6_3 +- - libglib=2.82.2=h07bd6cf_0 ++ - libglib=2.82.2=hdff4504_1 + - libhomfly=1.02r6=h93a5062_1 + - libiconv=1.17=h0d3ecfb_2 + - libintl=0.22.5=h8414b35_3 +@@ -154,23 +154,24 @@ dependencies: + - libjpeg-turbo=3.0.0=hb547adb_1 + - liblapack=3.9.0=26_osxarm64_openblas + - liblapacke=3.9.0=26_osxarm64_openblas +- - libllvm17=17.0.6=h5090b49_2 ++ - libllvm18=18.1.8=h5090b49_2 + - liblzma=5.6.3=h39f12f2_1 + - liblzma-devel=5.6.3=h39f12f2_1 + - libnghttp2=1.64.0=h6d7220d_0 + - libopenblas=0.3.28=openmp_hf332438_1 +- - libpng=1.6.44=hc14010f_0 ++ - libpng=1.6.45=h3783ad8_0 + - libsodium=1.0.20=h99b78c6_0 +- - libsqlite=3.47.2=h3f77e49_0 ++ - libsqlite=3.48.0=h3f77e49_1 + - libssh2=1.11.1=h9cc3647_0 + - libtiff=4.7.0=h551f018_3 +- - libwebp-base=1.4.0=h93a5062_0 ++ - libwebp-base=1.5.0=h2471fea_0 + - libxcb=1.17.0=hdb1d25a_0 + - libxml2=2.13.5=h178c5d8_1 + - libzlib=1.3.1=h8359307_2 + - linbox=1.7.0=h9da6ecd_1 +- - llvm-openmp=19.1.6=hdb05f8b_0 +- - llvm-tools=17.0.6=h5090b49_2 ++ - llvm-openmp=19.1.7=hdb05f8b_0 ++ - llvm-tools=18.1.8=h5090b49_2 ++ - llvm-tools-18=18.1.8=h5090b49_2 + - lrcalc=2.1=hf9b8971_7 + - m4=1.4.18=h642e427_1001 + - m4ri=20140914=hc97c1ff_1006 +@@ -189,18 +190,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h93a5062_1 +- - ncurses=6.5=h7bae524_1 ++ - ncurses=6.5=h5e97a16_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h420ef59_0 + - ntl=11.4.3=hbb3f309_1 +- - numpy=1.26.4=py312h8442bc7_0 ++ - numpy=2.2.2=py312h7c1f314_0 + - openblas=0.3.28=openmp_hea878ba_1 + - openjpeg=2.5.3=h8a3d83b_0 +- - openssl=3.4.0=h39f12f2_0 ++ - openssl=3.4.0=h81ee809_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h27ca646_0 +- - pari=2.15.5=h4f2304c_2_pthread ++ - pari=2.17.1=h49d18c7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -210,7 +211,7 @@ dependencies: + - perl=5.32.1=7_h4614cfb_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312haf37ca6_0 ++ - pillow=11.1.0=py312h50aef2c_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hde07d2e_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -218,18 +219,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h8b147cf_1006 +- - pplpy=0.8.9=py312h35b16b8_1 +- - primecount=7.6=hb6e4faa_0 +- - primecountpy=0.1.0=py312h389731b_4 +- - primesieve=11.0=hb7217d7_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312h0bf5046_0 ++ - pplpy=0.8.9=py312he1ec6da_2 ++ - primecount=7.14=ha84d530_0 ++ - primecountpy=0.1.0=py312hb23fbb9_5 ++ - primesieve=12.4=h00cdb27_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312hea69d52_0 + - pthread-stubs=0.4=hd74edd7_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -248,27 +249,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312h6bb24ec_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312hb7ffdcd_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h44b9a77_0 + - singular=4.4.0=h5a8969a_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=hd7222ec_0 ++ - sqlite=3.48.0=hd7222ec_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hb7217d7_0 +- - sympow=2.023.6=hb0babe8_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=hc13a52f_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=hb8a568e_1002 + - tapi=1300.6.5=h03f4b80_0 + - tk=8.6.13=h5083fa2_1 +@@ -276,9 +277,9 @@ dependencies: + - tornado=6.4.2=py312hea69d52_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312h0bf5046_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312hea69d52_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/pyproject.toml b/pyproject.toml +index a1febc07917..d2b3374575e 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -3,7 +3,7 @@ build-backend = 'mesonpy' + # Minimum requirements for the build system to execute. + requires = [ + 'meson-python', +- 'cypari2 >=2.1.1', ++ 'cypari2 >=2.2.1', + # Exclude 1.12.0 because of https://github.com/sagemath/cysignals/issues/212 + 'cysignals >=1.11.2, != 1.12.0', + # Exclude 3.0.3 because of https://github.com/cython/cython/issues/5748 +@@ -19,7 +19,7 @@ description = "Sage: Open Source Mathematics Software: Standard Python Library" + dependencies = [ + 'six >=1.15.0', + 'conway-polynomials >=0.8', +- 'cypari2 >=2.1.1', ++ 'cypari2 >=2.2.1', + # Exclude 1.12.0 because of https://github.com/sagemath/cysignals/issues/212 + 'cysignals >=1.11.2, != 1.12.0', + 'cython >=3.0, != 3.0.3', +diff --git a/src/pyproject.toml b/src/pyproject.toml +index 4b70dc133d1..625b08afd7a 100644 +--- a/src/pyproject.toml ++++ b/src/pyproject.toml +@@ -6,7 +6,7 @@ requires = [ + 'setuptools >= 68.1.1', + # version constraint for macOS Big Sur support (see https://github.com/sagemath/sage/issues/31050) + 'wheel >=0.36.2', +- 'cypari2 >=2.1.1', ++ 'cypari2 >=2.2.1', + 'cysignals >=1.10.2', + # Exclude 3.0.3 because of https://github.com/cython/cython/issues/5748 + 'cython >=3.0, != 3.0.3, <4.0', +diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py +index 5525fae666c..822701d6810 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.<i> = 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.<i> = 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.<i> = 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.<t> = 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 d32ce5c9435..2f7b4a6f04c 100644 +--- a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py ++++ b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py +@@ -691,10 +691,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.<x,y> = 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 22fb4b8487c..49a41772aac 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 3ca4bee83ef..6bed0895729 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 = <Integer>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 852d749e1e6..9f8a33adeb6 100644 +--- a/src/sage/matrix/matrix2.pyx ++++ b/src/sage/matrix/matrix2.pyx +@@ -16575,7 +16575,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 2fdfc7cdc02..ef86da65c12 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 f93984335bd..ddbfa6371ba 100644 +--- a/src/sage/modular/dirichlet.py ++++ b/src/sage/modular/dirichlet.py +@@ -2394,13 +2394,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.<a> = 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) + <class 'sage.rings.finite_rings.residue_field.ResidueFiniteField_prime_modn_with_category'> + +@@ -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.<t> = GF(2)[]; h = t^5 + t^2 + 1 +@@ -1105,11 +1104,11 @@ cdef class ReductionMap(Map): + sage: # needs sage.rings.number_field + sage: K.<i> = 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.<tmod> = 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.<alpha> = 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) + <class 'sage.rings.finite_rings.residue_field_pari_ffelt.ResidueFiniteField_pari_ffelt_with_category'> + 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.<xi> = 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.<a> = 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.<a> = 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.<xi> = 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/bdd_height.py b/src/sage/rings/number_field/bdd_height.py +index 9635afa3613..8ac8904662c 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.<g> = 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/class_group.py b/src/sage/rings/number_field/class_group.py +index e1185a499bb..a9832527ce2 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 bb4e453c650..ac7f14da21d 100644 +--- a/src/sage/rings/number_field/galois_group.py ++++ b/src/sage/rings/number_field/galois_group.py +@@ -994,9 +994,11 @@ def artin_symbol(self, P): + sage: x = polygen(ZZ, 'x') + sage: K.<b> = 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)] # random (see remark in primes_above) +- [(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: sorted([G.artin_symbol(P) for P in K.primes_above(7)]) # random (see remark in primes_above) ++ [(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/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py +index 05371850c83..324db212f61 100644 +--- a/src/sage/rings/number_field/number_field.py ++++ b/src/sage/rings/number_field/number_field.py +@@ -3621,7 +3621,7 @@ def fractional_ideal(self, *gens, **kwds): + sage: L.<b> = K.extension(x^2 - 3, x^2 + 1) + sage: M.<c> = 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 + +@@ -3664,35 +3664,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 = {} +@@ -3923,8 +3925,10 @@ def primes_of_bounded_norm(self, B): + + sage: K.<i> = 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') +@@ -3933,10 +3937,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] +@@ -3986,10 +3990,10 @@ def primes_of_bounded_norm_iter(self, B): + sage: K.<i> = 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)) + [] + """ +@@ -4314,7 +4318,7 @@ def pari_nf(self, important=True): + sage: k.<a> = 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) +@@ -4441,10 +4445,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): +@@ -4804,7 +4812,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 +@@ -4815,7 +4823,8 @@ def _S_class_group_and_units(self, S, proof=True): + + sage: K.<a> = 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))] +@@ -4993,7 +5002,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) +@@ -5157,9 +5166,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) +@@ -5637,7 +5644,7 @@ def different(self): + sage: k.<a> = NumberField(x^2 + 23) + sage: d = k.different() + sage: d +- Fractional ideal (-a) ++ Fractional ideal (a) + sage: d.norm() + 23 + sage: k.disc() +@@ -5757,7 +5764,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: + +@@ -5869,10 +5876,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:: + +@@ -5905,9 +5911,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() +@@ -6519,13 +6525,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)] + +@@ -7102,14 +7110,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: + +@@ -7118,7 +7126,7 @@ def units(self, proof=None): + + sage: K.<a> = NumberField(1/2*x^2 - 1/6) + sage: K.units() +- (3*a - 2,) ++ (3*a + 2,) + """ + proof = proof_flag(proof) + +@@ -7200,14 +7208,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) + +@@ -7256,8 +7264,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 +@@ -7268,8 +7276,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:: +@@ -7422,7 +7430,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) +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.<i> = 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.<a> = 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 30fc8326917..60ac76e1ddc 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: + +@@ -241,7 +241,7 @@ def _richcmp_(self, other, op): + sage: K.<a> = 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]) # potentially random + True + sage: (f[0][0] == f[0][0]) +@@ -278,7 +278,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,) + +@@ -688,17 +688,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.:: + +@@ -795,7 +795,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()) +@@ -2422,9 +2422,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() +@@ -2453,9 +2453,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() +@@ -3170,11 +3170,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) + +@@ -3219,11 +3219,11 @@ def residue_field(self, names=None): + + sage: K.<i> = 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) +@@ -3236,7 +3236,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:: + +@@ -3497,7 +3497,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.<b> = 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.<a, b> = 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.<X> = QQ[] + sage: F.<a, b> = 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 970707f2457..07b075060c6 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.<b> = 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.<b> = 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.<b> = 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 + +@@ -1624,9 +1624,9 @@ def _pari_relative_structure(self): + sage: K.<a> = NumberField(x^2 + 1) + sage: L.<b> = 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:: +@@ -1926,7 +1926,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]) + +@@ -2699,7 +2699,7 @@ def uniformizer(self, P, others='positive'): + sage: x = polygen(ZZ, 'x') + sage: K.<a, b> = 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.<a> = 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 627765cf8f0..627034877f3 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.<x> = K[] + sage: S.<xbar> = 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.<x> = K[] + sage: S.<xbar> = 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.<b> = 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 050ab750117..4b6980c9143 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.<y> = 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 baa58aeb639..ca414d6d60c 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 376568cc90b..63ef460af6c 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.<b> = 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.<b> = 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 518fda03481..e36bf28499f 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) +@@ -873,7 +873,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): + sage: K.<i> = 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 +@@ -881,7 +881,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 +@@ -899,7 +899,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 +@@ -1457,8 +1457,10 @@ def kodaira_symbol(self, P, proof=None): + sage: K.<a> = 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.<a> = QuadraticField(-11) +@@ -1484,10 +1486,10 @@ def conductor(self): + + sage: K.<i> = 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.<a> = 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:: + +@@ -2585,8 +2587,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:: + +@@ -2617,13 +2619,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:: +@@ -3104,10 +3106,10 @@ def is_isogenous(self, other, proof=True, maxnorm=100): + sage: K.<i> = 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) +@@ -3434,8 +3436,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] + ) + + :: +@@ -3446,9 +3448,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)], ++ <BLANKLINE> ++ [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 1d980d60666..7c18a464559 100644 +--- a/src/sage/schemes/elliptic_curves/ell_point.py ++++ b/src/sage/schemes/elliptic_curves/ell_point.py +@@ -3052,9 +3052,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.<i> = 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.<i> = 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.<b> = 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.<a> = 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.<x,y> = 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.<a> = 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/gnu/packages/sagemath.scm b/gnu/packages/sagemath.scm index ab34d076b7..e5ea5cbbf8 100644 --- a/gnu/packages/sagemath.scm +++ b/gnu/packages/sagemath.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2019 Andreas Enge <andreas <at> enge.fr> +;;; Copyright © 2019, 2025 Andreas Enge <andreas <at> enge.fr> ;;; Copyright © 2019 Nicolas Goaziou <mail <at> nicolasgoaziou.fr> ;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me <at> tobias.gr> ;;; Copyright © 2020 Jakub Kądziołka <kuba <at> kadziolka.net> @@ -30,18 +30,24 @@ (define-module (gnu packages sagemath) #:use-module (guix build-system python) #:use-module (guix download) #:use-module (guix git-download) + #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix utils) #:use-module (gnu packages) #:use-module (gnu packages algebra) #:use-module (gnu packages autotools) + #:use-module (gnu packages base) #:use-module (gnu packages bdw-gc) #:use-module (gnu packages boost) #:use-module (gnu packages check) #:use-module (gnu packages compression) + #:use-module (gnu packages fontutils) + #:use-module (gnu packages gd) + #:use-module (gnu packages graph) #:use-module (gnu packages image) - #:use-module (gnu packages maths) #:use-module (gnu packages lisp) + #:use-module (gnu packages m4) + #:use-module (gnu packages maths) #:use-module (gnu packages multiprecision) #:use-module (gnu packages pkg-config) #:use-module (gnu packages popt) @@ -49,7 +55,6 @@ (define-module (gnu packages sagemath) #:use-module (gnu packages python-build) #:use-module (gnu packages python-xyz)) - (define-public brial (package (name "brial") @@ -382,3 +387,144 @@ (define-public sagemath-data-combinatorial-designs Handbook of Combinatorial Designs, 2ed. @end itemize") (license license:public-domain))) + + +(define-public sage + (package + (name "sage") + (version "10.6.beta6") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/sagemath/sage") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0w2v5c4k2khlpglaj9sq1vbs7q03ib3d46pgr6k4n3mclhsy2idk")) + (patches (search-patches "sage-update-eclib.patch" + "sage-update-pari-gp.patch")))) + (build-system pyproject-build-system) + (native-inputs + (list autoconf automake m4 pkg-config ; for ./bootstrap + python-cython-3 + python-cysignals + python-memory-allocator + python-pkgconfig + python-jinja2 + python-setuptools + python-wheel)) + (propagated-inputs + (list ;; required to make the sage script start + python-ipython + python-ipywidgets + python-traitlets + ;; required for the Jupyter notebook + python-jupyter-client + python-notebook)) + (inputs + (list boost + brial + cliquer + coreutils + ecl + eclib + edge-addition-planarity-suite + fflas-ffpack + flint + fontconfig + freetype + gap + gd + giac + givaro + glpk + gmp + gmp-ecm + gsl + ijg-libjpeg + iml + lcalc + libbraiding + libhomfly + linbox + libpng + m4ri + m4rie + maxima-ecl + mpc + mpfi + mpfr + ntl + openblas + pari-gp + python + python-cypari2 + python-gmpy2 + python-numpy + python-pplpy + rw + sed + singular + symmetrica)) + (arguments + (list + #:tests? #f ; Tests can be run using "make ptestlong", but it is + ; expected that some of them fail. + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'patch-source + (lambda _ + (substitute* (find-files "build/bin") + (("sage-bootstrap-python") "python")) + (substitute* "src/sage/env.py" + (("\"ecl-config\"") + (string-append "\"" #$ecl "/bin/ecl-config\"")) + (("\"ecm\"") + (string-append "\"" #$gmp-ecm "/bin/ecm\"")) + (("\"maxima\"") + (string-append "\"" #$maxima-ecl "/bin/maxima\"")) + (("\"MAXIMA_FAS\"") + (string-append "\"MAXIMA_FAS\", \"" #$maxima-ecl + "/lib/maxima/" + #$(package-version maxima-ecl) + "/binary-ecl/maxima.fas\"")) + (("\"Singular\"") + (string-append "\"" #$singular "/bin/Singular\"")) + (("var\\('SAGE_GAP_COMMAND', None\\)") + (string-append "var('SAGE_GAP_COMMAND', \"" + #$gap "/bin/gap\")")) + (("join\\(SAGE_LOCAL, \"lib\", \"gap\"\\)") + (string-append "\"" #$gap "/lib/gap\"")) + (("join\\(SAGE_LOCAL, \"share\", \"gap\"\\)") + (string-append "\"" #$gap "/share/gap\"")) + ;; definition of SAGE_VENV, which ends up in kernel.json + (("os.path.abspath\\(sys.prefix\\)") + (string-append "\"" #$output "\""))) + (substitute* "src/sage/interfaces/gp.py" + (("command=f\"gp") + (string-append "command=f\"" #$pari-gp "/bin/gp"))) + (substitute* "src/bin/sage" + (("exec python3") + (string-append "exec " #$python "/bin/python3")) + (("mkdir") + (string-append #$coreutils "/bin/mkdir")) + ((" sed ") + (string-append " " #$sed "/bin/sed "))))) + (add-before 'build 'setup + (lambda _ + (setenv "SAGE_NUM_THREADS" + (number->string (parallel-job-count))) + (invoke "./bootstrap") + (chdir "src"))) + (delete 'sanity-check)))) ; does not reflect reality + (synopsis "SageMath computer algebra system") + (description + "SageMath is a mathematics software built on top of many existing +packages such as NumPy, SciPy, matplotlib, Sympy, Maxima, GAP, FLINT, +R and others. Their combined power may be accessed through a common, +Python-based language or directly via interfaces or wrappers.") + ;; Documentation under cc-by-sa3.0, see COPYING.txt in the distribution. + (license license:gpl3) + (home-page "https://www.sagemath.org/"))) + -- 2.48.1
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Thu, 13 Feb 2025 16:13:01 GMT) Full text and rfc822 format available.Message #17 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Nicolas Goaziou <mail <at> nicolasgoaziou.fr> To: Andreas Enge <andreas <at> enge.fr> Cc: Guillaume Le Vaillant <glv <at> posteo.net>, vicvbcun <guix <at> ikherbers.com>, Sharlatan Hellseher <sharlatanus <at> gmail.com>, 76270 <at> debbugs.gnu.org, Vinicius Monego <monego <at> posteo.net> Subject: Re: [bug#76270] [PATCH 2/2] gnu: Add sage. Date: Thu, 13 Feb 2025 17:11:20 +0100
Hello, Andreas Enge <andreas <at> enge.fr> writes: > * gnu/packages/sagemath.scm (sage): New variable. > * gnu/packages/patches/sage-update-eclib.patch, > gnu/packages/patches/sage-update-pari-gp.patch: New files. > * gnu/local.mk (dist_patch_DATA): Register patches. Thanks for that! > + #:phases > + #~(modify-phases %standard-phases > + (add-after 'unpack 'patch-source > + (lambda _ > + (substitute* (find-files "build/bin") > + (("sage-bootstrap-python") "python")) > + (substitute* "src/sage/env.py" > + (("\"ecl-config\"") > + (string-append "\"" #$ecl "/bin/ecl-config\"")) > + (("\"ecm\"") > + (string-append "\"" #$gmp-ecm "/bin/ecm\"")) > + (("\"maxima\"") > + (string-append "\"" #$maxima-ecl "/bin/maxima\"")) > + (("\"MAXIMA_FAS\"") > + (string-append "\"MAXIMA_FAS\", \"" #$maxima-ecl > + "/lib/maxima/" > + #$(package-version maxima-ecl) > + "/binary-ecl/maxima.fas\"")) > + (("\"Singular\"") > + (string-append "\"" #$singular "/bin/Singular\"")) > + (("var\\('SAGE_GAP_COMMAND', None\\)") > + (string-append "var('SAGE_GAP_COMMAND', \"" > + #$gap "/bin/gap\")")) > + (("join\\(SAGE_LOCAL, \"lib\", \"gap\"\\)") > + (string-append "\"" #$gap "/lib/gap\"")) > + (("join\\(SAGE_LOCAL, \"share\", \"gap\"\\)") > + (string-append "\"" #$gap "/share/gap\"")) > + ;; definition of SAGE_VENV, which ends up in kernel.json > + (("os.path.abspath\\(sys.prefix\\)") > + (string-append "\"" #$output "\""))) > + (substitute* "src/sage/interfaces/gp.py" > + (("command=f\"gp") > + (string-append "command=f\"" #$pari-gp "/bin/gp"))) > + (substitute* "src/bin/sage" > + (("exec python3") > + (string-append "exec " #$python "/bin/python3")) > + (("mkdir") > + (string-append #$coreutils "/bin/mkdir")) > + ((" sed ") > + (string-append " " #$sed "/bin/sed "))))) I suggest to use, for example, (search-input-file (or native-inputs inputs) "bin/sed") or (string-append #$(this-package-input "sed") "/bin/sed") instead of (string-append " " #$sed "/bin/sed ") so as to not break package transformations. > + (add-before 'build 'setup > + (lambda _ > + (setenv "SAGE_NUM_THREADS" > + (number->string (parallel-job-count))) > + (invoke "./bootstrap") > + (chdir "src"))) > + (delete 'sanity-check)))) ; does not reflect reality > + (synopsis "SageMath computer algebra system") > + (description > + "SageMath is a mathematics software built on top of many existing > +packages such as NumPy, SciPy, matplotlib, Sympy, Maxima, GAP, FLINT, > +R and others. Their combined power may be accessed through a common, > +Python-based language or directly via interfaces or wrappers.") Nitpick: matplotlib -> Matplotlib. > + ;; Documentation under cc-by-sa3.0, see COPYING.txt in the distribution. > + (license license:gpl3) > + (home-page "https://www.sagemath.org/"))) Nitpick: the fields in this package definition are in an unusual order. You may want to reorder them. FWIW, I also think it makes sense to replace current Maxima with maxima-ecl. Regards, -- Nicolas Goaziou
andreas <at> enge.fr, bavier <at> posteo.net, sharlatanus <at> gmail.com, guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Thu, 13 Feb 2025 20:10:02 GMT) Full text and rfc822 format available.Message #20 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: 76270 <at> debbugs.gnu.org Cc: Guillaume Le Vaillant <glv <at> posteo.net>, Andreas Enge <andreas <at> enge.fr>, vicvbcun <guix <at> ikherbers.com>, Sharlatan Hellseher <sharlatanus <at> gmail.com>, Vinicius Monego <monego <at> posteo.net> Subject: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Thu, 13 Feb 2025 20:59:47 +0100
Hello, thanks a lot, Nicolas, for this quick review! The comment on changing the style using this-package-input is a good remark, I was not aware of it. I also tried to adapt the style according to your other suggestions (but am not totally sure about the canonical order of the fields of a package). Here is a new version with a maxima package modified to use ecl, instead of a separate package. In the meantime, I have also changed (on master) the names of the data packages according to our package guidelines. In the end it does not matter that much because I think that the packages are not needed or even usable outside of sage, so they can be hidden by using define instead of define-public. I have done so for conway-polynomials, which I have added to sage. Now the command "conway_polynomial (2, 5)" returns a value instead of an error. Just adding them makes no difference for the other data packages, however, so I have refrained from adding them for the moment. I have also added python-fpylll. To check that it makes a difference, I have used the following sage code, given to me by a participant of the workshop I am attending right now: from sage.features.all import all_features for feature in all_features(): print (feature, end="\t") try: feature.require() print ("yes") except: print ("no") It prints a long list of features, among which there is now Feature('fpylll') yes with "yes" instead of "no" previously. The two commits are also on the branch wip-sage2. Andreas [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. This is needed by sage and does not change the maxima functionality. * gnu/packages/maths.scm (maxima)[inputs]: Replace sbcl by ecl. [arguments]<configure-flags>: Adapt to use ecl. Drop unneeded flags. <phases>{check}: Adapt to use ecl. {install-lib}: Add phase to install the file maxima.fas. Change-Id: I71a14d064e67aa34fdd7f6eb8499dfbd1dea11b9 --- gnu/packages/maths.scm | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm index 4a1637b952..08c9201b0c 100644 --- a/gnu/packages/maths.scm +++ b/gnu/packages/maths.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015, 2016, 2019, 2020, 2023, 2024 Andreas Enge <andreas <at> enge.fr> +;;; Copyright © 2013, 2014, 2015, 2016, 2019, 2020, 2023, 2024, 2025 Andreas Enge <andreas <at> enge.fr> ;;; Copyright © 2013 Nikita Karetnikov <nikita <at> karetnikov.org> ;;; Copyright © 2014, 2016, 2017 John Darrington <jmd <at> gnu.org> ;;; Copyright © 2014-2022 Eric Bavier <bavier <at> posteo.net> @@ -5417,8 +5417,8 @@ (define-public maxima (build-system gnu-build-system) (inputs (list bash-minimal + ecl gnuplot ;for plots - sbcl sed tk)) ;Tcl/Tk is used by 'xmaxima' (native-inputs @@ -5426,11 +5426,7 @@ (define-public maxima (arguments (list #:configure-flags - #~(list "--enable-sbcl" - (string-append "--with-sbcl=" #$sbcl "/bin/sbcl") - (string-append "--with-posix-shell=" #$bash-minimal "/bin/sh") - (string-append "--with-wish=" #$tk "/bin/wish" - #$(version-major+minor (package-version tk)))) + #~(list "--enable-ecl") ;; By default Maxima attempts to write temporary files to ;; '/tmp/nix-build-maxima-*', which won't exist at run time. ;; Work around that. @@ -5457,21 +5453,28 @@ (define-public maxima (lambda _ (chmod "src/maxima" #o555))) (replace 'check + ;; This is derived from the testing code in the "debian/rules" file + ;; of Debian's Maxima package. + ;; If Maxima can successfully run this, the binary to be installed + ;; should be fine. (lambda _ - ;; This is derived from the testing code in the "debian/rules" file - ;; of Debian's Maxima package. - ;; If Maxima can successfully run this, the binary to be installed - ;; should be fine. (invoke "sh" "-c" (string-append - "./maxima-local " - "--lisp=sbcl " - "--batch-string=\"run_testsuite();\" " - "| grep -q \"No unexpected errors found\"")))) + "./maxima-local " + "--lisp=ecl " + "--batch-string=\"run_testsuite();\" " + "| grep -q \"No unexpected errors found\"")))) + (add-after 'install 'install-lib + (lambda _ + (let ((lib (string-append + #$output "/lib/maxima/" + #$(package-version this-package) + "/binary-ecl"))) + (install-file "src/binary-ecl/maxima.fas" lib)))) ;; Make sure the doc and emacs files are found in the ;; standard location. Also configure maxima to find gnuplot ;; without having it on the PATH. - (add-after 'install 'post-install + (add-after 'install-lib 'post-install (lambda* (#:key outputs inputs #:allow-other-keys) (let* ((gnuplot (assoc-ref inputs "gnuplot")) (out (assoc-ref outputs "out")) base-commit: af6d567c2e5acc0c14ad5b84efbfeb94351a9553 -- 2.48.1
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Thu, 13 Feb 2025 20:10:02 GMT) Full text and rfc822 format available.Message #23 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: 76270 <at> debbugs.gnu.org Cc: Guillaume Le Vaillant <glv <at> posteo.net>, Andreas Enge <andreas <at> enge.fr>, vicvbcun <guix <at> ikherbers.com>, Sharlatan Hellseher <sharlatanus <at> gmail.com>, Vinicius Monego <monego <at> posteo.net> Subject: [PATCH v2 2/2] gnu: Add sage. Date: Thu, 13 Feb 2025 20:59:48 +0100
* gnu/packages/sagemath.scm (sage): New variable. (conway-polynomials): Make package private. * gnu/packages/patches/sage-update-eclib.patch, gnu/packages/patches/sage-update-pari-gp.patch: New files. * gnu/local.mk (dist_patch_DATA): Register patches. --- gnu/local.mk | 2 + gnu/packages/patches/sage-update-eclib.patch | 222 + .../patches/sage-update-pari-gp.patch | 5020 +++++++++++++++++ gnu/packages/sagemath.scm | 164 +- 4 files changed, 5405 insertions(+), 3 deletions(-) create mode 100644 gnu/packages/patches/sage-update-eclib.patch create mode 100644 gnu/packages/patches/sage-update-pari-gp.patch diff --git a/gnu/local.mk b/gnu/local.mk index fbca6d4ce8..bbe6fe4fce 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -2204,6 +2204,8 @@ dist_patch_DATA = \ %D%/packages/patches/rw-igraph-0.10.patch \ %D%/packages/patches/rxvt-unicode-fix-cursor-position.patch \ %D%/packages/patches/s7-flint-3.patch \ + %D%/packages/patches/sage-update-eclib.patch \ + %D%/packages/patches/sage-update-pari-gp.patch \ %D%/packages/patches/sajson-for-gemmi-numbers-as-strings.patch \ %D%/packages/patches/sajson-build-with-gcc10.patch \ %D%/packages/patches/sbc-fix-build-non-x86.patch \ diff --git a/gnu/packages/patches/sage-update-eclib.patch b/gnu/packages/patches/sage-update-eclib.patch new file mode 100644 index 0000000000..2303005878 --- /dev/null +++ b/gnu/packages/patches/sage-update-eclib.patch @@ -0,0 +1,222 @@ +From 6dfc26b805d2fb0cafa60f0d778db3d68188b724 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Wed, 13 Nov 2024 14:46:51 +0000 +Subject: [PATCH 1/4] #38960-eclib-upgrade-20241112 + +--- + build/pkgs/eclib/SPKG.rst | 2 +- + build/pkgs/eclib/checksums.ini | 4 ++-- + build/pkgs/eclib/package-version.txt | 2 +- + build/pkgs/eclib/spkg-configure.m4 | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/build/pkgs/eclib/SPKG.rst b/build/pkgs/eclib/SPKG.rst +index 5627fdcb57c..ac8b27b3606 100644 +--- a/build/pkgs/eclib/SPKG.rst ++++ b/build/pkgs/eclib/SPKG.rst +@@ -30,5 +30,5 @@ Upstream Contact + - Author: John Cremona + - Email: john.cremona <at> gmail.com + - Website: +- http://homepages.warwick.ac.uk/staff/J.E.Cremona/mwrank/index.html ++ https://johncremona.github.io/mwrank/index.html + - Repository: https://github.com/JohnCremona/eclib +diff --git a/build/pkgs/eclib/checksums.ini b/build/pkgs/eclib/checksums.ini +index fde4faaee15..b046783341d 100644 +--- a/build/pkgs/eclib/checksums.ini ++++ b/build/pkgs/eclib/checksums.ini +@@ -1,4 +1,4 @@ + tarball=eclib-VERSION.tar.bz2 +-sha1=3028ac95e1b76699f5f9e871ac706cda363ab842 +-sha256=32d116a3e359b0de4f6486c2bb6188bb8b553c8b833f618cc2596484e8b6145a ++sha1=749e4fda3660006a9459f129148d05ba482daa29 ++sha256=30765c27ca1420141f83517897119d0185fea9b31132392170ddae40b060e46f + upstream_url=https://github.com/JohnCremona/eclib/releases/download/vVERSION/eclib-VERSION.tar.bz2 +diff --git a/build/pkgs/eclib/package-version.txt b/build/pkgs/eclib/package-version.txt +index 190b92f716b..353869c3cba 100644 +--- a/build/pkgs/eclib/package-version.txt ++++ b/build/pkgs/eclib/package-version.txt +@@ -1 +1 @@ +-20231212 ++20241112 +diff --git a/build/pkgs/eclib/spkg-configure.m4 b/build/pkgs/eclib/spkg-configure.m4 +index ba5c22fa090..23771dad1bd 100644 +--- a/build/pkgs/eclib/spkg-configure.m4 ++++ b/build/pkgs/eclib/spkg-configure.m4 +@@ -1,7 +1,7 @@ + SAGE_SPKG_CONFIGURE([eclib], [ + SAGE_SPKG_DEPCHECK([ntl pari flint], [ + dnl use existing eclib only if the version reported by pkg-config is recent enough +- m4_pushdef([SAGE_ECLIB_VER],["20231212"]) ++ m4_pushdef([SAGE_ECLIB_VER],["20241112"]) + PKG_CHECK_MODULES([ECLIB], [eclib >= SAGE_ECLIB_VER], [ + AC_CACHE_CHECK([for mwrank version == SAGE_ECLIB_VER], [ac_cv_path_MWRANK], [ + AC_PATH_PROGS_FEATURE_CHECK([MWRANK], [mwrank], [ + +From d38cb48c67c7565572064fd29748c1e8da3b3271 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Tue, 19 Nov 2024 13:51:49 +0000 +Subject: [PATCH 2/4] #38960 fix eclib interface after upgrade + +--- + src/sage/libs/eclib/__init__.pxd | 4 ++-- + src/sage/libs/eclib/mat.pyx | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/sage/libs/eclib/__init__.pxd b/src/sage/libs/eclib/__init__.pxd +index d44d4fba865..84d1fc92275 100644 +--- a/src/sage/libs/eclib/__init__.pxd ++++ b/src/sage/libs/eclib/__init__.pxd +@@ -55,7 +55,7 @@ cdef extern from "eclib/matrix.h": + cdef cppclass mat: + mat() + mat(mat m) +- scalar* get_entries() ++ vector[scalar] get_entries() + scalar sub(long, long) + long nrows() + long ncols() +@@ -67,7 +67,7 @@ cdef extern from "eclib/smatrix.h": + cdef cppclass smat: + smat() + smat(smat m) +- scalar* get_entries() ++ vector[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..e7abe369b2b 100644 +--- a/src/sage/libs/eclib/mat.pyx ++++ b/src/sage/libs/eclib/mat.pyx +@@ -10,7 +10,7 @@ from sage.rings.integer_ring import ZZ + 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 +- ++from libcpp.vector cimport vector + + cdef class Matrix: + """ +@@ -213,7 +213,7 @@ cdef class Matrix: + """ + cdef long n = self.nrows() + cdef long i, j, k +- cdef scalar* v = <scalar*> self.M.get_entries() # coercion needed to deal with const ++ cdef vector[scalar] v = <vector[scalar]> self.M.get_entries() # coercion needed to deal with const + + cdef Matrix_integer_dense Td + cdef Matrix_integer_sparse Ts + +From 4f2cb3f7a943aefd05d4baf7b5845a6fc3dba779 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Wed, 4 Dec 2024 08:35:58 +0000 +Subject: [PATCH 3/4] #38960 simplify eclib interface + +--- + src/sage/libs/eclib/__init__.pxd | 2 -- + src/sage/libs/eclib/mat.pyx | 18 +++++++----------- + 2 files changed, 7 insertions(+), 13 deletions(-) + +diff --git a/src/sage/libs/eclib/__init__.pxd b/src/sage/libs/eclib/__init__.pxd +index 84d1fc92275..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) +- vector[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) +- vector[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 e7abe369b2b..5dbb39faa0e 100644 +--- a/src/sage/libs/eclib/mat.pyx ++++ b/src/sage/libs/eclib/mat.pyx +@@ -10,7 +10,6 @@ from sage.rings.integer_ring import ZZ + 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 +-from libcpp.vector cimport vector + + cdef class Matrix: + """ +@@ -212,8 +211,7 @@ cdef class Matrix: + <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> + """ + cdef long n = self.nrows() +- cdef long i, j, k +- cdef vector[scalar] v = <vector[scalar]> 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 + + + +From 8754c7052084043209c8332d3d1154c26c25ae91 Mon Sep 17 00:00:00 2001 +From: John Cremona <john.cremona <at> gmail.com> +Date: Wed, 4 Dec 2024 09:20:07 +0000 +Subject: [PATCH 4/4] #38960: fix lint issue + +--- + src/sage/libs/eclib/mat.pyx | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/sage/libs/eclib/mat.pyx b/src/sage/libs/eclib/mat.pyx +index 5dbb39faa0e..989d9d1a70c 100644 +--- a/src/sage/libs/eclib/mat.pyx ++++ b/src/sage/libs/eclib/mat.pyx +@@ -221,7 +221,7 @@ cdef class Matrix: + Ts = MatrixSpace(ZZ, n, sparse=sparse).zero_matrix().__copy__() + for i from 0 <= i < n: + for j from 0 <= j < n: +- Mij = Integer(self.M.sub(i+1,j+1)); ++ Mij = Integer(self.M.sub(i+1,j+1)) + if Mij: + Ts.set_unsafe(i, j, Mij) + return Ts +@@ -229,7 +229,7 @@ cdef class Matrix: + Td = MatrixSpace(ZZ, n, sparse=sparse).zero_matrix().__copy__() + for i from 0 <= i < n: + for j from 0 <= j < n: +- Mij = Integer(self.M.sub(i+1,j+1)); ++ Mij = Integer(self.M.sub(i+1,j+1)) + if Mij: + Td.set_unsafe(i, j, Mij) + return Td diff --git a/gnu/packages/patches/sage-update-pari-gp.patch b/gnu/packages/patches/sage-update-pari-gp.patch new file mode 100644 index 0000000000..741b9b1478 --- /dev/null +++ b/gnu/packages/patches/sage-update-pari-gp.patch @@ -0,0 +1,5020 @@ +diff --git a/build/pkgs/cypari/checksums.ini b/build/pkgs/cypari/checksums.ini +index 1ead9490d1a..3794d83334f 100644 +--- a/build/pkgs/cypari/checksums.ini ++++ b/build/pkgs/cypari/checksums.ini +@@ -1,4 +1,4 @@ + tarball=cypari2-VERSION.tar.gz +-sha1=4e9f14d218bc1cea29e03a2ceec9bf3dfbfd5eb3 +-sha256=817606bf661b71d33e1d012421907a4f8fb09dd81b7d3e3ae179b3978020bbf1 ++sha1=556d1a16818663ba6e6a3c9d2b14cc907a7eef4c ++sha256=aaa017a6a280581902f73cf5ce1695712b6598a032be14cfab81f97c475f83b8 + upstream_url=https://files.pythonhosted.org/packages/source/c/cypari2/cypari2-VERSION.tar.gz +diff --git a/build/pkgs/cypari/package-version.txt b/build/pkgs/cypari/package-version.txt +index ccbccc3dc62..c043eea7767 100644 +--- a/build/pkgs/cypari/package-version.txt ++++ b/build/pkgs/cypari/package-version.txt +@@ -1 +1 @@ +-2.2.0 ++2.2.1 +diff --git a/build/pkgs/cysignals/checksums.ini b/build/pkgs/cysignals/checksums.ini +index 8ba1030ffdf..9c6648af170 100644 +--- a/build/pkgs/cysignals/checksums.ini ++++ b/build/pkgs/cysignals/checksums.ini +@@ -1,4 +1,4 @@ + tarball=cysignals-VERSION.tar.gz +-sha1=76db7aa59d55e867c83b329c017382555253af43 +-sha256=0f1e321e55a07f901c86a36a1e4497f6ff9dfe700681d0130a38c36e4eb238c3 ++sha1=e285e209a3a5f9469cb5ade746c518cd3a600a9b ++sha256=89f7626dbf29db5ab3d6eff15a89978f4eb5193c320e9099bcc157dacdefd1eb + upstream_url=https://files.pythonhosted.org/packages/source/c/cysignals/cysignals-VERSION.tar.gz +diff --git a/build/pkgs/cysignals/dependencies b/build/pkgs/cysignals/dependencies +index cd45ae2076c..d42690aa7b1 100644 +--- a/build/pkgs/cysignals/dependencies ++++ b/build/pkgs/cysignals/dependencies +@@ -1,4 +1,4 @@ +- cython pari | $(PYTHON_TOOLCHAIN) $(PYTHON) ++ cython | $(PYTHON_TOOLCHAIN) meson_python $(PYTHON) + + ---------- + All lines of this file are ignored except the first. +diff --git a/build/pkgs/cysignals/package-version.txt b/build/pkgs/cysignals/package-version.txt +index 3d0e62313ce..81f363239f5 100644 +--- a/build/pkgs/cysignals/package-version.txt ++++ b/build/pkgs/cysignals/package-version.txt +@@ -1 +1 @@ +-1.11.4 ++1.12.3 +diff --git a/build/pkgs/cysignals/spkg-install.in b/build/pkgs/cysignals/spkg-install.in +index 0894611a27e..2e2a9691837 100644 +--- a/build/pkgs/cysignals/spkg-install.in ++++ b/build/pkgs/cysignals/spkg-install.in +@@ -3,9 +3,4 @@ cd src + # #29473: Override -Wp,-D_FORTIFY_SOURCE from Fedora's python3. + export CPPFLAGS="$CPPFLAGS -Wp,-U_FORTIFY_SOURCE" + +-if [ "$SAGE_DEBUG" = yes ]; then +- CYSIGNALS_CONFIGURE="--enable-debug $CYSIGNALS_CONFIGURE" +-fi +- +-sdh_configure $CYSIGNALS_CONFIGURE + sdh_pip_install . +diff --git a/build/pkgs/pari/checksums.ini b/build/pkgs/pari/checksums.ini +index d56c437a2ee..cfb35617995 100644 +--- a/build/pkgs/pari/checksums.ini ++++ b/build/pkgs/pari/checksums.ini +@@ -1,4 +1,4 @@ + tarball=pari-VERSION.tar.gz +-sha1=377593dfe72df13578ea0a517fcb0f81cc9758d4 +-sha256=0efdda7515d9d954f63324c34b34c560e60f73a81c3924a71260a2cc91d5f981 +-upstream_url=https://pari.math.u-bordeaux.fr/pub/pari/OLD/${VERSION_MAJOR}.${VERSION_MINOR}/pari-VERSION.tar.gz ++sha1=f5f5656a68947ef6a4841d40dd09a72fe96762a5 ++sha256=67ba6f3071233725258541e4f174b5efbc64c65ae5115bade9edfc45f1fde5dc ++upstream_url=https://pari.math.u-bordeaux.fr/pub/pari/unix/pari-VERSION.tar.gz +diff --git a/build/pkgs/pari/package-version.txt b/build/pkgs/pari/package-version.txt +index 7a561821071..3f8eb714d02 100644 +--- a/build/pkgs/pari/package-version.txt ++++ b/build/pkgs/pari/package-version.txt +@@ -1 +1 @@ +-2.15.5 ++2.17.1 +diff --git a/build/pkgs/pari/spkg-configure.m4 b/build/pkgs/pari/spkg-configure.m4 +index 207487119a6..d9d90e0d421 100644 +--- a/build/pkgs/pari/spkg-configure.m4 ++++ b/build/pkgs/pari/spkg-configure.m4 +@@ -1,8 +1,7 @@ + SAGE_SPKG_CONFIGURE([pari], [ + dnl See gp_version below on how the version is computed from MAJV.MINV.PATCHV +- m4_pushdef([SAGE_PARI_MINVER],["134916"])dnl this version and higher allowed +- dnl Do not allow Pari 2.17 or later, see #38769: +- m4_pushdef([SAGE_PARI_MAXVER],["135424"])dnl this version and higher not allowed ++ m4_pushdef([SAGE_PARI_MINVER],["135245"])dnl this version and higher allowed ++ m4_pushdef([SAGE_PARI_MAXVER],["999999"])dnl this version and higher not allowed + SAGE_SPKG_DEPCHECK([gmp readline], [ + AC_PATH_PROG([GP], [gp]) + if test x$GP = x; then dnl GP test +diff --git a/environment-3.11-linux-aarch64.yml b/environment-3.11-linux-aarch64.yml +index c17c3395c99..a26cafa98db 100644 +--- a/environment-3.11-linux-aarch64.yml ++++ b/environment-3.11-linux-aarch64.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-aarch64 +-# input_hash: 09e3b72a7aa5c065370cb8a339e14ed42ad43f0c89abc55b38713be2d4560fd9 ++# input_hash: 8682c27c6bd8b3e849271dd9881b907b660025227d849b37e5c7098a5a6a84ab + + channels: + - conda-forge +@@ -9,12 +9,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=h86ecc28_0 +- - arpack=3.9.1=nompi_hd363cd0_101 ++ - arpack=3.9.1=nompi_h6fc4d3a_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2148fe1_1 + - automake=1.17=pl5321h8af1aa0_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hd62202e_0 ++ - bdw-gc=8.2.8=h5ad3122_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=hf1166c9_2 + - binutils_impl_linux-aarch64=2.43=h4c662bb_2 +@@ -28,33 +28,33 @@ dependencies: + - brotli-python=1.1.0=py311h89d996e_2 + - bzip2=1.0.8=h68df207_7 + - c-ares=1.34.4=h86ecc28_0 +- - c-compiler=1.8.0=h6561dab_1 ++ - c-compiler=1.9.0=h6561dab_0 + - ca-certificates=2024.12.14=hcefe29a_0 + - cairo=1.18.2=h83712da_1 + - cddlib=1!0.94m=h719063d_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311h14e8bb7_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=h31becfc_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py311hc07b1fb_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311ha09ea12_0 ++ - coverage=7.6.10=py311ha09ea12_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=heb6c788_1 ++ - cxx-compiler=1.9.0=heb6c788_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311h5ab95f0_0 ++ - cypari2=2.2.1=py311hc8fbf20_0 + - cyrus-sasl=2.1.27=hf6b2984_7 +- - cysignals=1.11.2=py311h644d908_3 ++ - cysignals=1.12.3=py311h89d996e_0 + - cython=3.0.11=py311hac78f04_3 + - dbus=1.13.6=h12b9eeb_3 +- - debugpy=1.8.11=py311h89d996e_0 ++ - debugpy=1.8.12=py311h89d996e_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h2f0025b_0 + - ecl=24.5.10=h5567cc5_0 +- - eclib=20231212=h154513d_1 ++ - eclib=20231212=h4705ef2_2 + - ecm=7.0.5=ha2d0fc4_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -68,14 +68,14 @@ dependencies: + - fontconfig=2.15.0=h8dda3cd_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311h58d527c_0 +- - fortran-compiler=1.8.0=h25a59a9_1 +- - fplll=5.4.5=hb3a790e_0 +- - fpylll=0.6.1=py311h5d3d69a_0 ++ - fonttools=4.55.6=py311h58d527c_0 ++ - fortran-compiler=1.9.0=h25a59a9_0 ++ - fplll=5.5.0=h45c7457_0 ++ - fpylll=0.6.2=py311h2dc1a0e_0 + - freetype=2.12.1=hf0a5ef3_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h1754e88_1 +- - gap-defaults=4.14.0=h8af1aa0_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h1754e88_2 ++ - gap-defaults=4.14.0=h8af1aa0_2 + - gcc=13.3.0=h8a56e6e_1 + - gcc_impl_linux-aarch64=13.3.0=hcdea9b6_1 + - gcc_linux-aarch64=13.3.0=h1cd514b_7 +@@ -84,7 +84,7 @@ dependencies: + - gfortran=13.3.0=h8a56e6e_1 + - gfortran_impl_linux-aarch64=13.3.0=h174a3c4_1 + - gfortran_linux-aarch64=13.3.0=h2809cf8_7 +- - giac=1.9.0.21=h04922a4_1 ++ - giac=1.9.0.21=h6e4ddb9_2 + - givaro=4.2.0=h364d21b_0 + - glpk=5.0=h66325d0_0 + - gmp=6.3.0=h0a1ffab_2 +@@ -95,21 +95,21 @@ dependencies: + - gxx_impl_linux-aarch64=13.3.0=h1211b58_1 + - gxx_linux-aarch64=13.3.0=h2864abd_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hbf49d6b_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h785c1aa_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hf9b3779_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h207f3e5_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h15043fe_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +@@ -117,7 +117,7 @@ dependencies: + - keyutils=1.6.1=h4e544f5_0 + - kiwisolver=1.4.7=py311h75754e6_0 + - krb5=1.21.3=h50a48e9_0 +- - lcalc=2.0.5=he588f68_2 ++ - lcalc=2.0.5=h30a6b3d_3 + - lcms2=2.16=h922389a_0 + - ld_impl_linux-aarch64=2.43=h80caac9_2 + - lerc=4.0.0=h4de3ea5_0 +@@ -131,27 +131,27 @@ dependencies: + - libbrotlidec=1.1.0=h86ecc28_2 + - libbrotlienc=1.1.0=h86ecc28_2 + - libcblas=3.9.0=26_linuxaarch64_openblas +- - libclang-cpp19.1=19.1.6=default_he324ac1_0 +- - libclang13=19.1.6=default_h4390ef5_0 ++ - libclang-cpp19.1=19.1.7=default_he324ac1_0 ++ - libclang13=19.1.7=default_h4390ef5_0 + - libcups=2.3.3=h405e4a8_4 + - libcurl=8.11.1=h6702fde_0 + - libdeflate=1.23=h5e3c512_0 + - libdrm=2.4.124=h86ecc28_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h976ea20_0 + - libegl=1.7.0=hd24410f_2 + - libev=4.33=h31becfc_2 + - libexpat=2.6.4=h5ad3122_0 + - libffi=3.4.2=h3557bc0_5 +- - libflint=3.1.2=h0433c20_101 ++ - libflint=3.1.3.1=hf9b8075_101 + - libgcc=14.2.0=he277a41_1 + - libgcc-devel_linux-aarch64=13.3.0=h0c07274_101 + - libgcc-ng=14.2.0=he9431aa_1 +- - libgd=2.3.3=h6818b27_10 ++ - libgd=2.3.3=hc8d7b1d_11 + - libgfortran=14.2.0=he9431aa_1 + - libgfortran-ng=14.2.0=he9431aa_1 + - libgfortran5=14.2.0=hb6113d0_1 + - libgl=1.7.0=hd24410f_2 +- - libglib=2.82.2=hc486b8e_0 ++ - libglib=2.82.2=hc486b8e_1 + - libglvnd=1.7.0=hd24410f_2 + - libglx=1.7.0=hd24410f_2 + - libgomp=14.2.0=he277a41_1 +@@ -160,7 +160,7 @@ dependencies: + - libjpeg-turbo=3.0.0=h31becfc_1 + - liblapack=3.9.0=26_linuxaarch64_openblas + - liblapacke=3.9.0=26_linuxaarch64_openblas +- - libllvm19=19.1.6=h2edbd07_0 ++ - libllvm19=19.1.7=h2edbd07_0 + - liblzma=5.6.3=h86ecc28_1 + - liblzma-devel=5.6.3=h86ecc28_1 + - libnghttp2=1.64.0=hc8609a4_0 +@@ -169,18 +169,18 @@ dependencies: + - libopenblas=0.3.28=pthreads_h9d3fd7e_1 + - libopengl=1.7.0=hd24410f_2 + - libpciaccess=0.18=h31becfc_0 +- - libpng=1.6.44=hc4a20ef_0 ++ - libpng=1.6.45=hec79eb8_0 + - libpq=17.2=hd56632b_1 + - libsanitizer=13.3.0=ha58e236_1 + - libsodium=1.0.20=h68df207_0 +- - libsqlite=3.47.2=h5eb1b54_0 ++ - libsqlite=3.48.0=h5eb1b54_1 + - libssh2=1.11.1=ha41c0db_0 + - libstdcxx=14.2.0=h3f4de04_1 + - libstdcxx-devel_linux-aarch64=13.3.0=h0c07274_101 + - libstdcxx-ng=14.2.0=hf1166c9_1 + - libtiff=4.7.0=h88f7998_3 + - libuuid=2.38.1=hb4cce97_0 +- - libwebp-base=1.4.0=h31becfc_0 ++ - libwebp-base=1.5.0=h0886dbf_0 + - libxcb=1.17.0=h262b8f6_0 + - libxcrypt=4.4.36=h31becfc_1 + - libxkbcommon=1.7.0=h46f2afe_1 +@@ -188,7 +188,7 @@ dependencies: + - libxslt=1.1.39=h1cc9640_0 + - libzlib=1.3.1=h86ecc28_2 + - linbox=1.7.0=hf74d613_1 +- - llvm-openmp=19.1.6=h013ceaa_0 ++ - llvm-openmp=19.1.7=h013ceaa_0 + - lrcalc=2.1=h5ad3122_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hedfd65a_1006 +@@ -206,22 +206,22 @@ dependencies: + - mpfr=4.2.1=h2305555_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h3f5c77f_3 +- - mysql-libs=9.0.1=h11569fd_3 ++ - mysql-common=9.0.1=h3f5c77f_4 ++ - mysql-libs=9.0.1=h11569fd_4 + - nauty=2.8.8=h31becfc_1 +- - ncurses=6.5=hcccb83c_1 ++ - ncurses=6.5=ha32ae93_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h70be974_0 + - ntl=11.4.3=h0d7519b_1 +- - numpy=1.26.4=py311h69ead2a_0 ++ - numpy=2.2.2=py311h6c2b7b4_0 + - openblas=0.3.28=pthreads_h3a8cbd8_1 + - openjpeg=2.5.3=h3f56577_0 + - openldap=2.6.9=h30c48ee_0 +- - openssl=3.4.0=h86ecc28_0 ++ - openssl=3.4.0=hd08dc88_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hb9de7d4_0 +- - pari=2.15.5=h169c2a7_2_pthread ++ - pari=2.17.1=h45cace7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -231,7 +231,7 @@ dependencies: + - perl=5.32.1=7_h31becfc_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311hb2a0dd2_0 ++ - pillow=11.1.0=py311ha4eaa5e_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h86a87f0_0 + - pkg-config=0.29.2=hce167ba_1009 +@@ -240,18 +240,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h984aac9_1006 +- - pplpy=0.8.9=py311ha3770eb_1 +- - primecount=7.9=hd600fc2_0 +- - primecountpy=0.1.0=py311h098ece5_4 +- - primesieve=11.1=h2f0025b_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311ha879c10_0 ++ - pplpy=0.8.9=py311h3d7cd5b_2 ++ - primecount=7.14=hfe4b40e_0 ++ - primecountpy=0.1.0=py311hc07b1fb_5 ++ - primesieve=12.4=h0a1ffab_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311ha879c10_0 + - pthread-stubs=0.4=h86ecc28_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py311habb2604_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -265,43 +265,43 @@ dependencies: + - pyzmq=26.2.0=py311h826da9f_3 + - qd=2.3.22=h05efe27_1004 + - qhull=2020.2=h70be974_5 +- - qt6-main=6.8.1=h0d3cc05_0 ++ - qt6-main=6.8.1=ha0a94ed_2 + - readline=8.2=h8fc344f_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=h31becfc_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311h5912639_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311h13dcf5b_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hee12f27_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h578a6b9_0 ++ - sqlite=3.48.0=h578a6b9_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hd600fc2_0 +- - sympow=2.023.6=h157afb5_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-aarch64=2.17=h5b4a56d_18 ++ - sympow=2.023.6=h4d450c3_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-aarch64=2.17=h68829e0_18 + - tachyon=0.99b6=ha0bfc61_1002 + - tk=8.6.13=h194ca79_0 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py311h5487e9b_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311ha879c10_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311ha879c10_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h698ed42_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.11-linux.yml b/environment-3.11-linux.yml +index 2d99c14d61c..18b21418a74 100644 +--- a/environment-3.11-linux.yml ++++ b/environment-3.11-linux.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-64 +-# input_hash: 71d6929e3ba448868bcdf30d6cb1d190d88758e7272df5cf428554adbbf0ff6a ++# input_hash: 45c87b39adab7299f4500096956e14d99327f4a9bb48bc2fc7ced5996c569943 + + channels: + - conda-forge +@@ -10,12 +10,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=hb9d3cd8_0 +- - arpack=3.9.1=nompi_h77f6705_101 ++ - arpack=3.9.1=nompi_hf03ea27_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2b4cb7a_1 + - automake=1.17=pl5321ha770c72_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h4bd325d_0 ++ - bdw-gc=8.2.8=h5888daf_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=h4852527_2 + - binutils_impl_linux-64=2.43=h4bf12b8_2 +@@ -29,33 +29,33 @@ dependencies: + - brotli-python=1.1.0=py311hfdbb021_2 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.4=hb9d3cd8_0 +- - c-compiler=1.8.0=h2b85faf_1 ++ - c-compiler=1.9.0=h2b85faf_0 + - ca-certificates=2024.12.14=hbcca054_0 + - cairo=1.18.2=h3394656_1 + - cddlib=1!0.94m=h9202a9a_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311hf29c0ef_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=hd590300_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py311hd18a35c_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311h2dc5d0c_0 ++ - coverage=7.6.10=py311h2dc5d0c_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=h1a2810e_1 ++ - cxx-compiler=1.9.0=h1a2810e_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311hd2352ae_0 ++ - cypari2=2.2.1=py311h8699650_0 + - cyrus-sasl=2.1.27=h54b06d7_7 +- - cysignals=1.11.2=py311h82528dc_3 ++ - cysignals=1.12.3=py311hfdbb021_0 + - cython=3.0.11=py311h55d416d_3 + - dbus=1.13.6=h5008d03_3 +- - debugpy=1.8.11=py311hfdbb021_0 ++ - debugpy=1.8.12=py311hfdbb021_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h59595ed_0 + - ecl=24.5.10=h0f3afd4_0 +- - eclib=20231212=h43e5eba_1 ++ - eclib=20231212=h75fb491_2 + - ecm=7.0.5=h9458935_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -69,14 +69,14 @@ dependencies: + - fontconfig=2.15.0=h7e30c49_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311h2dc5d0c_0 +- - fortran-compiler=1.8.0=h36df796_1 +- - fplll=5.4.5=h384768b_0 +- - fpylll=0.6.1=py311hcfae7cf_0 ++ - fonttools=4.55.6=py311h2dc5d0c_0 ++ - fortran-compiler=1.9.0=h36df796_0 ++ - fplll=5.5.0=hd20a173_0 ++ - fpylll=0.6.2=py311hf0b6740_0 + - freetype=2.12.1=h267a509_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h3b03731_1 +- - gap-defaults=4.14.0=ha770c72_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h3b03731_2 ++ - gap-defaults=4.14.0=ha770c72_2 + - gcc=13.3.0=h9576a4e_1 + - gcc_impl_linux-64=13.3.0=hfea6d02_1 + - gcc_linux-64=13.3.0=hc28eda2_7 +@@ -85,7 +85,7 @@ dependencies: + - gfortran=13.3.0=h9576a4e_1 + - gfortran_impl_linux-64=13.3.0=h10434e7_1 + - gfortran_linux-64=13.3.0=hb919d3a_7 +- - giac=1.9.0.21=h673759e_1 ++ - giac=1.9.0.21=hca478b9_2 + - givaro=4.2.0=hb789bce_0 + - glpk=5.0=h445213a_0 + - gmp=6.3.0=hac33072_2 +@@ -96,21 +96,21 @@ dependencies: + - gxx_impl_linux-64=13.3.0=hdbfa832_1 + - gxx_linux-64=13.3.0=h6834431_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hda332d3_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h4bba637_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=he02047a_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=he44f51b_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h623f65a_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +@@ -118,7 +118,7 @@ dependencies: + - keyutils=1.6.1=h166bdaf_0 + - kiwisolver=1.4.7=py311hd18a35c_0 + - krb5=1.21.3=h659f571_0 +- - lcalc=2.0.5=h5aac1b6_2 ++ - lcalc=2.0.5=h9cf73fc_3 + - lcms2=2.16=hb7c19ff_0 + - ld_impl_linux-64=2.43=h712a8e2_2 + - lerc=4.0.0=h27087fc_0 +@@ -132,27 +132,27 @@ dependencies: + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=26_linux64_openblas +- - libclang-cpp19.1=19.1.6=default_hb5137d0_0 +- - libclang13=19.1.6=default_h9c6a7e4_0 ++ - libclang-cpp19.1=19.1.7=default_hb5137d0_0 ++ - libclang13=19.1.7=default_h9c6a7e4_0 + - libcups=2.3.3=h4637d8d_4 + - libcurl=8.11.1=h332b0f4_0 + - libdeflate=1.23=h4ddbbb0_0 + - libdrm=2.4.124=hb9d3cd8_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h7949ede_0 + - libegl=1.7.0=ha4b6fd6_2 + - libev=4.33=hd590300_2 + - libexpat=2.6.4=h5888daf_0 + - libffi=3.4.2=h7f98852_5 +- - libflint=3.1.2=h6fb9888_101 ++ - libflint=3.1.3.1=h0aae882_101 + - libgcc=14.2.0=h77fa898_1 + - libgcc-devel_linux-64=13.3.0=h84ea5a7_101 + - libgcc-ng=14.2.0=h69a702a_1 +- - libgd=2.3.3=hd3e95f3_10 ++ - libgd=2.3.3=h6f5c62b_11 + - libgfortran=14.2.0=h69a702a_1 + - libgfortran-ng=14.2.0=h69a702a_1 + - libgfortran5=14.2.0=hd5240d6_1 + - libgl=1.7.0=ha4b6fd6_2 +- - libglib=2.82.2=h2ff4ddf_0 ++ - libglib=2.82.2=h2ff4ddf_1 + - libglvnd=1.7.0=ha4b6fd6_2 + - libglx=1.7.0=ha4b6fd6_2 + - libgomp=14.2.0=h77fa898_1 +@@ -161,27 +161,27 @@ dependencies: + - libjpeg-turbo=3.0.0=hd590300_1 + - liblapack=3.9.0=26_linux64_openblas + - liblapacke=3.9.0=26_linux64_openblas +- - libllvm19=19.1.6=ha7bfdaf_0 ++ - libllvm19=19.1.7=ha7bfdaf_0 + - liblzma=5.6.3=hb9d3cd8_1 + - liblzma-devel=5.6.3=hb9d3cd8_1 + - libnghttp2=1.64.0=h161d5f1_0 + - libnsl=2.0.1=hd590300_0 +- - libntlm=1.4=h7f98852_1002 ++ - libntlm=1.8=hb9d3cd8_0 + - libopenblas=0.3.28=pthreads_h94d23a6_1 + - libopengl=1.7.0=ha4b6fd6_2 + - libpciaccess=0.18=hd590300_0 +- - libpng=1.6.44=hadc24fc_0 ++ - libpng=1.6.45=h943b412_0 + - libpq=17.2=h3b95a9b_1 + - libsanitizer=13.3.0=heb74ff8_1 + - libsodium=1.0.20=h4ab18f5_0 +- - libsqlite=3.47.2=hee588c1_0 ++ - libsqlite=3.48.0=hee588c1_1 + - libssh2=1.11.1=hf672d98_0 + - libstdcxx=14.2.0=hc0a3c3a_1 + - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101 + - libstdcxx-ng=14.2.0=h4852527_1 + - libtiff=4.7.0=hd9ff511_3 + - libuuid=2.38.1=h0b41bf4_0 +- - libwebp-base=1.4.0=hd590300_0 ++ - libwebp-base=1.5.0=h851e524_0 + - libxcb=1.17.0=h8a09558_0 + - libxcrypt=4.4.36=hd590300_1 + - libxkbcommon=1.7.0=h2c5496b_1 +@@ -189,7 +189,7 @@ dependencies: + - libxslt=1.1.39=h76b75d6_0 + - libzlib=1.3.1=hb9d3cd8_2 + - linbox=1.7.0=h7298d08_1 +- - llvm-openmp=19.1.6=h024ca30_0 ++ - llvm-openmp=19.1.7=h024ca30_0 + - lrcalc=2.1=h5888daf_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hae5d5c5_1006 +@@ -207,22 +207,22 @@ dependencies: + - mpfr=4.2.1=h90cbb55_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h266115a_3 +- - mysql-libs=9.0.1=he0572af_3 ++ - mysql-common=9.0.1=h266115a_4 ++ - mysql-libs=9.0.1=he0572af_4 + - nauty=2.8.8=hd590300_1 +- - ncurses=6.5=he02047a_1 ++ - ncurses=6.5=h2d0b736_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h297d8ca_0 + - ntl=11.4.3=hef3c4d3_1 +- - numpy=1.26.4=py311h64a7726_0 ++ - numpy=2.2.2=py311h5d046bc_0 + - openblas=0.3.28=pthreads_h6ec200e_1 + - openjpeg=2.5.3=h5fbd93e_0 + - openldap=2.6.9=he970967_0 +- - openssl=3.4.0=hb9d3cd8_0 ++ - openssl=3.4.0=h7b32b05_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h36c2ea0_0 +- - pari=2.15.5=h4d4ae9b_2_pthread ++ - pari=2.17.1=ha40142e_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -232,7 +232,7 @@ dependencies: + - perl=5.32.1=7_hd590300_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311h49e9ac3_0 ++ - pillow=11.1.0=py311h1322bbf_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h29eaf8c_0 + - pkg-config=0.29.2=h4bc722e_1009 +@@ -241,18 +241,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h6ec01c2_1006 +- - pplpy=0.8.9=py311ha9f9f00_1 +- - primecount=7.9=hcb278e6_0 +- - primecountpy=0.1.0=py311h9547e67_4 +- - primesieve=11.1=h59595ed_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311h9ecbd09_0 ++ - pplpy=0.8.9=py311h17071fb_2 ++ - primecount=7.14=h530483c_0 ++ - primecountpy=0.1.0=py311hd18a35c_5 ++ - primesieve=12.4=he02047a_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311h9ecbd09_0 + - pthread-stubs=0.4=hb9d3cd8_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py311h9053184_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -266,43 +266,43 @@ dependencies: + - pyzmq=26.2.0=py311h7deb3e3_3 + - qd=2.3.22=h2cc385e_1004 + - qhull=2020.2=h434a139_5 +- - qt6-main=6.8.1=h9d28a51_0 ++ - qt6-main=6.8.1=h588cce1_2 + - readline=8.2=h8228510_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=hd590300_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311he9a78e4_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311hc1ac118_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hc910cb2_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h9eae976_0 ++ - sqlite=3.48.0=h9eae976_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hcb278e6_0 +- - sympow=2.023.6=hc6ab17c_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-64=2.17=h4a8ded7_18 ++ - sympow=2.023.6=h3028977_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-64=2.17=h0157908_18 + - tachyon=0.99b6=hba7d16a_1002 + - tk=8.6.13=noxft_h4845f30_101 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py311h9ecbd09_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311h9ecbd09_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311h9ecbd09_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h3e06ad9_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.11-macos-x86_64.yml b/environment-3.11-macos-x86_64.yml +index fb34c25a567..b68c0feb98e 100644 +--- a/environment-3.11-macos-x86_64.yml ++++ b/environment-3.11-macos-x86_64.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-64 +-# input_hash: 58971dc791eb5f5f7e12b0e44db07ecd9b2fc48def89f671effaabd2bd0720d6 ++# input_hash: 8fa3ecd8c3d833b875f3db11bdea6e4c970fe7eae9e991e45ec6979be4e7b00f + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_hf81eadf_101 ++ - arpack=3.9.1=nompi_hdfe9103_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hed12c24_1 + - automake=1.17=pl5321h694c41f_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h940c156_0 ++ - bdw-gc=8.2.8=h240833e_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osx64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py311hd89902b_2 + - bzip2=1.0.8=hfdf4475_7 + - c-ares=1.34.4=hf13058a_0 +- - c-compiler=1.8.0=hfc4bf79_1 ++ - c-compiler=1.9.0=h09a7c41_0 + - ca-certificates=2024.12.14=h8857fd0_0 +- - cctools=1010.6=h5b2de21_2 +- - cctools_osx-64=1010.6=hea4301f_2 ++ - cctools=1010.6=hd3558d4_2 ++ - cctools_osx-64=1010.6=h00edd4c_2 + - cddlib=1!0.94m=h0f52abe_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311h137bacd_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_he371ed4_7 +- - clang-17=17.0.6=default_hb173f14_7 +- - clang_impl_osx-64=17.0.6=h1af8efd_23 +- - clang_osx-64=17.0.6=h7e5c614_23 +- - clangxx=17.0.6=default_he371ed4_7 +- - clangxx_impl_osx-64=17.0.6=hc3430b7_23 +- - clangxx_osx-64=17.0.6=h7e5c614_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h179603d_5 ++ - clang-18=18.1.8=default_h0c94c6a_5 ++ - clang_impl_osx-64=18.1.8=h6a44ed1_23 ++ - clang_osx-64=18.1.8=h7e5c614_23 ++ - clangxx=18.1.8=default_h179603d_5 ++ - clangxx_impl_osx-64=18.1.8=h4b7810f_23 ++ - clangxx_osx-64=18.1.8=h7e5c614_23 + - cliquer=1.22=h10d778d_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h1020d70_2 +- - compiler-rt_osx-64=17.0.6=hf2b8a54_2 ++ - compiler-rt=18.1.8=h1020d70_1 ++ - compiler-rt_osx-64=18.1.8=hf2b8a54_1 + - contourpy=1.3.1=py311h4e34fa0_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311ha3cf9ac_0 ++ - coverage=7.6.10=py311ha3cf9ac_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=h385f146_1 ++ - cxx-compiler=1.9.0=h20888b2_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311h4fde0ae_0 +- - cysignals=1.11.2=py311h8a58447_3 ++ - cypari2=2.2.1=py311h29339b9_0 ++ - cysignals=1.12.3=py311hc356e98_0 + - cython=3.0.11=py311h4cb39f0_3 +- - debugpy=1.8.11=py311hc356e98_0 ++ - debugpy=1.8.12=py311hc356e98_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=24.5.10=h56bac16_0 +- - eclib=20231212=h960c116_1 ++ - eclib=20231212=ha63dd29_2 + - ecm=7.0.5=h4f6b447_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h37eeddb_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311ha3cf9ac_0 +- - fortran-compiler=1.8.0=h33d1f46_1 +- - fplll=5.4.5=hb7981ad_0 +- - fpylll=0.6.1=py311h85fbf69_0 ++ - fonttools=4.55.6=py311ha3cf9ac_0 ++ - fortran-compiler=1.9.0=h02557f8_0 ++ - fplll=5.5.0=h6ede486_0 ++ - fpylll=0.6.2=py311h793c761_0 + - freetype=2.12.1=h60636b9_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=hb9686a1_1 +- - gap-defaults=4.14.0=h694c41f_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=hb9686a1_2 ++ - gap-defaults=4.14.0=h694c41f_2 + - gettext=0.22.5=hdfe23c8_3 + - gettext-tools=0.22.5=hdfe23c8_3 + - gf2x=1.3.0=h35ac7d9_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h2c809b3_1 + - gfortran_impl_osx-64=13.2.0=h2bc304d_3 + - gfortran_osx-64=13.2.0=h18f7dce_1 +- - giac=1.9.0.21=h92f3f65_1 ++ - giac=1.9.0.21=h381f543_2 + - givaro=4.2.0=h1b3d6f7_0 + - glpk=5.0=h3cb5acd_0 + - gmp=6.3.0=hf036a51_2 + - gmpy2=2.1.5=py311h7945f45_3 + - gsl=2.7=h93259b0_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=h120a0e1_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h5479cbe_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h61918c1_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h2e86a7b_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kiwisolver=1.4.7=py311hf2f7c97_0 + - krb5=1.21.3=h37d8d59_0 +- - lcalc=2.0.5=h547a6ed_2 ++ - lcalc=2.0.5=h0f747f7_3 + - lcms2=2.16=ha2f27b4_0 +- - ld64=951.9=h0a3eb4e_2 +- - ld64_osx-64=951.9=h5ffbe8e_2 ++ - ld64=951.9=h4e51db5_2 ++ - ld64_osx-64=951.9=hc8d1a19_2 + - lerc=4.0.0=hb486fe8_0 + - libasprintf=0.22.5=hdfe23c8_3 + - libasprintf-devel=0.22.5=hdfe23c8_3 +@@ -130,17 +130,17 @@ dependencies: + - libbrotlidec=1.1.0=h00291cd_2 + - libbrotlienc=1.1.0=h00291cd_2 + - libcblas=3.9.0=26_osx64_openblas +- - libclang-cpp17=17.0.6=default_hb173f14_7 ++ - libclang-cpp18.1=18.1.8=default_h0c94c6a_5 + - libcurl=8.11.1=h5dec5d8_0 +- - libcxx=19.1.6=hf95d169_1 +- - libcxx-devel=17.0.6=h8f8a49f_6 ++ - libcxx=19.1.7=hf95d169_0 ++ - libcxx-devel=18.1.8=h7c275be_7 + - libdeflate=1.23=he65b83e_0 +- - libedit=3.1.20191231=h0678c8f_2 ++ - libedit=3.1.20240808=pl5321ha958ccf_0 + - libev=4.33=h10d778d_2 + - libexpat=2.6.4=h240833e_0 + - libffi=3.4.2=h0d85af4_5 +- - libflint=3.1.2=h1d27844_101 +- - libgd=2.3.3=h2e77e4f_10 ++ - libflint=3.1.3.1=h9ab60bc_101 ++ - libgd=2.3.3=h8555400_11 + - libgettextpo=0.22.5=hdfe23c8_3 + - libgettextpo-devel=0.22.5=hdfe23c8_3 + - libgfortran=5.0.0=13_2_0_h97931a8_3 +@@ -153,23 +153,24 @@ dependencies: + - libjpeg-turbo=3.0.0=h0dc2134_1 + - liblapack=3.9.0=26_osx64_openblas + - liblapacke=3.9.0=26_osx64_openblas +- - libllvm17=17.0.6=hbedff68_1 ++ - libllvm18=18.1.8=h9ce406d_2 + - liblzma=5.6.3=hd471939_1 + - liblzma-devel=5.6.3=hd471939_1 + - libnghttp2=1.64.0=hc7306c3_0 + - libopenblas=0.3.28=openmp_hbf64a52_1 +- - libpng=1.6.44=h4b8f8c9_0 ++ - libpng=1.6.45=h3c4a55f_0 + - libsodium=1.0.20=hfdf4475_0 +- - libsqlite=3.47.2=hdb6dae5_0 ++ - libsqlite=3.48.0=hdb6dae5_1 + - libssh2=1.11.1=h3dc7d44_0 + - libtiff=4.7.0=hb77a491_3 +- - libwebp-base=1.4.0=h10d778d_0 ++ - libwebp-base=1.5.0=h6cf52b4_0 + - libxcb=1.17.0=hf1f96e2_0 + - libxml2=2.13.5=hebb159f_1 + - libzlib=1.3.1=hd23fc13_2 + - linbox=1.7.0=h9325161_1 +- - llvm-openmp=19.1.6=ha54dae1_0 +- - llvm-tools=17.0.6=hbedff68_1 ++ - llvm-openmp=19.1.7=ha54dae1_0 ++ - llvm-tools=18.1.8=h9ce406d_2 ++ - llvm-tools-18=18.1.8=h9ce406d_2 + - lrcalc=2.1=hac325c4_7 + - m4=1.4.18=haf1e3a3_1001 + - m4ri=20140914=hd82a5f3_1006 +@@ -188,18 +189,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h10d778d_1 +- - ncurses=6.5=hf036a51_1 ++ - ncurses=6.5=h0622a9a_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h3c5361c_0 + - ntl=11.4.3=h0ab3c2f_1 +- - numpy=1.26.4=py311hc43a94b_0 ++ - numpy=2.2.2=py311h27c81cd_0 + - openblas=0.3.28=openmp_h30af337_1 + - openjpeg=2.5.3=h7fd6d84_0 +- - openssl=3.4.0=hd471939_0 ++ - openssl=3.4.0=hc426f3f_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hbcb3906_0 +- - pari=2.15.5=h7ba67ff_2_pthread ++ - pari=2.17.1=h1ed0f1a_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -208,7 +209,7 @@ dependencies: + - perl=5.32.1=7_h10d778d_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311h1f68098_0 ++ - pillow=11.1.0=py311h25da234_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hf7e621a_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -216,18 +217,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=ha60d53e_1006 +- - pplpy=0.8.9=py311h922ec50_1 +- - primecount=7.6=ha894c9a_0 +- - primecountpy=0.1.0=py311h5fe6e05_4 +- - primesieve=11.0=hf0c8a7f_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311h1314207_0 ++ - pplpy=0.8.9=py311h221ab62_2 ++ - primecount=7.14=h28dbb38_0 ++ - primecountpy=0.1.0=py311h4e34fa0_5 ++ - primesieve=12.4=hf036a51_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311h4d7f069_0 + - pthread-stubs=0.4=h00291cd_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -246,27 +247,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311h86b91e6_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311h9d25053_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h88f4db0_0 + - singular=4.4.0=h604985e_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h2e4c9dc_0 ++ - sqlite=3.48.0=h2e4c9dc_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hf0c8a7f_0 +- - sympow=2.023.6=h115ba6a_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=h7305399_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=h3a1d103_1002 + - tapi=1300.6.5=h390ca13_0 + - tk=8.6.13=h1abcd95_1 +@@ -274,9 +275,9 @@ dependencies: + - tornado=6.4.2=py311h4d7f069_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311h1314207_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311h4d7f069_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/environment-3.11-macos.yml b/environment-3.11-macos.yml +index ec10b78a4b5..84656e580e0 100644 +--- a/environment-3.11-macos.yml ++++ b/environment-3.11-macos.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-arm64 +-# input_hash: 4396163dbc4fafd471282f306c16bb7bd73ecc3c006335c8faf512742014e1e4 ++# input_hash: 5e8fbac460b9515b4cab214ac84ab31b22e5e12e86962f7770faaa3a3c662466 + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_h593882a_101 ++ - arpack=3.9.1=nompi_h1f29f7c_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hcd07c0c_1 + - automake=1.17=pl5321hce30654_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hc021e02_0 ++ - bdw-gc=8.2.8=h286801f_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osxarm64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py311h3f08180_2 + - bzip2=1.0.8=h99b78c6_7 + - c-ares=1.34.4=h5505292_0 +- - c-compiler=1.8.0=hf48404e_1 ++ - c-compiler=1.9.0=hdf49b6b_0 + - ca-certificates=2024.12.14=hf0a4a13_0 +- - cctools=1010.6=hf67d63f_2 +- - cctools_osx-arm64=1010.6=h623e0ac_2 ++ - cctools=1010.6=h4c9edd9_2 ++ - cctools_osx-arm64=1010.6=h908b477_2 + - cddlib=1!0.94m=h6d7a090_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py311h3a79f62_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_h360f5da_7 +- - clang-17=17.0.6=default_h146c034_7 +- - clang_impl_osx-arm64=17.0.6=he47c785_23 +- - clang_osx-arm64=17.0.6=h07b0088_23 +- - clangxx=17.0.6=default_h360f5da_7 +- - clangxx_impl_osx-arm64=17.0.6=h50f59cd_23 +- - clangxx_osx-arm64=17.0.6=h07b0088_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h675cc0c_5 ++ - clang-18=18.1.8=default_h5c12605_5 ++ - clang_impl_osx-arm64=18.1.8=h2ae9ea5_23 ++ - clang_osx-arm64=18.1.8=h07b0088_23 ++ - clangxx=18.1.8=default_h675cc0c_5 ++ - clangxx_impl_osx-arm64=18.1.8=h555f467_23 ++ - clangxx_osx-arm64=18.1.8=h07b0088_23 + - cliquer=1.22=h93a5062_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h856b3c1_2 +- - compiler-rt_osx-arm64=17.0.6=h832e737_2 ++ - compiler-rt=18.1.8=h856b3c1_1 ++ - compiler-rt_osx-arm64=18.1.8=h832e737_1 + - contourpy=1.3.1=py311h210dab8_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py311h4921393_0 ++ - coverage=7.6.10=py311h4921393_0 + - cpython=3.11.11=py311hd8ed1ab_1 +- - cxx-compiler=1.8.0=h18dbf2f_1 ++ - cxx-compiler=1.9.0=hba80287_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py311h2c49a9d_0 +- - cysignals=1.11.2=py311he42fc87_3 ++ - cypari2=2.2.1=py311haabaa81_0 ++ - cysignals=1.12.3=py311h155a34a_0 + - cython=3.0.11=py311hf7f79b8_3 +- - debugpy=1.8.11=py311h155a34a_0 ++ - debugpy=1.8.12=py311h155a34a_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=23.9.9=h1d9728a_0 +- - eclib=20231212=h3d50bd9_1 ++ - eclib=20231212=hc39b9a7_2 + - ecm=7.0.5=h41d338b_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h1383a14_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py311h4921393_0 +- - fortran-compiler=1.8.0=hc3477c4_1 +- - fplll=5.4.5=hb7d509d_0 +- - fpylll=0.6.1=py311h341b96b_0 ++ - fonttools=4.55.6=py311h4921393_0 ++ - fortran-compiler=1.9.0=h5692697_0 ++ - fplll=5.5.0=h2a2278a_0 ++ - fpylll=0.6.2=py311h4044dbd_0 + - freetype=2.12.1=hadb7bae_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h25f1785_1 +- - gap-defaults=4.14.0=hce30654_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h25f1785_2 ++ - gap-defaults=4.14.0=hce30654_2 + - gettext=0.22.5=h8414b35_3 + - gettext-tools=0.22.5=h8414b35_3 + - gf2x=1.3.0=hf8f8af4_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h1ca8e4b_1 + - gfortran_impl_osx-arm64=13.2.0=h252ada1_3 + - gfortran_osx-arm64=13.2.0=h57527a5_1 +- - giac=1.9.0.21=h1c96721_1 ++ - giac=1.9.0.21=h573964a_2 + - givaro=4.2.0=h018886a_0 + - glpk=5.0=h6d7a090_0 + - gmp=6.3.0=h7bae524_2 + - gmpy2=2.1.5=py311hb5d9ff4_3 + - gsl=2.7=h6e638da_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hfee45f7_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h3fe6531_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=hd73f12c_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h347afa1_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kiwisolver=1.4.7=py311h2c37856_0 + - krb5=1.21.3=h237132a_0 +- - lcalc=2.0.5=h4a402bc_2 ++ - lcalc=2.0.5=hdaf6845_3 + - lcms2=2.16=ha0e7c42_0 +- - ld64=951.9=h39a299f_2 +- - ld64_osx-arm64=951.9=h3f9b568_2 ++ - ld64=951.9=h4c6efb1_2 ++ - ld64_osx-arm64=951.9=hfc0fa09_2 + - lerc=4.0.0=h9a09cb3_0 + - libasprintf=0.22.5=h8414b35_3 + - libasprintf-devel=0.22.5=h8414b35_3 +@@ -130,23 +130,23 @@ dependencies: + - libbrotlidec=1.1.0=hd74edd7_2 + - libbrotlienc=1.1.0=hd74edd7_2 + - libcblas=3.9.0=26_osxarm64_openblas +- - libclang-cpp17=17.0.6=default_h146c034_7 ++ - libclang-cpp18.1=18.1.8=default_h5c12605_5 + - libcurl=8.11.1=h73640d1_0 +- - libcxx=19.1.6=ha82da77_1 +- - libcxx-devel=17.0.6=h86353a2_6 ++ - libcxx=19.1.7=ha82da77_0 ++ - libcxx-devel=18.1.8=h6dc3340_7 + - libdeflate=1.23=hec38601_0 +- - libedit=3.1.20191231=hc8eb9b7_2 ++ - libedit=3.1.20240808=pl5321hafb1f1b_0 + - libev=4.33=h93a5062_2 + - libexpat=2.6.4=h286801f_0 + - libffi=3.4.2=h3422bc3_5 +- - libflint=3.1.2=he28cf6d_101 +- - libgd=2.3.3=hac1b3a8_10 ++ - libflint=3.1.3.1=ha3035ea_101 ++ - libgd=2.3.3=hb2c3a21_11 + - libgettextpo=0.22.5=h8414b35_3 + - libgettextpo-devel=0.22.5=h8414b35_3 + - libgfortran=5.0.0=13_2_0_hd922786_3 + - libgfortran-devel_osx-arm64=13.2.0=h5d7a38c_3 + - libgfortran5=13.2.0=hf226fd6_3 +- - libglib=2.82.2=h07bd6cf_0 ++ - libglib=2.82.2=hdff4504_1 + - libhomfly=1.02r6=h93a5062_1 + - libiconv=1.17=h0d3ecfb_2 + - libintl=0.22.5=h8414b35_3 +@@ -154,23 +154,24 @@ dependencies: + - libjpeg-turbo=3.0.0=hb547adb_1 + - liblapack=3.9.0=26_osxarm64_openblas + - liblapacke=3.9.0=26_osxarm64_openblas +- - libllvm17=17.0.6=h5090b49_2 ++ - libllvm18=18.1.8=h5090b49_2 + - liblzma=5.6.3=h39f12f2_1 + - liblzma-devel=5.6.3=h39f12f2_1 + - libnghttp2=1.64.0=h6d7220d_0 + - libopenblas=0.3.28=openmp_hf332438_1 +- - libpng=1.6.44=hc14010f_0 ++ - libpng=1.6.45=h3783ad8_0 + - libsodium=1.0.20=h99b78c6_0 +- - libsqlite=3.47.2=h3f77e49_0 ++ - libsqlite=3.48.0=h3f77e49_1 + - libssh2=1.11.1=h9cc3647_0 + - libtiff=4.7.0=h551f018_3 +- - libwebp-base=1.4.0=h93a5062_0 ++ - libwebp-base=1.5.0=h2471fea_0 + - libxcb=1.17.0=hdb1d25a_0 + - libxml2=2.13.5=h178c5d8_1 + - libzlib=1.3.1=h8359307_2 + - linbox=1.7.0=h9da6ecd_1 +- - llvm-openmp=19.1.6=hdb05f8b_0 +- - llvm-tools=17.0.6=h5090b49_2 ++ - llvm-openmp=19.1.7=hdb05f8b_0 ++ - llvm-tools=18.1.8=h5090b49_2 ++ - llvm-tools-18=18.1.8=h5090b49_2 + - lrcalc=2.1=hf9b8971_7 + - m4=1.4.18=h642e427_1001 + - m4ri=20140914=hc97c1ff_1006 +@@ -189,18 +190,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h93a5062_1 +- - ncurses=6.5=h7bae524_1 ++ - ncurses=6.5=h5e97a16_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h420ef59_0 + - ntl=11.4.3=hbb3f309_1 +- - numpy=1.26.4=py311h7125741_0 ++ - numpy=2.2.2=py311h762c074_0 + - openblas=0.3.28=openmp_hea878ba_1 + - openjpeg=2.5.3=h8a3d83b_0 +- - openssl=3.4.0=h39f12f2_0 ++ - openssl=3.4.0=h81ee809_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h27ca646_0 +- - pari=2.15.5=h4f2304c_2_pthread ++ - pari=2.17.1=h49d18c7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -210,7 +211,7 @@ dependencies: + - perl=5.32.1=7_h4614cfb_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py311h3894ae9_0 ++ - pillow=11.1.0=py311hb9ba9e9_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hde07d2e_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -218,18 +219,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h8b147cf_1006 +- - pplpy=0.8.9=py311h3d77d83_1 +- - primecount=7.6=hb6e4faa_0 +- - primecountpy=0.1.0=py311he4fd1f5_4 +- - primesieve=11.0=hb7217d7_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py311hae2e1ce_0 ++ - pplpy=0.8.9=py311h911f23a_2 ++ - primecount=7.14=ha84d530_0 ++ - primecountpy=0.1.0=py311h210dab8_5 ++ - primesieve=12.4=h00cdb27_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py311h917b07b_0 + - pthread-stubs=0.4=hd74edd7_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -248,27 +249,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py311hf056e50_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py311h809cfb5_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h44b9a77_0 + - singular=4.4.0=h5a8969a_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=hd7222ec_0 ++ - sqlite=3.48.0=hd7222ec_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hb7217d7_0 +- - sympow=2.023.6=hb0babe8_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=hc13a52f_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=hb8a568e_1002 + - tapi=1300.6.5=h03f4b80_0 + - tk=8.6.13=h5083fa2_1 +@@ -276,9 +277,9 @@ dependencies: + - tornado=6.4.2=py311h917b07b_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py311hae2e1ce_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py311h917b07b_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/environment-3.12-linux-aarch64.yml b/environment-3.12-linux-aarch64.yml +index b97f90268d1..2446ad05b1c 100644 +--- a/environment-3.12-linux-aarch64.yml ++++ b/environment-3.12-linux-aarch64.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-aarch64 +-# input_hash: 28dba81f3f7cbaa4e6f35a34c9679049f47c3d73414a0a80eda04a53603e8a12 ++# input_hash: 7a6a0ff484e658c4a62a4eaf83b31a521a92aa6e6681138a6c141b28e7fa0c44 + + channels: + - conda-forge +@@ -9,12 +9,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=h86ecc28_0 +- - arpack=3.9.1=nompi_hd363cd0_101 ++ - arpack=3.9.1=nompi_h6fc4d3a_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2148fe1_1 + - automake=1.17=pl5321h8af1aa0_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hd62202e_0 ++ - bdw-gc=8.2.8=h5ad3122_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=hf1166c9_2 + - binutils_impl_linux-aarch64=2.43=h4c662bb_2 +@@ -28,33 +28,33 @@ dependencies: + - brotli-python=1.1.0=py312h6f74592_2 + - bzip2=1.0.8=h68df207_7 + - c-ares=1.34.4=h86ecc28_0 +- - c-compiler=1.8.0=h6561dab_1 ++ - c-compiler=1.9.0=h6561dab_0 + - ca-certificates=2024.12.14=hcefe29a_0 + - cairo=1.18.2=h83712da_1 + - cddlib=1!0.94m=h719063d_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312hac81daf_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=h31becfc_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py312h451a7dd_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h74ce7d3_0 ++ - coverage=7.6.10=py312h74ce7d3_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=heb6c788_1 ++ - cxx-compiler=1.9.0=heb6c788_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h7f7bc3d_0 ++ - cypari2=2.2.1=py312hb80cc37_0 + - cyrus-sasl=2.1.27=hf6b2984_7 +- - cysignals=1.11.2=py312haf3d6d2_3 ++ - cysignals=1.12.3=py312h6f74592_0 + - cython=3.0.11=py312hdfe4e29_3 + - dbus=1.13.6=h12b9eeb_3 +- - debugpy=1.8.11=py312h6f74592_0 ++ - debugpy=1.8.12=py312h6f74592_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h2f0025b_0 + - ecl=24.5.10=h5567cc5_0 +- - eclib=20231212=h154513d_1 ++ - eclib=20231212=h4705ef2_2 + - ecm=7.0.5=ha2d0fc4_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -68,14 +68,14 @@ dependencies: + - fontconfig=2.15.0=h8dda3cd_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312hcc812fe_0 +- - fortran-compiler=1.8.0=h25a59a9_1 +- - fplll=5.4.5=hb3a790e_0 +- - fpylll=0.6.1=py312h8b93be1_0 ++ - fonttools=4.55.6=py312hcc812fe_0 ++ - fortran-compiler=1.9.0=h25a59a9_0 ++ - fplll=5.5.0=h45c7457_0 ++ - fpylll=0.6.2=py312h37c3976_0 + - freetype=2.12.1=hf0a5ef3_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h1754e88_1 +- - gap-defaults=4.14.0=h8af1aa0_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h1754e88_2 ++ - gap-defaults=4.14.0=h8af1aa0_2 + - gcc=13.3.0=h8a56e6e_1 + - gcc_impl_linux-aarch64=13.3.0=hcdea9b6_1 + - gcc_linux-aarch64=13.3.0=h1cd514b_7 +@@ -84,7 +84,7 @@ dependencies: + - gfortran=13.3.0=h8a56e6e_1 + - gfortran_impl_linux-aarch64=13.3.0=h174a3c4_1 + - gfortran_linux-aarch64=13.3.0=h2809cf8_7 +- - giac=1.9.0.21=h04922a4_1 ++ - giac=1.9.0.21=h6e4ddb9_2 + - givaro=4.2.0=h364d21b_0 + - glpk=5.0=h66325d0_0 + - gmp=6.3.0=h0a1ffab_2 +@@ -95,29 +95,29 @@ dependencies: + - gxx_impl_linux-aarch64=13.3.0=h1211b58_1 + - gxx_linux-aarch64=13.3.0=h2864abd_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hbf49d6b_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h785c1aa_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hf9b3779_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h207f3e5_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h15043fe_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kernel-headers_linux-aarch64=4.18.0=h05a177a_18 + - keyutils=1.6.1=h4e544f5_0 +- - kiwisolver=1.4.7=py312h88dc405_0 ++ - kiwisolver=1.4.8=py312h17cf362_0 + - krb5=1.21.3=h50a48e9_0 +- - lcalc=2.0.5=he588f68_2 ++ - lcalc=2.0.5=h30a6b3d_3 + - lcms2=2.16=h922389a_0 + - ld_impl_linux-aarch64=2.43=h80caac9_2 + - lerc=4.0.0=h4de3ea5_0 +@@ -131,27 +131,27 @@ dependencies: + - libbrotlidec=1.1.0=h86ecc28_2 + - libbrotlienc=1.1.0=h86ecc28_2 + - libcblas=3.9.0=26_linuxaarch64_openblas +- - libclang-cpp19.1=19.1.6=default_he324ac1_0 +- - libclang13=19.1.6=default_h4390ef5_0 ++ - libclang-cpp19.1=19.1.7=default_he324ac1_0 ++ - libclang13=19.1.7=default_h4390ef5_0 + - libcups=2.3.3=h405e4a8_4 + - libcurl=8.11.1=h6702fde_0 + - libdeflate=1.23=h5e3c512_0 + - libdrm=2.4.124=h86ecc28_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h976ea20_0 + - libegl=1.7.0=hd24410f_2 + - libev=4.33=h31becfc_2 + - libexpat=2.6.4=h5ad3122_0 + - libffi=3.4.2=h3557bc0_5 +- - libflint=3.1.2=h0433c20_101 ++ - libflint=3.1.3.1=hf9b8075_101 + - libgcc=14.2.0=he277a41_1 + - libgcc-devel_linux-aarch64=13.3.0=h0c07274_101 + - libgcc-ng=14.2.0=he9431aa_1 +- - libgd=2.3.3=h6818b27_10 ++ - libgd=2.3.3=hc8d7b1d_11 + - libgfortran=14.2.0=he9431aa_1 + - libgfortran-ng=14.2.0=he9431aa_1 + - libgfortran5=14.2.0=hb6113d0_1 + - libgl=1.7.0=hd24410f_2 +- - libglib=2.82.2=hc486b8e_0 ++ - libglib=2.82.2=hc486b8e_1 + - libglvnd=1.7.0=hd24410f_2 + - libglx=1.7.0=hd24410f_2 + - libgomp=14.2.0=he277a41_1 +@@ -160,7 +160,7 @@ dependencies: + - libjpeg-turbo=3.0.0=h31becfc_1 + - liblapack=3.9.0=26_linuxaarch64_openblas + - liblapacke=3.9.0=26_linuxaarch64_openblas +- - libllvm19=19.1.6=h2edbd07_0 ++ - libllvm19=19.1.7=h2edbd07_0 + - liblzma=5.6.3=h86ecc28_1 + - liblzma-devel=5.6.3=h86ecc28_1 + - libnghttp2=1.64.0=hc8609a4_0 +@@ -169,18 +169,18 @@ dependencies: + - libopenblas=0.3.28=pthreads_h9d3fd7e_1 + - libopengl=1.7.0=hd24410f_2 + - libpciaccess=0.18=h31becfc_0 +- - libpng=1.6.44=hc4a20ef_0 ++ - libpng=1.6.45=hec79eb8_0 + - libpq=17.2=hd56632b_1 + - libsanitizer=13.3.0=ha58e236_1 + - libsodium=1.0.20=h68df207_0 +- - libsqlite=3.47.2=h5eb1b54_0 ++ - libsqlite=3.48.0=h5eb1b54_1 + - libssh2=1.11.1=ha41c0db_0 + - libstdcxx=14.2.0=h3f4de04_1 + - libstdcxx-devel_linux-aarch64=13.3.0=h0c07274_101 + - libstdcxx-ng=14.2.0=hf1166c9_1 + - libtiff=4.7.0=h88f7998_3 + - libuuid=2.38.1=hb4cce97_0 +- - libwebp-base=1.4.0=h31becfc_0 ++ - libwebp-base=1.5.0=h0886dbf_0 + - libxcb=1.17.0=h262b8f6_0 + - libxcrypt=4.4.36=h31becfc_1 + - libxkbcommon=1.7.0=h46f2afe_1 +@@ -188,7 +188,7 @@ dependencies: + - libxslt=1.1.39=h1cc9640_0 + - libzlib=1.3.1=h86ecc28_2 + - linbox=1.7.0=hf74d613_1 +- - llvm-openmp=19.1.6=h013ceaa_0 ++ - llvm-openmp=19.1.7=h013ceaa_0 + - lrcalc=2.1=h5ad3122_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hedfd65a_1006 +@@ -206,22 +206,22 @@ dependencies: + - mpfr=4.2.1=h2305555_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h3f5c77f_3 +- - mysql-libs=9.0.1=h11569fd_3 ++ - mysql-common=9.0.1=h3f5c77f_4 ++ - mysql-libs=9.0.1=h11569fd_4 + - nauty=2.8.8=h31becfc_1 +- - ncurses=6.5=hcccb83c_1 ++ - ncurses=6.5=ha32ae93_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h70be974_0 + - ntl=11.4.3=h0d7519b_1 +- - numpy=1.26.4=py312h470d778_0 ++ - numpy=2.2.2=py312hce01fe4_0 + - openblas=0.3.28=pthreads_h3a8cbd8_1 + - openjpeg=2.5.3=h3f56577_0 + - openldap=2.6.9=h30c48ee_0 +- - openssl=3.4.0=h86ecc28_0 ++ - openssl=3.4.0=hd08dc88_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hb9de7d4_0 +- - pari=2.15.5=h169c2a7_2_pthread ++ - pari=2.17.1=h45cace7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -231,7 +231,7 @@ dependencies: + - perl=5.32.1=7_h31becfc_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312h5ab5af3_0 ++ - pillow=11.1.0=py312h719f0cf_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h86a87f0_0 + - pkg-config=0.29.2=hce167ba_1009 +@@ -240,18 +240,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h984aac9_1006 +- - pplpy=0.8.9=py312hbd99ab9_1 +- - primecount=7.9=hd600fc2_0 +- - primecountpy=0.1.0=py312h8f0b210_4 +- - primesieve=11.1=h2f0025b_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312hb2c0f52_0 ++ - pplpy=0.8.9=py312h372cae2_2 ++ - primecount=7.14=hfe4b40e_0 ++ - primecountpy=0.1.0=py312h451a7dd_5 ++ - primesieve=12.4=h0a1ffab_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312hb2c0f52_0 + - pthread-stubs=0.4=h86ecc28_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py312hdd999d0_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -265,43 +265,43 @@ dependencies: + - pyzmq=26.2.0=py312h2427ae1_3 + - qd=2.3.22=h05efe27_1004 + - qhull=2020.2=h70be974_5 +- - qt6-main=6.8.1=h0d3cc05_0 ++ - qt6-main=6.8.1=ha0a94ed_2 + - readline=8.2=h8fc344f_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=h31becfc_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312hcbff3fa_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312h9941453_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hee12f27_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h578a6b9_0 ++ - sqlite=3.48.0=h578a6b9_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hd600fc2_0 +- - sympow=2.023.6=h157afb5_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-aarch64=2.17=h5b4a56d_18 ++ - sympow=2.023.6=h4d450c3_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-aarch64=2.17=h68829e0_18 + - tachyon=0.99b6=ha0bfc61_1002 + - tk=8.6.13=h194ca79_0 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py312h52516f5_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312hb2c0f52_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312hb2c0f52_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h698ed42_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.12-linux.yml b/environment-3.12-linux.yml +index 7b2496e151e..f6deedb5a15 100644 +--- a/environment-3.12-linux.yml ++++ b/environment-3.12-linux.yml +@@ -1,7 +1,7 @@ + name: sage-dev + # Generated by conda-lock. + # platform: linux-64 +-# input_hash: 40be535db1c7eaa6a4654bde814ad7958eb5c8b150e3158a6897927158b3bd6f ++# input_hash: ab81a8abe5ec503808a2489bef4941922b01008bd685fc411d26594a68155fbd + + channels: + - conda-forge +@@ -10,12 +10,12 @@ dependencies: + - _openmp_mutex=4.5=2_kmp_llvm + - alabaster=1.0.0=pyhd8ed1ab_1 + - alsa-lib=1.2.13=hb9d3cd8_0 +- - arpack=3.9.1=nompi_h77f6705_101 ++ - arpack=3.9.1=nompi_hf03ea27_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321h2b4cb7a_1 + - automake=1.17=pl5321ha770c72_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h4bd325d_0 ++ - bdw-gc=8.2.8=h5888daf_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - binutils=2.43=h4852527_2 + - binutils_impl_linux-64=2.43=h4bf12b8_2 +@@ -29,33 +29,33 @@ dependencies: + - brotli-python=1.1.0=py312h2ec8cdc_2 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.4=hb9d3cd8_0 +- - c-compiler=1.8.0=h2b85faf_1 ++ - c-compiler=1.9.0=h2b85faf_0 + - ca-certificates=2024.12.14=hbcca054_0 + - cairo=1.18.2=h3394656_1 + - cddlib=1!0.94m=h9202a9a_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312h06ac9bb_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 + - cliquer=1.22=hd590300_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 + - contourpy=1.3.1=py312h68727a3_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h178313f_0 ++ - coverage=7.6.10=py312h178313f_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=h1a2810e_1 ++ - cxx-compiler=1.9.0=h1a2810e_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h597db99_0 ++ - cypari2=2.2.1=py312hb7bab4f_0 + - cyrus-sasl=2.1.27=h54b06d7_7 +- - cysignals=1.11.2=py312h9d3d55b_3 ++ - cysignals=1.12.3=py312h2ec8cdc_0 + - cython=3.0.11=py312h8fd2918_3 + - dbus=1.13.6=h5008d03_3 +- - debugpy=1.8.11=py312h2ec8cdc_0 ++ - debugpy=1.8.12=py312h2ec8cdc_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - double-conversion=3.3.0=h59595ed_0 + - ecl=24.5.10=h0f3afd4_0 +- - eclib=20231212=h43e5eba_1 ++ - eclib=20231212=h75fb491_2 + - ecm=7.0.5=h9458935_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -69,14 +69,14 @@ dependencies: + - fontconfig=2.15.0=h7e30c49_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312h178313f_0 +- - fortran-compiler=1.8.0=h36df796_1 +- - fplll=5.4.5=h384768b_0 +- - fpylll=0.6.1=py312h59a3f1e_0 ++ - fonttools=4.55.6=py312h178313f_0 ++ - fortran-compiler=1.9.0=h36df796_0 ++ - fplll=5.5.0=hd20a173_0 ++ - fpylll=0.6.2=py312ha4ee43a_0 + - freetype=2.12.1=h267a509_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h3b03731_1 +- - gap-defaults=4.14.0=ha770c72_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h3b03731_2 ++ - gap-defaults=4.14.0=ha770c72_2 + - gcc=13.3.0=h9576a4e_1 + - gcc_impl_linux-64=13.3.0=hfea6d02_1 + - gcc_linux-64=13.3.0=hc28eda2_7 +@@ -85,7 +85,7 @@ dependencies: + - gfortran=13.3.0=h9576a4e_1 + - gfortran_impl_linux-64=13.3.0=h10434e7_1 + - gfortran_linux-64=13.3.0=hb919d3a_7 +- - giac=1.9.0.21=h673759e_1 ++ - giac=1.9.0.21=hca478b9_2 + - givaro=4.2.0=hb789bce_0 + - glpk=5.0=h445213a_0 + - gmp=6.3.0=hac33072_2 +@@ -96,29 +96,29 @@ dependencies: + - gxx_impl_linux-64=13.3.0=hdbfa832_1 + - gxx_linux-64=13.3.0=h6834431_7 + - h2=4.1.0=pyhd8ed1ab_1 +- - harfbuzz=9.0.0=hda332d3_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - harfbuzz=10.2.0=h4bba637_0 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=he02047a_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=he44f51b_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h623f65a_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh3099207_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 + - kernel-headers_linux-64=3.10.0=he073ed8_18 + - keyutils=1.6.1=h166bdaf_0 +- - kiwisolver=1.4.7=py312h68727a3_0 ++ - kiwisolver=1.4.8=py312h84d6215_0 + - krb5=1.21.3=h659f571_0 +- - lcalc=2.0.5=h5aac1b6_2 ++ - lcalc=2.0.5=h9cf73fc_3 + - lcms2=2.16=hb7c19ff_0 + - ld_impl_linux-64=2.43=h712a8e2_2 + - lerc=4.0.0=h27087fc_0 +@@ -132,27 +132,27 @@ dependencies: + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=26_linux64_openblas +- - libclang-cpp19.1=19.1.6=default_hb5137d0_0 +- - libclang13=19.1.6=default_h9c6a7e4_0 ++ - libclang-cpp19.1=19.1.7=default_hb5137d0_0 ++ - libclang13=19.1.7=default_h9c6a7e4_0 + - libcups=2.3.3=h4637d8d_4 + - libcurl=8.11.1=h332b0f4_0 + - libdeflate=1.23=h4ddbbb0_0 + - libdrm=2.4.124=hb9d3cd8_0 +- - libedit=3.1.20191231=he28a2e2_2 ++ - libedit=3.1.20240808=pl5321h7949ede_0 + - libegl=1.7.0=ha4b6fd6_2 + - libev=4.33=hd590300_2 + - libexpat=2.6.4=h5888daf_0 + - libffi=3.4.2=h7f98852_5 +- - libflint=3.1.2=h6fb9888_101 ++ - libflint=3.1.3.1=h0aae882_101 + - libgcc=14.2.0=h77fa898_1 + - libgcc-devel_linux-64=13.3.0=h84ea5a7_101 + - libgcc-ng=14.2.0=h69a702a_1 +- - libgd=2.3.3=hd3e95f3_10 ++ - libgd=2.3.3=h6f5c62b_11 + - libgfortran=14.2.0=h69a702a_1 + - libgfortran-ng=14.2.0=h69a702a_1 + - libgfortran5=14.2.0=hd5240d6_1 + - libgl=1.7.0=ha4b6fd6_2 +- - libglib=2.82.2=h2ff4ddf_0 ++ - libglib=2.82.2=h2ff4ddf_1 + - libglvnd=1.7.0=ha4b6fd6_2 + - libglx=1.7.0=ha4b6fd6_2 + - libgomp=14.2.0=h77fa898_1 +@@ -161,27 +161,27 @@ dependencies: + - libjpeg-turbo=3.0.0=hd590300_1 + - liblapack=3.9.0=26_linux64_openblas + - liblapacke=3.9.0=26_linux64_openblas +- - libllvm19=19.1.6=ha7bfdaf_0 ++ - libllvm19=19.1.7=ha7bfdaf_0 + - liblzma=5.6.3=hb9d3cd8_1 + - liblzma-devel=5.6.3=hb9d3cd8_1 + - libnghttp2=1.64.0=h161d5f1_0 + - libnsl=2.0.1=hd590300_0 +- - libntlm=1.4=h7f98852_1002 ++ - libntlm=1.8=hb9d3cd8_0 + - libopenblas=0.3.28=pthreads_h94d23a6_1 + - libopengl=1.7.0=ha4b6fd6_2 + - libpciaccess=0.18=hd590300_0 +- - libpng=1.6.44=hadc24fc_0 ++ - libpng=1.6.45=h943b412_0 + - libpq=17.2=h3b95a9b_1 + - libsanitizer=13.3.0=heb74ff8_1 + - libsodium=1.0.20=h4ab18f5_0 +- - libsqlite=3.47.2=hee588c1_0 ++ - libsqlite=3.48.0=hee588c1_1 + - libssh2=1.11.1=hf672d98_0 + - libstdcxx=14.2.0=hc0a3c3a_1 + - libstdcxx-devel_linux-64=13.3.0=h84ea5a7_101 + - libstdcxx-ng=14.2.0=h4852527_1 + - libtiff=4.7.0=hd9ff511_3 + - libuuid=2.38.1=h0b41bf4_0 +- - libwebp-base=1.4.0=hd590300_0 ++ - libwebp-base=1.5.0=h851e524_0 + - libxcb=1.17.0=h8a09558_0 + - libxcrypt=4.4.36=hd590300_1 + - libxkbcommon=1.7.0=h2c5496b_1 +@@ -189,7 +189,7 @@ dependencies: + - libxslt=1.1.39=h76b75d6_0 + - libzlib=1.3.1=hb9d3cd8_2 + - linbox=1.7.0=h7298d08_1 +- - llvm-openmp=19.1.6=h024ca30_0 ++ - llvm-openmp=19.1.7=h024ca30_0 + - lrcalc=2.1=h5888daf_7 + - m4=1.4.18=h516909a_1001 + - m4ri=20140914=hae5d5c5_1006 +@@ -207,22 +207,22 @@ dependencies: + - mpfr=4.2.1=h90cbb55_3 + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 +- - mysql-common=9.0.1=h266115a_3 +- - mysql-libs=9.0.1=he0572af_3 ++ - mysql-common=9.0.1=h266115a_4 ++ - mysql-libs=9.0.1=he0572af_4 + - nauty=2.8.8=hd590300_1 +- - ncurses=6.5=he02047a_1 ++ - ncurses=6.5=h2d0b736_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h297d8ca_0 + - ntl=11.4.3=hef3c4d3_1 +- - numpy=1.26.4=py312heda63a1_0 ++ - numpy=2.2.2=py312h72c5963_0 + - openblas=0.3.28=pthreads_h6ec200e_1 + - openjpeg=2.5.3=h5fbd93e_0 + - openldap=2.6.9=he970967_0 +- - openssl=3.4.0=hb9d3cd8_0 ++ - openssl=3.4.0=h7b32b05_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h36c2ea0_0 +- - pari=2.15.5=h4d4ae9b_2_pthread ++ - pari=2.17.1=ha40142e_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -232,7 +232,7 @@ dependencies: + - perl=5.32.1=7_hd590300_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312h7b63e92_0 ++ - pillow=11.1.0=py312h80c1187_0 + - pip=24.3.1=pyh8b19718_2 + - pixman=0.44.2=h29eaf8c_0 + - pkg-config=0.29.2=h4bc722e_1009 +@@ -241,18 +241,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h6ec01c2_1006 +- - pplpy=0.8.9=py312h12a6c6f_1 +- - primecount=7.9=hcb278e6_0 +- - primecountpy=0.1.0=py312h8572e83_4 +- - primesieve=11.1=h59595ed_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312h66e93f0_0 ++ - pplpy=0.8.9=py312h7383a07_2 ++ - primecount=7.14=h530483c_0 ++ - primecountpy=0.1.0=py312h68727a3_5 ++ - primesieve=12.4=he02047a_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312h66e93f0_0 + - pthread-stubs=0.4=hb9d3cd8_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pyside6=6.8.1=py312h91f0f75_0 + - pysocks=1.7.1=pyha55dd90_7 +@@ -266,43 +266,43 @@ dependencies: + - pyzmq=26.2.0=py312hbf22597_3 + - qd=2.3.22=h2cc385e_1004 + - qhull=2020.2=h434a139_5 +- - qt6-main=6.8.1=h9d28a51_0 ++ - qt6-main=6.8.1=h588cce1_2 + - readline=8.2=h8228510_1 + - requests=2.32.3=pyhd8ed1ab_1 + - rw=0.9=hd590300_2 + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312h62794b6_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312h180e4f1_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - singular=4.4.0=hc910cb2_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h9eae976_0 ++ - sqlite=3.48.0=h9eae976_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hcb278e6_0 +- - sympow=2.023.6=hc6ab17c_3 +- - sympy=1.13.3=pyh2585a3b_104 +- - sysroot_linux-64=2.17=h4a8ded7_18 ++ - sympow=2.023.6=h3028977_4 ++ - sympy=1.13.3=pyh2585a3b_105 ++ - sysroot_linux-64=2.17=h0157908_18 + - tachyon=0.99b6=hba7d16a_1002 + - tk=8.6.13=noxft_h4845f30_101 + - tomli=2.2.1=pyhd8ed1ab_1 + - tornado=6.4.2=py312h66e93f0_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312h66e93f0_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312h66e93f0_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wayland=1.23.1=h3e06ad9_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 +diff --git a/environment-3.12-macos-x86_64.yml b/environment-3.12-macos-x86_64.yml +index 4fccaefb570..94056fd6c91 100644 +--- a/environment-3.12-macos-x86_64.yml ++++ b/environment-3.12-macos-x86_64.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-64 +-# input_hash: 5888a68a5088012ad0dffd6db00812a4e3c24a060219dc73fd975f246c404337 ++# input_hash: ce921f8fe037a17f86cebd1f421ba43e586f9986be056154b1d53d3e0381dec4 + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_hf81eadf_101 ++ - arpack=3.9.1=nompi_hdfe9103_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hed12c24_1 + - automake=1.17=pl5321h694c41f_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=h940c156_0 ++ - bdw-gc=8.2.8=h240833e_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osx64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py312h5861a67_2 + - bzip2=1.0.8=hfdf4475_7 + - c-ares=1.34.4=hf13058a_0 +- - c-compiler=1.8.0=hfc4bf79_1 ++ - c-compiler=1.9.0=h09a7c41_0 + - ca-certificates=2024.12.14=h8857fd0_0 +- - cctools=1010.6=h5b2de21_2 +- - cctools_osx-64=1010.6=hea4301f_2 ++ - cctools=1010.6=hd3558d4_2 ++ - cctools_osx-64=1010.6=h00edd4c_2 + - cddlib=1!0.94m=h0f52abe_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312hf857d28_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_he371ed4_7 +- - clang-17=17.0.6=default_hb173f14_7 +- - clang_impl_osx-64=17.0.6=h1af8efd_23 +- - clang_osx-64=17.0.6=h7e5c614_23 +- - clangxx=17.0.6=default_he371ed4_7 +- - clangxx_impl_osx-64=17.0.6=hc3430b7_23 +- - clangxx_osx-64=17.0.6=h7e5c614_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h179603d_5 ++ - clang-18=18.1.8=default_h0c94c6a_5 ++ - clang_impl_osx-64=18.1.8=h6a44ed1_23 ++ - clang_osx-64=18.1.8=h7e5c614_23 ++ - clangxx=18.1.8=default_h179603d_5 ++ - clangxx_impl_osx-64=18.1.8=h4b7810f_23 ++ - clangxx_osx-64=18.1.8=h7e5c614_23 + - cliquer=1.22=h10d778d_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h1020d70_2 +- - compiler-rt_osx-64=17.0.6=hf2b8a54_2 ++ - compiler-rt=18.1.8=h1020d70_1 ++ - compiler-rt_osx-64=18.1.8=hf2b8a54_1 + - contourpy=1.3.1=py312hc47a885_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h3520af0_0 ++ - coverage=7.6.10=py312h3520af0_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=h385f146_1 ++ - cxx-compiler=1.9.0=h20888b2_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h88009e3_0 +- - cysignals=1.11.2=py312h0c1623b_3 ++ - cypari2=2.2.1=py312hcedb801_0 ++ - cysignals=1.12.3=py312haafddd8_0 + - cython=3.0.11=py312h6891801_3 +- - debugpy=1.8.11=py312haafddd8_0 ++ - debugpy=1.8.12=py312haafddd8_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=24.5.10=h56bac16_0 +- - eclib=20231212=h960c116_1 ++ - eclib=20231212=ha63dd29_2 + - ecm=7.0.5=h4f6b447_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h37eeddb_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312h3520af0_0 +- - fortran-compiler=1.8.0=h33d1f46_1 +- - fplll=5.4.5=hb7981ad_0 +- - fpylll=0.6.1=py312ha9f3631_0 ++ - fonttools=4.55.6=py312h3520af0_0 ++ - fortran-compiler=1.9.0=h02557f8_0 ++ - fplll=5.5.0=h6ede486_0 ++ - fpylll=0.6.2=py312hfffdf69_0 + - freetype=2.12.1=h60636b9_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=hb9686a1_1 +- - gap-defaults=4.14.0=h694c41f_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=hb9686a1_2 ++ - gap-defaults=4.14.0=h694c41f_2 + - gettext=0.22.5=hdfe23c8_3 + - gettext-tools=0.22.5=hdfe23c8_3 + - gf2x=1.3.0=h35ac7d9_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h2c809b3_1 + - gfortran_impl_osx-64=13.2.0=h2bc304d_3 + - gfortran_osx-64=13.2.0=h18f7dce_1 +- - giac=1.9.0.21=h92f3f65_1 ++ - giac=1.9.0.21=h381f543_2 + - givaro=4.2.0=h1b3d6f7_0 + - glpk=5.0=h3cb5acd_0 + - gmp=6.3.0=hf036a51_2 + - gmpy2=2.1.5=py312h068713c_3 + - gsl=2.7=h93259b0_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=h120a0e1_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h5479cbe_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=h61918c1_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h2e86a7b_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +- - kiwisolver=1.4.7=py312hc5c4d5f_0 ++ - kiwisolver=1.4.8=py312h9275861_0 + - krb5=1.21.3=h37d8d59_0 +- - lcalc=2.0.5=h547a6ed_2 ++ - lcalc=2.0.5=h0f747f7_3 + - lcms2=2.16=ha2f27b4_0 +- - ld64=951.9=h0a3eb4e_2 +- - ld64_osx-64=951.9=h5ffbe8e_2 ++ - ld64=951.9=h4e51db5_2 ++ - ld64_osx-64=951.9=hc8d1a19_2 + - lerc=4.0.0=hb486fe8_0 + - libasprintf=0.22.5=hdfe23c8_3 + - libasprintf-devel=0.22.5=hdfe23c8_3 +@@ -130,17 +130,17 @@ dependencies: + - libbrotlidec=1.1.0=h00291cd_2 + - libbrotlienc=1.1.0=h00291cd_2 + - libcblas=3.9.0=26_osx64_openblas +- - libclang-cpp17=17.0.6=default_hb173f14_7 ++ - libclang-cpp18.1=18.1.8=default_h0c94c6a_5 + - libcurl=8.11.1=h5dec5d8_0 +- - libcxx=19.1.6=hf95d169_1 +- - libcxx-devel=17.0.6=h8f8a49f_6 ++ - libcxx=19.1.7=hf95d169_0 ++ - libcxx-devel=18.1.8=h7c275be_7 + - libdeflate=1.23=he65b83e_0 +- - libedit=3.1.20191231=h0678c8f_2 ++ - libedit=3.1.20240808=pl5321ha958ccf_0 + - libev=4.33=h10d778d_2 + - libexpat=2.6.4=h240833e_0 + - libffi=3.4.2=h0d85af4_5 +- - libflint=3.1.2=h1d27844_101 +- - libgd=2.3.3=h2e77e4f_10 ++ - libflint=3.1.3.1=h9ab60bc_101 ++ - libgd=2.3.3=h8555400_11 + - libgettextpo=0.22.5=hdfe23c8_3 + - libgettextpo-devel=0.22.5=hdfe23c8_3 + - libgfortran=5.0.0=13_2_0_h97931a8_3 +@@ -153,23 +153,24 @@ dependencies: + - libjpeg-turbo=3.0.0=h0dc2134_1 + - liblapack=3.9.0=26_osx64_openblas + - liblapacke=3.9.0=26_osx64_openblas +- - libllvm17=17.0.6=hbedff68_1 ++ - libllvm18=18.1.8=h9ce406d_2 + - liblzma=5.6.3=hd471939_1 + - liblzma-devel=5.6.3=hd471939_1 + - libnghttp2=1.64.0=hc7306c3_0 + - libopenblas=0.3.28=openmp_hbf64a52_1 +- - libpng=1.6.44=h4b8f8c9_0 ++ - libpng=1.6.45=h3c4a55f_0 + - libsodium=1.0.20=hfdf4475_0 +- - libsqlite=3.47.2=hdb6dae5_0 ++ - libsqlite=3.48.0=hdb6dae5_1 + - libssh2=1.11.1=h3dc7d44_0 + - libtiff=4.7.0=hb77a491_3 +- - libwebp-base=1.4.0=h10d778d_0 ++ - libwebp-base=1.5.0=h6cf52b4_0 + - libxcb=1.17.0=hf1f96e2_0 + - libxml2=2.13.5=hebb159f_1 + - libzlib=1.3.1=hd23fc13_2 + - linbox=1.7.0=h9325161_1 +- - llvm-openmp=19.1.6=ha54dae1_0 +- - llvm-tools=17.0.6=hbedff68_1 ++ - llvm-openmp=19.1.7=ha54dae1_0 ++ - llvm-tools=18.1.8=h9ce406d_2 ++ - llvm-tools-18=18.1.8=h9ce406d_2 + - lrcalc=2.1=hac325c4_7 + - m4=1.4.18=haf1e3a3_1001 + - m4ri=20140914=hd82a5f3_1006 +@@ -188,18 +189,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h10d778d_1 +- - ncurses=6.5=hf036a51_1 ++ - ncurses=6.5=h0622a9a_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h3c5361c_0 + - ntl=11.4.3=h0ab3c2f_1 +- - numpy=1.26.4=py312he3a82b2_0 ++ - numpy=2.2.2=py312h6693b03_0 + - openblas=0.3.28=openmp_h30af337_1 + - openjpeg=2.5.3=h7fd6d84_0 +- - openssl=3.4.0=hd471939_0 ++ - openssl=3.4.0=hc426f3f_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=hbcb3906_0 +- - pari=2.15.5=h7ba67ff_2_pthread ++ - pari=2.17.1=h1ed0f1a_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -208,7 +209,7 @@ dependencies: + - perl=5.32.1=7_h10d778d_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312h66fe14f_0 ++ - pillow=11.1.0=py312hd9f36e3_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hf7e621a_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -216,18 +217,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=ha60d53e_1006 +- - pplpy=0.8.9=py312hb4417ad_1 +- - primecount=7.6=ha894c9a_0 +- - primecountpy=0.1.0=py312h49ebfd2_4 +- - primesieve=11.0=hf0c8a7f_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312h3d0f464_0 ++ - pplpy=0.8.9=py312h045e30c_2 ++ - primecount=7.14=h28dbb38_0 ++ - primecountpy=0.1.0=py312hc47a885_5 ++ - primesieve=12.4=hf036a51_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312h01d7ebd_0 + - pthread-stubs=0.4=h00291cd_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -246,27 +247,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312h3b0f538_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312hb4e66ee_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h88f4db0_0 + - singular=4.4.0=h604985e_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=h2e4c9dc_0 ++ - sqlite=3.48.0=h2e4c9dc_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hf0c8a7f_0 +- - sympow=2.023.6=h115ba6a_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=h7305399_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=h3a1d103_1002 + - tapi=1300.6.5=h390ca13_0 + - tk=8.6.13=h1abcd95_1 +@@ -274,9 +275,9 @@ dependencies: + - tornado=6.4.2=py312h01d7ebd_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312h3d0f464_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312h01d7ebd_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/environment-3.12-macos.yml b/environment-3.12-macos.yml +index 957da365df9..ae5920d5424 100644 +--- a/environment-3.12-macos.yml ++++ b/environment-3.12-macos.yml +@@ -1,19 +1,19 @@ + name: sage-dev + # Generated by conda-lock. + # platform: osx-arm64 +-# input_hash: 0c152106e1e870088723e57e0bd27be66ce0a8f2488067475849ebf869659bbe ++# input_hash: 43b6f301d1166823ad72775146167ccf4e01759b32c0d0726035683651623fd9 + + channels: + - conda-forge + dependencies: + - alabaster=1.0.0=pyhd8ed1ab_1 + - appnope=0.1.4=pyhd8ed1ab_1 +- - arpack=3.9.1=nompi_h593882a_101 ++ - arpack=3.9.1=nompi_h1f29f7c_102 + - asttokens=3.0.0=pyhd8ed1ab_1 + - autoconf=2.71=pl5321hcd07c0c_1 + - automake=1.17=pl5321hce30654_0 + - babel=2.16.0=pyhd8ed1ab_1 +- - bdw-gc=8.0.6=hc021e02_0 ++ - bdw-gc=8.2.8=h286801f_1 + - beautifulsoup4=4.12.3=pyha770c72_1 + - blas=2.126=openblas + - blas-devel=3.9.0=26_osxarm64_openblas +@@ -24,40 +24,40 @@ dependencies: + - brotli-python=1.1.0=py312hde4cb15_2 + - bzip2=1.0.8=h99b78c6_7 + - c-ares=1.34.4=h5505292_0 +- - c-compiler=1.8.0=hf48404e_1 ++ - c-compiler=1.9.0=hdf49b6b_0 + - ca-certificates=2024.12.14=hf0a4a13_0 +- - cctools=1010.6=hf67d63f_2 +- - cctools_osx-arm64=1010.6=h623e0ac_2 ++ - cctools=1010.6=h4c9edd9_2 ++ - cctools_osx-arm64=1010.6=h908b477_2 + - cddlib=1!0.94m=h6d7a090_0 + - certifi=2024.12.14=pyhd8ed1ab_0 + - cffi=1.17.1=py312h0fad829_0 +- - charset-normalizer=3.4.0=pyhd8ed1ab_1 +- - clang=17.0.6=default_h360f5da_7 +- - clang-17=17.0.6=default_h146c034_7 +- - clang_impl_osx-arm64=17.0.6=he47c785_23 +- - clang_osx-arm64=17.0.6=h07b0088_23 +- - clangxx=17.0.6=default_h360f5da_7 +- - clangxx_impl_osx-arm64=17.0.6=h50f59cd_23 +- - clangxx_osx-arm64=17.0.6=h07b0088_23 ++ - charset-normalizer=3.4.1=pyhd8ed1ab_0 ++ - clang=18.1.8=default_h675cc0c_5 ++ - clang-18=18.1.8=default_h5c12605_5 ++ - clang_impl_osx-arm64=18.1.8=h2ae9ea5_23 ++ - clang_osx-arm64=18.1.8=h07b0088_23 ++ - clangxx=18.1.8=default_h675cc0c_5 ++ - clangxx_impl_osx-arm64=18.1.8=h555f467_23 ++ - clangxx_osx-arm64=18.1.8=h07b0088_23 + - cliquer=1.22=h93a5062_1 + - colorama=0.4.6=pyhd8ed1ab_1 + - comm=0.2.2=pyhd8ed1ab_1 +- - compiler-rt=17.0.6=h856b3c1_2 +- - compiler-rt_osx-arm64=17.0.6=h832e737_2 ++ - compiler-rt=18.1.8=h856b3c1_1 ++ - compiler-rt_osx-arm64=18.1.8=h832e737_1 + - contourpy=1.3.1=py312hb23fbb9_0 + - conway-polynomials=0.10=pyhd8ed1ab_0 +- - coverage=7.6.9=py312h998013c_0 ++ - coverage=7.6.10=py312h998013c_0 + - cpython=3.12.8=py312hd8ed1ab_1 +- - cxx-compiler=1.8.0=h18dbf2f_1 ++ - cxx-compiler=1.9.0=hba80287_0 + - cycler=0.12.1=pyhd8ed1ab_1 +- - cypari2=2.1.5=py312h2da97d0_0 +- - cysignals=1.11.2=py312heab4d4f_3 ++ - cypari2=2.2.1=py312he7c0534_0 ++ - cysignals=1.12.3=py312hd8f9ff3_0 + - cython=3.0.11=py312hde4cb15_2 +- - debugpy=1.8.11=py312hd8f9ff3_0 ++ - debugpy=1.8.12=py312hd8f9ff3_0 + - decorator=5.1.1=pyhd8ed1ab_1 + - docutils=0.21.2=pyhd8ed1ab_1 + - ecl=23.9.9=h1d9728a_0 +- - eclib=20231212=h3d50bd9_1 ++ - eclib=20231212=hc39b9a7_2 + - ecm=7.0.5=h41d338b_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - execnet=2.1.1=pyhd8ed1ab_1 +@@ -71,14 +71,14 @@ dependencies: + - fontconfig=2.15.0=h1383a14_1 + - fonts-conda-ecosystem=1=0 + - fonts-conda-forge=1=0 +- - fonttools=4.55.3=py312h998013c_0 +- - fortran-compiler=1.8.0=hc3477c4_1 +- - fplll=5.4.5=hb7d509d_0 +- - fpylll=0.6.1=py312h381bdd1_0 ++ - fonttools=4.55.6=py312h998013c_0 ++ - fortran-compiler=1.9.0=h5692697_0 ++ - fplll=5.5.0=h2a2278a_0 ++ - fpylll=0.6.2=py312h03fe13c_0 + - freetype=2.12.1=hadb7bae_2 +- - furo=2024.8.6=pyhd8ed1ab_1 +- - gap-core=4.14.0=h25f1785_1 +- - gap-defaults=4.14.0=hce30654_1 ++ - furo=2024.8.6=pyhd8ed1ab_2 ++ - gap-core=4.14.0=h25f1785_2 ++ - gap-defaults=4.14.0=hce30654_2 + - gettext=0.22.5=h8414b35_3 + - gettext-tools=0.22.5=h8414b35_3 + - gf2x=1.3.0=hf8f8af4_3 +@@ -86,37 +86,37 @@ dependencies: + - gfortran=13.2.0=h1ca8e4b_1 + - gfortran_impl_osx-arm64=13.2.0=h252ada1_3 + - gfortran_osx-arm64=13.2.0=h57527a5_1 +- - giac=1.9.0.21=h1c96721_1 ++ - giac=1.9.0.21=h573964a_2 + - givaro=4.2.0=h018886a_0 + - glpk=5.0=h6d7a090_0 + - gmp=6.3.0=h7bae524_2 + - gmpy2=2.1.5=py312h524cf62_3 + - gsl=2.7=h6e638da_0 + - h2=4.1.0=pyhd8ed1ab_1 +- - hpack=4.0.0=pyhd8ed1ab_1 +- - hyperframe=6.0.1=pyhd8ed1ab_1 ++ - hpack=4.1.0=pyhd8ed1ab_0 ++ - hyperframe=6.1.0=pyhd8ed1ab_0 + - icu=75.1=hfee45f7_0 + - idna=3.10=pyhd8ed1ab_1 + - igraph=0.10.15=h3fe6531_1 + - imagesize=1.4.1=pyhd8ed1ab_0 + - iml=1.0.5=hd73f12c_1004 +- - importlib-metadata=8.5.0=pyha770c72_1 ++ - importlib-metadata=8.6.1=pyha770c72_0 + - iniconfig=2.0.0=pyhd8ed1ab_1 + - ipykernel=6.29.5=pyh57ce528_0 +- - ipython=8.30.0=pyh707e725_0 ++ - ipython=8.31.0=pyh707e725_0 + - ipywidgets=8.1.5=pyhd8ed1ab_1 + - isl=0.26=imath32_h347afa1_101 + - jedi=0.19.2=pyhd8ed1ab_1 +- - jinja2=3.1.4=pyhd8ed1ab_1 ++ - jinja2=3.1.5=pyhd8ed1ab_0 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - jupyterlab_widgets=3.0.13=pyhd8ed1ab_1 +- - kiwisolver=1.4.7=py312h6142ec9_0 ++ - kiwisolver=1.4.8=py312h2c4a281_0 + - krb5=1.21.3=h237132a_0 +- - lcalc=2.0.5=h4a402bc_2 ++ - lcalc=2.0.5=hdaf6845_3 + - lcms2=2.16=ha0e7c42_0 +- - ld64=951.9=h39a299f_2 +- - ld64_osx-arm64=951.9=h3f9b568_2 ++ - ld64=951.9=h4c6efb1_2 ++ - ld64_osx-arm64=951.9=hfc0fa09_2 + - lerc=4.0.0=h9a09cb3_0 + - libasprintf=0.22.5=h8414b35_3 + - libasprintf-devel=0.22.5=h8414b35_3 +@@ -130,23 +130,23 @@ dependencies: + - libbrotlidec=1.1.0=hd74edd7_2 + - libbrotlienc=1.1.0=hd74edd7_2 + - libcblas=3.9.0=26_osxarm64_openblas +- - libclang-cpp17=17.0.6=default_h146c034_7 ++ - libclang-cpp18.1=18.1.8=default_h5c12605_5 + - libcurl=8.11.1=h73640d1_0 +- - libcxx=19.1.6=ha82da77_1 +- - libcxx-devel=17.0.6=h86353a2_6 ++ - libcxx=19.1.7=ha82da77_0 ++ - libcxx-devel=18.1.8=h6dc3340_7 + - libdeflate=1.23=hec38601_0 +- - libedit=3.1.20191231=hc8eb9b7_2 ++ - libedit=3.1.20240808=pl5321hafb1f1b_0 + - libev=4.33=h93a5062_2 + - libexpat=2.6.4=h286801f_0 + - libffi=3.4.2=h3422bc3_5 +- - libflint=3.1.2=he28cf6d_101 +- - libgd=2.3.3=hac1b3a8_10 ++ - libflint=3.1.3.1=ha3035ea_101 ++ - libgd=2.3.3=hb2c3a21_11 + - libgettextpo=0.22.5=h8414b35_3 + - libgettextpo-devel=0.22.5=h8414b35_3 + - libgfortran=5.0.0=13_2_0_hd922786_3 + - libgfortran-devel_osx-arm64=13.2.0=h5d7a38c_3 + - libgfortran5=13.2.0=hf226fd6_3 +- - libglib=2.82.2=h07bd6cf_0 ++ - libglib=2.82.2=hdff4504_1 + - libhomfly=1.02r6=h93a5062_1 + - libiconv=1.17=h0d3ecfb_2 + - libintl=0.22.5=h8414b35_3 +@@ -154,23 +154,24 @@ dependencies: + - libjpeg-turbo=3.0.0=hb547adb_1 + - liblapack=3.9.0=26_osxarm64_openblas + - liblapacke=3.9.0=26_osxarm64_openblas +- - libllvm17=17.0.6=h5090b49_2 ++ - libllvm18=18.1.8=h5090b49_2 + - liblzma=5.6.3=h39f12f2_1 + - liblzma-devel=5.6.3=h39f12f2_1 + - libnghttp2=1.64.0=h6d7220d_0 + - libopenblas=0.3.28=openmp_hf332438_1 +- - libpng=1.6.44=hc14010f_0 ++ - libpng=1.6.45=h3783ad8_0 + - libsodium=1.0.20=h99b78c6_0 +- - libsqlite=3.47.2=h3f77e49_0 ++ - libsqlite=3.48.0=h3f77e49_1 + - libssh2=1.11.1=h9cc3647_0 + - libtiff=4.7.0=h551f018_3 +- - libwebp-base=1.4.0=h93a5062_0 ++ - libwebp-base=1.5.0=h2471fea_0 + - libxcb=1.17.0=hdb1d25a_0 + - libxml2=2.13.5=h178c5d8_1 + - libzlib=1.3.1=h8359307_2 + - linbox=1.7.0=h9da6ecd_1 +- - llvm-openmp=19.1.6=hdb05f8b_0 +- - llvm-tools=17.0.6=h5090b49_2 ++ - llvm-openmp=19.1.7=hdb05f8b_0 ++ - llvm-tools=18.1.8=h5090b49_2 ++ - llvm-tools-18=18.1.8=h5090b49_2 + - lrcalc=2.1=hf9b8971_7 + - m4=1.4.18=h642e427_1001 + - m4ri=20140914=hc97c1ff_1006 +@@ -189,18 +190,18 @@ dependencies: + - mpmath=1.3.0=pyhd8ed1ab_1 + - munkres=1.1.4=pyh9f0ad1d_0 + - nauty=2.8.8=h93a5062_1 +- - ncurses=6.5=h7bae524_1 ++ - ncurses=6.5=h5e97a16_2 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - networkx=3.4.2=pyh267e887_2 + - ninja=1.12.1=h420ef59_0 + - ntl=11.4.3=hbb3f309_1 +- - numpy=1.26.4=py312h8442bc7_0 ++ - numpy=2.2.2=py312h7c1f314_0 + - openblas=0.3.28=openmp_hea878ba_1 + - openjpeg=2.5.3=h8a3d83b_0 +- - openssl=3.4.0=h39f12f2_0 ++ - openssl=3.4.0=h81ee809_1 + - packaging=24.2=pyhd8ed1ab_2 + - palp=2.20=h27ca646_0 +- - pari=2.15.5=h4f2304c_2_pthread ++ - pari=2.17.1=h49d18c7_2_pthread + - pari-elldata=0.0.20161017=0 + - pari-galdata=0.0.20180411=0 + - pari-seadata=0.0.20090618=0 +@@ -210,7 +211,7 @@ dependencies: + - perl=5.32.1=7_h4614cfb_perl5 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 +- - pillow=11.0.0=py312haf37ca6_0 ++ - pillow=11.1.0=py312h50aef2c_0 + - pip=24.3.1=pyh8b19718_2 + - pkg-config=0.29.2=hde07d2e_1009 + - pkgconfig=1.5.5=pyhd8ed1ab_5 +@@ -218,18 +219,18 @@ dependencies: + - platformdirs=4.3.6=pyhd8ed1ab_1 + - pluggy=1.5.0=pyhd8ed1ab_1 + - ppl=1.2=h8b147cf_1006 +- - pplpy=0.8.9=py312h35b16b8_1 +- - primecount=7.6=hb6e4faa_0 +- - primecountpy=0.1.0=py312h389731b_4 +- - primesieve=11.0=hb7217d7_0 +- - prompt-toolkit=3.0.48=pyha770c72_1 +- - psutil=6.1.0=py312h0bf5046_0 ++ - pplpy=0.8.9=py312he1ec6da_2 ++ - primecount=7.14=ha84d530_0 ++ - primecountpy=0.1.0=py312hb23fbb9_5 ++ - primesieve=12.4=h00cdb27_0 ++ - prompt-toolkit=3.0.50=pyha770c72_0 ++ - psutil=6.1.1=py312hea69d52_0 + - pthread-stubs=0.4=hd74edd7_1002 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pycparser=2.22=pyh29332c3_1 +- - pygments=2.18.0=pyhd8ed1ab_1 +- - pyparsing=3.2.0=pyhd8ed1ab_2 ++ - pygments=2.19.1=pyhd8ed1ab_0 ++ - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyproject-metadata=0.9.0=pyhd8ed1ab_1 + - pysocks=1.7.1=pyha55dd90_7 + - pytest=8.3.4=pyhd8ed1ab_1 +@@ -248,27 +249,27 @@ dependencies: + - sagemath-db-elliptic-curves=0.8.1=hecc5488_0 + - sagemath-db-graphs=20210214=hd8ed1ab_0 + - sagemath-db-polytopes=20170220=1 +- - scipy=1.14.1=py312h6bb24ec_2 +- - setuptools=75.6.0=pyhff2d567_1 ++ - scipy=1.15.1=py312hb7ffdcd_0 ++ - setuptools=75.8.0=pyhff2d567_0 + - sigtool=0.1.3=h44b9a77_0 + - singular=4.4.0=h5a8969a_1 + - six=1.17.0=pyhd8ed1ab_0 + - snowballstemmer=2.2.0=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - sphinx=8.1.3=pyhd8ed1ab_1 +- - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_2 +- - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_0 ++ - sphinx-basic-ng=1.0.0b2=pyhd8ed1ab_3 ++ - sphinx-inline-tabs=2023.4.21=pyhd8ed1ab_1 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_1 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 +- - sqlite=3.47.2=hd7222ec_0 ++ - sqlite=3.48.0=hd7222ec_1 + - stack_data=0.6.3=pyhd8ed1ab_1 + - symmetrica=3.0.1=hb7217d7_0 +- - sympow=2.023.6=hb0babe8_3 +- - sympy=1.13.3=pyh2585a3b_104 ++ - sympow=2.023.6=hc13a52f_4 ++ - sympy=1.13.3=pyh2585a3b_105 + - tachyon=0.99b6=hb8a568e_1002 + - tapi=1300.6.5=h03f4b80_0 + - tk=8.6.13=h5083fa2_1 +@@ -276,9 +277,9 @@ dependencies: + - tornado=6.4.2=py312hea69d52_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.12.2=pyha770c72_1 +- - tzdata=2024b=hc8b5060_0 +- - unicodedata2=15.1.0=py312h0bf5046_1 +- - urllib3=2.2.3=pyhd8ed1ab_1 ++ - tzdata=2025a=h78e105d_0 ++ - unicodedata2=16.0.0=py312hea69d52_0 ++ - urllib3=2.3.0=pyhd8ed1ab_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=pyhd8ed1ab_1 + - widgetsnbextension=4.0.13=pyhd8ed1ab_1 +diff --git a/pyproject.toml b/pyproject.toml +index a1febc07917..d2b3374575e 100644 +--- a/pyproject.toml ++++ b/pyproject.toml +@@ -3,7 +3,7 @@ build-backend = 'mesonpy' + # Minimum requirements for the build system to execute. + requires = [ + 'meson-python', +- 'cypari2 >=2.1.1', ++ 'cypari2 >=2.2.1', + # Exclude 1.12.0 because of https://github.com/sagemath/cysignals/issues/212 + 'cysignals >=1.11.2, != 1.12.0', + # Exclude 3.0.3 because of https://github.com/cython/cython/issues/5748 +@@ -19,7 +19,7 @@ description = "Sage: Open Source Mathematics Software: Standard Python Library" + dependencies = [ + 'six >=1.15.0', + 'conway-polynomials >=0.8', +- 'cypari2 >=2.1.1', ++ 'cypari2 >=2.2.1', + # Exclude 1.12.0 because of https://github.com/sagemath/cysignals/issues/212 + 'cysignals >=1.11.2, != 1.12.0', + 'cython >=3.0, != 3.0.3', +diff --git a/src/pyproject.toml b/src/pyproject.toml +index 4b70dc133d1..625b08afd7a 100644 +--- a/src/pyproject.toml ++++ b/src/pyproject.toml +@@ -6,7 +6,7 @@ requires = [ + 'setuptools >= 68.1.1', + # version constraint for macOS Big Sur support (see https://github.com/sagemath/sage/issues/31050) + 'wheel >=0.36.2', +- 'cypari2 >=2.1.1', ++ 'cypari2 >=2.2.1', + 'cysignals >=1.10.2', + # Exclude 3.0.3 because of https://github.com/cython/cython/issues/5748 + 'cython >=3.0, != 3.0.3, <4.0', +diff --git a/src/sage/arith/misc.py b/src/sage/arith/misc.py +index 5525fae666c..822701d6810 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.<i> = 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.<i> = 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.<i> = 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.<t> = 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 d32ce5c9435..2f7b4a6f04c 100644 +--- a/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py ++++ b/src/sage/dynamics/arithmetic_dynamics/berkovich_ds.py +@@ -691,10 +691,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.<x,y> = 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 22fb4b8487c..49a41772aac 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 3ca4bee83ef..6bed0895729 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 = <Integer>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 852d749e1e6..9f8a33adeb6 100644 +--- a/src/sage/matrix/matrix2.pyx ++++ b/src/sage/matrix/matrix2.pyx +@@ -16575,7 +16575,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 2fdfc7cdc02..ef86da65c12 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 f93984335bd..ddbfa6371ba 100644 +--- a/src/sage/modular/dirichlet.py ++++ b/src/sage/modular/dirichlet.py +@@ -2394,13 +2394,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.<a> = 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) + <class 'sage.rings.finite_rings.residue_field.ResidueFiniteField_prime_modn_with_category'> + +@@ -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.<t> = GF(2)[]; h = t^5 + t^2 + 1 +@@ -1105,11 +1104,11 @@ cdef class ReductionMap(Map): + sage: # needs sage.rings.number_field + sage: K.<i> = 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.<tmod> = 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.<alpha> = 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) + <class 'sage.rings.finite_rings.residue_field_pari_ffelt.ResidueFiniteField_pari_ffelt_with_category'> + 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.<xi> = 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.<a> = 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.<a> = 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.<xi> = 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/bdd_height.py b/src/sage/rings/number_field/bdd_height.py +index 9635afa3613..8ac8904662c 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.<g> = 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/class_group.py b/src/sage/rings/number_field/class_group.py +index e1185a499bb..a9832527ce2 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 bb4e453c650..ac7f14da21d 100644 +--- a/src/sage/rings/number_field/galois_group.py ++++ b/src/sage/rings/number_field/galois_group.py +@@ -994,9 +994,11 @@ def artin_symbol(self, P): + sage: x = polygen(ZZ, 'x') + sage: K.<b> = 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)] # random (see remark in primes_above) +- [(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: sorted([G.artin_symbol(P) for P in K.primes_above(7)]) # random (see remark in primes_above) ++ [(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/src/sage/rings/number_field/number_field.py b/src/sage/rings/number_field/number_field.py +index 05371850c83..324db212f61 100644 +--- a/src/sage/rings/number_field/number_field.py ++++ b/src/sage/rings/number_field/number_field.py +@@ -3621,7 +3621,7 @@ def fractional_ideal(self, *gens, **kwds): + sage: L.<b> = K.extension(x^2 - 3, x^2 + 1) + sage: M.<c> = 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 + +@@ -3664,35 +3664,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 = {} +@@ -3923,8 +3925,10 @@ def primes_of_bounded_norm(self, B): + + sage: K.<i> = 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') +@@ -3933,10 +3937,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] +@@ -3986,10 +3990,10 @@ def primes_of_bounded_norm_iter(self, B): + sage: K.<i> = 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)) + [] + """ +@@ -4314,7 +4318,7 @@ def pari_nf(self, important=True): + sage: k.<a> = 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) +@@ -4441,10 +4445,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): +@@ -4804,7 +4812,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 +@@ -4815,7 +4823,8 @@ def _S_class_group_and_units(self, S, proof=True): + + sage: K.<a> = 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))] +@@ -4993,7 +5002,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) +@@ -5157,9 +5166,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) +@@ -5637,7 +5644,7 @@ def different(self): + sage: k.<a> = NumberField(x^2 + 23) + sage: d = k.different() + sage: d +- Fractional ideal (-a) ++ Fractional ideal (a) + sage: d.norm() + 23 + sage: k.disc() +@@ -5757,7 +5764,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: + +@@ -5869,10 +5876,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:: + +@@ -5905,9 +5911,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() +@@ -6519,13 +6525,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)] + +@@ -7102,14 +7110,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: + +@@ -7118,7 +7126,7 @@ def units(self, proof=None): + + sage: K.<a> = NumberField(1/2*x^2 - 1/6) + sage: K.units() +- (3*a - 2,) ++ (3*a + 2,) + """ + proof = proof_flag(proof) + +@@ -7200,14 +7208,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) + +@@ -7256,8 +7264,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 +@@ -7268,8 +7276,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:: +@@ -7422,7 +7430,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) +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.<i> = 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.<a> = 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 30fc8326917..60ac76e1ddc 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: + +@@ -241,7 +241,7 @@ def _richcmp_(self, other, op): + sage: K.<a> = 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]) # potentially random + True + sage: (f[0][0] == f[0][0]) +@@ -278,7 +278,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,) + +@@ -688,17 +688,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.:: + +@@ -795,7 +795,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()) +@@ -2422,9 +2422,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() +@@ -2453,9 +2453,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() +@@ -3170,11 +3170,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) + +@@ -3219,11 +3219,11 @@ def residue_field(self, names=None): + + sage: K.<i> = 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) +@@ -3236,7 +3236,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:: + +@@ -3497,7 +3497,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.<b> = 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.<a, b> = 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.<X> = QQ[] + sage: F.<a, b> = 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 970707f2457..07b075060c6 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.<b> = 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.<b> = 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.<b> = 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 + +@@ -1624,9 +1624,9 @@ def _pari_relative_structure(self): + sage: K.<a> = NumberField(x^2 + 1) + sage: L.<b> = 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:: +@@ -1926,7 +1926,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]) + +@@ -2699,7 +2699,7 @@ def uniformizer(self, P, others='positive'): + sage: x = polygen(ZZ, 'x') + sage: K.<a, b> = 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.<a> = 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 627765cf8f0..627034877f3 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.<x> = K[] + sage: S.<xbar> = 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.<x> = K[] + sage: S.<xbar> = 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.<b> = 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 050ab750117..4b6980c9143 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.<y> = 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 baa58aeb639..ca414d6d60c 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 376568cc90b..63ef460af6c 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.<b> = 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.<b> = 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 518fda03481..e36bf28499f 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) +@@ -873,7 +873,7 @@ def local_data(self, P=None, proof=None, algorithm='pari', globally=False): + sage: K.<i> = 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 +@@ -881,7 +881,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 +@@ -899,7 +899,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 +@@ -1457,8 +1457,10 @@ def kodaira_symbol(self, P, proof=None): + sage: K.<a> = 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.<a> = QuadraticField(-11) +@@ -1484,10 +1486,10 @@ def conductor(self): + + sage: K.<i> = 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.<a> = 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:: + +@@ -2585,8 +2587,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:: + +@@ -2617,13 +2619,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:: +@@ -3104,10 +3106,10 @@ def is_isogenous(self, other, proof=True, maxnorm=100): + sage: K.<i> = 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) +@@ -3434,8 +3436,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] + ) + + :: +@@ -3446,9 +3448,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)], ++ <BLANKLINE> ++ [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 1d980d60666..7c18a464559 100644 +--- a/src/sage/schemes/elliptic_curves/ell_point.py ++++ b/src/sage/schemes/elliptic_curves/ell_point.py +@@ -3052,9 +3052,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.<i> = 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.<i> = 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.<b> = 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.<a> = 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.<x,y> = 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.<a> = 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/gnu/packages/sagemath.scm b/gnu/packages/sagemath.scm index 92e0ebcbe7..95c66c76d1 100644 --- a/gnu/packages/sagemath.scm +++ b/gnu/packages/sagemath.scm @@ -26,18 +26,24 @@ (define-module (gnu packages sagemath) #:use-module (guix build-system python) #:use-module (guix download) #:use-module (guix git-download) + #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix utils) #:use-module (gnu packages) #:use-module (gnu packages algebra) #:use-module (gnu packages autotools) + #:use-module (gnu packages base) #:use-module (gnu packages bdw-gc) #:use-module (gnu packages boost) #:use-module (gnu packages check) #:use-module (gnu packages compression) + #:use-module (gnu packages fontutils) + #:use-module (gnu packages gd) + #:use-module (gnu packages graph) #:use-module (gnu packages image) - #:use-module (gnu packages maths) #:use-module (gnu packages lisp) + #:use-module (gnu packages m4) + #:use-module (gnu packages maths) #:use-module (gnu packages multiprecision) #:use-module (gnu packages pkg-config) #:use-module (gnu packages popt) @@ -45,7 +51,6 @@ (define-module (gnu packages sagemath) #:use-module (gnu packages python-build) #:use-module (gnu packages python-xyz)) - (define-public brial (package (name "brial") @@ -285,7 +290,7 @@ (define-public python-pplpy Polyhedra Library (PPL).") (license license:gpl3+))) -(define-public conway-polynomials +(define conway-polynomials (package (name "conway-polynomials") (version "0.10") @@ -379,3 +384,156 @@ (define-public combinatorial-designs Handbook of Combinatorial Designs, 2nd edition. @end itemize") (license license:public-domain))) + + +(define-public sage + (package + (name "sage") + (version "10.6.beta6") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/sagemath/sage") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0w2v5c4k2khlpglaj9sq1vbs7q03ib3d46pgr6k4n3mclhsy2idk")) + (patches (search-patches "sage-update-eclib.patch" + "sage-update-pari-gp.patch")))) + (build-system pyproject-build-system) + (native-inputs + (list autoconf automake m4 pkg-config ; for ./bootstrap + python-cython-3 + python-cysignals + python-memory-allocator + python-pkgconfig + python-jinja2 + python-setuptools + python-wheel)) + (propagated-inputs + (list ;; required to make the sage script start + python-ipython + python-ipywidgets + python-traitlets + ;; required for the Jupyter notebook + python-jupyter-client + python-notebook)) + (inputs + (list boost + brial + cliquer + conway-polynomials + coreutils + ecl + eclib + edge-addition-planarity-suite + fflas-ffpack + flint + fontconfig + freetype + gap + gd + giac + givaro + glpk + gmp + gmp-ecm + gsl + ijg-libjpeg + iml + lcalc + libbraiding + libhomfly + linbox + libpng + m4ri + m4rie + maxima + mpc + mpfi + mpfr + ntl + openblas + pari-gp + python + python-cypari2 + python-fpylll + python-gmpy2 + python-numpy + python-pplpy + rw + sed + singular + symmetrica)) + (arguments + (list + #:tests? #f ; Tests can be run using "make ptestlong", but it is + ; expected that some of them fail. + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'patch-source + (lambda _ + (let ((ecl #$(this-package-input "ecl")) + (ecm #$(this-package-input "gmp-ecm")) + (maxima #$(this-package-input "maxima")) + (maxima-version #$(package-version + (this-package-input "maxima"))) + (singular #$(this-package-input "singular")) + (gap #$(this-package-input "gap")) + (pari-gp #$(this-package-input "pari-gp")) + (python #$(this-package-input "python")) + (coreutils #$(this-package-input "coreutils")) + (sed #$(this-package-input "sed"))) + (substitute* (find-files "build/bin") + (("sage-bootstrap-python") "python")) + (substitute* "src/sage/env.py" + (("\"ecl-config\"") + (string-append "\"" ecl "/bin/ecl-config\"")) + (("\"ecm\"") + (string-append "\"" ecm "/bin/ecm\"")) + (("\"maxima\"") + (string-append "\"" maxima "/bin/maxima\"")) + (("\"MAXIMA_FAS\"") + (string-append "\"MAXIMA_FAS\", \"" maxima + "/lib/maxima/" maxima-version + "/binary-ecl/maxima.fas\"")) + (("\"Singular\"") + (string-append "\"" singular "/bin/Singular\"")) + (("var\\('SAGE_GAP_COMMAND', None\\)") + (string-append "var('SAGE_GAP_COMMAND', \"" + gap "/bin/gap\")")) + (("join\\(SAGE_LOCAL, \"lib\", \"gap\"\\)") + (string-append "\"" gap "/lib/gap\"")) + (("join\\(SAGE_LOCAL, \"share\", \"gap\"\\)") + (string-append "\"" gap "/share/gap\"")) + ;; definition of SAGE_VENV, which ends up in kernel.json + (("os.path.abspath\\(sys.prefix\\)") + (string-append "\"" #$output "\""))) + (substitute* "src/sage/interfaces/gp.py" + (("command=f\"gp") + (string-append "command=f\"" pari-gp "/bin/gp"))) + (substitute* "src/bin/sage" + (("exec python3") + (string-append "exec " python "/bin/python3")) + (("mkdir") + (string-append coreutils "/bin/mkdir")) + ((" sed ") + (string-append " " sed "/bin/sed ")))))) + (add-before 'build 'setup + (lambda _ + (setenv "SAGE_NUM_THREADS" + (number->string (parallel-job-count))) + (invoke "./bootstrap") + (chdir "src"))) + (delete 'sanity-check)))) ; does not reflect reality + (home-page "https://www.sagemath.org/") + (synopsis "SageMath computer algebra system") + (description + "SageMath is a mathematics software built on top of many existing +packages such as NumPy, SciPy, Matplotlib, Sympy, Maxima, GAP, FLINT, +R and others. Their combined power may be accessed through a common, +Python-based language or directly via interfaces or wrappers.") + ;; Documentation under cc-by-sa3.0, see COPYING.txt in the distribution. + (license license:gpl3))) + -- 2.48.1
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Fri, 14 Feb 2025 08:50:01 GMT) Full text and rfc822 format available.Message #26 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: 76270 <at> debbugs.gnu.org Cc: Guillaume Le Vaillant <glv <at> posteo.net>, vicvbcun <guix <at> ikherbers.com>, Sharlatan Hellseher <sharlatanus <at> gmail.com>, Vinicius Monego <monego <at> posteo.net> Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Fri, 14 Feb 2025 09:48:58 +0100
Hello, the latest version on the wip-sage2 branch integrates the data packages prepared by vicvbcun into sage. I have tested that they work using the following lines from src/sage/features/databases.py: sage: from sage.features.databases import DatabaseGraphs sage: bool(DatabaseGraphs().is_present()) # optional - database_graphs True and sage: from sage.features.databases import DatabaseReflexivePolytopes sage: bool(DatabaseReflexivePolytopes().is_present()) # optional - polytopes_db True Andreas
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Fri, 14 Feb 2025 09:48:01 GMT) Full text and rfc822 format available.Message #29 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Guillaume Le Vaillant <glv <at> posteo.net> To: Andreas Enge <andreas <at> enge.fr> Cc: 76270 <at> debbugs.gnu.org Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Fri, 14 Feb 2025 09:47:03 +0000
[Message part 1 (text/plain, inline)]
Andreas Enge <andreas <at> enge.fr> skribis: > [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. > > This is needed by sage and does not change the maxima functionality. > > * gnu/packages/maths.scm (maxima)[inputs]: Replace sbcl by ecl. > [arguments]<configure-flags>: Adapt to use ecl. Drop unneeded flags. > <phases>{check}: Adapt to use ecl. > {install-lib}: Add phase to install the file maxima.fas. Hi. Have you checked if maxima doesn't become painfully slow with this change, as sbcl is usually much faster than ecl?
[signature.asc (application/pgp-signature, inline)]
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Fri, 14 Feb 2025 10:09:01 GMT) Full text and rfc822 format available.Message #32 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: Guillaume Le Vaillant <glv <at> posteo.net> Cc: 76270 <at> debbugs.gnu.org Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Fri, 14 Feb 2025 11:08:24 +0100
Hello, Am Fri, Feb 14, 2025 at 09:47:03AM +0000 schrieb Guillaume Le Vaillant: > Have you checked if maxima doesn't become painfully slow with this > change, as sbcl is usually much faster than ecl? I have not checked anything, as I am not using maxima; just that it works from sage (with my favourite example "2+2;"). As far as I understood, sage requires maxima compiled with ecl. And I do not know if we have other users of maxima. If it becomes too slow, we could add the second variant maxima-ecl just for sage, as it is still available in the wip-sage branch. Do you use maxima yourself and could make a test? Andreas
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Fri, 14 Feb 2025 13:15:02 GMT) Full text and rfc822 format available.Message #35 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Guillaume Le Vaillant <glv <at> posteo.net> To: Andreas Enge <andreas <at> enge.fr> Cc: 76270 <at> debbugs.gnu.org Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Fri, 14 Feb 2025 13:13:51 +0000
[Message part 1 (text/plain, inline)]
Andreas Enge <andreas <at> enge.fr> skribis: > Hello, > > Am Fri, Feb 14, 2025 at 09:47:03AM +0000 schrieb Guillaume Le Vaillant: >> Have you checked if maxima doesn't become painfully slow with this >> change, as sbcl is usually much faster than ecl? > > I have not checked anything, as I am not using maxima; just that it works > from sage (with my favourite example "2+2;"). As far as I understood, > sage requires maxima compiled with ecl. And I do not know if we have other > users of maxima. If it becomes too slow, we could add the second variant > maxima-ecl just for sage, as it is still available in the wip-sage branch. > > Do you use maxima yourself and could make a test? > > Andreas I tried a few things, like inverting 50 by 50 matrices, and the performance was not too bad compared to sbcl. However, there is an issue when trying to load optional maxima packages. For example when trying to load lapack: --8<---------------cut here---------------start------------->8--- (%i1) load(lapack); ;;; Internal error: ;;; ** Error code 1 when executing ;;; (EXT:RUN-PROGRAM "gcc" ("-I." "-I/gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/" "-D_GNU_SOURCE" "-D_FILE_OFFSET_BITS=64" "-g" "-O2" "-fPIC" "-D_THREAD_SAFE" "-Dlinux" "-O2" "-c" "/home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.c" "-o" "/home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.o")): ;;; Dans le fichier inclus depuis /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/ecl.h:32, ;;; depuis /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/ecl-cmp.h:31, ;;; depuis /home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.c:5: ;;; /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/config.h:54:10: erreur fatale: gmp.h : Aucun fichier ou dossier de ce nom ;;; 54 | #include "gmp.h" ;;; | ^~~~~~~ ;;; compilation terminée. ; - Binary file /home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.fas is old or does not exist. ; Compile (and load) source file /gnu/store/rm1fn7w82v79km720669nqmh03gbvk4h-maxima-5.47.0/share/maxima/5.47.0/share/lapack/lapack-package.lisp instead? y ; - Should I bother you if this happens again? y ;;; Internal error: ;;; ** Error code 1 when executing ;;; (EXT:RUN-PROGRAM "gcc" ("-I." "-I/gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/" "-D_GNU_SOURCE" "-D_FILE_OFFSET_BITS=64" "-g" "-O2" "-fPIC" "-D_THREAD_SAFE" "-Dlinux" "-O2" "-c" "/home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.c" "-o" "/home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.o")): ;;; Dans le fichier inclus depuis /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/ecl.h:32, ;;; depuis /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/ecl-cmp.h:31, ;;; depuis /home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.c:5: ;;; /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/config.h:54:10: erreur fatale: gmp.h : Aucun fichier ou dossier de ce nom ;;; 54 | #include "gmp.h" ;;; | ^~~~~~~ ;;; compilation terminée. loadfile: failed to load /gnu/store/rm1fn7w82v79km720669nqmh03gbvk4h-maxima-5.47.0/share/maxima/5.47.0/share/lapack/load-lapack.lisp -- an error. To debug this try: debugmode(true); --8<---------------cut here---------------end--------------->8--- I guess that it will be necessary to wrap the maxima executable so that ecl's compiler can find the binaries and libraries that it requires (see the propagated inputs and 'wrap' phase of the ecl package).
[signature.asc (application/pgp-signature, inline)]
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Fri, 14 Feb 2025 18:32:02 GMT) Full text and rfc822 format available.Message #38 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: Guillaume Le Vaillant <glv <at> posteo.net> Cc: Nicolas Goaziou <mail <at> nicolasgoaziou.fr>, vicvbcun <guix <at> ikherbers.com>, Sharlatan Hellseher <sharlatanus <at> gmail.com>, 76270 <at> debbugs.gnu.org, Vinicius Monego <monego <at> posteo.net> Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Fri, 14 Feb 2025 19:30:42 +0100
Hello Guillaume, Am Fri, Feb 14, 2025 at 01:13:51PM +0000 schrieb Guillaume Le Vaillant: > I tried a few things, like inverting 50 by 50 matrices, and the > performance was not too bad compared to sbcl. > > However, there is an issue when trying to load optional maxima packages. > For example when trying to load lapack: > > --8<---------------cut here---------------start------------->8--- > (%i1) load(lapack); > > ;;; Internal error: > ;;; ** Error code 1 when executing > ;;; (EXT:RUN-PROGRAM "gcc" ("-I." "-I/gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/" "-D_GNU_SOURCE" "-D_FILE_OFFSET_BITS=64" "-g" "-O2" "-fPIC" "-D_THREAD_SAFE" "-Dlinux" "-O2" "-c" "/home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.c" "-o" "/home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.o")): > ;;; Dans le fichier inclus depuis /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/ecl.h:32, > ;;; depuis /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/ecl-cmp.h:31, > ;;; depuis /home/glv/.maxima/binary/5_47_0/ecl/24_5_10/share/lapack/lapack-package.c:5: > ;;; /gnu/store/0c233v22qxc4vg52ck40dn6hm8a0ga5j-ecl-24.5.10/include/ecl/config.h:54:10: erreur fatale: gmp.h : Aucun fichier ou dossier de ce nom > ;;; 54 | #include "gmp.h" > I guess that it will be necessary to wrap the maxima executable so that > ecl's compiler can find the binaries and libraries that it requires > (see the propagated inputs and 'wrap' phase of the ecl package). thanks for looking into this! I am wary of adding LD_LIBRARY_PATH to maxima itself (I sometimes modify LD_LIBRARY_PATH locally to just make things work for a moment, but it can lead to all kinds of difficult to debug situations). Even more so if this is then called from inside sage. So if things become messy, maybe it would be better to use a separate maxima-ecl only for sage, as defined in the patch in wip-sage? We could even make this package private (define instead of define-public); it is not propagated and only called from within sage through the complete path to the binary. I use "package/inherit" in the patch, and experimentally it did not work when I moved the package definition into the different module sagemath. Is that true? In that case, I would have to use regular inheritance. Andreas
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Fri, 14 Feb 2025 19:00:02 GMT) Full text and rfc822 format available.Message #41 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: Guillaume Le Vaillant <glv <at> posteo.net> Cc: Nicolas Goaziou <mail <at> nicolasgoaziou.fr>, vicvbcun <guix <at> ikherbers.com>, Sharlatan Hellseher <sharlatanus <at> gmail.com>, 76270 <at> debbugs.gnu.org, Vinicius Monego <monego <at> posteo.net> Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Fri, 14 Feb 2025 19:59:02 +0100
Am Fri, Feb 14, 2025 at 07:30:42PM +0100 schrieb Andreas Enge: > I use "package/inherit" in the patch, and experimentally it did not work > when I moved the package definition into the different module sagemath. > Is that true? In that case, I would have to use regular inheritance. Well, that also does not work. I import the (gnu packages maths) module in sagemath.scm, and the variable maxima can be used, but also (define-public maxima-ecl (package (inherit maxima) (name "maxima-ecl") ... leads to the error message ice-9/eval.scm:293:34: error: maxima: unbound variable hint: Did you forget a `use-modules' form? Can this be worked around? Or do I need to keep maxima-ecl in the same module as maxima (maths.scm) and mark maxima-ecl as hidden? Or should I move both to the sagemath module? Andreas
guix-patches <at> gnu.org
:bug#76270
; Package guix-patches
.
(Fri, 14 Feb 2025 19:32:02 GMT) Full text and rfc822 format available.Message #44 received at 76270 <at> debbugs.gnu.org (full text, mbox):
From: Guillaume Le Vaillant <glv <at> posteo.net> To: Andreas Enge <andreas <at> enge.fr> Cc: 76270 <at> debbugs.gnu.org Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Fri, 14 Feb 2025 19:31:11 +0000
[Message part 1 (text/plain, inline)]
Andreas Enge <andreas <at> enge.fr> skribis: > Am Fri, Feb 14, 2025 at 07:30:42PM +0100 schrieb Andreas Enge: >> I use "package/inherit" in the patch, and experimentally it did not work >> when I moved the package definition into the different module sagemath. >> Is that true? In that case, I would have to use regular inheritance. > > Well, that also does not work. I import the (gnu packages maths) module > in sagemath.scm, and the variable maxima can be used, but also > (define-public maxima-ecl > (package > (inherit maxima) > (name "maxima-ecl") > ... > leads to the error message > ice-9/eval.scm:293:34: error: maxima: unbound variable > hint: Did you forget a `use-modules' form? > > Can this be worked around? Or do I need to keep maxima-ecl in the same > module as maxima (maths.scm) and mark maxima-ecl as hidden? > Or should I move both to the sagemath module? > > Andreas Keeping both maxima versions in "math.scm" and making the one using ecl hidden seems like a good way to do it. You could even name it maxima-for-sage instead of maxima-ecl if it makes it clearer why it's there...
[signature.asc (application/pgp-signature, inline)]
Andreas Enge <andreas <at> enge.fr>
:Andreas Enge <andreas <at> enge.fr>
:Message #49 received at 76270-done <at> debbugs.gnu.org (full text, mbox):
From: Andreas Enge <andreas <at> enge.fr> To: Guillaume Le Vaillant <glv <at> posteo.net> Cc: vicvbcun <guix <at> ikherbers.com>, Sharlatan Hellseher <sharlatanus <at> gmail.com>, Nicolas Goaziou <mail <at> nicolasgoaziou.fr>, Vinicius Monego <monego <at> posteo.net>, 76270-done <at> debbugs.gnu.org Subject: Re: [PATCH v2 1/2] gnu: maxima: Compile with ecl instead of sbcl. Date: Sat, 15 Feb 2025 21:29:04 +0100
Hello all, I have, as suggested by Guillaume, kept an additional (hidden) maxima-ecl package. Everything is pushed to master now. Just calling "sage" fails in my home profile with an error message of ipython; I think this may be related to (unknown to me) propagated Python packages. "guix shell -C sage" and then "sage" inside the shell works without problems. "sage -n" also works directly from my home profile and opens a web browser with a sage jupyter notebook. There are tons of optional packages that are not (yet) added to the sage package. I would prefer to do so when there is a request. So if you come along a sage script that does not run, please come back to me or, better yet, propose a patch. As before, I would suggest to also present a sage snippet that shows that the new feature is available whenever we add something. Thanks a lot for being so reactive and giving useful feedback, Andreas
Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org
.
(Sun, 16 Mar 2025 11:24:19 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.