C 与此代码对应的矩阵/向量运算是什么?

C 与此代码对应的矩阵/向量运算是什么?,c,math,matrix,linear-algebra,galois-field,C,Math,Matrix,Linear Algebra,Galois Field,代码如下: long long mul(long long x) { uint64_t M[64] = INIT; uint64_t result = 0; for ( int i = 0; i < 64; i++ ) { uint64_t a = x & M[i]; uint64_t b = 0; while ( a ){ b ^= a & 1;;

代码如下:

long long mul(long long x)
{
    uint64_t M[64] = INIT;
    uint64_t result = 0;

    for ( int i = 0; i < 64; i++ )
    {
        uint64_t a = x & M[i];
        uint64_t b = 0;
        while ( a ){
            b ^= a & 1;;
            a >>= 1;
        }
        result |= b << (63 - i);
    }
    return result;
}
long-long-mul(长x)
{
uint64_t M[64]=INIT;
uint64_t结果=0;
对于(int i=0;i<64;i++)
{
uint64_t a=x&M[i];
uint64_t b=0;
while(a){
b^=a&1;;
a>>=1;
}
结果|=b>(64-j))&1)
a^=a[b];
b++;
}
}
返回a;
}
我想知道这段代码是什么线性代数运算(在GF(2)上):

long long unknown(long long x)
{
    uint64_t A[] = INIT;
    uint64_t a = 0, b = 0;

    for( i = 1; i <= 64; i++ ){
        for( j = i; j <= 64; j++ ){
            if( ((x >> (64-i)) & 1) && ((x >> (64-j)) & 1) )
                a ^= A[b];
            b++;
        }
    }
    return a;
}
当然你指的是GF(2)64,GF(2)上的64维向量场

首先考虑循环结构:

,它正在测试向量
x
是否同时设置了位
i
和位
j
。如果是,那么我们通过向量和(=按元素的异或)将一行矩阵
a
添加到累加变量
a
。通过在每个内部循环迭代中增加
b
,我们确保每个迭代为
a
的不同行提供服务。这也告诉我们,
A
必须有64*65/2=160行(这很重要)

一般来说,这根本不是一个线性操作。GF(2)上的向量场上的运算
o
是线性的,其标准可归结为适用于所有向量对
x
y

    o(x + y) = o(x) + o(y)

现在,为了便于说明,我们考虑字段GF(2)2,而不是GF(2)64;只要加上零,结果就可以从前者扩展到后者。设

x
为位向量(1,0)(例如,由整数2表示)。设
y
为位向量(0,1)(由整数1表示)。让
A
成为这个矩阵:

1 0
0 1
1 0
您的操作有以下结果:

operand   result   as integer   comment
 x        (1, 0)      2         Only the first row is accumulated
 y        (1, 0)      2         Only the third row is accumulated
 x + y    (0, 1)      1         All rows are accumulated
显然,对于该
x
y
和特征
A
,不是
o(x)+o(y)=o(x+y)
,因此该
A
的操作不是线性的


有一些矩阵
A
对应的运算是线性的,但它们所表示的线性运算将取决于
A
。例如,可以用这种方式表示各种各样的矩阵向量乘法。我不清楚矩阵向量乘法以外的线性运算是否可以用这种形式表示,但我倾向于不这样认为。

什么是
INIT
?它只是一些初始值。要与向量x相乘的矩阵。但我不知道A是矩阵。A不是方阵。您希望在此处使用
无符号
数据类型。在向量或任何矩阵元素设置了符号位的情况下,移位操作具有实现定义的行为。此外,我建议使用显式宽度整数类型(即
uint64\t
),因为您似乎依赖于该宽度
unsigned long-long
的位数不会少于64位,但可能会更多,这可能会给您带来麻烦,甚至会造成不必要的性能损失。我知道,但我忽略了它。很抱歉
1 0
0 1
1 0
operand   result   as integer   comment
 x        (1, 0)      2         Only the first row is accumulated
 y        (1, 0)      2         Only the third row is accumulated
 x + y    (0, 1)      1         All rows are accumulated