具有乘法NTL的快速循环

时间:2014-06-25 13:44:13

标签: c++ performance ntl

我正在使用C ++和ntl库进行编程,但是当galois字段$GF(2^q)$具有q>= 8时,使用配置文件时,下面的代码很慢。
如何在不使用并行编程的情况下加速此代码。

void modKeyGenPrs(list<mat_GF2E>& Prs, list<mat_GF2E> Lst, mat_GF2E L1, mat_GF2E L2)
{
    mat_GF2E L1_trans = transpose(L1);
    for (int i=0; i<m; i++)
    {
        mat_GF2E sum;
        sum.SetDims(n, n);
        list<mat_GF2E>::const_iterator i_lst;
        int j=0;
        for( i_lst = Lst.begin(); i_lst != Lst.end(); i_lst++)
        {
            sum = sum + (L2[i][j]*(L1_trans*(*i_lst)*L1));
            j = j + 1;
        }
        Prs.push_back(sum);
    }
}

1 个答案:

答案 0 :(得分:0)

我看到两点:

  1. 看起来您的列表的大小常量为n,因此您可以使用向量(如上所述)。 这也是一件好事,因为你不能超出索引j并且代码变得更具可读性。但我不认为这会加快功能。
  2. 您使用3个矩阵进行矩阵乘法,并执行n^2次。但是,您只能获得n种不同的产品,因此您可以重复使用此产品。这应该如下所示

  3. void modKeyGenPrs(list<mat_GF2E>& Prs, list<mat_GF2E> Lst, mat_GF2E L1, mat_GF2E L2)
    {
        // Precompute here
        mat_GF2E L1_trans = transpose(L1);
        Vec<mat_GF2E> prods;
        prods.SetLenght(n);
        for( i_lst = Lst.begin(); i_lst != Lst.end(); i_lst++)
        {
            prod[i_lst] = (L1_trans*(*i_lst)*L1);
        }
    
        // compute the rest here
        for (int i=0; i<m; i++)
        {
            mat_GF2E sum;
            sum.SetDims(n, n);
            list<mat_GF2E>::const_iterator i_lst;
            int j=0;
            for( i_lst = Lst.begin(); i_lst != Lst.end(); i_lst++)
            {
                sum = sum + (L2[i][j]*(prod[i_lst]);
                j = j + 1;
            }
            Prs.push_back(sum);
        }
    }
    

    注意:我使用变量n,就像在代码中一样,但我不知道它来自何处。也是变量m