diff --git a/gnu/local.mk b/gnu/local.mk
index c20e93390d..38a2d8d2e3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1,6 +1,6 @@
 # GNU Guix --- Functional package management for GNU
 # Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org>
-# Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2022, 2023 Andreas Enge <andreas@enge.fr>
+# Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2022, 2023, 2024 Andreas Enge <andreas@enge.fr>
 # Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 # Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Mark H Weaver <mhw@netris.org>
 # Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
@@ -927,7 +927,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/apr-skip-getservbyname-test.patch	\
   %D%/packages/patches/aria2-unbundle-wslay.patch		\
   %D%/packages/patches/ark-skip-xar-test.patch			\
-  %D%/packages/patches/arpack-ng-propagate-rng-state.patch	\
   %D%/packages/patches/asli-use-system-libs.patch		\
   %D%/packages/patches/aspell-CVE-2019-25051.patch		\
   %D%/packages/patches/aspell-default-dict-dir.patch		\
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 16cd3454ae..a6a2f4aecb 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -1053,7 +1053,7 @@ (define-public vinci
 (define-public arpack-ng
   (package
     (name "arpack-ng")
-    (version "3.9.0")
+    (version "3.9.1")
     (home-page "https://github.com/opencollab/arpack-ng")
     (source (origin
               (method git-fetch)
@@ -1061,8 +1061,7 @@ (define-public arpack-ng
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "09smxilyn8v9xs3kpx3nlj2s7ql3v8z40mpc09kccbb6smyd35iv"))
-              (patches (search-patches "arpack-ng-propagate-rng-state.patch"))))
+                "0bbw6a48py9fjlif2n4x75skyjskq2hghffjqzm85wnsnsjdlaqw"))))
     (build-system cmake-build-system)
     (arguments
      '(#:configure-flags '("-DICB=ON")))
diff --git a/gnu/packages/patches/arpack-ng-propagate-rng-state.patch b/gnu/packages/patches/arpack-ng-propagate-rng-state.patch
deleted file mode 100644
index 4466bb8e50..0000000000
--- a/gnu/packages/patches/arpack-ng-propagate-rng-state.patch
+++ /dev/null
@@ -1,523 +0,0 @@
-Fix a bug that manifests while running the test suite of 'python-igraph':
-
-  https://github.com/opencollab/arpack-ng/issues/401
-  https://github.com/opencollab/arpack-ng/pull/414
-
-From d885b7be4ecdc9c1496f2d6f256f6c0d34962459 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Szabolcs=20Horva=CC=81t?= <szhorvat@gmail.com>
-Date: Sun, 9 Apr 2023 16:36:35 +0200
-Subject: [PATCH] fix: ensure that LAPACK RNG state is propagated
-
- - fixes #401, #410, #411
- - restores 'inits' variable removed in ce2e69a849da1d10dad5d6d3ec4db6120b3ecf50, ensuring that the RNG state is propagated
- - reverts e0d67054f573da351f12a226f7c7cc65a690ef3d to ensure that seed is different on each parallel thread
- - updates seed initialization of parallel pdgetv0/psgetv0 so that they match that of pzgetv0/pcgetv0
----
- PARPACK/SRC/MPI/pcgetv0.f | 48 +++++++++++++++++++++++----------------
- PARPACK/SRC/MPI/pdgetv0.f | 40 ++++++++++++++++++++++++++------
- PARPACK/SRC/MPI/psgetv0.f | 43 ++++++++++++++++++++++++++---------
- PARPACK/SRC/MPI/pzgetv0.f | 48 +++++++++++++++++++++++----------------
- SRC/cgetv0.f              | 21 ++++++++++++-----
- SRC/dgetv0.f              | 21 ++++++++++++-----
- SRC/sgetv0.f              | 21 ++++++++++++-----
- SRC/zgetv0.f              | 21 ++++++++++++-----
- 8 files changed, 183 insertions(+), 80 deletions(-)
-
-diff --git a/PARPACK/SRC/MPI/pcgetv0.f b/PARPACK/SRC/MPI/pcgetv0.f
-index 59e3d1658..24fe8a0f1 100644
---- a/PARPACK/SRC/MPI/pcgetv0.f
-+++ b/PARPACK/SRC/MPI/pcgetv0.f
-@@ -176,13 +176,13 @@ subroutine pcgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
-+      logical    first, inits, orth
-       integer    idist, iseed(4), iter, msglvl, jj, myid, igen
-       Real
-      &           rnorm0
-       Complex
-      &           cnorm, cnorm2
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
-       Complex
-      &           cnorm_buf, buf2(1)
-@@ -203,6 +203,12 @@ subroutine pcgetv0
-      &           ccdotc
-       external   ccdotc, pscnorm2, slapy2
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
-@@ -213,26 +219,30 @@ subroutine pcgetv0
- c     | random number generator           |
- c     %-----------------------------------%
- c
-+      if (inits) then
- c
--c     %-----------------------------------%
--c     | Generate a seed on each processor |
--c     | using process id (myid).          |
--c     | Note: the seed must be between 1  |
--c     | and 4095.  iseed(4) must be odd.  |
--c     %-----------------------------------%
-+c        %-----------------------------------%
-+c        | Generate a seed on each processor |
-+c        | using process id (myid).          |
-+c        | Note: the seed must be between 1  |
-+c        | and 4095.  iseed(4) must be odd.  |
-+c        %-----------------------------------%
- c
--      call MPI_COMM_RANK(comm, myid, ierr)
--      igen = 1000 + 2*myid + 1
--      if (igen .gt. 4095) then
--         write(0,*) 'Error in p_getv0: seed exceeds 4095!'
--      end if
-+         call MPI_COMM_RANK(comm, myid, ierr)
-+         igen = 1000 + 2*myid + 1
-+         if (igen .gt. 4095) then
-+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
-+         end if
-+c
-+         iseed(1) = igen/1000
-+         igen     = mod(igen,1000)
-+         iseed(2) = igen/100
-+         igen     = mod(igen,100)
-+         iseed(3) = igen/10
-+         iseed(4) = mod(igen,10)
- c
--      iseed(1) = igen/1000
--      igen     = mod(igen,1000)
--      iseed(2) = igen/100
--      igen     = mod(igen,100)
--      iseed(3) = igen/10
--      iseed(4) = 7
-+         inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
-diff --git a/PARPACK/SRC/MPI/pdgetv0.f b/PARPACK/SRC/MPI/pdgetv0.f
-index 0f348b820..5a1956997 100644
---- a/PARPACK/SRC/MPI/pdgetv0.f
-+++ b/PARPACK/SRC/MPI/pdgetv0.f
-@@ -177,11 +177,11 @@ subroutine pdgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
--      integer    idist, iseed(4), iter, msglvl, jj
-+      logical    first, inits, orth
-+      integer    idist, iseed(4), iter, msglvl, jj, myid, igen
-       Double precision
-      &           rnorm0, buf2(1)
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
-       Double precision
-      &           rnorm_buf
-@@ -206,6 +206,12 @@ subroutine pdgetv0
- c
-       intrinsic    abs, sqrt
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
-@@ -216,10 +222,30 @@ subroutine pdgetv0
- c     | random number generator           |
- c     %-----------------------------------%
- c
--      iseed(1) = 1
--      iseed(2) = 3
--      iseed(3) = 5
--      iseed(4) = 7
-+      if (inits) then
-+c
-+c        %-----------------------------------%
-+c        | Generate a seed on each processor |
-+c        | using process id (myid).          |
-+c        | Note: the seed must be between 1  |
-+c        | and 4095.  iseed(4) must be odd.  |
-+c        %-----------------------------------%
-+c
-+         call MPI_COMM_RANK(comm, myid, ierr)
-+         igen = 1000 + 2*myid + 1
-+         if (igen .gt. 4095) then
-+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
-+         end if
-+c
-+         iseed(1) = igen/1000
-+         igen     = mod(igen,1000)
-+         iseed(2) = igen/100
-+         igen     = mod(igen,100)
-+         iseed(3) = igen/10
-+         iseed(4) = mod(igen,10)
-+c
-+         inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
-diff --git a/PARPACK/SRC/MPI/psgetv0.f b/PARPACK/SRC/MPI/psgetv0.f
-index d79a513b2..078e4fa8c 100644
---- a/PARPACK/SRC/MPI/psgetv0.f
-+++ b/PARPACK/SRC/MPI/psgetv0.f
-@@ -177,11 +177,11 @@ subroutine psgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
--      integer    idist, iseed(4), iter, msglvl, jj
-+      logical    first, inits, orth
-+      integer    idist, iseed(4), iter, msglvl, jj, myid, igen
-       Real
-      &           rnorm0
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
-       Real
-      &           rnorm_buf
-@@ -206,20 +206,41 @@ subroutine psgetv0
- c
-       intrinsic    abs, sqrt
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
- c
- c
--c     %-----------------------------------%
--c     | Initialize the seed of the LAPACK |
--c     | random number generator           |
--c     %-----------------------------------%
-+      if (inits) then
- c
--      iseed(1) = 1
--      iseed(2) = 3
--      iseed(3) = 5
--      iseed(4) = 7
-+c        %-----------------------------------%
-+c        | Generate a seed on each processor |
-+c        | using process id (myid).          |
-+c        | Note: the seed must be between 1  |
-+c        | and 4095.  iseed(4) must be odd.  |
-+c        %-----------------------------------%
-+c
-+         call MPI_COMM_RANK(comm, myid, ierr)
-+         igen = 1000 + 2*myid + 1
-+         if (igen .gt. 4095) then
-+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
-+         end if
-+c
-+         iseed(1) = igen/1000
-+         igen     = mod(igen,1000)
-+         iseed(2) = igen/100
-+         igen     = mod(igen,100)
-+         iseed(3) = igen/10
-+         iseed(4) = mod(igen,10)
-+c
-+         inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
-diff --git a/PARPACK/SRC/MPI/pzgetv0.f b/PARPACK/SRC/MPI/pzgetv0.f
-index 731fb319f..94fb705f3 100644
---- a/PARPACK/SRC/MPI/pzgetv0.f
-+++ b/PARPACK/SRC/MPI/pzgetv0.f
-@@ -176,13 +176,13 @@ subroutine pzgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
-+      logical    first, inits, orth
-       integer    idist, iseed(4), iter, msglvl, jj, myid, igen
-       Double precision
-      &           rnorm0
-       Complex*16
-      &           cnorm, cnorm2
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
-       Complex*16
-      &           cnorm_buf, buf2(1)
-@@ -203,6 +203,12 @@ subroutine pzgetv0
-      &           zzdotc
-       external   zzdotc , pdznorm2 , dlapy2
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
-@@ -213,26 +219,30 @@ subroutine pzgetv0
- c     | random number generator           |
- c     %-----------------------------------%
- c
-+      if (inits) then
- c
--c     %-----------------------------------%
--c     | Generate a seed on each processor |
--c     | using process id (myid).          |
--c     | Note: the seed must be between 1  |
--c     | and 4095.  iseed(4) must be odd.  |
--c     %-----------------------------------%
-+c        %-----------------------------------%
-+c        | Generate a seed on each processor |
-+c        | using process id (myid).          |
-+c        | Note: the seed must be between 1  |
-+c        | and 4095.  iseed(4) must be odd.  |
-+c        %-----------------------------------%
- c
--      call MPI_COMM_RANK(comm, myid, ierr)
--      igen = 1000 + 2*myid + 1
--      if (igen .gt. 4095) then
--         write(0,*) 'Error in p_getv0: seed exceeds 4095!'
--      end if
-+         call MPI_COMM_RANK(comm, myid, ierr)
-+         igen = 1000 + 2*myid + 1
-+         if (igen .gt. 4095) then
-+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
-+         end if
-+c
-+         iseed(1) = igen/1000
-+         igen     = mod(igen,1000)
-+         iseed(2) = igen/100
-+         igen     = mod(igen,100)
-+         iseed(3) = igen/10
-+         iseed(4) = mod(igen,10)
- c
--      iseed(1) = igen/1000
--      igen     = mod(igen,1000)
--      iseed(2) = igen/100
--      igen     = mod(igen,100)
--      iseed(3) = igen/10
--      iseed(4) = 7
-+         inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
-diff --git a/SRC/cgetv0.f b/SRC/cgetv0.f
-index b49e66708..c231eadcb 100644
---- a/SRC/cgetv0.f
-+++ b/SRC/cgetv0.f
-@@ -156,13 +156,13 @@ subroutine cgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
-+      logical    first, inits, orth
-       integer    idist, iseed(4), iter, msglvl, jj
-       Real
-      &           rnorm0
-       Complex
-      &           cnorm
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
- c     %----------------------%
- c     | External Subroutines |
-@@ -180,6 +180,12 @@ subroutine cgetv0
-      &           ccdotc
-       external   ccdotc, scnrm2, slapy2
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
-@@ -190,10 +196,13 @@ subroutine cgetv0
- c     | random number generator           |
- c     %-----------------------------------%
- c
--      iseed(1) = 1
--      iseed(2) = 3
--      iseed(3) = 5
--      iseed(4) = 7
-+      if (inits) then
-+          iseed(1) = 1
-+          iseed(2) = 3
-+          iseed(3) = 5
-+          iseed(4) = 7
-+          inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
-diff --git a/SRC/dgetv0.f b/SRC/dgetv0.f
-index 8be4fa26d..1d6dc01bd 100644
---- a/SRC/dgetv0.f
-+++ b/SRC/dgetv0.f
-@@ -157,11 +157,11 @@ subroutine dgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
-+      logical    first, inits, orth
-       integer    idist, iseed(4), iter, msglvl, jj
-       Double precision
-      &           rnorm0
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
- c     %----------------------%
- c     | External Subroutines |
-@@ -183,6 +183,12 @@ subroutine dgetv0
- c
-       intrinsic    abs, sqrt
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
-@@ -193,10 +199,13 @@ subroutine dgetv0
- c     | random number generator           |
- c     %-----------------------------------%
- c
--      iseed(1) = 1
--      iseed(2) = 3
--      iseed(3) = 5
--      iseed(4) = 7
-+      if (inits) then
-+          iseed(1) = 1
-+          iseed(2) = 3
-+          iseed(3) = 5
-+          iseed(4) = 7
-+          inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
-diff --git a/SRC/sgetv0.f b/SRC/sgetv0.f
-index 26130a014..d861b2d6d 100644
---- a/SRC/sgetv0.f
-+++ b/SRC/sgetv0.f
-@@ -157,11 +157,11 @@ subroutine sgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
-+      logical    first, inits, orth
-       integer    idist, iseed(4), iter, msglvl, jj
-       Real
-      &           rnorm0
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
- c     %----------------------%
- c     | External Subroutines |
-@@ -183,6 +183,12 @@ subroutine sgetv0
- c
-       intrinsic    abs, sqrt
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
-@@ -193,10 +199,13 @@ subroutine sgetv0
- c     | random number generator           |
- c     %-----------------------------------%
- c
--      iseed(1) = 1
--      iseed(2) = 3
--      iseed(3) = 5
--      iseed(4) = 7
-+      if (inits) then
-+          iseed(1) = 1
-+          iseed(2) = 3
-+          iseed(3) = 5
-+          iseed(4) = 7
-+          inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
-diff --git a/SRC/zgetv0.f b/SRC/zgetv0.f
-index cc13c3cfb..1fbd50851 100644
---- a/SRC/zgetv0.f
-+++ b/SRC/zgetv0.f
-@@ -156,13 +156,13 @@ subroutine zgetv0
- c     | Local Scalars & Arrays |
- c     %------------------------%
- c
--      logical    first, orth
-+      logical    first, inits, orth
-       integer    idist, iseed(4), iter, msglvl, jj
-       Double precision
-      &           rnorm0
-       Complex*16
-      &           cnorm
--      save       first, iseed, iter, msglvl, orth, rnorm0
-+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
- c
- c     %----------------------%
- c     | External Subroutines |
-@@ -180,6 +180,12 @@ subroutine zgetv0
-      &           zzdotc
-       external   zzdotc, dznrm2, dlapy2
- c
-+c     %-----------------%
-+c     | Data Statements |
-+c     %-----------------%
-+c
-+      data       inits /.true./
-+c
- c     %-----------------------%
- c     | Executable Statements |
- c     %-----------------------%
-@@ -190,10 +196,13 @@ subroutine zgetv0
- c     | random number generator           |
- c     %-----------------------------------%
- c
--      iseed(1) = 1
--      iseed(2) = 3
--      iseed(3) = 5
--      iseed(4) = 7
-+      if (inits) then
-+          iseed(1) = 1
-+          iseed(2) = 3
-+          iseed(3) = 5
-+          iseed(4) = 7
-+          inits = .false.
-+      end if
- c
-       if (ido .eq.  0) then
- c
