我正在使用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);
}
}
答案 0 :(得分:0)
我看到两点:
n
,因此您可以使用向量(如上所述)。
这也是一件好事,因为你不能超出索引j
并且代码变得更具可读性。但我不认为这会加快功能。 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
。