最終学年の大学プロジェクトの一環として、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 の引数で呼び出されます。配列 a1,b1,c1 を 16 行目より前に初期化し、それらを 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。