Результирующий полином с x ^ n – 1 - PullRequest
1 голос
/ 02 января 2011

Результирующий полином с 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 ]

1 голос
/ 02 января 2011

В качестве альтернативы рассмотрим JScience класс Polynomial<R extends Ring<R>>.Поскольку класс является общим, Polynomial<Integer> может упростить реализацию.Этот пример использует Polynomial<Complex> для удобства тестирования.

0 голосов
/ 02 января 2011

Я предполагаю, что (int) Math.pow (b.coeffs [0], da) оценивается как 0. Вы пытались пройти этот код с помощью отладчика, он должен показать вам, почему ваши значения равны нулю каждый время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...