费马小定理

快速幂

理论

a n = a × a × ⋯ × a a^n = a × a × \cdots × a an=a×a×⋯×a,暴力的计算需要 O(n) 的时间。
快速幂 使用二进制拆分和倍增思想,仅需要 O(logn) 的时间。

对 n 做二进制拆分,例如, 3 13 = 3 ( 1101 ) 2 = 3 8 ⋅ 3 4 ⋅ 3 1 3^{13} = 3^{(1101)_2} = 3^8 \cdot 3^4 \cdot 3^1 313=3(1101)2=38⋅34⋅31,

对 a 做平方倍增,例如, 3 1 , 3 2 , 3 4 , 3 8 ⋯ ⋯ 3^1, 3^2, 3^4, 3^8 \cdots\cdots 31,32,34,38⋯⋯。

n 有 logn + 1个二进制位,知道了 a 1 , a 2 , a 4 , a 8 , ⋯   , a 2 logn a^1, a^2, a^4, a^8, \cdots, a^{2^{\text{logn}}} a1,a2,a4,a8,⋯,a2logn后,只需要计算 logn + 1 次乘法就可以了。

快速幂 可以应用在任何具有结合律 的运算中,例如,取模运算矩阵乘法等。

例如, ( 3 13 ) % p = ( ( 3 8 ) % p ⋅ ( 3 4 ) % p ⋅ ( 3 1 ) % p ) % p (3^{13})\%p = ((3^8)\%p \cdot (3^4)\%p \cdot (3^1)\%p)\%p (313)%p=((38)%p⋅(34)%p⋅(31)%p)%p

模板

cpp 复制代码
int quickpow(int a, int n) {
	int res = 1;
	while (n) {
		if (n & 1) {
			res = res * a;
		}
		a = a * a;
		n >>= 1;
	}
	return res;
}

例题

P1226 【模板】快速幂
题目描述

给你三个整数 a , b , p a,b,p a,b,p,求 a b   m o d   p a^b \bmod p abmodp。

输入格式

输入只有一行三个整数,分别代表 a , b , p a,b,p a,b,p。

输出格式

输出一行一个字符串 a^b mod p=s,其中 a , b , p a,b,p a,b,p 分别为题目给定的值, s s s 为运算结果。

输入输出样例 #1

输入 #1

复制代码
2 10 9

输出 #1

复制代码
2^10 mod 9=7

说明/提示
样例解释

2 10 = 1024 2^{10} = 1024 210=1024, 1024   m o d   9 = 7 1024 \bmod 9 = 7 1024mod9=7。

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 0 ≤ a , b < 2 31 0\le a,b < 2^{31} 0≤a,b<231, a + b > 0 a+b>0 a+b>0, 2 ≤ p < 2 31 2 \leq p \lt 2^{31} 2≤p<231。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int quickpow(long long a, long long b, long long p) {
	int res = 1;
	while (b) {
		if (b & 1) {
			res = res * a % p;
		}
		a = a * a % p;
		b >>= 1;
	}
	return res;
}
int main() {
	long long  a, b, p;
	cin >> a >> b >> p;
	cout << a << "^" << b << " mod " << p << "=" << quickpow(a, b, p);
	return 0;
}

理论

同余式

如果两整数a, b模m的余数相同,则称a, b模m同余,记为a ≡ b (mod m) 。例:8 ≡ 2 (mod 3)

乘法逆元

若a, b互质,且满足同余方程ax ≡ 1 (mod b),则称x为a模b的乘法逆元,记作a⁻¹

例:8x ≡ 1 (mod 5),解得x = 2, 7, 12...

费马小定理

若p为质数,且a, p互质,则a^(p - 1) ≡ 1 (mod p)

例:4^(3 - 1) ≡ 1 (mod 3)

证明

构造一个与p互质的序列A = {1, 2, 3, ..., p - 1},现在来证明:∏(i = 1)^(p - 1) a × Ai ≡ ∏(i = 1)^(p - 1) Ai (mod p)

每个a × Ai (mod p)的余数必是独一无二 的,且a × Ai (mod p) < p ,则必与Ai (mod p)的余数集合相同。故得证。

所以a^(p - 1) × ∏(i = 1)^(p - 1) Ai ≡ ∏(i = 1)^(p - 1) Ai (mod p) 。证毕。

例:p = 5, A = {1, 2, 3, 4}, a = 2。

则aA = {2, 4, 6, 8}, aA%p = {2, 4, 1, 3}, A%p = {1, 2, 3, 4}

例题

给两个数a, p,p是质数,求a模p的乘法逆元

由费马小定理

a^(p - 1) ≡ 1 (mod p),得 a × a^(p - 2) ≡ 1 (mod p),

所以a^(p - 2) 就是a模p的乘法逆元。

用快速幂求即可。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a, p;
int quickpow(int a, int b, int p) {
	int res = 1;
	while (b) {
		if (b & 1) {
			res = res * a % p;
		}
		a = a * a % p;
		b >>= 1;
	}
	return res;
}
int main() {
	cin >> a >> p;
	if (a % p) {
		printf("%d\n", quickpow(a, p - 2, p));
	}
	return 0;
}
相关推荐
晨非辰16 分钟前
#C语言——学习攻略:深挖指针路线(三)--数组与指针的结合、冒泡排序
c语言·开发语言·数据结构·学习·算法·排序算法·visual studio
zzywxc78716 分钟前
编程算法在金融、医疗、教育、制造业等领域的落地案例
人工智能·算法·金融·自动化·copilot·ai编程
zzywxc78717 分钟前
编程算法在金融、医疗、教育、制造业的落地应用。
人工智能·深度学习·算法·机器学习·金融·架构·开源
conkl1 小时前
构建 P2P 网络与分布式下载系统:从底层原理到安装和功能实现
linux·运维·网络·分布式·网络协议·算法·p2p
Shan12051 小时前
递归算法的一些具体应用
算法
paopaokaka_luck3 小时前
婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
vue.js·spring boot·后端·websocket·算法·echarts
愚戏师4 小时前
机器学习(重学版)基础篇(算法与模型一)
人工智能·算法·机器学习
OEC小胖胖7 小时前
渲染篇(二):解密Diff算法:如何用“最少的操作”更新UI
前端·算法·ui·状态模式·web
找不到、了7 小时前
Java排序算法之<归并排序>
算法·排序算法
香蕉可乐荷包蛋7 小时前
排序算法 (Sorting Algorithms)-Python示例
python·算法·排序算法