package alg

import (
	"zhimolostnova_anna_lab_6/util"
)

// Determinant Функция для вычисления детерминанта матрицы
func Determinant(matrix [][]float64) float64 {
	size := len(matrix)

	if size == 1 {
		return matrix[0][0]
	}

	if size == 2 {
		return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
	}

	// Рекурсивное вычисление детерминанта по разложению по первой строке
	det := 0.0
	for j := 0; j < size; j++ {
		subMatrix := util.GetMinor(matrix, j)
		sign := 1
		if j%2 != 0 {
			sign = -1
		}
		det += float64(sign) * matrix[0][j] * Determinant(subMatrix)
	}
	return det
}