代码之家  ›  专栏  ›  技术社区  ›  Mohammad Sepahvand

隐式多项式的模化约简

  •  4
  • Mohammad Sepahvand  · 技术社区  · 16 年前

    我正在实现ntruencrypt算法,根据ntru教程,一个多项式f有一个逆g,这样f*g=1 mod x,基本上多项式乘以它的逆约化模x得到1。我得到了这个概念,但在他们提供的一个例子中,一个多项式 f = -1 + X + X^2 - X4 + X6 + X9 - X10 我们将其表示为数组 [-1,1,1,0,-1,0,1,0,0,1,-1] 有一个反义词 g 属于 [1,2,0,2,2,1,0,2,1,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?

    1 回复  |  直到 14 年前
        1
  •  4
  •   tzaman    16 年前

    2=1模3,所以计算是好的,但是看来Java的模数(余数)运算符有一个输出范围 [-n .. n] 对于 mod n+1 而不是标准的数学 [0..n] 。

    只要坚持一个 if (c[k] < 0) c[k] += M; 在你的 c[k]=...%M 行,你应该没事。

    编辑:实际上,最好把它放在最外面的尽头( k )对于循环。