行列式の値を計算するプログラムを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サポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (30件) を見る