type Vector = [Number]
type Row = [Number]
type Matrix = [Row]
gauss :: Matrix -> Vector -> Vector
gauss a b
= resubstitute
$ triangular
$ zipWith (++) a
$ map (\y
-> [y
]) b
triangular :: Matrix -> Matrix
triangular [] = []
triangular m
= row:
(triangular
$ map f rows
) where
(row:rows) = rotatePivot m
rotatePivot (row:rows)
| (head row
) /= 0 = (row:rows
) f bs
where
resubstitute :: Matrix -> Vector
resubstitute
= reverse . resubstitute
' . reverse . map reverse where
resubstitute' [] = []
resubstitute
' (row:rows) = x:(resubstitute' $ map substituteUnknown rows
) where
substituteUnknown (a1:(a2:as')) = ((a1-x*a2):as')
m1 = [[1,1,0], [0,1,1], [1,0,1]] :: Matrix
v1 = [2,3,4] :: Vector
main
= print $ gauss m1 v1
dHlwZSBOdW1iZXIgPSBSYXRpb25hbAp0eXBlIFZlY3RvciA9IFtOdW1iZXJdCnR5cGUgUm93ICAgID0gW051bWJlcl0KdHlwZSBNYXRyaXggPSBbUm93XQoKZ2F1c3MgOjogTWF0cml4IC0+IFZlY3RvciAtPiBWZWN0b3IKZ2F1c3MgYSBiID0gcmVzdWJzdGl0dXRlICQgdHJpYW5ndWxhciAkIHppcFdpdGggKCsrKSBhICQgbWFwIChceSAtPiBbeV0pIGIKCnRyaWFuZ3VsYXIgOjogTWF0cml4IC0+IE1hdHJpeAp0cmlhbmd1bGFyIFtdID0gW10KdHJpYW5ndWxhciBtICA9IHJvdzoodHJpYW5ndWxhciAkIG1hcCBmIHJvd3MpCiAgICB3aGVyZQogICAgKHJvdzpyb3dzKSA9IHJvdGF0ZVBpdm90IG0KICAgIHJvdGF0ZVBpdm90IChyb3c6cm93cykKICAgIAl8IChoZWFkIHJvdykgLz0gMCA9IChyb3c6cm93cykKICAgIAl8IG90aGVyd2lzZSAgICAgICA9IHJvdGF0ZVBpdm90IChyb3dzICsrIFtyb3ddKQogICAgZiBicwogICAgICAgIHwgKGhlYWQgYnMpID09IDAgPSBkcm9wIDEgYnMKICAgICAgICB8IG90aGVyd2lzZSAgICAgID0gZHJvcCAxICQgemlwV2l0aCAoLSkgKG1hcCAoKmMpIGJzKSByb3cKICAgICAgICB3aGVyZSAKICAgICAgICBjID0gKGhlYWQgcm93KS8oaGVhZCBicykgIAoKcmVzdWJzdGl0dXRlIDo6IE1hdHJpeCAtPiBWZWN0b3IKcmVzdWJzdGl0dXRlID0gcmV2ZXJzZSAuIHJlc3Vic3RpdHV0ZScgLiByZXZlcnNlIC4gbWFwIHJldmVyc2UKCXdoZXJlCglyZXN1YnN0aXR1dGUnIFtdID0gW10KCXJlc3Vic3RpdHV0ZScgKHJvdzpyb3dzKSA9IHg6KHJlc3Vic3RpdHV0ZScgJCBtYXAgc3Vic3RpdHV0ZVVua25vd24gcm93cykgCgkJd2hlcmUgCgkJeCA9IChoZWFkIHJvdykvKGxhc3Qgcm93KQoJCXN1YnN0aXR1dGVVbmtub3duIChhMTooYTI6YXMnKSkgPSAoKGExLXgqYTIpOmFzJykKICAgIAkKCm0xID0gW1sxLDEsMF0sIFswLDEsMV0sIFsxLDAsMV1dIDo6IE1hdHJpeAp2MSA9IFsyLDMsNF0gOjogVmVjdG9yCm1haW4gPSBwcmludCAkIGdhdXNzIG0xIHYx