首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >X^n-1多项式的结式

X^n-1多项式的结式
EN

Stack Overflow用户
提问于 2011-01-03 03:01:56
回答 2查看 344关注 0票数 1

具有x^n-1 (mod )的多项式的结式

我正在实现http://grouper.ieee.org/groups/1363/lattPK/submissions/EESS1v2.pdf第2.2.7.1节中描述的NTRUSign算法,该算法涉及计算多项式的结果。我一直得到一个零向量,这显然是不正确的。

代码语言:javascript
复制
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 struct“。

EN

回答 2

Stack Overflow用户

发布于 2011-01-03 04:06:17

作为另一种选择,考虑一下JSciencePolynomial>。因为类是泛型的,所以Polynomial<Integer>可能会简化实现。为了测试方便,此example使用Polynomial<Complex>

票数 1
EN

Stack Overflow用户

发布于 2011-01-03 03:48:39

我的猜测是(int)Math.pow(b.coeffs,da)的值为0。你有没有尝试过用调试器单步执行这段代码,它应该会告诉你为什么每次你的值都是零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4579940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档