competitive_programming_rs/math/
determinant.rs

1pub fn calc_determinant<T>(mut matrix: Vec<Vec<T>>) -> T
2where
3    T: Copy + std::ops::Sub<Output = T> + std::ops::Mul<Output = T> + std::ops::Div<Output = T>,
4{
5    let n = matrix.len();
6    assert!(
7        matrix.iter().all(|row| row.len() == n),
8        "The matrix is not square!"
9    );
10
11    for i in 0..n {
12        for j in (i + 1)..n {
13            let b = matrix[j][i] / matrix[i][i];
14            for k in 0..n {
15                matrix[j][k] = matrix[j][k] - matrix[i][k] * b;
16            }
17        }
18    }
19
20    let mut det = matrix[0][0];
21    for i in 1..n {
22        det = det * matrix[i][i];
23    }
24    det
25}
26
27#[cfg(test)]
28mod tests {
29    use crate::math::determinant::calc_determinant;
30
31    #[test]
32    fn test_calc_determinant() {
33        let a = vec![vec![1, 2, 3], vec![2, 2, 4], vec![2, 4, 5]];
34        let det = calc_determinant(a);
35        assert_eq!(det, 2);
36    }
37}