Following Dave Saunders proposal, here is the framework I propose for
integrating these functions in LinBox solutions.
3 solutions (each of them corresponding to a file in linbox/solution),
and several functions in each of them:
linbox/solution/solve.h
* solveRight (x,A,b) // general case: compute arbitrary x s.t. Ax=b.
If no such x exist, throw an exception
* solveRight (X,A,B) // idem where X,B are m*k matrices
* solveLeft (x,A,b) // idem for xA=b
* solveRight(X,A,b) // idem for XA=B
* solveNonSingularLeft (x,A,b) //return the unique solution,
assuming A is non singular.
* solveNonSingularLeft (x,A,b)
* solveNonSingularRight (X,A,B)
* solveNonSingularRight (X,A,B)
We can discuss the point whether this should be a separate function
or flag in the solve_right/left function.
* solveBasisRight/Left (X,A,b) // return a basis of the space of
solutions of the underdetermined system Ax=b
* solveRandomRight/Left (x,A,b) // sample a solution x randomly from
the space of solutions
* solveRight/Left (x,A,b,M) // the user provide the method
all these functions have to work over Z and Zp, dense and BlackBox
linbox/solution/nullspace.h
* nullspaceBasisLeft/Right (X,A) // basis of the nullspace.
* nullspaceVectorLeft/Right (x,A) // sample a random vector for the
nullspace of A
And one more solution that we ought to provide:
linbox/solution/echelon.h
* echelonForm (X,A) // put A in echelon form if over GF(p), hermite
form if over Z.
* echelonForm (A) // idem in-place
These methods are not necessarly suited to sparse/blackbox computations
(especially echelon forms), so let's say we require it to be always
defined for dense matrices, and provide the blackbox/sparse
implementation when possible.
Dave, does it sound compatible with what you had in mind?
Ok, let's get it done!
Clément