NullSpace of sparse matrix over GFq.nullspace is allocated rank n.
#include <givaro/gfq.h>
#include <iostream>
int main (int argc, char **argv)
{
if ( argc < 2 || argc > 4) {
std::cerr << "Usage to get a random null space basis over GF(p,k): <matrix-file-in-SMS-format> p [k]" << std::endl;
return -1;
}
std::ifstream input (argv[1]);
if (!input) {
std::cerr << "Error opening matrix file " << argv[1] << std::endl;
return -1;
}
int pVal = atoi(argv[2]);
typedef Givaro::GFqDom<int64_t> Field;
Field F(pVal, argc>3?atoi(argv[3]):1);
SparseMatrix<Field, SparseMatrixFormat::SparseSeq > A (F);
A.read (input);
std::cout << "A is " << A.rowdim() << " by " << A.coldim() << std::endl;
typename Field::Element Det;
size_t Rank;
size_t Ni(A.rowdim()),Nj(A.coldim());
Permutation<Field> P(F,(int)Nj);
GD.
InPlaceLinearPivoting(Rank, Det, A, P, Ni, Nj );
for(size_t i=0; i< Ni; ++i) {
if (A[i].size() == 0) {
size_t j(i);
if (nextnonzero(j,Ni,A)) {
A[i] = A[j];
A[j].resize(0);
}
else {
break;
}
}
}
size_t nullity = A.coldim()-Rank;
GD.
nullspacebasis(NullSpace, Rank, A, P);
NullSpace.
write( std::cerr <<
"X:=", Tag::FileFormat::Maple ) <<
';' << std::endl;
std::cerr << "NullsSpace dimensions:" << NullSpace.rowdim() << 'x' << NullSpace.coldim() << std::endl;
return 0;
}