待ってください... m が単純に S の長さである場合、すべてがより単純になります。
int re = 1;
int sig = 0;
for (int i=m-1; i>=0; --m) {
if (s[i] != 0)
sig ^= re;
re = (re*r) & 0xffffffff;
}
これは私には単純すぎるように思えます。あなたは正しい表現を持っていると確信していますか?
(私の元の答え:
まだ持っていない場合は、整数指数関数から始めます。
/**
* Return x^e, mod 2^32
*/
unsigned int
iExp(unsigned int x, unsigned int e)
{
unsigned int rval = 1;
while (e > 0) {
if ((e & 1) != 0)
rval *= x;
x *= x;
e >>= 1;
}
return rval & 0xffffffff;
}
S が 0 または 1 の値の配列である場合、それは実際には部分式の残りの「使用」/「使用しない」フラグです。
// I've taken the liberty of indexing S starting at 0 instead of 1
// compute f(s) = (S[0]r^m-1) xor (S[1]r^m-2) xor....(xor S[m-1]r^0)) mod (2^32)
int rval = 0;
for (x : S) {
--m;
if (x != 0)
rval ^= iExpr(r, m);
}
私はこれをテストしていませんが (テスト ベクトルはありません)、これでうまくいくはずです。