我正在使用Microsoft的同态加密库密封来计算两个密文向量的点积。我发现,密文向量的大小为600时,大约需要12秒。 我不知道是否有办法提高代码效率,或者这是同态加密计算速度的上限吗?
marker.bindTooltip('Null Island', {
permanent: true,
direction : 'bottom',
className: 'transparent-tooltip',
offset: [0, -8]
});
答案 0 :(得分:2)
您在发布的代码段中省略了很多内容,因此我的答案基于您正在实现矩阵乘法的假设(因为您的代码中有3个嵌套的四个循环以及矢量点积)仅使用1个循环即可轻松实现)。我猜想您已经采用了简单的实现,它是一种三次算法(具有O(n^3)
复杂性),因此您的代码花费如此长的执行时间也就不足为奇了。
存在更好的算法,但是它们也有缺点。例如,Coppersmith–Winograd algorithm具有大约O(n^2.37)
的复杂度,但在实践中不实用。它在算法理论中经常用于证明包含矩阵乘法的其他算法的复杂性。另一个速度更快的算法(Strassen algorithm)具有O(n^2.8074)
的复杂度,在实践中很有用,但缺点是它仅对足够大的矩阵有用,并且实现比简单的实现更为复杂。
这意味着,如果值得通过提高速度来使您的实现复杂化,那么您将不得不进行实验以找到尺寸,之后Strassen算法变得更快,并实现对较小矩阵使用直接实现的混合算法,而Strassen对于更大的。该算法的细节过于复杂,无法在此处进行解释,但是您可以在我发布的Wikipedia文章中找到它们。