Gaussian elimination determinant of sparse matrix over Z or Zp.
#include <iostream>
#include <vector>
#include <utility>
#include <linbox/field/gf2.h>
#include <linbox/blackbox/zero-one.h>
#include <linbox/solutions/rank.h>
int main (int argc, char **argv)
{
commentator().
setMaxDetailLevel (-1);
commentator().
setMaxDepth (-1);
commentator().
setReportStream (std::cerr);
if (argc < 2 || argc > 3)
{ cerr << "Usage: sparseelimdet <matrix-file-in-supported-format> [<p>]" << endl; return -1; }
ifstream input (argv[1]);
if (!input) { cerr << "Error opening matrix file: " << argv[1] << endl; return -1; }
Method::SparseElimination SE;
if (argc == 2) {
Givaro::ZRing<Integer> ZZ;
SparseMatrix<Givaro::ZRing<Integer> > A ( ZZ );
A.read(input);
cout << "A is " << A.rowdim() << " by " << A.coldim() << endl;
SE.pivotStrategy = PivotStrategy::Linear;
Givaro::ZRing<Integer>::Element d;
ZZ.write(cout << "Determinant is ", d) << endl;
}
if (argc == 3) {
typedef Givaro::Modular<double> Field;
double q = atof(argv[2]);
Field F(q);
SparseMatrix<Field> B (F);
B.read(input);
cout << "B is " << B.rowdim() << " by " << B.coldim() << endl;
if (B.rowdim() <= 20 && B.coldim() <= 20) B.write(cout) << endl;
Field::Element d;
if (B.rowdim() <= 20 && B.coldim() <= 20)
B.write(cout) << endl;
F.write(cout << "Determinant is ", d) << endl;
SE.pivotStrategy = PivotStrategy::Linear;
detInPlace (d, B, SE);
if (B.rowdim() <= 20 && B.coldim() <= 20)
B.write(cout) << endl;
F.write(cout << "Determinant is ", d) << endl;
}
return 0;
}