我使用两个bitsets来存储两个多项式。我希望他们中的一个被第二分割,我想在分裂后得到余数。例如,如果我愿意在纸上:
w1= 110011010000000
w2 = 1111001
101000100
110011010000000 : 1111001
1111001
--1111110
1111001
----1110000
1111001
---100100 = remainder
答案 0 :(得分:1)
很少有CPU像这样有内置的GF(2)分区指令,所以你需要自己用shift和xors来实现它。基本上,你完全像在纸面上那样实现它 - 将除数向上移动直到它的最高位与被除数相匹配,然后xor并向下移动,记录每个位置,你需要xor作为商的一点。如果所讨论的所有多项式都适合单个单词,则可以使用unsigned
整数类型。否则,您将需要一些multiprecision bitset类型。 C ++ std::bitset
可以用于此,尽管存在问题(没有简单的方法在不同大小的位集之间进行转换,没有位扫描功能)。
template<size_t N> int top_bit_set(const bitset<N> &a) {
int i;
for (i = N-1; i >= 0; i--)
if (a.test(i)) break;
return i;
}
template<size_t N>
bitset<N> gf2_div(bitset<N> dividend, bitset<N> divisor, bitset<N> &remainder) {
bitset<N> quotient(0);
int divisor_size = top_bit_set(divisor);
if (divisor_size < 0) throw divide_by_zero();
int bit;
while ((bit = top_bit_set(dividend)) >= divisor_size) {
quotient.set(bit - divisor_size);
dividend ^= divisor << (bit - divisor_size); }
remainder = dividend;
return quotient;
}