# State-of-the-art C++ library for *sparse* matrices over **Z** and **Q**

I wish to ask what libraries for sparse matrices satisfy the following criteria:

(1) Is very efficient (memory and time wise). Uses vectorization (mandatory) and parallelization (not mandatory, but desirable). My matrices can have dimensions 10^7 x 10^7 or more, with a few entries per column on average (i.e. between 10^7 and 10^9 nonzero entries). Matrix entries are exact, either integers or fractions (I work over rings Z, Z_(p) and fields Z_p, Q).

(2) The matrices can be in CSR or CSC format and can be converted into LIL format.

(3) The following (basic) methods must be implemented:

• Matrix multiplication: a.b
• Entry-wise multiplication a*b
• Matrix transpose: a^t
• Apply any function (such as mod integers by an integer or take numerators of fractions or invert fractions) on all nonzero matrix values.
• Let I be a subset of row-indices and J a subset of column-indices. Return submatrices a[I,], a[,J], a[I,J]
• Set all entries in I-rows or J-columns to 0, i.e. a[I,]=0 or a[,J]=0.
• For a vector w of the same length as I, multiply the I-rows in a by the numbers from w, i.e. a[I,]=w*a[I,], so we multiply all nonzero entries in the I[0] row by w[0], and so on.
• For a subset of locations IJ={(i0,j0),...}, set the entries at the IJ-locations in a to be 0, i.e. a[IJ]=0.
• Remove zero entries in a. Sort the entries in CSR format. In Python scipy.sparse, we have these two functions for this.

I currently have no need for other linear algebra operations, the focus is on efficiency (RAM shortages are my trouble) and coefficients (rarely can I find rational coefficients).

I've googled a bit and found NewMat, Eigen, LinBox, BLAS, LAPACK, ATLAS, SuiteSparse, uBLAS, Armadillo, blaze, CSPARSE, Trilino, ..., but I have never used those libraries. Do they satisfy all the above conditions? Which is the most efficient (benchmark comparisons are welcome)? Are there any better libraries?