「学习笔记」模运算与 BSGS 算法
2023/6/5 1:23:04
本文主要是介绍「学习笔记」模运算与 BSGS 算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
取模
取模符号:\(x \bmod y\),表示 \(x\) 除以 \(y\) 得到的余数。
例如,
设 \(x\) 为被除数,\(y\) 为除数,\(z\) 为余数,则 \(x = k \cdot y + z, k = \lfloor \dfrac{x}{y} \rfloor\)。
模运算
读入两个数 \(n, p\),现在求 \((n!) \bmod p\) 是多少?\((2 < p \le 10^9, 1 \le n \le 1000)\)
\(\left ( n! \right ) \bmod p = \left [ \left ( n - 1 \right )! \bmod p \times n \bmod p \right] \bmod p\)
#include <iostream> using namespace std; int n, p; int main() { cin >> n >> p; int ans = 1; for (int i = 1; i <= n; ++ i) { ans = 1ll * ans * i % p; } cout << ans << endl; return 0; }
BSGS 算法
名称有很多,什么北上广深啊,等等,学名叫 baby-step giant-step,即大步小布算法。
我们由一个问题引入
给定三个数 \(a, b, p\),\(p\) 是质数,解方程 \(a^x \bmod p = b\)。\((a, b, p \le 10^9)\)
暴力的做法
int solve(int a, int b, int p) { // O(p) int v = 1; for (int x = 0; x <= p - 2; ++ x) { if (v == b) return x; v = 1ll * v * a % p; } return -1; }
由 \(a^{p - 1} \bmod p = 1\) 可知,余数会在 \(1\) 处循环。
对于该方程,要枚举 \(p - 1\) 个数,那我们将这 \(p - 1\) 个数分组,\(s\) 为每组的大小。
若第 \(2\) 组数中出现了 \(b\),那么在第 \(1\) 组中,一定出现了 \(b \cdot a^{-s}\)。
#include <set> using namespace std; int solve(int a, int b, int p) { int s = sqrt(p); int v = 1; set<int> se; for (int i = 0; i < s; ++ i) { se.insert(v); v = 1ll * v * a % p; } // O(p / s) for (int i = 0; i * s <= p; ++ i) { // 看答案是否在第 i 行里面 // 要看 b * a (-is) 是否在第 0 行出现 int c = 1ll * b * qpow(qpow(a, i * s, p), p - 2, p) % p; if (se.count(c) != 0) { int v = qpow(a, i * s, p); // 第 i 行的第一个数 for (int j = i * s; ; ++ j) { // O(s) if (v == b) return j; v = 1ll * v * a % p; } } } return -1; }
复杂度为:\(O(\dfrac{p}{s} + s) = O(\max(\dfrac{p}{s}, s))\)
若取 \(s = \sqrt{p}\),则为 \(O_{\sqrt{p}}\)。
这篇关于「学习笔记」模运算与 BSGS 算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-10百万架构师第十三课:源码分析:Spring 源码分析:Spring核心IOC容器及依赖注入原理|JavaGuide
- 2025-01-10便捷好用的电商API工具合集
- 2025-01-09必试!帮 J 人团队解决物流错发漏发的软件神器!
- 2025-01-09不容小觑!助力 J 人物流客服安抚情绪的软件!
- 2025-01-09为什么医疗团队协作离不开智能文档工具?
- 2025-01-09惊叹:J 人团队用啥软件让物流服务快又准?
- 2025-01-09如何利用数据分析工具优化项目资源分配?4种工具推荐
- 2025-01-09多学科协作难?这款文档工具可以帮你省心省力
- 2025-01-09团队中的技术项目经理TPM:工作内容与资源优化策略
- 2025-01-09JIT生产管理法:优化流程,提升竞争力的秘诀