快速乘法

时间:2013-03-20 06:47:50

标签: performance algorithm optimization

当我要计算以下系列1+x+x^2+x^3+...时,我更喜欢这样做:(1+x)(1+x^2)(1+x^4)...(这类似于某种重复的平方),这样乘法的数量可以显着增加降低。

现在我想计算系列1+x/1!+(x^2)/2!+(x^3)/3!+...,我如何使用类似的技术来改善乘法次数?

热烈欢迎任何建议!

3 个答案:

答案 0 :(得分:4)

你所提到的优化方法可能是霍纳的方法:

a + bx +cx^2 +dx^3 = ((c+dx)x + b)x + a

交替序列A *(1-x)(1 + x ^ 2)(1-x ^ 4)(1 + x ^ 8)... OTOH可用于计算A /(1的除法近似值+ x),其中x很小。

exp(x)的泰勒级数sigma x^n/n!收敛得很厉害;其他近似值更适合获得准确的值;如果有一个技巧来减少乘法,那就是用一个临时值进行迭代:

  sum=1; temp=x; k=1; 
  // The sum after first iteration is (1+x) or 1+x^1/1!
  for (i=1;i<=N;i++) { sum=sum+temp; k=k*(i+1); temp = temp * x / k; }
  // or
  prod=1.0; for (i=N;i>0;i--) prod = prod * x/(double)i + 1.0;

将阶乘相乘可以稍微提高准确度 - 在实际情况中,为了能够进一步迭代,或者为常量a_n /使用查找表,可能建议组合temp=temp*x/(i+1)。 n!,因为通常只需要几个术语。 (sin / cos的4或5个术语)。

事实证明,Horner的规则在几何系列Sigma x^n对产品形式的转换中没有太大作用。要计算指数,必须应用其他强大的技术 - 通常是范围缩减和理性(Pade),多项式(chebyshev)近似等。

答案 1 :(得分:1)

关于第一个系列的方法,你认为使用1 + x(1 + x(1 + x(1 + x)....))不是更好的方法。类似的方法可以应用于第二系列。所以1 + x / 1 (1 + x / 2 (1 + x / 3 *(1 + x / 4(.....))))

答案 2 :(得分:1)

将评论转换为答案:

请注意,对于第一个系列,确切的等价:

1+x+x^2+x^3+...+x^n = (1-x^(n+1))/(1-x)

使用它,你可以更快,更快地计算它。

第二个是e^x的收敛系列,您可能希望使用标准数学库函数pow(e, x)exp(x)