NTL库GF2X

问题描述 投票:2回答:1

我正在使用NTL库试验Galois Field。 GF2是整数mod 2,GF2XGF2上的多项式,GF2EGF2上的环/场扩展。

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

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

我知道我可能错过了一些明显的东西,但我对这个领域很新,所以请耐心等待。

谢谢!

c++ polynomial-math polynomials ntl
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.