RosettaCodeData/Task/Determinant-and-permanent/Elixir/determinant-and-permanent.ex
2025-08-11 18:05:26 -07:00

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()