A^B mod C的分治思想

來源:互聯網
上載者:User

A^B mod C

假設0<a,b,c<n

1.使用最原始的方法是把A^B先求出來,最後mod C求出值。

但是這種方法效率低,時間複雜度為O(b)而且a^b必須小於n才不會溢出。具有很大的局限性。

 

2.改進方法一:

假設A>C,那麼存在A^B mod C = (A mod C)^(B mod C)

這種情況用在A>C的情況下非常適用,但是當A<C的時候,就無法使用。

所以最壞的情況下,還是需要a^b必須小於n才不會溢出。此法也不合適。

 

改進方法二:

我們可以把A^B中的B分解為(2a+2b+2c...)

例如12^36 = 12^(22+25)

      12^36 = 12^22*12^25

      12^36 mod 35 = (12^22 mod 35)*(12^25 mod 35) mod 35

 

我們可以知道

(12^21 mod 35)

(12^22 mod 35)

(12^23 mod 35)

(12^24 mod 35)

(12^25 mod 35)

之間存在著以下關係

(12^2n mod 35) = (12^2n-1 mod 35)*2mod 35

所以以上那些式子都可以依次求得。

 

最後查表實現(12^22 mod 35)*(12^25 mod 35) mod 35

 

但是這種方法還存在一個弊端,就是A*A必須要<n,否則也會造成結果的溢出。

雖然這種方法比上面的2種方法範圍都大,但是還是不能滿足我們的要求。

 

 

改進方法三:

既然上面一步溢出的臨界值是A*A<n。

那我們就想辦法把A*A再分解,讓最後A*A mod C的值小於n

 

這邊需要提到一個公式A*B mod C = (A mod C)*(B mod C)

 

我們假設A*A中,第一個A為X,第二個A為Y,而且必有

Y = 2a+2b+2c...

所以X*Y = X*(2a+2b+2c...)

所以X*Y mod C = ((((X*2a mod C) + (X*2b mod C)) mod C) + (X*2c mod C)) mod C......

 

由於我們可以知道

(X^21 mod C)

(X^22 mod C)

(X^23 mod C)

(X^24 mod C)

(X^25 mod C)

也存在以下關係

(X^2n mod C) = (X^2n-1 mod C)*2mod C

所以以上那些式子都可以依次求得。

 

最後X*X mod C的值也可以求得。

最後使用 改進方法二 就可以求得A^B mod C了。

 

此法由於把A再次進行了分解。所以範圍又進一步的擴大了。

此法的範圍可以達到當A*2<n的時候,都可以求得。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.