具有x ^ n-1的多项式的结果

时间:2011-01-02 19:01:56

标签: java cryptography polynomials ntrusign

具有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结构”。

2 个答案:

答案 0 :(得分:1)

作为替代方案,请考虑JSciencePolynomial<R extends Ring<R>>。由于该类是通用的,Polynomial<Integer>可能会简化实现。此example使用Polynomial<Complex>以方便测试。

答案 1 :(得分:0)

我的猜测是(int)Math.pow(b.coeffs [0],da)评估为0.您是否尝试使用调试器逐步执行此代码,它应该显示为什么您的值为零时间。