С помощью этой матрицы и векторного представления, это помогает сделать умножение матрицы следующим образом:
(кол 1 ... кол 8 ) * (v 1 ... v 8 ) T = col 1 * v 1 + ... + col 8 * v 8
, где матрица A = (кол 1 ... кол 8 )
и вектор столбца v = (v 1 ... v 8 ) T
Если подумать об этом, вы можете выполнить все умножения за один раз, если переведите 8-битный вектор в 64-битный вектор, повторяя каждый бит 8 раз и затем вычисляя P = A & v_inflated
. Остается только добавить (то есть XOR) продуктов.
Простой подход для XORing продуктов:
uint64_t P = calculated products from text above;
uint64_t sum = 0;
for( int i = 8; i; --i )
{
sum ^= P & 0xFF;
P >> 8;
}