linearEqSolver-1.0: Solve linear systems of equations over integers.

Stabilityexperimental
Maintainererkokl@gmail.com
Safe HaskellNone

Math.LinearEquationSolver

Contents

Description

(The linear equation solver library is hosted at http://github.com/LeventErkok/linearEqSolver. Comments, bug reports, and patches are always welcome.)

Solvers for linear equations over integers. Both single solution and all solution variants are supported.

Synopsis

Finding a solution

solveIntegerLinearEqs :: [[Integer]] -> [Integer] -> IO (Maybe [Integer])Source

Solve a system of linear integer equations. The first argument is the matrix of coefficients, known as A, of size mxn. The second argument is the vector of results, known as B, of size mx1. The result will be either Nothing, if there is no solution, or Just x -- such that Ax = B holds. (Naturally, the result x will be a vector of size nx1 in this case.)

Here's an example call, to solve the following system of equations:

     2x + 3y + 4z = 20
     6x - 3y + 9z = -6
     2x      +  z = 8
>>> solveIntegerLinearEqs [[2,3,4],[6,-3,9],[2,0,1]] [20,-6,8]
Just [5,6,-2]

In case there are no solutions, we will get Nothing:

>>> solveIntegerLinearEqs [[1], [1]] [2,3]
Nothing

Note that there are no solutions to this second system as it stipulates the unknown is equal to both 2 and 3. (Overspecified.)

Finding all solutions

solveIntegerLinearEqsAll :: [[Integer]] -> [Integer] -> IO [[Integer]]Source

Similar to solveIntegerLinearEqs, except returns all possible solutions. Note that there might be an infinite number of solutions if the system is underspecified, in which case the result will be a lazy list of solutions that the caller can consume as much as needed.

Here's an example call, where we underspecify the system and hence there are multiple (in this case an infinite number of) solutions. Here, we only take the first 3 elements, for testing purposes, but all such results can be computed lazily. Our system is:

     2x + 3y + 4z = 20
     6x - 3y + 9z = -6

We have:

>>> take 3 `fmap` solveIntegerLinearEqsAll [[2,3,4],[6,-3,9]] [20,-6]
[[5,6,-2],[-8,4,6],[18,8,-10]]