复数乘积仅使用三次乘法

时间:2013-10-27 18:23:03

标签: algorithm math complex-numbers

我们按如下方式进行复数乘法:

(a + i * b) * (c + i * d) = (a * c - b * d) + i * (a * d + b * c)

结果的实部和虚部是

real part = (a * c - b * d)
imag part = (a * d + b * c)

这涉及四次实数乘法。我们怎么能只用三次实数乘法呢?

5 个答案:

答案 0 :(得分:23)

您对两个数字感兴趣:A=ac−bdB=ad+bc。 计算三个实数乘法S1=acS2=bdS3=(a+b)(c+d)。 现在您可以将结果计算为 A=S1−S2B=S3−S1−S2

此过程称为Karatsuba乘法,在算法分析中使用很多。

用于找到最接近的一对点。

答案 1 :(得分:9)

为了完整起见,我想指出Gauss' complex multiplication algorithm,这是另一种只用三次乘法进行复数乘法的方法。总结一下,你计算

k1 = c * (a + b)
k2 = a * (d - c)
k3 = b * (c + d)
Real part = k1 - k3
Imaginary part = k1 + k2

答案 2 :(得分:6)

某些算法,例如Split-radix FFT对复数乘法设定了更高的期望,需要3个实数乘法和3个实数乘法的复杂性。

(a+ib)(c+id)=ac−bd+i(ad+bc)    

x=a(c−d)
y=a+b
z=a−b
ac-bd=zd+x
ad+bc=yc−x

在FFT中,y和z完全来自旋转因子,因此它们可以预先计算并存储在查找表中。因此满足了要求。 FFT Tricks

答案 3 :(得分:3)

Vallabh Patade已经回答了如何在两个复数之间执行产品,只有三个实数乘法。 Karatsuba 算法的应用确实如下

x = a + i * b;
y = c + i * d;

real(x * y) = a * c - b * d;
imag(x * y) = (a + b) * (c + d) - a * c - b * d;

现在问题是:我们能否在两个复数之间执行产品, 比三个实数乘法

答案是,由 Winograd定理提供

S. Winograd, "On the number of multiplications required to compute certain functions", Commun. Pure Appl. Math. 23 (1970), 165-179.

计算两个复数之间的乘积所需的最小乘法数为3

答案 4 :(得分:0)

如果要混合使用加法和乘法,Winograd实际上是正确的。但是,如果您只想进行复数乘法,则可以使用对数极坐标表示,即乘法仅增加了对数幅度和角度。 但是对数极地加法当然很难! 对数极坐标可能适合有限精度的FFT,例如微处理器上的8位对数幅度+ j8位相位。