module Numeric.Determinant.Explicit where -- | compute the determinant of the top left sub-matrix -- of given size, which can be in [1..5] det :: Num a => Int -> [[a]] -> a det 1 ((a00:_):_) = a00 det 2 ((a00:(a01:_)):((a10:(a11:_)):_)) = ((a00*a11)+(a10*(negate a01))) det 3 ((a00:(a01:(a02:_))):((a10:(a11:(a12:_))):((a20:(a21:(a22:_))):_))) = ((a00*((a11*a22)+(a21*(negate a12))))+(a10*((a01*(negate a22))+(a21*a02)))+(a20*((a01*a12)+(a11*(negate a02))))) det 4 ((a00:(a01:(a02:(a03:_)))):((a10:(a11:(a12:(a13:_)))):((a20:(a21:(a22:(a23:_)))):((a30:(a31:(a32:(a33:_)))):_)))) = ((a00*((a11*((a22*a33)+(a32*(negate a23))))+(a21*((a12*(negate a33))+(a32*a13)))+(a31*((a12*a23)+(a22*(negate a13))))))+(a10*((a01*((a22*(negate a33))+(a32*a23)))+(a21*((a02*a33)+(a32*(negate a03))))+(a31*((a02*(negate a23))+(a22*a03)))))+(a20*((a01*((a12*a33)+(a32*(negate a13))))+(a11*((a02*(negate a33))+(a32*a03)))+(a31*((a02*a13)+(a12*(negate a03))))))+(a30*((a01*((a12*(negate a23))+(a22*a13)))+(a11*((a02*a23)+(a22*(negate a03))))+(a21*((a02*(negate a13))+(a12*a03)))))) det 5 ((a00:(a01:(a02:(a03:(a04:_))))):((a10:(a11:(a12:(a13:(a14:_))))):((a20:(a21:(a22:(a23:(a24:_))))):((a30:(a31:(a32:(a33:(a34:_))))):((a40:(a41:(a42:(a43:(a44:_))))):_))))) = ((a00*((a11*((a22*((a33*a44)+(a43*(negate a34))))+(a32*((a23*(negate a44))+(a43*a24)))+(a42*((a23*a34)+(a33*(negate a24))))))+(a21*((a12*((a33*(negate a44))+(a43*a34)))+(a32*((a13*a44)+(a43*(negate a14))))+(a42*((a13*(negate a34))+(a33*a14)))))+(a31*((a12*((a23*a44)+(a43*(negate a24))))+(a22*((a13*(negate a44))+(a43*a14)))+(a42*((a13*a24)+(a23*(negate a14))))))+(a41*((a12*((a23*(negate a34))+(a33*a24)))+(a22*((a13*a34)+(a33*(negate a14))))+(a32*((a13*(negate a24))+(a23*a14)))))))+(a10*((a01*((a22*((a33*(negate a44))+(a43*a34)))+(a32*((a23*a44)+(a43*(negate a24))))+(a42*((a23*(negate a34))+(a33*a24)))))+(a21*((a02*((a33*a44)+(a43*(negate a34))))+(a32*((a03*(negate a44))+(a43*a04)))+(a42*((a03*a34)+(a33*(negate a04))))))+(a31*((a02*((a23*(negate a44))+(a43*a24)))+(a22*((a03*a44)+(a43*(negate a04))))+(a42*((a03*(negate a24))+(a23*a04)))))+(a41*((a02*((a23*a34)+(a33*(negate a24))))+(a22*((a03*(negate a34))+(a33*a04)))+(a32*((a03*a24)+(a23*(negate a04))))))))+(a20*((a01*((a12*((a33*a44)+(a43*(negate a34))))+(a32*((a13*(negate a44))+(a43*a14)))+(a42*((a13*a34)+(a33*(negate a14))))))+(a11*((a02*((a33*(negate a44))+(a43*a34)))+(a32*((a03*a44)+(a43*(negate a04))))+(a42*((a03*(negate a34))+(a33*a04)))))+(a31*((a02*((a13*a44)+(a43*(negate a14))))+(a12*((a03*(negate a44))+(a43*a04)))+(a42*((a03*a14)+(a13*(negate a04))))))+(a41*((a02*((a13*(negate a34))+(a33*a14)))+(a12*((a03*a34)+(a33*(negate a04))))+(a32*((a03*(negate a14))+(a13*a04)))))))+(a30*((a01*((a12*((a23*(negate a44))+(a43*a24)))+(a22*((a13*a44)+(a43*(negate a14))))+(a42*((a13*(negate a24))+(a23*a14)))))+(a11*((a02*((a23*a44)+(a43*(negate a24))))+(a22*((a03*(negate a44))+(a43*a04)))+(a42*((a03*a24)+(a23*(negate a04))))))+(a21*((a02*((a13*(negate a44))+(a43*a14)))+(a12*((a03*a44)+(a43*(negate a04))))+(a42*((a03*(negate a14))+(a13*a04)))))+(a41*((a02*((a13*a24)+(a23*(negate a14))))+(a12*((a03*(negate a24))+(a23*a04)))+(a22*((a03*a14)+(a13*(negate a04))))))))+(a40*((a01*((a12*((a23*a34)+(a33*(negate a24))))+(a22*((a13*(negate a34))+(a33*a14)))+(a32*((a13*a24)+(a23*(negate a14))))))+(a11*((a02*((a23*(negate a34))+(a33*a24)))+(a22*((a03*a34)+(a33*(negate a04))))+(a32*((a03*(negate a24))+(a23*a04)))))+(a21*((a02*((a13*a34)+(a33*(negate a14))))+(a12*((a03*(negate a34))+(a33*a04)))+(a32*((a03*a14)+(a13*(negate a04))))))+(a31*((a02*((a13*(negate a24))+(a23*a14)))+(a12*((a03*a24)+(a23*(negate a04))))+(a22*((a03*(negate a14))+(a13*a04))))))))