1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use core::ops::{Add, Mul, Sub};
#[inline]
pub fn det<T>(out: &[T; 16]) -> T
where
T: Add<T, Output = T> + Sub<T, Output = T>,
for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
{
let a00 = &out[0];
let a01 = &out[1];
let a02 = &out[2];
let a03 = &out[3];
let a10 = &out[4];
let a11 = &out[5];
let a12 = &out[6];
let a13 = &out[7];
let a20 = &out[8];
let a21 = &out[9];
let a22 = &out[10];
let a23 = &out[11];
let a30 = &out[12];
let a31 = &out[13];
let a32 = &out[14];
let a33 = &out[15];
let b00 = a00 * a11 - a01 * a10;
let b01 = a00 * a12 - a02 * a10;
let b02 = a00 * a13 - a03 * a10;
let b03 = a01 * a12 - a02 * a11;
let b04 = a01 * a13 - a03 * a11;
let b05 = a02 * a13 - a03 * a12;
let b06 = a20 * a31 - a21 * a30;
let b07 = a20 * a32 - a22 * a30;
let b08 = a20 * a33 - a23 * a30;
let b09 = a21 * a32 - a22 * a31;
let b10 = a21 * a33 - a23 * a31;
let b11 = a22 * a33 - a23 * a32;
&b00 * &b11 - &b01 * &b10 + &b02 * &b09 + &b03 * &b08 - &b04 * &b07 + &b05 * &b06
}