1

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

4

2 回答 2

1

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

于 2011-01-02T20:06:17.320 回答
0

我的猜测是 (int)Math.pow(b.coeffs[0], da) 的评估结果为 0。您是否尝试过使用调试器单步执行此代码,它应该向您展示为什么您的值每次都为零。

于 2011-01-02T19:48:39.097 回答