Subject: [PATCH 2/2] gnu: Add sage.

From: Andreas Enge <[email-masked]>
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 <[email-masked]>
+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: [email-masked]
+ -  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 <[email-masked]>
+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 <[email-masked]>
+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 <[email-masked]>
+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 <[email-masked]>
+;;; Copyright © 2019, 2025 Andreas Enge <[email-masked]>
 ;;; Copyright © 2019 Nicolas Goaziou <[email-masked]>
 ;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <[email-masked]>
 ;;; Copyright © 2020 Jakub Kądziołka <[email-masked]>
@@ -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