作为我最后一年大学项目的一部分,我需要实施 NTRU 公钥密码系统。我正在尝试实现一种通过递归将长多项式相乘的算法,但是我在尝试理解伪代码方面陷入了困境。
Algorithm PolyMult(c, b, a, n, N)
Require: N, n, and the polynomial operands, b and c.
PolyMult returns the product polynomial a through the argument list
PolyMult(a,b,c,n,N)
{
1. if(...)
2. {
3. ...
4. ...
5. ...
6. ...
7. }
8. else
9. {
10. n1 = n/2;
11. n2 = n-n1;
12. b = b1+b2*X^(n1);
13. c = c1+c2*X^(n1);
14. B = b1+b2;
15. C = c1+c2;
16. PolyMult(a1,b1,c1,n1,N);// a1 = b1*c1
17. PolyMult(a2,b2,c2,n2,N);// a2=b2*c2
18. PolyMult(a3,B,C,n2,N);// a3 = B*C=(b1+b2)*(c1+c2)
19. a = a1 + (a3-a1-a2)*X^(n1) + a2*X^(2*n1);
20.}
}
请注意,N、n、n1 和 n2 都是 int 类型。a,a1,a2,b,b1,b2,c,c1,c2,B,C 都是多项式并表示为数组。
在第 16、17 和 18 行,函数 PolyMult 被调用,参数分别为 a1,b1,c1,n1,N,然后是 a2,b2,c2,n2,N,最后是 a3,B,C,n2,N。我在第 16 行之前初始化了数组 a1,b1,c1,然后我将它们传递给 PolyMult 本身(递归从这里开始!)并返回一个答案并将其存储在某个临时数组中,例如我实现第 16 行如下:
int z[] = PolyMult(a1,b1,c1,n1,N);
现在我的问题是:存储在数组 z[] 中的多项式何时会在程序中再次使用,我没有看到伪代码中会再次使用它的迹象,但是如果数组 z[] 没有在程序中再次使用程序,第 16 行和递归一起有什么意义?我应该如何实现第 16-18 行?
所以重复一遍,存储在数组 z 中的多项式何时以及如何在程序中再次使用?我应该如何实施第 16-18 行?
如需更深入地了解伪代码的完整描述,请参见本文第 3 页:http: //www.ntru.com/cryptolab/pdf/NTRUTech010.pdf。