From 2927745bf2a2a3f18451c07fadd0e378cfc04152 Mon Sep 17 00:00:00 2001 From: Jack Snoeyink Date: Wed, 22 Jun 2022 17:32:21 -0400 Subject: [PATCH 1/2] Rewrite 4x4 det as product of 2x2 minors --- src/det.jl | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/det.jl b/src/det.jl index 10a81d8b..f610ddab 100644 --- a/src/det.jl +++ b/src/det.jl @@ -18,22 +18,18 @@ end return bilinear_vecdot(x0, cross(x1, x2)) end +@inline function _prod2x2minors(A, a,b,c,d) + # @assert all(Base.isbetween.(1, (a,b,c,d),4)) + @inbounds return (A[a]*A[b+4] - A[b]*A[a+4])*(A[c+8]*A[d+12] - A[c+12]*A[d+8]) + # @inbounds return muladd(A[a], A[b+4], -A[b]*A[a+4])*muladd(A[c+8],A[d+12], -A[c+12]*A[d+8]) +end + @inline function _det(::Size{(4,4)}, A::StaticMatrix) - @inbounds return ( - A[13] * A[10] * A[7] * A[4] - A[9] * A[14] * A[7] * A[4] - - A[13] * A[6] * A[11] * A[4] + A[5] * A[14] * A[11] * A[4] + - A[9] * A[6] * A[15] * A[4] - A[5] * A[10] * A[15] * A[4] - - A[13] * A[10] * A[3] * A[8] + A[9] * A[14] * A[3] * A[8] + - A[13] * A[2] * A[11] * A[8] - A[1] * A[14] * A[11] * A[8] - - A[9] * A[2] * A[15] * A[8] + A[1] * A[10] * A[15] * A[8] + - A[13] * A[6] * A[3] * A[12] - A[5] * A[14] * A[3] * A[12] - - A[13] * A[2] * A[7] * A[12] + A[1] * A[14] * A[7] * A[12] + - A[5] * A[2] * A[15] * A[12] - A[1] * A[6] * A[15] * A[12] - - A[9] * A[6] * A[3] * A[16] + A[5] * A[10] * A[3] * A[16] + - A[9] * A[2] * A[7] * A[16] - A[1] * A[10] * A[7] * A[16] - - A[5] * A[2] * A[11] * A[16] + A[1] * A[6] * A[11] * A[16]) + @inbounds return (_prod2x2minors(A,1,2,3,4) - _prod2x2minors(A,1,3,2,4) + _prod2x2minors(A,1,4,2,3) + +_prod2x2minors(A,2,3,1,4) - _prod2x2minors(A,2,4,1,3) + _prod2x2minors(A,3,4,1,2)) end + @inline function _parity(p) # inefficient compared to computing cycle lengths, but non-allocating s = 0 for i in 1:length(p), j in i+1:length(p) From 4a8a6164d783274a7691ef2f0695a14f2f47a8ed Mon Sep 17 00:00:00 2001 From: Mateusz Baran Date: Fri, 8 Jul 2022 15:19:59 +0200 Subject: [PATCH 2/2] Update src/det.jl --- src/det.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/det.jl b/src/det.jl index f610ddab..2473a4b1 100644 --- a/src/det.jl +++ b/src/det.jl @@ -19,9 +19,7 @@ end end @inline function _prod2x2minors(A, a,b,c,d) - # @assert all(Base.isbetween.(1, (a,b,c,d),4)) @inbounds return (A[a]*A[b+4] - A[b]*A[a+4])*(A[c+8]*A[d+12] - A[c+12]*A[d+8]) - # @inbounds return muladd(A[a], A[b+4], -A[b]*A[a+4])*muladd(A[c+8],A[d+12], -A[c+12]*A[d+8]) end @inline function _det(::Size{(4,4)}, A::StaticMatrix)