Github messages for voidlinux
 help / color / mirror / Atom feed
* [PR PATCH] sagemath: update to 10.1.
@ 2023-08-21 23:17 tornaria
  2023-08-22 14:46 ` tornaria
                   ` (17 more replies)
  0 siblings, 18 replies; 19+ messages in thread
From: tornaria @ 2023-08-21 23:17 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1346 bytes --]

There is a new pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 94859 bytes --]

From 5c0c380814edf2d318b4156a9a0d805ad52606b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      |  26 +
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36018-singular_4.3.2p7.patch      | 122 +++
 srcpkgs/sagemath/patches/get_patches          |  20 +-
 srcpkgs/sagemath/template                     |  13 +-
 13 files changed, 196 insertions(+), 1818 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..f4b8772d5ab77
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,26 @@
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..786b355cc17 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2495,7 +2495,7 @@ class Sandpile(DiGraph):
+         """
+         R = self.ring()
+         I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_()))
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..8b5481aaf38 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1004,7 +1004,7 @@ class AlgebraicScheme_subscheme_projective(AlgebraicScheme_subscheme):
+         sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+-        J_sat_gens = sat(J, max_ideal)[0]
++        J_sat_gens = sat(J, max_ideal)
+         J_sat = S.ideal(J_sat_gens)
+         L = J_sat.elimination_ideal(z[0: n + 1] + (z[-1],))
+         return Pd.subscheme(L.change_ring(Rd))
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..dd054602ff608
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..c5b16168d04 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..184c908acabaa
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch
@@ -0,0 +1,122 @@
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index c9753055fc7..90600f1e046 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3123,13 +3123,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..223d30c310614 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,6 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
-
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+get_pr 36006 "gmp 6.3.0"
+get_pr 36018 "singular 4.3.2p7"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..ae06e8ef36471 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -33,15 +33,12 @@ license="GPL-2.0-or-later"
 homepage="http://sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
@ 2023-08-22 14:46 ` tornaria
  2023-08-22 16:47 ` [PR PATCH] [Updated] " tornaria
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-22 14:46 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 857 bytes --]

New comment by tornaria on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1688333569

Comment:
I know how to fix musl. This is an issue in giac with musl libc:
```
$ cat test.cc
#include <giac/giac.h>
$ cc -c test.cc
In file included from /usr/include/giac/giac.h:3,
                 from test.cc:1:
/usr/include/giac/first.h: In function 'float fgamma(float)':
/usr/include/giac/first.h:575:39: error: 'gammaf' was not declared in this scope; did you mean 'tgammaf'?
  575 | inline float fgamma(float f1){ return gammaf(f1); } // or tgammaf(f1) on some versions of emscripten
      |                                       ^~~~~~
      |                                       tgammaf
```

It's already ack by upstream and it will be fixed, meanwhile I'll include a workaround so it works for us.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Updated] sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
  2023-08-22 14:46 ` tornaria
@ 2023-08-22 16:47 ` tornaria
  2023-08-22 21:00 ` tornaria
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-22 16:47 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]

There is an updated pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 132659 bytes --]

From 98eac97a67130d2aaf75a0be22c11daf1cc03b11 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH 1/3] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      |  26 +
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36018-singular_4.3.2p7.patch      | 122 +++
 srcpkgs/sagemath/patches/get_patches          |  20 +-
 srcpkgs/sagemath/template                     |  13 +-
 13 files changed, 196 insertions(+), 1818 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..f4b8772d5ab77
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,26 @@
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..786b355cc17 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2495,7 +2495,7 @@ class Sandpile(DiGraph):
+         """
+         R = self.ring()
+         I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_()))
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..8b5481aaf38 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1004,7 +1004,7 @@ class AlgebraicScheme_subscheme_projective(AlgebraicScheme_subscheme):
+         sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+-        J_sat_gens = sat(J, max_ideal)[0]
++        J_sat_gens = sat(J, max_ideal)
+         J_sat = S.ideal(J_sat_gens)
+         L = J_sat.elimination_ideal(z[0: n + 1] + (z[-1],))
+         return Pd.subscheme(L.change_ring(Rd))
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..dd054602ff608
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..c5b16168d04 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..184c908acabaa
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch
@@ -0,0 +1,122 @@
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index c9753055fc7..90600f1e046 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3123,13 +3123,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..223d30c310614 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,6 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
-
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+get_pr 36006 "gmp 6.3.0"
+get_pr 36018 "singular 4.3.2p7"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..ae06e8ef36471 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -33,15 +33,12 @@ license="GPL-2.0-or-later"
 homepage="http://sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

From debf929f4ba0a58b4b7fcb5479858890144d52e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Mon, 21 Aug 2023 21:50:43 -0300
Subject: [PATCH 2/3] sagemath: bump

---
 .../patches/35934-singular_4.3.2p7.patch      | 219 +++++-
 .../patches/36018-singular_4.3.2p7.patch      | 122 ---
 .../patches/36046-fix_memory_leak.patch       | 740 ++++++++++++++++++
 srcpkgs/sagemath/patches/get_patches          |   4 +-
 4 files changed, 950 insertions(+), 135 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36046-fix_memory_leak.patch

diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
index f4b8772d5ab77..7c55bce6e9bb4 100644
--- a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -1,26 +1,221 @@
+diff --git a/build/pkgs/singular/checksums.ini b/build/pkgs/singular/checksums.ini
+index 313463d2fea..1101fc55700 100644
+--- a/build/pkgs/singular/checksums.ini
++++ b/build/pkgs/singular/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=singular-VERSION.tar.gz
+-sha1=28bb3ee97ef48d04dfa96de182fd93eebe08426c
+-md5=fc0a4f5720dadba45a52ee94324ce00c
+-cksum=1573851737
+-upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-1/singular-VERSION.tar.gz
++sha1=df1997f412580f2073295aba569bb955ad227317
++md5=50349213e206a18cdaa1bc410dde7ea4
++cksum=376854707
++upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-2/singular-VERSION.tar.gz
+diff --git a/build/pkgs/singular/package-version.txt b/build/pkgs/singular/package-version.txt
+index 66e2bede53a..9f1bf008217 100644
+--- a/build/pkgs/singular/package-version.txt
++++ b/build/pkgs/singular/package-version.txt
+@@ -1 +1 @@
+-4.3.1p3
++4.3.2p7
+diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
+index 6a85631f624..f7621ec5fa1 100644
+--- a/build/pkgs/singular/spkg-configure.m4
++++ b/build/pkgs/singular/spkg-configure.m4
+@@ -6,14 +6,27 @@ SAGE_SPKG_CONFIGURE([singular], [
+     AS_IF([test -z "${SINGULAR_BIN}"], [sage_spkg_install_singular=yes], [
+       dnl Use pkg-config to ensure that Singular is new enough.
+       PKG_CHECK_MODULES([SINGULAR], [Singular >= 4.2.1], [
+-       AC_MSG_CHECKING([that Singular's help is working])
+-       AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
+-        AC_MSG_RESULT(yes)
+-       ], [
+-       AC_MSG_RESULT(no)
+-       sage_spkg_install_singular=yes
+-       ]
+-      )], [
++        AC_MSG_CHECKING([whether Singular is built with FLINT])
++        AC_COMPILE_IFELSE([
++          AC_LANG_PROGRAM([
++            #include <singular/singularconfig.h>
++            #if !defined(HAVE_FLINT)
++            #  error "Need Singular compiled with FLINT"
++          ], [])
++        ], [
++          AC_MSG_RESULT([yes])
++          AC_MSG_CHECKING([that Singular's help is working])
++          AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
++            AC_MSG_RESULT(yes)
++          ], [
++            AC_MSG_RESULT(no)
++            sage_spkg_install_singular=yes
++          ])
++        ], [
++          AC_MSG_RESULT([no])
++          sage_spkg_install_singular=yes
++        ])
++      ], [
+       dnl pkg-config version check failed
+       sage_spkg_install_singular=yes
+       ])
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22ada6de947..80352700872 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3132,13 +3132,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
 diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
-index 02d2021b2fb..786b355cc17 100644
+index 02d2021b2fb..c8e15e06f05 100644
 --- a/src/sage/sandpiles/sandpile.py
 +++ b/src/sage/sandpiles/sandpile.py
-@@ -2495,7 +2495,7 @@ class Sandpile(DiGraph):
+@@ -2493,9 +2493,15 @@ def _set_ideal(self):
+             sage: '_ideal' in S.__dict__
+             True
          """
++        from sage.libs.singular.function_factory import ff
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
          R = self.ring()
-         I = self._unsaturated_ideal._singular_()
+-        I = self._unsaturated_ideal._singular_()
 -        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
-+        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_()))
++        I = self._unsaturated_ideal
++        I_sat_gens = sat(I, prod(R.gens()))[0]
++        self._ideal = R.ideal(I_sat_gens)
  
      def unsaturated_ideal(self):
          r"""
 diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
-index e6caf19ba74..8b5481aaf38 100644
+index e6caf19ba74..afd6484d779 100644
 --- a/src/sage/schemes/projective/projective_subscheme.py
 +++ b/src/sage/schemes/projective/projective_subscheme.py
-@@ -1004,7 +1004,7 @@ class AlgebraicScheme_subscheme_projective(AlgebraicScheme_subscheme):
-         sat = ff.elim__lib.sat
+@@ -1001,7 +1001,10 @@ def dual(self):
+         for i in range(n + 1):
+             J = J + S.ideal(z[-1] * f_S.derivative(z[i]) - z[i + n + 1])
+ 
+-        sat = ff.elim__lib.sat
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
  
          max_ideal = S.ideal(z[n + 1: 2 * n + 2])
--        J_sat_gens = sat(J, max_ideal)[0]
-+        J_sat_gens = sat(J, max_ideal)
-         J_sat = S.ideal(J_sat_gens)
-         L = J_sat.elimination_ideal(z[0: n + 1] + (z[-1],))
-         return Pd.subscheme(L.change_ring(Rd))
+         J_sat_gens = sat(J, max_ideal)[0]
diff --git a/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch
deleted file mode 100644
index 184c908acabaa..0000000000000
--- a/srcpkgs/sagemath/patches/36018-singular_4.3.2p7.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
-index b15cc1c602c..4b5c76e2bfa 100644
---- a/src/sage/interfaces/singular.py
-+++ b/src/sage/interfaces/singular.py
-@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
-             sage: i = singular.ideal(['x^2','y^2','z^2'])
-             sage: s = i.std()
-             sage: singular.eval('hilb(%s)'%(s.name()))
--            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
--            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
-+            '...// dimension (affine) = 0\n//
-             degree (affine) = 8'
- 
-         ::
-@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
-             sage: from sage.misc.verbose import set_verbose
-             sage: set_verbose(1)
-             sage: o = singular.eval('hilb(%s)'%(s.name()))
--            //         1 t^0
--            //        -3 t^2
--            //         3 t^4
--            //        -1 t^6
--            //         1 t^0
--            //         3 t^1
--            //         3 t^2
--            //         1 t^3
--            // dimension (affine) = 0
-+            ...// dimension (affine) = 0
-             // degree (affine)  = 8
- 
-         This is mainly useful if this method is called implicitly. Because
-@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
-         ::
- 
-             sage: o = s.hilb()
--            //         1 t^0
--            //        -3 t^2
--            //         3 t^4
--            //        -1 t^6
--            //         1 t^0
--            //         3 t^1
--            //         3 t^2
--            //         1 t^3
--            // dimension (affine) = 0
-+            ...// dimension (affine) = 0
-             // degree (affine)  = 8
-             // ** right side is not a datum, assignment ignored
-             ...
-diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
-index f40346d1fd0..c597c63aafe 100644
---- a/src/sage/libs/singular/function.pyx
-+++ b/src/sage/libs/singular/function.pyx
-@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
-             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
-             sage: I = Ideal(I.groebner_basis())
-             sage: hilb = sage.libs.singular.function_factory.ff.hilb
--            sage: hilb(I) # Singular will print // ** _ is no standard basis
--            // ** _ is no standard basis
--            //         1 t^0
--            //        -1 t^5
--            <BLANKLINE>
--            //         1 t^0
--            //         1 t^1
--            //         1 t^2
--            //         1 t^3
--            //         1 t^4
--            // dimension (proj.)  = 1
--            // degree (proj.)   = 5
-+            sage: from sage.misc.sage_ostools import redirection
-+            sage: out = tmp_filename()
-+            sage: with redirection(sys.stdout,  open(out, 'w')):
-+            ....:     hilb(I) # Singular will print // ** _ is no standard basis
-+            sage: with open(out) as f:
-+            ....:     'is no standard basis' in f.read()
-+            True
- 
-         So we tell Singular that ``I`` is indeed a Groebner basis::
- 
--            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
--            //         1 t^0
--            //        -1 t^5
--            <BLANKLINE>
--            //         1 t^0
--            //         1 t^1
--            //         1 t^2
--            //         1 t^3
--            //         1 t^4
--            // dimension (proj.)  = 1
--            // degree (proj.)   = 5
-+            sage: out = tmp_filename()
-+            sage: with redirection(sys.stdout,  open(out, 'w')):
-+            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
-+            sage: with open(out) as f:
-+            ....:     'is no standard basis' in f.read()
-+            False
- 
- 
-         TESTS:
-diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
-index c9753055fc7..90600f1e046 100644
---- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
-+++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
-@@ -3123,13 +3123,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
-             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
-             -t^5 + 1
- 
--        This example returns a wrong answer due to an integer overflow in Singular::
-+        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
- 
-             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
-             sage: I = P.ideal(M.minors(2))
-             sage: J = P * [m.lm() for m in I.groebner_basis()]
--            sage: J.hilbert_numerator(algorithm='singular')
--            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
-+            sage: J.hilbert_numerator(algorithm='singular') # known bug
-+            Traceback (most recent call last):
-+            ....
-+            RuntimeError: error in Singular function call 'hilb':
-+            overflow at t^22
- 
-         Our two algorithms should always agree; not tested until
-         :trac:`33178` is fixed::
diff --git a/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
new file mode 100644
index 0000000000000..3d2a4bd9cd96f
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
@@ -0,0 +1,740 @@
+diff --git a/src/sage/ext_data/valgrind/valgrind-python.supp b/src/sage/ext_data/valgrind/valgrind-python.supp
+new file mode 100644
+index 00000000000..16aa2858484
+--- /dev/null
++++ b/src/sage/ext_data/valgrind/valgrind-python.supp
+@@ -0,0 +1,480 @@
++# From the CPython repository with the suppressions for _PyObject_Free
++# and _PyObject_Realloc enabled. See the upstream suppression file for
++# details:
++#
++# https://github.com/python/cpython/blob/main/Misc/valgrind-python.supp
++
++# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
++   Memcheck:Value8
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:address_in_range
++}
++
++#
++# Leaks (including possible leaks)
++#    Hmmm, I wonder if this masks some real leaks.  I think it does.
++#    Will need to fix that.
++#
++
++{
++   Suppress leaking the GIL after a fork.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_allocate_lock
++   fun:PyEval_ReInitThreads
++}
++
++{
++   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_create_key
++   fun:_PyGILState_Init
++   fun:Py_InitializeEx
++   fun:Py_Main
++}
++
++{
++   Hmmm, is this a real leak or like the GIL?
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_ReInitTLS
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:realloc
++   fun:_PyObject_GC_Resize
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_New
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_NewVar
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++#
++# Non-python specific leaks
++#
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:calloc
++   fun:allocate_dtv
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:memalign
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Realloc
++}
++
++###
++### All the suppressions below are for errors that occur within libraries
++### that Python uses.  The problems to not appear to be related to Python's
++### use of the libraries.
++###
++
++{
++   Generic ubuntu ld problems
++   Memcheck:Addr8
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++}
++
++{
++   Generic gentoo ld problems
++   Memcheck:Cond
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_close
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Value8
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   GDBM problems, see test_gdbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   fun:gdbm_open
++
++}
++
++{
++   Uninitialised byte(s) false alarm, see bpo-35561
++   Memcheck:Param
++   epoll_ctl(event)
++   fun:epoll_ctl
++   fun:pyepoll_internal_ctl
++}
++
++{
++   ZLIB problems, see test_gzip
++   Memcheck:Cond
++   obj:/lib/libz.so.1.2.3
++   obj:/lib/libz.so.1.2.3
++   fun:deflate
++}
++
++{
++   Avoid problems w/readline doing a putenv and leaking on exit
++   Memcheck:Leak
++   fun:malloc
++   fun:xmalloc
++   fun:sh_set_lines_and_columns
++   fun:_rl_get_screen_size
++   fun:_rl_init_terminal_io
++   obj:/lib/libreadline.so.4.3
++   fun:rl_initialize
++}
++
++# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
++# false alarms on GCC builtin strcmp() function. The GCC code is correct.
++#
++# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
++{
++   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
++   Memcheck:Cond
++   fun:PyUnicode_Decode
++}
++
++
++###
++### These occur from somewhere within the SSL, when running
++###  test_socket_sll.  They are too general to leave on by default.
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:memset
++###}
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:memset
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:MD5_Update
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:MD5_Update
++###}
++
++# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
++# See http://bugs.python.org/issue14171
++{
++   openssl 1.0.1 prng 1
++   Memcheck:Cond
++   fun:bcmp
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 2
++   Memcheck:Cond
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 3
++   Memcheck:Value8
++   fun:_x86_64_AES_encrypt_compact
++   fun:AES_encrypt
++}
++
++#
++# All of these problems come from using test_socket_ssl
++#
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_bin2bn
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libcrypto.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_set_key_unchecked
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_encrypt2
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BUF_MEM_grow_clean
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:memcpy
++   fun:ssl3_read_bytes
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:SHA1_Update
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:SHA1_Update
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
++{
++   wcscmp_false_positive
++   Memcheck:Addr8
++   fun:wcscmp
++   fun:_PyOS_GetOpt
++   fun:Py_Main
++   fun:main
++}
++
++# Additional suppressions for the unified decimal tests:
++{
++   test_decimal
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_decimal2
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index b40ed64edb5..8c55861c147 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -1576,6 +1576,62 @@ const numeric numeric::div(const numeric &other) const {
+         }
+ }
+ 
++
++// Compute `a^b` as an integer, where a is an integer. Assign to ``res``` if it is integral, or return ``false``.
++// The nonnegative real root is taken for even denominators. To be used inside numeric::integer_rational_power,
++// to handle the special case of integral ``a``.
++bool integer_rational_power_of_mpz(
++        numeric& res,
++        const numeric& a,
++        const numeric& b
++) {
++        if (a.t != MPZ)
++                throw std::runtime_error("integer_rational_power_of_mpz: bad input");
++        mpz_t z;
++        mpz_init(z);
++        mpz_set_ui(z, 0);
++        int sgn = mpz_sgn(a.v._bigint);
++        if (mpz_cmp_ui(a.v._bigint, 1) == 0
++            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
++                mpz_set_ui(z, 1);
++        else if (sgn == 0) {
++                res = *_num0_p;
++                mpz_clear(z);
++                return true;
++        }
++        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1)) {
++                mpz_clear(z);
++                return false;
++        } else {
++                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
++                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat))) {
++                        // too big to take roots/powers
++                        mpz_clear(z);
++                        return false;
++                }
++                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
++                        if (mpz_perfect_square_p(a.v._bigint)) {
++                                mpz_sqrt(z, a.v._bigint);
++                        } else {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                else {
++                        bool exact = mpz_root(z, a.v._bigint,
++                                              mpz_get_ui(mpq_denref(b.v._bigrat)));
++                        if (not exact) {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
++        }
++        res = numeric(z);   // transfers ownership, no mpz_clear
++        return true;
++}
++
++
+ // Compute `a^b` as an integer, if it is integral, or return ``false``.
+ // The nonnegative real root is taken for even denominators.
+ bool numeric::integer_rational_power(numeric& res,
+@@ -1598,13 +1654,12 @@ bool numeric::integer_rational_power(numeric& res,
+                 if (a.v._long < 0
+                     and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+                         return false;
+-                long z;
+                 if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+                     or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+                 // too big to take roots/powers
+                         return false;
+                 if (b.is_equal(*_num1_2_p)) {
+-                        z = std::lround(std::sqrt(a.v._long));
++                        long z = std::lround(std::sqrt(a.v._long));
+                         if (a.v._long == z*z) {
+                                 res = numeric(z);
+                                 return true;
+@@ -1613,44 +1668,11 @@ bool numeric::integer_rational_power(numeric& res,
+                 }
+                 return integer_rational_power(res, a.to_bigint(), b);
+         }
+-        if (a.t != MPZ)
+-                throw std::runtime_error("integer_rational_power: bad input");
+-        int sgn = mpz_sgn(a.v._bigint);
+-        mpz_t z;
+-        mpz_init(z);
+-        mpz_set_ui(z, 0);
+-        if (mpz_cmp_ui(a.v._bigint, 1) == 0
+-            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
+-                mpz_set_ui(z, 1);
+-        else if (sgn == 0) {
+-                res = *_num0_p;
+-                return true;
+-        }
+-        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+-                return false;
+-        else {
+-                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+-                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+-                // too big to take roots/powers
+-                        return false;
+-                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
+-                        if (mpz_perfect_square_p(a.v._bigint))
+-                                mpz_sqrt(z, a.v._bigint);
+-                        else
+-                                return false;
+-                }
+-                else {
+-                        bool exact = mpz_root(z, a.v._bigint,
+-                                        mpz_get_ui(mpq_denref(b.v._bigrat)));
+-                        if (not exact)
+-                                return false;
+-                }
+-                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
+-        }
+-        res = numeric(z);
+-        return true;
++        // otherwise: a is integer
++        return integer_rational_power_of_mpz(res, a, b);
+ }
+ 
++
+ // for a^b return c,d such that a^b = c*d^b
+ // only for MPZ/MPQ base and MPQ exponent
+ void rational_power_parts(const numeric& a_orig, const numeric& b_orig,
+diff --git a/src/sage/tests/memcheck/__init__.py b/src/sage/tests/memcheck/__init__.py
+new file mode 100644
+index 00000000000..e69de29bb2d
+diff --git a/src/sage/tests/memcheck/run_tests.py b/src/sage/tests/memcheck/run_tests.py
+new file mode 100644
+index 00000000000..6ff4503a81b
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests.py
+@@ -0,0 +1,24 @@
++import types
++
++
++def run_tests() -> None:
++    """
++    Run all memcheck tests
++    """
++    from sage.tests.memcheck import symbolic_expression
++    run_tests_in_module(symbolic_expression)
++
++
++def run_tests_in_module(mod: types.ModuleType) -> None:
++    """
++    Run all memcheck tests in the given module
++    """
++    for entry in dir(mod):
++        if not entry.startswith('test_'):
++            continue
++        test_func = getattr(mod, entry)
++        test_func()
++
++
++if __name__ == '__main__':
++    run_tests()
+diff --git a/src/sage/tests/memcheck/run_tests_in_valgrind.py b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+new file mode 100644
+index 00000000000..df5ad0e92b2
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+@@ -0,0 +1,35 @@
++"""
++Launch valgrind and run the memory leak tests
++
++
++From the commandline, run
++
++    sage -python -m sage.tests.memcheck.run_tests_in_valgrind
++
++to launch valgrind and execute the memory leak tests. Requires valgrind
++to be installed. Alternatively, run as a unit test:
++
++    sage: from sage.tests.memcheck.run_tests_in_valgrind import run_tests_in_valgrind
++    sage: run_tests_in_valgrind()    # optional - valgrind
++"""
++
++import subprocess
++
++
++def run_tests_in_valgrind() -> None:
++    """
++    Run the sage.tests.memcheck.run_tests module inside valgrind
++    """
++    subprocess.check_call([
++        'valgrind',
++        '--suppressions=src/sage/ext_data/valgrind/valgrind-python.supp',
++        '--show-possibly-lost=no',
++        '--show-reachable=no',
++        './venv/bin/python',
++        '-m',
++        'sage.tests.memcheck.run_tests'
++    ])
++
++
++if __name__ == '__main__':
++    run_tests_in_valgrind()
+diff --git a/src/sage/tests/memcheck/symbolic_expression.py b/src/sage/tests/memcheck/symbolic_expression.py
+new file mode 100644
+index 00000000000..52182fbe62d
+--- /dev/null
++++ b/src/sage/tests/memcheck/symbolic_expression.py
+@@ -0,0 +1,11 @@
++from sage.tests.memcheck.verify_no_leak import verify_no_leak
++
++
++def test_sqrt_sqrt_2() -> None:
++    from sage.misc.functional import sqrt
++    T2 = sqrt(2)
++
++    def sqrt_T2() -> None:
++        sqrt(T2)
++
++    verify_no_leak(sqrt_T2)
+diff --git a/src/sage/tests/memcheck/verify_no_leak.py b/src/sage/tests/memcheck/verify_no_leak.py
+new file mode 100644
+index 00000000000..89ca90cf89c
+--- /dev/null
++++ b/src/sage/tests/memcheck/verify_no_leak.py
+@@ -0,0 +1,27 @@
++from typing import Tuple, Sequence, List, Callable, Any
++import valgrind
++
++
++def verify_no_leak(callback: Callable[[], Any],
++                   repeat: int = 10000,
++                   fuzzy: int = 10,
++                   ) -> None:
++    """
++    Verify that the callback does not generate new definitely lost blocks
++
++    Raises an assertion if the callback leaks memory
++    """
++    callback()   # warm_up
++    initial_blocks = (0, 0, 0, 0)
++    valgrind.memcheck_do_leak_check()
++    initial_blocks = valgrind.memcheck_count_leak_blocks()
++    for _ in range(repeat):
++        callback()
++    valgrind.memcheck_do_leak_check()
++    leak_blocks = valgrind.memcheck_count_leak_blocks()
++    leak = leak_blocks[0] - initial_blocks[0]
++    if leak < repeat - fuzzy:
++        return  # callback did not leak at least once per call
++    blocks = round(leak / repeat, 2)
++    message = f'{callback} leaked {blocks} block on average ({repeat} iterations)'
++    raise AssertionError(message)
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 223d30c310614..6e67cdb4fb118 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -21,5 +21,7 @@ get_pr() {
 cd $(dirname "$0")
 
 # positive review
+#get_pr 36018 "singular 4.3.2p7"
+get_pr 35934 "singular 4.3.2p7"  # includes #36018
 get_pr 36006 "gmp 6.3.0"
-get_pr 36018 "singular 4.3.2p7"
+get_pr 36046 "fix memory leak"

From 8e683cb878b659e35552dae1f1e8158471d732a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Tue, 22 Aug 2023 13:11:52 -0300
Subject: [PATCH 3/3] sagemath: bump

---
 .../sagemath/patches/zzz-fix-giac-musl.patch  | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 srcpkgs/sagemath/patches/zzz-fix-giac-musl.patch

diff --git a/srcpkgs/sagemath/patches/zzz-fix-giac-musl.patch b/srcpkgs/sagemath/patches/zzz-fix-giac-musl.patch
new file mode 100644
index 0000000000000..5ccf47be27532
--- /dev/null
+++ b/srcpkgs/sagemath/patches/zzz-fix-giac-musl.patch
@@ -0,0 +1,27 @@
+diff --git a/src/sage/libs/giac/giac.pxd b/src/sage/libs/giac/giac.pxd
+index 1d9da88d8d4..d4d5062fba5 100644
+--- a/src/sage/libs/giac/giac.pxd
++++ b/src/sage/libs/giac/giac.pxd
+@@ -12,6 +12,11 @@
+ from sage.libs.gmp.mpz cimport mpz_t, mpz_set
+ from libcpp.string cimport string
+ 
++cdef extern from *:
++    """
++    #define HAVE_TGAMMAF 1
++    """
++
+ cdef extern from "giac/giac.h" namespace "giac":
+     cdef cppclass context:
+          context()
+diff --git a/src/sage/libs/giac/misc.h b/src/sage/libs/giac/misc.h
+index bee90842f5b..516e31e5da2 100644
+--- a/src/sage/libs/giac/misc.h
++++ b/src/sage/libs/giac/misc.h
+@@ -1,5 +1,6 @@
+ #ifndef GIACPYMISC_H
+ #define GIACPYMISC_H
++#define HAVE_TGAMMAF 1
+ #include <giac/giac.h>
+ 
+ #include <fstream>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
  2023-08-22 14:46 ` tornaria
  2023-08-22 16:47 ` [PR PATCH] [Updated] " tornaria
@ 2023-08-22 21:00 ` tornaria
  2023-08-23 17:32 ` dkwo
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-22 21:00 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 267 bytes --]

New comment by tornaria on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1688925527

Comment:
The i686 failure seems transient :shrug:

I still want to run this locally a few more days, I'll rerun CI before we merge.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (2 preceding siblings ...)
  2023-08-22 21:00 ` tornaria
@ 2023-08-23 17:32 ` dkwo
  2023-08-23 23:06 ` [PR PATCH] [Updated] " tornaria
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: dkwo @ 2023-08-23 17:32 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 309 bytes --]

New comment by dkwo on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1690362934

Comment:
Looks good to me, thanks. I won't be able to run tests on aarch64 for three more weeks.
How about the old idea of splitting a devel subpkg, which depends on devel stuff?

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Updated] sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (3 preceding siblings ...)
  2023-08-23 17:32 ` dkwo
@ 2023-08-23 23:06 ` tornaria
  2023-08-23 23:25 ` tornaria
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-23 23:06 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]

There is an updated pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 119941 bytes --]

From 46fd35d01f3e24f2632d331112c952bbdc7925c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Wed, 23 Aug 2023 09:46:02 -0300
Subject: [PATCH 1/2] giac: fix `#include <giac/giac.h>` in musl

As reported in #45708, including <giac/giac.h> fails in musl because the
HAVE_TGAMMAF macro from autotools is not available at this time.

Here we include a patch adapted from
https://github.com/geogebra/giac/commit/618a5de3349f8def5bdb909fea42fb447b6aad4a
which is the solution upstream will include in next release of giac.

We need to fix this now so we can build sagemath in musl!
---
 srcpkgs/giac/patches/fix-fgamma.patch | 40 +++++++++++++++++++++++++++
 srcpkgs/giac/template                 |  6 +++-
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/giac/patches/fix-fgamma.patch

diff --git a/srcpkgs/giac/patches/fix-fgamma.patch b/srcpkgs/giac/patches/fix-fgamma.patch
new file mode 100644
index 0000000000000..05101e310d1be
--- /dev/null
+++ b/srcpkgs/giac/patches/fix-fgamma.patch
@@ -0,0 +1,40 @@
+Adapted from
+https://github.com/geogebra/giac/commit/618a5de3349f8def5bdb909fea42fb447b6aad4a
+
+--- a/src/usual.cc
++++ b/src/usual.cc
+@@ -81,6 +81,16 @@ using namespace std;
+ #define sprintf256 sprintf
+ #endif
+ 
++#if defined HAVE_TGAMMAF || defined __APPLE__ || defined EMCC || defined EMCC2 || defined NO_BSD 
++inline float fgamma(float f1){ return tgammaf(f1); }
++#else
++#if defined(__MINGW_H) || defined(VISUALC) || defined(FXCG)// FIXME gamma, not used
++inline float fgamma(float f1){ return f1; }
++#else
++inline float fgamma(float f1){ return gammaf(f1); } // or tgammaf(f1) on some versions of emscripten
++#endif
++#endif
++
+ #ifndef NO_NAMESPACE_GIAC
+ namespace giac {
+ #endif // ndef NO_NAMESPACE_GIAC
+--- a/src/first.h
++++ b/src/first.h
+@@ -578,15 +578,6 @@ inline float ffloor(float f1){
+ #endif
+ }
+ inline float finv(float f1){ return 1/f1; }
+-#if defined HAVE_TGAMMAF || defined __APPLE__ || defined EMCC || defined EMCC2 || defined NO_BSD 
+-inline float fgamma(float f1){ return tgammaf(f1); }
+-#else
+-#if defined(__MINGW_H) || defined(VISUALC) || defined(FXCG)// FIXME gamma, not used
+-inline float fgamma(float f1){ return f1; }
+-#else
+-inline float fgamma(float f1){ return gammaf(f1); } // or tgammaf(f1) on some versions of emscripten
+-#endif
+-#endif
+ #ifdef FXCG
+ inline float atan2f(float f1,float f2,int rad){ if (rad) return std::atan2(f1,f2); else return std::atan2(f1,f2)*180/3.14159265358979323846;}
+ #else
diff --git a/srcpkgs/giac/template b/srcpkgs/giac/template
index 6ba75e6372fdc..95fd2046917f9 100644
--- a/srcpkgs/giac/template
+++ b/srcpkgs/giac/template
@@ -1,7 +1,7 @@
 # Template file for 'giac'
 pkgname=giac
 version=1.9.0.57
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--disable-micropy --disable-quickjs"
 hostmakedepends="automake gettext-devel libtool"
@@ -56,6 +56,10 @@ pre_configure() {
 post_install() {
 	# remove duplicates
 	rm -r ${DESTDIR}/usr/share/doc
+
+	echo "giac: check that '#include <giac/giac.h>' works (see #45708)"
+	echo '#include <giac/giac.h>' |
+		gcc -c -isystem "${DESTDIR}/usr/include" -xc++ - -o /dev/null
 }
 
 libgiac_package() {

From 68b9a1d610da94fa1c7cfea0eb47fb9dc7b3adcb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH 2/2] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      | 221 +++++
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36046-fix_memory_leak.patch       | 740 +++++++++++++++
 srcpkgs/sagemath/patches/get_patches          |  22 +-
 srcpkgs/sagemath/template                     |  13 +-
 13 files changed, 1011 insertions(+), 1818 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36046-fix_memory_leak.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..7c55bce6e9bb4
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,221 @@
+diff --git a/build/pkgs/singular/checksums.ini b/build/pkgs/singular/checksums.ini
+index 313463d2fea..1101fc55700 100644
+--- a/build/pkgs/singular/checksums.ini
++++ b/build/pkgs/singular/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=singular-VERSION.tar.gz
+-sha1=28bb3ee97ef48d04dfa96de182fd93eebe08426c
+-md5=fc0a4f5720dadba45a52ee94324ce00c
+-cksum=1573851737
+-upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-1/singular-VERSION.tar.gz
++sha1=df1997f412580f2073295aba569bb955ad227317
++md5=50349213e206a18cdaa1bc410dde7ea4
++cksum=376854707
++upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-2/singular-VERSION.tar.gz
+diff --git a/build/pkgs/singular/package-version.txt b/build/pkgs/singular/package-version.txt
+index 66e2bede53a..9f1bf008217 100644
+--- a/build/pkgs/singular/package-version.txt
++++ b/build/pkgs/singular/package-version.txt
+@@ -1 +1 @@
+-4.3.1p3
++4.3.2p7
+diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
+index 6a85631f624..f7621ec5fa1 100644
+--- a/build/pkgs/singular/spkg-configure.m4
++++ b/build/pkgs/singular/spkg-configure.m4
+@@ -6,14 +6,27 @@ SAGE_SPKG_CONFIGURE([singular], [
+     AS_IF([test -z "${SINGULAR_BIN}"], [sage_spkg_install_singular=yes], [
+       dnl Use pkg-config to ensure that Singular is new enough.
+       PKG_CHECK_MODULES([SINGULAR], [Singular >= 4.2.1], [
+-       AC_MSG_CHECKING([that Singular's help is working])
+-       AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
+-        AC_MSG_RESULT(yes)
+-       ], [
+-       AC_MSG_RESULT(no)
+-       sage_spkg_install_singular=yes
+-       ]
+-      )], [
++        AC_MSG_CHECKING([whether Singular is built with FLINT])
++        AC_COMPILE_IFELSE([
++          AC_LANG_PROGRAM([
++            #include <singular/singularconfig.h>
++            #if !defined(HAVE_FLINT)
++            #  error "Need Singular compiled with FLINT"
++          ], [])
++        ], [
++          AC_MSG_RESULT([yes])
++          AC_MSG_CHECKING([that Singular's help is working])
++          AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
++            AC_MSG_RESULT(yes)
++          ], [
++            AC_MSG_RESULT(no)
++            sage_spkg_install_singular=yes
++          ])
++        ], [
++          AC_MSG_RESULT([no])
++          sage_spkg_install_singular=yes
++        ])
++      ], [
+       dnl pkg-config version check failed
+       sage_spkg_install_singular=yes
+       ])
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22ada6de947..80352700872 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3132,13 +3132,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..c8e15e06f05 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2493,9 +2493,15 @@ def _set_ideal(self):
+             sage: '_ideal' in S.__dict__
+             True
+         """
++        from sage.libs.singular.function_factory import ff
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+         R = self.ring()
+-        I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        I = self._unsaturated_ideal
++        I_sat_gens = sat(I, prod(R.gens()))[0]
++        self._ideal = R.ideal(I_sat_gens)
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..afd6484d779 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1001,7 +1001,10 @@ def dual(self):
+         for i in range(n + 1):
+             J = J + S.ideal(z[-1] * f_S.derivative(z[i]) - z[i + n + 1])
+ 
+-        sat = ff.elim__lib.sat
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+         J_sat_gens = sat(J, max_ideal)[0]
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..dd054602ff608
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..c5b16168d04 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
new file mode 100644
index 0000000000000..3d2a4bd9cd96f
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
@@ -0,0 +1,740 @@
+diff --git a/src/sage/ext_data/valgrind/valgrind-python.supp b/src/sage/ext_data/valgrind/valgrind-python.supp
+new file mode 100644
+index 00000000000..16aa2858484
+--- /dev/null
++++ b/src/sage/ext_data/valgrind/valgrind-python.supp
+@@ -0,0 +1,480 @@
++# From the CPython repository with the suppressions for _PyObject_Free
++# and _PyObject_Realloc enabled. See the upstream suppression file for
++# details:
++#
++# https://github.com/python/cpython/blob/main/Misc/valgrind-python.supp
++
++# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
++   Memcheck:Value8
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:address_in_range
++}
++
++#
++# Leaks (including possible leaks)
++#    Hmmm, I wonder if this masks some real leaks.  I think it does.
++#    Will need to fix that.
++#
++
++{
++   Suppress leaking the GIL after a fork.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_allocate_lock
++   fun:PyEval_ReInitThreads
++}
++
++{
++   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_create_key
++   fun:_PyGILState_Init
++   fun:Py_InitializeEx
++   fun:Py_Main
++}
++
++{
++   Hmmm, is this a real leak or like the GIL?
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_ReInitTLS
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:realloc
++   fun:_PyObject_GC_Resize
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_New
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_NewVar
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++#
++# Non-python specific leaks
++#
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:calloc
++   fun:allocate_dtv
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:memalign
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Realloc
++}
++
++###
++### All the suppressions below are for errors that occur within libraries
++### that Python uses.  The problems to not appear to be related to Python's
++### use of the libraries.
++###
++
++{
++   Generic ubuntu ld problems
++   Memcheck:Addr8
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++}
++
++{
++   Generic gentoo ld problems
++   Memcheck:Cond
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_close
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Value8
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   GDBM problems, see test_gdbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   fun:gdbm_open
++
++}
++
++{
++   Uninitialised byte(s) false alarm, see bpo-35561
++   Memcheck:Param
++   epoll_ctl(event)
++   fun:epoll_ctl
++   fun:pyepoll_internal_ctl
++}
++
++{
++   ZLIB problems, see test_gzip
++   Memcheck:Cond
++   obj:/lib/libz.so.1.2.3
++   obj:/lib/libz.so.1.2.3
++   fun:deflate
++}
++
++{
++   Avoid problems w/readline doing a putenv and leaking on exit
++   Memcheck:Leak
++   fun:malloc
++   fun:xmalloc
++   fun:sh_set_lines_and_columns
++   fun:_rl_get_screen_size
++   fun:_rl_init_terminal_io
++   obj:/lib/libreadline.so.4.3
++   fun:rl_initialize
++}
++
++# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
++# false alarms on GCC builtin strcmp() function. The GCC code is correct.
++#
++# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
++{
++   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
++   Memcheck:Cond
++   fun:PyUnicode_Decode
++}
++
++
++###
++### These occur from somewhere within the SSL, when running
++###  test_socket_sll.  They are too general to leave on by default.
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:memset
++###}
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:memset
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:MD5_Update
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:MD5_Update
++###}
++
++# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
++# See http://bugs.python.org/issue14171
++{
++   openssl 1.0.1 prng 1
++   Memcheck:Cond
++   fun:bcmp
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 2
++   Memcheck:Cond
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 3
++   Memcheck:Value8
++   fun:_x86_64_AES_encrypt_compact
++   fun:AES_encrypt
++}
++
++#
++# All of these problems come from using test_socket_ssl
++#
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_bin2bn
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libcrypto.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_set_key_unchecked
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_encrypt2
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BUF_MEM_grow_clean
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:memcpy
++   fun:ssl3_read_bytes
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:SHA1_Update
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:SHA1_Update
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
++{
++   wcscmp_false_positive
++   Memcheck:Addr8
++   fun:wcscmp
++   fun:_PyOS_GetOpt
++   fun:Py_Main
++   fun:main
++}
++
++# Additional suppressions for the unified decimal tests:
++{
++   test_decimal
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_decimal2
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index b40ed64edb5..8c55861c147 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -1576,6 +1576,62 @@ const numeric numeric::div(const numeric &other) const {
+         }
+ }
+ 
++
++// Compute `a^b` as an integer, where a is an integer. Assign to ``res``` if it is integral, or return ``false``.
++// The nonnegative real root is taken for even denominators. To be used inside numeric::integer_rational_power,
++// to handle the special case of integral ``a``.
++bool integer_rational_power_of_mpz(
++        numeric& res,
++        const numeric& a,
++        const numeric& b
++) {
++        if (a.t != MPZ)
++                throw std::runtime_error("integer_rational_power_of_mpz: bad input");
++        mpz_t z;
++        mpz_init(z);
++        mpz_set_ui(z, 0);
++        int sgn = mpz_sgn(a.v._bigint);
++        if (mpz_cmp_ui(a.v._bigint, 1) == 0
++            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
++                mpz_set_ui(z, 1);
++        else if (sgn == 0) {
++                res = *_num0_p;
++                mpz_clear(z);
++                return true;
++        }
++        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1)) {
++                mpz_clear(z);
++                return false;
++        } else {
++                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
++                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat))) {
++                        // too big to take roots/powers
++                        mpz_clear(z);
++                        return false;
++                }
++                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
++                        if (mpz_perfect_square_p(a.v._bigint)) {
++                                mpz_sqrt(z, a.v._bigint);
++                        } else {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                else {
++                        bool exact = mpz_root(z, a.v._bigint,
++                                              mpz_get_ui(mpq_denref(b.v._bigrat)));
++                        if (not exact) {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
++        }
++        res = numeric(z);   // transfers ownership, no mpz_clear
++        return true;
++}
++
++
+ // Compute `a^b` as an integer, if it is integral, or return ``false``.
+ // The nonnegative real root is taken for even denominators.
+ bool numeric::integer_rational_power(numeric& res,
+@@ -1598,13 +1654,12 @@ bool numeric::integer_rational_power(numeric& res,
+                 if (a.v._long < 0
+                     and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+                         return false;
+-                long z;
+                 if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+                     or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+                 // too big to take roots/powers
+                         return false;
+                 if (b.is_equal(*_num1_2_p)) {
+-                        z = std::lround(std::sqrt(a.v._long));
++                        long z = std::lround(std::sqrt(a.v._long));
+                         if (a.v._long == z*z) {
+                                 res = numeric(z);
+                                 return true;
+@@ -1613,44 +1668,11 @@ bool numeric::integer_rational_power(numeric& res,
+                 }
+                 return integer_rational_power(res, a.to_bigint(), b);
+         }
+-        if (a.t != MPZ)
+-                throw std::runtime_error("integer_rational_power: bad input");
+-        int sgn = mpz_sgn(a.v._bigint);
+-        mpz_t z;
+-        mpz_init(z);
+-        mpz_set_ui(z, 0);
+-        if (mpz_cmp_ui(a.v._bigint, 1) == 0
+-            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
+-                mpz_set_ui(z, 1);
+-        else if (sgn == 0) {
+-                res = *_num0_p;
+-                return true;
+-        }
+-        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+-                return false;
+-        else {
+-                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+-                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+-                // too big to take roots/powers
+-                        return false;
+-                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
+-                        if (mpz_perfect_square_p(a.v._bigint))
+-                                mpz_sqrt(z, a.v._bigint);
+-                        else
+-                                return false;
+-                }
+-                else {
+-                        bool exact = mpz_root(z, a.v._bigint,
+-                                        mpz_get_ui(mpq_denref(b.v._bigrat)));
+-                        if (not exact)
+-                                return false;
+-                }
+-                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
+-        }
+-        res = numeric(z);
+-        return true;
++        // otherwise: a is integer
++        return integer_rational_power_of_mpz(res, a, b);
+ }
+ 
++
+ // for a^b return c,d such that a^b = c*d^b
+ // only for MPZ/MPQ base and MPQ exponent
+ void rational_power_parts(const numeric& a_orig, const numeric& b_orig,
+diff --git a/src/sage/tests/memcheck/__init__.py b/src/sage/tests/memcheck/__init__.py
+new file mode 100644
+index 00000000000..e69de29bb2d
+diff --git a/src/sage/tests/memcheck/run_tests.py b/src/sage/tests/memcheck/run_tests.py
+new file mode 100644
+index 00000000000..6ff4503a81b
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests.py
+@@ -0,0 +1,24 @@
++import types
++
++
++def run_tests() -> None:
++    """
++    Run all memcheck tests
++    """
++    from sage.tests.memcheck import symbolic_expression
++    run_tests_in_module(symbolic_expression)
++
++
++def run_tests_in_module(mod: types.ModuleType) -> None:
++    """
++    Run all memcheck tests in the given module
++    """
++    for entry in dir(mod):
++        if not entry.startswith('test_'):
++            continue
++        test_func = getattr(mod, entry)
++        test_func()
++
++
++if __name__ == '__main__':
++    run_tests()
+diff --git a/src/sage/tests/memcheck/run_tests_in_valgrind.py b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+new file mode 100644
+index 00000000000..df5ad0e92b2
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+@@ -0,0 +1,35 @@
++"""
++Launch valgrind and run the memory leak tests
++
++
++From the commandline, run
++
++    sage -python -m sage.tests.memcheck.run_tests_in_valgrind
++
++to launch valgrind and execute the memory leak tests. Requires valgrind
++to be installed. Alternatively, run as a unit test:
++
++    sage: from sage.tests.memcheck.run_tests_in_valgrind import run_tests_in_valgrind
++    sage: run_tests_in_valgrind()    # optional - valgrind
++"""
++
++import subprocess
++
++
++def run_tests_in_valgrind() -> None:
++    """
++    Run the sage.tests.memcheck.run_tests module inside valgrind
++    """
++    subprocess.check_call([
++        'valgrind',
++        '--suppressions=src/sage/ext_data/valgrind/valgrind-python.supp',
++        '--show-possibly-lost=no',
++        '--show-reachable=no',
++        './venv/bin/python',
++        '-m',
++        'sage.tests.memcheck.run_tests'
++    ])
++
++
++if __name__ == '__main__':
++    run_tests_in_valgrind()
+diff --git a/src/sage/tests/memcheck/symbolic_expression.py b/src/sage/tests/memcheck/symbolic_expression.py
+new file mode 100644
+index 00000000000..52182fbe62d
+--- /dev/null
++++ b/src/sage/tests/memcheck/symbolic_expression.py
+@@ -0,0 +1,11 @@
++from sage.tests.memcheck.verify_no_leak import verify_no_leak
++
++
++def test_sqrt_sqrt_2() -> None:
++    from sage.misc.functional import sqrt
++    T2 = sqrt(2)
++
++    def sqrt_T2() -> None:
++        sqrt(T2)
++
++    verify_no_leak(sqrt_T2)
+diff --git a/src/sage/tests/memcheck/verify_no_leak.py b/src/sage/tests/memcheck/verify_no_leak.py
+new file mode 100644
+index 00000000000..89ca90cf89c
+--- /dev/null
++++ b/src/sage/tests/memcheck/verify_no_leak.py
+@@ -0,0 +1,27 @@
++from typing import Tuple, Sequence, List, Callable, Any
++import valgrind
++
++
++def verify_no_leak(callback: Callable[[], Any],
++                   repeat: int = 10000,
++                   fuzzy: int = 10,
++                   ) -> None:
++    """
++    Verify that the callback does not generate new definitely lost blocks
++
++    Raises an assertion if the callback leaks memory
++    """
++    callback()   # warm_up
++    initial_blocks = (0, 0, 0, 0)
++    valgrind.memcheck_do_leak_check()
++    initial_blocks = valgrind.memcheck_count_leak_blocks()
++    for _ in range(repeat):
++        callback()
++    valgrind.memcheck_do_leak_check()
++    leak_blocks = valgrind.memcheck_count_leak_blocks()
++    leak = leak_blocks[0] - initial_blocks[0]
++    if leak < repeat - fuzzy:
++        return  # callback did not leak at least once per call
++    blocks = round(leak / repeat, 2)
++    message = f'{callback} leaked {blocks} block on average ({repeat} iterations)'
++    raise AssertionError(message)
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..6e67cdb4fb118 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,8 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
-
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+#get_pr 36018 "singular 4.3.2p7"
+get_pr 35934 "singular 4.3.2p7"  # includes #36018
+get_pr 36006 "gmp 6.3.0"
+get_pr 36046 "fix memory leak"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..ae06e8ef36471 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -33,15 +33,12 @@ license="GPL-2.0-or-later"
 homepage="http://sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (4 preceding siblings ...)
  2023-08-23 23:06 ` [PR PATCH] [Updated] " tornaria
@ 2023-08-23 23:25 ` tornaria
  2023-08-24 11:41 ` [PR PATCH] [Updated] " tornaria
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-23 23:25 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 922 bytes --]

New comment by tornaria on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1690769830

Comment:
> Looks good to me, thanks. I won't be able to run tests on aarch64 for three more weeks. How about the old idea of splitting a devel subpkg, which depends on devel stuff?

Sure. How would that work? What would we gain? I imagine:
 - we remove some packages from `sagemath` depends.
 - we create a meta package `sagemath-devel` which depends on `sagemath` and on all the packages we removed from `sagemath` depends.

As a matter of fact, I don't see what would be the point of `sagemath-devel`. I mean, if it's possible to use `sagemath` without those depends, then they shouldn't be depends in the first place.

An important point is: how would we test that the "depends" line is correct (i.e. that we don't remove something that is needed, e.g., to pass the testsuite).

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Updated] sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (5 preceding siblings ...)
  2023-08-23 23:25 ` tornaria
@ 2023-08-24 11:41 ` tornaria
  2023-08-26 15:50 ` dkwo
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-24 11:41 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]

There is an updated pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 119943 bytes --]

From 7bafbdda9475be560cf6cf86a54b6d65af2091d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Wed, 23 Aug 2023 09:46:02 -0300
Subject: [PATCH 1/2] giac: fix `#include <giac/giac.h>` in musl

As reported in #45708, including <giac/giac.h> fails in musl because the
HAVE_TGAMMAF macro from autotools is not available at this time.

Here we include a patch adapted from
https://github.com/geogebra/giac/commit/618a5de3349f8def5bdb909fea42fb447b6aad4a
which is the solution upstream will include in next release of giac.

We need to fix this now so we can build sagemath in musl!
---
 srcpkgs/giac/patches/fix-fgamma.patch | 40 +++++++++++++++++++++++++++
 srcpkgs/giac/template                 |  6 +++-
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/giac/patches/fix-fgamma.patch

diff --git a/srcpkgs/giac/patches/fix-fgamma.patch b/srcpkgs/giac/patches/fix-fgamma.patch
new file mode 100644
index 0000000000000..05101e310d1be
--- /dev/null
+++ b/srcpkgs/giac/patches/fix-fgamma.patch
@@ -0,0 +1,40 @@
+Adapted from
+https://github.com/geogebra/giac/commit/618a5de3349f8def5bdb909fea42fb447b6aad4a
+
+--- a/src/usual.cc
++++ b/src/usual.cc
+@@ -81,6 +81,16 @@ using namespace std;
+ #define sprintf256 sprintf
+ #endif
+ 
++#if defined HAVE_TGAMMAF || defined __APPLE__ || defined EMCC || defined EMCC2 || defined NO_BSD 
++inline float fgamma(float f1){ return tgammaf(f1); }
++#else
++#if defined(__MINGW_H) || defined(VISUALC) || defined(FXCG)// FIXME gamma, not used
++inline float fgamma(float f1){ return f1; }
++#else
++inline float fgamma(float f1){ return gammaf(f1); } // or tgammaf(f1) on some versions of emscripten
++#endif
++#endif
++
+ #ifndef NO_NAMESPACE_GIAC
+ namespace giac {
+ #endif // ndef NO_NAMESPACE_GIAC
+--- a/src/first.h
++++ b/src/first.h
+@@ -578,15 +578,6 @@ inline float ffloor(float f1){
+ #endif
+ }
+ inline float finv(float f1){ return 1/f1; }
+-#if defined HAVE_TGAMMAF || defined __APPLE__ || defined EMCC || defined EMCC2 || defined NO_BSD 
+-inline float fgamma(float f1){ return tgammaf(f1); }
+-#else
+-#if defined(__MINGW_H) || defined(VISUALC) || defined(FXCG)// FIXME gamma, not used
+-inline float fgamma(float f1){ return f1; }
+-#else
+-inline float fgamma(float f1){ return gammaf(f1); } // or tgammaf(f1) on some versions of emscripten
+-#endif
+-#endif
+ #ifdef FXCG
+ inline float atan2f(float f1,float f2,int rad){ if (rad) return std::atan2(f1,f2); else return std::atan2(f1,f2)*180/3.14159265358979323846;}
+ #else
diff --git a/srcpkgs/giac/template b/srcpkgs/giac/template
index 6ba75e6372fdc..2bf270458e53a 100644
--- a/srcpkgs/giac/template
+++ b/srcpkgs/giac/template
@@ -1,7 +1,7 @@
 # Template file for 'giac'
 pkgname=giac
 version=1.9.0.57
-revision=1
+revision=2
 build_style=gnu-configure
 configure_args="--disable-micropy --disable-quickjs"
 hostmakedepends="automake gettext-devel libtool"
@@ -56,6 +56,10 @@ pre_configure() {
 post_install() {
 	# remove duplicates
 	rm -r ${DESTDIR}/usr/share/doc
+
+	echo "giac: check that '#include <giac/giac.h>' works (see #45708)"
+	echo '#include <giac/giac.h>' |
+		${CC} -c -isystem "${DESTDIR}/usr/include" -xc++ - -o /dev/null
 }
 
 libgiac_package() {

From 26871aa12f0847bde0fff205e60ccae05149a7c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH 2/2] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      | 221 +++++
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36046-fix_memory_leak.patch       | 740 +++++++++++++++
 srcpkgs/sagemath/patches/get_patches          |  22 +-
 srcpkgs/sagemath/template                     |  13 +-
 13 files changed, 1011 insertions(+), 1818 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36046-fix_memory_leak.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..7c55bce6e9bb4
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,221 @@
+diff --git a/build/pkgs/singular/checksums.ini b/build/pkgs/singular/checksums.ini
+index 313463d2fea..1101fc55700 100644
+--- a/build/pkgs/singular/checksums.ini
++++ b/build/pkgs/singular/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=singular-VERSION.tar.gz
+-sha1=28bb3ee97ef48d04dfa96de182fd93eebe08426c
+-md5=fc0a4f5720dadba45a52ee94324ce00c
+-cksum=1573851737
+-upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-1/singular-VERSION.tar.gz
++sha1=df1997f412580f2073295aba569bb955ad227317
++md5=50349213e206a18cdaa1bc410dde7ea4
++cksum=376854707
++upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-2/singular-VERSION.tar.gz
+diff --git a/build/pkgs/singular/package-version.txt b/build/pkgs/singular/package-version.txt
+index 66e2bede53a..9f1bf008217 100644
+--- a/build/pkgs/singular/package-version.txt
++++ b/build/pkgs/singular/package-version.txt
+@@ -1 +1 @@
+-4.3.1p3
++4.3.2p7
+diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
+index 6a85631f624..f7621ec5fa1 100644
+--- a/build/pkgs/singular/spkg-configure.m4
++++ b/build/pkgs/singular/spkg-configure.m4
+@@ -6,14 +6,27 @@ SAGE_SPKG_CONFIGURE([singular], [
+     AS_IF([test -z "${SINGULAR_BIN}"], [sage_spkg_install_singular=yes], [
+       dnl Use pkg-config to ensure that Singular is new enough.
+       PKG_CHECK_MODULES([SINGULAR], [Singular >= 4.2.1], [
+-       AC_MSG_CHECKING([that Singular's help is working])
+-       AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
+-        AC_MSG_RESULT(yes)
+-       ], [
+-       AC_MSG_RESULT(no)
+-       sage_spkg_install_singular=yes
+-       ]
+-      )], [
++        AC_MSG_CHECKING([whether Singular is built with FLINT])
++        AC_COMPILE_IFELSE([
++          AC_LANG_PROGRAM([
++            #include <singular/singularconfig.h>
++            #if !defined(HAVE_FLINT)
++            #  error "Need Singular compiled with FLINT"
++          ], [])
++        ], [
++          AC_MSG_RESULT([yes])
++          AC_MSG_CHECKING([that Singular's help is working])
++          AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
++            AC_MSG_RESULT(yes)
++          ], [
++            AC_MSG_RESULT(no)
++            sage_spkg_install_singular=yes
++          ])
++        ], [
++          AC_MSG_RESULT([no])
++          sage_spkg_install_singular=yes
++        ])
++      ], [
+       dnl pkg-config version check failed
+       sage_spkg_install_singular=yes
+       ])
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22ada6de947..80352700872 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3132,13 +3132,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..c8e15e06f05 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2493,9 +2493,15 @@ def _set_ideal(self):
+             sage: '_ideal' in S.__dict__
+             True
+         """
++        from sage.libs.singular.function_factory import ff
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+         R = self.ring()
+-        I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        I = self._unsaturated_ideal
++        I_sat_gens = sat(I, prod(R.gens()))[0]
++        self._ideal = R.ideal(I_sat_gens)
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..afd6484d779 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1001,7 +1001,10 @@ def dual(self):
+         for i in range(n + 1):
+             J = J + S.ideal(z[-1] * f_S.derivative(z[i]) - z[i + n + 1])
+ 
+-        sat = ff.elim__lib.sat
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+         J_sat_gens = sat(J, max_ideal)[0]
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..dd054602ff608
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..c5b16168d04 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
new file mode 100644
index 0000000000000..3d2a4bd9cd96f
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
@@ -0,0 +1,740 @@
+diff --git a/src/sage/ext_data/valgrind/valgrind-python.supp b/src/sage/ext_data/valgrind/valgrind-python.supp
+new file mode 100644
+index 00000000000..16aa2858484
+--- /dev/null
++++ b/src/sage/ext_data/valgrind/valgrind-python.supp
+@@ -0,0 +1,480 @@
++# From the CPython repository with the suppressions for _PyObject_Free
++# and _PyObject_Realloc enabled. See the upstream suppression file for
++# details:
++#
++# https://github.com/python/cpython/blob/main/Misc/valgrind-python.supp
++
++# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
++   Memcheck:Value8
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:address_in_range
++}
++
++#
++# Leaks (including possible leaks)
++#    Hmmm, I wonder if this masks some real leaks.  I think it does.
++#    Will need to fix that.
++#
++
++{
++   Suppress leaking the GIL after a fork.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_allocate_lock
++   fun:PyEval_ReInitThreads
++}
++
++{
++   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_create_key
++   fun:_PyGILState_Init
++   fun:Py_InitializeEx
++   fun:Py_Main
++}
++
++{
++   Hmmm, is this a real leak or like the GIL?
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_ReInitTLS
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:realloc
++   fun:_PyObject_GC_Resize
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_New
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_NewVar
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++#
++# Non-python specific leaks
++#
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:calloc
++   fun:allocate_dtv
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:memalign
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Realloc
++}
++
++###
++### All the suppressions below are for errors that occur within libraries
++### that Python uses.  The problems to not appear to be related to Python's
++### use of the libraries.
++###
++
++{
++   Generic ubuntu ld problems
++   Memcheck:Addr8
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++}
++
++{
++   Generic gentoo ld problems
++   Memcheck:Cond
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_close
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Value8
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   GDBM problems, see test_gdbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   fun:gdbm_open
++
++}
++
++{
++   Uninitialised byte(s) false alarm, see bpo-35561
++   Memcheck:Param
++   epoll_ctl(event)
++   fun:epoll_ctl
++   fun:pyepoll_internal_ctl
++}
++
++{
++   ZLIB problems, see test_gzip
++   Memcheck:Cond
++   obj:/lib/libz.so.1.2.3
++   obj:/lib/libz.so.1.2.3
++   fun:deflate
++}
++
++{
++   Avoid problems w/readline doing a putenv and leaking on exit
++   Memcheck:Leak
++   fun:malloc
++   fun:xmalloc
++   fun:sh_set_lines_and_columns
++   fun:_rl_get_screen_size
++   fun:_rl_init_terminal_io
++   obj:/lib/libreadline.so.4.3
++   fun:rl_initialize
++}
++
++# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
++# false alarms on GCC builtin strcmp() function. The GCC code is correct.
++#
++# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
++{
++   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
++   Memcheck:Cond
++   fun:PyUnicode_Decode
++}
++
++
++###
++### These occur from somewhere within the SSL, when running
++###  test_socket_sll.  They are too general to leave on by default.
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:memset
++###}
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:memset
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:MD5_Update
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:MD5_Update
++###}
++
++# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
++# See http://bugs.python.org/issue14171
++{
++   openssl 1.0.1 prng 1
++   Memcheck:Cond
++   fun:bcmp
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 2
++   Memcheck:Cond
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 3
++   Memcheck:Value8
++   fun:_x86_64_AES_encrypt_compact
++   fun:AES_encrypt
++}
++
++#
++# All of these problems come from using test_socket_ssl
++#
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_bin2bn
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libcrypto.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_set_key_unchecked
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_encrypt2
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BUF_MEM_grow_clean
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:memcpy
++   fun:ssl3_read_bytes
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:SHA1_Update
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:SHA1_Update
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
++{
++   wcscmp_false_positive
++   Memcheck:Addr8
++   fun:wcscmp
++   fun:_PyOS_GetOpt
++   fun:Py_Main
++   fun:main
++}
++
++# Additional suppressions for the unified decimal tests:
++{
++   test_decimal
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_decimal2
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index b40ed64edb5..8c55861c147 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -1576,6 +1576,62 @@ const numeric numeric::div(const numeric &other) const {
+         }
+ }
+ 
++
++// Compute `a^b` as an integer, where a is an integer. Assign to ``res``` if it is integral, or return ``false``.
++// The nonnegative real root is taken for even denominators. To be used inside numeric::integer_rational_power,
++// to handle the special case of integral ``a``.
++bool integer_rational_power_of_mpz(
++        numeric& res,
++        const numeric& a,
++        const numeric& b
++) {
++        if (a.t != MPZ)
++                throw std::runtime_error("integer_rational_power_of_mpz: bad input");
++        mpz_t z;
++        mpz_init(z);
++        mpz_set_ui(z, 0);
++        int sgn = mpz_sgn(a.v._bigint);
++        if (mpz_cmp_ui(a.v._bigint, 1) == 0
++            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
++                mpz_set_ui(z, 1);
++        else if (sgn == 0) {
++                res = *_num0_p;
++                mpz_clear(z);
++                return true;
++        }
++        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1)) {
++                mpz_clear(z);
++                return false;
++        } else {
++                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
++                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat))) {
++                        // too big to take roots/powers
++                        mpz_clear(z);
++                        return false;
++                }
++                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
++                        if (mpz_perfect_square_p(a.v._bigint)) {
++                                mpz_sqrt(z, a.v._bigint);
++                        } else {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                else {
++                        bool exact = mpz_root(z, a.v._bigint,
++                                              mpz_get_ui(mpq_denref(b.v._bigrat)));
++                        if (not exact) {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
++        }
++        res = numeric(z);   // transfers ownership, no mpz_clear
++        return true;
++}
++
++
+ // Compute `a^b` as an integer, if it is integral, or return ``false``.
+ // The nonnegative real root is taken for even denominators.
+ bool numeric::integer_rational_power(numeric& res,
+@@ -1598,13 +1654,12 @@ bool numeric::integer_rational_power(numeric& res,
+                 if (a.v._long < 0
+                     and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+                         return false;
+-                long z;
+                 if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+                     or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+                 // too big to take roots/powers
+                         return false;
+                 if (b.is_equal(*_num1_2_p)) {
+-                        z = std::lround(std::sqrt(a.v._long));
++                        long z = std::lround(std::sqrt(a.v._long));
+                         if (a.v._long == z*z) {
+                                 res = numeric(z);
+                                 return true;
+@@ -1613,44 +1668,11 @@ bool numeric::integer_rational_power(numeric& res,
+                 }
+                 return integer_rational_power(res, a.to_bigint(), b);
+         }
+-        if (a.t != MPZ)
+-                throw std::runtime_error("integer_rational_power: bad input");
+-        int sgn = mpz_sgn(a.v._bigint);
+-        mpz_t z;
+-        mpz_init(z);
+-        mpz_set_ui(z, 0);
+-        if (mpz_cmp_ui(a.v._bigint, 1) == 0
+-            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
+-                mpz_set_ui(z, 1);
+-        else if (sgn == 0) {
+-                res = *_num0_p;
+-                return true;
+-        }
+-        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+-                return false;
+-        else {
+-                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+-                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+-                // too big to take roots/powers
+-                        return false;
+-                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
+-                        if (mpz_perfect_square_p(a.v._bigint))
+-                                mpz_sqrt(z, a.v._bigint);
+-                        else
+-                                return false;
+-                }
+-                else {
+-                        bool exact = mpz_root(z, a.v._bigint,
+-                                        mpz_get_ui(mpq_denref(b.v._bigrat)));
+-                        if (not exact)
+-                                return false;
+-                }
+-                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
+-        }
+-        res = numeric(z);
+-        return true;
++        // otherwise: a is integer
++        return integer_rational_power_of_mpz(res, a, b);
+ }
+ 
++
+ // for a^b return c,d such that a^b = c*d^b
+ // only for MPZ/MPQ base and MPQ exponent
+ void rational_power_parts(const numeric& a_orig, const numeric& b_orig,
+diff --git a/src/sage/tests/memcheck/__init__.py b/src/sage/tests/memcheck/__init__.py
+new file mode 100644
+index 00000000000..e69de29bb2d
+diff --git a/src/sage/tests/memcheck/run_tests.py b/src/sage/tests/memcheck/run_tests.py
+new file mode 100644
+index 00000000000..6ff4503a81b
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests.py
+@@ -0,0 +1,24 @@
++import types
++
++
++def run_tests() -> None:
++    """
++    Run all memcheck tests
++    """
++    from sage.tests.memcheck import symbolic_expression
++    run_tests_in_module(symbolic_expression)
++
++
++def run_tests_in_module(mod: types.ModuleType) -> None:
++    """
++    Run all memcheck tests in the given module
++    """
++    for entry in dir(mod):
++        if not entry.startswith('test_'):
++            continue
++        test_func = getattr(mod, entry)
++        test_func()
++
++
++if __name__ == '__main__':
++    run_tests()
+diff --git a/src/sage/tests/memcheck/run_tests_in_valgrind.py b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+new file mode 100644
+index 00000000000..df5ad0e92b2
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+@@ -0,0 +1,35 @@
++"""
++Launch valgrind and run the memory leak tests
++
++
++From the commandline, run
++
++    sage -python -m sage.tests.memcheck.run_tests_in_valgrind
++
++to launch valgrind and execute the memory leak tests. Requires valgrind
++to be installed. Alternatively, run as a unit test:
++
++    sage: from sage.tests.memcheck.run_tests_in_valgrind import run_tests_in_valgrind
++    sage: run_tests_in_valgrind()    # optional - valgrind
++"""
++
++import subprocess
++
++
++def run_tests_in_valgrind() -> None:
++    """
++    Run the sage.tests.memcheck.run_tests module inside valgrind
++    """
++    subprocess.check_call([
++        'valgrind',
++        '--suppressions=src/sage/ext_data/valgrind/valgrind-python.supp',
++        '--show-possibly-lost=no',
++        '--show-reachable=no',
++        './venv/bin/python',
++        '-m',
++        'sage.tests.memcheck.run_tests'
++    ])
++
++
++if __name__ == '__main__':
++    run_tests_in_valgrind()
+diff --git a/src/sage/tests/memcheck/symbolic_expression.py b/src/sage/tests/memcheck/symbolic_expression.py
+new file mode 100644
+index 00000000000..52182fbe62d
+--- /dev/null
++++ b/src/sage/tests/memcheck/symbolic_expression.py
+@@ -0,0 +1,11 @@
++from sage.tests.memcheck.verify_no_leak import verify_no_leak
++
++
++def test_sqrt_sqrt_2() -> None:
++    from sage.misc.functional import sqrt
++    T2 = sqrt(2)
++
++    def sqrt_T2() -> None:
++        sqrt(T2)
++
++    verify_no_leak(sqrt_T2)
+diff --git a/src/sage/tests/memcheck/verify_no_leak.py b/src/sage/tests/memcheck/verify_no_leak.py
+new file mode 100644
+index 00000000000..89ca90cf89c
+--- /dev/null
++++ b/src/sage/tests/memcheck/verify_no_leak.py
+@@ -0,0 +1,27 @@
++from typing import Tuple, Sequence, List, Callable, Any
++import valgrind
++
++
++def verify_no_leak(callback: Callable[[], Any],
++                   repeat: int = 10000,
++                   fuzzy: int = 10,
++                   ) -> None:
++    """
++    Verify that the callback does not generate new definitely lost blocks
++
++    Raises an assertion if the callback leaks memory
++    """
++    callback()   # warm_up
++    initial_blocks = (0, 0, 0, 0)
++    valgrind.memcheck_do_leak_check()
++    initial_blocks = valgrind.memcheck_count_leak_blocks()
++    for _ in range(repeat):
++        callback()
++    valgrind.memcheck_do_leak_check()
++    leak_blocks = valgrind.memcheck_count_leak_blocks()
++    leak = leak_blocks[0] - initial_blocks[0]
++    if leak < repeat - fuzzy:
++        return  # callback did not leak at least once per call
++    blocks = round(leak / repeat, 2)
++    message = f'{callback} leaked {blocks} block on average ({repeat} iterations)'
++    raise AssertionError(message)
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..6e67cdb4fb118 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,8 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
-
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+#get_pr 36018 "singular 4.3.2p7"
+get_pr 35934 "singular 4.3.2p7"  # includes #36018
+get_pr 36006 "gmp 6.3.0"
+get_pr 36046 "fix memory leak"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..ae06e8ef36471 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -33,15 +33,12 @@ license="GPL-2.0-or-later"
 homepage="http://sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (6 preceding siblings ...)
  2023-08-24 11:41 ` [PR PATCH] [Updated] " tornaria
@ 2023-08-26 15:50 ` dkwo
  2023-08-26 19:29 ` tornaria
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: dkwo @ 2023-08-26 15:50 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 527 bytes --]

New comment by dkwo on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1694393004

Comment:
We could remove
```
depends+=" eclib-devel flintlib-devel gcc-fortran gd-devel
 gsl-devel libpng-devel linbox-devel m4ri-devel 
 mpfr-devel ntl-devel pari-devel pkg-config python3-devel" 
```
and then see which tests fail from within installed sage;
within the build chroot, there should be no difference,
as those packages are already in (host)makedepends.
Does that make sense?

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (7 preceding siblings ...)
  2023-08-26 15:50 ` dkwo
@ 2023-08-26 19:29 ` tornaria
  2023-08-28  2:57 ` tornaria
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-26 19:29 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 888 bytes --]

New comment by tornaria on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1694487072

Comment:
> We could remove
> 
> ```
> depends+=" eclib-devel flintlib-devel gcc-fortran gd-devel
>  gsl-devel libpng-devel linbox-devel m4ri-devel 
>  mpfr-devel ntl-devel pari-devel pkg-config python3-devel" 
> ```
> 
> and then see which tests fail from within installed sage; within the build chroot, there should be no difference, as those packages are already in (host)makedepends. Does that make sense?

Nothing will fail inside the build chroot, since as you said, these are already installed via (host)makedepends. That's precisely the issue I am worried about.

The only easy way I see is to have a separate meta package to test sagemath, with a checkdepends on sagemath, which runs the sagemath testsuite (on the installed package).

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (8 preceding siblings ...)
  2023-08-26 19:29 ` tornaria
@ 2023-08-28  2:57 ` tornaria
  2023-08-28 19:05 ` [PR PATCH] [Updated] " tornaria
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-28  2:57 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 606 bytes --]

New comment by tornaria on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1694929983

Comment:
@dkwo all dependencies you singled out are needed to use either cython or fortran in sagemath, which are not optional (at least the testsuite fails without them).

I can imagine both features to be made optional, but I'm wary, something needs to happen so these are made optional and the testsuite works fine (a "feature" is detected, etc).

What is the need / advantage of this? I guess some download or installed size, but how much? Is it really worth it?


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Updated] sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (9 preceding siblings ...)
  2023-08-28  2:57 ` tornaria
@ 2023-08-28 19:05 ` tornaria
  2023-08-28 19:10 ` tornaria
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-28 19:05 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]

There is an updated pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 117574 bytes --]

From a605bf138337aeb4e8e8843451622320528d27e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      | 221 +++++
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36046-fix_memory_leak.patch       | 740 +++++++++++++++
 srcpkgs/sagemath/patches/get_patches          |  22 +-
 srcpkgs/sagemath/template                     |  17 +-
 13 files changed, 1013 insertions(+), 1820 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36046-fix_memory_leak.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..7c55bce6e9bb4
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,221 @@
+diff --git a/build/pkgs/singular/checksums.ini b/build/pkgs/singular/checksums.ini
+index 313463d2fea..1101fc55700 100644
+--- a/build/pkgs/singular/checksums.ini
++++ b/build/pkgs/singular/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=singular-VERSION.tar.gz
+-sha1=28bb3ee97ef48d04dfa96de182fd93eebe08426c
+-md5=fc0a4f5720dadba45a52ee94324ce00c
+-cksum=1573851737
+-upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-1/singular-VERSION.tar.gz
++sha1=df1997f412580f2073295aba569bb955ad227317
++md5=50349213e206a18cdaa1bc410dde7ea4
++cksum=376854707
++upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-2/singular-VERSION.tar.gz
+diff --git a/build/pkgs/singular/package-version.txt b/build/pkgs/singular/package-version.txt
+index 66e2bede53a..9f1bf008217 100644
+--- a/build/pkgs/singular/package-version.txt
++++ b/build/pkgs/singular/package-version.txt
+@@ -1 +1 @@
+-4.3.1p3
++4.3.2p7
+diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
+index 6a85631f624..f7621ec5fa1 100644
+--- a/build/pkgs/singular/spkg-configure.m4
++++ b/build/pkgs/singular/spkg-configure.m4
+@@ -6,14 +6,27 @@ SAGE_SPKG_CONFIGURE([singular], [
+     AS_IF([test -z "${SINGULAR_BIN}"], [sage_spkg_install_singular=yes], [
+       dnl Use pkg-config to ensure that Singular is new enough.
+       PKG_CHECK_MODULES([SINGULAR], [Singular >= 4.2.1], [
+-       AC_MSG_CHECKING([that Singular's help is working])
+-       AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
+-        AC_MSG_RESULT(yes)
+-       ], [
+-       AC_MSG_RESULT(no)
+-       sage_spkg_install_singular=yes
+-       ]
+-      )], [
++        AC_MSG_CHECKING([whether Singular is built with FLINT])
++        AC_COMPILE_IFELSE([
++          AC_LANG_PROGRAM([
++            #include <singular/singularconfig.h>
++            #if !defined(HAVE_FLINT)
++            #  error "Need Singular compiled with FLINT"
++          ], [])
++        ], [
++          AC_MSG_RESULT([yes])
++          AC_MSG_CHECKING([that Singular's help is working])
++          AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
++            AC_MSG_RESULT(yes)
++          ], [
++            AC_MSG_RESULT(no)
++            sage_spkg_install_singular=yes
++          ])
++        ], [
++          AC_MSG_RESULT([no])
++          sage_spkg_install_singular=yes
++        ])
++      ], [
+       dnl pkg-config version check failed
+       sage_spkg_install_singular=yes
+       ])
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22ada6de947..80352700872 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3132,13 +3132,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..c8e15e06f05 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2493,9 +2493,15 @@ def _set_ideal(self):
+             sage: '_ideal' in S.__dict__
+             True
+         """
++        from sage.libs.singular.function_factory import ff
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+         R = self.ring()
+-        I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        I = self._unsaturated_ideal
++        I_sat_gens = sat(I, prod(R.gens()))[0]
++        self._ideal = R.ideal(I_sat_gens)
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..afd6484d779 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1001,7 +1001,10 @@ def dual(self):
+         for i in range(n + 1):
+             J = J + S.ideal(z[-1] * f_S.derivative(z[i]) - z[i + n + 1])
+ 
+-        sat = ff.elim__lib.sat
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+         J_sat_gens = sat(J, max_ideal)[0]
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..91a77de342935
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..b95130b19dd 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    ...Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
new file mode 100644
index 0000000000000..3d2a4bd9cd96f
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
@@ -0,0 +1,740 @@
+diff --git a/src/sage/ext_data/valgrind/valgrind-python.supp b/src/sage/ext_data/valgrind/valgrind-python.supp
+new file mode 100644
+index 00000000000..16aa2858484
+--- /dev/null
++++ b/src/sage/ext_data/valgrind/valgrind-python.supp
+@@ -0,0 +1,480 @@
++# From the CPython repository with the suppressions for _PyObject_Free
++# and _PyObject_Realloc enabled. See the upstream suppression file for
++# details:
++#
++# https://github.com/python/cpython/blob/main/Misc/valgrind-python.supp
++
++# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
++   Memcheck:Value8
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:address_in_range
++}
++
++#
++# Leaks (including possible leaks)
++#    Hmmm, I wonder if this masks some real leaks.  I think it does.
++#    Will need to fix that.
++#
++
++{
++   Suppress leaking the GIL after a fork.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_allocate_lock
++   fun:PyEval_ReInitThreads
++}
++
++{
++   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_create_key
++   fun:_PyGILState_Init
++   fun:Py_InitializeEx
++   fun:Py_Main
++}
++
++{
++   Hmmm, is this a real leak or like the GIL?
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_ReInitTLS
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:realloc
++   fun:_PyObject_GC_Resize
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_New
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_NewVar
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++#
++# Non-python specific leaks
++#
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:calloc
++   fun:allocate_dtv
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:memalign
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Realloc
++}
++
++###
++### All the suppressions below are for errors that occur within libraries
++### that Python uses.  The problems to not appear to be related to Python's
++### use of the libraries.
++###
++
++{
++   Generic ubuntu ld problems
++   Memcheck:Addr8
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++}
++
++{
++   Generic gentoo ld problems
++   Memcheck:Cond
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_close
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Value8
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   GDBM problems, see test_gdbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   fun:gdbm_open
++
++}
++
++{
++   Uninitialised byte(s) false alarm, see bpo-35561
++   Memcheck:Param
++   epoll_ctl(event)
++   fun:epoll_ctl
++   fun:pyepoll_internal_ctl
++}
++
++{
++   ZLIB problems, see test_gzip
++   Memcheck:Cond
++   obj:/lib/libz.so.1.2.3
++   obj:/lib/libz.so.1.2.3
++   fun:deflate
++}
++
++{
++   Avoid problems w/readline doing a putenv and leaking on exit
++   Memcheck:Leak
++   fun:malloc
++   fun:xmalloc
++   fun:sh_set_lines_and_columns
++   fun:_rl_get_screen_size
++   fun:_rl_init_terminal_io
++   obj:/lib/libreadline.so.4.3
++   fun:rl_initialize
++}
++
++# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
++# false alarms on GCC builtin strcmp() function. The GCC code is correct.
++#
++# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
++{
++   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
++   Memcheck:Cond
++   fun:PyUnicode_Decode
++}
++
++
++###
++### These occur from somewhere within the SSL, when running
++###  test_socket_sll.  They are too general to leave on by default.
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:memset
++###}
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:memset
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:MD5_Update
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:MD5_Update
++###}
++
++# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
++# See http://bugs.python.org/issue14171
++{
++   openssl 1.0.1 prng 1
++   Memcheck:Cond
++   fun:bcmp
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 2
++   Memcheck:Cond
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 3
++   Memcheck:Value8
++   fun:_x86_64_AES_encrypt_compact
++   fun:AES_encrypt
++}
++
++#
++# All of these problems come from using test_socket_ssl
++#
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_bin2bn
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libcrypto.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_set_key_unchecked
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_encrypt2
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BUF_MEM_grow_clean
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:memcpy
++   fun:ssl3_read_bytes
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:SHA1_Update
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:SHA1_Update
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
++{
++   wcscmp_false_positive
++   Memcheck:Addr8
++   fun:wcscmp
++   fun:_PyOS_GetOpt
++   fun:Py_Main
++   fun:main
++}
++
++# Additional suppressions for the unified decimal tests:
++{
++   test_decimal
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_decimal2
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index b40ed64edb5..8c55861c147 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -1576,6 +1576,62 @@ const numeric numeric::div(const numeric &other) const {
+         }
+ }
+ 
++
++// Compute `a^b` as an integer, where a is an integer. Assign to ``res``` if it is integral, or return ``false``.
++// The nonnegative real root is taken for even denominators. To be used inside numeric::integer_rational_power,
++// to handle the special case of integral ``a``.
++bool integer_rational_power_of_mpz(
++        numeric& res,
++        const numeric& a,
++        const numeric& b
++) {
++        if (a.t != MPZ)
++                throw std::runtime_error("integer_rational_power_of_mpz: bad input");
++        mpz_t z;
++        mpz_init(z);
++        mpz_set_ui(z, 0);
++        int sgn = mpz_sgn(a.v._bigint);
++        if (mpz_cmp_ui(a.v._bigint, 1) == 0
++            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
++                mpz_set_ui(z, 1);
++        else if (sgn == 0) {
++                res = *_num0_p;
++                mpz_clear(z);
++                return true;
++        }
++        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1)) {
++                mpz_clear(z);
++                return false;
++        } else {
++                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
++                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat))) {
++                        // too big to take roots/powers
++                        mpz_clear(z);
++                        return false;
++                }
++                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
++                        if (mpz_perfect_square_p(a.v._bigint)) {
++                                mpz_sqrt(z, a.v._bigint);
++                        } else {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                else {
++                        bool exact = mpz_root(z, a.v._bigint,
++                                              mpz_get_ui(mpq_denref(b.v._bigrat)));
++                        if (not exact) {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
++        }
++        res = numeric(z);   // transfers ownership, no mpz_clear
++        return true;
++}
++
++
+ // Compute `a^b` as an integer, if it is integral, or return ``false``.
+ // The nonnegative real root is taken for even denominators.
+ bool numeric::integer_rational_power(numeric& res,
+@@ -1598,13 +1654,12 @@ bool numeric::integer_rational_power(numeric& res,
+                 if (a.v._long < 0
+                     and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+                         return false;
+-                long z;
+                 if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+                     or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+                 // too big to take roots/powers
+                         return false;
+                 if (b.is_equal(*_num1_2_p)) {
+-                        z = std::lround(std::sqrt(a.v._long));
++                        long z = std::lround(std::sqrt(a.v._long));
+                         if (a.v._long == z*z) {
+                                 res = numeric(z);
+                                 return true;
+@@ -1613,44 +1668,11 @@ bool numeric::integer_rational_power(numeric& res,
+                 }
+                 return integer_rational_power(res, a.to_bigint(), b);
+         }
+-        if (a.t != MPZ)
+-                throw std::runtime_error("integer_rational_power: bad input");
+-        int sgn = mpz_sgn(a.v._bigint);
+-        mpz_t z;
+-        mpz_init(z);
+-        mpz_set_ui(z, 0);
+-        if (mpz_cmp_ui(a.v._bigint, 1) == 0
+-            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
+-                mpz_set_ui(z, 1);
+-        else if (sgn == 0) {
+-                res = *_num0_p;
+-                return true;
+-        }
+-        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+-                return false;
+-        else {
+-                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+-                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+-                // too big to take roots/powers
+-                        return false;
+-                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
+-                        if (mpz_perfect_square_p(a.v._bigint))
+-                                mpz_sqrt(z, a.v._bigint);
+-                        else
+-                                return false;
+-                }
+-                else {
+-                        bool exact = mpz_root(z, a.v._bigint,
+-                                        mpz_get_ui(mpq_denref(b.v._bigrat)));
+-                        if (not exact)
+-                                return false;
+-                }
+-                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
+-        }
+-        res = numeric(z);
+-        return true;
++        // otherwise: a is integer
++        return integer_rational_power_of_mpz(res, a, b);
+ }
+ 
++
+ // for a^b return c,d such that a^b = c*d^b
+ // only for MPZ/MPQ base and MPQ exponent
+ void rational_power_parts(const numeric& a_orig, const numeric& b_orig,
+diff --git a/src/sage/tests/memcheck/__init__.py b/src/sage/tests/memcheck/__init__.py
+new file mode 100644
+index 00000000000..e69de29bb2d
+diff --git a/src/sage/tests/memcheck/run_tests.py b/src/sage/tests/memcheck/run_tests.py
+new file mode 100644
+index 00000000000..6ff4503a81b
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests.py
+@@ -0,0 +1,24 @@
++import types
++
++
++def run_tests() -> None:
++    """
++    Run all memcheck tests
++    """
++    from sage.tests.memcheck import symbolic_expression
++    run_tests_in_module(symbolic_expression)
++
++
++def run_tests_in_module(mod: types.ModuleType) -> None:
++    """
++    Run all memcheck tests in the given module
++    """
++    for entry in dir(mod):
++        if not entry.startswith('test_'):
++            continue
++        test_func = getattr(mod, entry)
++        test_func()
++
++
++if __name__ == '__main__':
++    run_tests()
+diff --git a/src/sage/tests/memcheck/run_tests_in_valgrind.py b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+new file mode 100644
+index 00000000000..df5ad0e92b2
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+@@ -0,0 +1,35 @@
++"""
++Launch valgrind and run the memory leak tests
++
++
++From the commandline, run
++
++    sage -python -m sage.tests.memcheck.run_tests_in_valgrind
++
++to launch valgrind and execute the memory leak tests. Requires valgrind
++to be installed. Alternatively, run as a unit test:
++
++    sage: from sage.tests.memcheck.run_tests_in_valgrind import run_tests_in_valgrind
++    sage: run_tests_in_valgrind()    # optional - valgrind
++"""
++
++import subprocess
++
++
++def run_tests_in_valgrind() -> None:
++    """
++    Run the sage.tests.memcheck.run_tests module inside valgrind
++    """
++    subprocess.check_call([
++        'valgrind',
++        '--suppressions=src/sage/ext_data/valgrind/valgrind-python.supp',
++        '--show-possibly-lost=no',
++        '--show-reachable=no',
++        './venv/bin/python',
++        '-m',
++        'sage.tests.memcheck.run_tests'
++    ])
++
++
++if __name__ == '__main__':
++    run_tests_in_valgrind()
+diff --git a/src/sage/tests/memcheck/symbolic_expression.py b/src/sage/tests/memcheck/symbolic_expression.py
+new file mode 100644
+index 00000000000..52182fbe62d
+--- /dev/null
++++ b/src/sage/tests/memcheck/symbolic_expression.py
+@@ -0,0 +1,11 @@
++from sage.tests.memcheck.verify_no_leak import verify_no_leak
++
++
++def test_sqrt_sqrt_2() -> None:
++    from sage.misc.functional import sqrt
++    T2 = sqrt(2)
++
++    def sqrt_T2() -> None:
++        sqrt(T2)
++
++    verify_no_leak(sqrt_T2)
+diff --git a/src/sage/tests/memcheck/verify_no_leak.py b/src/sage/tests/memcheck/verify_no_leak.py
+new file mode 100644
+index 00000000000..89ca90cf89c
+--- /dev/null
++++ b/src/sage/tests/memcheck/verify_no_leak.py
+@@ -0,0 +1,27 @@
++from typing import Tuple, Sequence, List, Callable, Any
++import valgrind
++
++
++def verify_no_leak(callback: Callable[[], Any],
++                   repeat: int = 10000,
++                   fuzzy: int = 10,
++                   ) -> None:
++    """
++    Verify that the callback does not generate new definitely lost blocks
++
++    Raises an assertion if the callback leaks memory
++    """
++    callback()   # warm_up
++    initial_blocks = (0, 0, 0, 0)
++    valgrind.memcheck_do_leak_check()
++    initial_blocks = valgrind.memcheck_count_leak_blocks()
++    for _ in range(repeat):
++        callback()
++    valgrind.memcheck_do_leak_check()
++    leak_blocks = valgrind.memcheck_count_leak_blocks()
++    leak = leak_blocks[0] - initial_blocks[0]
++    if leak < repeat - fuzzy:
++        return  # callback did not leak at least once per call
++    blocks = round(leak / repeat, 2)
++    message = f'{callback} leaked {blocks} block on average ({repeat} iterations)'
++    raise AssertionError(message)
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..6e67cdb4fb118 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,8 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
-
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+#get_pr 36018 "singular 4.3.2p7"
+get_pr 35934 "singular 4.3.2p7"  # includes #36018
+get_pr 36006 "gmp 6.3.0"
+get_pr 36046 "fix memory leak"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..a2ee32c69a952 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -15,7 +15,7 @@ makedepends="arb-devel boost-devel brial-devel cliquer-devel ecl eclib-devel
  mpfr-devel ntl-devel openblas-devel pari-devel planarity-devel python3-cypari2
  python3-cysignals python3-devel python3-gmpy2 python3-memory_allocator
  python3-numpy rankwidth-devel singular symmetrica-devel"
-depends="FlintQS eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
+depends="eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
  gfan giac gsl-devel gzip libpng-devel linbox-devel m4ri-devel maxima-ecl
  mpfr-devel nauty ntl-devel palp pari-devel pari-elldata-small pari-galdata
  pari-galpol-small pari-seadata-small pkg-config python3-Cython python3-cypari2
@@ -30,18 +30,15 @@ checkdepends="$depends pythran python3-Sphinx"
 short_desc="Open source mathematics software"
 maintainer="Gonzalo Tornaría <tornaria@cmat.edu.uy>"
 license="GPL-2.0-or-later"
-homepage="http://sagemath.org/"
+homepage="https://www.sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Updated] sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (10 preceding siblings ...)
  2023-08-28 19:05 ` [PR PATCH] [Updated] " tornaria
@ 2023-08-28 19:10 ` tornaria
  2023-08-29 13:06 ` tornaria
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-28 19:10 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]

There is an updated pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 117613 bytes --]

From 7dae82a8a9068b1742429fd28c30b85c36b260ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      | 221 +++++
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36046-fix_memory_leak.patch       | 740 +++++++++++++++
 srcpkgs/sagemath/patches/get_patches          |  22 +-
 srcpkgs/sagemath/template                     |  17 +-
 13 files changed, 1014 insertions(+), 1819 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36046-fix_memory_leak.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..7c55bce6e9bb4
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,221 @@
+diff --git a/build/pkgs/singular/checksums.ini b/build/pkgs/singular/checksums.ini
+index 313463d2fea..1101fc55700 100644
+--- a/build/pkgs/singular/checksums.ini
++++ b/build/pkgs/singular/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=singular-VERSION.tar.gz
+-sha1=28bb3ee97ef48d04dfa96de182fd93eebe08426c
+-md5=fc0a4f5720dadba45a52ee94324ce00c
+-cksum=1573851737
+-upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-1/singular-VERSION.tar.gz
++sha1=df1997f412580f2073295aba569bb955ad227317
++md5=50349213e206a18cdaa1bc410dde7ea4
++cksum=376854707
++upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-2/singular-VERSION.tar.gz
+diff --git a/build/pkgs/singular/package-version.txt b/build/pkgs/singular/package-version.txt
+index 66e2bede53a..9f1bf008217 100644
+--- a/build/pkgs/singular/package-version.txt
++++ b/build/pkgs/singular/package-version.txt
+@@ -1 +1 @@
+-4.3.1p3
++4.3.2p7
+diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
+index 6a85631f624..f7621ec5fa1 100644
+--- a/build/pkgs/singular/spkg-configure.m4
++++ b/build/pkgs/singular/spkg-configure.m4
+@@ -6,14 +6,27 @@ SAGE_SPKG_CONFIGURE([singular], [
+     AS_IF([test -z "${SINGULAR_BIN}"], [sage_spkg_install_singular=yes], [
+       dnl Use pkg-config to ensure that Singular is new enough.
+       PKG_CHECK_MODULES([SINGULAR], [Singular >= 4.2.1], [
+-       AC_MSG_CHECKING([that Singular's help is working])
+-       AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
+-        AC_MSG_RESULT(yes)
+-       ], [
+-       AC_MSG_RESULT(no)
+-       sage_spkg_install_singular=yes
+-       ]
+-      )], [
++        AC_MSG_CHECKING([whether Singular is built with FLINT])
++        AC_COMPILE_IFELSE([
++          AC_LANG_PROGRAM([
++            #include <singular/singularconfig.h>
++            #if !defined(HAVE_FLINT)
++            #  error "Need Singular compiled with FLINT"
++          ], [])
++        ], [
++          AC_MSG_RESULT([yes])
++          AC_MSG_CHECKING([that Singular's help is working])
++          AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
++            AC_MSG_RESULT(yes)
++          ], [
++            AC_MSG_RESULT(no)
++            sage_spkg_install_singular=yes
++          ])
++        ], [
++          AC_MSG_RESULT([no])
++          sage_spkg_install_singular=yes
++        ])
++      ], [
+       dnl pkg-config version check failed
+       sage_spkg_install_singular=yes
+       ])
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22ada6de947..80352700872 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3132,13 +3132,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..c8e15e06f05 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2493,9 +2493,15 @@ def _set_ideal(self):
+             sage: '_ideal' in S.__dict__
+             True
+         """
++        from sage.libs.singular.function_factory import ff
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+         R = self.ring()
+-        I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        I = self._unsaturated_ideal
++        I_sat_gens = sat(I, prod(R.gens()))[0]
++        self._ideal = R.ideal(I_sat_gens)
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..afd6484d779 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1001,7 +1001,10 @@ def dual(self):
+         for i in range(n + 1):
+             J = J + S.ideal(z[-1] * f_S.derivative(z[i]) - z[i + n + 1])
+ 
+-        sat = ff.elim__lib.sat
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+         J_sat_gens = sat(J, max_ideal)[0]
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..91a77de342935
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..b95130b19dd 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    ...Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
new file mode 100644
index 0000000000000..3d2a4bd9cd96f
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
@@ -0,0 +1,740 @@
+diff --git a/src/sage/ext_data/valgrind/valgrind-python.supp b/src/sage/ext_data/valgrind/valgrind-python.supp
+new file mode 100644
+index 00000000000..16aa2858484
+--- /dev/null
++++ b/src/sage/ext_data/valgrind/valgrind-python.supp
+@@ -0,0 +1,480 @@
++# From the CPython repository with the suppressions for _PyObject_Free
++# and _PyObject_Realloc enabled. See the upstream suppression file for
++# details:
++#
++# https://github.com/python/cpython/blob/main/Misc/valgrind-python.supp
++
++# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
++   Memcheck:Value8
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:address_in_range
++}
++
++#
++# Leaks (including possible leaks)
++#    Hmmm, I wonder if this masks some real leaks.  I think it does.
++#    Will need to fix that.
++#
++
++{
++   Suppress leaking the GIL after a fork.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_allocate_lock
++   fun:PyEval_ReInitThreads
++}
++
++{
++   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_create_key
++   fun:_PyGILState_Init
++   fun:Py_InitializeEx
++   fun:Py_Main
++}
++
++{
++   Hmmm, is this a real leak or like the GIL?
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_ReInitTLS
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:realloc
++   fun:_PyObject_GC_Resize
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_New
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_NewVar
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++#
++# Non-python specific leaks
++#
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:calloc
++   fun:allocate_dtv
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:memalign
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Realloc
++}
++
++###
++### All the suppressions below are for errors that occur within libraries
++### that Python uses.  The problems to not appear to be related to Python's
++### use of the libraries.
++###
++
++{
++   Generic ubuntu ld problems
++   Memcheck:Addr8
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++}
++
++{
++   Generic gentoo ld problems
++   Memcheck:Cond
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_close
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Value8
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   GDBM problems, see test_gdbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   fun:gdbm_open
++
++}
++
++{
++   Uninitialised byte(s) false alarm, see bpo-35561
++   Memcheck:Param
++   epoll_ctl(event)
++   fun:epoll_ctl
++   fun:pyepoll_internal_ctl
++}
++
++{
++   ZLIB problems, see test_gzip
++   Memcheck:Cond
++   obj:/lib/libz.so.1.2.3
++   obj:/lib/libz.so.1.2.3
++   fun:deflate
++}
++
++{
++   Avoid problems w/readline doing a putenv and leaking on exit
++   Memcheck:Leak
++   fun:malloc
++   fun:xmalloc
++   fun:sh_set_lines_and_columns
++   fun:_rl_get_screen_size
++   fun:_rl_init_terminal_io
++   obj:/lib/libreadline.so.4.3
++   fun:rl_initialize
++}
++
++# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
++# false alarms on GCC builtin strcmp() function. The GCC code is correct.
++#
++# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
++{
++   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
++   Memcheck:Cond
++   fun:PyUnicode_Decode
++}
++
++
++###
++### These occur from somewhere within the SSL, when running
++###  test_socket_sll.  They are too general to leave on by default.
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:memset
++###}
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:memset
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:MD5_Update
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:MD5_Update
++###}
++
++# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
++# See http://bugs.python.org/issue14171
++{
++   openssl 1.0.1 prng 1
++   Memcheck:Cond
++   fun:bcmp
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 2
++   Memcheck:Cond
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 3
++   Memcheck:Value8
++   fun:_x86_64_AES_encrypt_compact
++   fun:AES_encrypt
++}
++
++#
++# All of these problems come from using test_socket_ssl
++#
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_bin2bn
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libcrypto.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_set_key_unchecked
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_encrypt2
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BUF_MEM_grow_clean
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:memcpy
++   fun:ssl3_read_bytes
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:SHA1_Update
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:SHA1_Update
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
++{
++   wcscmp_false_positive
++   Memcheck:Addr8
++   fun:wcscmp
++   fun:_PyOS_GetOpt
++   fun:Py_Main
++   fun:main
++}
++
++# Additional suppressions for the unified decimal tests:
++{
++   test_decimal
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_decimal2
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index b40ed64edb5..8c55861c147 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -1576,6 +1576,62 @@ const numeric numeric::div(const numeric &other) const {
+         }
+ }
+ 
++
++// Compute `a^b` as an integer, where a is an integer. Assign to ``res``` if it is integral, or return ``false``.
++// The nonnegative real root is taken for even denominators. To be used inside numeric::integer_rational_power,
++// to handle the special case of integral ``a``.
++bool integer_rational_power_of_mpz(
++        numeric& res,
++        const numeric& a,
++        const numeric& b
++) {
++        if (a.t != MPZ)
++                throw std::runtime_error("integer_rational_power_of_mpz: bad input");
++        mpz_t z;
++        mpz_init(z);
++        mpz_set_ui(z, 0);
++        int sgn = mpz_sgn(a.v._bigint);
++        if (mpz_cmp_ui(a.v._bigint, 1) == 0
++            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
++                mpz_set_ui(z, 1);
++        else if (sgn == 0) {
++                res = *_num0_p;
++                mpz_clear(z);
++                return true;
++        }
++        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1)) {
++                mpz_clear(z);
++                return false;
++        } else {
++                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
++                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat))) {
++                        // too big to take roots/powers
++                        mpz_clear(z);
++                        return false;
++                }
++                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
++                        if (mpz_perfect_square_p(a.v._bigint)) {
++                                mpz_sqrt(z, a.v._bigint);
++                        } else {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                else {
++                        bool exact = mpz_root(z, a.v._bigint,
++                                              mpz_get_ui(mpq_denref(b.v._bigrat)));
++                        if (not exact) {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
++        }
++        res = numeric(z);   // transfers ownership, no mpz_clear
++        return true;
++}
++
++
+ // Compute `a^b` as an integer, if it is integral, or return ``false``.
+ // The nonnegative real root is taken for even denominators.
+ bool numeric::integer_rational_power(numeric& res,
+@@ -1598,13 +1654,12 @@ bool numeric::integer_rational_power(numeric& res,
+                 if (a.v._long < 0
+                     and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+                         return false;
+-                long z;
+                 if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+                     or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+                 // too big to take roots/powers
+                         return false;
+                 if (b.is_equal(*_num1_2_p)) {
+-                        z = std::lround(std::sqrt(a.v._long));
++                        long z = std::lround(std::sqrt(a.v._long));
+                         if (a.v._long == z*z) {
+                                 res = numeric(z);
+                                 return true;
+@@ -1613,44 +1668,11 @@ bool numeric::integer_rational_power(numeric& res,
+                 }
+                 return integer_rational_power(res, a.to_bigint(), b);
+         }
+-        if (a.t != MPZ)
+-                throw std::runtime_error("integer_rational_power: bad input");
+-        int sgn = mpz_sgn(a.v._bigint);
+-        mpz_t z;
+-        mpz_init(z);
+-        mpz_set_ui(z, 0);
+-        if (mpz_cmp_ui(a.v._bigint, 1) == 0
+-            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
+-                mpz_set_ui(z, 1);
+-        else if (sgn == 0) {
+-                res = *_num0_p;
+-                return true;
+-        }
+-        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+-                return false;
+-        else {
+-                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+-                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+-                // too big to take roots/powers
+-                        return false;
+-                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
+-                        if (mpz_perfect_square_p(a.v._bigint))
+-                                mpz_sqrt(z, a.v._bigint);
+-                        else
+-                                return false;
+-                }
+-                else {
+-                        bool exact = mpz_root(z, a.v._bigint,
+-                                        mpz_get_ui(mpq_denref(b.v._bigrat)));
+-                        if (not exact)
+-                                return false;
+-                }
+-                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
+-        }
+-        res = numeric(z);
+-        return true;
++        // otherwise: a is integer
++        return integer_rational_power_of_mpz(res, a, b);
+ }
+ 
++
+ // for a^b return c,d such that a^b = c*d^b
+ // only for MPZ/MPQ base and MPQ exponent
+ void rational_power_parts(const numeric& a_orig, const numeric& b_orig,
+diff --git a/src/sage/tests/memcheck/__init__.py b/src/sage/tests/memcheck/__init__.py
+new file mode 100644
+index 00000000000..e69de29bb2d
+diff --git a/src/sage/tests/memcheck/run_tests.py b/src/sage/tests/memcheck/run_tests.py
+new file mode 100644
+index 00000000000..6ff4503a81b
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests.py
+@@ -0,0 +1,24 @@
++import types
++
++
++def run_tests() -> None:
++    """
++    Run all memcheck tests
++    """
++    from sage.tests.memcheck import symbolic_expression
++    run_tests_in_module(symbolic_expression)
++
++
++def run_tests_in_module(mod: types.ModuleType) -> None:
++    """
++    Run all memcheck tests in the given module
++    """
++    for entry in dir(mod):
++        if not entry.startswith('test_'):
++            continue
++        test_func = getattr(mod, entry)
++        test_func()
++
++
++if __name__ == '__main__':
++    run_tests()
+diff --git a/src/sage/tests/memcheck/run_tests_in_valgrind.py b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+new file mode 100644
+index 00000000000..df5ad0e92b2
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+@@ -0,0 +1,35 @@
++"""
++Launch valgrind and run the memory leak tests
++
++
++From the commandline, run
++
++    sage -python -m sage.tests.memcheck.run_tests_in_valgrind
++
++to launch valgrind and execute the memory leak tests. Requires valgrind
++to be installed. Alternatively, run as a unit test:
++
++    sage: from sage.tests.memcheck.run_tests_in_valgrind import run_tests_in_valgrind
++    sage: run_tests_in_valgrind()    # optional - valgrind
++"""
++
++import subprocess
++
++
++def run_tests_in_valgrind() -> None:
++    """
++    Run the sage.tests.memcheck.run_tests module inside valgrind
++    """
++    subprocess.check_call([
++        'valgrind',
++        '--suppressions=src/sage/ext_data/valgrind/valgrind-python.supp',
++        '--show-possibly-lost=no',
++        '--show-reachable=no',
++        './venv/bin/python',
++        '-m',
++        'sage.tests.memcheck.run_tests'
++    ])
++
++
++if __name__ == '__main__':
++    run_tests_in_valgrind()
+diff --git a/src/sage/tests/memcheck/symbolic_expression.py b/src/sage/tests/memcheck/symbolic_expression.py
+new file mode 100644
+index 00000000000..52182fbe62d
+--- /dev/null
++++ b/src/sage/tests/memcheck/symbolic_expression.py
+@@ -0,0 +1,11 @@
++from sage.tests.memcheck.verify_no_leak import verify_no_leak
++
++
++def test_sqrt_sqrt_2() -> None:
++    from sage.misc.functional import sqrt
++    T2 = sqrt(2)
++
++    def sqrt_T2() -> None:
++        sqrt(T2)
++
++    verify_no_leak(sqrt_T2)
+diff --git a/src/sage/tests/memcheck/verify_no_leak.py b/src/sage/tests/memcheck/verify_no_leak.py
+new file mode 100644
+index 00000000000..89ca90cf89c
+--- /dev/null
++++ b/src/sage/tests/memcheck/verify_no_leak.py
+@@ -0,0 +1,27 @@
++from typing import Tuple, Sequence, List, Callable, Any
++import valgrind
++
++
++def verify_no_leak(callback: Callable[[], Any],
++                   repeat: int = 10000,
++                   fuzzy: int = 10,
++                   ) -> None:
++    """
++    Verify that the callback does not generate new definitely lost blocks
++
++    Raises an assertion if the callback leaks memory
++    """
++    callback()   # warm_up
++    initial_blocks = (0, 0, 0, 0)
++    valgrind.memcheck_do_leak_check()
++    initial_blocks = valgrind.memcheck_count_leak_blocks()
++    for _ in range(repeat):
++        callback()
++    valgrind.memcheck_do_leak_check()
++    leak_blocks = valgrind.memcheck_count_leak_blocks()
++    leak = leak_blocks[0] - initial_blocks[0]
++    if leak < repeat - fuzzy:
++        return  # callback did not leak at least once per call
++    blocks = round(leak / repeat, 2)
++    message = f'{callback} leaked {blocks} block on average ({repeat} iterations)'
++    raise AssertionError(message)
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..c2c5aa1c7eccd 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,10 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
+# merged in 10.2.beta0
+#get_pr  36018   "singular 4.3.2p4" # included in #35934
+get_pr  36046   "fix memory leak"
 
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+get_pr  35934   "singular 4.3.2p7"
+get_pr  36006   "gmp 6.3.0"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..a2ee32c69a952 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -15,7 +15,7 @@ makedepends="arb-devel boost-devel brial-devel cliquer-devel ecl eclib-devel
  mpfr-devel ntl-devel openblas-devel pari-devel planarity-devel python3-cypari2
  python3-cysignals python3-devel python3-gmpy2 python3-memory_allocator
  python3-numpy rankwidth-devel singular symmetrica-devel"
-depends="FlintQS eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
+depends="eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
  gfan giac gsl-devel gzip libpng-devel linbox-devel m4ri-devel maxima-ecl
  mpfr-devel nauty ntl-devel palp pari-devel pari-elldata-small pari-galdata
  pari-galpol-small pari-seadata-small pkg-config python3-Cython python3-cypari2
@@ -30,18 +30,15 @@ checkdepends="$depends pythran python3-Sphinx"
 short_desc="Open source mathematics software"
 maintainer="Gonzalo Tornaría <tornaria@cmat.edu.uy>"
 license="GPL-2.0-or-later"
-homepage="http://sagemath.org/"
+homepage="https://www.sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Updated] sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (11 preceding siblings ...)
  2023-08-28 19:10 ` tornaria
@ 2023-08-29 13:06 ` tornaria
  2023-08-30 20:39 ` tornaria
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-29 13:06 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]

There is an updated pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 117613 bytes --]

From 831d5d0510ba58d37b5b78b8639062ec2a03d2d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      | 221 +++++
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36046-fix_memory_leak.patch       | 740 +++++++++++++++
 srcpkgs/sagemath/patches/get_patches          |  22 +-
 srcpkgs/sagemath/template                     |  17 +-
 13 files changed, 1014 insertions(+), 1819 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36046-fix_memory_leak.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..7c55bce6e9bb4
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,221 @@
+diff --git a/build/pkgs/singular/checksums.ini b/build/pkgs/singular/checksums.ini
+index 313463d2fea..1101fc55700 100644
+--- a/build/pkgs/singular/checksums.ini
++++ b/build/pkgs/singular/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=singular-VERSION.tar.gz
+-sha1=28bb3ee97ef48d04dfa96de182fd93eebe08426c
+-md5=fc0a4f5720dadba45a52ee94324ce00c
+-cksum=1573851737
+-upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-1/singular-VERSION.tar.gz
++sha1=df1997f412580f2073295aba569bb955ad227317
++md5=50349213e206a18cdaa1bc410dde7ea4
++cksum=376854707
++upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-2/singular-VERSION.tar.gz
+diff --git a/build/pkgs/singular/package-version.txt b/build/pkgs/singular/package-version.txt
+index 66e2bede53a..9f1bf008217 100644
+--- a/build/pkgs/singular/package-version.txt
++++ b/build/pkgs/singular/package-version.txt
+@@ -1 +1 @@
+-4.3.1p3
++4.3.2p7
+diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
+index 6a85631f624..f7621ec5fa1 100644
+--- a/build/pkgs/singular/spkg-configure.m4
++++ b/build/pkgs/singular/spkg-configure.m4
+@@ -6,14 +6,27 @@ SAGE_SPKG_CONFIGURE([singular], [
+     AS_IF([test -z "${SINGULAR_BIN}"], [sage_spkg_install_singular=yes], [
+       dnl Use pkg-config to ensure that Singular is new enough.
+       PKG_CHECK_MODULES([SINGULAR], [Singular >= 4.2.1], [
+-       AC_MSG_CHECKING([that Singular's help is working])
+-       AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
+-        AC_MSG_RESULT(yes)
+-       ], [
+-       AC_MSG_RESULT(no)
+-       sage_spkg_install_singular=yes
+-       ]
+-      )], [
++        AC_MSG_CHECKING([whether Singular is built with FLINT])
++        AC_COMPILE_IFELSE([
++          AC_LANG_PROGRAM([
++            #include <singular/singularconfig.h>
++            #if !defined(HAVE_FLINT)
++            #  error "Need Singular compiled with FLINT"
++          ], [])
++        ], [
++          AC_MSG_RESULT([yes])
++          AC_MSG_CHECKING([that Singular's help is working])
++          AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
++            AC_MSG_RESULT(yes)
++          ], [
++            AC_MSG_RESULT(no)
++            sage_spkg_install_singular=yes
++          ])
++        ], [
++          AC_MSG_RESULT([no])
++          sage_spkg_install_singular=yes
++        ])
++      ], [
+       dnl pkg-config version check failed
+       sage_spkg_install_singular=yes
+       ])
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22ada6de947..80352700872 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3132,13 +3132,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..c8e15e06f05 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2493,9 +2493,15 @@ def _set_ideal(self):
+             sage: '_ideal' in S.__dict__
+             True
+         """
++        from sage.libs.singular.function_factory import ff
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+         R = self.ring()
+-        I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        I = self._unsaturated_ideal
++        I_sat_gens = sat(I, prod(R.gens()))[0]
++        self._ideal = R.ideal(I_sat_gens)
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..afd6484d779 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1001,7 +1001,10 @@ def dual(self):
+         for i in range(n + 1):
+             J = J + S.ideal(z[-1] * f_S.derivative(z[i]) - z[i + n + 1])
+ 
+-        sat = ff.elim__lib.sat
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+         J_sat_gens = sat(J, max_ideal)[0]
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..91a77de342935
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..b95130b19dd 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    ...Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
new file mode 100644
index 0000000000000..3d2a4bd9cd96f
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
@@ -0,0 +1,740 @@
+diff --git a/src/sage/ext_data/valgrind/valgrind-python.supp b/src/sage/ext_data/valgrind/valgrind-python.supp
+new file mode 100644
+index 00000000000..16aa2858484
+--- /dev/null
++++ b/src/sage/ext_data/valgrind/valgrind-python.supp
+@@ -0,0 +1,480 @@
++# From the CPython repository with the suppressions for _PyObject_Free
++# and _PyObject_Realloc enabled. See the upstream suppression file for
++# details:
++#
++# https://github.com/python/cpython/blob/main/Misc/valgrind-python.supp
++
++# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
++   Memcheck:Value8
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:address_in_range
++}
++
++#
++# Leaks (including possible leaks)
++#    Hmmm, I wonder if this masks some real leaks.  I think it does.
++#    Will need to fix that.
++#
++
++{
++   Suppress leaking the GIL after a fork.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_allocate_lock
++   fun:PyEval_ReInitThreads
++}
++
++{
++   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_create_key
++   fun:_PyGILState_Init
++   fun:Py_InitializeEx
++   fun:Py_Main
++}
++
++{
++   Hmmm, is this a real leak or like the GIL?
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_ReInitTLS
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:realloc
++   fun:_PyObject_GC_Resize
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_New
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_NewVar
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++#
++# Non-python specific leaks
++#
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:calloc
++   fun:allocate_dtv
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:memalign
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Realloc
++}
++
++###
++### All the suppressions below are for errors that occur within libraries
++### that Python uses.  The problems to not appear to be related to Python's
++### use of the libraries.
++###
++
++{
++   Generic ubuntu ld problems
++   Memcheck:Addr8
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++}
++
++{
++   Generic gentoo ld problems
++   Memcheck:Cond
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_close
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Value8
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   GDBM problems, see test_gdbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   fun:gdbm_open
++
++}
++
++{
++   Uninitialised byte(s) false alarm, see bpo-35561
++   Memcheck:Param
++   epoll_ctl(event)
++   fun:epoll_ctl
++   fun:pyepoll_internal_ctl
++}
++
++{
++   ZLIB problems, see test_gzip
++   Memcheck:Cond
++   obj:/lib/libz.so.1.2.3
++   obj:/lib/libz.so.1.2.3
++   fun:deflate
++}
++
++{
++   Avoid problems w/readline doing a putenv and leaking on exit
++   Memcheck:Leak
++   fun:malloc
++   fun:xmalloc
++   fun:sh_set_lines_and_columns
++   fun:_rl_get_screen_size
++   fun:_rl_init_terminal_io
++   obj:/lib/libreadline.so.4.3
++   fun:rl_initialize
++}
++
++# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
++# false alarms on GCC builtin strcmp() function. The GCC code is correct.
++#
++# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
++{
++   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
++   Memcheck:Cond
++   fun:PyUnicode_Decode
++}
++
++
++###
++### These occur from somewhere within the SSL, when running
++###  test_socket_sll.  They are too general to leave on by default.
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:memset
++###}
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:memset
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:MD5_Update
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:MD5_Update
++###}
++
++# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
++# See http://bugs.python.org/issue14171
++{
++   openssl 1.0.1 prng 1
++   Memcheck:Cond
++   fun:bcmp
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 2
++   Memcheck:Cond
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 3
++   Memcheck:Value8
++   fun:_x86_64_AES_encrypt_compact
++   fun:AES_encrypt
++}
++
++#
++# All of these problems come from using test_socket_ssl
++#
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_bin2bn
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libcrypto.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_set_key_unchecked
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_encrypt2
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BUF_MEM_grow_clean
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:memcpy
++   fun:ssl3_read_bytes
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:SHA1_Update
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:SHA1_Update
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
++{
++   wcscmp_false_positive
++   Memcheck:Addr8
++   fun:wcscmp
++   fun:_PyOS_GetOpt
++   fun:Py_Main
++   fun:main
++}
++
++# Additional suppressions for the unified decimal tests:
++{
++   test_decimal
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_decimal2
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index b40ed64edb5..8c55861c147 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -1576,6 +1576,62 @@ const numeric numeric::div(const numeric &other) const {
+         }
+ }
+ 
++
++// Compute `a^b` as an integer, where a is an integer. Assign to ``res``` if it is integral, or return ``false``.
++// The nonnegative real root is taken for even denominators. To be used inside numeric::integer_rational_power,
++// to handle the special case of integral ``a``.
++bool integer_rational_power_of_mpz(
++        numeric& res,
++        const numeric& a,
++        const numeric& b
++) {
++        if (a.t != MPZ)
++                throw std::runtime_error("integer_rational_power_of_mpz: bad input");
++        mpz_t z;
++        mpz_init(z);
++        mpz_set_ui(z, 0);
++        int sgn = mpz_sgn(a.v._bigint);
++        if (mpz_cmp_ui(a.v._bigint, 1) == 0
++            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
++                mpz_set_ui(z, 1);
++        else if (sgn == 0) {
++                res = *_num0_p;
++                mpz_clear(z);
++                return true;
++        }
++        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1)) {
++                mpz_clear(z);
++                return false;
++        } else {
++                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
++                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat))) {
++                        // too big to take roots/powers
++                        mpz_clear(z);
++                        return false;
++                }
++                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
++                        if (mpz_perfect_square_p(a.v._bigint)) {
++                                mpz_sqrt(z, a.v._bigint);
++                        } else {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                else {
++                        bool exact = mpz_root(z, a.v._bigint,
++                                              mpz_get_ui(mpq_denref(b.v._bigrat)));
++                        if (not exact) {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
++        }
++        res = numeric(z);   // transfers ownership, no mpz_clear
++        return true;
++}
++
++
+ // Compute `a^b` as an integer, if it is integral, or return ``false``.
+ // The nonnegative real root is taken for even denominators.
+ bool numeric::integer_rational_power(numeric& res,
+@@ -1598,13 +1654,12 @@ bool numeric::integer_rational_power(numeric& res,
+                 if (a.v._long < 0
+                     and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+                         return false;
+-                long z;
+                 if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+                     or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+                 // too big to take roots/powers
+                         return false;
+                 if (b.is_equal(*_num1_2_p)) {
+-                        z = std::lround(std::sqrt(a.v._long));
++                        long z = std::lround(std::sqrt(a.v._long));
+                         if (a.v._long == z*z) {
+                                 res = numeric(z);
+                                 return true;
+@@ -1613,44 +1668,11 @@ bool numeric::integer_rational_power(numeric& res,
+                 }
+                 return integer_rational_power(res, a.to_bigint(), b);
+         }
+-        if (a.t != MPZ)
+-                throw std::runtime_error("integer_rational_power: bad input");
+-        int sgn = mpz_sgn(a.v._bigint);
+-        mpz_t z;
+-        mpz_init(z);
+-        mpz_set_ui(z, 0);
+-        if (mpz_cmp_ui(a.v._bigint, 1) == 0
+-            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
+-                mpz_set_ui(z, 1);
+-        else if (sgn == 0) {
+-                res = *_num0_p;
+-                return true;
+-        }
+-        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+-                return false;
+-        else {
+-                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+-                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+-                // too big to take roots/powers
+-                        return false;
+-                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
+-                        if (mpz_perfect_square_p(a.v._bigint))
+-                                mpz_sqrt(z, a.v._bigint);
+-                        else
+-                                return false;
+-                }
+-                else {
+-                        bool exact = mpz_root(z, a.v._bigint,
+-                                        mpz_get_ui(mpq_denref(b.v._bigrat)));
+-                        if (not exact)
+-                                return false;
+-                }
+-                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
+-        }
+-        res = numeric(z);
+-        return true;
++        // otherwise: a is integer
++        return integer_rational_power_of_mpz(res, a, b);
+ }
+ 
++
+ // for a^b return c,d such that a^b = c*d^b
+ // only for MPZ/MPQ base and MPQ exponent
+ void rational_power_parts(const numeric& a_orig, const numeric& b_orig,
+diff --git a/src/sage/tests/memcheck/__init__.py b/src/sage/tests/memcheck/__init__.py
+new file mode 100644
+index 00000000000..e69de29bb2d
+diff --git a/src/sage/tests/memcheck/run_tests.py b/src/sage/tests/memcheck/run_tests.py
+new file mode 100644
+index 00000000000..6ff4503a81b
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests.py
+@@ -0,0 +1,24 @@
++import types
++
++
++def run_tests() -> None:
++    """
++    Run all memcheck tests
++    """
++    from sage.tests.memcheck import symbolic_expression
++    run_tests_in_module(symbolic_expression)
++
++
++def run_tests_in_module(mod: types.ModuleType) -> None:
++    """
++    Run all memcheck tests in the given module
++    """
++    for entry in dir(mod):
++        if not entry.startswith('test_'):
++            continue
++        test_func = getattr(mod, entry)
++        test_func()
++
++
++if __name__ == '__main__':
++    run_tests()
+diff --git a/src/sage/tests/memcheck/run_tests_in_valgrind.py b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+new file mode 100644
+index 00000000000..df5ad0e92b2
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+@@ -0,0 +1,35 @@
++"""
++Launch valgrind and run the memory leak tests
++
++
++From the commandline, run
++
++    sage -python -m sage.tests.memcheck.run_tests_in_valgrind
++
++to launch valgrind and execute the memory leak tests. Requires valgrind
++to be installed. Alternatively, run as a unit test:
++
++    sage: from sage.tests.memcheck.run_tests_in_valgrind import run_tests_in_valgrind
++    sage: run_tests_in_valgrind()    # optional - valgrind
++"""
++
++import subprocess
++
++
++def run_tests_in_valgrind() -> None:
++    """
++    Run the sage.tests.memcheck.run_tests module inside valgrind
++    """
++    subprocess.check_call([
++        'valgrind',
++        '--suppressions=src/sage/ext_data/valgrind/valgrind-python.supp',
++        '--show-possibly-lost=no',
++        '--show-reachable=no',
++        './venv/bin/python',
++        '-m',
++        'sage.tests.memcheck.run_tests'
++    ])
++
++
++if __name__ == '__main__':
++    run_tests_in_valgrind()
+diff --git a/src/sage/tests/memcheck/symbolic_expression.py b/src/sage/tests/memcheck/symbolic_expression.py
+new file mode 100644
+index 00000000000..52182fbe62d
+--- /dev/null
++++ b/src/sage/tests/memcheck/symbolic_expression.py
+@@ -0,0 +1,11 @@
++from sage.tests.memcheck.verify_no_leak import verify_no_leak
++
++
++def test_sqrt_sqrt_2() -> None:
++    from sage.misc.functional import sqrt
++    T2 = sqrt(2)
++
++    def sqrt_T2() -> None:
++        sqrt(T2)
++
++    verify_no_leak(sqrt_T2)
+diff --git a/src/sage/tests/memcheck/verify_no_leak.py b/src/sage/tests/memcheck/verify_no_leak.py
+new file mode 100644
+index 00000000000..89ca90cf89c
+--- /dev/null
++++ b/src/sage/tests/memcheck/verify_no_leak.py
+@@ -0,0 +1,27 @@
++from typing import Tuple, Sequence, List, Callable, Any
++import valgrind
++
++
++def verify_no_leak(callback: Callable[[], Any],
++                   repeat: int = 10000,
++                   fuzzy: int = 10,
++                   ) -> None:
++    """
++    Verify that the callback does not generate new definitely lost blocks
++
++    Raises an assertion if the callback leaks memory
++    """
++    callback()   # warm_up
++    initial_blocks = (0, 0, 0, 0)
++    valgrind.memcheck_do_leak_check()
++    initial_blocks = valgrind.memcheck_count_leak_blocks()
++    for _ in range(repeat):
++        callback()
++    valgrind.memcheck_do_leak_check()
++    leak_blocks = valgrind.memcheck_count_leak_blocks()
++    leak = leak_blocks[0] - initial_blocks[0]
++    if leak < repeat - fuzzy:
++        return  # callback did not leak at least once per call
++    blocks = round(leak / repeat, 2)
++    message = f'{callback} leaked {blocks} block on average ({repeat} iterations)'
++    raise AssertionError(message)
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..c2c5aa1c7eccd 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,10 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
+# merged in 10.2.beta0
+#get_pr  36018   "singular 4.3.2p4" # included in #35934
+get_pr  36046   "fix memory leak"
 
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+get_pr  35934   "singular 4.3.2p7"
+get_pr  36006   "gmp 6.3.0"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..a2ee32c69a952 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -15,7 +15,7 @@ makedepends="arb-devel boost-devel brial-devel cliquer-devel ecl eclib-devel
  mpfr-devel ntl-devel openblas-devel pari-devel planarity-devel python3-cypari2
  python3-cysignals python3-devel python3-gmpy2 python3-memory_allocator
  python3-numpy rankwidth-devel singular symmetrica-devel"
-depends="FlintQS eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
+depends="eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
  gfan giac gsl-devel gzip libpng-devel linbox-devel m4ri-devel maxima-ecl
  mpfr-devel nauty ntl-devel palp pari-devel pari-elldata-small pari-galdata
  pari-galpol-small pari-seadata-small pkg-config python3-Cython python3-cypari2
@@ -30,18 +30,15 @@ checkdepends="$depends pythran python3-Sphinx"
 short_desc="Open source mathematics software"
 maintainer="Gonzalo Tornaría <tornaria@cmat.edu.uy>"
 license="GPL-2.0-or-later"
-homepage="http://sagemath.org/"
+homepage="https://www.sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Updated] sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (12 preceding siblings ...)
  2023-08-29 13:06 ` tornaria
@ 2023-08-30 20:39 ` tornaria
  2023-08-30 21:35 ` tornaria
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-30 20:39 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1351 bytes --]

There is an updated pull request by tornaria against master on the void-packages repository

https://github.com/tornaria/void-packages sagemath
https://github.com/void-linux/void-packages/pull/45708

sagemath: update to 10.1.
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


A patch file from https://github.com/void-linux/void-packages/pull/45708.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-sagemath-45708.patch --]
[-- Type: text/x-diff, Size: 117613 bytes --]

From 790976c0974722f4e63354f7d7b2a5c0545ffc5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= <tornaria@cmat.edu.uy>
Date: Sun, 20 Aug 2023 21:39:02 -0300
Subject: [PATCH] sagemath: update to 10.1.

---
 .../sagemath/patches/35584-networkx_3.1.patch |  92 --
 .../sagemath/patches/35612-linbox_1.7.0.patch |  64 --
 .../patches/35619-maxima_5.46.0.patch         | 586 ------------
 .../sagemath/patches/35635-sympy_1.12.patch   |  54 --
 .../patches/35707-maxima_5.47.0.patch         | 879 ------------------
 .../patches/35825-singular_4.3.2p2.patch      |  24 -
 .../sagemath/patches/35826-numpy_1.25.0.patch |  83 --
 .../patches/35831-setuptools_68.0.0.patch     |  13 -
 .../patches/35934-singular_4.3.2p7.patch      | 221 +++++
 .../sagemath/patches/36006-gmp_6.3.0.patch    |  38 +
 .../patches/36046-fix_memory_leak.patch       | 740 +++++++++++++++
 srcpkgs/sagemath/patches/get_patches          |  22 +-
 srcpkgs/sagemath/template                     |  17 +-
 13 files changed, 1014 insertions(+), 1819 deletions(-)
 delete mode 100644 srcpkgs/sagemath/patches/35584-networkx_3.1.patch
 delete mode 100644 srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35635-sympy_1.12.patch
 delete mode 100644 srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
 delete mode 100644 srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
 delete mode 100644 srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
 create mode 100644 srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
 create mode 100644 srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
 create mode 100644 srcpkgs/sagemath/patches/36046-fix_memory_leak.patch

diff --git a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch b/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
deleted file mode 100644
index 9331258986d3d..0000000000000
--- a/srcpkgs/sagemath/patches/35584-networkx_3.1.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-diff --git a/src/sage/graphs/graph.py b/src/sage/graphs/graph.py
-index c2e42bcbd38..0d13f071dc4 100644
---- a/src/sage/graphs/graph.py
-+++ b/src/sage/graphs/graph.py
-@@ -6786,13 +6786,26 @@ def cliques_number_of(self, vertices=None, cliques=None):
-             {(0, 0): 2, (0, 1): 3, (0, 2): 2, (1, 0): 2, (1, 1): 3, (1, 2): 2}
-             sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
-             {(0, 1): 3, (1, 2): 2}
-+            sage: F.cliques_number_of(vertices=(0, 1))
-+            3
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_number_of()
-             {0: 2, 1: 2, 2: 1, 3: 1}
-         """
--        import networkx
--        return networkx.number_of_cliques(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return sum(1 for c in cliques if vertices in c)
-+
-+        from collections import Counter
-+        count = Counter()
-+
-+        for c in cliques:
-+            count.update(c)
-+
-+        return {v : count[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def cliques_get_max_clique_graph(self):
-@@ -7493,17 +7506,32 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
- 
-             sage: C = Graph('DJ{')
-             sage: C.cliques_containing_vertex()
--            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
-+            sage: C.cliques_containing_vertex(4)
-+            [[0, 4], [1, 2, 3, 4]]
-+            sage: C.cliques_containing_vertex([0, 1])
-+            {0: [[0, 4]], 1: [[1, 2, 3, 4]]}
-             sage: E = C.cliques_maximal()
-             sage: E
-             [[0, 4], [1, 2, 3, 4]]
-             sage: C.cliques_containing_vertex(cliques=E)
--            {0: [[0, 4]], 1: [[1, 2, 3, 4]], 2: [[1, 2, 3, 4]], 3: [[1, 2, 3, 4]], 4: [[0, 4], [1, 2, 3, 4]]}
-+            {0: [[0, 4]],
-+             1: [[1, 2, 3, 4]],
-+             2: [[1, 2, 3, 4]],
-+             3: [[1, 2, 3, 4]],
-+             4: [[0, 4], [1, 2, 3, 4]]}
- 
-             sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
-             sage: G.show(figsize=[2,2])
-             sage: G.cliques_containing_vertex()
--            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
-+            {0: [[0, 1, 2], [0, 1, 3]],
-+             1: [[0, 1, 2], [0, 1, 3]],
-+             2: [[0, 1, 2]],
-+             3: [[0, 1, 3]]}
- 
-         Since each clique of a 2 dimensional grid corresponds to an edge, the
-         number of cliques in which a vertex is involved equals its degree::
-@@ -7518,8 +7546,20 @@ def cliques_containing_vertex(self, vertices=None, cliques=None):
-             sage: sorted(sorted(x for x in L) for L in d[(0, 1)])
-             [[(0, 0), (0, 1)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]]
-         """
--        import networkx
--        return networkx.cliques_containing_node(self.networkx_graph(), vertices, cliques)
-+        if cliques is None:
-+            cliques = self.cliques_maximal()
-+
-+        if vertices in self:  # single vertex
-+            return [c for c in cliques if vertices in c]
-+
-+        from collections import defaultdict
-+        d = defaultdict(list)
-+
-+        for c in cliques:
-+            for v in c:
-+                d[v].append(c)
-+
-+        return {v : d[v] for v in vertices or self}
- 
-     @doc_index("Clique-related methods")
-     def clique_complex(self):
diff --git a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch b/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
deleted file mode 100644
index 58dddf34a69d8..0000000000000
--- a/srcpkgs/sagemath/patches/35612-linbox_1.7.0.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff --git a/src/sage/libs/linbox/conversion.pxd b/src/sage/libs/linbox/conversion.pxd
-index 7794c9edc39..1753277b1f1 100644
---- a/src/sage/libs/linbox/conversion.pxd
-+++ b/src/sage/libs/linbox/conversion.pxd
-@@ -177,9 +177,8 @@ cdef inline Vector_integer_dense new_sage_vector_integer_dense(P, DenseVector_in
-     - v -- linbox vector
-     """
-     cdef Vector_integer_dense res = P()
--    cdef cppvector[Integer] * vec = &v.refRep()
-     cdef size_t i
-     for i in range(<size_t> res._degree):
--        mpz_set(res._entries[i], vec[0][i].get_mpz_const())
-+        mpz_set(res._entries[i], v.getEntry(i).get_mpz_const())
- 
-     return res
-diff --git a/src/sage/libs/linbox/linbox.pxd b/src/sage/libs/linbox/linbox.pxd
-index 9112d151f8b..bfeda4b6042 100644
---- a/src/sage/libs/linbox/linbox.pxd
-+++ b/src/sage/libs/linbox/linbox.pxd
-@@ -32,7 +32,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_double Field
-         ctypedef double Element
-         DenseMatrix_Modular_double(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_double(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -42,7 +41,6 @@ cdef extern from "linbox/matrix/dense-matrix.h":
-         ctypedef Modular_float Field
-         ctypedef float Element
-         DenseMatrix_Modular_float(Field F, size_t m, size_t n)
--        DenseMatrix_Modular_float(Field F, Element*, size_t m, size_t n)
-         void setEntry(size_t i, size_t j, Element& a)
-         Element &getEntry(size_t i, size_t j)
- 
-@@ -101,7 +99,6 @@ cdef extern from "linbox/vector/vector.h":
-         DenseVector_integer (Field &F)
-         DenseVector_integer (Field &F, long& m)
-         DenseVector_integer (Field &F, cppvector[Integer]&)
--        cppvector[Element]& refRep()
-         size_t size()
-         void resize(size_t)
-         void resize(size_t n, const Element&)
-diff --git a/src/sage/matrix/matrix_modn_dense_template.pxi b/src/sage/matrix/matrix_modn_dense_template.pxi
-index abf29badce6..68b869ce314 100644
---- a/src/sage/matrix/matrix_modn_dense_template.pxi
-+++ b/src/sage/matrix/matrix_modn_dense_template.pxi
-@@ -221,9 +221,14 @@ cdef inline linbox_echelonize_efd(celement modulus, celement* entries, Py_ssize_
-         return 0,[]
- 
-     cdef ModField *F = new ModField(<long>modulus)
--    cdef DenseMatrix *A = new DenseMatrix(F[0], <ModField.Element*>entries,<Py_ssize_t>nrows, <Py_ssize_t>ncols)
--    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-+    cdef DenseMatrix *A = new DenseMatrix(F[0], nrows, ncols)
-+
-     cdef Py_ssize_t i,j
-+    for i in range(nrows):
-+        for j in range(ncols):
-+            A.setEntry(i, j, entries[i*ncols+j])
-+
-+    cdef Py_ssize_t r = reducedRowEchelonize(A[0])
-     for i in range(nrows):
-         for j in range(ncols):
-             entries[i*ncols+j] = <celement>A.getEntry(i,j)
diff --git a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch b/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
deleted file mode 100644
index 970de6e5beb6c..0000000000000
--- a/srcpkgs/sagemath/patches/35619-maxima_5.46.0.patch
+++ /dev/null
@@ -1,586 +0,0 @@
-diff --git a/build/pkgs/ecl/dependencies b/build/pkgs/ecl/dependencies
-index cda6316bf5a..51a953403e9 100644
---- a/build/pkgs/ecl/dependencies
-+++ b/build/pkgs/ecl/dependencies
-@@ -1,4 +1,4 @@
--$(MP_LIBRARY) readline gc libffi
-+$(MP_LIBRARY) readline gc libffi info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/ecl/spkg-configure.m4 b/build/pkgs/ecl/spkg-configure.m4
-index ae1e0ac5e1a..7dbcfa6377b 100644
---- a/build/pkgs/ecl/spkg-configure.m4
-+++ b/build/pkgs/ecl/spkg-configure.m4
-@@ -35,10 +35,7 @@ SAGE_SPKG_CONFIGURE([ecl], [
-     AC_SUBST(SAGE_ECL_CONFIG, [$ECL_CONFIG])
-   fi
- 
--  # Maxima cannot yet be provided by the system, so we always use
-+  # Kenzo cannot yet be provided by the system, so we always use
-   # the SAGE_LOCAL path for now.
--  AC_SUBST(SAGE_MAXIMA_FAS, ['${prefix}'/lib/ecl/maxima.fas])
--
--  # Likewise for the optional Kenzo SPKG
-   AC_SUBST(SAGE_KENZO_FAS, ['${prefix}'/lib/ecl/kenzo.fas])
- ])
-diff --git a/build/pkgs/ecl/spkg-install.in b/build/pkgs/ecl/spkg-install.in
-index ee1667aec16..72083337942 100644
---- a/build/pkgs/ecl/spkg-install.in
-+++ b/build/pkgs/ecl/spkg-install.in
-@@ -31,18 +31,6 @@ cp "$SAGE_ROOT"/config/config.* src
- 
- if [ x"$SAGE_SPKG_INSTALL_DOCS" != xyes ] ; then
-     ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--else
--    # ECL 2020 needs modern makeinfo
--    command -v texi2any >/dev/null 2>&1
--    if [ $? -ne 0 ]; then # texi2any not found -> makeinfo too old, if present
--        ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--    else
--        if makeinfo -c foo 2>&1 | grep -q invalid; then
--            # makeinfo found but does not support all options that ecl
--            # likes to use
--            ECL_CONFIGURE="$ECL_CONFIGURE --enable-manual=no"
--        fi
--    fi
- fi
- 
- sdh_configure $SAGE_CONFIGURE_GMP \
-diff --git a/build/pkgs/giac/spkg-configure.m4 b/build/pkgs/giac/spkg-configure.m4
-index 5859e35f12e..53e3a8301cd 100644
---- a/build/pkgs/giac/spkg-configure.m4
-+++ b/build/pkgs/giac/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([giac], [
-        m4_pushdef([GIAC_MAX_VERSION], [1.9.999])
-        AC_CACHE_CHECK([for giac >= ]GIAC_MIN_VERSION[, <= ]GIAC_MAX_VERSION, [ac_cv_path_GIAC], [
-          AC_PATH_PROGS_FEATURE_CHECK([GIAC], [giac], [
--            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -1)
-+            giac_version=$($ac_path_GIAC --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$giac_version"], [
-                 AX_COMPARE_VERSION([$giac_version], [ge], GIAC_MIN_VERSION, [
-                     AX_COMPARE_VERSION([$giac_version], [le], GIAC_MAX_VERSION, [
-diff --git a/build/pkgs/info/distros/fedora.txt b/build/pkgs/info/distros/fedora.txt
-index 283aa462f74..c0d8f74e0ad 100644
---- a/build/pkgs/info/distros/fedora.txt
-+++ b/build/pkgs/info/distros/fedora.txt
-@@ -1 +1 @@
--texinfo
-+texinfo info
-diff --git a/build/pkgs/info/spkg-configure.m4 b/build/pkgs/info/spkg-configure.m4
-index 0980a4b8ef8..85fe1ea4731 100644
---- a/build/pkgs/info/spkg-configure.m4
-+++ b/build/pkgs/info/spkg-configure.m4
-@@ -1,4 +1,14 @@
- SAGE_SPKG_CONFIGURE([info], [
-   AC_PATH_PROG(INFO, info)
--  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes])
-+  AS_IF([test -z "${INFO}"], [sage_spkg_install_info=yes
-+    ], [
-+     dnl very old makeinfo are not texi2any, newer are symlinks to texi2any
-+     AC_PATH_PROG(TEXI2ANY, texi2any)
-+     AS_IF([test -z "${TEXI2ANY}"], [sage_spkg_install_info=yes
-+       ], [
-+        AS_IF([makeinfo -c foo 2>&1 | grep -q invalid], [
-+         dnl makeinfo found, but too old, and  does not support all options that ecl likes to use
-+         sage_spkg_install_info=yes])
-+       ])
-+    ])
- ])
-diff --git a/build/pkgs/info/spkg-install.in b/build/pkgs/info/spkg-install.in
-index 8086e4b2ec8..3ea8c053669 100644
---- a/build/pkgs/info/spkg-install.in
-+++ b/build/pkgs/info/spkg-install.in
-@@ -1,2 +1,2 @@
--cd src/info
-+cd src
- sdh_make_install
-diff --git a/build/pkgs/info/type b/build/pkgs/info/type
-index 134d9bc32d5..a6a7b9cd726 100644
---- a/build/pkgs/info/type
-+++ b/build/pkgs/info/type
-@@ -1 +1 @@
--optional
-+standard
-diff --git a/build/pkgs/maxima/checksums.ini b/build/pkgs/maxima/checksums.ini
-index a804c7b831f..0f594389fe6 100644
---- a/build/pkgs/maxima/checksums.ini
-+++ b/build/pkgs/maxima/checksums.ini
-@@ -1,5 +1,5 @@
- tarball=maxima-VERSION.tar.gz
--sha1=ed15d5285794413ba94412079eca3d0fa55a47bf
--md5=9b9ae1dace55b1386739dabaa9122e60
--cksum=1765409766
-+sha1=1010594e6d6082bbd8efaac1b7756ec1721a4ed5
-+md5=3c01f1daa6936e11d8713fef7751d3fe
-+cksum=2420393096
- upstream_url=https://sourceforge.net/projects/maxima/files/Maxima-source/VERSION-source/maxima-VERSION.tar.gz/download
-diff --git a/build/pkgs/maxima/dependencies b/build/pkgs/maxima/dependencies
-index fffb89e2050..55c7e0d8d14 100644
---- a/build/pkgs/maxima/dependencies
-+++ b/build/pkgs/maxima/dependencies
-@@ -1,4 +1,4 @@
--ecl
-+ecl info
- 
- ----------
- All lines of this file are ignored except the first.
-diff --git a/build/pkgs/maxima/distros/arch.txt b/build/pkgs/maxima/distros/arch.txt
-index 6400290f44d..6ac052fa62b 100644
---- a/build/pkgs/maxima/distros/arch.txt
-+++ b/build/pkgs/maxima/distros/arch.txt
-@@ -1 +1 @@
--maxima-ecl
-+maxima-fas
-diff --git a/build/pkgs/maxima/distros/cygwin.txt b/build/pkgs/maxima/distros/cygwin.txt
-new file mode 100644
-index 00000000000..f5fe3fdc6cb
---- /dev/null
-+++ b/build/pkgs/maxima/distros/cygwin.txt
-@@ -0,0 +1 @@
-+maxima
-diff --git a/build/pkgs/maxima/distros/freebsd.txt b/build/pkgs/maxima/distros/freebsd.txt
-new file mode 100644
-index 00000000000..766a71b5074
---- /dev/null
-+++ b/build/pkgs/maxima/distros/freebsd.txt
-@@ -0,0 +1 @@
-+math/maxima
-diff --git a/build/pkgs/maxima/distros/gentoo.txt b/build/pkgs/maxima/distros/gentoo.txt
-new file mode 100644
-index 00000000000..85fb33f1610
---- /dev/null
-+++ b/build/pkgs/maxima/distros/gentoo.txt
-@@ -0,0 +1,2 @@
-+sci-mathematics/maxima[ecls]
-+
-diff --git a/build/pkgs/maxima/package-version.txt b/build/pkgs/maxima/package-version.txt
-index 83476624dc0..5681375f3be 100644
---- a/build/pkgs/maxima/package-version.txt
-+++ b/build/pkgs/maxima/package-version.txt
-@@ -1 +1 @@
--5.45.0.p0
-+5.46.0
-diff --git a/build/pkgs/maxima/patches/matrixexp.patch b/build/pkgs/maxima/patches/matrixexp.patch
-deleted file mode 100644
-index 5c8527c33bf..00000000000
---- a/build/pkgs/maxima/patches/matrixexp.patch
-+++ /dev/null
-@@ -1,15 +0,0 @@
--diff --git a/share/linearalgebra/matrixexp.lisp b/share/linearalgebra/matrixexp.lisp
--index 218bf35..f2fd468 100644
----- a/share/linearalgebra/matrixexp.lisp
--+++ b/share/linearalgebra/matrixexp.lisp
--@@ -138,8 +138,8 @@
-- 	   (print `(ratvars = ,$ratvars gcd = '$gcd algebraic = ,$algebraic))
-- 	   (print `(ratfac = ,$ratfac))
-- 	   (merror "Unable to find the spectrum")))
---   
---    (setq res ($fullratsimp (ncpower (sub (mult z ($ident n)) mat) -1) z))
--+
--+    (setq res ($fullratsimp ($invert_by_lu (sub (mult z ($ident n)) mat) '$crering) z))
--     (setq m (length sp))
--     (dotimes (i m)
--       (setq zi (nth i sp))
-diff --git a/build/pkgs/maxima/patches/maxima.system.patch b/build/pkgs/maxima/patches/maxima.system.patch
-deleted file mode 100644
-index 74db62e7f9f..00000000000
---- a/build/pkgs/maxima/patches/maxima.system.patch
-+++ /dev/null
-@@ -1,25 +0,0 @@
--diff --git a/src/maxima.system b/src/maxima.system
--index 76f2452..cf25f51 100644
----- a/src/maxima.system
--+++ b/src/maxima.system
--@@ -1,5 +1,8 @@
-- ;;; -*- Lisp -*-
-- 
--+(require :cmp)
--+(setf c::*compile-in-constants* t)
--+
-- (in-package :cl-user)
-- 
-- (pushnew :cl *features*)
--@@ -75,6 +78,11 @@
-- 			     ;; Convert dir/foo.fas to dir/foo.o
-- 			     (make-pathname :type "o" :defaults p))
-- 			 files)))
--+	(c::build-fasl "binary-ecl/maxima" :lisp-files obj
--+			  :ld-flags
--+			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
--+							      (find-package "MAXIMA")))))
--+			    (if (and x (not (string= x ""))) (list x))))
-- 	(c::build-program "binary-ecl/maxima" :lisp-files obj
-- 			  :ld-flags
-- 			  (let ((x (symbol-value (find-symbol "*AUTOCONF-LD-FLAGS*"
-diff --git a/build/pkgs/maxima/spkg-configure.m4 b/build/pkgs/maxima/spkg-configure.m4
-new file mode 100644
-index 00000000000..86de8c1dfc1
---- /dev/null
-+++ b/build/pkgs/maxima/spkg-configure.m4
-@@ -0,0 +1,46 @@
-+SAGE_SPKG_CONFIGURE([maxima], [
-+  m4_pushdef([SAGE_MAXIMA_MINVER],["5.45.0"])dnl this version and higher allowed
-+  SAGE_SPKG_DEPCHECK([ecl], [
-+    dnl First check for the "maxima" executable in the user's PATH, because
-+    dnl we still use pexpect to communicate with it in a few places.
-+    AC_CACHE_CHECK([for Maxima >= $SAGE_MAXIMA_MINVER], [ac_cv_path_MAXIMA], [
-+        AC_PATH_PROGS_FEATURE_CHECK([MAXIMA], [maxima], [
-+            maxima_version=`$ac_path_MAXIMA --version 2>&1 | tail -n 1\
-+                | $SED -n -e 's/Maxima *\([[0-9]]*\.[[0-9]]*\.[[0-9]]*\)/\1/p'`
-+            AS_IF([test -n "$maxima_version"], [
-+                AX_COMPARE_VERSION([$maxima_version], [ge], [SAGE_MAXIMA_MINVER], [
-+                    ac_cv_path_MAXIMA="$ac_path_MAXIMA"
-+                    ac_path_MAXIMA_found=:
-+                ])
-+            ])
-+        ])
-+    ])
-+    SAGE_MAXIMA="$ac_cv_path_MAXIMA"
-+    AS_IF([test -z "${SAGE_MAXIMA}"], [
-+      sage_spkg_install_maxima=yes
-+    ],[
-+      dnl If we have the executable, check also for the ECL library.
-+      AC_MSG_CHECKING([if ECL can "require" the maxima module])
-+      AS_IF([ecl --eval "(require 'maxima)" --eval "(quit)" \
-+               >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD], [
-+        AC_MSG_RESULT(yes)
-+      ], [
-+        AC_MSG_RESULT(no)
-+        sage_spkg_install_maxima=yes
-+      ])
-+    ])
-+  ])
-+  m4_popdef([SAGE_MAXIMA_MINVER])
-+],[],[],[
-+  # post-check
-+  AS_IF([test x$sage_spkg_install_maxima = xyes], [
-+    dnl Leaving this variable empty will tell sagelib to load
-+    dnl the maxima library (within ECL) by name instead of by
-+    dnl absolute path.
-+    SAGE_MAXIMA='${prefix}'/bin/maxima
-+    SAGE_MAXIMA_FAS='${prefix}'/lib/ecl/maxima.fas
-+  ])
-+
-+  AC_SUBST(SAGE_MAXIMA, "${SAGE_MAXIMA}")
-+  AC_SUBST(SAGE_MAXIMA_FAS, "${SAGE_MAXIMA_FAS}")
-+])
-diff --git a/build/pkgs/maxima/spkg-install.in b/build/pkgs/maxima/spkg-install.in
-index 3ae6382f9ba..cdb6fbf2069 100644
---- a/build/pkgs/maxima/spkg-install.in
-+++ b/build/pkgs/maxima/spkg-install.in
-@@ -28,28 +28,6 @@ echo
- echo "Now configuring Maxima..."
- sdh_configure --enable-ecl git_found=false
- 
--# Note the following is regression in maxima build system
--# see https://sourceforge.net/p/maxima/bugs/3278/
--# and https://sourceforge.net/p/maxima/bugs/2878/
--# For the previous time it was fixed.
--#---------------------------------------------------------------
--# Touching html and info file to avoid to regenerate them.
--# This must be done after configuration since the timestamp need
--# to be later than include-maxima.texi which is generated at
--# configuration time
--for i in doc/info/*.html ; do
--    touch "${i}"
--done
--touch doc/info/maxima.info*
--# Maxima 5.44.0 build_html.sh is not compatible with makeinfo 4.8
--# (which is /usr/bin/makeinfo on macOS).  #30063
--# Do not build the HTML docs unless the user asks for it,
--# in which case it is their problem to install a better
--# makeinfo version.
--if [[ "$SAGE_SPKG_INSTALL_DOCS" != yes ]] ; then
--touch doc/info/maxima_toc.html interfaces/xmaxima/doc/xmaxima.html
--fi
--
- #---------------------------------------------------------------
- 
- sdh_make
-diff --git a/build/pkgs/tox/spkg-configure.m4 b/build/pkgs/tox/spkg-configure.m4
-index 7d8ade4c14b..5a260439cdd 100644
---- a/build/pkgs/tox/spkg-configure.m4
-+++ b/build/pkgs/tox/spkg-configure.m4
-@@ -5,7 +5,7 @@ SAGE_SPKG_CONFIGURE([tox], [
-        m4_pushdef([TOX4_MIN_VERSION], [4.0.15])
-        AC_CACHE_CHECK([for tox 3 >= ]TOX3_MIN_VERSION[ or tox 4 >= ]TOX4_MIN_VERSION, [ac_cv_path_TOX], [
-          AC_PATH_PROGS_FEATURE_CHECK([TOX], [tox], [
--            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -1)
-+            tox_version=$($ac_path_TOX --version 2> /dev/null | tail -n 1)
-             AS_IF([test -n "$tox_version"], [
-                 AX_COMPARE_VERSION([$tox_version], [lt], [4], [
-                     AX_COMPARE_VERSION([$tox_version], [ge], TOX3_MIN_VERSION, [
-diff --git a/pkgs/sage-conf/_sage_conf/_conf.py.in b/pkgs/sage-conf/_sage_conf/_conf.py.in
-index d66bdb3d264..f2e197b45ed 100644
---- a/pkgs/sage-conf/_sage_conf/_conf.py.in
-+++ b/pkgs/sage-conf/_sage_conf/_conf.py.in
-@@ -9,9 +9,11 @@ VERSION = "@PACKAGE_VERSION@"
- SAGE_LOCAL = "@prefix@"
- SAGE_ROOT = "@SAGE_ROOT@"
- 
--MAXIMA = "@prefix@/bin/maxima"
-+# The path to the standalone maxima executable.
-+MAXIMA = "@SAGE_MAXIMA@".replace('${prefix}', SAGE_LOCAL)
- 
--# Delete this line if your ECL can load maxima without further prodding.
-+# Set this to the empty string if your ECL can load maxima without
-+# further prodding.
- MAXIMA_FAS = "@SAGE_MAXIMA_FAS@".replace('${prefix}', SAGE_LOCAL)
- 
- # Delete this line if your ECL can load Kenzo without further prodding.
-diff --git a/src/bin/sage-env b/src/bin/sage-env
-index a7da60df28f..13b54fa7e92 100644
---- a/src/bin/sage-env
-+++ b/src/bin/sage-env
-@@ -440,9 +440,6 @@ if [ -d "$DOT_SAGE" ] ; then
-     fi
- fi
- 
--if [ -n "$SAGE_LOCAL" ]; then
--    export MAXIMA_PREFIX="$SAGE_LOCAL"
--fi
- export MAXIMA_USERDIR="$DOT_SAGE/maxima"
- 
- if [ -n "$SAGE_LOCAL" ]; then
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ee8f632e94c 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -136,10 +136,11 @@
-     [          1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x)) 1/2*(x*e^(2*sqrt(x)) - x)*sqrt(x)*e^(x - sqrt(x))]
-     [  1/2*(e^(2*sqrt(x)) - 1)*e^(x - sqrt(x))/x^(3/2)           1/2*(e^(2*sqrt(x)) + 1)*e^(x - sqrt(x))]
- 
--And complex exponentiation works now::
-+Complex exponentiation works, but may require a patched version of
-+maxima (:trac:`32898`) for now::
- 
-     sage: M = i*matrix([[pi]])
--    sage: e^M
-+    sage: e^M  # not tested, requires patched maxima
-     [-1]
-     sage: M = i*matrix([[pi,0],[0,2*pi]])
-     sage: e^M
-@@ -1186,8 +1187,18 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         e
-         sage: f.limit(x=5)
-         7776/3125
--        sage: f.limit(x=1.2)
-+
-+    Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+        sage: maxima_calculus.eval("domain:real")
-+        ...
-+        sage: f.limit(x=1.2).n()
-         2.06961575467...
-+        sage: maxima_calculus.eval("domain:complex");
-+        ...
-+
-+    Otherwise, it works ::
-+
-         sage: f.limit(x=I, taylor=True)
-         (-I + 1)^I
-         sage: f(x=1.2)
-@@ -1215,7 +1226,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-     With this example, Maxima is looking for a LOT of information::
- 
-         sage: assume(a>0)
--        sage: limit(x^a,x=0)
-+        sage: limit(x^a,x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -1224,7 +1235,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-          more details)
-         Is a an integer?
-         sage: assume(a,'integer')
--        sage: limit(x^a, x=0)
-+        sage: limit(x^a, x=0)  # random - maxima 5.46.0 does not need extra assumption
-         Traceback (most recent call last):
-         ...
-         ValueError: Computation failed since Maxima requested additional
-@@ -2251,10 +2262,10 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
-         True
-         sage: sefms("x # 3") == SR(x != 3)
-         True
--        sage: solve([x != 5], x)
--        [[x - 5 != 0]]
-+        sage: solve([x != 5], x) in [[[x - 5 != 0]], [[x < 5], [5 < x]]]
-+        True
-         sage: solve([2*x==3, x != 5], x)
--        [[x == (3/2), (-7/2) != 0]]
-+        [[x == (3/2)...
- 
-     Make sure that we don't accidentally pick up variables in the maxima namespace (:trac:`8734`)::
- 
-diff --git a/src/sage/functions/exp_integral.py b/src/sage/functions/exp_integral.py
-index e6c888c64b6..f314e525145 100644
---- a/src/sage/functions/exp_integral.py
-+++ b/src/sage/functions/exp_integral.py
-@@ -601,8 +601,8 @@ class Function_log_integral_offset(BuiltinFunction):
-         1/log(x)
-         sage: f.integrate(x)
-         -x*log_integral(2) + x*log_integral(x) - Ei(2*log(x))
--        sage: Li(x).integrate(x,2.0,4.5)
--        -2.5*log_integral(2) + 5.799321147411334
-+        sage: Li(x).integrate(x,2.0,4.5).n(digits=10)
-+        3.186411697
-         sage: N(f.integrate(x,2.0,3.0))   # abs tol 1e-15
-         0.601621785860587
- 
-diff --git a/src/sage/interfaces/expect.py b/src/sage/interfaces/expect.py
-index 68ae715e4c3..84adf0341b5 100644
---- a/src/sage/interfaces/expect.py
-+++ b/src/sage/interfaces/expect.py
-@@ -620,7 +620,7 @@ def quit(self, verbose=False):
- 
-             sage: a = maxima('y')
-             sage: maxima.quit(verbose=True)
--            Exiting Maxima with PID ... running .../bin/maxima...
-+            Exiting Maxima with PID ... running ...maxima...
-             sage: a._check_valid()
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 27b1e98a6ac..4829560f98b 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -622,11 +622,6 @@ def _start(self):
-             sage: m.is_running()
-             True
- 
--        Test that we can use more than 256MB RAM (see :trac:`6772`)::
--
--            sage: a = maxima(10)^(10^5)
--            sage: b = a^600              # long time -- about 10-15 seconds
--
-         """
-         Expect._start(self)
-         self._sendline(r":lisp (defun tex-derivative (x l r) (tex (if $derivabbrev (tex-dabbrev x) (tex-d x '\\partial)) l r lop rop ))")
-@@ -634,9 +629,6 @@ def _start(self):
-         # Don't use ! for factorials (#11539)
-         self._sendline(":lisp (remprop 'mfactorial 'grind)")
- 
--        # Remove limit on the max heapsize (since otherwise it defaults
--        # to 256MB with ECL).
--        self._sendline(":lisp (ext:set-limit 'ext:heap-size 0)")
-         self._eval_line('0;')
- 
-         # set random seed
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index c263ac65f02..bba8504aa92 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -934,8 +934,15 @@ def sr_limit(self, expr, v, a, dir=None):
-             e
-             sage: limit(f,x = 5)
-             7776/3125
--            sage: limit(f,x = 1.2)
-+
-+        Domain to real, a regression in 5.46.0, see https://sf.net/p/maxima/bugs/4138 ::
-+
-+            sage: maxima_calculus.eval("domain:real")
-+            ...
-+            sage: limit(f,x = 1.2).n()
-             2.06961575467...
-+            sage: maxima_calculus.eval("domain:complex");
-+            ...
-             sage: var('a')
-             a
-             sage: limit(x^a,x=0)
-@@ -947,7 +954,7 @@ def sr_limit(self, expr, v, a, dir=None):
-             for more details)
-             Is a positive, negative or zero?
-             sage: assume(a>0)
--            sage: limit(x^a,x=0)
-+            sage: limit(x^a,x=0)  # random - not needed for maxima 5.46.0
-             Traceback (most recent call last):
-             ...
-             ValueError: Computation failed ...
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index e2e6449dfa9..15914b0be3e 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -15425,9 +15425,10 @@ cdef class Matrix(Matrix1):
- 
-         TESTS:
- 
--        Check that sparse matrices are handled correctly (:trac:`28935`)::
-+        Sparse matrices are handled correctly (:trac:`28935`), but may
-+        require a patched version of maxima (:trac:`32898`) for now::
- 
--            sage: matrix.diagonal([0], sparse=True).exp()
-+            sage: matrix.diagonal([0], sparse=True).exp()  # not tested, requires patched maxima
-             [1]
-             sage: matrix.zero(CBF, 2, sparse=True).exp()
-             [1.000000000000000                 0]
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 19ca5c85cb2..58a25e002f6 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -402,7 +402,8 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)]
-             [1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)]
- 
--        Exp works on 0x0 and 1x1 matrices::
-+        Exponentiation works on 0x0 and 1x1 matrices, but the 1x1 example
-+        requires a patched version of maxima (:trac:`32898`) for now::
- 
-             sage: m = matrix(SR,0,[]); m
-             []
-@@ -410,7 +411,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             []
-             sage: m = matrix(SR,1,[2]); m
-             [2]
--            sage: m.exp()
-+            sage: m.exp()  # not tested, requires patched maxima
-             [e^2]
- 
-         Commuting matrices `m, n` have the property that
-@@ -451,7 +452,6 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             [                       0 1/2*(e^(2*x) + 1)*e^(-x) 1/2*(e^(2*x) - 1)*e^(-x)                        0]
-             [                       0 1/2*(e^(2*x) - 1)*e^(-x) 1/2*(e^(2*x) + 1)*e^(-x)                        0]
-             [1/2*(e^(2*x) - 1)*e^(-x)                        0                        0 1/2*(e^(2*x) + 1)*e^(-x)]
--
-         """
-         if not self.is_square():
-             raise ValueError("exp only defined on square matrices")
-diff --git a/src/sage/symbolic/integration/integral.py b/src/sage/symbolic/integration/integral.py
-index c82e9ed73c3..e84ad357ee2 100644
---- a/src/sage/symbolic/integration/integral.py
-+++ b/src/sage/symbolic/integration/integral.py
-@@ -741,14 +741,14 @@ def integrate(expression, v=None, a=None, b=None, algorithm=None, hold=False):
- 
-         sage: _ = var('x,y')
-         sage: f = log(x^2+y^2)
--        sage: res = integral(f,x,0.0001414, 1.); res
-+        sage: res = integral(f,x,1414/10^7, 1); res
-         Traceback (most recent call last):
-         ...
--        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help (example of legal syntax is 'assume(50015104*y^2-50015103>0)', see `assume?` for more details)
--        Is 50015104*y^2-50015103 positive, negative or zero?
-+        ValueError: Computation failed since Maxima requested additional constraints; using the 'assume' command before evaluation *may* help ...
-+        Is ... positive, negative or zero?
-         sage: assume(y>1)
--        sage: res = integral(f,x,0.0001414, 1.); res
--        2*y*arctan(1.0/y) - 2*y*arctan(0.0001414/y) + 1.0*log(1.0*y^2 + 1.0) - 0.0001414*log(1.0*y^2 + 1.9993959999999997e-08) - 1.9997172
-+        sage: res = integral(f,x,1414/10^7, 1); res
-+        -2*y*arctan(707/5000000/y) + 2*y*arctan(1/y) + log(y^2 + 1) - 707/5000000*log(y^2 + 499849/25000000000000) - 4999293/2500000
-         sage: nres = numerical_integral(f.subs(y=2), 0.0001414, 1.); nres
-         (1.4638323264144..., 1.6251803529759...e-14)
-         sage: res.subs(y=2).n()
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index 94813315181..a72ab547c76 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -1787,8 +1787,8 @@ def solve_ineq_fourier(ineq, vars=None):
-         sage: y = var('y')
-         sage: solve_ineq_fourier([x+y<9,x-y>4],[x,y])
-         [[y + 4 < x, x < -y + 9, y < (5/2)]]
--        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])
--        [[y < min(x - 4, -x + 9)]]
-+        sage: solve_ineq_fourier([x+y<9,x-y>4],[y,x])[0][0](x=42)
-+        y < -33
- 
-         sage: solve_ineq_fourier([x^2>=0])
-         [[x < +Infinity]]
diff --git a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch b/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
deleted file mode 100644
index 9cfc69c2adb6f..0000000000000
--- a/srcpkgs/sagemath/patches/35635-sympy_1.12.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index dae380180ac..ca3c59e63d2 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -1690,8 +1690,11 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Testing SymPy::
- 
--        sage: laplace(t^n, t, s, algorithm='sympy')
--        (gamma(n + 1)/(s*s^n), 0, re(n) > -1)
-+        sage: F, a, cond = laplace(t^n, t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, re(n) > -1)
-+        sage: F.simplify()
-+        s^(-n - 1)*gamma(n + 1)
- 
-     Testing Maxima::
- 
-@@ -1700,17 +1703,19 @@ def laplace(ex, t, s, algorithm='maxima'):
- 
-     Check that :trac:`24212` is fixed::
- 
--        sage: laplace(cos(t^2), t, s, algorithm='sympy')
--        (-1/2*sqrt(pi)*(sqrt(2)*cos(1/4*s^2)*fresnel_sin(1/2*sqrt(2)*s/sqrt(pi)) -
--        sqrt(2)*fresnel_cos(1/2*sqrt(2)*s/sqrt(pi))*sin(1/4*s^2) - cos(1/4*pi + 1/4*s^2)),
--        0, True)
-+        sage: F, a, cond = laplace(cos(t^2), t, s, algorithm='sympy')
-+        sage: a, cond
-+        (0, True)
-+        sage: F._sympy_().simplify()
-+        sqrt(pi)*(sqrt(2)*sin(s**2/4)*fresnelc(sqrt(2)*s/(2*sqrt(pi))) -
-+        sqrt(2)*cos(s**2/4)*fresnels(sqrt(2)*s/(2*sqrt(pi))) + cos(s**2/4 + pi/4))/2
- 
-     Testing result from SymPy that Sage doesn't know how to handle::
- 
-         sage: laplace(cos(-1/t), t, s, algorithm='sympy')
-         Traceback (most recent call last):
-         ...
--        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), s**2/16)/4) into Sage
-+        AttributeError: Unable to convert SymPy result (=meijerg(((), ()), ((-1/2, 0, 1/2), (0,)), ...)/4) into Sage
-     """
-     if not isinstance(ex, (Expression, Function)):
-         ex = SR(ex)
-@@ -1817,8 +1822,8 @@ def inverse_laplace(ex, s, t, algorithm='maxima'):
- 
-     Transform an expression involving a time-shift, via SymPy::
- 
--        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy')
--        -(log(e^(-t)) + 1)*heaviside(t - 1)
-+        sage: inverse_laplace(1/s^2*exp(-s), s, t, algorithm='sympy').simplify()
-+        (t - 1)*heaviside(t - 1)
- 
-     The same instance with Giac::
- 
diff --git a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch b/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
deleted file mode 100644
index de10df8cb73c9..0000000000000
--- a/srcpkgs/sagemath/patches/35707-maxima_5.47.0.patch
+++ /dev/null
@@ -1,879 +0,0 @@
-diff --git a/src/doc/de/tutorial/interfaces.rst b/src/doc/de/tutorial/interfaces.rst
-index edb4f383363..d83225b5315 100644
---- a/src/doc/de/tutorial/interfaces.rst
-+++ b/src/doc/de/tutorial/interfaces.rst
-@@ -272,8 +272,8 @@ deren :math:`i,j` Eintrag gerade :math:`i/j` ist, für :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Hier ein anderes Beispiel:
- 
-@@ -332,12 +332,9 @@ Und der letzte ist die berühmte Kleinsche Flasche:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/de/tutorial/tour_algebra.rst b/src/doc/de/tutorial/tour_algebra.rst
-index baba2553a25..59eed8f1888 100644
---- a/src/doc/de/tutorial/tour_algebra.rst
-+++ b/src/doc/de/tutorial/tour_algebra.rst
-@@ -209,9 +209,12 @@ Lösung: Berechnen Sie die Laplace-Transformierte der ersten Gleichung
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Das ist schwierig zu lesen, es besagt jedoch, dass
- 
-@@ -226,8 +229,8 @@ Laplace-Transformierte der zweiten Gleichung:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- Dies besagt
- 
-diff --git a/src/doc/en/constructions/linear_algebra.rst b/src/doc/en/constructions/linear_algebra.rst
-index 8894de9a5fd..4e76c65ad0a 100644
---- a/src/doc/en/constructions/linear_algebra.rst
-+++ b/src/doc/en/constructions/linear_algebra.rst
-@@ -277,8 +277,8 @@ Another approach is to use the interface with Maxima:
- 
-     sage: A = maxima("matrix ([1, -4], [1, -1])")
-     sage: eig = A.eigenvectors()
--    sage: eig
--    [[[-sqrt(3)*%i,sqrt(3)*%i],[1,1]], [[[1,(sqrt(3)*%i+1)/4]],[[1,-(sqrt(3)*%i-1)/4]]]]
-+    sage: eig.sage()
-+    [[[-I*sqrt(3), I*sqrt(3)], [1, 1]], [[[1, 1/4*I*sqrt(3) + 1/4]], [[1, -1/4*I*sqrt(3) + 1/4]]]]
- 
- This tells us that :math:`\vec{v}_1 = [1,(\sqrt{3}i + 1)/4]` is
- an eigenvector of :math:`\lambda_1 = - \sqrt{3}i` (which occurs
-diff --git a/src/doc/en/tutorial/interfaces.rst b/src/doc/en/tutorial/interfaces.rst
-index b0e55345669..19c28f636d4 100644
---- a/src/doc/en/tutorial/interfaces.rst
-+++ b/src/doc/en/tutorial/interfaces.rst
-@@ -267,8 +267,8 @@ whose :math:`i,j` entry is :math:`i/j`, for
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Here's another example:
- 
-@@ -320,8 +320,8 @@ The next plot is the famous Klein bottle (do not type the ``....:``)::
- 
-     sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-     5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
-+    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)").sage()
-+    -5*(cos(1/2*x)*cos(y) + sin(1/2*x)*sin(2*y) + 3.0)*sin(x)
-     sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-diff --git a/src/doc/en/tutorial/tour_algebra.rst b/src/doc/en/tutorial/tour_algebra.rst
-index 2e872cc9059..225606a729f 100644
---- a/src/doc/en/tutorial/tour_algebra.rst
-+++ b/src/doc/en/tutorial/tour_algebra.rst
-@@ -216,9 +216,12 @@ the notation :math:`x=x_{1}`, :math:`y=x_{2}`):
- 
- ::
- 
--    sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- This is hard to read, but it says that
- 
-@@ -232,8 +235,8 @@ Laplace transform of the second equation:
- ::
- 
-     sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: lde2 = de2.laplace("t","s"); lde2.sage()
-+    s^2*laplace(y(t), t, s) - s*y(0) - 2*laplace(x(t), t, s) + 2*laplace(y(t), t, s) - D[0](y)(0)
- 
- This says
- 
-diff --git a/src/doc/es/tutorial/tour_algebra.rst b/src/doc/es/tutorial/tour_algebra.rst
-index dc1a7a96719..42c818fe8d7 100644
---- a/src/doc/es/tutorial/tour_algebra.rst
-+++ b/src/doc/es/tutorial/tour_algebra.rst
-@@ -197,8 +197,8 @@ la notación :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- El resultado puede ser difícil de leer, pero significa que
- 
-@@ -211,9 +211,12 @@ Toma la transformada de Laplace de la segunda ecuación:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Esto dice
- 
-diff --git a/src/doc/fr/tutorial/interfaces.rst b/src/doc/fr/tutorial/interfaces.rst
-index 1cd662f3083..2cb14e772eb 100644
---- a/src/doc/fr/tutorial/interfaces.rst
-+++ b/src/doc/fr/tutorial/interfaces.rst
-@@ -273,8 +273,8 @@ pour :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Un deuxième exemple :
- 
-@@ -334,12 +334,9 @@ Et la fameuse bouteille de Klein (n'entrez pas les ``....:``):
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/fr/tutorial/tour_algebra.rst b/src/doc/fr/tutorial/tour_algebra.rst
-index 658894b2e8b..267bd1dd4f9 100644
---- a/src/doc/fr/tutorial/tour_algebra.rst
-+++ b/src/doc/fr/tutorial/tour_algebra.rst
-@@ -182,8 +182,8 @@ Solution : Considérons la transformée de Laplace de la première équation
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- La réponse n'est pas très lisible, mais elle signifie que
- 
-@@ -196,9 +196,12 @@ la seconde équation :
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Ceci signifie
- 
-diff --git a/src/doc/it/tutorial/tour_algebra.rst b/src/doc/it/tutorial/tour_algebra.rst
-index 5a5311e9b1c..cde427d3090 100644
---- a/src/doc/it/tutorial/tour_algebra.rst
-+++ b/src/doc/it/tutorial/tour_algebra.rst
-@@ -183,8 +183,8 @@ la notazione :math:`x=x_{1}`, :math:`y=x_{2}`:
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Questo è di difficile lettura, ma dice che
- 
-@@ -197,9 +197,12 @@ trasformata di Laplace della seconda equazione:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- che significa
- 
-diff --git a/src/doc/ja/tutorial/interfaces.rst b/src/doc/ja/tutorial/interfaces.rst
-index 9c16b2eba08..892fc6f852f 100644
---- a/src/doc/ja/tutorial/interfaces.rst
-+++ b/src/doc/ja/tutorial/interfaces.rst
-@@ -239,8 +239,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- 
- 使用例をもう一つ示す:
-@@ -299,11 +299,8 @@ Sage/Maximaインターフェイスの使い方を例示するため,ここで
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",  # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]", '[plot_format, openmath]')
-diff --git a/src/doc/ja/tutorial/tour_algebra.rst b/src/doc/ja/tutorial/tour_algebra.rst
-index 784fd0d5c40..746cbb4475c 100644
---- a/src/doc/ja/tutorial/tour_algebra.rst
-+++ b/src/doc/ja/tutorial/tour_algebra.rst
-@@ -213,8 +213,8 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- この出力は読みにくいけれども,意味しているのは
- 
-@@ -226,9 +226,12 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- 意味するところは
- 
-diff --git a/src/doc/pt/tutorial/interfaces.rst b/src/doc/pt/tutorial/interfaces.rst
-index 386ef6456e5..5badb31ab35 100644
---- a/src/doc/pt/tutorial/interfaces.rst
-+++ b/src/doc/pt/tutorial/interfaces.rst
-@@ -269,8 +269,8 @@ entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Aqui vai outro exemplo:
- 
-@@ -330,13 +330,10 @@ E agora a famosa garrafa de Klein:
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)"
-     ....:        "- 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:               "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:               '[plot_format, openmath]')
-diff --git a/src/doc/pt/tutorial/tour_algebra.rst b/src/doc/pt/tutorial/tour_algebra.rst
-index baeb37b1c71..170e0d8a367 100644
---- a/src/doc/pt/tutorial/tour_algebra.rst
-+++ b/src/doc/pt/tutorial/tour_algebra.rst
-@@ -205,8 +205,8 @@ equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado é um pouco difícil de ler, mas diz que
- 
-@@ -219,9 +219,12 @@ calcule a transformada de Laplace da segunda equação:
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- O resultado significa que
- 
-diff --git a/src/doc/ru/tutorial/interfaces.rst b/src/doc/ru/tutorial/interfaces.rst
-index ea84527f478..061818ca4a5 100644
---- a/src/doc/ru/tutorial/interfaces.rst
-+++ b/src/doc/ru/tutorial/interfaces.rst
-@@ -264,8 +264,8 @@ gnuplot, имеет методы решения и манипуляции мат
-     matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
--    sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    sage: A.eigenvectors().sage()
-+    [[[0, 4], [3, 1]], [[[1, 0, 0, -4], [0, 1, 0, -2], [0, 0, 1, -4/3]], [[1, 2, 3, 4]]]]
- 
- Вот другой пример:
- 
-@@ -323,12 +323,9 @@ gnuplot, имеет методы решения и манипуляции мат
- 
- ::
- 
--    sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
--    5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
--    sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
--    -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
--    sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
--    5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
-+    sage: _ = maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0) - 10.0")
-+    sage: _ = maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
-+    sage: _ = maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
-     sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]", # not tested
-     ....:     "[y, -%pi, %pi]", "['grid, 40, 40]",
-     ....:     '[plot_format, openmath]')
-diff --git a/src/doc/ru/tutorial/tour_algebra.rst b/src/doc/ru/tutorial/tour_algebra.rst
-index 9f08c41d118..bc0d4926f83 100644
---- a/src/doc/ru/tutorial/tour_algebra.rst
-+++ b/src/doc/ru/tutorial/tour_algebra.rst
-@@ -199,8 +199,8 @@ Sage может использоваться для решения диффер
- ::
- 
-     sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
--    sage: lde1 = de1.laplace("t","s"); lde1
--    2*((-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s) -2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
-+    sage: lde1 = de1.laplace("t","s"); lde1.sage()
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Данный результат тяжело читаем, однако должен быть понят как
- 
-@@ -210,9 +210,12 @@ Sage может использоваться для решения диффер
- 
- ::
- 
--    sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
--    sage: lde2 = de2.laplace("t","s"); lde2
--    (-%at('diff(y(t),t,1),t = 0))+s^2*'laplace(y(t),t,s) +2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s) -y(0)*s
-+    sage: t,s = SR.var('t,s')
-+    sage: x = function('x')
-+    sage: y = function('y')
-+    sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)
-+    sage: f.laplace(t,s)
-+    2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) - 2*D[0](x)(0)
- 
- Результат:
- 
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index c707530b9f1..f7ce8b95727 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -783,7 +783,7 @@ def nintegral(ex, x, a, b,
-     Now numerically integrating, we see why the answer is wrong::
- 
-         sage: f.nintegrate(x,0,1)
--        (-480.0000000000001, 5.32907051820075...e-12, 21, 0)
-+        (-480.000000000000..., 5.32907051820075...e-12, 21, 0)
- 
-     It is just because every floating point evaluation of return -480.0
-     in floating point.
-@@ -1336,7 +1336,7 @@ def limit(ex, dir=None, taylor=False, algorithm='maxima', **argv):
-         sage: limit(floor(x), x=0, dir='+')
-         0
-         sage: limit(floor(x), x=0)
--        und
-+        ...nd
- 
-     Maxima gives the right answer here, too, showing
-     that :trac:`4142` is fixed::
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index e0c31925f44..6e91f7e2bb4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -295,7 +295,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False,
-     Clairaut equation: general and singular solutions::
- 
-         sage: desolve(diff(y,x)^2+x*diff(y,x)-y==0,y,contrib_ode=True,show_method=True)
--        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairault']
-+        [[y(x) == _C^2 + _C*x, y(x) == -1/4*x^2], 'clairau...']
- 
-     For equations involving more variables we specify an independent variable::
- 
-@@ -1325,7 +1325,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: x,y = var('x,y')
-         sage: desolve_rk4(x*y*(2-y),y,ics=[0,1],end_points=1,step=0.5)
--        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.461590162288825]]
-+        [[0, 1], [0.5, 1.12419127424558], [1.0, 1.46159016228882...]]
- 
-     Variant 1 for input - we can pass ODE in the form used by
-     desolve function In this example we integrate backwards, since
-@@ -1333,7 +1333,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
- 
-         sage: y = function('y')(x)
-         sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
--        [[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
-+        [[0.0, 8.904257108962112], [0.5, 1.90932794536153...], [1, 1]]
- 
-     Here we show how to plot simple pictures. For more advanced
-     applications use list_plot instead. To see the resulting picture
-diff --git a/src/sage/functions/bessel.py b/src/sage/functions/bessel.py
-index 95405c3d72f..48607c49f56 100644
---- a/src/sage/functions/bessel.py
-+++ b/src/sage/functions/bessel.py
-@@ -293,9 +293,6 @@ class Function_Bessel_J(BuiltinFunction):
-         sage: f = bessel_J(2, x)
-         sage: f.integrate(x)
-         1/24*x^3*hypergeometric((3/2,), (5/2, 3), -1/4*x^2)
--        sage: m = maxima(bessel_J(2, x))
--        sage: m.integrate(x)
--        (hypergeometric([3/2],[5/2,3],-_SAGE_VAR_x^2/4)*_SAGE_VAR_x^3)/24
- 
-     Visualization (set plot_points to a higher value to get more detail)::
- 
-@@ -1118,11 +1115,11 @@ def Bessel(*args, **kwds):
-     Conversion to other systems::
- 
-         sage: x,y = var('x,y')
--        sage: f = maxima(Bessel(typ='K')(x,y))
--        sage: f.derivative('_SAGE_VAR_x')
--        (%pi*csc(%pi*_SAGE_VAR_x) *('diff(bessel_i(-_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1) -'diff(bessel_i(_SAGE_VAR_x,_SAGE_VAR_y),_SAGE_VAR_x,1))) /2 -%pi*bessel_k(_SAGE_VAR_x,_SAGE_VAR_y)*cot(%pi*_SAGE_VAR_x)
--        sage: f.derivative('_SAGE_VAR_y')
--        -(bessel_k(_SAGE_VAR_x+1,_SAGE_VAR_y)+bessel_k(_SAGE_VAR_x-1, _SAGE_VAR_y))/2
-+        sage: f = Bessel(typ='K')(x,y)
-+        sage: expected = f.derivative(y)
-+        sage: actual = maxima(f).derivative('_SAGE_VAR_y').sage()
-+        sage: bool(actual == expected)
-+        True
- 
-     Compute the particular solution to Bessel's Differential Equation that
-     satisfies `y(1) = 1` and `y'(1) = 1`, then verify the initial conditions
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 752b8422fc6..fc2fb5875ce 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -19,8 +19,11 @@
-     sage: sum(((2*I)^x/(x^3 + 1)*(1/4)^x), x, 0, oo)
-     hypergeometric((1, 1, -1/2*I*sqrt(3) - 1/2, 1/2*I*sqrt(3) - 1/2),...
-     (2, -1/2*I*sqrt(3) + 1/2, 1/2*I*sqrt(3) + 1/2), 1/2*I)
--    sage: sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res = sum((-1)^x/((2*x + 1)*factorial(2*x + 1)), x, 0, oo)
-+    sage: res  # not tested - depends on maxima version
-     hypergeometric((1/2,), (3/2, 3/2), -1/4)
-+    sage: res in [hypergeometric((1/2,), (3/2, 3/2), -1/4), sin_integral(1)]
-+    True
- 
- Simplification (note that ``simplify_full`` does not yet call
- ``simplify_hypergeometric``)::
-diff --git a/src/sage/functions/orthogonal_polys.py b/src/sage/functions/orthogonal_polys.py
-index 7398c763971..6127f5d9490 100644
---- a/src/sage/functions/orthogonal_polys.py
-+++ b/src/sage/functions/orthogonal_polys.py
-@@ -974,7 +974,7 @@ def __init__(self):
-             sage: chebyshev_U(x, x)._sympy_()
-             chebyshevu(x, x)
-             sage: maxima(chebyshev_U(2,x, hold=True))
--            3*((-(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-+            3*(...-...(8*(1-_SAGE_VAR_x))/3)+(4*(1-_SAGE_VAR_x)^2)/3+1)
-             sage: maxima(chebyshev_U(n,x, hold=True))
-             chebyshev_u(_SAGE_VAR_n,_SAGE_VAR_x)
-         """
-diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py
-index 3e2570e889e..5a0f06a27f8 100644
---- a/src/sage/functions/other.py
-+++ b/src/sage/functions/other.py
-@@ -498,10 +498,10 @@ def __init__(self):
-             <class 'sage.rings.integer.Integer'>
-             sage: var('x')
-             x
--            sage: a = floor(5.4 + x); a
--            floor(x + 5.40000000000000)
-+            sage: a = floor(5.25 + x); a
-+            floor(x + 5.25000000000000)
-             sage: a.simplify()
--            floor(x + 0.4000000000000004) + 5
-+            floor(x + 0.25) + 5
-             sage: a(x=2)
-             7
- 
-diff --git a/src/sage/functions/special.py b/src/sage/functions/special.py
-index faa6a73cc7e..d72e780836a 100644
---- a/src/sage/functions/special.py
-+++ b/src/sage/functions/special.py
-@@ -455,9 +455,8 @@ class EllipticE(BuiltinFunction):
-         sage: z = var("z")
-         sage: elliptic_e(z, 1)
-         elliptic_e(z, 1)
--        sage: # this is still wrong: must be abs(sin(z)) + 2*round(z/pi)
--        sage: elliptic_e(z, 1).simplify()
--        2*round(z/pi) + sin(z)
-+        sage: elliptic_e(z, 1).simplify() # not tested - gives wrong answer with maxima < 5.47
-+        2*round(z/pi) - sin(pi*round(z/pi) - z)
-         sage: elliptic_e(z, 0)
-         z
-         sage: elliptic_e(0.5, 0.1)  # abs tol 2e-15
-diff --git a/src/sage/interfaces/interface.py b/src/sage/interfaces/interface.py
-index 6baa4eb597c..f8237d3ad94 100644
---- a/src/sage/interfaces/interface.py
-+++ b/src/sage/interfaces/interface.py
-@@ -1579,20 +1579,20 @@ def _mul_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)') # not a function!
-+            sage: g = maxima('cos(x)') # not a function!
-             sage: f*g
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g*f
--            -cos(x)*sin(x)
-+            cos(x)*sin(x)
-             sage: _(2)
--            -cos(2)*sin(2)
-+            cos(2)*sin(2)
-             sage: 2*f
-             2*sin(x)
-         """
-@@ -1612,20 +1612,20 @@ def _div_(self, right):
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: f/g
--            -sin(x)/cos(x)
-+            sin(x)/cos(x)
-             sage: _(2)
--            -sin(2)/cos(2)
-+            sin(2)/cos(2)
- 
-         ::
- 
-             sage: f = maxima.function('x','sin(x)')
--            sage: g = maxima('-cos(x)')
-+            sage: g = maxima('cos(x)')
-             sage: g/f
--            -cos(x)/sin(x)
-+            cos(x)/sin(x)
-             sage: _(2)
--            -cos(2)/sin(2)
-+            cos(2)/sin(2)
-             sage: 2/f
-             2/sin(x)
-         """
-diff --git a/src/sage/interfaces/maxima.py b/src/sage/interfaces/maxima.py
-index 4829560f98b..959e75459a2 100644
---- a/src/sage/interfaces/maxima.py
-+++ b/src/sage/interfaces/maxima.py
-@@ -49,9 +49,14 @@
- 
- ::
- 
-+    sage: x,y = SR.var('x,y')
-     sage: F = maxima.factor('x^5 - y^5')
--    sage: F
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: F # not tested - depends on maxima version
-+    -((y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4))
-+    sage: actual = F.sage()
-+    sage: expected = -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: bool(actual == expected)
-+    True
-     sage: type(F)
-     <class 'sage.interfaces.maxima.MaximaElement'>
- 
-@@ -71,18 +76,19 @@
- 
- ::
- 
-+    sage: F = maxima('x * y')
-     sage: repr(F)
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
-     sage: F.str()
--    '-(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)'
-+    'x*y'
- 
- The ``maxima.eval`` command evaluates an expression in
- maxima and returns the result as a *string* not a maxima object.
- 
- ::
- 
--    sage: print(maxima.eval('factor(x^5 - y^5)'))
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    sage: print(maxima.eval('factor(x^5 - 1)'))
-+    (x-1)*(x^4+x^3+x^2+x+1)
- 
- We can create the polynomial `f` as a Maxima polynomial,
- then call the factor method on it. Notice that the notation
-@@ -91,11 +97,11 @@
- 
- ::
- 
--    sage: f = maxima('x^5 - y^5')
-+    sage: f = maxima('x^5 + y^5')
-     sage: f^2
--    (x^5-y^5)^2
-+    (y^5+x^5)^2
-     sage: f.factor()
--    -(y-x)*(y^4+x*y^3+x^2*y^2+x^3*y+x^4)
-+    (y+x)*(y^4-x*y^3+x^2*y^2-x^3*y+x^4)
- 
- Control-C interruption works well with the maxima interface,
- because of the excellent implementation of maxima. For example, try
-@@ -161,20 +167,20 @@
- 
-     sage: eqn = maxima(['a+b*c=1', 'b-a*c=0', 'a+b=5'])
-     sage: s = eqn.solve('[a,b,c]'); s
--    [[a = -(sqrt(79)*%i-11)/4,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -(sqrt(79)*%i-9)/4, c = -(sqrt(79)*%i-1)/10]]
-+    [[a = -...(sqrt(79)*%i-11)/4...,b = (sqrt(79)*%i+9)/4, c = (sqrt(79)*%i+1)/10], [a = (sqrt(79)*%i+11)/4,b = -...(sqrt(79)*%i-9)/4..., c = -...(sqrt(79)*%i-1)/10...]]
- 
- Here is an example of solving an algebraic equation::
- 
-     sage: maxima('x^2+y^2=1').solve('y')
-     [y = -sqrt(1-x^2),y = sqrt(1-x^2)]
-     sage: maxima('x^2 + y^2 = (x^2 - y^2)/sqrt(x^2 + y^2)').solve('y')
--    [y = -sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt(((-y^2)-x^2)*sqrt(y^2+x^2)+x^2)]
-+    [y = -sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2), y = sqrt((...-y^2...-x^2)*sqrt(y^2+x^2)+x^2)]
- 
- 
- You can even nicely typeset the solution in latex::
- 
-     sage: latex(s)
--    \left[ \left[ a=-{{\sqrt{79}\,i-11}\over{4}} , b={{\sqrt{79}\,i+9  }\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{  \sqrt{79}\,i+11}\over{4}} , b=-{{\sqrt{79}\,i-9}\over{4}} , c=-{{  \sqrt{79}\,i-1}\over{10}} \right]  \right]
-+    \left[ \left[ a=-...{{\sqrt{79}\,i-11}\over{4}}... , b={{...\sqrt{79}\,i+9...}\over{4}} , c={{\sqrt{79}\,i+1}\over{10}} \right]  , \left[ a={{...\sqrt{79}\,i+11}\over{4}} , b=-...{{\sqrt{79}\,i-9...}\over{4}}... , c=-...{{...\sqrt{79}\,i-1}\over{10}}... \right]  \right]
- 
- To have the above appear onscreen via ``xdvi``, type
- ``view(s)``. (TODO: For OS X should create pdf output
-@@ -200,7 +206,7 @@
-     sage: f.diff('x')
-     k*x^3*%e^(k*x)*sin(w*x)+3*x^2*%e^(k*x)*sin(w*x)+w*x^3*%e^(k*x) *cos(w*x)
-     sage: f.integrate('x')
--    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+((-18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +(((-w^7)-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3 +(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
-+    (((k*w^6+3*k^3*w^4+3*k^5*w^2+k^7)*x^3 +(3*w^6+3*k^2*w^4-3*k^4*w^2-3*k^6)*x^2+(...-...18*k*w^4)-12*k^3*w^2+6*k^5)*x-6*w^4 +36*k^2*w^2-6*k^4) *%e^(k*x)*sin(w*x) +((...-w^7...-3*k^2*w^5-3*k^4*w^3-k^6*w)*x^3...+(6*k*w^5+12*k^3*w^3+6*k^5*w)*x^2...+(6*w^5-12*k^2*w^3-18*k^4*w)*x-24*k*w^3 +24*k^3*w) *%e^(k*x)*cos(w*x)) /(w^8+4*k^2*w^6+6*k^4*w^4+4*k^6*w^2+k^8)
- 
- ::
- 
-@@ -234,7 +240,7 @@
-     sage: A.eigenvalues()
-     [[0,4],[3,1]]
-     sage: A.eigenvectors()
--    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
-+    [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-...4/3...]],[[1,2,3,4]]]]
- 
- We can also compute the echelon form in Sage::
- 
-@@ -287,12 +293,12 @@
- ::
- 
-     sage: maxima("laplace(diff(x(t),t,2),t,s)")
--    (-%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
-+    ...-...%at('diff(x(t),t,1),t = 0))+s^2*'laplace(x(t),t,s)-x(0)*s
- 
- It is difficult to read some of these without the 2d
- representation::
- 
--    sage: print(maxima("laplace(diff(x(t),t,2),t,s)"))
-+    sage: print(maxima("laplace(diff(x(t),t,2),t,s)")) # not tested - depends on maxima version
-                              !
-                     d        !          2
-                  (- -- (x(t))!     ) + s  laplace(x(t), t, s) - x(0) s
-@@ -396,7 +402,7 @@
- 
-     sage: g = maxima('exp(3*%i*x)/(6*%i) + exp(%i*x)/(2*%i) + c')
-     sage: latex(g)
--    -{{i\,e^{3\,i\,x}}\over{6}}-{{i\,e^{i\,x}}\over{2}}+c
-+    -...{{i\,e^{3\,i\,x}}\over{6}}...-{{i\,e^{i\,x}}\over{2}}+c
- 
- Long Input
- ----------
-@@ -684,7 +690,7 @@ def _expect_expr(self, expr=None, timeout=None):
-             sage: maxima.assume('a>0')
-             [a > 0]
-             sage: maxima('integrate(1/(x^3*(a+b*x)^(1/3)),x)')
--            (-(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-+            ...-...(b^2*log((b*x+a)^(2/3)+a^(1/3)*(b*x+a)^(1/3)+a^(2/3)))/(9*a^(7/3))) +(2*b^2*atan((2*(b*x+a)^(1/3)+a^(1/3))/(sqrt(3)*a^(1/3))))/(3^(3/2)*a^(7/3)) +(2*b^2*log((b*x+a)^(1/3)-a^(1/3)))/(9*a^(7/3)) +(4*b^2*(b*x+a)^(5/3)-7*a*b^2*(b*x+a)^(2/3)) /(6*a^2*(b*x+a)^2-12*a^3*(b*x+a)+6*a^4)
-             sage: maxima('integrate(x^n,x)')
-             Traceback (most recent call last):
-             ...
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 4f6306ba4fc..aecfcba5e23 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -856,9 +856,9 @@ def de_solve(self, de, vars, ics=None):
-             sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'])
-             y = %k1*%e^x+%k2*%e^-x+3*x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'])
--            y = (%c-3*((-x)-1)*%e^-x)*%e^x
-+            y = (%c-3*(...-x...-1)*%e^-x)*%e^x
-             sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1])
--            y = -%e^-1*(5*%e^x-3*%e*x-3*%e)
-+            y = -...%e^-1*(5*%e^x-3*%e*x-3*%e)...
-         """
-         if not isinstance(vars, str):
-             str_vars = '%s, %s'%(vars[1], vars[0])
-@@ -1572,8 +1572,9 @@ def integral(self, var='x', min=None, max=None):
- 
-         ::
- 
--            sage: f = maxima('exp(x^2)').integral('x',0,1); f
--            -(sqrt(%pi)*%i*erf(%i))/2
-+            sage: f = maxima('exp(x^2)').integral('x',0,1)
-+            sage: f.sage()
-+            -1/2*I*sqrt(pi)*erf(I)
-             sage: f.numer()
-             1.46265174590718...
-         """
-diff --git a/src/sage/interfaces/maxima_lib.py b/src/sage/interfaces/maxima_lib.py
-index bba8504aa92..cd1be891872 100644
---- a/src/sage/interfaces/maxima_lib.py
-+++ b/src/sage/interfaces/maxima_lib.py
-@@ -134,10 +134,11 @@
- else:
-     ecl_eval("(require 'maxima)")
- ecl_eval("(in-package :maxima)")
--ecl_eval("(setq $nolabels t))")
--ecl_eval("(defvar *MAXIMA-LANG-SUBDIR* NIL)")
- ecl_eval("(set-locale-subdir)")
- 
-+# This workaround has to happen before any call to (set-pathnames).
-+# To be safe please do not call anything other than
-+# (set-locale-subdir) before this block.
- try:
-     ecl_eval("(set-pathnames)")
- except RuntimeError:
-@@ -154,6 +155,8 @@
-     # Call `(set-pathnames)` again to complete its job.
-     ecl_eval("(set-pathnames)")
- 
-+ecl_eval("(initialize-runtime-globals)")
-+ecl_eval("(setq $nolabels t))")
- ecl_eval("(defun add-lineinfo (x) x)")
- ecl_eval('(defun principal nil (cond ($noprincipal (diverg)) ((not pcprntd) (merror "Divergent Integral"))))')
- ecl_eval("(remprop 'mfactorial 'grind)")  # don't use ! for factorials (#11539)
-diff --git a/src/sage/matrix/matrix1.pyx b/src/sage/matrix/matrix1.pyx
-index f38c429d994..47df9fc80a5 100644
---- a/src/sage/matrix/matrix1.pyx
-+++ b/src/sage/matrix/matrix1.pyx
-@@ -248,7 +248,7 @@ cdef class Matrix(Matrix0):
-             sage: a = maxima(m); a
-             matrix([0,1,2],[3,4,5],[6,7,8])
-             sage: a.charpoly('x').expand()
--            (-x^3)+12*x^2+18*x
-+            ...-x^3...+12*x^2+18*x
-             sage: m.charpoly()
-             x^3 - 12*x^2 - 18*x
-         """
-diff --git a/src/sage/modules/free_module_element.pyx b/src/sage/modules/free_module_element.pyx
-index 0532ea0c9bd..6ea2bd4473d 100644
---- a/src/sage/modules/free_module_element.pyx
-+++ b/src/sage/modules/free_module_element.pyx
-@@ -4053,7 +4053,7 @@ cdef class FreeModuleElement(Vector):   # abstract base class
-             sage: t=var('t')
-             sage: r=vector([t,t^2,sin(t)])
-             sage: vec,answers=r.nintegral(t,0,1)
--            sage: vec
-+            sage: vec # abs tol 1e-15
-             (0.5, 0.3333333333333334, 0.4596976941318602)
-             sage: type(vec)
-             <class 'sage.modules.vector_real_double_dense.Vector_real_double_dense'>
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index a72ab547c76..51dcaf8d847 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -657,7 +657,7 @@ def solve(f, *args, **kwds):
-     equations, at times approximations will be given by Maxima, due to the
-     underlying algorithm::
- 
--        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0]
-+        sage: sols = solve([x^3==y,y^2==x], [x,y]); sols[-1], sols[0] # abs tol 1e-15
-         ([x == 0, y == 0],
-          [x == (0.3090169943749475 + 0.9510565162951535*I),
-           y == (-0.8090169943749475 - 0.5877852522924731*I)])
diff --git a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch b/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
deleted file mode 100644
index 4d01eeabee6c9..0000000000000
--- a/srcpkgs/sagemath/patches/35825-singular_4.3.2p2.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index ea027e8a716..a1fe036917e 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -1251,7 +1251,7 @@ def leinartas_decomposition(self):
-             sage: H = R(f.denominator())
-             sage: ff = FFPD(G, H.factor())
-             sage: decomp = ff.leinartas_decomposition()
--            sage: decomp
-+            sage: decomp  # random - non canonical depends on singular version
-             (0, []) +
-             (-(x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*y, [(y, 1)]) +
-             ((x*y^2*sin(x) + x^2*y + x*y + y*sin(x) + x)*x*y, [(x*y + 1, 1)]) +
-@@ -1611,9 +1611,7 @@ def asymptotics(self, p, alpha, N, asy_var=None, numerical=0,
-             (-16, [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 2)])
-             sage: alpha = [3, 3, 2]
-             sage: decomp = F.asymptotic_decomposition(alpha); decomp
--            (0, []) +
--            (16*r*(3/x - 2/z) + 16/x - 16/z,
--             [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-+            (0, []) + (..., [(x + 2*y + z - 4, 1), (2*x + y + z - 4, 1)])
-             sage: F1 = decomp[1]
-             sage: p = {x: 1, y: 1, z: 1}
-             sage: asy = F1.asymptotics(p, alpha, 2, verbose=True) # long time
diff --git a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch b/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
deleted file mode 100644
index 426f841ebbab6..0000000000000
--- a/srcpkgs/sagemath/patches/35826-numpy_1.25.0.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-diff --git a/src/sage/calculus/desolvers.py b/src/sage/calculus/desolvers.py
-index 55ed3a0fe10..4cfa22a97e4 100644
---- a/src/sage/calculus/desolvers.py
-+++ b/src/sage/calculus/desolvers.py
-@@ -1598,7 +1598,7 @@ def desolve_odeint(des, ics, times, dvars, ivar=None, compute_jac=False, args=()
-         sage: ic=epsilon
-         sage: t=srange(0,2/epsilon,1)
-         sage: sol=desolve_odeint(f,ic,t,y,rtol=1e-9,atol=1e-10,compute_jac=True)
--        sage: p=points(zip(t,sol))
-+        sage: p=points(zip(t,sol[:,0]))
-         sage: p.show()
- 
-     Another stiff system with some optional parameters with no
-@@ -1637,7 +1637,7 @@ def desolve_odeint_inner(ivar):
-                 J = fast_float(J, dvar, ivar)
- 
-                 def Dfun(y, t):
--                    return [J(y, t)]
-+                    return [J(y.item(), t)]
- 
-         # n-dimensional systems:
-         else:
-diff --git a/src/sage/matrix/matrix2.pyx b/src/sage/matrix/matrix2.pyx
-index d5402d5c3b0..a00912951c5 100644
---- a/src/sage/matrix/matrix2.pyx
-+++ b/src/sage/matrix/matrix2.pyx
-@@ -430,12 +430,12 @@ cdef class Matrix(Matrix1):
-             try:
-                 return self.transpose().solve_right(B, check=check)
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
-         else:
-             try:
-                 return self.transpose().solve_right(B.transpose(), check=check).transpose()
-             except ValueError as e:
--                raise ValueError(str(e).replace('row', 'column'))
-+                raise e.__class__(str(e).replace('row', 'column'))
- 
-     def solve_right(self, B, check=True):
-         r"""
-diff --git a/src/sage/matrix/matrix_numpy_dense.pyx b/src/sage/matrix/matrix_numpy_dense.pyx
-index 5b75ed133ff..17867f9a65c 100644
---- a/src/sage/matrix/matrix_numpy_dense.pyx
-+++ b/src/sage/matrix/matrix_numpy_dense.pyx
-@@ -382,8 +382,9 @@ cdef class Matrix_numpy_dense(Matrix_dense):
-             sage: m = matrix(RDF,[[1,2],[3,4]])
-             sage: n = m.numpy()
-             sage: import numpy
--            sage: numpy.linalg.eig(n)
--            (array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
-+            sage: tuple(numpy.linalg.eig(n))
-+            (array([-0.37228132,  5.37228132]),
-+             array([[-0.82456484, -0.41597356],
-                    [ 0.56576746, -0.90937671]]))
-             sage: m = matrix(RDF, 2, range(6)); m
-             [0.0 1.0 2.0]
-diff --git a/src/sage/plot/plot3d/list_plot3d.py b/src/sage/plot/plot3d/list_plot3d.py
-index d64b766001e..0158f856dbb 100644
---- a/src/sage/plot/plot3d/list_plot3d.py
-+++ b/src/sage/plot/plot3d/list_plot3d.py
-@@ -602,7 +602,7 @@ def g(x, y):
-         from .parametric_surface import ParametricSurface
- 
-         def g(x, y):
--            z = f([x, y])
-+            z = f([x, y]).item()
-             return (x, y, z)
-         G = ParametricSurface(g, (list(numpy.r_[xmin:xmax:num_points * j]),
-                                   list(numpy.r_[ymin:ymax:num_points * j])),
-diff --git a/src/sage/plot/plot3d/plot3d.py b/src/sage/plot/plot3d/plot3d.py
-index e9bbfaa8370..9ba89595d70 100644
---- a/src/sage/plot/plot3d/plot3d.py
-+++ b/src/sage/plot/plot3d/plot3d.py
-@@ -378,7 +378,7 @@ def to_cartesian(self, func, params=None):
-             ....: [ 0.16763356,  0.19993708,  0.31403568,  0.47359696, 0.55282422],
-             ....: [ 0.16763356,  0.25683223,  0.16649297,  0.10594339, 0.55282422]])
-             sage: import scipy.interpolate
--            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r)
-+            sage: f=scipy.interpolate.RectBivariateSpline(v_phi,v_theta,m_r).ev
-             sage: spherical_plot3d(f,(0,2*pi),(0,pi))
-             Graphics3d Object
- 
diff --git a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch b/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
deleted file mode 100644
index dec7851e027d1..0000000000000
--- a/srcpkgs/sagemath/patches/35831-setuptools_68.0.0.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/all__sagemath_repl.py b/src/sage/all__sagemath_repl.py
-index 6800eb9a27b..8d0b43679ca 100644
---- a/src/sage/all__sagemath_repl.py
-+++ b/src/sage/all__sagemath_repl.py
-@@ -44,7 +44,7 @@
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='pkg_resources is deprecated as an API|'
-             'Deprecated call to `pkg_resources.declare_namespace(.*)`',
--    module='pkg_resources')
-+    module='pkg_resources|setuptools.sandbox')
- warnings.filterwarnings('ignore', category=DeprecationWarning,
-     message='msvccompiler is deprecated and slated to be removed',
-     module='distutils.msvccompiler')
diff --git a/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
new file mode 100644
index 0000000000000..7c55bce6e9bb4
--- /dev/null
+++ b/srcpkgs/sagemath/patches/35934-singular_4.3.2p7.patch
@@ -0,0 +1,221 @@
+diff --git a/build/pkgs/singular/checksums.ini b/build/pkgs/singular/checksums.ini
+index 313463d2fea..1101fc55700 100644
+--- a/build/pkgs/singular/checksums.ini
++++ b/build/pkgs/singular/checksums.ini
+@@ -1,5 +1,5 @@
+ tarball=singular-VERSION.tar.gz
+-sha1=28bb3ee97ef48d04dfa96de182fd93eebe08426c
+-md5=fc0a4f5720dadba45a52ee94324ce00c
+-cksum=1573851737
+-upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-1/singular-VERSION.tar.gz
++sha1=df1997f412580f2073295aba569bb955ad227317
++md5=50349213e206a18cdaa1bc410dde7ea4
++cksum=376854707
++upstream_url=ftp://jim.mathematik.uni-kl.de/pub/Math/Singular/SOURCES/4-3-2/singular-VERSION.tar.gz
+diff --git a/build/pkgs/singular/package-version.txt b/build/pkgs/singular/package-version.txt
+index 66e2bede53a..9f1bf008217 100644
+--- a/build/pkgs/singular/package-version.txt
++++ b/build/pkgs/singular/package-version.txt
+@@ -1 +1 @@
+-4.3.1p3
++4.3.2p7
+diff --git a/build/pkgs/singular/spkg-configure.m4 b/build/pkgs/singular/spkg-configure.m4
+index 6a85631f624..f7621ec5fa1 100644
+--- a/build/pkgs/singular/spkg-configure.m4
++++ b/build/pkgs/singular/spkg-configure.m4
+@@ -6,14 +6,27 @@ SAGE_SPKG_CONFIGURE([singular], [
+     AS_IF([test -z "${SINGULAR_BIN}"], [sage_spkg_install_singular=yes], [
+       dnl Use pkg-config to ensure that Singular is new enough.
+       PKG_CHECK_MODULES([SINGULAR], [Singular >= 4.2.1], [
+-       AC_MSG_CHECKING([that Singular's help is working])
+-       AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
+-        AC_MSG_RESULT(yes)
+-       ], [
+-       AC_MSG_RESULT(no)
+-       sage_spkg_install_singular=yes
+-       ]
+-      )], [
++        AC_MSG_CHECKING([whether Singular is built with FLINT])
++        AC_COMPILE_IFELSE([
++          AC_LANG_PROGRAM([
++            #include <singular/singularconfig.h>
++            #if !defined(HAVE_FLINT)
++            #  error "Need Singular compiled with FLINT"
++          ], [])
++        ], [
++          AC_MSG_RESULT([yes])
++          AC_MSG_CHECKING([that Singular's help is working])
++          AS_IF([test x`printf "system(\"--browser\", \"builtin\"); \n help;" | Singular 2>&1 | grep "error occurred"` = x], [
++            AC_MSG_RESULT(yes)
++          ], [
++            AC_MSG_RESULT(no)
++            sage_spkg_install_singular=yes
++          ])
++        ], [
++          AC_MSG_RESULT([no])
++          sage_spkg_install_singular=yes
++        ])
++      ], [
+       dnl pkg-config version check failed
+       sage_spkg_install_singular=yes
+       ])
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index b15cc1c602c..4b5c76e2bfa 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -604,8 +604,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: i = singular.ideal(['x^2','y^2','z^2'])
+             sage: s = i.std()
+             sage: singular.eval('hilb(%s)'%(s.name()))
+-            '// 1 t^0\n// -3 t^2\n// 3 t^4\n// -1 t^6\n\n// 1 t^0\n//
+-            3 t^1\n// 3 t^2\n// 1 t^3\n// dimension (affine) = 0\n//
++            '...// dimension (affine) = 0\n//
+             degree (affine) = 8'
+ 
+         ::
+@@ -613,15 +612,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+             sage: from sage.misc.verbose import set_verbose
+             sage: set_verbose(1)
+             sage: o = singular.eval('hilb(%s)'%(s.name()))
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+ 
+         This is mainly useful if this method is called implicitly. Because
+@@ -631,15 +622,7 @@ def eval(self, x, allow_semicolon=True, strip=True, **kwds):
+         ::
+ 
+             sage: o = s.hilb()
+-            //         1 t^0
+-            //        -3 t^2
+-            //         3 t^4
+-            //        -1 t^6
+-            //         1 t^0
+-            //         3 t^1
+-            //         3 t^2
+-            //         1 t^3
+-            // dimension (affine) = 0
++            ...// dimension (affine) = 0
+             // degree (affine)  = 8
+             // ** right side is not a datum, assignment ignored
+             ...
+diff --git a/src/sage/libs/singular/function.pyx b/src/sage/libs/singular/function.pyx
+index f40346d1fd0..c597c63aafe 100644
+--- a/src/sage/libs/singular/function.pyx
++++ b/src/sage/libs/singular/function.pyx
+@@ -1241,32 +1241,22 @@ cdef class SingularFunction(SageObject):
+             sage: I = Ideal([x^3*y^2 + 3*x^2*y^2*z + y^3*z^2 + z^5])
+             sage: I = Ideal(I.groebner_basis())
+             sage: hilb = sage.libs.singular.function_factory.ff.hilb
+-            sage: hilb(I) # Singular will print // ** _ is no standard basis
+-            // ** _ is no standard basis
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: from sage.misc.sage_ostools import redirection
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I) # Singular will print // ** _ is no standard basis
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            True
+ 
+         So we tell Singular that ``I`` is indeed a Groebner basis::
+ 
+-            sage: hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
+-            //         1 t^0
+-            //        -1 t^5
+-            <BLANKLINE>
+-            //         1 t^0
+-            //         1 t^1
+-            //         1 t^2
+-            //         1 t^3
+-            //         1 t^4
+-            // dimension (proj.)  = 1
+-            // degree (proj.)   = 5
++            sage: out = tmp_filename()
++            sage: with redirection(sys.stdout,  open(out, 'w')):
++            ....:     hilb(I,attributes={I:{'isSB':1}}) # no complaint from Singular
++            sage: with open(out) as f:
++            ....:     'is no standard basis' in f.read()
++            False
+ 
+ 
+         TESTS:
+diff --git a/src/sage/rings/polynomial/multi_polynomial_ideal.py b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+index 22ada6de947..80352700872 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_ideal.py
++++ b/src/sage/rings/polynomial/multi_polynomial_ideal.py
+@@ -3132,13 +3132,16 @@ def hilbert_numerator(self, grading=None, algorithm='sage'):
+             sage: I.hilbert_numerator()                                                 # needs sage.rings.number_field
+             -t^5 + 1
+ 
+-        This example returns a wrong answer due to an integer overflow in Singular::
++        This example returns a wrong answer in singular < 4.3.2p4 due to an integer overflow::
+ 
+             sage: n=4; m=11; P = PolynomialRing(QQ, n*m, "x"); x = P.gens(); M = Matrix(n, x)
+             sage: I = P.ideal(M.minors(2))
+             sage: J = P * [m.lm() for m in I.groebner_basis()]
+-            sage: J.hilbert_numerator(algorithm='singular')
+-            ...120*t^33 - 3465*t^32 + 48180*t^31 - ...
++            sage: J.hilbert_numerator(algorithm='singular') # known bug
++            Traceback (most recent call last):
++            ....
++            RuntimeError: error in Singular function call 'hilb':
++            overflow at t^22
+ 
+         Our two algorithms should always agree; not tested until
+         :trac:`33178` is fixed::
+diff --git a/src/sage/sandpiles/sandpile.py b/src/sage/sandpiles/sandpile.py
+index 02d2021b2fb..c8e15e06f05 100644
+--- a/src/sage/sandpiles/sandpile.py
++++ b/src/sage/sandpiles/sandpile.py
+@@ -2493,9 +2493,15 @@ def _set_ideal(self):
+             sage: '_ideal' in S.__dict__
+             True
+         """
++        from sage.libs.singular.function_factory import ff
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+         R = self.ring()
+-        I = self._unsaturated_ideal._singular_()
+-        self._ideal = R.ideal(I.sat(prod(R.gens())._singular_())[1])
++        I = self._unsaturated_ideal
++        I_sat_gens = sat(I, prod(R.gens()))[0]
++        self._ideal = R.ideal(I_sat_gens)
+ 
+     def unsaturated_ideal(self):
+         r"""
+diff --git a/src/sage/schemes/projective/projective_subscheme.py b/src/sage/schemes/projective/projective_subscheme.py
+index e6caf19ba74..afd6484d779 100644
+--- a/src/sage/schemes/projective/projective_subscheme.py
++++ b/src/sage/schemes/projective/projective_subscheme.py
+@@ -1001,7 +1001,10 @@ def dual(self):
+         for i in range(n + 1):
+             J = J + S.ideal(z[-1] * f_S.derivative(z[i]) - z[i + n + 1])
+ 
+-        sat = ff.elim__lib.sat
++        try:
++            sat = ff.elim__lib.sat_with_exp
++        except NameError:
++            sat = ff.elim__lib.sat
+ 
+         max_ideal = S.ideal(z[n + 1: 2 * n + 2])
+         J_sat_gens = sat(J, max_ideal)[0]
diff --git a/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
new file mode 100644
index 0000000000000..91a77de342935
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36006-gmp_6.3.0.patch
@@ -0,0 +1,38 @@
+diff --git a/src/sage/ext/memory.pyx b/src/sage/ext/memory.pyx
+index 1de6dedab82..b95130b19dd 100644
+--- a/src/sage/ext/memory.pyx
++++ b/src/sage/ext/memory.pyx
+@@ -3,14 +3,14 @@ Low-level memory allocation functions
+ 
+ TESTS:
+ 
+-Check that a ``MemoryError`` is raised if we try to allocate a
++Check that an error is raised if we try to allocate a
+ ridiculously large integer, see :trac:`15363`::
+ 
+-    sage: 2^(2^63-3)
+-    Traceback (most recent call last):
+-    ...
+-    OverflowError: exponent must be at most 2147483647         # 32-bit
+-    RuntimeError: Aborted                                      # 64-bit
++    sage: try:
++    ....:     2^(2^63-3)
++    ....: except (OverflowError, RuntimeError, FloatingPointError):
++    ....:     print ('Overflow error')
++    ...Overflow error
+ 
+ AUTHORS:
+ 
+diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx
+index 2cd080ddafa..090ab59cb28 100644
+--- a/src/sage/rings/integer.pyx
++++ b/src/sage/rings/integer.pyx
+@@ -6654,7 +6654,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
+             sage: try:
+             ....:     print('Possible error output from gmp', flush=True)
+             ....:     1 << (2^60)
+-            ....: except (MemoryError, OverflowError, RuntimeError):
++            ....: except (MemoryError, OverflowError, RuntimeError, FloatingPointError):
+             ....:     pass
+             ....: else:
+             ....:     print("Failed to raise exception")
diff --git a/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
new file mode 100644
index 0000000000000..3d2a4bd9cd96f
--- /dev/null
+++ b/srcpkgs/sagemath/patches/36046-fix_memory_leak.patch
@@ -0,0 +1,740 @@
+diff --git a/src/sage/ext_data/valgrind/valgrind-python.supp b/src/sage/ext_data/valgrind/valgrind-python.supp
+new file mode 100644
+index 00000000000..16aa2858484
+--- /dev/null
++++ b/src/sage/ext_data/valgrind/valgrind-python.supp
+@@ -0,0 +1,480 @@
++# From the CPython repository with the suppressions for _PyObject_Free
++# and _PyObject_Realloc enabled. See the upstream suppression file for
++# details:
++#
++# https://github.com/python/cpython/blob/main/Misc/valgrind-python.supp
++
++# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
++   Memcheck:Value8
++   fun:address_in_range
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:address_in_range
++}
++
++#
++# Leaks (including possible leaks)
++#    Hmmm, I wonder if this masks some real leaks.  I think it does.
++#    Will need to fix that.
++#
++
++{
++   Suppress leaking the GIL after a fork.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_allocate_lock
++   fun:PyEval_ReInitThreads
++}
++
++{
++   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_create_key
++   fun:_PyGILState_Init
++   fun:Py_InitializeEx
++   fun:Py_Main
++}
++
++{
++   Hmmm, is this a real leak or like the GIL?
++   Memcheck:Leak
++   fun:malloc
++   fun:PyThread_ReInitTLS
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:realloc
++   fun:_PyObject_GC_Resize
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_New
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++{
++   Handle PyMalloc confusing valgrind (possibly leaked)
++   Memcheck:Leak
++   fun:malloc
++   fun:_PyObject_GC_NewVar
++   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
++}
++
++#
++# Non-python specific leaks
++#
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:calloc
++   fun:allocate_dtv
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   Handle pthread issue (possibly leaked)
++   Memcheck:Leak
++   fun:memalign
++   fun:_dl_allocate_tls_storage
++   fun:_dl_allocate_tls
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Free
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Addr4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Invalid read of size 4
++   Memcheck:Value4
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Addr8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
++   Memcheck:Value8
++   fun:_PyObject_Realloc
++}
++
++{
++   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
++   Memcheck:Cond
++   fun:_PyObject_Realloc
++}
++
++###
++### All the suppressions below are for errors that occur within libraries
++### that Python uses.  The problems to not appear to be related to Python's
++### use of the libraries.
++###
++
++{
++   Generic ubuntu ld problems
++   Memcheck:Addr8
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++   obj:/lib/ld-2.4.so
++}
++
++{
++   Generic gentoo ld problems
++   Memcheck:Cond
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++   obj:/lib/ld-2.3.4.so
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_close
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Value8
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   DBM problems, see test_dbm
++   Memcheck:Cond
++   fun:memmove
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   obj:/usr/lib/libdb1.so.2
++   fun:dbm_store
++   fun:dbm_ass_sub
++}
++
++{
++   GDBM problems, see test_gdbm
++   Memcheck:Param
++   write(buf)
++   fun:write
++   fun:gdbm_open
++
++}
++
++{
++   Uninitialised byte(s) false alarm, see bpo-35561
++   Memcheck:Param
++   epoll_ctl(event)
++   fun:epoll_ctl
++   fun:pyepoll_internal_ctl
++}
++
++{
++   ZLIB problems, see test_gzip
++   Memcheck:Cond
++   obj:/lib/libz.so.1.2.3
++   obj:/lib/libz.so.1.2.3
++   fun:deflate
++}
++
++{
++   Avoid problems w/readline doing a putenv and leaking on exit
++   Memcheck:Leak
++   fun:malloc
++   fun:xmalloc
++   fun:sh_set_lines_and_columns
++   fun:_rl_get_screen_size
++   fun:_rl_init_terminal_io
++   obj:/lib/libreadline.so.4.3
++   fun:rl_initialize
++}
++
++# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
++# false alarms on GCC builtin strcmp() function. The GCC code is correct.
++#
++# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
++{
++   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
++   Memcheck:Cond
++   fun:PyUnicode_Decode
++}
++
++
++###
++### These occur from somewhere within the SSL, when running
++###  test_socket_sll.  They are too general to leave on by default.
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:memset
++###}
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:memset
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Cond
++###   fun:MD5_Update
++###}
++###
++###{
++###   somewhere in SSL stuff
++###   Memcheck:Value4
++###   fun:MD5_Update
++###}
++
++# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
++# See http://bugs.python.org/issue14171
++{
++   openssl 1.0.1 prng 1
++   Memcheck:Cond
++   fun:bcmp
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 2
++   Memcheck:Cond
++   fun:fips_get_entropy
++   fun:FIPS_drbg_instantiate
++   fun:RAND_init_fips
++   fun:OPENSSL_init_library
++   fun:SSL_library_init
++   fun:init_hashlib
++}
++
++{
++   openssl 1.0.1 prng 3
++   Memcheck:Value8
++   fun:_x86_64_AES_encrypt_compact
++   fun:AES_encrypt
++}
++
++#
++# All of these problems come from using test_socket_ssl
++#
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_bin2bn
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:BN_num_bits_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont_word
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BN_mod_exp_mont
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Param
++   write(buf)
++   fun:write
++   obj:/usr/lib/libcrypto.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:RSA_verify
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_set_key_unchecked
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:DES_encrypt2
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   obj:/usr/lib/libssl.so.0.9.7
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:BUF_MEM_grow_clean
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:memcpy
++   fun:ssl3_read_bytes
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Cond
++   fun:SHA1_Update
++}
++
++{
++   from test_socket_ssl
++   Memcheck:Value4
++   fun:SHA1_Update
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_buffer_non_debug
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
++{
++   wcscmp_false_positive
++   Memcheck:Addr8
++   fun:wcscmp
++   fun:_PyOS_GetOpt
++   fun:Py_Main
++   fun:main
++}
++
++# Additional suppressions for the unified decimal tests:
++{
++   test_decimal
++   Memcheck:Addr4
++   fun:PyUnicodeUCS2_FSConverter
++}
++
++{
++   test_decimal2
++   Memcheck:Addr4
++   fun:PyUnicode_FSConverter
++}
++
+diff --git a/src/sage/symbolic/ginac/numeric.cpp b/src/sage/symbolic/ginac/numeric.cpp
+index b40ed64edb5..8c55861c147 100644
+--- a/src/sage/symbolic/ginac/numeric.cpp
++++ b/src/sage/symbolic/ginac/numeric.cpp
+@@ -1576,6 +1576,62 @@ const numeric numeric::div(const numeric &other) const {
+         }
+ }
+ 
++
++// Compute `a^b` as an integer, where a is an integer. Assign to ``res``` if it is integral, or return ``false``.
++// The nonnegative real root is taken for even denominators. To be used inside numeric::integer_rational_power,
++// to handle the special case of integral ``a``.
++bool integer_rational_power_of_mpz(
++        numeric& res,
++        const numeric& a,
++        const numeric& b
++) {
++        if (a.t != MPZ)
++                throw std::runtime_error("integer_rational_power_of_mpz: bad input");
++        mpz_t z;
++        mpz_init(z);
++        mpz_set_ui(z, 0);
++        int sgn = mpz_sgn(a.v._bigint);
++        if (mpz_cmp_ui(a.v._bigint, 1) == 0
++            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
++                mpz_set_ui(z, 1);
++        else if (sgn == 0) {
++                res = *_num0_p;
++                mpz_clear(z);
++                return true;
++        }
++        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1)) {
++                mpz_clear(z);
++                return false;
++        } else {
++                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
++                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat))) {
++                        // too big to take roots/powers
++                        mpz_clear(z);
++                        return false;
++                }
++                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
++                        if (mpz_perfect_square_p(a.v._bigint)) {
++                                mpz_sqrt(z, a.v._bigint);
++                        } else {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                else {
++                        bool exact = mpz_root(z, a.v._bigint,
++                                              mpz_get_ui(mpq_denref(b.v._bigrat)));
++                        if (not exact) {
++                                mpz_clear(z);
++                                return false;
++                        }
++                }
++                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
++        }
++        res = numeric(z);   // transfers ownership, no mpz_clear
++        return true;
++}
++
++
+ // Compute `a^b` as an integer, if it is integral, or return ``false``.
+ // The nonnegative real root is taken for even denominators.
+ bool numeric::integer_rational_power(numeric& res,
+@@ -1598,13 +1654,12 @@ bool numeric::integer_rational_power(numeric& res,
+                 if (a.v._long < 0
+                     and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+                         return false;
+-                long z;
+                 if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+                     or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+                 // too big to take roots/powers
+                         return false;
+                 if (b.is_equal(*_num1_2_p)) {
+-                        z = std::lround(std::sqrt(a.v._long));
++                        long z = std::lround(std::sqrt(a.v._long));
+                         if (a.v._long == z*z) {
+                                 res = numeric(z);
+                                 return true;
+@@ -1613,44 +1668,11 @@ bool numeric::integer_rational_power(numeric& res,
+                 }
+                 return integer_rational_power(res, a.to_bigint(), b);
+         }
+-        if (a.t != MPZ)
+-                throw std::runtime_error("integer_rational_power: bad input");
+-        int sgn = mpz_sgn(a.v._bigint);
+-        mpz_t z;
+-        mpz_init(z);
+-        mpz_set_ui(z, 0);
+-        if (mpz_cmp_ui(a.v._bigint, 1) == 0
+-            or mpz_cmp_ui(mpq_numref(b.v._bigrat), 0) == 0)
+-                mpz_set_ui(z, 1);
+-        else if (sgn == 0) {
+-                res = *_num0_p;
+-                return true;
+-        }
+-        else if (sgn < 0 and mpz_cmp_ui(mpq_denref(b.v._bigrat), 1))
+-                return false;
+-        else {
+-                if (not mpz_fits_ulong_p(mpq_numref(b.v._bigrat))
+-                    or not mpz_fits_ulong_p(mpq_denref(b.v._bigrat)))
+-                // too big to take roots/powers
+-                        return false;
+-                if (mpz_cmp_ui(mpq_denref(b.v._bigrat), 2) == 0) {
+-                        if (mpz_perfect_square_p(a.v._bigint))
+-                                mpz_sqrt(z, a.v._bigint);
+-                        else
+-                                return false;
+-                }
+-                else {
+-                        bool exact = mpz_root(z, a.v._bigint,
+-                                        mpz_get_ui(mpq_denref(b.v._bigrat)));
+-                        if (not exact)
+-                                return false;
+-                }
+-                mpz_pow_ui(z, z, mpz_get_ui(mpq_numref(b.v._bigrat)));
+-        }
+-        res = numeric(z);
+-        return true;
++        // otherwise: a is integer
++        return integer_rational_power_of_mpz(res, a, b);
+ }
+ 
++
+ // for a^b return c,d such that a^b = c*d^b
+ // only for MPZ/MPQ base and MPQ exponent
+ void rational_power_parts(const numeric& a_orig, const numeric& b_orig,
+diff --git a/src/sage/tests/memcheck/__init__.py b/src/sage/tests/memcheck/__init__.py
+new file mode 100644
+index 00000000000..e69de29bb2d
+diff --git a/src/sage/tests/memcheck/run_tests.py b/src/sage/tests/memcheck/run_tests.py
+new file mode 100644
+index 00000000000..6ff4503a81b
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests.py
+@@ -0,0 +1,24 @@
++import types
++
++
++def run_tests() -> None:
++    """
++    Run all memcheck tests
++    """
++    from sage.tests.memcheck import symbolic_expression
++    run_tests_in_module(symbolic_expression)
++
++
++def run_tests_in_module(mod: types.ModuleType) -> None:
++    """
++    Run all memcheck tests in the given module
++    """
++    for entry in dir(mod):
++        if not entry.startswith('test_'):
++            continue
++        test_func = getattr(mod, entry)
++        test_func()
++
++
++if __name__ == '__main__':
++    run_tests()
+diff --git a/src/sage/tests/memcheck/run_tests_in_valgrind.py b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+new file mode 100644
+index 00000000000..df5ad0e92b2
+--- /dev/null
++++ b/src/sage/tests/memcheck/run_tests_in_valgrind.py
+@@ -0,0 +1,35 @@
++"""
++Launch valgrind and run the memory leak tests
++
++
++From the commandline, run
++
++    sage -python -m sage.tests.memcheck.run_tests_in_valgrind
++
++to launch valgrind and execute the memory leak tests. Requires valgrind
++to be installed. Alternatively, run as a unit test:
++
++    sage: from sage.tests.memcheck.run_tests_in_valgrind import run_tests_in_valgrind
++    sage: run_tests_in_valgrind()    # optional - valgrind
++"""
++
++import subprocess
++
++
++def run_tests_in_valgrind() -> None:
++    """
++    Run the sage.tests.memcheck.run_tests module inside valgrind
++    """
++    subprocess.check_call([
++        'valgrind',
++        '--suppressions=src/sage/ext_data/valgrind/valgrind-python.supp',
++        '--show-possibly-lost=no',
++        '--show-reachable=no',
++        './venv/bin/python',
++        '-m',
++        'sage.tests.memcheck.run_tests'
++    ])
++
++
++if __name__ == '__main__':
++    run_tests_in_valgrind()
+diff --git a/src/sage/tests/memcheck/symbolic_expression.py b/src/sage/tests/memcheck/symbolic_expression.py
+new file mode 100644
+index 00000000000..52182fbe62d
+--- /dev/null
++++ b/src/sage/tests/memcheck/symbolic_expression.py
+@@ -0,0 +1,11 @@
++from sage.tests.memcheck.verify_no_leak import verify_no_leak
++
++
++def test_sqrt_sqrt_2() -> None:
++    from sage.misc.functional import sqrt
++    T2 = sqrt(2)
++
++    def sqrt_T2() -> None:
++        sqrt(T2)
++
++    verify_no_leak(sqrt_T2)
+diff --git a/src/sage/tests/memcheck/verify_no_leak.py b/src/sage/tests/memcheck/verify_no_leak.py
+new file mode 100644
+index 00000000000..89ca90cf89c
+--- /dev/null
++++ b/src/sage/tests/memcheck/verify_no_leak.py
+@@ -0,0 +1,27 @@
++from typing import Tuple, Sequence, List, Callable, Any
++import valgrind
++
++
++def verify_no_leak(callback: Callable[[], Any],
++                   repeat: int = 10000,
++                   fuzzy: int = 10,
++                   ) -> None:
++    """
++    Verify that the callback does not generate new definitely lost blocks
++
++    Raises an assertion if the callback leaks memory
++    """
++    callback()   # warm_up
++    initial_blocks = (0, 0, 0, 0)
++    valgrind.memcheck_do_leak_check()
++    initial_blocks = valgrind.memcheck_count_leak_blocks()
++    for _ in range(repeat):
++        callback()
++    valgrind.memcheck_do_leak_check()
++    leak_blocks = valgrind.memcheck_count_leak_blocks()
++    leak = leak_blocks[0] - initial_blocks[0]
++    if leak < repeat - fuzzy:
++        return  # callback did not leak at least once per call
++    blocks = round(leak / repeat, 2)
++    message = f'{callback} leaked {blocks} block on average ({repeat} iterations)'
++    raise AssertionError(message)
diff --git a/srcpkgs/sagemath/patches/get_patches b/srcpkgs/sagemath/patches/get_patches
index 888c66f779e09..c2c5aa1c7eccd 100755
--- a/srcpkgs/sagemath/patches/get_patches
+++ b/srcpkgs/sagemath/patches/get_patches
@@ -1,7 +1,9 @@
 #! /bin/sh
 
+version=10.1
+
 URL_BASE_PR="https://github.com/sagemath/sage/pull/"
-URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/10.0..."
+URL_BASE_COMPARE="https://github.com/sagemath/sage/compare/${version}..."
 
 case "$1" in
 	-n)  DO=echo ;;
@@ -18,18 +20,10 @@ get_pr() {
 # run from patches dir
 cd $(dirname "$0")
 
-# merged in 10.0.beta0
-get_pr 35584 "networkx 3.1"
-
-# merged in 10.0.beta1
-get_pr 35612 "linbox 1.7.0"
-get_pr 35635 "sympy 1.12"
-get_pr 35619 "maxima 5.46.0"
+# merged in 10.2.beta0
+#get_pr  36018   "singular 4.3.2p4" # included in #35934
+get_pr  36046   "fix memory leak"
 
 # positive review
-get_pr 35707 "maxima 5.47.0"
-get_pr 35831 "setuptools 68.0.0"
-
-# needs review
-get_pr 35825 "singular 4.3.2p2"
-get_pr 35826 "numpy 1.25.0"
+get_pr  35934   "singular 4.3.2p7"
+get_pr  36006   "gmp 6.3.0"
diff --git a/srcpkgs/sagemath/template b/srcpkgs/sagemath/template
index 2491d77dbc8d9..a2ee32c69a952 100644
--- a/srcpkgs/sagemath/template
+++ b/srcpkgs/sagemath/template
@@ -1,7 +1,7 @@
 # Template file for 'sagemath'
 pkgname=sagemath
-version=10.0
-revision=2
+version=10.1
+revision=1
 build_wrksrc=pkgs/sagemath-standard
 build_style=python3-module
 _bindir=/usr/lib/sagemath/$version/bin
@@ -15,7 +15,7 @@ makedepends="arb-devel boost-devel brial-devel cliquer-devel ecl eclib-devel
  mpfr-devel ntl-devel openblas-devel pari-devel planarity-devel python3-cypari2
  python3-cysignals python3-devel python3-gmpy2 python3-memory_allocator
  python3-numpy rankwidth-devel singular symmetrica-devel"
-depends="FlintQS eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
+depends="eclib-devel fflas-ffpack flintlib-devel gcc-fortran gd-devel
  gfan giac gsl-devel gzip libpng-devel linbox-devel m4ri-devel maxima-ecl
  mpfr-devel nauty ntl-devel palp pari-devel pari-elldata-small pari-galdata
  pari-galpol-small pari-seadata-small pkg-config python3-Cython python3-cypari2
@@ -30,18 +30,15 @@ checkdepends="$depends pythran python3-Sphinx"
 short_desc="Open source mathematics software"
 maintainer="Gonzalo Tornaría <tornaria@cmat.edu.uy>"
 license="GPL-2.0-or-later"
-homepage="http://sagemath.org/"
+homepage="https://www.sagemath.org/"
 changelog="https://github.com/sagemath/sage/releases"
 distfiles="https://github.com/sagemath/sage/archive/refs/tags/$version.tar.gz"
-checksum=60858efd0d1f2526486740962bf72c99f9141a56caf8395f3291fded276faf55
+checksum=a658612b1b2376ddaf207cc8ed0ef458d4c2880c16e19139bedbe8baa42ad62f
 nocross="due to ntl (flintlib), fflas-ffpack, givaro, linbox, cysignals, sympow, maxima"
 
-do_configure() {
+post_patch() {
 	# git tree needs bootstrapping
-	( cd $wrksrc/build/pkgs/sagelib &&
-	  PATH=../../bin:$PATH \
-	  BOOTSTRAP_QUIET=no \
-	  ./bootstrap )
+	$wrksrc/bootstrap sagelib
 }
 
 pre_build() {

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (13 preceding siblings ...)
  2023-08-30 20:39 ` tornaria
@ 2023-08-30 21:35 ` tornaria
  2023-08-31  0:52 ` tornaria
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-30 21:35 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1352 bytes --]

New comment by tornaria on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1699877312

Comment:
> @dkwo all dependencies you singled out are needed to use either cython or fortran in sagemath, which are not optional (at least the testsuite fails without them).
> 
> I can imagine both features to be made optional, but I'm wary, something needs to happen so these are made optional and the testsuite works fine (a "feature" is detected, etc).
> 
> What is the need / advantage of this? I guess some download or installed size, but how much? Is it really worth it?

I think this will become possible soon, but not yet. The sagemath doctests are adding "feature flags" which detect features in the environment, but this is not yet completely polished for cython / external libraries / fortran code.

At this time, I'd rather focus on getting sagemath working on cython 3 so we can update cython (see #45086 and https://github.com/ahesford/void-packages/pull/2). After 10.2 or 10.3 it may be easier to do this.

In any case, I'd like to see a detail of how much is saved (say how much download/disk it takes now an install of sagemath with all deps not standard in void vs. what would it take if we get this "savings"). If the savings is not really very significant, I'm not sure I see the point...

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (14 preceding siblings ...)
  2023-08-30 21:35 ` tornaria
@ 2023-08-31  0:52 ` tornaria
  2023-08-31  7:00 ` dkwo
  2023-08-31 11:57 ` [PR PATCH] [Merged]: " leahneukirchen
  17 siblings, 0 replies; 19+ messages in thread
From: tornaria @ 2023-08-31  0:52 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 336 bytes --]

New comment by tornaria on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1700123025

Comment:
@leahneukirchen @dkwo This is ready to merge IMO.

Note that my last push is after the last big update (boost, python, ssl, etc) so CI here is tested with the up-to-date packages in the repo.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (15 preceding siblings ...)
  2023-08-31  0:52 ` tornaria
@ 2023-08-31  7:00 ` dkwo
  2023-08-31 11:57 ` [PR PATCH] [Merged]: " leahneukirchen
  17 siblings, 0 replies; 19+ messages in thread
From: dkwo @ 2023-08-31  7:00 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 228 bytes --]

New comment by dkwo on void-packages repository

https://github.com/void-linux/void-packages/pull/45708#issuecomment-1700473392

Comment:
I agree, I can do more experiments for one of the next point releases.
Looks good to me.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PR PATCH] [Merged]: sagemath: update to 10.1.
  2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
                   ` (16 preceding siblings ...)
  2023-08-31  7:00 ` dkwo
@ 2023-08-31 11:57 ` leahneukirchen
  17 siblings, 0 replies; 19+ messages in thread
From: leahneukirchen @ 2023-08-31 11:57 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1192 bytes --]

There's a merged pull request on the void-packages repository

sagemath: update to 10.1.
https://github.com/void-linux/void-packages/pull/45708

Description:
<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly**

I will install and test a little bit. I'm pushing now to get an idea if CI works ok.

CC: @dkwo 

<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->

<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
  - aarch64-musl
  - armv7l
  - armv6l-musl
-->


^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2023-08-31 11:57 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-21 23:17 [PR PATCH] sagemath: update to 10.1 tornaria
2023-08-22 14:46 ` tornaria
2023-08-22 16:47 ` [PR PATCH] [Updated] " tornaria
2023-08-22 21:00 ` tornaria
2023-08-23 17:32 ` dkwo
2023-08-23 23:06 ` [PR PATCH] [Updated] " tornaria
2023-08-23 23:25 ` tornaria
2023-08-24 11:41 ` [PR PATCH] [Updated] " tornaria
2023-08-26 15:50 ` dkwo
2023-08-26 19:29 ` tornaria
2023-08-28  2:57 ` tornaria
2023-08-28 19:05 ` [PR PATCH] [Updated] " tornaria
2023-08-28 19:10 ` tornaria
2023-08-29 13:06 ` tornaria
2023-08-30 20:39 ` tornaria
2023-08-30 21:35 ` tornaria
2023-08-31  0:52 ` tornaria
2023-08-31  7:00 ` dkwo
2023-08-31 11:57 ` [PR PATCH] [Merged]: " leahneukirchen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).