|
18 | 18 | return bilinear_vecdot(x0, cross(x1, x2)) |
19 | 19 | end |
20 | 20 |
|
| 21 | +@inline function _prod2x2minors(A, a,b,c,d) |
| 22 | + @inbounds return (A[a]*A[b+4] - A[b]*A[a+4])*(A[c+8]*A[d+12] - A[c+12]*A[d+8]) |
| 23 | +end |
| 24 | + |
21 | 25 | @inline function _det(::Size{(4,4)}, A::StaticMatrix) |
22 | | - @inbounds return ( |
23 | | - A[13] * A[10] * A[7] * A[4] - A[9] * A[14] * A[7] * A[4] - |
24 | | - A[13] * A[6] * A[11] * A[4] + A[5] * A[14] * A[11] * A[4] + |
25 | | - A[9] * A[6] * A[15] * A[4] - A[5] * A[10] * A[15] * A[4] - |
26 | | - A[13] * A[10] * A[3] * A[8] + A[9] * A[14] * A[3] * A[8] + |
27 | | - A[13] * A[2] * A[11] * A[8] - A[1] * A[14] * A[11] * A[8] - |
28 | | - A[9] * A[2] * A[15] * A[8] + A[1] * A[10] * A[15] * A[8] + |
29 | | - A[13] * A[6] * A[3] * A[12] - A[5] * A[14] * A[3] * A[12] - |
30 | | - A[13] * A[2] * A[7] * A[12] + A[1] * A[14] * A[7] * A[12] + |
31 | | - A[5] * A[2] * A[15] * A[12] - A[1] * A[6] * A[15] * A[12] - |
32 | | - A[9] * A[6] * A[3] * A[16] + A[5] * A[10] * A[3] * A[16] + |
33 | | - A[9] * A[2] * A[7] * A[16] - A[1] * A[10] * A[7] * A[16] - |
34 | | - A[5] * A[2] * A[11] * A[16] + A[1] * A[6] * A[11] * A[16]) |
| 26 | + @inbounds return (_prod2x2minors(A,1,2,3,4) - _prod2x2minors(A,1,3,2,4) + _prod2x2minors(A,1,4,2,3) |
| 27 | + +_prod2x2minors(A,2,3,1,4) - _prod2x2minors(A,2,4,1,3) + _prod2x2minors(A,3,4,1,2)) |
35 | 28 | end |
36 | 29 |
|
| 30 | + |
37 | 31 | @inline function _parity(p) # inefficient compared to computing cycle lengths, but non-allocating |
38 | 32 | s = 0 |
39 | 33 | for i in 1:length(p), j in i+1:length(p) |
|
0 commit comments