competitive_programming_rs/math/
determinant.rs1pub 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}