NTL библиотека GF2X - PullRequest
       40

NTL библиотека GF2X

2 голосов
/ 22 марта 2019

Я экспериментирую с полем Галуа, используя библиотеку NTL. GF2 - целые числа mod 2, GF2X - полиномы над GF2 и GF2E - расширение кольца / поля над GF2.

Проблема, с которой я сталкиваюсь, заключается в том, что я инициализирую неприводимый многочлен следующим образом

GF2X irreduc;
SetCoeff(irreduc, 128, 1);
SetCoeff(irreduc, 7, 1);
SetCoeff(irreduc, 2, 1);
SetCoeff(irreduc, 1, 1);
SetCoeff(irreduc, 0, 1);
GF2E::init(irreduc);

и затем я также инициализирую два полинома:

GF2X a; 
SetCoeff(a, 120);
SetCoeff(a, 22);

GF2X b;
SetCoeff(b, 128);
SetCoeff(b, 51);

std::cout << "a: " << a << '\n';
std::cout << "b: " << b << '\n';

и умножьте их:

std::cout << "\ndeg(a * b): " << deg(a * b) << '\n';

Выходное значение равно deg(a * b): 248 , которое находится вне поля / кольца 2^128, определяемого неприводимым полиномом.

Я знаю, что, возможно, мне не хватает чего-то очевидного, но я очень новичок в этой области, поэтому терпите меня.

Спасибо!

1 Ответ

1 голос
/ 22 марта 2019

Как вы уже сказали, GF2X представляет многочлены над GF2, поэтому они не уменьшаются по многочлену, которым вы инициализировали GF2E. Вам нужно преобразовать полиномы в GF2E, и тогда все будет работать как положено.

Таким образом, изменяя вашу последнюю строку на

std::cout << "\ndeg(a * b): " << deg(conv<GF2X>(conv<GF2E>(a) * conv<GF2E>(b))) << '\n';

приводит к выводу

deg(a * b): 124

Это преобразование довольно уродливо. Я не уверен, есть ли лучший способ сделать это и способ, которым NTL задокументирован, трудно найти правильные функции для того, что вы хотите сделать. Я только нашел GF2E::degree(), но это дает вам только степень, если неприводимый многочлен. Дайте мне знать, когда вы найдете правильный способ сделать это.

...