Я пишу библиотеку для вычислений в конечных полях. Сейчас я делаю функции для операций над многочленами над полем
![$GF(2)$ $GF(2)$](https://dxdy-02.korotkov.co.uk/f/9/2/3/9239362763b497912787fdddeac51ca282.png)
. Вот пример функции взятия остатка, которую я нашел в одной книге на псевдокоде.
Код:
int degree(uint8_t a) {
if (a == 0)
return -1;
else
return bit_length(a) - 1;
}
uint8_t rem(uint8_t a, uint8_t b) {
uint8_t result = a;
while (degree(result) >= degree(b)) {
int position = degree(result) - degree(b);
result ^= b << position; // minus x^pos
}
return result;
}
Мне непонятна в функции
![$rem$ $rem$](https://dxdy-04.korotkov.co.uk/f/f/d/6/fd6fb9d617b3503d3239971fee0d635282.png)
операция
Код:
result ^= b << position
Что здесь происходит? Строкой выше разность степеней многочленов
![$result$ $result$](https://dxdy-03.korotkov.co.uk/f/6/9/9/69914638c5b78aa32701c82d9b246b1a82.png)
и
![$b$ $b$](https://dxdy-01.korotkov.co.uk/f/4/b/d/4bdc8d9bcfb35e1c9bfb51fc69687dfc82.png)
это степень икса в частном при делении в столбик. А что происходит потом, где операция
![$xor$ $xor$](https://dxdy-03.korotkov.co.uk/f/2/6/b/26be471592150fa188072792f7ecd83082.png)
и битовый сдвиг? Здесь мой комментарий 'minus x power pos', я предположил, что это вычитание результата умножения делителя на степень икса как при делении в столбик, но я не уверен.