我正在实施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}},因此当我们将它们相乘并减少时结果模3我们得到1,但是当我使用NTRU算法进行乘法和减少它时我得到-2。
这是我用Java编写的乘法算法:
[1,2,0,2,2,1,0,2,1,2,0]
它取自多项式a并将其乘以b,将结果重新生成c,N指定多项式的次数+ 1,在上面的例子中N = 11; M是反射模数,例如3以上。
为什么我得-2而不是1?
答案 0 :(得分:4)
-2 == 1 mod 3,所以计算很好,但似乎Java的模数(余数)运算符的[-n .. n]
输出范围为mod n+1
,而不是标准数学{ {1}}。
只需在[0..n]
行后加if (c[k] < 0) c[k] += M;
即可,你应该没问题。
编辑:实际上,最好把它放在最外层(c[k]=...%M
)for循环的末尾。