0

我正在使用 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);
    }
}
4

1 回答 1

0

我看到两点:

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

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

于 2014-06-25T18:39:22.373 回答