NTL库GF2X

3
我正在使用NTL库实验有限域。 GF2是模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个回答

2
正如您所说,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(),但这只会给出不可约多项式的次数。如果你找到了正确的方法,请告诉我。

谢谢,这非常有帮助!如果我找到更好的解决方案,我会编辑问题。 - jimouris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接