当前位置:   article > 正文

Acwing-基础算法课笔记之数学知识(快速幂)

Acwing-基础算法课笔记之数学知识(快速幂)

一、快速幂

1、引入

a b % c a^b\%c ab%c 的值,其中 a a a b b b c c c是整数,且 0 < a 0<a 0<a c < 1 0 9 c<10^9 c<109 0 < b < 1 0 18 0<b<10^{18} 0<b<1018

∙ \bullet 首先想到的最朴素的算法是,考虑用循环直接计算 a b a^b ab的值,最后将其对 c c c取模。

代码如下:

long long ans = 1;
for(long long i = 1; i <= b; i++){
    ans *= a;
}
ans %= c;
  • 1
  • 2
  • 3
  • 4
  • 5

那么这个算法是有一定缺陷的,它的时间复杂度为 O ( b ) O(b) O(b),并且远远超过了数据类型 l o n g long long l o n g long long的范围。

∙ \bullet 取模运算的性质
例如: ( a ⋅ b ) % p = [ ( a % p ) ⋅ ( b % p ) ] % p (a\cdot b)\%p=[(a\%p)\cdot(b\%p)]\%p (ab)%p=[(a%p)(b%p)]%p

证明:设 { a = k 1 p + q 1 b = k 2 p + q 2

{a=k1p+q1b=k2p+q2
{a=k1p+q1b=k2p+q2,其中 k 1 k_1 k1 k 2 k_2 k2是商数, q 1 q_1 q1 q 2 q_2 q2是余数。

( a ⋅ b ) = ( k 1 p + q 1 ) ⋅ ( k 2 p + q 2 ) (a\cdot b)=(k_1p+q_1)\cdot(k_2p+q_2) (ab)=(k1p+q1)(k2p+q2)

= ( k 1 ⋅ k 2 ⋅ p + k 1 ⋅ q 2 + k 2 ⋅ q 1 ) ⋅ p + q 1 ⋅ q 2 =({k_1}\cdot{k_2}\cdot p+{k_1}\cdot{q_2}+{k_2}\cdot{q_1})\cdot p+{q_1}\cdot{q_2} =(k1k2p+k1q2+k2q1)p+q1q2

所以 ( a ⋅ b ) % p = ( q 1 ⋅ q 2 ) % p (a\cdot b)\%p=({q_1}\cdot{q_2})\%p (ab)%p=(q1q2)%p

所以 a % p = q 1 a\%p={q_1} a%p=q1 b % p = q 2 b\%p={q_2} b%p=q2

再例如, ( a ⋅ a ⋅ ⋅ ⋅ ⋅ ⋅ a ) % p (a\cdot a\cdot\cdot\cdot\cdot\cdot a)\%p (aaa)%p,每乘一次对 p p p取模, a n s = a n s × a ans=ans\times a ans=ans×a a n s = a n s % c ans=ans\%c ans=ans%c,通过这种方式可以防止超过 l o n g long long l o n g long long的范围,但还是用了 b b b次循环,时间复杂度还是 O ( b ) O(b) O(b)

∙ \bullet 考虑手算 3 10 3^{10} 310,证明如下:

3 10 = ( 3 2 ) 5 = 9 5 = 9 × 9 4 = 9 × ( 81 ) 2 = 9 × ( 8 1 2 ) 1 3^{10}=(3^2)^5=9^5=9\times 9^4=9\times (81)^2=9\times(81^2)^1 310=(32)5=95=9×94=9×(81)2=9×(812)1

当指数是偶数时,我们可以将指数除以 2 2 2 底数平方,当指数是奇数时,先将 a n s ans ans 乘以底数,再将底数平方,指数整除 2 2 2

由上可知, b b b 每次都要整除 2 2 2,即 b = 2 n b=2^n b=2n,所以执行的次数是 n n n次,时间复杂度是 O ( l o g 2 b ) O(log_2b) O(log2b)

2、代码模板

ll faster_power(ll a, ll b, ll c) {
	ll ans = 1;
	a %= c;
	while (b) {
		if (b & 1) {
			ans = (ans * a) % c;
		}
		a = (a * a) % c;
		b >>= 1;
	}
	return ans;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

二、乘法逆元

1、乘法逆元的定义

若整数 b b b m m m互质,并且对于任意的整数 a a a,如果满足 b % a = 0 b\%a=0 b%a=0,则存在一个整数 x x x,使得 a b ≡ a × x ( m o d \frac{a}{b}\equiv a\times x(mod baa×x(mod m ) m) m),则称 x x x b b b 的模 m m m 乘法逆元,记为 x = b − 1 x=b^{-1} x=b1然后有 b x ≡ 1 ( m o d bx\equiv 1(mod bx1(mod m ) m) m)引入乘法逆元,就是为了解决模意义下的除法问题。

b b b 存在乘法逆元的充要条件是 b b b 与模数 m m m 互质,即 g c d ( b , m ) = 1 gcd(b,m)=1 gcd(b,m)=1

由以上可知:

a b ≡ a × x ( m o d \frac{a}{b}\equiv a\times x(mod baa×x(mod m ) m) m)

⇔ \Leftrightarrow a b ≡ a × b − 1 ( m o d \frac{a}{b}\equiv a\times b^{-1}(mod baa×b1(mod m ) m) m)

⇔ \Leftrightarrow b × a b ≡ b × a × b − 1 b\times\frac{a}{b}\equiv b\times a\times b^{-1} b×bab×a×b1

⇔ \Leftrightarrow a ≡ a × b × b − 1 a\equiv a\times b\times b^{-1} aa×b×b1

⇔ \Leftrightarrow b × b − 1 ≡ 1 ( m o d b\times b^{-1}\equiv 1(mod b×b11(mod m ) m) m)

2、费马定理

在数论中,假如 a a a 是一个整数, p p p 是一个质数

a p ≡ a ( m o d a^{p}\equiv a(mod apa(mod p ) p) p)

如果 a a a不是 p p p的倍数

a p − 1 ≡ 1 ( m o d a^{p-1}\equiv 1(mod ap11(mod p ) p) p)

例如:设 a = 3 a=3 a=3 p = 5 p=5 p=5,则有:

3 5 − 1 = 3 4 = 81 m o d 3^{5-1}=3^4=81mod 351=34=81mod 5 = 1 5=1 5=1

p p p 为质数,依据上面的结论得:

b × x ≡ 1 ( m o d b\times x\equiv 1(mod b×x1(mod p ) p) p)

⇔ \Leftrightarrow b p − 1 ≡ 1 ( m o d b^{p-1}\equiv 1(mod bp11(mod p ) p) p)

⇔ \Leftrightarrow b × b p − 2 ≡ 1 ( m o d b\times b^{p-2}\equiv 1(mod b×bp21(mod p ) p) p)

⇔ \Leftrightarrow a p − 2 ( m o d a^{p-2}(mod ap2(mod p ) p) p)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/176747
推荐阅读
相关标签
  

闽ICP备14008679号