summary refs log tree commit diff
path: root/pkgs/applications/science/math
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/applications/science/math')
-rw-r--r--pkgs/applications/science/math/almonds/default.nix8
-rw-r--r--pkgs/applications/science/math/caffe/darwin.patch47
-rw-r--r--pkgs/applications/science/math/caffe/default.nix51
-rw-r--r--pkgs/applications/science/math/cbc/default.nix2
-rw-r--r--pkgs/applications/science/math/cplex/default.nix82
-rw-r--r--pkgs/applications/science/math/gfan/default.nix11
-rw-r--r--pkgs/applications/science/math/ginac/default.nix3
-rw-r--r--pkgs/applications/science/math/glsurf/default.nix1
-rw-r--r--pkgs/applications/science/math/palp/default.nix6
-rw-r--r--pkgs/applications/science/math/qalculate-gtk/default.nix4
-rw-r--r--pkgs/applications/science/math/ratpoints/default.nix26
-rw-r--r--pkgs/applications/science/math/ripser/default.nix2
-rw-r--r--pkgs/applications/science/math/sage/default.nix50
-rw-r--r--pkgs/applications/science/math/sage/patches/arb-2.13.0.patch427
-rw-r--r--pkgs/applications/science/math/sage/patches/known-padics-bug.patch15
-rw-r--r--pkgs/applications/science/math/sage/patches/maxima-5.41.0-doctests.patch48
-rw-r--r--pkgs/applications/science/math/sage/patches/pari-no-threads.patch18
-rw-r--r--pkgs/applications/science/math/sage/patches/pynac-0.7.22.patch479
-rw-r--r--pkgs/applications/science/math/sage/patches/python3-syntax-without-write.patch40
-rw-r--r--pkgs/applications/science/math/sage/patches/sagenb-sphinx-1.7.patch31
-rw-r--r--pkgs/applications/science/math/sage/patches/singular-4.1.1p2.patch274
-rw-r--r--pkgs/applications/science/math/sage/patches/sphinx-1.7.patch62
-rw-r--r--pkgs/applications/science/math/sage/patches/spkg-scripts.patch46
-rw-r--r--pkgs/applications/science/math/sage/patches/zn_poly_version.patch13
-rw-r--r--pkgs/applications/science/math/sage/sage-src.nix140
-rw-r--r--pkgs/applications/science/math/scilab-bin/default.nix6
-rw-r--r--pkgs/applications/science/math/scilab/default.nix52
-rw-r--r--pkgs/applications/science/math/singular/default.nix13
-rw-r--r--pkgs/applications/science/math/symmetrica/default.nix34
29 files changed, 686 insertions, 1305 deletions
diff --git a/pkgs/applications/science/math/almonds/default.nix b/pkgs/applications/science/math/almonds/default.nix
index fb76699b0c83..96613f4e38a6 100644
--- a/pkgs/applications/science/math/almonds/default.nix
+++ b/pkgs/applications/science/math/almonds/default.nix
@@ -1,11 +1,9 @@
-{ stdenv, buildPythonApplication, fetchFromGitHub, ncurses, pillow, pytest }:
+{ stdenv, python3, fetchFromGitHub, ncurses }:
 
-let
+with python3.pkgs; buildPythonApplication rec {
+  pname = "almonds";
   version = "1.25b";
-in
 
-buildPythonApplication {
-  name = "almonds-${version}";
   src = fetchFromGitHub {
     owner = "Tenchi2xh";
     repo = "Almonds";
diff --git a/pkgs/applications/science/math/caffe/darwin.patch b/pkgs/applications/science/math/caffe/darwin.patch
new file mode 100644
index 000000000000..e8fa6a683f73
--- /dev/null
+++ b/pkgs/applications/science/math/caffe/darwin.patch
@@ -0,0 +1,47 @@
+diff --git a/Makefile b/Makefile
+index c823f66e..65b90c5e 100644
+--- a/Makefile
++++ b/Makefile
+@@ -32,9 +32,9 @@ SRC_DIRS := $(shell find * -type d -exec bash -c "find {} -maxdepth 1 \
+ LIBRARY_NAME := $(PROJECT)
+ LIB_BUILD_DIR := $(BUILD_DIR)/lib
+ STATIC_NAME := $(LIB_BUILD_DIR)/lib$(LIBRARY_NAME).a
+-DYNAMIC_VERSION_MAJOR 		:= 1
+-DYNAMIC_VERSION_MINOR 		:= 0
+-DYNAMIC_VERSION_REVISION 	:= 0
++DYNAMIC_VERSION_MAJOR		:= 1
++DYNAMIC_VERSION_MINOR		:= 0
++DYNAMIC_VERSION_REVISION	:= 0
+ DYNAMIC_NAME_SHORT := lib$(LIBRARY_NAME).so
+ #DYNAMIC_SONAME_SHORT := $(DYNAMIC_NAME_SHORT).$(DYNAMIC_VERSION_MAJOR)
+ DYNAMIC_VERSIONED_NAME_SHORT := $(DYNAMIC_NAME_SHORT).$(DYNAMIC_VERSION_MAJOR).$(DYNAMIC_VERSION_MINOR).$(DYNAMIC_VERSION_REVISION)
+diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake
+index c48255c8..cf4c580e 100644
+--- a/cmake/Dependencies.cmake
++++ b/cmake/Dependencies.cmake
+@@ -105,7 +105,6 @@ if(USE_OPENCV)
+ endif()
+ 
+ # ---[ BLAS
+-if(NOT APPLE)
+   set(BLAS "Atlas" CACHE STRING "Selected BLAS library")
+   set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL")
+ 
+@@ -123,17 +122,6 @@ if(NOT APPLE)
+     list(APPEND Caffe_LINKER_LIBS PUBLIC ${MKL_LIBRARIES})
+     list(APPEND Caffe_DEFINITIONS PUBLIC -DUSE_MKL)
+   endif()
+-elseif(APPLE)
+-  find_package(vecLib REQUIRED)
+-  list(APPEND Caffe_INCLUDE_DIRS PUBLIC ${vecLib_INCLUDE_DIR})
+-  list(APPEND Caffe_LINKER_LIBS PUBLIC ${vecLib_LINKER_LIBS})
+-
+-  if(VECLIB_FOUND)
+-    if(NOT vecLib_INCLUDE_DIR MATCHES "^/System/Library/Frameworks/vecLib.framework.*")
+-      list(APPEND Caffe_DEFINITIONS PUBLIC -DUSE_ACCELERATE)
+-    endif()
+-  endif()
+-endif()
+ 
+ # ---[ Python
+ if(BUILD_python)
diff --git a/pkgs/applications/science/math/caffe/default.nix b/pkgs/applications/science/math/caffe/default.nix
index d7357c5048d5..e56c63e01bf0 100644
--- a/pkgs/applications/science/math/caffe/default.nix
+++ b/pkgs/applications/science/math/caffe/default.nix
@@ -1,27 +1,39 @@
-{ stdenv, lib
+{ stdenv, lib, runCommand
 , fetchFromGitHub
+, fetchurl
 , cmake
 , boost
 , google-gflags
 , glog
 , hdf5-cpp
-, leveldb
-, lmdb
 , opencv3
 , protobuf
-, snappy
 , doxygen
 , openblas
-, cudaSupport ? true, cudatoolkit
+, Accelerate, CoreGraphics, CoreVideo
+, lmdbSupport ? true, lmdb
+, leveldbSupport ? true, leveldb, snappy
+, cudaSupport ? stdenv.isLinux, cudatoolkit
 , cudnnSupport ? false, cudnn ? null
 , ncclSupport ? false, nccl ? null
 , pythonSupport ? false, python ? null, numpy ? null
 }:
 
+assert leveldbSupport -> (leveldb != null && snappy != null);
 assert cudnnSupport -> cudaSupport;
 assert ncclSupport -> cudaSupport;
 assert pythonSupport -> (python != null && numpy != null);
 
+let
+  toggle = bool: if bool then "ON" else "OFF";
+
+  test_model_weights = fetchurl {
+    url = "http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel";
+    sha256 = "472d4a06035497b180636d8a82667129960371375bd10fcb6df5c6c7631f25e0";
+  };
+
+in
+
 stdenv.mkDerivation rec {
   name = "caffe-${version}";
   version = "1.0";
@@ -44,19 +56,27 @@ stdenv.mkDerivation rec {
            "-DCUDA_ARCH_NAME=All"
            "-DCUDA_HOST_COMPILER=${cudatoolkit.cc}/bin/cc"
          ] else [ "-DCPU_ONLY=ON" ])
-      ++ lib.optional ncclSupport "-DUSE_NCCL=ON";
+      ++ ["-DUSE_NCCL=${toggle ncclSupport}"]
+      ++ ["-DUSE_LEVELDB=${toggle leveldbSupport}"]
+      ++ ["-DUSE_LMDB=${toggle lmdbSupport}"];
 
-  buildInputs = [ boost google-gflags glog protobuf hdf5-cpp lmdb leveldb snappy opencv3 openblas ]
+  buildInputs = [ boost google-gflags glog protobuf hdf5-cpp opencv3 openblas ]
                 ++ lib.optional cudaSupport cudatoolkit
                 ++ lib.optional cudnnSupport cudnn
+                ++ lib.optional lmdbSupport lmdb
                 ++ lib.optional ncclSupport nccl
-                ++ lib.optionals pythonSupport [ python numpy ];
+                ++ lib.optionals leveldbSupport [ leveldb snappy ]
+                ++ lib.optionals pythonSupport [ python numpy ]
+                ++ lib.optionals stdenv.isDarwin [ Accelerate CoreGraphics CoreVideo ]
+                ;
 
   propagatedBuildInputs = lib.optional pythonSupport python.pkgs.protobuf;
 
   outputs = [ "bin" "out"];
   propagatedBuildOutputs = []; # otherwise propagates out -> bin cycle
 
+  patches = [ ./darwin.patch ];
+
   preConfigure = lib.optionalString (cudaSupport && lib.versionAtLeast cudatoolkit.version "9.0") ''
     # CUDA 9.0 doesn't support sm_20
     sed -i 's,20 21(20) ,,' cmake/Cuda.cmake
@@ -71,6 +91,9 @@ stdenv.mkDerivation rec {
     # Internal static library.
     rm $out/lib/libproto.a
 
+    # Install models
+    cp -a ../models $out/share/Caffe/models
+
     moveToOutput "bin" "$bin"
   '' + lib.optionalString pythonSupport ''
     mkdir -p $out/${python.sitePackages}
@@ -78,6 +101,16 @@ stdenv.mkDerivation rec {
     rm -rf $out/python
   '';
 
+  doInstallCheck = false; # build takes more than 30 min otherwise
+  installCheckPhase = ''
+    model=bvlc_reference_caffenet
+    m_path="$out/share/Caffe/models/$model"
+    $bin/bin/caffe test \
+      -model "$m_path/deploy.prototxt" \
+      -solver "$m_path/solver.prototxt" \
+      -weights "${test_model_weights}"
+  '';
+
   meta = with stdenv.lib; {
     description = "Deep learning framework";
     longDescription = ''
@@ -88,6 +121,6 @@ stdenv.mkDerivation rec {
     homepage = http://caffe.berkeleyvision.org/;
     maintainers = with maintainers; [ jb55 ];
     license = licenses.bsd2;
-    platforms = platforms.linux;
+    platforms = platforms.linux ++ platforms.darwin;
   };
 }
diff --git a/pkgs/applications/science/math/cbc/default.nix b/pkgs/applications/science/math/cbc/default.nix
index 689261abc661..93aefbca2160 100644
--- a/pkgs/applications/science/math/cbc/default.nix
+++ b/pkgs/applications/science/math/cbc/default.nix
@@ -8,7 +8,7 @@ stdenv.mkDerivation {
     sha256 = "1w8axdzm05xf5y13c31w7rc5z6ywxqxiwafnxcq3p195kgj0915a";
   };
 
-  configureFlags = "-C";
+  configureFlags = [ "-C" ];
 
   enableParallelBuilding = true;
 
diff --git a/pkgs/applications/science/math/cplex/default.nix b/pkgs/applications/science/math/cplex/default.nix
new file mode 100644
index 000000000000..fe3913648f87
--- /dev/null
+++ b/pkgs/applications/science/math/cplex/default.nix
@@ -0,0 +1,82 @@
+{ stdenv, makeWrapper, openjdk, gtk2, xorg, glibcLocales, releasePath }:
+
+# To use this package, you need to download your own cplex installer from IBM
+# and override the releasePath attribute to point to the location of the file.  
+#
+# Note: cplex creates an individual build for each license which screws
+# somewhat with the use of functions like requireFile as the hash will be
+# different for every user.
+
+stdenv.mkDerivation rec {
+  name = "cplex-${version}";
+  version = "128";
+  
+  src =
+    if builtins.isNull releasePath then
+      throw ''
+        This nix expression requires that the cplex installer is already
+        downloaded to your machine. Get it from IBM: 
+        https://developer.ibm.com/docloud/blog/2017/12/20/cplex-optimization-studio-12-8-now-available/ 
+
+        Set `cplex.releasePath = /path/to/download;` in your
+        ~/.config/nixpkgs/config.nix for `nix-*` commands, or
+        `config.cplex.releasePath = /path/to/download;` in your
+        `configuration.nix` for NixOS.
+      ''
+    else
+      releasePath;
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ openjdk gtk2 xorg.libXtst glibcLocales ];
+
+  unpackPhase = "cp $src $name";
+
+  patchPhase = ''
+    sed -i -e 's|/usr/bin/tr"|tr"         |' $name
+  '';
+
+  buildPhase = ''
+    sh $name -i silent -DLICENSE_ACCEPTED=TRUE -DUSER_INSTALL_DIR=$out
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    ln -s $out/opl/bin/x86-64_linux/oplrun\
+      $out/opl/bin/x86-64_linux/oplrunjava\
+      $out/opl/oplide/oplide\
+      $out/cplex/bin/x86-64_linux/cplex\
+      $out/cpoptimizer/bin/x86-64_linux/cpoptimizer\
+      $out/bin
+  '';
+
+  fixupPhase = 
+  let 
+    libraryPath = stdenv.lib.makeLibraryPath [ stdenv.cc.cc gtk2 xorg.libXtst ];
+  in ''
+    interpreter=${stdenv.glibc}/lib/ld-linux-x86-64.so.2
+
+    for pgm in $out/opl/bin/x86-64_linux/oplrun $out/opl/bin/x86-64_linux/oplrunjava $out/opl/oplide/oplide;
+    do
+      patchelf --set-interpreter "$interpreter" $pgm;
+      wrapProgram $pgm \
+        --prefix LD_LIBRARY_PATH : $out/opl/bin/x86-64_linux:${libraryPath} \
+        --set LOCALE_ARCHIVE ${glibcLocales}/lib/locale/locale-archive;
+    done
+
+    for pgm in $out/cplex/bin/x86-64_linux/cplex $out/cpoptimizer/bin/x86-64_linux/cpoptimizer $out/opl/oplide/jre/bin/*; 
+    do
+      if grep ELF $pgm > /dev/null;
+      then
+        patchelf --set-interpreter "$interpreter" $pgm;
+      fi
+    done
+  '';
+  
+  meta = with stdenv.lib; {
+    description = "Optimization solver for mathematical programming";
+    homepage = "https://www.ibm.com/be-en/marketplace/ibm-ilog-cplex";
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ bfortz ];
+  };
+}
diff --git a/pkgs/applications/science/math/gfan/default.nix b/pkgs/applications/science/math/gfan/default.nix
index 65d551f39a71..d2d1ddb65846 100644
--- a/pkgs/applications/science/math/gfan/default.nix
+++ b/pkgs/applications/science/math/gfan/default.nix
@@ -9,15 +9,20 @@ stdenv.mkDerivation rec {
     sha256 = "02pihqb1lb76a0xbfwjzs1cd6ay3ldfxsm8dvsbl6qs3vkjxax56";
   };
 
-  makeFlags = ''PREFIX=$(out) CC=cc CXX=c++ cddnoprefix=1'';
-  buildInputs = [gmp mpir cddlib];
+  patchPhase = stdenv.lib.optionalString stdenv.isDarwin ''
+    substituteInPlace Makefile --replace "-fno-guess-branch-probability" ""
+  '';
+
+  buildFlags = [ "CC=cc" "CXX=c++" "cddnoprefix=1" ];
+  installFlags = [ ''PREFIX=$(out)'' ];
+  buildInputs = [ gmp mpir cddlib ];
 
   meta = {
     inherit version;
     description = ''A software package for computing Gröbner fans and tropical varieties'';
     license = stdenv.lib.licenses.gpl2 ;
     maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    platforms = stdenv.lib.platforms.unix;
     homepage = http://home.math.au.dk/jensen/software/gfan/gfan.html;
   };
 }
diff --git a/pkgs/applications/science/math/ginac/default.nix b/pkgs/applications/science/math/ginac/default.nix
index 944460de9c75..18a5281bebb0 100644
--- a/pkgs/applications/science/math/ginac/default.nix
+++ b/pkgs/applications/science/math/ginac/default.nix
@@ -16,12 +16,13 @@ stdenv.mkDerivation rec {
 
   preConfigure = "patchShebangs ginsh";
 
-  configureFlags = "--disable-rpath";
+  configureFlags = [ "--disable-rpath" ];
 
   meta = with stdenv.lib; {
     description = "GiNaC is Not a CAS";
     homepage    = http://www.ginac.de/;
     maintainers = with maintainers; [ lovek323 ];
+    license = licenses.gpl2;
     platforms   = platforms.all;
   };
 }
diff --git a/pkgs/applications/science/math/glsurf/default.nix b/pkgs/applications/science/math/glsurf/default.nix
index a53829347053..4de683cdce90 100644
--- a/pkgs/applications/science/math/glsurf/default.nix
+++ b/pkgs/applications/science/math/glsurf/default.nix
@@ -26,5 +26,6 @@ stdenv.mkDerivation {
   meta = {
     homepage = http://www.lama.univ-savoie.fr/~raffalli/glsurf;
     description = "A program to draw implicit surfaces and curves";
+    license = stdenv.lib.licenses.lgpl21;
   };
 }
diff --git a/pkgs/applications/science/math/palp/default.nix b/pkgs/applications/science/math/palp/default.nix
index 4c7df4412e4f..e9fd21b46d8a 100644
--- a/pkgs/applications/science/math/palp/default.nix
+++ b/pkgs/applications/science/math/palp/default.nix
@@ -19,6 +19,10 @@ stdenv.mkDerivation rec {
     "strictoverflow" # causes runtime failure (tested in checkPhase)
   ];
 
+  patchPhase = stdenv.lib.optionalString stdenv.isDarwin ''
+    substituteInPlace GNUmakefile --replace gcc cc
+  '';
+
   preBuild = ''
       echo Building PALP optimized for ${dim} dimensions
       sed -i "s/^#define[^a-zA-Z]*POLY_Dmax.*/#define POLY_Dmax ${dim}/" Global.h
@@ -77,6 +81,6 @@ stdenv.mkDerivation rec {
     # the right license.
     license = licenses.gpl2;
     maintainers = with maintainers; [ timokau ];
-    platforms = platforms.linux;
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/applications/science/math/qalculate-gtk/default.nix b/pkgs/applications/science/math/qalculate-gtk/default.nix
index 7990088ffbe9..59dbfdb509dc 100644
--- a/pkgs/applications/science/math/qalculate-gtk/default.nix
+++ b/pkgs/applications/science/math/qalculate-gtk/default.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation rec {
   name = "qalculate-gtk-${version}";
-  version = "2.6.1";
+  version = "2.6.2";
 
   src = fetchFromGitHub {
     owner = "qalculate";
     repo = "qalculate-gtk";
     rev = "v${version}";
-    sha256 = "19jw1w29x0r1qq5r8gmqrqr00ml2pfi2w433723vjzxpfg2pp70r";
+    sha256 = "1yzw6avhka7bbi071z9d8cipcghyjq2bg9x3arv1cf395xlnrmb9";
   };
 
   patchPhase = ''
diff --git a/pkgs/applications/science/math/ratpoints/default.nix b/pkgs/applications/science/math/ratpoints/default.nix
index 82a6836bd623..2dd4778234df 100644
--- a/pkgs/applications/science/math/ratpoints/default.nix
+++ b/pkgs/applications/science/math/ratpoints/default.nix
@@ -1,20 +1,36 @@
-{stdenv, fetchurl, gmp}:
+{ stdenv, fetchurl, fetchpatch, gmp }:
 stdenv.mkDerivation rec {
   name = "ratpoints-${version}";
-  version = "2.1.3";
+  version = "2.1.3.p4";
+
   src = fetchurl {
     url = "http://www.mathe2.uni-bayreuth.de/stoll/programs/ratpoints-${version}.tar.gz";
     sha256 = "0zhad84sfds7izyksbqjmwpfw4rvyqk63yzdjd3ysd32zss5bgf4";
   };
-  buildInputs = [gmp];
-  makeFlags = "INSTALL_DIR=$(out)";
+
+  enableParallelBuilding = true;
+
+  patches = [
+    (fetchpatch {
+      url = "https://git.sagemath.org/sage.git/plain/build/pkgs/ratpoints/patches/sturm_and_rp_private.patch?id=1615f58890e8f9881c4228c78a6b39b9aab1303a";
+      sha256 = "0q3wajncyfr3gahd8gwk9x7g56zw54lpywrl63lqk7drkf60mrcl";
+    })
+  ];
+
+  buildInputs = [ gmp ];
+
+  makeFlags = [ "CC=cc" ];
+  buildFlags = stdenv.lib.optional stdenv.isDarwin ["CCFLAGS2=-lgmp -lc -lm" "CCFLAGS=-UUSE_SSE"];
+  installFlags = [ "INSTALL_DIR=$(out)" ];
+
   preInstall = ''mkdir -p "$out"/{bin,share,lib,include}'';
+
   meta = {
     inherit version;
     description = ''A program to find rational points on hyperelliptic curves'';
     license = stdenv.lib.licenses.gpl2Plus;
     maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    platforms = stdenv.lib.platforms.unix;
     homepage = http://www.mathe2.uni-bayreuth.de/stoll/programs/;
     updateWalker = true;
   };
diff --git a/pkgs/applications/science/math/ripser/default.nix b/pkgs/applications/science/math/ripser/default.nix
index 651ad8a2c0f8..21948a279d07 100644
--- a/pkgs/applications/science/math/ripser/default.nix
+++ b/pkgs/applications/science/math/ripser/default.nix
@@ -13,10 +13,10 @@ assert useGoogleHashmap -> sparsehash != null;
 
 let
   inherit (stdenv.lib) optional;
+  version = "1.0";
 in
 stdenv.mkDerivation {
   name = "ripser-${version}";
-  version = "1.0";
 
   src = fetchFromGitHub {
     owner = "Ripser";
diff --git a/pkgs/applications/science/math/sage/default.nix b/pkgs/applications/science/math/sage/default.nix
index 0bbf2cec0dcb..7e62f0cf75ee 100644
--- a/pkgs/applications/science/math/sage/default.nix
+++ b/pkgs/applications/science/math/sage/default.nix
@@ -8,10 +8,6 @@ let
   # https://trac.sagemath.org/ticket/15980 for tracking of python3 support
   python = nixpkgs.python2.override {
     packageOverrides = self: super: {
-      cypari2 = super.cypari2.override { inherit pari; };
-
-      cysignals = super.cysignals.override { inherit pari; };
-
       # python packages that appear unmaintained and were not accepted into the nixpkgs
       # tree because of that. These packages are only dependencies of the more-or-less
       # deprecated sagenb. However sagenb is still a default dependency and the doctests
@@ -24,7 +20,7 @@ let
       pybrial = self.callPackage ./pybrial.nix {};
 
       sagelib = self.callPackage ./sagelib.nix {
-        inherit flint ecl pari eclib ntl arb;
+        inherit flint ecl arb;
         inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular;
         linbox = nixpkgs.linbox.override { withSage = true; };
       };
@@ -38,20 +34,20 @@ let
       };
 
       env-locations = self.callPackage ./env-locations.nix {
-        inherit pari_data ecl pari;
+        inherit pari_data ecl;
         inherit singular;
         three = nodePackages_8_x.three;
         mathjax = nodePackages_8_x.mathjax;
       };
 
       sage-env = self.callPackage ./sage-env.nix {
-        inherit sage-src python rWrapper openblas-cblas-pc ecl singular eclib pari palp flint pynac pythonEnv giac ntl;
+        inherit sage-src python rWrapper openblas-cblas-pc ecl singular palp flint pynac pythonEnv;
         pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
       };
 
       sage-with-env = self.callPackage ./sage-with-env.nix {
-        inherit pari eclib pythonEnv ntl;
-        inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular giac;
+        inherit pythonEnv;
+        inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular;
         pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
         three = nodePackages_8_x.three;
       };
@@ -106,41 +102,18 @@ let
     });
   };
 
-  # https://trac.sagemath.org/ticket/25532
-  ntl = nixpkgs.ntl.overrideAttrs (oldAttrs: rec {
-    name = "ntl-10.5.0";
-    sourceRoot = "${name}/src";
-    src = fetchurl {
-      url = "http://www.shoup.net/ntl/${name}.tar.gz";
-      sha256 = "1lmldaldgfr2b2a6585m3np5ds8bq1bis2s1ajycjm49vp4kc2xr";
-    };
-  });
-
-  giac = nixpkgs.giac.override { inherit ntl; };
   arb = nixpkgs.arb.override { inherit flint; };
 
-  # update causes issues
-  # https://groups.google.com/forum/#!topic/sage-packaging/cS3v05Q0zso
-  # https://trac.sagemath.org/ticket/24735
-  singular = (nixpkgs.singular.override { inherit ntl flint; }).overrideAttrs (oldAttrs: {
-    name = "singular-4.1.0p3";
-    src = fetchurl {
-      url = "http://www.mathematik.uni-kl.de/ftp/pub/Math/Singular/SOURCES/4-1-0/singular-4.1.0p3.tar.gz";
-      sha256 = "105zs3zk46b1cps403ap9423rl48824ap5gyrdgmg8fma34680a4";
-    };
-  });
+  singular = nixpkgs.singular.override { inherit flint; };
 
   # *not* to confuse with the python package "pynac"
-  # https://trac.sagemath.org/ticket/24838 (depends on arb update)
   pynac = nixpkgs.pynac.override { inherit singular flint; };
 
-  eclib = nixpkgs.eclib.override { inherit pari ntl; };
-
   # With openblas (64 bit), the tests fail the same way as when sage is build with
   # openblas instead of openblasCompat. Apparently other packages somehow use flints
   # blas when it is available. Alternative would be to override flint to use
   # openblasCompat.
-  flint = nixpkgs.flint.override { withBlas = false; inherit ntl; };
+  flint = nixpkgs.flint.override { withBlas = false; };
 
   # Multiple palp dimensions need to be available and sage expects them all to be
   # in the same folder.
@@ -165,15 +138,6 @@ let
 
   # https://trac.sagemath.org/ticket/22191
   ecl = nixpkgs.ecl_16_1_2;
-
-  # sage currently uses an unreleased version of pari
-  pari = (nixpkgs.pari.override { withThread = false; }).overrideAttrs (attrs: rec {
-    version = "2.10-1280-g88fb5b3"; # on update remove pari-stackwarn patch from `sage-src.nix`
-    src = fetchurl {
-      url = "mirror://sageupstream/pari/pari-${version}.tar.gz";
-      sha256 = "19gbsm8jqq3hraanbmsvzkbh88iwlqbckzbnga3y76r7k42akn7m";
-    };
-  });
 in
   python.pkgs.sage-wrapper // {
     doc = python.pkgs.sagedoc;
diff --git a/pkgs/applications/science/math/sage/patches/arb-2.13.0.patch b/pkgs/applications/science/math/sage/patches/arb-2.13.0.patch
deleted file mode 100644
index a20f1670a256..000000000000
--- a/pkgs/applications/science/math/sage/patches/arb-2.13.0.patch
+++ /dev/null
@@ -1,427 +0,0 @@
-commit c885927e25b29bd23869e02379c2918da430323e
-Author: Timo Kaufmann <timokau@zoho.com>
-Date:   Sat Jun 30 02:26:15 2018 +0200
-
-diff --git a/build/pkgs/arb/checksums.ini b/build/pkgs/arb/checksums.ini
-index 1924ee03c3..9323b97391 100644
---- a/build/pkgs/arb/checksums.ini
-+++ b/build/pkgs/arb/checksums.ini
-@@ -1,4 +1,4 @@
- tarball=arb-VERSION.tar.gz
--sha1=27476d0529e48a07d92da90bd0fb80dd18f443e3
--md5=733285d9705d10b8024e551ffa81952f
--cksum=2391183744
-+sha1=44eda7bf8eaa666c45b1fc2c1b5bd08756d94b58
-+md5=fa24de9fffe4394fb6a7a6792e2ecc5f
-+cksum=3689220688
-diff --git a/build/pkgs/arb/package-version.txt b/build/pkgs/arb/package-version.txt
-index c8810e9bdb..fb2c0766b7 100644
---- a/build/pkgs/arb/package-version.txt
-+++ b/build/pkgs/arb/package-version.txt
-@@ -1 +1 @@
--2.12.0.p0
-+2.13.0
-diff --git a/build/pkgs/arb/patches/arb-pie-hardening-conflict.patch b/build/pkgs/arb/patches/arb-pie-hardening-conflict.patch
-deleted file mode 100644
-index 3e5c0e708b..0000000000
---- a/build/pkgs/arb/patches/arb-pie-hardening-conflict.patch
-+++ /dev/null
-@@ -1,17 +0,0 @@
--In newer binutils, ld options -r and -pie conflict.
--Patch due to Jörg-Volker Peetz
--(source : https://groups.google.com/d/msg/sage-devel/TduebNoZuBE/sEULolL0BQAJ),
--packaged by Emmanuel Charpentier
--
--diff -ru arb-2.8.1-orig/Makefile.subdirs arb-2.8.1-new/Makefile.subdirs
----- arb-2.8.1-orig/Makefile.subdirs	2015-12-31 17:30:01.000000000 +0100
--+++ arb-2.8.1-new/Makefile.subdirs	2016-11-07 18:50:34.540051779 +0100
--@@ -52,7 +52,7 @@
-- 	$(QUIET_CC) $(CC) $(CFLAGS) $(INCS) -c $< -o $@ -MMD -MP -MF "$(BUILD_DIR)/$(MOD_DIR)_$*.d" -MT "$(BUILD_DIR)/$(MOD_DIR)_$*.d" -MT "$@"
-- 
-- $(MOD_LOBJ): $(LOBJS)
---	$(QUIET_CC) $(CC) $(ABI_FLAG) -Wl,-r $^ -o $@ -nostdlib
--+	$(QUIET_CC) $(CC) $(ABI_FLAG) -r $^ -o $@ -nostdlib
-- 
-- -include $(LOBJS:.lo=.d)
-- 
-diff --git a/src/sage/rings/complex_arb.pyx b/src/sage/rings/complex_arb.pyx
-index 70d51e655a..00e7caea2c 100644
---- a/src/sage/rings/complex_arb.pyx
-+++ b/src/sage/rings/complex_arb.pyx
-@@ -857,14 +857,14 @@ class ComplexBallField(UniqueRepresentation, Field):
-             [0.500000000000000 +/- 2.09e-16]
- 
-             sage: CBF.integral(lambda x, _: x.gamma(), 1 - CBF(i), 1 + CBF(i))
--            [+/- 3.95e-15] + [1.5723926694981 +/- 4.53e-14]*I
-+            [+/- 4...e-15] + [1.5723926694981 +/- 4...e-14]*I
- 
-             sage: C = ComplexBallField(100)
-             sage: C.integral(lambda x, _: x.cos() * x.sin(), 0, 1)
-             [0.35403670913678559674939205737 +/- 8.89e-30]
- 
-             sage: CBF.integral(lambda x, _: (x + x.exp()).sin(), 0, 8)
--            [0.34740017266 +/- 6.36e-12]
-+            [0.34740017266 +/- 6...e-12]
- 
-             sage: C = ComplexBallField(2000)
-             sage: C.integral(lambda x, _: (x + x.exp()).sin(), 0, 8) # long time
-@@ -879,14 +879,14 @@ class ComplexBallField(UniqueRepresentation, Field):
-             ....:     else:
-             ....:         return z.sqrt()
-             sage: CBF.integral(my_sqrt, -1 + CBF(i), -1 - CBF(i))
--            [+/- 1.14e-14] + [-0.4752076627926 +/- 5.18e-14]*I
-+            [+/- 1.14e-14] + [-0.4752076627926 +/- 5...e-14]*I
- 
-         Note, though, that proper handling of the ``analytic`` flag is required
-         even when the path does not touch the branch cut::
- 
-             sage: correct = CBF.integral(my_sqrt, 1, 2); correct
-             [1.21895141649746 +/- 3.73e-15]
--            sage: RBF(integral(sqrt(x), x, 1, 2))
-+            sage: RBF(integral(sqrt(x), x, 1, 2))  # long time
-             [1.21895141649746 +/- 1.79e-15]
-             sage: wrong = CBF.integral(lambda z, _: z.sqrt(), 1, 2) # WRONG!
-             sage: correct - wrong
-@@ -915,9 +915,9 @@ class ComplexBallField(UniqueRepresentation, Field):
-         the integrand is unbounded::
- 
-             sage: CBF.integral(lambda x, _: 1/x, -1, 1)
--            [+/- inf] + [+/- inf]*I
-+            nan + nan*I
-             sage: CBF.integral(lambda x, _: 1/x, 10^-1000, 1)
--            [+/- inf] + [+/- inf]*I
-+            nan + nan*I
-             sage: CBF.integral(lambda x, _: 1/x, 10^-1000, 1, abs_tol=1e-10)
-             [2302.5850930 +/- 1.26e-8]
- 
-@@ -928,14 +928,15 @@ class ComplexBallField(UniqueRepresentation, Field):
-             sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, abs_tol=1e-450)
-             [2.304377150950e-439 +/- 9.74e-452]
-             sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, abs_tol=0)
--            [2.304377150949e-439 +/- 7.53e-452]
--            sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, rel_tol=1e-4, abs_tol=0)
--            [2.30438e-439 +/- 3.90e-445]
-+            [2.304377150950e-439 +/- 7...e-452]
-+            sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, rel_tol=1e-2, abs_tol=0)
-+            [2.30438e-439 +/- 5.94e-445]
- 
--            sage: CBF.integral(lambda x, _: x*(1/x).sin(), 0, 1)
--            [+/- 0.644]
--            sage: CBF.integral(lambda x, _: x*(1/x).sin(), 0, 1, use_heap=True)
--            [0.3785300 +/- 4.32e-8]
-+            sage: epsi = CBF(1e-10)
-+            sage: CBF.integral(lambda x, _: x*(1/x).sin(), epsi, 1)
-+            [0.38 +/- 8.54e-3]
-+            sage: CBF.integral(lambda x, _: x*(1/x).sin(), epsi, 1, use_heap=True)
-+            [0.37853002 +/- 8.73e-9]
- 
-         ALGORITHM:
- 
-@@ -951,12 +952,12 @@ class ComplexBallField(UniqueRepresentation, Field):
- 
-             sage: i = QuadraticField(-1).gen()
-             sage: CBF.integral(lambda x, _: (1 + i*x).gamma(), -1, 1)
--            [1.5723926694981 +/- 4.53e-14] + [+/- 3.95e-15]*I
-+            [1.5723926694981 +/- 4...e-14] + [+/- 4...e-15]*I
- 
--            sage: ComplexBallField(10000).integral(lambda x, _: x.sin(), 0, 1, rel_tol=1e-400)
--            [0.459... +/- ...e-4...]
-+            sage: ComplexBallField(10000).integral(lambda x, _: x.sin(), 0, 1, rel_tol=1e-300)
-+            [0.459... +/- ...e-3...]
-             sage: CBF.integral(lambda x, _: x.sin(), 0, 100, rel_tol=10)
--            [+/- 7.61]
-+            [0.138 +/- 5.53e-4]
- 
-             sage: ComplexBallField(10000).integral(lambda x, _: x.sin(), 0, 1, abs_tol=1e-400)
-             [0.459697... +/- ...e-4...]
-@@ -2389,9 +2390,9 @@ cdef class ComplexBall(RingElement):
-             sage: ~CBF(i/3)
-             [-3.00000000000000 +/- 9.44e-16]*I
-             sage: ~CBF(0)
--            [+/- inf]
-+            nan
-             sage: ~CBF(RIF(10,11))
--            [0.1 +/- 9.53e-3]
-+            [0.1 +/- 9.10e-3]
-         """
-         cdef ComplexBall res = self._new()
-         if _do_sig(prec(self)): sig_on()
-@@ -2512,9 +2513,9 @@ cdef class ComplexBall(RingElement):
-             sage: CBF(-2, 1)/CBF(1, 1/3)
-             [-1.500000000000000 +/- 8.83e-16] + [1.500000000000000 +/- 5.64e-16]*I
-             sage: CBF(2+I)/CBF(0)
--            [+/- inf] + [+/- inf]*I
-+            nan + nan*I
-             sage: CBF(1)/CBF(0)
--            [+/- inf]
-+            nan
-             sage: CBF(1)/CBF(RBF(0, 1.))
-             nan
-         """
-@@ -2543,9 +2544,9 @@ cdef class ComplexBall(RingElement):
-             sage: CBF(0)^(1/3)
-             0
-             sage: CBF(0)^(-1)
--            [+/- inf]
-+            nan
-             sage: CBF(0)^(-2)
--            [+/- inf] + [+/- inf]*I
-+            nan + nan*I
- 
-         TESTS::
- 
-@@ -2656,12 +2657,12 @@ cdef class ComplexBall(RingElement):
-             sage: CBF(1).rising_factorial(5)
-             120.0000000000000
-             sage: CBF(1/3, 1/2).rising_factorial(300)
--            [-3.87949484514e+612 +/- 5.23e+600] + [-3.52042209763e+612 +/- 5.55e+600]*I
-+            [-3.87949484514e+612 +/- 5...e+600] + [-3.52042209763e+612 +/- 5...e+600]*I
- 
-             sage: CBF(1).rising_factorial(-1)
-             nan
-             sage: CBF(1).rising_factorial(2**64)
--            [+/- 2.30e+347382171305201370464]
-+            [+/- 2.30e+347382171326740403407]
-             sage: ComplexBallField(128)(1).rising_factorial(2**64)
-             [2.343691126796861348e+347382171305201285713 +/- 4.71e+347382171305201285694]
-             sage: CBF(1/2).rising_factorial(CBF(2,3))
-@@ -2700,7 +2701,7 @@ cdef class ComplexBall(RingElement):
-             [1.000000000000000 +/- 2.83e-16] + [-0.441271200305303 +/- 2.82e-16]*I
- 
-             sage: CBF('inf').log()
--            nan + nan*I
-+            [+/- inf]
-             sage: CBF(2).log(0)
-             nan + nan*I
-         """
-@@ -2808,7 +2809,7 @@ cdef class ComplexBall(RingElement):
-             sage: CBF(pi/2, 1/10).tan()
-             [+/- 2.87e-14] + [10.0333111322540 +/- 2.36e-14]*I
-             sage: CBF(pi/2).tan()
--            [+/- inf]
-+            nan
-         """
-         cdef ComplexBall res = self._new()
-         if _do_sig(prec(self)): sig_on()
-@@ -2825,7 +2826,7 @@ cdef class ComplexBall(RingElement):
-             sage: CBF(pi, 1/10).cot()
-             [+/- 5.74e-14] + [-10.0333111322540 +/- 2.81e-14]*I
-             sage: CBF(pi).cot()
--            [+/- inf]
-+            nan
-         """
-         cdef ComplexBall res = self._new()
-         if _do_sig(prec(self)): sig_on()
-@@ -3211,9 +3212,9 @@ cdef class ComplexBall(RingElement):
-             1.000000000000000*I
- 
-             sage: CBF(2+3*I).hypergeometric([1/4,1/3],[1/2])
--            [0.7871684267473 +/- 7.34e-14] + [0.2749254173721 +/- 9.23e-14]*I
-+            [0.7871684267473 +/- 7...e-14] + [0.2749254173721 +/- 9...e-14]*I
-             sage: CBF(2+3*I).hypergeometric([1/4,1/3],[1/2],regularized=True)
--            [0.4441122268685 +/- 3.96e-14] + [0.1551100567338 +/- 5.75e-14]*I
-+            [0.4441122268685 +/- 3...e-14] + [0.1551100567338 +/- 5...e-14]*I
- 
-             sage: CBF(5).hypergeometric([2,3], [-5])
-             nan + nan*I
-@@ -4041,9 +4042,9 @@ cdef class ComplexBall(RingElement):
- 
-             sage: phi = CBF(1,1)
-             sage: (CBF.pi()/2).elliptic_e_inc(phi)
--            [1.283840957898 +/- 3.23e-13] + [-0.5317843366915 +/- 7.79e-14]*I
-+            [1.283840957898 +/- 3...e-13] + [-0.5317843366915 +/- 7...e-14]*I
-             sage: phi.elliptic_e()
--            [1.2838409578982 +/- 5.90e-14] + [-0.5317843366915 +/- 3.35e-14]*I
-+            [1.2838409578982 +/- 5...e-14] + [-0.5317843366915 +/- 3...e-14]*I
- 
-             sage: phi = CBF(2, 3/7)
-             sage: (CBF.pi()/2).elliptic_e_inc(phi)
-@@ -4312,8 +4313,7 @@ cdef class ComplexBall(RingElement):
-             sage: CBF(10).laguerre_L(3, 2)
-             [-6.666666666667 +/- 4.15e-13]
-             sage: CBF(5,7).laguerre_L(CBF(2,3), CBF(1,-2))
--            [5515.315030271 +/- 4.37e-10] + [-12386.942845271 +/- 5.47e-10]*I
--
-+            [5515.315030271 +/- 4...e-10] + [-12386.942845271 +/- 5...e-10]*I
-         """
-         cdef ComplexBall my_n = self._parent.coerce(n)
-         cdef ComplexBall my_m = self._parent.coerce(m)
-@@ -4357,9 +4357,9 @@ cdef class ComplexBall(RingElement):
-         EXAMPLES::
- 
-             sage: CBF(1/2).legendre_P(5)
--            [0.08984375000000000 +/- 4.5...e-18]
-+            [0.0898437500000000 +/- 7...e-17]
-             sage: CBF(1,2).legendre_P(CBF(2,3), CBF(0,1))
--            [0.10996180744364 +/- 7.45e-15] + [0.14312767804055 +/- 8.38e-15]*I
-+            [0.10996180744364 +/- 7.12e-15] + [0.14312767804055 +/- 8.07e-15]*I
-             sage: CBF(-10).legendre_P(5, 325/100)
-             [-22104403.487377 +/- 6.81e-7] + [53364750.687392 +/- 7.25e-7]*I
-             sage: CBF(-10).legendre_P(5, 325/100, type=3)
-@@ -4393,9 +4393,9 @@ cdef class ComplexBall(RingElement):
-             sage: CBF(1/2).legendre_Q(5)
-             [0.55508089057168 +/- 2.79e-15]
-             sage: CBF(1,2).legendre_Q(CBF(2,3), CBF(0,1))
--            [0.167678710 +/- 4.60e-10] + [-0.161558598 +/- 7.47e-10]*I
-+            [0.167678710 +/- 3.91e-10] + [-0.161558598 +/- 6.77e-10]*I
-             sage: CBF(-10).legendre_Q(5, 325/100)
--            [-83825154.36008 +/- 4.94e-6] + [-34721515.80396 +/- 5.40e-6]*I
-+            [-83825154.36008 +/- 5.02e-6] + [-34721515.80396 +/- 5.42e-6]*I
-             sage: CBF(-10).legendre_Q(5, 325/100, type=3)
-             [-4.797306921692e-6 +/- 6.82e-19] + [-4.797306921692e-6 +/- 6.57e-19]*I
- 
-diff --git a/src/sage/rings/polynomial/polynomial_complex_arb.pyx b/src/sage/rings/polynomial/polynomial_complex_arb.pyx
-index c436d4705b..ef611a566b 100644
---- a/src/sage/rings/polynomial/polynomial_complex_arb.pyx
-+++ b/src/sage/rings/polynomial/polynomial_complex_arb.pyx
-@@ -543,7 +543,7 @@ cdef class Polynomial_complex_arb(Polynomial):
-             sage: (1 - x/3).inverse_series_trunc(3)
-             ([0.1111111111111111 +/- 5.99e-17])*x^2 + ([0.3333333333333333 +/- 7.04e-17])*x + 1.000000000000000
-             sage: x.inverse_series_trunc(1)
--            [+/- inf]
-+            nan
-             sage: Pol(0).inverse_series_trunc(2)
-             (nan + nan*I)*x + nan + nan*I
- 
-@@ -671,7 +671,7 @@ cdef class Polynomial_complex_arb(Polynomial):
-             sage: pol._sqrt_series(2)
-             ([+/- 7.51e-3] + [+/- 0.501]*I)*x + [+/- 5.01e-3] + [+/- 1.01]*I
-             sage: x._sqrt_series(2)
--            ([+/- inf] + [+/- inf]*I)*x
-+            (nan + nan*I)*x
-         """
-         cdef Polynomial_complex_arb res = self._new()
-         if n < 0:
-diff --git a/src/sage/rings/real_arb.pyx b/src/sage/rings/real_arb.pyx
-index c9f68e38d7..76e3037a9a 100644
---- a/src/sage/rings/real_arb.pyx
-+++ b/src/sage/rings/real_arb.pyx
-@@ -161,7 +161,7 @@ values and should be preferred::
- 
-     sage: RBF(NaN) < RBF(infinity)
-     False
--    sage: 1/RBF(0) <= RBF(infinity)
-+    sage: RBF(0).add_error(infinity) <= RBF(infinity)
-     True
- 
- TESTS::
-@@ -252,6 +252,8 @@ cdef void mpfi_to_arb(arb_t target, const mpfi_t source, const long precision):
-         (+infinity, +infinity)
-         sage: RBF(RIF(-infinity)).endpoints()
-         (-infinity, -infinity)
-+        sage: RBF(RIF(-infinity, infinity)).endpoints()
-+        (-infinity, +infinity)
-         sage: RIF(RBF(infinity)).endpoints()
-         (+infinity, +infinity)
-         sage: RIF(RBF(-infinity)).endpoints()
-@@ -266,10 +268,11 @@ cdef void mpfi_to_arb(arb_t target, const mpfi_t source, const long precision):
-     if _do_sig(precision): sig_on()
-     mpfi_get_left(left, source)
-     mpfi_get_right(right, source)
--    arb_set_interval_mpfr(target, left, right, precision)
--    # Work around weakness of arb_set_interval_mpfr(tgt, inf, inf)
--    if mpfr_equal_p(left, right):
--        mag_zero(arb_radref(target))
-+    if mpfr_inf_p(left) and mpfr_inf_p(right) and mpfr_sgn(left) < 0 < mpfr_sgn(right):
-+        # Work around a weakness of arb_set_interval_mpfr(tgt, -inf, inf)
-+        arb_zero_pm_inf(target)
-+    else:
-+        arb_set_interval_mpfr(target, left, right, precision)
-     if _do_sig(precision): sig_off()
- 
-     mpfr_clear(left)
-@@ -649,17 +652,15 @@ class RealBallField(UniqueRepresentation, Field):
-         EXAMPLES::
- 
-             sage: RBF.some_elements()
--            [1.000000000000000,
--            [0.3333333333333333 +/- 7.04e-17],
-+            [0, 1.000000000000000, [0.3333333333333333 +/- 7.04e-17],
-             [-4.733045976388941e+363922934236666733021124 +/- 3.46e+363922934236666733021108],
--            [+/- inf],
--            [+/- inf],
--            nan]
-+            [+/- inf], [+/- inf], [+/- inf], nan]
-         """
-         import sage.symbolic.constants
--        return [self(1), self(1)/3,
-+        inf = self(sage.rings.infinity.Infinity)
-+        return [self(0), self(1), self(1)/3,
-                 -self(2)**(Integer(2)**80),
--                self(sage.rings.infinity.Infinity), ~self(0),
-+                inf, -inf, self.zero().add_error(inf),
-                 self.element_class(self, sage.symbolic.constants.NotANumber())]
- 
-     def _sum_of_products(self, terms):
-@@ -881,7 +882,7 @@ class RealBallField(UniqueRepresentation, Field):
-             sage: RBF.gamma(5)
-             24.00000000000000
-             sage: RBF.gamma(10**20)
--            [+/- 5.92e+1956570551809674821757]
-+            [+/- 5.50e+1956570552410610660600]
-             sage: RBF.gamma(1/3)
-             [2.678938534707747 +/- 8.99e-16]
-             sage: RBF.gamma(-5)
-@@ -2247,7 +2248,7 @@ cdef class RealBall(RingElement):
-             sage: inf = RBF(+infinity)
-             sage: other_inf = RBF(+infinity, 42.r)
-             sage: neg_inf = RBF(-infinity)
--            sage: extended_line = 1/RBF(0)
-+            sage: extended_line = RBF(0).add_error(infinity)
-             sage: exact_nan = inf - inf
-             sage: exact_nan.mid(), exact_nan.rad()
-             (NaN, 0.00000000)
-@@ -2659,7 +2660,7 @@ cdef class RealBall(RingElement):
-             sage: ~RBF(5)
-             [0.2000000000000000 +/- 4.45e-17]
-             sage: ~RBF(0)
--            [+/- inf]
-+            nan
-             sage: RBF(RIF(-0.1,0.1))
-             [+/- 0.101]
- 
-@@ -2739,7 +2740,7 @@ cdef class RealBall(RingElement):
-             sage: RBF(pi)/RBF(e)
-             [1.155727349790922 +/- 8.43e-16]
-             sage: RBF(2)/RBF(0)
--            [+/- inf]
-+            nan
-         """
-         cdef RealBall res = self._new()
-         if _do_sig(prec(self)): sig_on()
-@@ -2765,7 +2766,7 @@ cdef class RealBall(RingElement):
-             sage: RBF(-1)^(1/3)
-             nan
-             sage: RBF(0)^(-1)
--            [+/- inf]
-+            nan
-             sage: RBF(-e)**RBF(pi)
-             nan
- 
-@@ -3129,7 +3130,7 @@ cdef class RealBall(RingElement):
-             sage: RBF(1).tan()
-             [1.557407724654902 +/- 3.26e-16]
-             sage: RBF(pi/2).tan()
--            [+/- inf]
-+            nan
-         """
-         cdef RealBall res = self._new()
-         if _do_sig(prec(self)): sig_on()
-@@ -3146,7 +3147,7 @@ cdef class RealBall(RingElement):
-             sage: RBF(1).cot()
-             [0.642092615934331 +/- 4.79e-16]
-             sage: RBF(pi).cot()
--            [+/- inf]
-+            nan
-         """
-         cdef RealBall res = self._new()
-         if _do_sig(prec(self)): sig_on()
-@@ -3257,7 +3258,7 @@ cdef class RealBall(RingElement):
-             sage: RBF(1).coth()
-             [1.313035285499331 +/- 4.97e-16]
-             sage: RBF(0).coth()
--            [+/- inf]
-+            nan
-         """
-         cdef RealBall res = self._new()
-         if _do_sig(prec(self)): sig_on()
diff --git a/pkgs/applications/science/math/sage/patches/known-padics-bug.patch b/pkgs/applications/science/math/sage/patches/known-padics-bug.patch
new file mode 100644
index 000000000000..bdccd73e0ce1
--- /dev/null
+++ b/pkgs/applications/science/math/sage/patches/known-padics-bug.patch
@@ -0,0 +1,15 @@
+diff --git a/build/pkgs/openblas/package-version.txt b/build/pkgs/openblas/package-version.txt
+index 3bc45c25d4..7c7c224887 100644
+--- a/src/sage/schemes/elliptic_curves/padics.py
++++ b/src/sage/schemes/elliptic_curves/padics.py
+@@ -292,8 +292,8 @@ def padic_regulator(self, p, prec=20, height=None, check_hypotheses=True):
+ 
+         sage: max_prec = 30    # make sure we get past p^2    # long time
+         sage: full = E.padic_regulator(5, max_prec)           # long time
+-        sage: for prec in range(1, max_prec):                 # long time
+-        ....:     assert E.padic_regulator(5, prec) == full   # long time
++        sage: for prec in range(1, max_prec):                 # known bug (#25969) # long time
++        ....:     assert E.padic_regulator(5, prec) == full   # known bug (#25969) # long time
+ 
+     A case where the generator belongs to the formal group already
+     (:trac:`3632`)::
diff --git a/pkgs/applications/science/math/sage/patches/maxima-5.41.0-doctests.patch b/pkgs/applications/science/math/sage/patches/maxima-5.41.0-doctests.patch
deleted file mode 100644
index fad434e52ada..000000000000
--- a/pkgs/applications/science/math/sage/patches/maxima-5.41.0-doctests.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
-index 961c20aaac..3d601d8939 100644
---- a/src/sage/interfaces/maxima_abstract.py
-+++ b/src/sage/interfaces/maxima_abstract.py
-@@ -1743,7 +1743,7 @@ class MaximaAbstractElement(ExtraTabCompletion, InterfaceElement):
-             sage: y,d = var('y,d')
-             sage: f = function('f')
-             sage: latex(maxima(derivative(f(x*y), x)))
--            \left(\left.{{{\it \partial}}\over{{\it \partial}\,  {\it t_0}}}\,f\left({\it t_0}\right)  \right|_{{\it t_0}={\it x}\,  {\it y}}\right)\,{\it y}
-+            \left(\left.{{{\it \partial}}\over{{\it \partial}\,  {\it t}_{0}}}\,f\left({\it t}_{0}\right)  \right|_{{\it t}_{0}={\it x}\,  {\it y}}\right)\,{\it y}
-             sage: latex(maxima(derivative(f(x,y,d), d,x,x,y)))
-             {{{\it \partial}^4}\over{{\it \partial}\,{\it d}\,  {\it \partial}\,{\it x}^2\,{\it \partial}\,  {\it y}}}\,f\left({\it x} ,  {\it y} , {\it d}\right)
-             sage: latex(maxima(d/(d-2)))
-diff --git a/src/sage/manifolds/differentiable/metric.py b/src/sage/manifolds/differentiable/metric.py
-index 3cd6ad3235..1e18af1a6b 100644
---- a/src/sage/manifolds/differentiable/metric.py
-+++ b/src/sage/manifolds/differentiable/metric.py
-@@ -993,7 +993,7 @@ class PseudoRiemannianMetric(TensorField):
-              2-dimensional differentiable manifold S^2
-             sage: g.riemann()[:]
-             [[[[0, 0], [0, 0]], [[0, sin(th)^2], [-sin(th)^2, 0]]],
--             [[[0, (cos(th)^2 - 1)/sin(th)^2], [1, 0]], [[0, 0], [0, 0]]]]
-+             [[[0, -1], [1, 0]], [[0, 0], [0, 0]]]]
- 
-         In dimension 2, the Riemann tensor can be expressed entirely in terms of
-         the Ricci scalar `r`:
-diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx
-index dfb8751467..27402e54ab 100644
---- a/src/sage/symbolic/expression.pyx
-+++ b/src/sage/symbolic/expression.pyx
-@@ -7154,7 +7154,7 @@ cdef class Expression(CommutativeRingElement):
-             sage: ex = lcm(sin(x)^2 - 1, sin(x)^2 + sin(x)); ex
-             (sin(x)^2 + sin(x))*(sin(x)^2 - 1)/(sin(x) + 1)
-             sage: ex.simplify_full()
--            -cos(x)^2*sin(x)
-+            sin(x)^3 - sin(x)
- 
-         TESTS:
- 
-@@ -10004,7 +10004,7 @@ cdef class Expression(CommutativeRingElement):
- 
-             sage: f=tan(3*x)
-             sage: f.simplify_trig()
--            (4*cos(x)^2 - 1)*sin(x)/(4*cos(x)^3 - 3*cos(x))
-+            -(4*cos(x)^2 - 1)*sin(x)/(4*cos(x)*sin(x)^2 - cos(x))
-             sage: f.simplify_trig(False)
-             sin(3*x)/cos(3*x)
- 
diff --git a/pkgs/applications/science/math/sage/patches/pari-no-threads.patch b/pkgs/applications/science/math/sage/patches/pari-no-threads.patch
new file mode 100644
index 000000000000..13b47dbdd31b
--- /dev/null
+++ b/pkgs/applications/science/math/sage/patches/pari-no-threads.patch
@@ -0,0 +1,18 @@
+diff --git a/src/sage/libs/pari/__init__.py b/src/sage/libs/pari/__init__.py
+index e451766474..77eda66097 100644
+--- a/src/sage/libs/pari/__init__.py
++++ b/src/sage/libs/pari/__init__.py
+@@ -205,6 +205,13 @@ def _get_pari_instance():
+     # messages in Sage.
+     P.default("debugmem", 0)
+ 
++    # Make sure pari doesn't use threads, regardless of how it was compiled.
++    # Threads cause some doctest failures (memory issues). Those could probably
++    # be solved without disabling threads. But that would require figuring out
++    # some sensible values for `threadsizemax`. See
++    # https://pari.math.u-bordeaux.fr/dochtml/html/GP_defaults.html
++    P.default("nbthreads", 1)
++
+     return P
+ 
+ pari = _get_pari_instance()
diff --git a/pkgs/applications/science/math/sage/patches/pynac-0.7.22.patch b/pkgs/applications/science/math/sage/patches/pynac-0.7.22.patch
deleted file mode 100644
index 22f274d608d4..000000000000
--- a/pkgs/applications/science/math/sage/patches/pynac-0.7.22.patch
+++ /dev/null
@@ -1,479 +0,0 @@
-diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
-index 3a417d9d5c..fadaadbaf6 100644
---- a/src/sage/calculus/calculus.py
-+++ b/src/sage/calculus/calculus.py
-@@ -231,7 +231,7 @@ Another example::
-     sage: f(x=3)
-     arcsinh(1)
-     sage: f.derivative(x)
--    1/3/sqrt(1/9*x^2 + 1)
-+    1/sqrt(x^2 + 9)
- 
- We compute the length of the parabola from 0 to 2::
- 
-@@ -1509,8 +1509,8 @@ def laplace(ex, t, s, algorithm='maxima'):
-     Testing SymPy::
- 
-         sage: laplace(t^n, t, s, algorithm='sympy')
--        (s^(-n)*gamma(n + 1)/s, 0, -re(n) < 1)
--        
-+        (gamma(n + 1)/(s*s^n), 0, -re(n) < 1)
-+
-     Testing Maxima::
- 
-         sage: laplace(t^n, t, s, algorithm='maxima')
-diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
-index 1fc2db5c94..f3e49b9cdb 100644
---- a/src/sage/functions/hypergeometric.py
-+++ b/src/sage/functions/hypergeometric.py
-@@ -34,7 +34,7 @@ Simplification (note that ``simplify_full`` does not yet call
-     sage: a.simplify_hypergeometric()
-     1/((-e^x + 1)^e^x)
-     sage: a.simplify_hypergeometric(algorithm='sage')
--    (-e^x + 1)^(-e^x)
-+    1/((-e^x + 1)^e^x)
- 
- Equality testing::
- 
-@@ -145,7 +145,7 @@ Series expansions of confluent hypergeometric functions::
- 
-     sage: hypergeometric_M(2, 2, x).series(x, 3)
-     1 + 1*x + 1/2*x^2 + Order(x^3)
--    sage: hypergeometric_U(2, 2, x).series(x == 3, 100).subs(x=1).n()
-+    sage: hypergeometric_U(2, 2, x).series(x == 3, 100).subs(x=1).n() # known bug (see :trac:`25688`)
-     0.403652637676806
-     sage: hypergeometric_U(2, 2, 1).n()
-     0.403652637676806
-@@ -773,7 +773,7 @@ def closed_form(hyp):
-         sage: closed_form(hypergeometric([], [], z))
-         e^z
-         sage: closed_form(hypergeometric([a], [], z))
--        (-z + 1)^(-a)
-+        1/((-z + 1)^a)
-         sage: closed_form(hypergeometric([1, 1, 2], [1, 1], z))
-         (z - 1)^(-2)
-         sage: closed_form(hypergeometric([2, 3], [1], x))
-@@ -1121,7 +1121,7 @@ class Hypergeometric_U(BuiltinFunction):
-                 sage: var('a b z')
-                 (a, b, z)
-                 sage: hypergeometric_U(a, b, z).generalized()
--                z^(-a)*hypergeometric((a, a - b + 1), (), -1/z)
-+                hypergeometric((a, a - b + 1), (), -1/z)/z^a
-                 sage: hypergeometric_U(1, 3, 1/2).generalized()
-                 2*hypergeometric((1, -1), (), -2)
-                 sage: hypergeometric_U(3, I, 2).generalized()
-diff --git a/src/sage/functions/log.py b/src/sage/functions/log.py
-index 75d1bf8060..61968582af 100644
---- a/src/sage/functions/log.py
-+++ b/src/sage/functions/log.py
-@@ -518,17 +518,17 @@ class Function_polylog(GinacFunction):
- 
-             sage: BF = RealBallField(100)
-             sage: polylog(2, BF(1/3))
--            [0.36621322997706348761674629766 +/- 4.51e-30]
-+            [0.36621322997706348761674629766... +/- ...]
-             sage: polylog(2, BF(4/3))
--            nan
-+            [2.27001825336107090380391448586 +/- 5.64e-30] + [-0.90377988538400159956755721265 +/- 8.39e-30]*I
-             sage: parent(_)
--            Real ball field with 100 bits of precision
-+            Complex ball field with 100 bits of precision
-             sage: polylog(2, CBF(1/3))
--            [0.366213229977063 +/- 5.85e-16]
-+            [0.366213229977063 +/- ...]
-             sage: parent(_)
-             Complex ball field with 53 bits of precision
-             sage: polylog(2, CBF(1))
--            [1.644934066848226 +/- 6.59e-16]
-+            [1.644934066848226 +/- ...]
-             sage: parent(_)
-             Complex ball field with 53 bits of precision
-         """
-diff --git a/src/sage/functions/trig.py b/src/sage/functions/trig.py
-index e7e7a311cd..1f2926d6c9 100644
---- a/src/sage/functions/trig.py
-+++ b/src/sage/functions/trig.py
-@@ -529,13 +529,8 @@ class Function_arcsin(GinacFunction):
-             arcsin
-             sage: asin(complex(1,1))
-             (0.6662394324925152+1.0612750619050357j)
--
--        Check that :trac:`22823` is fixed::
--
--            sage: bool(asin(SR(2.1)) == NaN)
--            True
--            sage: asin(SR(2.1)).is_real()
--            False
-+            sage: asin(SR(2.1))
-+            1.57079632679490 - 1.37285914424258*I
-         """
-         GinacFunction.__init__(self, 'arcsin', latex_name=r"\arcsin",
-                 conversions=dict(maxima='asin', sympy='asin', fricas="asin", giac="asin"))
-@@ -595,13 +590,8 @@ class Function_arccos(GinacFunction):
-             arccos
-             sage: acos(complex(1,1))
-             (0.9045568943023814-1.0612750619050357j)
--
--        Check that :trac:`22823` is fixed::
--
--            sage: bool(acos(SR(2.1)) == NaN)
--            True
--            sage: acos(SR(2.1)).is_real()
--            False
-+            sage: acos(SR(2.1))
-+            1.37285914424258*I
-         """
-         GinacFunction.__init__(self, 'arccos', latex_name=r"\arccos",
-                 conversions=dict(maxima='acos', sympy='acos', fricas='acos', giac='acos'))
-@@ -807,7 +797,7 @@ class Function_arcsec(GinacFunction):
-             sage: arcsec(2).n(100)
-             1.0471975511965977461542144611
-             sage: arcsec(1/2).n(100)
--            NaN
-+            1.3169578969248167086250463473*I
-             sage: RDF(arcsec(2))  # abs tol 1e-15
-             1.0471975511965976
-             sage: arcsec(1 + I)
-@@ -958,7 +948,9 @@ class Function_arctan2(GinacFunction):
-             sage: atan2(0,0,hold=True)
-             arctan2(0, 0)
-             sage: atan2(0,0,hold=True).n()
--            NaN
-+            Traceback (most recent call last):
-+            ...
-+            RuntimeError: atan2(): division by zero
- 
-         Check if :trac:`10062` is fixed, this was caused by
-         ``(I*I).is_positive()`` returning ``True``::
-diff --git a/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py b/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py
-index 3b5c8d1729..1c6b73a16c 100644
---- a/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py
-+++ b/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py
-@@ -1422,8 +1422,10 @@ class HyperbolicGeodesicUHP(HyperbolicGeodesic):
-         expressions do not generate runtime errors. ::
- 
-             sage: g=HyperbolicPlane().UHP().get_geodesic(-1+I,1+I)
--            sage: g.midpoint()
--            Point in UHP 1/2*(sqrt(2)*e^(1/2*arccosh(3)) - sqrt(2) + (I - 1)*e^(1/2*arccosh(3)) + I - 1)/((1/4*I - 1/4)*sqrt(2)*e^(1/2*arccosh(3)) - (1/4*I - 1/4)*sqrt(2) + 1/2*e^(1/2*arccosh(3)) + 1/2)
-+            sage: point = g.midpoint(); point
-+            Point in UHP -1/2*(sqrt(2)*...
-+            sage: QQbar(point.coordinates()).radical_expression()
-+            I*sqrt(2)
- 
-         Check that floating points remain floating points
-         in :meth:`midpoint` ::
-diff --git a/src/sage/interfaces/fricas.py b/src/sage/interfaces/fricas.py
-index 82aae78e37..8501ea2a18 100644
---- a/src/sage/interfaces/fricas.py
-+++ b/src/sage/interfaces/fricas.py
-@@ -1084,14 +1084,14 @@ class FriCASElement(ExpectElement):
-              0.451026811796262,
-              0.732815101786507,
-              0.837981225008390,
--             NaN,
--             NaN,
-+             1.57079632679490 - 0.467145308103262*I,
-+             0.467145308103262*I,
-              1.11976951499863,
-              0.451026811796262,
-              0.732815101786507,
-              0.837981225008390,
--             NaN,
--             NaN]
-+             1.57079632679490 - 0.467145308103262*I,
-+             0.467145308103262*I]
-             sage: l = [tanh, sinh, cosh, coth, sech, csch, asinh, acosh, atanh, acoth, asech, acsch, arcsinh, arccosh, arctanh, arccoth, arcsech, arccsch]
-             sage: [f(x)._fricas_().sage().subs(x=0.9) for f in l]               # optional - fricas
-             [0.716297870199024,
-diff --git a/src/sage/libs/pynac/pynac.pyx b/src/sage/libs/pynac/pynac.pyx
-index 9e9d8f664b..e3406f007e 100644
---- a/src/sage/libs/pynac/pynac.pyx
-+++ b/src/sage/libs/pynac/pynac.pyx
-@@ -1824,7 +1824,7 @@ cdef py_atan2(x, y):
-         sage: atan2(CC(I), CC(I+1))
-         0.553574358897045 + 0.402359478108525*I
-         sage: atan2(CBF(I), CBF(I+1))
--        [0.55357435889705 +/- 5.58e-15] + [0.402359478108525 +/- 7.11e-16]*I
-+        [0.55357435889705 +/- ...] + [0.402359478108525 +/- ...]*I
- 
-     Check that :trac:`23776` is fixed and RDF input gives real output::
- 
-diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
-index 46a15e53eb..7a0beb437b 100644
---- a/src/sage/matrix/matrix_symbolic_dense.pyx
-+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
-@@ -200,7 +200,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
-             sage: eval, [evec], mult = es[0]
-             sage: delta = eval*evec - evec*A
-             sage: abs(abs(delta)) < 1e-10
--            sqrt(9/25*((2*sqrt(6) - 3)*(sqrt(6) - 2) + 7*sqrt(6) - 18)^2 + 9/25*((sqrt(6) - 2)*(sqrt(6) - 4) + 6*sqrt(6) - 14)^2) < (1.00000000000000e-10)
-+            3/5*sqrt(((2*sqrt(6) - 3)*(sqrt(6) - 2) + 7*sqrt(6) - 18)^2 + ((sqrt(6) - 2)*(sqrt(6) - 4) + 6*sqrt(6) - 14)^2) < (1.00000000000000e-10)
-             sage: abs(abs(delta)).n() < 1e-10
-             True
- 
-diff --git a/src/sage/modules/matrix_morphism.py b/src/sage/modules/matrix_morphism.py
-index 17a1d6e290..03892ceec0 100644
---- a/src/sage/modules/matrix_morphism.py
-+++ b/src/sage/modules/matrix_morphism.py
-@@ -214,9 +214,9 @@ class MatrixMorphism_abstract(sage.categories.morphism.Morphism):
-             sage: f((1, 0))
-             Traceback (most recent call last):
-             ...
--            TypeError: Unable to coerce entries (=[1.00000000000000*I, 0.000000000000000]) to coefficients in Real Field with 53 bits of precision
-+            TypeError: Unable to coerce entries (=[1.00000000000000*I, 0]) to coefficients in Real Field with 53 bits of precision
-             sage: f((1, 0), coerce=False)
--            (1.00000000000000*I, 0.000000000000000)
-+            (1.00000000000000*I, 0)
- 
-         """
-         if self.domain().is_ambient():
-diff --git a/src/sage/plot/plot.py b/src/sage/plot/plot.py
-index 77cdeb8c46..e501e74036 100644
---- a/src/sage/plot/plot.py
-+++ b/src/sage/plot/plot.py
-@@ -2061,7 +2061,7 @@ def _plot(funcs, xrange, parametric=False,
-     plot properly (:trac:`13246`)::
- 
-         sage: parametric_plot((x, arcsec(x)), (x, -2, 2))
--        Graphics object consisting of 1 graphics primitive
-+        Graphics object consisting of 2 graphics primitives
- 
-     """
-     from sage.plot.colors import Color
-diff --git a/src/sage/repl/display/formatter.py b/src/sage/repl/display/formatter.py
-index 8ce2e839d7..948207c95e 100644
---- a/src/sage/repl/display/formatter.py
-+++ b/src/sage/repl/display/formatter.py
-@@ -25,11 +25,11 @@ generally, all sage expression as an ASCII art object::
-     sage: shell = get_test_shell()
-     sage: shell.run_cell('%display ascii_art')
-     sage: shell.run_cell('integral(x^2/pi^x, x)')
--     / 2    2                      \  -x*log(pi)
--    -\x *log (pi) + 2*x*log(pi) + 2/*e
--    ---------------------------------------------
--                         3
--                      log (pi)
-+       -x / 2    2                      \ 
-+    -pi  *\x *log (pi) + 2*x*log(pi) + 2/ 
-+    --------------------------------------
-+                     3                   
-+                   log (pi)               
-     sage: shell.run_cell("i = var('i')")
-     sage: shell.run_cell('sum(i*x^i, i, 0, 10)')
-         10      9      8      7      6      5      4      3      2
-diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-index d8ebbf4f76..8c60f65e99 100644
---- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
-@@ -151,8 +151,8 @@ A multiple point example (Example 6.5 of [RaWi2012]_)::
-      [(x + 2*y - 1, 1), (2*x + y - 1, 1)])
-     sage: F1 = decomp[1]
-     sage: F1.asymptotics(p, alpha, 2)
--    (-3*((2*a^2 - 5*a*b + 2*b^2)*r^2 + (a + b)*r + 3)*((1/3)^(-a)*(1/3)^(-b))^r,
--     (1/3)^(-a)*(1/3)^(-b), -3*(2*a^2 - 5*a*b + 2*b^2)*r^2 - 3*(a + b)*r - 9)
-+    (-3*((2*a^2 - 5*a*b + 2*b^2)*r^2 + (a + b)*r + 3)*(1/((1/3)^a*(1/3)^b))^r,
-+     1/((1/3)^a*(1/3)^b), -3*(2*a^2 - 5*a*b + 2*b^2)*r^2 - 3*(a + b)*r - 9)
-     sage: alpha = [4, 3]
-     sage: decomp =  F.asymptotic_decomposition(alpha)
-     sage: F1 = decomp[1]
-@@ -2159,7 +2159,7 @@ class FractionWithFactoredDenominator(RingElement):
-             sage: p = {x: 1/3, y: 1/3}
-             sage: alpha = (var('a'), var('b'))
-             sage: F.asymptotics_multiple(p, alpha, 2, var('r')) # long time
--            (3*((1/3)^(-a)*(1/3)^(-b))^r*e^(2/3), (1/3)^(-a)*(1/3)^(-b), 3*e^(2/3))
-+            (3*(1/((1/3)^a*(1/3)^b))^r*e^(2/3), 1/((1/3)^a*(1/3)^b), 3*e^(2/3))
-         """
-         from itertools import product
-         from sage.calculus.functions import jacobian
-diff --git a/src/sage/stats/basic_stats.py b/src/sage/stats/basic_stats.py
-index 16a268a02c..5fd244e93b 100644
---- a/src/sage/stats/basic_stats.py
-+++ b/src/sage/stats/basic_stats.py
-@@ -183,7 +183,7 @@ def std(v, bias=False):
-         sage: std([])
-         NaN
-         sage: std([I, sqrt(2), 3/5])
--        sqrt(1/450*(10*sqrt(2) - 5*I - 3)^2 + 1/450*(5*sqrt(2) - 10*I + 3)^2 + 1/450*(5*sqrt(2) + 5*I - 6)^2)
-+        1/15*sqrt(1/2)*sqrt((10*sqrt(2) - 5*I - 3)^2 + (5*sqrt(2) - 10*I + 3)^2 + (5*sqrt(2) + 5*I - 6)^2)
-         sage: std([RIF(1.0103, 1.0103), RIF(2)])
-         0.6998235813403261?
-         sage: import numpy
-diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx
-index ab4c05de3a..60f0dc549a 100644
---- a/src/sage/symbolic/expression.pyx
-+++ b/src/sage/symbolic/expression.pyx
-@@ -622,7 +622,7 @@ cdef class Expression(CommutativeRingElement):
-             sage: x^(-5)
-             x^(-5)
-             sage: x^(-y)
--            x^(-y)
-+            1/(x^y)
-             sage: 2*x^(-1)
-             2/x
-             sage: i*x
-@@ -3621,14 +3621,14 @@ cdef class Expression(CommutativeRingElement):
-             sage: repl_dict = {b_0: b_0, b_3: b_1, b_2: b_3, b_1: b_2}
-             sage: P = precomp.substitute(repl_dict)
-             sage: P.expand()
--            -2^(-b_0)*2^(-b_2)*2^b_3 - 2^b_0*2^(-b_2)*2^b_3 -
--            2^(-b_0)*2^b_2*2^b_3 + 2^b_0*2^b_2*2^b_3 - 2*2^(-b_0)*2^(-b_2)
--            - 2*2^b_0*2^(-b_2) - 2*2^(-b_0)*2^b_2 + 2*2^b_0*2^b_2 +
--            2^(-b_0)*2^b_3 + 2^b_0*2^b_3 + 2^(-b_2)*2^b_3 + 2^b_2*2^b_3 +
--            2*2^(-b_0) + 2*2^b_0 + 2*2^(-b_2) + 2*2^b_2 - 9*2^b_3 -
--            2^(-b_0)*2^(-b_2)/2^b_3 - 2^b_0*2^(-b_2)/2^b_3 -
--            2^(-b_0)*2^b_2/2^b_3 + 2^b_0*2^b_2/2^b_3 + 2^(-b_0)/2^b_3 +
--            2^b_0/2^b_3 + 2^(-b_2)/2^b_3 + 2^b_2/2^b_3 - 9/2^b_3 - 18
-+            2^b_0*2^b_2*2^b_3 + 2*2^b_0*2^b_2 + 2^b_0*2^b_3 + 2^b_2*2^b_3 +
-+            2*2^b_0 + 2*2^b_2 - 9*2^b_3 + 2^b_0*2^b_2/2^b_3 -
-+            2^b_0*2^b_3/2^b_2 - 2^b_2*2^b_3/2^b_0 - 2*2^b_0/2^b_2 -
-+            2*2^b_2/2^b_0 + 2^b_0/2^b_3 + 2^b_2/2^b_3 + 2^b_3/2^b_0 +
-+            2^b_3/2^b_2 + 2/2^b_0 + 2/2^b_2 - 2^b_0/(2^b_2*2^b_3) -
-+            2^b_2/(2^b_0*2^b_3) - 9/2^b_3 - 2^b_3/(2^b_0*2^b_2) -
-+            2/(2^b_0*2^b_2) + 1/(2^b_0*2^b_3) + 1/(2^b_2*2^b_3) -
-+            1/(2^b_0*2^b_2*2^b_3) - 18
- 
-             sage: _0,b_1,b_2=var('b_0,b_1,b_2')
-             sage: f = 1/27*b_2^2/(2^b_2)^2 + 1/27*b_1^2/(2^b_1)^2 + \
-@@ -3809,7 +3809,7 @@ cdef class Expression(CommutativeRingElement):
- 
-             sage: x = SR.symbol('x', domain='real')
-             sage: (x^3)^(1/3)
--            (x^3)^(1/3)
-+            x
-             sage: (x^4)^(1/4)
-             abs(x)
-             sage: (x^8)^(1/4)
-@@ -3872,7 +3872,7 @@ cdef class Expression(CommutativeRingElement):
-             sage: 2^(x/log(2))
-             e^x
-             sage: 2^(-x^2/2/log(2))
--            e^(-1/2*x^2)
-+            1/e^(1/2*x^2)
-             sage: x^(x/log(x))
-             x^(x/log(x))
-             sage: assume(x > 0)
-@@ -4816,18 +4816,24 @@ cdef class Expression(CommutativeRingElement):
-             sage: ((x+y)^(x+y)).match(w0^w0)
-             {$0: x + y}
-             sage: t = ((a+b)*(a+c)).match((a+w0)*(a+w1))
--            sage: t[w0], t[w1]
--            (c, b)
-+            sage: set([t[w0], t[w1]]) == set([b, c])
-+            True
-             sage: ((a+b)*(a+c)).match((w0+b)*(w0+c))
-             {$0: a}
-             sage: t = ((a+b)*(a+c)).match((w0+w1)*(w0+w2))
--            sage: t[w0], t[w1], t[w2]
--            (a, c, b)
--            sage: print(((a+b)*(a+c)).match((w0+w1)*(w1+w2)))
--            None
-+            sage: t[w0]
-+            a
-+            sage: set([t[w1], t[w2]]) == set([b, c])
-+            True
-+            sage: t = ((a+b)*(a+c)).match((w0+w1)*(w1+w2))
-+            sage: t[w1]
-+            a
-+            sage: set([t[w0], t[w2]]) == set([b, c])
-+            True
-             sage: t = (a*(x+y)+a*z+b).match(a*w0+w1)
--            sage: t[w0], t[w1]
--            (x + y, a*z + b)
-+            sage: s = set([t[w0], t[w1]])
-+            sage: s == set([x+y, a*z+b]) or s == set([z, a*(x+y)+b])
-+            True
-             sage: print((a+b+c+d+f+g).match(c))
-             None
-             sage: (a+b+c+d+f+g).has(c)
-@@ -4836,7 +4842,7 @@ cdef class Expression(CommutativeRingElement):
-             {$0: a + b + d + f + g}
-             sage: (a+b+c+d+f+g).match(c+g+w0)
-             {$0: a + b + d + f}
--            sage: (a+b).match(a+b+w0)
-+            sage: (a+b).match(a+b+w0) # known bug
-             {$0: 0}
-             sage: print((a*b^2).match(a^w0*b^w1))
-             None
-@@ -5009,7 +5015,7 @@ cdef class Expression(CommutativeRingElement):
-             a^3 + b^3 + (x + y)^3
- 
-             sage: t.subs(w0 == w0^2)
--            (x^2 + y^2)^18 + a^16 + b^16
-+            a^8 + b^8 + (x^2 + y^2)^6
- 
-             sage: t.subs(a == b, b == c)
-             (x + y)^3 + b^2 + c^2
-@@ -8392,9 +8398,13 @@ cdef class Expression(CommutativeRingElement):
-             sage: SR(I).arctan2(1)
-             arctan2(I, 1)
-             sage: SR(CDF(0,1)).arctan2(1)
--            NaN + +infinity*I
--            sage: SR(1).arctan2(CDF(0,1))   # known bug
--            0.7853981633974484 - 19.012501686914433*I
-+            Traceback (most recent call last):
-+            ...
-+            ValueError: power::eval(): division by zero
-+            sage: SR(1).arctan2(CDF(0,1))
-+            Traceback (most recent call last):
-+            ...
-+            ValueError: power::eval(): division by zero
- 
-             sage: arctan2(0,oo)
-             0
-@@ -8656,7 +8666,7 @@ cdef class Expression(CommutativeRingElement):
-             1/2*I*pi
-             sage: SR(1/2).arccosh()
-             arccosh(1/2)
--            sage: SR(CDF(1/2)).arccosh()  # rel tol 1e-15
-+            sage: SR(CDF(1/2)).arccosh() #  rel tol 1e-15
-             1.0471975511965976*I
-             sage: maxima('acosh(0.5)')
-             1.04719755119659...*%i
-@@ -11687,7 +11697,7 @@ cdef class Expression(CommutativeRingElement):
-             sage: a.solve(t)
-             []
-             sage: b = a.canonicalize_radical(); b
--            -23040.0*(-2.0*e^(1800*t) + 25.0*e^(900*t) - 32.0)*e^(-2400*t)
-+            (46080.0*e^(1800*t) - 576000.0*e^(900*t) + 737280.0)*e^(-2400*t)
-             sage: b.solve(t)
-             []
-             sage: b.solve(t, to_poly_solve=True)
-@@ -12163,14 +12173,14 @@ cdef class Expression(CommutativeRingElement):
- 
-             sage: (n,k,j)=var('n,k,j')
-             sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
--            -(-1)^(-j)*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
-+            -(-1)^j*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
-             sage: assume(j>-1)
-             sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
-             1
-             sage: forget()
-             sage: assume(n>=j)
-             sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
--            -(-1)^(-j)*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
-+            -(-1)^j*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
-             sage: forget()
-             sage: assume(j==-1)
-             sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
-@@ -12178,7 +12188,7 @@ cdef class Expression(CommutativeRingElement):
-             sage: forget()
-             sage: assume(j<-1)
-             sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
--            -(-1)^(-j)*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
-+            -(-1)^j*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
-             sage: forget()
- 
-         Check that :trac:`16176` is fixed::
-diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
-index da6f0eef42..4bd65ef572 100644
---- a/src/sage/symbolic/relation.py
-+++ b/src/sage/symbolic/relation.py
-@@ -895,7 +895,7 @@ def solve(f, *args, **kwds):
-         sage: (r[0][x], r[0][y])
-         (2*lambert_w(1/2), 1)
-         sage: solve(-2*x**3 + 4*x**2 - 2*x + 6 > 0, x, algorithm='sympy')
--        [x < (1/6*sqrt(77) + 79/54)^(1/3) + 1/9/(1/6*sqrt(77) + 79/54)^(1/3) + 2/3]
-+        [x < 1/3*(1/2)^(1/3)*(9*sqrt(77) + 79)^(1/3) + 2/3*(1/2)^(2/3)/(9*sqrt(77) + 79)^(1/3) + 2/3]
-         sage: solve(sqrt(2*x^2 - 7) - (3 - x),x,algorithm='sympy')
-         [x == -8, x == 2]
-         sage: solve(sqrt(2*x + 9) - sqrt(x + 1) - sqrt(x + 4),x,algorithm='sympy')
diff --git a/pkgs/applications/science/math/sage/patches/python3-syntax-without-write.patch b/pkgs/applications/science/math/sage/patches/python3-syntax-without-write.patch
deleted file mode 100644
index ff1dcd22acf3..000000000000
--- a/pkgs/applications/science/math/sage/patches/python3-syntax-without-write.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-diff --git a/src/sage/tests/py3_syntax.py b/src/sage/tests/py3_syntax.py
-index e564860b48..86ab3725f9 100644
---- a/src/sage/tests/py3_syntax.py
-+++ b/src/sage/tests/py3_syntax.py
-@@ -179,15 +179,30 @@ class Python3SyntaxTest(SortedDirectoryWalkerABC):
-             sage: py3_syntax = Python3SyntaxTest()
-             sage: py3_syntax.test(src.name)
-             Invalid Python 3 syntax found:
--              File "...py", line 1
--                print "invalid print statement"
--                                              ^
--            SyntaxError: Missing parentheses in call to 'print'
-+            Missing parentheses in call to 'print'...
-             sage: os.unlink(src.name)
-         """
-+
-+        # compile all given files in memory, printing all errors
-+        # inspired by the py_compile module (but without writing to file)
-+        script = """
-+import sys
-+import importlib.machinery
-+rv = 0
-+for file in sys.argv[1:]:
-+    loader = importlib.machinery.SourceFileLoader('<sage_test>', file)
-+    source_bytes = loader.get_data(file)
-+    try:
-+        code = loader.source_to_code(source_bytes, file)
-+    except Exception as err:
-+        print(err)
-+        rv = 1
-+sys.exit(rv)
-+"""
-         cmd = [
-             'python3',
--            '-m', 'py_compile'
-+            '-c',
-+            script,
-         ] + list(filenames)
-         process = subprocess.Popen(
-             cmd,
diff --git a/pkgs/applications/science/math/sage/patches/sagenb-sphinx-1.7.patch b/pkgs/applications/science/math/sage/patches/sagenb-sphinx-1.7.patch
deleted file mode 100644
index 42deef4eab0c..000000000000
--- a/pkgs/applications/science/math/sage/patches/sagenb-sphinx-1.7.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 7419e0246230594ebfd5e7a2fe6b80d67abfc98a Mon Sep 17 00:00:00 2001
-From: Jeroen Demeyer <jdemeyer@cage.ugent.be>
-Date: Tue, 20 Mar 2018 10:40:41 +0100
-Subject: Fix sphinxify doctests
-
----
- sagenb/misc/sphinxify.py | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/sagenb/misc/sphinxify.py b/sagenb/misc/sphinxify.py
-index 4f76d41..15623d9 100644
---- a/sagenb/misc/sphinxify.py
-+++ b/sagenb/misc/sphinxify.py
-@@ -47,11 +47,11 @@ def sphinxify(docstring, format='html'):
- 
-         sage: from sage.misc.sphinxify import sphinxify
-         sage: sphinxify('A test')
--        '...<div class="docstring">\n    \n  <p>A test</p>\n\n\n</div>'
-+        '<div class="docstring">\n    \n  <p>A test</p>\n\n\n</div>'
-         sage: sphinxify('**Testing**\n`monospace`')
--        '...<div class="docstring"...<strong>Testing</strong>\n<span class="math"...</p>\n\n\n</div>'
-+        '<div class="docstring"...<strong>Testing</strong>\n<span class="math notranslate"...</p>\n\n\n</div>'
-         sage: sphinxify('`x=y`')
--        '...<div class="docstring">\n    \n  <p><span class="math">x=y</span></p>\n\n\n</div>'
-+        '<div class="docstring">\n    \n  <p><span class="math notranslate">x=y</span></p>\n\n\n</div>'
-         sage: sphinxify('`x=y`', format='text')
-         'x=y\n'
-         sage: sphinxify(':math:`x=y`', format='text')
--- 
-cgit v1.0-1-gd88e
-
diff --git a/pkgs/applications/science/math/sage/patches/singular-4.1.1p2.patch b/pkgs/applications/science/math/sage/patches/singular-4.1.1p2.patch
new file mode 100644
index 000000000000..4c8df92904ed
--- /dev/null
+++ b/pkgs/applications/science/math/sage/patches/singular-4.1.1p2.patch
@@ -0,0 +1,274 @@
+diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
+index 9d65c9fa6c..a028bbe719 100644
+--- a/src/sage/interfaces/singular.py
++++ b/src/sage/interfaces/singular.py
+@@ -654,7 +654,7 @@ class Singular(ExtraTabCompletion, Expect):
+ 
+         s = Expect.eval(self, x, **kwds)
+ 
+-        if s.find("error") != -1 or s.find("Segment fault") != -1:
++        if s.find("error occurred") != -1 or s.find("Segment fault") != -1:
+             raise SingularError('Singular error:\n%s'%s)
+ 
+         if get_verbose() > 0:
+@@ -1079,7 +1079,7 @@ class Singular(ExtraTabCompletion, Expect):
+             sage: S = singular.ring('real', '(a,b)', 'lp')
+             sage: singular.current_ring()
+             polynomial ring, over a field, global ordering
+-            //   coefficients: float
++            //   coefficients: Float()
+             //   number of vars : 2
+             //        block   1 : ordering lp
+             //                  : names    a b
+@@ -1157,7 +1157,7 @@ class Singular(ExtraTabCompletion, Expect):
+              sage: singular._tab_completion()
+              ['exteriorPower',
+               ...
+-              'flintZ']
++              'crossprod']
+          """
+         p = re.compile("// *([a-z0-9A-Z_]*).*") #compiles regular expression
+         proclist = self.eval("listvar(proc)").splitlines()
+@@ -1183,7 +1183,7 @@ class Singular(ExtraTabCompletion, Expect):
+         EXAMPLES::
+ 
+             sage: singular.version()
+-            "Singular ... version 4.1.0 ...
++            "Singular ... version 4...
+         """
+         return singular_version()
+ 
+@@ -1562,7 +1562,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
+         elif charstr[0] in ['0', 'QQ']:
+             from sage.all import QQ
+             br = QQ
+-        elif charstr[0]=='real':
++        elif charstr[0].startswith('Float'):
+             from sage.all import RealField, ceil, log
+             prec = singular.eval('ringlist(basering)[1][2][1]')
+             br = RealField(ceil((ZZ(prec)+1)/log(2,10)))
+@@ -1750,7 +1750,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
+ 
+         # Singular 4 puts parentheses around floats and sign outside them
+         charstr = self.parent().eval('charstr(basering)').split(',',1)
+-        if charstr[0] in ['real', 'complex']:
++        if charstr[0]=='complex' or charstr[0].startswith('Float'):
+               for i in range(coeff_start, 2 * coeff_start):
+                   singular_poly_list[i] = singular_poly_list[i].replace('(','').replace(')','')
+ 
+@@ -1992,7 +1992,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
+             sage: S = singular.ring('real', '(a,b)', 'lp')
+             sage: singular.current_ring()
+             polynomial ring, over a field, global ordering
+-            //   coefficients: float
++            //   coefficients: Float()
+             //   number of vars : 2
+             //        block   1 : ordering lp
+             //                  : names    a b
+@@ -2072,7 +2072,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
+             sage: R._tab_completion()
+             ['exteriorPower',
+              ...
+-             'flintZ']
++             'crossprod']
+         """
+         return self.parent()._tab_completion()
+ 
+@@ -2358,7 +2358,7 @@ def singular_version():
+     EXAMPLES::
+ 
+         sage: singular.version()
+-        "Singular ... version 4.1.0 ...
++        "Singular ... version 4...
+     """
+     return singular.eval('system("--version");')
+ 
+diff --git a/src/sage/libs/singular/decl.pxd b/src/sage/libs/singular/decl.pxd
+index 4b658c4807..d863740419 100644
+--- a/src/sage/libs/singular/decl.pxd
++++ b/src/sage/libs/singular/decl.pxd
+@@ -170,7 +170,7 @@ cdef extern from "singular/Singular/libsingular.h":
+ 
+     int n_NumberOfParameters(const n_Procs_s* r)
+ 
+-    ctypedef struct poly "polyrec":
++    ctypedef struct poly "spolyrec":
+         poly *next
+         number *coef
+         unsigned long exp[1]
+@@ -630,9 +630,13 @@ cdef extern from "singular/Singular/libsingular.h":
+     # return p*q, destroys p and q
+     poly *p_Mult_q(poly *p, poly *q, ring *r)
+ 
++    # polynomial division, ignoring the rest
++    # via singclap_pdivide resp. idLift, destroys p,q
++    poly *p_Divide(poly *p, poly *q, ring *r)
++
+     # divide monomial p by monomial q, p,q const
+ 
+-    poly *pDivide(poly *p,poly *q)
++    poly *pMDivide(poly *p,poly *q)
+ 
+     # return the i-th power of p; p destroyed, requires global ring
+ 
+diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
+index 2a8d9ae021..aeff53af6c 100644
+--- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
++++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
+@@ -190,8 +190,8 @@ from sage.libs.singular.decl cimport (
+     n_IsUnit, n_Invers,
+     p_ISet, rChangeCurrRing, p_Copy, p_Init, p_SetCoeff, p_Setm, p_SetExp, p_Add_q,
+     p_NSet, p_GetCoeff, p_Delete, p_GetExp, pNext, rRingVar, omAlloc0, omStrDup,
+-    omFree, pDivide, p_SetCoeff0, n_Init, p_DivisibleBy, pLcm, p_LmDivisibleBy,
+-    pDivide, p_IsConstant, p_ExpVectorEqual, p_String, p_LmInit, n_Copy,
++    omFree, pMDivide, p_Divide, p_SetCoeff0, n_Init, p_DivisibleBy, pLcm, p_LmDivisibleBy,
++    pMDivide, p_IsConstant, p_ExpVectorEqual, p_String, p_LmInit, n_Copy,
+     p_IsUnit, p_Series, p_Head, idInit, fast_map_common_subexp, id_Delete,
+     p_IsHomogeneous, p_Homogen, p_Totaldegree,pLDeg1_Totaldegree, singclap_pdivide, singclap_factorize,
+     idLift, IDELEMS, On, Off, SW_USE_CHINREM_GCD, SW_USE_EZGCD,
+@@ -1693,8 +1693,8 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
+         if not g._poly:
+             raise ZeroDivisionError
+ 
+-        if r!=currRing: rChangeCurrRing(r)  # pDivide
+-        res = pDivide(f._poly, g._poly)
++        if r!=currRing: rChangeCurrRing(r)  # pMDivide
++        res = pMDivide(f._poly, g._poly)
+         if coeff:
+             if r.cf.type == n_unknown or r.cf.cfDivBy(p_GetCoeff(f._poly, r), p_GetCoeff(g._poly, r), r.cf):
+                 n = r.cf.cfDiv( p_GetCoeff(f._poly, r) , p_GetCoeff(g._poly, r), r.cf)
+@@ -1853,8 +1853,8 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
+                    and (<MPolynomial_libsingular>g) \
+                    and g.parent() is self \
+                    and p_LmDivisibleBy((<MPolynomial_libsingular>g)._poly, m, r):
+-                if r!=currRing: rChangeCurrRing(r)  # pDivide
+-                flt = pDivide(f._poly, (<MPolynomial_libsingular>g)._poly)
++                if r!=currRing: rChangeCurrRing(r)  # pMDivide
++                flt = pMDivide(f._poly, (<MPolynomial_libsingular>g)._poly)
+                 #p_SetCoeff(flt, n_Div( p_GetCoeff(f._poly, r) , p_GetCoeff((<MPolynomial_libsingular>g)._poly, r), r), r)
+                 p_SetCoeff(flt, n_Init(1, r), r)
+                 return new_MP(self,flt), g
+@@ -4023,16 +4023,6 @@ cdef class MPolynomial_libsingular(MPolynomial):
+             Traceback (most recent call last):
+             ...
+             NotImplementedError: Division of multivariate polynomials over non fields by non-monomials not implemented.
+-
+-        TESTS::
+-
+-            sage: P.<x,y> = ZZ[]
+-            sage: p = 3*(-x^8*y^2 - x*y^9 + 6*x^8*y + 17*x^2*y^6 - x^3*y^2)
+-            sage: q = 7*(x^2 + x*y + y^2 + 1)
+-            sage: p*q//q == p
+-            True
+-            sage: p*q//p == q
+-            True
+         """
+         cdef MPolynomialRing_libsingular parent = self._parent
+         cdef ring *r = self._parent_ring
+@@ -4052,13 +4042,18 @@ cdef class MPolynomial_libsingular(MPolynomial):
+         _right = <MPolynomial_libsingular>right
+ 
+         if r.cf.type != n_unknown:
++            if r.cf.type == n_Z:
++                P = parent.change_ring(RationalField())
++                f = P(self)//P(right)
++                CM = list(f)
++                return parent(sum([c.floor()*m for c,m in CM]))
+             if _right.is_monomial():
+                 p = _self._poly
+                 quo = p_ISet(0,r)
+-                if r != currRing: rChangeCurrRing(r)   # pDivide
++                if r != currRing: rChangeCurrRing(r)   # pMDivide
+                 while p:
+                     if p_DivisibleBy(_right._poly, p, r):
+-                        temp = pDivide(p, _right._poly)
++                        temp = pMDivide(p, _right._poly)
+                         p_SetCoeff0(temp, n_Copy(p_GetCoeff(p, r), r), r)
+                         quo = p_Add_q(quo, temp, r)
+                     p = pNext(p)
+@@ -4794,6 +4789,8 @@ cdef class MPolynomial_libsingular(MPolynomial):
+             sage: p = -x*y + x*z + 54*x - 2
+             sage: (5*p^2).lcm(3*p) == 15*p^2
+             True
++            sage: lcm(2*x,2*x*y)
++            2*x*y
+         """
+         cdef ring *_ring = self._parent_ring
+         cdef poly *ret
+@@ -4821,9 +4818,7 @@ cdef class MPolynomial_libsingular(MPolynomial):
+         if _ring!=currRing: rChangeCurrRing(_ring)  # singclap_gcd
+         gcd = singclap_gcd(p_Copy(self._poly, _ring), p_Copy(_g._poly, _ring), _ring )
+         prod = pp_Mult_qq(self._poly, _g._poly, _ring)
+-        ret = singclap_pdivide(prod , gcd , _ring)
+-        p_Delete(&prod, _ring)
+-        p_Delete(&gcd, _ring)
++        ret = p_Divide(prod, gcd, _ring)
+         if count >= 20:
+             sig_off()
+         return new_MP(self._parent, ret)
+@@ -4866,7 +4861,7 @@ cdef class MPolynomial_libsingular(MPolynomial):
+             sage: f.quo_rem(y)
+             (2*x^2, x + 1)
+             sage: f.quo_rem(3*x)
+-            (2*x*y + 1, -4*x^2*y - 2*x + 1)
++            (0, 2*x^2*y + x + 1)
+ 
+         TESTS::
+ 
+@@ -4888,7 +4883,7 @@ cdef class MPolynomial_libsingular(MPolynomial):
+         if right.is_zero():
+             raise ZeroDivisionError
+ 
+-        if not self._parent._base.is_field() and not is_IntegerRing(self._parent._base):
++        if not self._parent._base.is_field():
+             py_quo = self//right
+             py_rem = self - right*py_quo
+             return py_quo, py_rem
+diff --git a/src/sage/rings/polynomial/plural.pyx b/src/sage/rings/polynomial/plural.pyx
+index d5439f7f08..ad20ebcca0 100644
+--- a/src/sage/rings/polynomial/plural.pyx
++++ b/src/sage/rings/polynomial/plural.pyx
+@@ -998,7 +998,7 @@ cdef class NCPolynomialRing_plural(Ring):
+         if not g._poly:
+             raise ZeroDivisionError
+ 
+-        res = pDivide(f._poly,g._poly)
++        res = pMDivide(f._poly,g._poly)
+         if coeff:
+             if (r.cf.type == n_unknown) or r.cf.cfDivBy(p_GetCoeff(f._poly, r), p_GetCoeff(g._poly, r), r.cf):
+                 n = r.cf.cfDiv( p_GetCoeff(f._poly, r) , p_GetCoeff(g._poly, r), r.cf)
+@@ -1193,7 +1193,7 @@ cdef class NCPolynomialRing_plural(Ring):
+             if isinstance(g, NCPolynomial_plural) \
+                    and (<NCPolynomial_plural>g) \
+                    and p_LmDivisibleBy((<NCPolynomial_plural>g)._poly, m, r):
+-                flt = pDivide(f._poly, (<NCPolynomial_plural>g)._poly)
++                flt = pMDivide(f._poly, (<NCPolynomial_plural>g)._poly)
+                 #p_SetCoeff(flt, n_Div( p_GetCoeff(f._poly, r) , p_GetCoeff((<NCPolynomial_plural>g)._poly, r), r), r)
+                 p_SetCoeff(flt, n_Init(1, r), r)
+                 return new_NCP(self,flt), g
+diff --git a/src/sage/rings/polynomial/polynomial_singular_interface.py b/src/sage/rings/polynomial/polynomial_singular_interface.py
+index 9331169f8b..f753610fd3 100644
+--- a/src/sage/rings/polynomial/polynomial_singular_interface.py
++++ b/src/sage/rings/polynomial/polynomial_singular_interface.py
+@@ -81,8 +81,8 @@ class PolynomialRing_singular_repr:
+             sage: R.<x,y> = PolynomialRing(CC)
+             sage: singular(R)
+             polynomial ring, over a field, global ordering
+-            //   coefficients: float[I](complex:15 digits, additional 0 digits)/(I^2+1)
+-            //   number of vars : 2
++            // coefficients: real[I](complex:15 digits, additional 0 digits)/(I^2+1)
++            // number of vars : 2
+             //        block   1 : ordering dp
+             //                  : names    x y
+             //        block   2 : ordering C
+@@ -90,8 +90,8 @@ class PolynomialRing_singular_repr:
+             sage: R.<x,y> = PolynomialRing(RealField(100))
+             sage: singular(R)
+             polynomial ring, over a field, global ordering
+-            //   coefficients: float
+-            //   number of vars : 2
++            // coefficients: Float()
++            // number of vars : 2
+             //        block   1 : ordering dp
+             //                  : names    x y
+             //        block   2 : ordering C
diff --git a/pkgs/applications/science/math/sage/patches/sphinx-1.7.patch b/pkgs/applications/science/math/sage/patches/sphinx-1.7.patch
deleted file mode 100644
index c67b8942e28b..000000000000
--- a/pkgs/applications/science/math/sage/patches/sphinx-1.7.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-diff --git a/src/bin/sage b/src/bin/sage
-index 397f30cbed..3fc473c343 100755
---- a/src/bin/sage
-+++ b/src/bin/sage
-@@ -980,8 +980,11 @@ if [ "$1" = '-rsyncdist' -o "$1" = "--rsyncdist" ]; then
- fi
- 
- if [ "$1" = "-docbuild" -o "$1" = "--docbuild" ]; then
-+    # Redirect stdin from /dev/null. This helps with running TeX which
-+    # tends to ask interactive questions if something goes wrong. These
-+    # cause the build to hang. If stdin is /dev/null, TeX just aborts.
-     shift
--    exec sage-python23 -m "sage_setup.docbuild" "$@"
-+    exec sage-python23 -m sage_setup.docbuild "$@" </dev/null
- fi
- 
- if [ "$1" = '-gdb' -o "$1" = "--gdb" ]; then
-diff --git a/src/doc/common/conf.py b/src/doc/common/conf.py
-index 25f94f7b7d..3f07474d9b 100644
---- a/src/doc/common/conf.py
-+++ b/src/doc/common/conf.py
-@@ -627,7 +627,7 @@ def call_intersphinx(app, env, node, contnode):
-         sage: for line in open(thematic_index).readlines():
-         ....:     if "padics" in line:
-         ....:         sys.stdout.write(line)
--        <li><a class="reference external" href="../reference/padics/sage/rings/padics/tutorial.html#sage-rings-padics-tutorial" title="(in Sage Reference Manual: p-Adics ...)"><span>Introduction to the -adics</span></a></li>
-+        <li><a class="reference external" href="../reference/padics/sage/rings/padics/tutorial.html#sage-rings-padics-tutorial" title="(in Sage Reference Manual: p-Adics v...)"><span>Introduction to the -adics</span></a></li>
-     """
-     debug_inf(app, "???? Trying intersphinx for %s"%node['reftarget'])
-     builder = app.builder
-diff --git a/src/sage/misc/sphinxify.py b/src/sage/misc/sphinxify.py
-index 4f76d4113a..8f426b5989 100644
---- a/src/sage/misc/sphinxify.py
-+++ b/src/sage/misc/sphinxify.py
-@@ -47,11 +47,11 @@ def sphinxify(docstring, format='html'):
- 
-         sage: from sage.misc.sphinxify import sphinxify
-         sage: sphinxify('A test')
--        '...<div class="docstring">\n    \n  <p>A test</p>\n\n\n</div>'
-+        '<div class="docstring">\n    \n  <p>A test</p>\n\n\n</div>'
-         sage: sphinxify('**Testing**\n`monospace`')
--        '...<div class="docstring"...<strong>Testing</strong>\n<span class="math"...</p>\n\n\n</div>'
-+        '<div class="docstring"...<strong>Testing</strong>\n<span class="math...</p>\n\n\n</div>'
-         sage: sphinxify('`x=y`')
--        '...<div class="docstring">\n    \n  <p><span class="math">x=y</span></p>\n\n\n</div>'
-+        '<div class="docstring">\n    \n  <p><span class="math notranslate nohighlight">x=y</span></p>\n\n\n</div>'
-         sage: sphinxify('`x=y`', format='text')
-         'x=y\n'
-         sage: sphinxify(':math:`x=y`', format='text')
-diff --git a/src/sage_setup/docbuild/sphinxbuild.py b/src/sage_setup/docbuild/sphinxbuild.py
-index fda76a4174..d3413239dd 100644
---- a/src/sage_setup/docbuild/sphinxbuild.py
-+++ b/src/sage_setup/docbuild/sphinxbuild.py
-@@ -207,7 +207,7 @@ def runsphinx():
-     try:
-         sys.stdout = SageSphinxLogger(sys.stdout, os.path.basename(output_dir))
-         sys.stderr = SageSphinxLogger(sys.stderr, os.path.basename(output_dir))
--        sphinx.cmdline.main(sys.argv)
-+        sphinx.cmdline.main(sys.argv[1:])
-     finally:
-         sys.stdout = saved_stdout
-         sys.stderr = saved_stderr
diff --git a/pkgs/applications/science/math/sage/patches/spkg-scripts.patch b/pkgs/applications/science/math/sage/patches/spkg-scripts.patch
new file mode 100644
index 000000000000..4d37998b288b
--- /dev/null
+++ b/pkgs/applications/science/math/sage/patches/spkg-scripts.patch
@@ -0,0 +1,46 @@
+commit f02714d4aea80e17cb8df62bab75d7c1a1b61a8e
+Author: Timo Kaufmann <timokau@zoho.com>
+Date:   Mon Jul 9 18:26:18 2018 +0200
+
+    Don't attempt to create dirs when showing pkg info
+    
+    The script dir cannot be assumed to be writeable after installation.
+
+diff --git a/build/bin/sage-spkg b/build/bin/sage-spkg
+index f3e02aeae5..190d558ad1 100755
+--- a/build/bin/sage-spkg
++++ b/build/bin/sage-spkg
+@@ -167,14 +167,6 @@ if [ -z "$SAGE_BUILD_DIR" ]; then
+     export SAGE_BUILD_DIR="$SAGE_LOCAL/var/tmp/sage/build"
+ fi
+ 
+-for dir in "$SAGE_SPKG_INST" "$SAGE_SPKG_SCRIPTS"; do
+-    mkdir -p "$dir"
+-    if [ $? -ne 0 ]; then
+-        error_msg "Error creating directory $dir"
+-        exit 1
+-    fi
+-done
+-
+ 
+ # Remove '.' from PYTHONPATH, which may also come from SAGE_PATH, to avoid
+ # trouble with setuptools / easy_install (cf. #10192, #10176):
+@@ -563,11 +555,13 @@ fi
+ # Setup directories
+ ##################################################################
+ 
+-mkdir -p "$SAGE_BUILD_DIR"
+-if [ $? -ne 0 ]; then
+-    error_msg "Error creating directory $SAGE_BUILD_DIR"
+-    exit 1
+-fi
++for dir in "$SAGE_SPKG_INST" "$SAGE_SPKG_SCRIPTS" "$SAGE_BUILD_DIR"; do
++    mkdir -p "$dir"
++    if [ $? -ne 0 ]; then
++        error_msg "Error creating directory $dir"
++        exit 1
++    fi
++done
+ 
+ # Trac #5852: check write permissions
+ if [ ! -w "$SAGE_BUILD_DIR" ]; then
diff --git a/pkgs/applications/science/math/sage/patches/zn_poly_version.patch b/pkgs/applications/science/math/sage/patches/zn_poly_version.patch
deleted file mode 100644
index 92ea4303e477..000000000000
--- a/pkgs/applications/science/math/sage/patches/zn_poly_version.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/src/sage/misc/package.py b/src/sage/misc/package.py
-index 7ff4f21675..1d72168833 100644
---- a/src/sage/misc/package.py
-+++ b/src/sage/misc/package.py
-@@ -350,7 +350,7 @@ def package_versions(package_type, local=False):
-         sage: 'gap' in std
-         True
-         sage: std['zn_poly']
--        ('0.9.p11', '0.9.p11')
-+        ('0.9', '0.9.p11')
-     """
-     return {pkg['name']: (pkg['installed_version'], pkg['remote_version']) for pkg in list_packages(package_type, local=local).values()}
- 
diff --git a/pkgs/applications/science/math/sage/sage-src.nix b/pkgs/applications/science/math/sage/sage-src.nix
index c97785c574cb..096f2212cc49 100644
--- a/pkgs/applications/science/math/sage/sage-src.nix
+++ b/pkgs/applications/science/math/sage/sage-src.nix
@@ -3,17 +3,20 @@
 , fetchpatch
 }:
 stdenv.mkDerivation rec {
-  version = "8.2";
+  version = "8.3";
   name = "sage-src-${version}";
 
   src = fetchFromGitHub {
     owner = "sagemath";
     repo = "sage";
     rev = version;
-    sha256 = "0d7vc16s7dj23an2cb8v5bhbnc6nsw20qhnnxr0xh8qg629027b8";
+    sha256 = "0mbm99m5xry21xpi4q3q96gx392liwbifywf5awvl0j85a7rkfyx";
   };
 
   nixPatches = [
+    # https://trac.sagemath.org/ticket/25809
+    ./patches/spkg-scripts.patch
+
     # https://trac.sagemath.org/ticket/25309
     (fetchpatch {
       name = "spkg-paths.patch";
@@ -26,14 +29,7 @@ stdenv.mkDerivation rec {
       sha256 = "14s50yg3hpw9cp3v581dx7zfmpm2j972im7x30iwki8k45mjvk3i";
     })
 
-    # https://trac.sagemath.org/ticket/25328
-    # https://trac.sagemath.org/ticket/25546
     # https://trac.sagemath.org/ticket/25722
-    (fetchpatch {
-      name = "install-jupyter-kernel-in-correct-prefix.patch";
-      url = "https://git.sagemath.org/sage.git/patch?id=72167b98e3f64326df6b2c78785df25539472fcc";
-      sha256 = "0pscnjhm7r2yr2rxnv4kkkq626vwaja720lixa3m3w9rwlxll5a7";
-    })
     ./patches/test-in-tmpdir.patch
 
     # https://trac.sagemath.org/ticket/25358
@@ -43,27 +39,13 @@ stdenv.mkDerivation rec {
       sha256 = "1hhannz7xzprijakn2w2d0rhd5zv2zikik9p51i87bas3nc658f7";
     })
 
-    # https://trac.sagemath.org/ticket/25357 rebased on 8.2
-    ./patches/python3-syntax-without-write.patch
-
-    # https://trac.sagemath.org/ticket/25314
-    (fetchpatch {
-      name = "make-qepcad-test-optional.patch";
-      url = "https://git.sagemath.org/sage.git/patch/?h=fe294c58bd035ef427e268901d54a6faa0058138";
-      sha256 = "003d5baf5c0n5rfg010ijwkwz8kg0s414cxwczs2vhdayxdixbix";
-    })
-
+    # Unfortunately inclusion in upstream sage was rejected. Instead the bug was
+    # fixed in python, but of course not backported to 2.7. So we'll probably
+    # have to keep this around until 2.7 is deprecated.
     # https://trac.sagemath.org/ticket/25316
+    # https://github.com/python/cpython/pull/7476
     ./patches/python-5755-hotpatch.patch
 
-    # https://trac.sagemath.org/ticket/25354
-    # https://trac.sagemath.org/ticket/25531
-    (fetchpatch {
-      name = "cysignals-include.patch";
-      url = "https://git.sagemath.org/sage.git/patch/?h=28778bd25a37c80884d2b24e0683fb2989300cef";
-      sha256 = "0fiiiw91pgs8avm9ggj8hb64bhqzl6jcw094d94nhirmh8w2jmc5";
-    })
-
     # https://trac.sagemath.org/ticket/25315
     (fetchpatch {
       name = "find-libraries-in-dyld-library-path.patch";
@@ -71,16 +53,13 @@ stdenv.mkDerivation rec {
       sha256 = "1k3afq3qlzmgqwx6rzs5wv153vv9dsf5rk8pi61g57l3r3npbjmc";
     })
 
-    # Pari upstream has since accepted a patch, so this patch won't be necessary once sage updates pari.
-    # https://trac.sagemath.org/ticket/25312
-    ./patches/pari-stackwarn.patch
-
-    # https://trac.sagemath.org/ticket/25311
-    ./patches/zn_poly_version.patch
-
     # https://trac.sagemath.org/ticket/25345
     # (upstream patch doesn't apply on 8.2 source)
     ./patches/dochtml-optional.patch
+
+    # work with pari with threads enabled at compile time (disable them at runtime)
+    # https://trac.sagemath.org/ticket/26002
+    ./patches/pari-no-threads.patch
   ];
 
   packageUpgradePatches = [
@@ -106,87 +85,62 @@ stdenv.mkDerivation rec {
     # the last version.
     ./patches/eclib-regulator-precision.patch
 
-    # sphinx 1.6 -> 1.7 upgrade
-    # https://trac.sagemath.org/ticket/24935
-    ./patches/sphinx-1.7.patch
-
-    # Adapt hashes to new boost version
-    # https://trac.sagemath.org/ticket/22243
-    # (this ticket doesn't only upgrade boost but also avoids this problem in the future)
-    (fetchpatch {
-      name = "boost-upgrade.patch";
-      url = "https://git.sagemath.org/sage.git/patch?id=a24a9c6b30b93957333a3116196214a931325b69";
-      sha256 = "0z3870g2ms2a81vnw08dc2i4k7jr62w8fggvcdwaavgd1wvdxwfl";
-    })
-
-    # gfan 0.6.2
-    # https://trac.sagemath.org/ticket/23353
-    (fetchpatch {
-      name = "gfan-update.patch";
-      url = "https://git.sagemath.org/sage.git/patch/?h=420215fc469cde733ec7a339e59b78ad6eec804c&id=112498a293ea2bf563e41aed35f1aa608f01b349";
-      sha256 = "0ga3hkx8cr23dpc919lgvpi5lmy0d728jkq9z6kf0fl9s8g31mxb";
-    })
-
     # New glpk version has new warnings, filter those out until upstream sage has found a solution
     # https://trac.sagemath.org/ticket/24824
+    ./patches/pari-stackwarn.patch # not actually necessary since tha pari upgrade, but necessary for the glpk patch to apply
     (fetchpatch {
       url = "https://salsa.debian.org/science-team/sagemath/raw/58bbba93a807ca2933ca317501d093a1bb4b84db/debian/patches/dt-version-glpk-4.65-ignore-warnings.patch";
       sha256 = "0b9293v73wb4x13wv5zwyjgclc01zn16msccfzzi6znswklgvddp";
       stripLen = 1;
     })
 
-    # https://trac.sagemath.org/ticket/25329
+    # Only formatting changes.
+    # https://trac.sagemath.org/ticket/25260
+    ./patches/numpy-1.14.3.patch
+
+    # https://trac.sagemath.org/ticket/25862
+    ./patches/eclib-20180710.patch
+
+    # https://trac.sagemath.org/ticket/24735
+    ./patches/singular-4.1.1p2.patch
+
+    # https://trac.sagemath.org/ticket/25567 and dependency #25635
     (fetchpatch {
-      name = "dont-check-exact-glpk-version.patch";
-      url = "https://git.sagemath.org/sage.git/patch?id2=8bdc326ba57d1bb9664f63cf165a9e9920cc1afc&id=89d068d8d77316bfffa6bf8e9ebf70b3b3b88e5c";
-      sha256 = "00knwxs6fmymfgfl0q5kcavmxm9sf90a4r76y35n5s55gj8pl918";
+      name = "pari-upgrade-dependency.patch";
+      url = "https://git.sagemath.org/sage.git/patch/?id=6995e7cae1b3476ad0145f8dfc897cf91f0c3c4d";
+      sha256 = "1dvhabl1c9pwd9xkjvbjjg15mvb14b24p1f3cby1mlqk34d4lrs6";
     })
-
-    # https://trac.sagemath.org/ticket/25355
     (fetchpatch {
-      name = "maxima-5.41.0.patch";
-      url = "https://git.sagemath.org/sage.git/patch/?id=87328023c4739abdf24108038201e3fa9bdfc739";
-      sha256 = "0hxi7qr5mfx1bc32r8j7iba4gzd7c6v63asylyf5cbyp86azpb7i";
+      name = "pari-2.11.0.patch";
+      url = "https://git.sagemath.org/sage.git/patch/?id=7af4748cab37d651eaa88be501db88f4a5ffc584";
+      sha256 = "13f740ly3c19gcmhjngiycvmc3mcfj61y00i6jv0wmfgpm2z3ank";
     })
 
-    # Update cddlib from 0.94g to 0.94h.
-    # https://trac.sagemath.org/ticket/25341 (doesn't apply to 8.2 sources)
+    # ntl upgrade
     (fetchpatch {
-      url = "https://salsa.debian.org/science-team/sagemath/raw/58bbba93a807ca2933ca317501d093a1bb4b84db/debian/patches/u2-version-cddlib-094h.patch";
-      sha256 = "0fmw7pzbaxs2dshky6iw9pr8i23p9ih2y2lw661qypdrxh5xw03k";
-      stripLen = 1;
+      name = "lcalc-c++11.patch";
+      url = "https://git.archlinux.org/svntogit/community.git/plain/trunk/sagemath-lcalc-c++11.patch?h=packages/sagemath&id=0e31ae526ab7c6b5c0bfacb3f8b1c4fd490035aa";
+      sha256 = "0p5wnvbx65i7cp0bjyaqgp4rly8xgnk12pqwaq3dqby0j2bk6ijb";
     })
+
+    # cddlib 0.94i -> 0.94j
     (fetchpatch {
-      name = "revert-cddlib-doctest-changes.patch";
-      url = "https://git.sagemath.org/sage.git/patch/?id=269c1e1551285566b8ba7a2b890989e5590e9f11";
-      sha256 = "12bcjhq7hm2pmmj2bgjvcffjyls2x7q61ivlnaj5v5bsvhc183iy";
-      revert = true;
+      name = "cddlib-0.94j.patch";
+      url = "https://git.sagemath.org/sage.git/patch/?id=2ab1546b3e21d1d0ab3b4fcd58576848b3a2d888";
+      sha256 = "1c5gnasq7y9xxj762bn79bis0zi8d9bgg7jzlf64ifixsrc5cymb";
     })
 
-
-    # Only formatting changes.
-    # https://trac.sagemath.org/ticket/25260
-    ./patches/numpy-1.14.3.patch
-
-    # https://trac.sagemath.org/ticket/24374
+    # arb 2.13.0 -> 2.14.0
     (fetchpatch {
-      name = "networkx-2.1.patch";
-      url = "https://salsa.debian.org/science-team/sagemath/raw/487df9ae48ca1d93d9b1cb3af8745d31e30fb741/debian/patches/u0-version-networkx-2.1.patch";
-      sha256 = "1xxxawygbgxgvlv7b4w8hhzgdnva4rhmgdxaiaa3pwdwln0yc750";
-      stripLen = 1;
+      name = "arb-2.14.0.patch";
+      url = "https://git.sagemath.org/sage.git/patch?id2=8.4.beta0&id=8bef4fd2876a61969b516fe4eb3b8ad7cc076c5e";
+      sha256 = "00p3hfsfn3w2vxgd9fjd23mz7xfxjfravf8ysjxkyd657jbkpjmk";
     })
-
-    # https://trac.sagemath.org/ticket/24927 rebased
-    ./patches/arb-2.13.0.patch
-
-    # https://trac.sagemath.org/ticket/24838 rebased
-    ./patches/pynac-0.7.22.patch
-
-    # https://trac.sagemath.org/ticket/25862
-    ./patches/eclib-20180710.patch
   ];
 
-  patches = nixPatches ++ packageUpgradePatches;
+  patches = nixPatches ++ packageUpgradePatches ++ [
+    ./patches/known-padics-bug.patch
+  ];
 
   postPatch = ''
     # make sure shebangs etc are fixed, but sage-python23 still works
diff --git a/pkgs/applications/science/math/scilab-bin/default.nix b/pkgs/applications/science/math/scilab-bin/default.nix
index ad0231d37b0e..dacd3e730736 100644
--- a/pkgs/applications/science/math/scilab-bin/default.nix
+++ b/pkgs/applications/science/math/scilab-bin/default.nix
@@ -3,7 +3,7 @@
 let
   name = "scilab-bin-${ver}";
 
-  ver = "5.5.2";
+  ver = "6.0.1";
 
   majorVer = builtins.elemAt (lib.splitString "." ver) 0;
 
@@ -24,9 +24,9 @@ stdenv.mkDerivation rec {
     url = "https://www.scilab.org/download/${ver}/scilab-${ver}.bin.linux-${architecture}.tar.gz";
     sha256 =
       if stdenv.system == "i686-linux" then
-        "6143a95ded40411a35630a89b365875a6526cd4db1e2865ac5612929a7db937a"
+        "0fgjc2ak3b2qi6yin3fy50qwk2bcj0zbz1h4lyyic9n1n1qcliib"
       else if stdenv.system == "x86_64-linux" then
-        "c0dd7a5f06ec7a1df7a6b1b8b14407ff7f45e56821dff9b3c46bd09d4df8d350"
+        "1scswlznc14vyzg0gqa1q9gcpwx05kz1sbn563463mzkdp7nd35d"
       else
         badArch;
   };
diff --git a/pkgs/applications/science/math/scilab/default.nix b/pkgs/applications/science/math/scilab/default.nix
index 6063a45a3efb..96b7dec19c21 100644
--- a/pkgs/applications/science/math/scilab/default.nix
+++ b/pkgs/applications/science/math/scilab/default.nix
@@ -29,35 +29,29 @@ stdenv.mkDerivation rec {
 /*
   --with-atlas-library=DIR  Atlas library files are in DIR and we use Atlas
 */
-  configureFlags = ""
-  # use gcc C compiler and gnu Fortran compiler (g77 or gfortran)
-  + " --with-gcc --with-g77"
-  # use Xaw3d widgets given with Scilab
-  + (lib.optionalString (!withXaw3d) " --with-local-xaw")
-  # do not compile with PVM library
-  + " --without-pvm"
-  # compile with GTK
-  + (if withGtk then "
-       --with-gtk --with-gtk2
-    " else "
-       --without-gtk --without-gtk2
-    ")
-  # compile with TCL/TK
-  + (lib.optionalString withTk "
-       --with-tk
-       --with-tcl-library=${tcl}/lib
-       --with-tcl-include=${tcl}/include
-       --with-tk-library=${tk}/lib
-       --with-tk-include=${tk}/include
-    ")
-  # do not use Gtk widgets
-  + " --without-gtk --without-gtk2"
-  # compile with ocaml
-  + (if withOCaml then " --with-ocaml" else " --without-ocaml")
-  # do not compile Java interface
-  + " --without-java"
-  # use the X Window System
-  + lib.optionalString withX "--with-x"
+  configureFlags = [
+    # use gcc C compiler and gnu Fortran compiler (g77 or gfortran)
+    "--with-gcc" "--with-g77"
+    # do not compile with PVM library
+    "--without-pvm"
+    # compile with GTK
+    (stdenv.lib.enableFeature withGtk "gtk")
+    (stdenv.lib.enableFeature withGtk "gtk2")
+    # compile with ocaml
+    (stdenv.lib.withFeature withOCaml "ocaml")
+    # do not compile Java interface
+    "--without-java"
+    # use the X Window System
+    (stdenv.lib.withFeature withX "x")
+    # compile with TCL/TK
+  ] ++ lib.optionals withTk [
+    "--with-tk"
+    "--with-tcl-library=${tcl}/lib"
+    "--with-tcl-include=${tcl}/include"
+    "--with-tk-library=${tk}/lib"
+    "--with-tk-include=${tk}/include"
+  ]    # use Xaw3d widgets given with Scilab
+    ++ lib.optional (!withXaw3d) "--with-local-xaw"
   ;
 
   makeFlags = "all";
diff --git a/pkgs/applications/science/math/singular/default.nix b/pkgs/applications/science/math/singular/default.nix
index 98b75cd22d05..24063216db04 100644
--- a/pkgs/applications/science/math/singular/default.nix
+++ b/pkgs/applications/science/math/singular/default.nix
@@ -1,5 +1,6 @@
 { stdenv, fetchurl, gmp, bison, perl, ncurses, readline, coreutils, pkgconfig
 , lib
+, fetchpatch
 , autoreconfHook
 , file
 , flint
@@ -36,6 +37,18 @@ stdenv.mkDerivation rec {
     patchShebangs .
   '';
 
+  patches = [
+    # NTL error handler was introduced in the library part, preventing users of
+    # the library from implementing their own error handling
+    # https://www.singular.uni-kl.de/forum/viewtopic.php?t=2769
+    (fetchpatch {
+      name = "move_error_handler_out_of_libsingular.patch";
+      # rebased version of https://github.com/Singular/Sources/commit/502cf86d0bb2a96715be6764774b64a69c1ca34c.patch
+      url = "https://git.sagemath.org/sage.git/plain/build/pkgs/singular/patches/singular-ntl-error-handler.patch?h=50b9ae2fd233c30860e1cbb3e63a26f2cc10560a";
+      sha256 = "0vgh4m9zn1kjl0br68n04j4nmn5i1igfn28cph0chnwf7dvr9194";
+    })
+  ];
+
   # For reference (last checked on commit 75f460d):
   # https://github.com/Singular/Sources/blob/spielwiese/doc/Building-Singular-from-source.md
   # https://github.com/Singular/Sources/blob/spielwiese/doc/external-packages-dynamic-modules.md
diff --git a/pkgs/applications/science/math/symmetrica/default.nix b/pkgs/applications/science/math/symmetrica/default.nix
index 6123fd7306d9..a641993b393b 100644
--- a/pkgs/applications/science/math/symmetrica/default.nix
+++ b/pkgs/applications/science/math/symmetrica/default.nix
@@ -5,20 +5,15 @@
 stdenv.mkDerivation rec {
   name = "symmetrica-${version}";
   version = "2.0";
+
   src = fetchurl {
     url = "http://www.algorithm.uni-bayreuth.de/en/research/SYMMETRICA/SYM2_0_tar.gz";
     sha256 = "1qhfrbd5ybb0sinl9pad64rscr08qvlfzrzmi4p4hk61xn6phlmz";
     name = "symmetrica-2.0.tar.gz";
   };
+
   sourceRoot = ".";
-  installPhase = ''
-    mkdir -p "$out"/{lib,share/doc/symmetrica,include/symmetrica}
-    ar crs libsymmetrica.a *.o
-    ranlib libsymmetrica.a
-    cp libsymmetrica.a "$out/lib"
-    cp *.h "$out/include/symmetrica"
-    cp README *.doc "$out/share/doc/symmetrica"
-  '';
+
   patches = [
       # don't show banner ("SYMMETRICA VERSION X - STARTING)
       # it doesn't contain very much helpful information and a banner is not ideal for a library
@@ -34,13 +29,34 @@ stdenv.mkDerivation rec {
         url = "https://git.sagemath.org/sage.git/plain/build/pkgs/symmetrica/patches/int32.patch?id=07d6c37d18811e2b377a9689790a7c5e24da16ba";
         sha256 = "0p33c85ck4kd453z687ni4bdcqr1pqx2756j7aq11bf63vjz4cyz";
       })
+
+      (fetchpatch {
+        url = "https://git.sagemath.org/sage.git/plain/build/pkgs/symmetrica/patches/return_values.patch?id=1615f58890e8f9881c4228c78a6b39b9aab1303a";
+        sha256 = "0dmczkicwl50sivc07w3wm3jpfk78wm576dr25999jdj2ipsb7nk";
+      })
   ];
+
+  postPatch = ''
+    substituteInPlace makefile --replace gcc cc
+  '';
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    mkdir -p "$out"/{lib,share/doc/symmetrica,include/symmetrica}
+    ar crs libsymmetrica.a *.o
+    ranlib libsymmetrica.a
+    cp libsymmetrica.a "$out/lib"
+    cp *.h "$out/include/symmetrica"
+    cp README *.doc "$out/share/doc/symmetrica"
+  '';
+
   meta = {
     inherit version;
     description = ''A collection of routines for representation theory and combinatorics'';
     license = stdenv.lib.licenses.publicDomain;
     maintainers = [stdenv.lib.maintainers.raskin];
-    platforms = stdenv.lib.platforms.linux;
+    platforms = stdenv.lib.platforms.unix;
     homepage = http://www.symmetrica.de/;
   };
 }