行列式の展開式を文字列で求めるプログラムをPythonで作ってみた。

 行列式の展開式を文字列で求めるプログラムを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)

Javaによるアルゴリズム事典

Javaによるアルゴリズム事典