はじめに
本記事はQiita 全国学生対抗戦 Advent Calender2024に参加しています。
Advent calender
こんにちは。あずびわです。
現在、数学科に通っている1年生です。
代数学の授業で線形代数を習ったので、その中でも行列式をいろいろな定義を用いてプログラムで実装したいと思います!
行列の準備
今回は計算が分かりやすいように、3次正方行列を用いて計算します。
import random
N = 3 # 3次行列
matrix = [[random.randint(0,5) for i in range(N)]for i in range(N)]
for i in range(N):
print(matrix[i])
二重のリストを使って行列を作成しています。
行列の要素は0から5までランダムな整数を取るようにしています。
行列式の定義
n次正方行列${A=(a_{ij})}$に対して、置換${S_n}$を用いて
${\det A =\sum_{\sigma \in S_n} \varepsilon (\sigma)a_1{\sigma _{(1)}}a_2...a_n{\sigma _{(n)}}}$
と表されるものが行列式です。
これは、各行各列から1つずつ要素を取り出してかけて、そこにそれらの置換に応じた符号をかけて足し合わせたものになります。
det = 0
for i in range(3):
for j in range(3):
if i!=j:
k = (6-i-j)%3 # 3行目が何列目になるか
hugou_pls = False
if (i==0 and j==1 and k==2) or (i!=0 and j!=1 and k!=2): # 置換による符号
hugou_pls = True
sum = matrix[0][i] * matrix[1][j] * matrix[2][k]
if hugou_pls:
det += sum
else:
det -= sum
print(det)
こんな感じです。
今回は3次正方行列を考えているので、置換は各行と各列の値が等しい時か各行と各列の値が全て異なっている時に正になります。
余因子展開
det = 0
for i in range(3):
sum = matrix[i][0] * (matrix[(i+1)%N][1] * matrix[(i+2)%N][2] - matrix[(i+1)%N][2] * matrix[(i+2)%N][1])
det += sum
print(det)
余因子展開は、1つの行または列を選び、そこから小行列を考えて行列式を計算する方法です。
このプログラムでは、1列目で余因子展開しています。
サラスの公式
det = 0
det += matrix[0][0] * matrix[1][1] * matrix[2][2]
det += matrix[0][1] * matrix[1][2] * matrix[2][0]
det += matrix[0][2] * matrix[1][0] * matrix[2][1]
det -= matrix[0][0] * matrix[1][2] * matrix[2][1]
det -= matrix[0][1] * matrix[1][0] * matrix[2][2]
det -= matrix[0][2] * matrix[1][1] * matrix[2][0]
print(det)
3次正方行列で使える公式で、斜めにかけて足すことで行列式を求めることができます。
プログラムとしては見たままで、それぞれの対象を計算して、足すものと引くものに分けて計算しています。