行列式の展開式を文字列で求めるプログラムをPythonで作ってみました。(^_^;
6次の展開式をDetLaplace2.py等で使うと、実行時間は0.5〜0.6[sec]になります。また、8次だと、0.1〜0.2[sec]ぐらいまで速くなりますが、展開式がでかすぎて、ソースに使う気がしません。(^_^;
ちなみに、sSgn()関数は、Javaのアルゴリズム辞典を参考にしてPythonに合うように改良しました。
● StrDet.py
# coding: UTF-8 # StrDet.py import itertools def sSgn(p): n = len(p) v = [0]+list(p) w = list(range(n+1)) for i in range(1,n+1): v[i]+=1; w[v[i]] = i r = 1 for i in range(1,n): j = v[i] if j!=i: v[w[i]] = j; w[j] = w[i]; r*=-1 return '+' if r==1 else '-' #三項演算子 def sDetN(mat): n = len(mat) if n==1: return mat[0][0] a = [[mat[i][j] for j in range(n//2) ] for i in range(n)] b = [[mat[i][j] for j in range(n//2,n)] for i in range(n)] res = "" P = range(n) for p in itertools.combinations(P,n//2): q = list(p)+[k for k in P if k not in p ] ma = [a[q[i]] for i in range(n//2)] mb = [b[q[i]] for i in range(n//2,n)] s1 = sSgn(q) if res!="" else "" s2 = sDetN(ma) if n//2==1 else '('+sDetN(ma)+')' s3 = sDetN(mb) if n-n//2==1 else '('+sDetN(mb)+')' res+= "%s%s*%s" %(s1,s2,s3) return res def main(): import random from time import time tm=time() # Timer Start for n in range(1,6+1): mat=[["m[%d][%d]" %(i,j) for j in range(n)] for i in range(n)] print("%d :"%n) print(sDetN(mat)) tm=time()-tm # Timer Stop print("Runtime : %.3f [sec]"%tm) if __name__ == '__main__': main()
●実行結果
1 : m[0][0] 2 : m[0][0]*m[1][1]-m[1][0]*m[0][1] 3 : m[0][0]*(m[1][1]*m[2][2]-m[2][1]*m[1][2])-m[1][0]*(m[0][1]*m[2][2]-m[2][1]*m[0][ 2])+m[2][0]*(m[0][1]*m[1][2]-m[1][1]*m[0][2]) 4 : (m[0][0]*m[1][1]-m[1][0]*m[0][1])*(m[2][2]*m[3][3]-m[3][2]*m[2][3])-(m[0][0]*m[2 ][1]-m[2][0]*m[0][1])*(m[1][2]*m[3][3]-m[3][2]*m[1][3])+(m[0][0]*m[3][1]-m[3][0] *m[0][1])*(m[1][2]*m[2][3]-m[2][2]*m[1][3])+(m[1][0]*m[2][1]-m[2][0]*m[1][1])*(m [0][2]*m[3][3]-m[3][2]*m[0][3])-(m[1][0]*m[3][1]-m[3][0]*m[1][1])*(m[0][2]*m[2][ 3]-m[2][2]*m[0][3])+(m[2][0]*m[3][1]-m[3][0]*m[2][1])*(m[0][2]*m[1][3]-m[1][2]*m [0][3]) 5 : (m[0][0]*m[1][1]-m[1][0]*m[0][1])*(m[2][2]*(m[3][3]*m[4][4]-m[4][3]*m[3][4])-m[3 ][2]*(m[2][3]*m[4][4]-m[4][3]*m[2][4])+m[4][2]*(m[2][3]*m[3][4]-m[3][3]*m[2][4]) )-(m[0][0]*m[2][1]-m[2][0]*m[0][1])*(m[1][2]*(m[3][3]*m[4][4]-m[4][3]*m[3][4])-m [3][2]*(m[1][3]*m[4][4]-m[4][3]*m[1][4])+m[4][2]*(m[1][3]*m[3][4]-m[3][3]*m[1][4 ]))+(m[0][0]*m[3][1]-m[3][0]*m[0][1])*(m[1][2]*(m[2][3]*m[4][4]-m[4][3]*m[2][4]) -m[2][2]*(m[1][3]*m[4][4]-m[4][3]*m[1][4])+m[4][2]*(m[1][3]*m[2][4]-m[2][3]*m[1] [4]))-(m[0][0]*m[4][1]-m[4][0]*m[0][1])*(m[1][2]*(m[2][3]*m[3][4]-m[3][3]*m[2][4 ])-m[2][2]*(m[1][3]*m[3][4]-m[3][3]*m[1][4])+m[3][2]*(m[1][3]*m[2][4]-m[2][3]*m[ 1][4]))+(m[1][0]*m[2][1]-m[2][0]*m[1][1])*(m[0][2]*(m[3][3]*m[4][4]-m[4][3]*m[3] [4])-m[3][2]*(m[0][3]*m[4][4]-m[4][3]*m[0][4])+m[4][2]*(m[0][3]*m[3][4]-m[3][3]* m[0][4]))-(m[1][0]*m[3][1]-m[3][0]*m[1][1])*(m[0][2]*(m[2][3]*m[4][4]-m[4][3]*m[ 2][4])-m[2][2]*(m[0][3]*m[4][4]-m[4][3]*m[0][4])+m[4][2]*(m[0][3]*m[2][4]-m[2][3 ]*m[0][4]))+(m[1][0]*m[4][1]-m[4][0]*m[1][1])*(m[0][2]*(m[2][3]*m[3][4]-m[3][3]* m[2][4])-m[2][2]*(m[0][3]*m[3][4]-m[3][3]*m[0][4])+m[3][2]*(m[0][3]*m[2][4]-m[2] [3]*m[0][4]))+(m[2][0]*m[3][1]-m[3][0]*m[2][1])*(m[0][2]*(m[1][3]*m[4][4]-m[4][3 ]*m[1][4])-m[1][2]*(m[0][3]*m[4][4]-m[4][3]*m[0][4])+m[4][2]*(m[0][3]*m[1][4]-m[ 1][3]*m[0][4]))-(m[2][0]*m[4][1]-m[4][0]*m[2][1])*(m[0][2]*(m[1][3]*m[3][4]-m[3] [3]*m[1][4])-m[1][2]*(m[0][3]*m[3][4]-m[3][3]*m[0][4])+m[3][2]*(m[0][3]*m[1][4]- m[1][3]*m[0][4]))+(m[3][0]*m[4][1]-m[4][0]*m[3][1])*(m[0][2]*(m[1][3]*m[2][4]-m[ 2][3]*m[1][4])-m[1][2]*(m[0][3]*m[2][4]-m[2][3]*m[0][4])+m[2][2]*(m[0][3]*m[1][4 ]-m[1][3]*m[0][4])) 6 : (m[0][0]*(m[1][1]*m[2][2]-m[2][1]*m[1][2])-m[1][0]*(m[0][1]*m[2][2]-m[2][1]*m[0] [2])+m[2][0]*(m[0][1]*m[1][2]-m[1][1]*m[0][2]))*(m[3][3]*(m[4][4]*m[5][5]-m[5][4 ]*m[4][5])-m[4][3]*(m[3][4]*m[5][5]-m[5][4]*m[3][5])+m[5][3]*(m[3][4]*m[4][5]-m[ 4][4]*m[3][5]))-(m[0][0]*(m[1][1]*m[3][2]-m[3][1]*m[1][2])-m[1][0]*(m[0][1]*m[3] [2]-m[3][1]*m[0][2])+m[3][0]*(m[0][1]*m[1][2]-m[1][1]*m[0][2]))*(m[2][3]*(m[4][4 ]*m[5][5]-m[5][4]*m[4][5])-m[4][3]*(m[2][4]*m[5][5]-m[5][4]*m[2][5])+m[5][3]*(m[ 2][4]*m[4][5]-m[4][4]*m[2][5]))+(m[0][0]*(m[1][1]*m[4][2]-m[4][1]*m[1][2])-m[1][ 0]*(m[0][1]*m[4][2]-m[4][1]*m[0][2])+m[4][0]*(m[0][1]*m[1][2]-m[1][1]*m[0][2]))* (m[2][3]*(m[3][4]*m[5][5]-m[5][4]*m[3][5])-m[3][3]*(m[2][4]*m[5][5]-m[5][4]*m[2] [5])+m[5][3]*(m[2][4]*m[3][5]-m[3][4]*m[2][5]))-(m[0][0]*(m[1][1]*m[5][2]-m[5][1 ]*m[1][2])-m[1][0]*(m[0][1]*m[5][2]-m[5][1]*m[0][2])+m[5][0]*(m[0][1]*m[1][2]-m[ 1][1]*m[0][2]))*(m[2][3]*(m[3][4]*m[4][5]-m[4][4]*m[3][5])-m[3][3]*(m[2][4]*m[4] [5]-m[4][4]*m[2][5])+m[4][3]*(m[2][4]*m[3][5]-m[3][4]*m[2][5]))+(m[0][0]*(m[2][1 ]*m[3][2]-m[3][1]*m[2][2])-m[2][0]*(m[0][1]*m[3][2]-m[3][1]*m[0][2])+m[3][0]*(m[ 0][1]*m[2][2]-m[2][1]*m[0][2]))*(m[1][3]*(m[4][4]*m[5][5]-m[5][4]*m[4][5])-m[4][ 3]*(m[1][4]*m[5][5]-m[5][4]*m[1][5])+m[5][3]*(m[1][4]*m[4][5]-m[4][4]*m[1][5]))- (m[0][0]*(m[2][1]*m[4][2]-m[4][1]*m[2][2])-m[2][0]*(m[0][1]*m[4][2]-m[4][1]*m[0] [2])+m[4][0]*(m[0][1]*m[2][2]-m[2][1]*m[0][2]))*(m[1][3]*(m[3][4]*m[5][5]-m[5][4 ]*m[3][5])-m[3][3]*(m[1][4]*m[5][5]-m[5][4]*m[1][5])+m[5][3]*(m[1][4]*m[3][5]-m[ 3][4]*m[1][5]))+(m[0][0]*(m[2][1]*m[5][2]-m[5][1]*m[2][2])-m[2][0]*(m[0][1]*m[5] [2]-m[5][1]*m[0][2])+m[5][0]*(m[0][1]*m[2][2]-m[2][1]*m[0][2]))*(m[1][3]*(m[3][4 ]*m[4][5]-m[4][4]*m[3][5])-m[3][3]*(m[1][4]*m[4][5]-m[4][4]*m[1][5])+m[4][3]*(m[ 1][4]*m[3][5]-m[3][4]*m[1][5]))+(m[0][0]*(m[3][1]*m[4][2]-m[4][1]*m[3][2])-m[3][ 0]*(m[0][1]*m[4][2]-m[4][1]*m[0][2])+m[4][0]*(m[0][1]*m[3][2]-m[3][1]*m[0][2]))* (m[1][3]*(m[2][4]*m[5][5]-m[5][4]*m[2][5])-m[2][3]*(m[1][4]*m[5][5]-m[5][4]*m[1] [5])+m[5][3]*(m[1][4]*m[2][5]-m[2][4]*m[1][5]))-(m[0][0]*(m[3][1]*m[5][2]-m[5][1 ]*m[3][2])-m[3][0]*(m[0][1]*m[5][2]-m[5][1]*m[0][2])+m[5][0]*(m[0][1]*m[3][2]-m[ 3][1]*m[0][2]))*(m[1][3]*(m[2][4]*m[4][5]-m[4][4]*m[2][5])-m[2][3]*(m[1][4]*m[4] [5]-m[4][4]*m[1][5])+m[4][3]*(m[1][4]*m[2][5]-m[2][4]*m[1][5]))+(m[0][0]*(m[4][1 ]*m[5][2]-m[5][1]*m[4][2])-m[4][0]*(m[0][1]*m[5][2]-m[5][1]*m[0][2])+m[5][0]*(m[ 0][1]*m[4][2]-m[4][1]*m[0][2]))*(m[1][3]*(m[2][4]*m[3][5]-m[3][4]*m[2][5])-m[2][ 3]*(m[1][4]*m[3][5]-m[3][4]*m[1][5])+m[3][3]*(m[1][4]*m[2][5]-m[2][4]*m[1][5]))- (m[1][0]*(m[2][1]*m[3][2]-m[3][1]*m[2][2])-m[2][0]*(m[1][1]*m[3][2]-m[3][1]*m[1] [2])+m[3][0]*(m[1][1]*m[2][2]-m[2][1]*m[1][2]))*(m[0][3]*(m[4][4]*m[5][5]-m[5][4 ]*m[4][5])-m[4][3]*(m[0][4]*m[5][5]-m[5][4]*m[0][5])+m[5][3]*(m[0][4]*m[4][5]-m[ 4][4]*m[0][5]))+(m[1][0]*(m[2][1]*m[4][2]-m[4][1]*m[2][2])-m[2][0]*(m[1][1]*m[4] [2]-m[4][1]*m[1][2])+m[4][0]*(m[1][1]*m[2][2]-m[2][1]*m[1][2]))*(m[0][3]*(m[3][4 ]*m[5][5]-m[5][4]*m[3][5])-m[3][3]*(m[0][4]*m[5][5]-m[5][4]*m[0][5])+m[5][3]*(m[ 0][4]*m[3][5]-m[3][4]*m[0][5]))-(m[1][0]*(m[2][1]*m[5][2]-m[5][1]*m[2][2])-m[2][ 0]*(m[1][1]*m[5][2]-m[5][1]*m[1][2])+m[5][0]*(m[1][1]*m[2][2]-m[2][1]*m[1][2]))* (m[0][3]*(m[3][4]*m[4][5]-m[4][4]*m[3][5])-m[3][3]*(m[0][4]*m[4][5]-m[4][4]*m[0] [5])+m[4][3]*(m[0][4]*m[3][5]-m[3][4]*m[0][5]))-(m[1][0]*(m[3][1]*m[4][2]-m[4][1 ]*m[3][2])-m[3][0]*(m[1][1]*m[4][2]-m[4][1]*m[1][2])+m[4][0]*(m[1][1]*m[3][2]-m[ 3][1]*m[1][2]))*(m[0][3]*(m[2][4]*m[5][5]-m[5][4]*m[2][5])-m[2][3]*(m[0][4]*m[5] [5]-m[5][4]*m[0][5])+m[5][3]*(m[0][4]*m[2][5]-m[2][4]*m[0][5]))+(m[1][0]*(m[3][1 ]*m[5][2]-m[5][1]*m[3][2])-m[3][0]*(m[1][1]*m[5][2]-m[5][1]*m[1][2])+m[5][0]*(m[ 1][1]*m[3][2]-m[3][1]*m[1][2]))*(m[0][3]*(m[2][4]*m[4][5]-m[4][4]*m[2][5])-m[2][ 3]*(m[0][4]*m[4][5]-m[4][4]*m[0][5])+m[4][3]*(m[0][4]*m[2][5]-m[2][4]*m[0][5]))- (m[1][0]*(m[4][1]*m[5][2]-m[5][1]*m[4][2])-m[4][0]*(m[1][1]*m[5][2]-m[5][1]*m[1] [2])+m[5][0]*(m[1][1]*m[4][2]-m[4][1]*m[1][2]))*(m[0][3]*(m[2][4]*m[3][5]-m[3][4 ]*m[2][5])-m[2][3]*(m[0][4]*m[3][5]-m[3][4]*m[0][5])+m[3][3]*(m[0][4]*m[2][5]-m[ 2][4]*m[0][5]))+(m[2][0]*(m[3][1]*m[4][2]-m[4][1]*m[3][2])-m[3][0]*(m[2][1]*m[4] [2]-m[4][1]*m[2][2])+m[4][0]*(m[2][1]*m[3][2]-m[3][1]*m[2][2]))*(m[0][3]*(m[1][4 ]*m[5][5]-m[5][4]*m[1][5])-m[1][3]*(m[0][4]*m[5][5]-m[5][4]*m[0][5])+m[5][3]*(m[ 0][4]*m[1][5]-m[1][4]*m[0][5]))-(m[2][0]*(m[3][1]*m[5][2]-m[5][1]*m[3][2])-m[3][ 0]*(m[2][1]*m[5][2]-m[5][1]*m[2][2])+m[5][0]*(m[2][1]*m[3][2]-m[3][1]*m[2][2]))* (m[0][3]*(m[1][4]*m[4][5]-m[4][4]*m[1][5])-m[1][3]*(m[0][4]*m[4][5]-m[4][4]*m[0] [5])+m[4][3]*(m[0][4]*m[1][5]-m[1][4]*m[0][5]))+(m[2][0]*(m[4][1]*m[5][2]-m[5][1 ]*m[4][2])-m[4][0]*(m[2][1]*m[5][2]-m[5][1]*m[2][2])+m[5][0]*(m[2][1]*m[4][2]-m[ 4][1]*m[2][2]))*(m[0][3]*(m[1][4]*m[3][5]-m[3][4]*m[1][5])-m[1][3]*(m[0][4]*m[3] [5]-m[3][4]*m[0][5])+m[3][3]*(m[0][4]*m[1][5]-m[1][4]*m[0][5]))-(m[3][0]*(m[4][1 ]*m[5][2]-m[5][1]*m[4][2])-m[4][0]*(m[3][1]*m[5][2]-m[5][1]*m[3][2])+m[5][0]*(m[ 3][1]*m[4][2]-m[4][1]*m[3][2]))*(m[0][3]*(m[1][4]*m[2][5]-m[2][4]*m[1][5])-m[1][ 3]*(m[0][4]*m[2][5]-m[2][4]*m[0][5])+m[2][3]*(m[0][4]*m[1][5]-m[1][4]*m[0][5])) Runtime : 0.037 [sec]
※参考URL
●行列式の値を計算するプログラムをPythonで作ってみた。
●行列式の値を計算するプログラムをPythonで作ってみた。(2)
●行列式の値を計算するプログラムをPythonで作ってみた。(3)
- 作者: 奥村晴彦,杉浦方紀,津留和生,首藤一幸,土村展之
- 出版社/メーカー: 技術評論社
- 発売日: 2003/05
- メディア: 単行本
- 購入: 2人 クリック: 61回
- この商品を含むブログ (60件) を見る