1

我正在研究乘法源代码,但我不明白这个乘法函数x*A。请用任何数字示例帮助我理解这一点?

#define BITS_PER_LONG (8 * sizeof (unsigned long))

typedef struct matrix{
int rown;//number of rows.
int coln;//number of columns.
int rwdcnt;//number of words in a row
int alloc_size;//number of allocated bytes
unsigned long *elem;//row index.
}*binmat_t;

void mat_vec_mul(unsigned long *cR, unsigned char *x, binmat_t A)
{
    int i,j;
    unsigned long *pt;

    memset(cR, 0, A->rwdcnt*sizeof(long));
    pt = A->elem;
    for(i=0; i<A->rown; i++)
    {
        if ((x[i/8] >> (i%8)) & 1)
            for (j = 0;  j < A->rwdcnt;  ++j)
                cR[j] ^= *pt++;
        else
            pt += A->rwdcnt;
    }
}
4

1 回答 1

2

x 是位向量,存储在 char 数组中。x 中的位数是 A->rown。该表达式选择 x 的(x[i/8] >> (i%8)) & 1i位。

A 是 unsigned long 的二维数组,具有 A->rown 行和 A->rwdcnt 列。

cR 是带有 A->rwdcnt 元素的 unsigned long 向量。进入此例程时清除 cR。

if语句确定 x 中的第 i是否打开。如果该位打开,则将 A 的第 i“添加”到 cR。如果该位为关闭,则else子句跳过 A 的这一列。由于一个位只能有 1 或 0 的值,这if-else相当于将 A 的列乘以该位并将乘积与 cR 相加。

“加法”由 XOR 完成。这里的解释不清楚。可能每个 cR 是单个位数组(和 A 的每一列),或者可能是每个 cR(和 A)中的 unsigned long 表示整数模二上的多项式。(这是密码学中的常见类型。)

我怀疑 cR 是单个位数组,并且 A->rwdcnt = A->coln / BITS_PER_LONG。

实际上,这是对整数模二的标准数组乘法。

于 2012-08-27T17:08:02.080 回答