代码之家  ›  专栏  ›  技术社区  ›  Mohammad Sepahvand

从伪代码实现递归(ntruencrypt)

  •  4
  • Mohammad Sepahvand  · 技术社区  · 16 年前

    作为我最后一年大学项目的一部分,我需要实施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行上,分别用参数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[]中的多项式何时会在程序中再次使用,我看不到从伪代码中再次使用的迹象,但是如果数组z[]在程序中不再使用,那么第16行和递归的点是什么?我应该如何实现第16-18行?

    所以重复一下,存储在数组z中的多项式何时以及如何在程序中再次使用?我该如何执行第16-18行呢?

    要了解更多信息,可以在本文第3页找到伪代码的完整描述: http://www.ntru.com/cryptolab/pdf/NTRUTech010.pdf .

    2 回复  |  直到 9 年前
        1
  •  3
  •   Thomas Pornin    16 年前

    在伪代码中,通过将结果存储到 a[] 数组,作为参数提供。 PolyMult(a1, b1, c1, n1, N) 将结果存储在 a1[] .

    这种乘法技术就是简单的Karatsuba乘法,应用在多项式上(这使得它更容易,因为多项式中没有进位)。见 this Wikipedia article 对于指针。

    就我个人而言,我认为单从数学上就更容易理解,而不是通过伪代码。

        2
  •  0
  •   William Whyte    16 年前

    我为NTRU工作,所以我很高兴看到这个兴趣。

    我不确定您使用的是什么参数集,但是对于许多NTRU参数集,我们发现实现karatusuba所涉及的开销是不值得的。假设你将a和b相乘,对于隐式卷积运算,涉及的多项式之一总是二元或三元的。假设这是A,那么结果中的每个系数都是 B的系数。如果将A存储为非零系数的索引数组,而不是将其存储为1和0的数组,并且如果A不太密集,则通过索引数组进行工作比执行karatusuba更快。代码也更小更简单。

    请问你在哪所大学学习?