问题描述
在我的函数 PolynomialIrreducibility()
中,我正在评估输入的多项式是否不可约超过 GF(prime_number)。
void PolynomialIrreducibility () {
// Enter prime number
ZZ prime_number;
ZZ_pX polynom;
do {
cout << "Enter prime number: ";
cin >> prime_number;
} while (!ProbPrime(prime_number));
ZZ_p::init(prime_number); // define GF(prime_number)
// Enter n
long n;
do {
cout << "Enter n: ";
cin >> n;
} while (n < 1);
BuildIrred(polynom,n); // generate an irreducible polynomial P of degree n over GF(prime_number)
ZZ_pE::init(polynom); // define GF(prime_number^n)
// Enter polynom
ZZ_pX input_polynom;
cout << "Enter polynom: ";
cin >> input_polynom;
ZZ_pEX convert_polynom;
conv(convert_polynom,input_polynom);
if (DetIrredTest(convert_polynom)) {
//if (ProbIrredTest(convert_polynom)) {
//if (IterIrredTest(convert_polynom) {
cout << "-> Irreducible polynomial" << endl;
}
else {
cout << "-> Reducible polynomial" << endl;
}
}
在使用不可约多项式 x^2 + x + 2 测试实现的函数时,所有三个函数(DetIrredTest、ProbIrredTest、IterIrredTest)用于确定多项式是否不可约或不评估它是否是不可约的,即使它不是不可约的 GF(3 ) 如下所示。
Enter prime number: 3
Enter n: 2
Enter polynom: [2 1 1]
-> Reducible polynomial
请问,我是否以错误的方式评估了不可约性,还是我做错了什么?
解决方法
aschepler 评论了一个问题,GF(p) 中 n 次不可约多项式在 GF(p^n) 中不可约。它将有 n 个根。我建议进行此更改,以便 DetIrredTest() 在 GF(p) 中运行:
BuildIrred(polynom,1); // build irreducible poly of degree 1
我在 GF(3) 中发现了三个不可约多项式,它们可以用作 GF(9) 的约简多项式:
x^2 + 1 irreducible (x + 1 is a primitive element)
x^2 + x + 2 primitive (x is a primitive element)
x^2 + 2 x + 2 primitive (x is a primitive element)