我正在使用NTL库对Galois Field进行试验。 GF2是整数mod 2,GF2XGF2的多项式,GF2EGF2的ring / field扩展。

我面临的问题是我按如下方式初始化不可约多项式

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的字段/环,由不可约多项式定义。

我知道我可能会遗漏一些明显的东西,但是我对这个 Realm 还很陌生,所以请多多包涵。

谢谢!

最佳答案

正如您已经说过的,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(),但这仅在不可约多项式为您时才给出度数。当您找到正确的方法时,请告诉我。

关于c++ - NTL库GF2X,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55291660/

10-12 22:13