[4 kyu] Matrix Determinant
Question
Sample Tests
My Answer (accepted)
"""
Matrix Determinant (n*n)
Calculate the determinant with Laplace expansion method
"""
def get_M(x_index, y_index, matrix):
"""
Get a remainder of the determinant
"""
M_ans = []
for row in range(len(matrix)):
element_tmp = []
if x_index == row:
continue
for column in range(len(matrix[row])):
if y_index == column:
continue
element_tmp.append(matrix[row][column])
M_ans.append(element_tmp)
return M_ans
def determinant(matrix):
"""
Calculate the determinant with Laplace expansion method
"""
# Termination condition
if len(matrix) == 1:
return matrix[0][0]
elif len(matrix) == 2:
return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
# Recursive condition
else:
ans = 0
for i in range(len(matrix)):
# Algebraic remainder
A_matrix_ans = (-1)**(0+i) * determinant(get_M(0, i, matrix))
ans += matrix[0][i] * A_matrix_ans
return ans
if __name__ == "__main__":
m0 = [ [2] ]
m1 = [ [1, 3],
[2, 5]]
m2 = [ [2, 5, 3],
[1, -2, -1],
[1, 3, 4]]
print(determinant(m0))
Suggested Answer
import numpy as np
def determinant(a):
return round(np.linalg.det(np.matrix(a)))
def determinant(m):
a = 0
if len(m) == 1:
a = m[0][0]
else:
for n in xrange(len(m)):
if (n + 1) % 2 == 0:
a -= m[0][n] * determinant([o[:n] + o[n+1:] for o in m[1:]])
else:
a += m[0][n] * determinant([o[:n] + o[n+1:] for o in m[1:]])
return a