Multi-Exponentiation Implementation

Multi-Exponentiation Implementation

本文关键字:Implementation Multi-Exponentiation      更新时间:2023-10-16

有人知道实现的多指数算法吗?我要找的是给定向量A和B可以用一些快速的算法计算A[I]^B[I]的乘积

谢谢!

下面假设您的数据是浮点数。

如果您使用多精度整数,请指定您的要求。

干净的数值方法当然是先取对数。事实上,即使结果是有限的,部分积也很容易低于/溢出。

对应的c++程序是:

#include <cmath>
#include <functional>
#include <numeric>
double f(double x, double y)
{
    return y * std::log(x);
}
template <typename I, typename J>
double multi_exponentiation(I a0, I an, J b0)
{
    return std::exp(std::inner_product(a0, an, b0, 0., std::plus<double>(), f));
}
// Example program
int main()
{
    std::vector<double> a, b;
    ...
    double e = multi_exponentiation(a.begin(), a.end(), b.begin());
}

使用inner_product而不是自己编写循环有一个优点,一旦你知道性能是一个问题,你可以用第三方库提供的parallel_inner_product算法替换inner_product算法(或自己编写一个)。

速度要有多快?根据算法的大小,幂函数不应该成为太大的瓶颈。

你可以像下面这样写一个简单的函数:

Vector VectorPower( Vector vec1, Vector vec2 )
{
      assert(vec1.length() == vec2.length());
      Vector vecAns( vec1.length() );
      for( unsigned int i = 0; i < vec1.length(); i++ )
      {
           vecAns[i] = pow( vec1[i], vec2[i] );
      }
      return vecAns;
}
大多数情况下,这对您的应用程序来说已经足够有效了。如果你正在实现一个平方根或其他一些超越函数,那么你将不得不考虑优化。

此外,一些处理器针对任意积分功率进行了优化,gpu当然是(尽管这没有多大帮助,除非这是一个与图形相关的帖子,并且没有标记为这样)。

希望这能回答你的问题。

您是否尝试过tommath(不确定它是否符合您的性能要求)?它的多精度整数算术库!