Skip to content
a Sparse Direct Solver modulo p
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

SpaSM (Sparse direct Solver Modulo p)

SpaSM is a software library devoted to sparse gaussian elimination modulo a small prime p. It is available under the General Public License Version 2 or later (GPLv2+).

The algorithms used in SpaSM are described in CASC'16 and PASCO'17. For more information, consult the SpaSM homepage.


The core of the library is an implementation of the GPLU algorithm, heavily inspired by Tim Davis's CSparse, and adapted to the context of exact computation. On top of this, we designed new strategies to search for structural pivots. This allows several kind of useful operations on sparse matrices:

  • LU and PLUQ factorization
  • Rank computation
  • Solution of linear systems
  • Kernel basis
  • Permutation to block triangular form
  • Reduced Row-Echelon Form

Finally, the library does I/O of matrices in SMS format, which makes it somewhat compatible with LinBox.

A set of demonstration programs is provided (see the bench folder).


In brief: ./configure <options> && make && make check

If you do not have the configure script, try: autoreconf -i

SpaSM does not rely on any third-party software, but is capable of using:

SpaSM uses OpenMP to exploit multicore machines.

The most commonly used option include:

  • --with-metis=<path> : build the METIS interface
  • --with-fflas-ffpack=<path> : enable the tools relying on dense rank computation
  • --with-linbox=<path> : build the linbox wrappers (for comparison purpose)

Demonstration scripts

All SpaSM demonstration scripts read a matrix in SMS format on the standard input.

For instance, these commands (run inside the bench/ folder) will compute the rank of several large matrices in a few seconds:

curl | gunzip - | ./rank_hybrid
curl | gunzip - | ./rank_hybrid
curl | gunzip - | ./rank_hybrid

It would be necessary to disable greedy pivot search for this one:

curl,,6-D9.sms.gz | gunzip - | ./rank_hybrid

When matrices have many empty rows/columns, they can/have to be removed with the stack utility:

curl | gunzip - | ./stack | ./rank_hybrid
curl | gunzip - | ./stack | ./rank_hybrid

Finding good pivots is crucial for the performance of any kind of sparse elimination procedure. The pivot-finding code is still a bit naïve. Sometimes it will find much more pivots, much faster, if the matrices are flipped around a vertical axis with the vertical_swap utility:

curl | gunzip - | ./vertical_swap | ./rank_hybrid --sparse-threshold 0.01
curl | gunzip - | ./vertical_swap | ./rank_hybrid --sparse-threshold 0.01

Citing SpaSM

If by any luck your research depends on the SpaSM library, please consider citing the project as

title = {{SpaSM}: a Sparse direct Solver Modulo $p$},
author = {The SpaSM group},
edition = {v1.2},
year = {2017},
note = {\url{}}

Contact and discussion

Please email for any questions.

You can’t perform that action at this time.