A^B mod C的分治思想

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)*2 mod 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)*2 mod C

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

 

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

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

 

此法由于把A再次进行了分解。所以范围又进一步的扩大了。

此法的范围可以达到当A*2<n的时候,都可以求得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值