欢迎光临散文网 会员登陆 & 注册

【C++/算法】快速幂算法详解

2023-08-05 09:07 作者:还要学习三年  | 我要投稿

1、数字溢出怎么办?


02:38



使用取模运算性质:

(a * b) % p = [(a % p) * (b % p)] % p


03:03



2、证明模运算性质的过程中为什么要设定?

a = k1 * p + q1

b = k2 * p + q2


03:17



这里我自己补充下作者的证明。

为了证明 (a * b) % p = (a % p * b % p )% p

我们需要先证明 a % p * b % p 的值在模 p 的意义下等于 a * b 的值在模 p 的意义下


设 a mod p = q1,b mod p = q2,

那么:

a = k1 * p + q1

b = k2 * p + q2

其中 k1 和 k2 是任意整数。


所以,

a*b = (k1*k2*p + k1*q2 + k2*q1)*p + q1*q2


然后取模:

(a * b) % p = (q1 * q2) % p


其中:

(k1*k2*p + k1*q2 + k2*q1)*p 为 0,被直接消去了。因为该项是 p 的倍数。


又:

a = k1 * p + q1

b = k2 * p + q2

则:

a % p = q1

b % p = q2

进而:

q1 * q2 = a % p * b % p


所以在模 p 的意义下:

(a * b) % p = [(a % p) * (b % p)] % p


3、快速幂原理?

底数平方,指数除以2。

将 O(n) 的时间复杂度,转换成 O(log) 级别的时间复杂度。

【C++/算法】快速幂算法详解的评论 (共 条)

分享到微博请遵守国家法律