Math NTRUEncrypt中多项式的模约化

Math NTRUEncrypt中多项式的模约化,math,polynomial-math,ntruencrypt,Math,Polynomial Math,Ntruencrypt,我正在实现NTRUN加密算法,根据NTRU教程,多项式f有一个逆g,使得f*g=1模x,基本上多项式乘以它的逆约化模x得到1。我得到了这个概念,但在他们提供的一个例子中,多项式f=-1+X+X^2-X4+X6+X9-X10,我们将其表示为数组[-1,1,1,0,-1,0,1,0,0,0,1,-1]的逆g[1,2,2,1,0,2,0],因此当我们将它们相乘并将结果模3减为1时,然而,当我使用NTRU算法乘以和减少它们时,我得到-2 下面是我用Java编写的乘法算法: public static i

我正在实现NTRUN加密算法,根据NTRU教程,多项式f有一个逆g,使得f*g=1模x,基本上多项式乘以它的逆约化模x得到1。我得到了这个概念,但在他们提供的一个例子中,多项式
f=-1+X+X^2-X4+X6+X9-X10
,我们将其表示为数组
[-1,1,1,0,-1,0,1,0,0,0,1,-1]
的逆
g
[1,2,2,1,0,2,0],因此当我们将它们相乘并将结果模3减为1时,然而,当我使用NTRU算法乘以和减少它们时,我得到-2

下面是我用Java编写的乘法算法:

public static int[] PolMulFun(int a[],int b[],int c[],int N,int M)
{



for(int k=N-1;k>=0;k--)
{
    c[k]=0;
    int j=k+1;

    for(int i=N-1;i>=0;i--)
    {
        if(j==N)
        {
            j=0;
        }


        if(a[i]!=0 && b[j]!=0)
        {
            c[k]=(c[k]+(a[i]*b[j]))%M;

        }
            j=j+1;

    }

}

return c;

}
取多项式a乘以b,再返回结果c,N指定多项式的阶数+1,在上述示例中N=11;M是重作用模,以3为例


为什么我得到的是-2而不是1?

-2==1 mod 3,所以计算很好,但Java的模(余数)操作符的输出范围似乎是
[-n..n]
mod n+1
,而不是标准的数学
[0..n]

如果(c[k]<0)c[k]+=M,只需粘贴一个
在你的
c[k]=…%M
行之后,你应该没事了


编辑:实际上,最好把它放在循环最外层(
k
)的末尾。

我的电子邮件是andreycdmd@gmail.com