52 lines
1.2 KiB
Elixir
52 lines
1.2 KiB
Elixir
defmodule MatrixArithmetic do
|
|
def minor(a, x, y) do
|
|
length = length(a) - 1
|
|
for i <- 0..(length - 1), into: [] do
|
|
for j <- 0..(length - 1), into: [] do
|
|
cond do
|
|
i < x && j < y -> Enum.at(Enum.at(a, i), j)
|
|
i >= x && j < y -> Enum.at(Enum.at(a, i + 1), j)
|
|
i < x && j >= y -> Enum.at(Enum.at(a, i), j + 1)
|
|
true -> Enum.at(Enum.at(a, i + 1), j + 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def det(a) do
|
|
if length(a) == 1 do
|
|
Enum.at(Enum.at(a, 0), 0)
|
|
else
|
|
Enum.reduce(0..(length(a) - 1), 0, fn i, sum ->
|
|
sign = if rem(i, 2) == 0, do: 1, else: -1
|
|
sum + sign * Enum.at(Enum.at(a, 0), i) * det(minor(a, 0, i))
|
|
end)
|
|
end
|
|
end
|
|
|
|
def perm(a) do
|
|
if length(a) == 1 do
|
|
Enum.at(Enum.at(a, 0), 0)
|
|
else
|
|
Enum.reduce(0..(length(a) - 1), 0, fn i, sum ->
|
|
sum + Enum.at(Enum.at(a, 0), i) * perm(minor(a, 0, i))
|
|
end)
|
|
end
|
|
end
|
|
|
|
def main do
|
|
# Using the provided test matrix
|
|
m = [
|
|
[0, 1, 2, 3, 4],
|
|
[5, 6, 7, 8, 9],
|
|
[10, 11, 12, 13, 14],
|
|
[15, 16, 17, 18, 19],
|
|
[20, 21, 22, 23, 24]
|
|
]
|
|
|
|
IO.puts("Determinant: #{det(m)}")
|
|
IO.puts("Permanent: #{perm(m)}")
|
|
end
|
|
end
|
|
|
|
MatrixArithmetic.main()
|