乘以2个复数的大O?

时间:2017-10-26 23:08:57

标签: algorithm numbers

将两个复数相乘的时间复杂度是多少? 例如(35 + 12i)*(45 + 23i)

3 个答案:

答案 0 :(得分:2)

渐近复杂度与乘法组件相同。

(35 + 12i) * (45 + 23i) == 35*45 + 45*12i + 35*23i - 12*23
                        == (35*45 - 12*23) + (45*12 + 35*23)i

你只有4个实数乘法和2个实数加法。

因此,如果实数乘法是O(1),那么复数乘法也是如此。

如果实数乘法不是常数(就像任意精度值的情况一样),那么它们都不是复数乘法。

答案 1 :(得分:1)

如果将两个复数(a + bi)和(c + di)相乘,则计算结果为(ac-bd,adi + bci),这需要总共四次乘法和两次减法。加法和减法比乘法花费的时间更少,因此主要成本是这里完成的四次乘法。由于四是常量,因此与实数相比,这不会改变执行多重操作的大O运行时间。

让我们假设您有两个数字n 1 和n 2 ,每个数字都是d位长。如果您使用小学 - 学校方法将这些数字相乘,您可以执行以下操作:

for each digit d1 of n2, in reverse:
    let carry = 0
    for each digit d2 of n1, in reverse:
        let product = d1 * d2 + carry
        write down product mod 10
        set carry = product / 10, rounding down

add up all d of the d-digit numbers you wrote in step 1

第一个循环在时间Θ(d 2 )中运行,因为n2中的每个数字都配对并与n1的每个数字相乘,每个执行O(1)个工作。结果是d个不同的d位数字。加上这些数字需要时间Θ(d 2 ),因为你必须扫描每个数字的每个数字一次。总的来说,这需要时间Θ(d 2 )。

请注意,此运行时是 n1和n2中有多少位的函数,而不是n1和n2本身。数字n中的位数是Θ(log n),因此如果你将两个数字n1和n2相乘,这个运行时实际上是O((log max {n1,n2}) 2

这是不是做乘法的最快方法,虽然有一段时间有一个猜想它是。 Karatsuba's algorithm及时运行O((log max {n1,n2}) log 3 4 ),其中指数约为1.7ish。有更多的现代算法运行得更快,并且它是一个开放的问题,是否可以在没有指数的时间O(log d)完成!

答案 2 :(得分:0)

将两个复数相乘仅需要三个实数乘法。

让p = a * c,q = b * d,并且r =(a + b)*(c + d)。

然后(a + bi)*(c + di)=(p-q)+ i(r-p-q)。

另请参阅Complex numbers product using only three multiplications