具有x ^ n-1(mod p)的多项式的结果
我正在实现NTRUSign算法,如http://grouper.ieee.org/groups/1363/lattPK/submissions/EESS1v2.pdf第2.2.7.1节所述,该算法涉及计算多项式的结果。我一直得到一个零向量的结果,这显然是不正确的。
private static CompResResult compResMod(IntegerPolynomial f, int p) {
int N = f.coeffs.length;
IntegerPolynomial a = new IntegerPolynomial(N);
a.coeffs[0] = -1;
a.coeffs[N-1] = 1;
IntegerPolynomial b = new IntegerPolynomial(f.coeffs);
IntegerPolynomial v1 = new IntegerPolynomial(N);
IntegerPolynomial v2 = new IntegerPolynomial(N);
v2.coeffs[0] = 1;
int da = a.degree();
int db = b.degree();
int ta = da;
int c = 0;
int r = 1;
while (db > 0) {
c = invert(b.coeffs[db], p);
c = (c * a.coeffs[da]) % p;
IntegerPolynomial cb = b.clone();
cb.mult(c);
cb.shift(da - db);
a.sub(cb, p);
IntegerPolynomial v2c = v2.clone();
v2c.mult(c);
v2c.shift(da - db);
v1.sub(v2c, p);
if (a.degree() < db) {
r *= (int)Math.pow(b.coeffs[db], ta-a.degree());
r %= p;
if (ta%2==1 && db%2==1)
r = (-r) % p;
IntegerPolynomial temp = a;
a = b;
b = temp;
temp = v1;
v1 = v2;
v2 = temp;
ta = db;
}
da = a.degree();
db = b.degree();
}
r *= (int)Math.pow(b.coeffs[0], da);
r %= p;
c = invert(b.coeffs[0], p);
v2.mult(c);
v2.mult(r);
v2.mod(p);
return new CompResResult(v2, r);
}
http://www.crypto.rub.de/imperia/md/content/texte/theses/da_driessen.pdf中存在伪代码,看起来非常相似。
为什么我的代码不起作用? 我可以检查一下中间结果吗?
我没有发布IntegerPolynomial代码,因为它不太有趣,而且我通过了单元测试。 CompResResult只是一个简单的“Java结构”。
答案 0 :(得分:1)
作为替代方案,请考虑JScience班Polynomial<R extends Ring<R>>
。由于该类是通用的,Polynomial<Integer>
可能会简化实现。此example使用Polynomial<Complex>
以方便测试。
答案 1 :(得分:0)
我的猜测是(int)Math.pow(b.coeffs [0],da)评估为0.您是否尝试使用调试器逐步执行此代码,它应该显示为什么您的值为零时间。