최종 프로젝트 인 University Project의 일부로 NTRU 공개 키 시스템을 구현해야합니다. 재귀를 통해 긴 다항식을 곱하는 알고리즘을 구현하려고하지만 의사 코드를 이해하려고 노력하는 데 꽤 어려움이 있습니다.의사 코드 (NTRUEncrypt)에서 재귀 구현
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 유형입니다. a1, a2, b, b1, b2, c, c1, c2, B, C는 모두 다항식이며 배열로 표시됩니다.
16, 17, 18 행에서 a1, b1, c1, n1, N 다음 a2, b2, c2, n2, N 및 마지막으로 a3, B, C, n2, N의 인수로 PolyMult 함수를 호출합니다. 각기. 나는 16 번째 줄에 배열 a1, b1, c1을 초기화했다. 그런 다음 PolyMult 자체 (재귀가 여기에서 시작된다!)로 전달하고 대답을 반환하고 임시 배열에 저장한다. 예를 들어 다음과 같이 16 행을 구현한다.
int z[] = PolyMult(a1,b1,c1,n1,N);
지금 내 질문은 : 다항식 어레이 Z []를 프로그램에 다시 사용에 저장된 때, I는 상기 의사 코드에서 다시 사용되는 것이라는 표시를 볼 수 없지만, 만약 어레이 Z []는 프로그램에서 다시 사용되지 않습니다. 16 번 줄과 재귀가 모두 함께 무엇입니까? 16-18 행을 어떻게 구현해야합니까?
따라서 반복 할 때 배열 z에 저장된 다항식은 언제 프로그램에서 다시 사용됩니까? 그리고 16-18 행을 어떻게 구현해야합니까?
의사 코드에 대한 자세한 내용은이 기사의 3 페이지에있는 http://www.ntru.com/cryptolab/pdf/NTRUTech010.pdf에서 확인할 수 있습니다.
안녕하세요 네빌 - 기꺼이 도와 드리겠습니다.하지만 실제로 StackOverflow를 사용하면 가장 유용하다고 생각합니다. 그렇게하면 다른 사람들이 우리 토론의 이익을 얻을 수 있습니다. 괜찮습니까? –