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)) & 1の i番目のビットを選択します。

A は unsigned long の 2 次元配列で、A->row 行と 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 が 2 を法とする整数の多項式を表している場合もあります。(これは暗号化の一般的なタイプです。)

cR は単一のビット配列であり、A->rwdcnt = A->coln / BITS_PER_LONG であると思われます。

事実上、これは 2 を法とする整数に対する標準の配列乗算です。

于 2012-08-27T17:08:02.080 に答える