簡體   English   中英

在O(n)時間內運行的指數乘法算法?

[英]exponential multiplication algorithm that runs in O(n) time?

我正在讀一本算法教科書,我對這個問題很難過:

假設我們想要計算值x ^ y,其中x和y分別是具有m和n位的正整數。 解決問題的一種方法是用x進行y-1次乘法。 你能提供一個只使用O(n)乘法步驟的更有效的算法嗎?

這會是一個分而治之的算法嗎? y-1乘以x將在θ(n)右邊運行? ..我不知道從哪里開始這個問題

我以迭代的方式更好地理解這一點:

你可以計算所有2的冪的x ^ z:z =(2 ^ 0,2 ^ 1,2 ^ 2,...,2 ^(n-1))

簡單地從1到n並且應用x ^(2 ^(i + 1))= x ^(2 ^ i)* x ^(2 ^ i)。

現在您可以使用這些n值來計算x ^ y:

result = 1
for i=0 to n-1:
    if the i'th bit in y is on:
        result *= x^(2^i)
return result

一切都在O(n)完成

應用簡單的遞歸進行分而治之。 在這里,我發布更像偽代碼。

x^y :=
    base case: if y==1 return x;
        if y%2==0:  
            then (x^2)^(y/2;
        else 
            x.(x^2)^((y-1)/2);

y-1乘法解決方案基於身份x^y = x * x^(y-1) 通過重復應用身份,您知道您將以y-1步驟將y減少到1

更好的想法是更“減少”地減少y。 假設偶數y ,我們得到x^y = x^(2*y/2) = (x^2)^(y/2) 假設奇數y ,我們得到x^y = x^(2*y/2+1) = x * (x^2)^(y/2)

如果繼續使用x^2而不是x進行功率計算,您會看到可以將y減半。

遞歸:

Power(x, y)=
    1 if y = 0
    x if y = 1
    Power(x * x, y / 2) if y even
    x * Power(x * x, y / 2) if y odd

查看它的另一種方法是將y讀作加權位的總和。 y = b0 + 2.b1 + 4.b2 + 8.b3...

取冪的性質意味着:

x^y = x^b0 . x^(2.b1) . x^(4.b2) . x^(8.b2)... 
    = x^b0 . (x^2)^b1 . (x^4)^b2 . (x^8)^b3...

您可以通過平方獲得所需的x冪,並且y的二進制分解告訴您要乘以哪些冪。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM