多指数实施

时间:2011-07-24 20:06:12

标签: c++ c math theory

是否有人知道实现的多指数算法?我正在寻找一些给定矢量A,B将使用一些快速算法计算A [i] ^ B [i]的乘积的东西。

谢谢!

3 个答案:

答案 0 :(得分:2)

以下假设您的数据是浮点数。如果您有多精度整数,请指定您的要求。

干净的数字方式当然是先记录日志。实际上,即使结果是有限的,部分产品也很容易被溢出/溢出。

惯用的对应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代替自己编写循环的优势在于一旦您知道性能是一个问题,就可以用{{1}替换inner_product算法由第三方库提供的算法(或自己编写)。

答案 1 :(得分:0)

这有多快?根据算法的大小,幂函数不应该是一个瓶颈。

您可以编写一个简单的函数,如下所示:

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肯定是(虽然这没有多大帮助,除非这是一个与图形相关的帖子,并且没有标记为这样)。

希望这能回答你的问题:)

答案 2 :(得分:0)

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