# Multiplication in GF(2) of rectangular matrices hanging indefinitely

Posted 13 days ago
234 Views
|
3 Replies
|
0 Total Likes
|
 I have been attempting to execute the following matrix multiplication over GF(2) using the FiniteFields package with (17 x 18) x (18 x 17) rectangular matrices, but Mathematica (version 12.1.1.0, Mac OS) is hanging indefinitely (I killed the kernel after waiting a few minutes): << FiniteFields m = {{GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}]}, {GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}]}, {GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}]}, {GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}]}, {GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}]}, {GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}]}, {GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}]}, {GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}]}, {GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}]}, {GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}]}, {GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}]}, {GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}]}, {GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}]}, {GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}]}, {GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}]}, {GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}]}, {GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{1}]}, {GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{1}], GF[2][{0}], GF[2][{0}], GF[2][{0}], GF[2][{1}], GF[2][{1}], GF[2][{0}]}} Transpose[m] . m A very small (3 x 2) x (2 x 3) rectangular example however works immediately: << FiniteFields x = {{GF[2][{1}], GF[2][{1}], GF[2][{1}]}, {GF[2][{1}], GF[2][{0}], GF[2][{1}]}} Transpose[x] . x Any ideas? Also of note, the smaller example produces "0" instead of "{0}_2", but I've seen other calculations keep the idea that the zero is in GF(2): GF[2][{1}] * GF[2][{0}] produces "{0}_2", but GF[2][{1}] + GF[2][{1}] produces "0" which is odd.
3 Replies
Sort By:
Posted 13 days ago
 I would recommend just using Dot on integer (0-1) matrices, and then taking the result mod 2.
 Okay, you can do as follows.(1) Represent the field elements using a polynomial to define the extension.(2) Take the usual dot product. Use PolynomialReduce to reduce mod 2 and that defining polynomial.(3) Use ResourceFunction["LinearAlgebraMod"][...,"Inverse"] to find the matrix inverse.(4) Use that dot product and reduction again.If I find time I might add "Dot" to the LinearAlgebraMod repertoire. "Det" was also a latecomer...I should have added Dot when I put in dat Det.