【问题标题】:Implementing Recursion from pseudo-code (NTRUEncrypt)从伪代码实现递归(NTRUEncrypt)
【发布时间】:2010-03-06 18:36:33
【问题描述】:

作为我最后一年大学项目的一部分,我需要实施 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

【问题讨论】:

    标签: java recursion cryptography polynomial-math


    【解决方案1】:

    在伪代码中,通过将结果存储到作为参数给出的a[] 数组中来“返回”结果。 PolyMult(a1, b1, c1, n1, N) 将其结果存储在 a1[]

    这种乘法技术就是 Karatsuba 乘法,应用于多项式(这使它更容易,因为多项式中没有进位)。有关指针,请参阅 this Wikipedia article

    我个人认为,单独从数学上理解比通过伪代码更容易理解。

    【讨论】:

      【解决方案2】:

      我在 NTRU 工作,很高兴看到这种兴趣。

      我不确定您使用的是什么参数集,但是对于许多 NTRU 参数集,我们发现实现 Karatsuba 所涉及的开销是不值得的。假设您将 A 和 B 相乘。对于 NTRUEncrypt 卷积运算,所涉及的多项式之一始终是二进制或三进制。假设是 A。那么结果中的每个系数都是 B 的系数。如果将 A 存储为非零系数的索引数组,而不是将其存储为 1 和 0 的数组,并且如果 A 不太密集,则处理数组会更快指数比做 Karatsuba。代码也更小更简单。

      请问你在哪所大学读书?

      【讨论】:

      • Hey Neville -- 我很高兴能提供帮助,但我认为如果我们使用 StackOverflow 来做这件事,它实际上可能是最有用的。这样其他人就可以从我们的讨论中受益。可以吗?
      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2017-05-09
      • 2016-02-24
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多