【知识点】快速幂与矩阵快速幂
什么是快速幂,为什么要使用快速幂?
Macw: 快速幂有好多好处。
Penelope: 例如?
Macw: 它比较快。
见名知意,快速幂算法可以在非常短的时间内求出一个数的
举例而言,如果我们要求出
暴算法力求解一个数的次幂的时间复杂度是
快速幂算法的核心思想就是幂运算的乘法法则。
我们以求
再以计算
- 我们先计算
的值。 - 然后就可以立刻计算出
的值。 - 然后就又可以计算出
的值。 - 最后就能快速地计算出
的值了。
比较新的快速幂的算法和普通的暴力算法,可以看到原本需要运行
快速幂算法的进一步拓展
然而,大家也都发现了,普通的快速幂算法只能解决要求解次幂为
我们都知道,任意一个数字都可以被查分成多个
例如数字
因此,对于求任意一个指数非
到目前为止,快速幂算法就迎刃而解了。
快速幂算法的代码以及实现
这个是 C++ 代码的快速幂模版:
这段代码通过递归求解问题,将一个大的次幂转变成两个小的次幂的积进行运算。
// 计算以 base 为底数的 exponent 次方的值
long long quick_power_recursive(int base, int exponent) {
if (exponent == 0)
// 如果指数为0,返回1
return 1;
else if (exponent % 2 == 0) {
// 如果指数为偶数,递归计算底数的一半指数幂
long long temp = quick_power_recursive(base, exponent / 2);
// 返回底数的一半指数幂的平方
return temp * temp;
} else {
// 如果指数为奇数,递归计算底数的一半指数幂
long long temp = quick_power_recursive(base, (exponent - 1) / 2);
// 返回底数乘以底数的一半指数幂的平方
return base * temp * temp;
}
}
这个是经过位运算优化过后的快速幂模板:
// 计算以 base 为底数的 exponent 次方的值
long long quick_power(int base, int exponent) {
// 初始化结果为 1
long long result = 1;
// 当指数不为0时进行循环
while (exponent) {
// 如果指数为奇数,将当前底数乘到结果中
if (exponent & 1)
result *= base;
// 底数平方
base *= base;
// 将指数右移一位,相当于除以 2
exponent >>= 1;
}
return result; // 返回结果
}
矩阵快速幂 - 结束语
学过线性代数的同学们看过来!
快速幂算法不光可以求解普通的快速幂问题,我们还可以用同样的方法对一个任意大小的矩阵求快速幂。快速幂在矩阵乘法中的作用非常的大,普通的两个矩阵相乘的时间复杂度约为
相比较普通快速幂,矩阵快速幂只需要重新定义乘法的运算规则即可。这里提供一个用结构体来重定义运算符的方法:
struct matrix{
int a[5][5];
matrix() { memset(a, 0, sizeof a); }
matrix operator * (const matrix &b) const {
matrix res;
for (int i=1; i<=2; i++){
for (int j=1; j<=2; j++){
for (int k=1; k<=2; k++){
res.a[i][j] = (res.a[i][j] + a[i][k] * b.a[k][j]) % MOD;
}
}
}
return res;
}
} ans, base;
矩阵快速幂的一个常见应用场景就是动态规划,也就是我们常说的矩阵加速动态规划算法。有关这方面的知识我会在后期单独出一篇文章来详细讲解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具