行列式の値を計算するプログラムをPythonで作ってみた。

 行列式の値を計算するプログラムをPythonで作ってみました。(^_^;
 効率はあまりよくありませんが、3次以下はSarrusの方法、4次以上はLaplace展開(余因子展開)を用いて計算しました。次元が10ぐらいから遅さが目立ち出しますが、計算結果は長整数で得ることが出来ます。(^_^;
 また、検算には、NumPyのlinalg.det()を用いて行いました。
※参考URL
線形代数を学ぼう その5 行列式

● DetLaplace1.py

# coding: UTF-8
# DetLaplace1.py

def detLap(m):
    n = len(m)
    if n!=len(m[0]): return float('nan')
    if n==1: return m[0][0]
    if n==2: return m[0][0]*m[1][1]-m[0][1]*m[1][0]
    if n==3:
        r = m[0][0]*m[1][1]*m[2][2]-m[0][0]*m[1][2]*m[2][1]
        r+= m[0][1]*m[1][2]*m[2][0]-m[0][1]*m[1][0]*m[2][2]
        r+= m[0][2]*m[1][0]*m[2][1]-m[0][2]*m[1][1]*m[2][0]
        return r
    # 3次以下はSarrusの方法、4次以上はLaplace展開
    sum = 0
    for i in range(n):
        mnr = [[m[k][j] for j in range(n) if j!=i] for k in range(1,n)]
        sum+= (-1)**i*m[0][i]*detLap(mnr)
    return sum

def main():
    import numpy as np
    import random
    from time import time
    tm=time()  # Timer Start
    for n in range(1,10+1):
        m = [[random.randint(0,99) for x in range(n)] for y in range(n)]
        a = np.array(m)
        print("%2d : %s | %s"%(n,detLap(m),np.linalg.det(a)))

    tm=time()-tm  # Timer Stop
    print("Runtime : %.3f [sec]"%tm)

if __name__ == '__main__':
    main()

●実行結果

 1 : 17 | 17.0
 2 : 1116 | 1116.0
 3 : 102561 | 102561.0
 4 : -942858 | -942858.0
 5 : -860930520 | -860930520.0
 6 : -29659900344 | -29659900344.0
 7 : 865057360735 | 865057360735.0
 8 : 391130556173298 | 3.91130556173e+14
 9 : -2370001708390752 | -2.37000170839e+15
10 : 1501415121123582313 | 1.50141512112e+18
Runtime : 8.771 [sec]

※参考URL
行列式の値を計算するプログラムをPythonで作ってみた。(2)
行列式の展開式を文字列で求めるプログラムをPythonで作ってみた。
行列式の値を計算するプログラムをPythonで作ってみた。(3)

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)