数论入门

裴蜀定理

这个定理描述了对于二元不定方程 整数 解的存在性。

Theorem: 对于方程 \(ax + by = c\),存在整数解的充要条件为 \(\gcd(a, b) | c\)

首先我们证明必要性:考虑反证法,令 \(g= \gcd(a, b), a = a'\times g, b = b'\times g\),且 \(g\nmid c\)。则有 \(ga'x + gb'y = c\)。即 \(a'x + b'y = \frac{c}{g}\)。但是由假设,\(\frac{c}{g}\) 不为整数,而 \(a', b'\) 均为整数,说明不存在整数对 \((x, y)\) 为该方程的解。

然后证明充分性:首先假设我们求出了 \(a x + by = \gcd(a, b)\) 的解 \((x, y)\),那么令 \(x' = \frac{c}{\gcd(a, b)} \times x, y' = \frac{c}{\gcd(a, b)} \times y\),显然 \((x', y')\) 就是原方程的一组解。但是由于我太菜了不会给出存在性证明,所以我将在 \(\rm exgcd\) 中给出通过数学归纳法证明的构造性证明。

Exgcd

首先我们有普通的辗转相除法求 \(\gcd\)\(\gcd(a, b) = \gcd(b, a \bmod b)\),直到 \(b = 0\) 时得到 \(\gcd = a\)。但是拓展一下,在这个过程中其实我们可以得到 \(ax + by = \gcd(a, b)\) 的一组解。

首先考虑边界条件:\(b = 0\):此时 \(\gcd = a\),于是令 \(x = 1, y = 0\) 即可。

然后考虑假设我们求出了对于 \((b, a \bmod b)\) 问题的一组解 \((x, y)\),现在要求解 \((a, b)\) 问题的一组解 \((x', y')\)

那么首先有 \(bx + (a \bmod b) y = \gcd(b, a \bmod b)\)。然后由 \(a \bmod b = a - \lfloor \frac{a}{b} \rfloor \times b\) 以及 \(\gcd(a, b) = \gcd(b, a \bmod b)\) 有:

\[\begin{aligned} bx + ay -b\times \lfloor \frac{a}{b} \rfloor y &= \gcd(a, b) \\ ay + b(x - \lfloor \frac{a}{b} \rfloor \times y) &= \gcd(a, b) \end{aligned} \]

于是令 \(x' = y, y' = x - \lfloor \frac{a}{b} \rfloor \times y\) 即可。其实这个东西的关键就是通过 \(\gcd\) 相等来建立联系从而获得新的解。然后不难发现通过这个过程我们得到的总是整数解,于是也证明了裴蜀定理的充分性。

代码很好写。

欧拉定理

Theorem: 若正整数 \(a, p(a < p)\) 满足 \((a, p) = 1\),则有 \(a^{\varphi(p)} \equiv 1 \pmod p\)

  • 前置知识:首先对于一个模数 \(p\),定义模 \(p\) 意义下的简化剩余系为与 \(p\) 互质的数组成的集合为 \(S = \{ A_1, A_2 \dots A_{\varphi(p)}\}\)。那么任取一个正整数 \(a\) 满足 \((a, p) = 1\),则对于 \(S' = \{aA_1, aA_2 \dots , aA_{\varphi(p)}\}\),由于 \(\forall i, aA_i \bmod p < p\),同时由 \(\forall i, (aA_i, p) = 1\) 并且显然有 \(\forall i, j(i \neq j, 1 \le i, j \le \varphi(p)), aA_i \not \equiv a A_j \pmod p\)。因此 \(S'\) 也构成了一个模 \(p\) 意义下的简化剩余系。

怎么有人不知道为啥对于任意 \(\forall i, j(i \ne j, 1 \le i, j \le \varphi(p))\) 都有 \(aA_i \not \equiv aA_j \pmod p\),这里贴一个证明。(其实是刚学这个东西的我/lh/lh/lh)

考虑反证法,则有 \(aA_i \equiv aA_j \pmod p\),设 \(aA_i = q_ip + b, aA_j = q_jp + b\)。两式做差得 \(a(A_i - A_j) = p(q_i - q_j)\)。那么由于 \((a, p) = 1, a < p\),于是 \(A_i - A_j\)\(p\) 的倍数,于是得到 \(A_i \equiv A_j \pmod p\),显然与 \(i \ne j\) 矛盾。于是证完了。

  • Proof: 那么考虑取出模 \(p\) 意义下的简化剩余系 \(S = \{A_1, A_2, \dots, A_{\varphi(p)}\}\),然后每项乘上 \(a\) 得到 \(S'\),由于 \(S'\) 也是简化剩余系,于是有 \(\prod_{i = 1}^{\varphi(p)}A_i \equiv \prod_{i = 1}^{\varphi(p)} aA_i \pmod p\),然后对于所有 \(A_i\) 显然都存在逆元,于是可以得到 \(a^{\varphi(p)} \equiv 1 \pmod p\)

\(p\) 为素数时,\(\varphi(p) = p - 1\),表述等价于费马小定理。

拓展欧拉定理

可以处理对于 \((a, p) \neq 1\),并对 \(a^b\) 降幂。

Theorem: 对于正整数 \(a, b, p\)\(b \ge \varphi(p)\),有 \(a^b = a^{b \bmod \varphi(p) + \varphi(p)}\)

  • Proof: 不会。

BSGS/exBSGS

这个算法是用于解决模意义下的高次方程的,即用于求解 \(a^x \equiv b \pmod p\)

首先考虑 \((a, p) = 1\) 的情况如何解决。不难发现若存在 \(x\) 满足条件,则一定存在 \(x < \varphi(p)\) 也满足条件。于是我们可以枚举 \(x = 0, 1, 2\dots, \varphi(p) - 1\) 并逐个判断是否满足条件。但是这样的时间复杂度是 \(O(\varphi(p))\) 的,显然不够优秀。

我们考虑分块,令 \(B = \sqrt{\varphi(p)}\)。则此时对于任意 \(a^x\) 都可以拆成 \(\frac{(a^B)^n}{a^m}(1 \le n \le B, 0 \le m < B)\)。于是我们可以将 \(b, a \times b, a^2 \times b, \dots, a^B \times b\) 全都加入一个哈希表中,并枚举 \((a^B)^n\),在哈希表中查询是否存在一样的数。若存在 \(a^m \times b \equiv (a^B)^n \pmod p\),那么由于 \((a, p) = 1\),即 \(a\) 存在逆元,于是有 \(a^{nB - m} \equiv b \pmod p\),即 \(x = nB - m\)

值得一提的是,若从小到大枚举,则得到的 \(x\) 为最小解。这个就是 \(\rm BSGS\)(大步小步算法) 算法。时间复杂度为 \(O(\sqrt {\varphi(p)})\) 或带个 \(\rm log\)\(\rm map\) 实现)。

然后考虑 \((a, p) \neq 1\) 时如何做,此时 \(a\) 不存在逆元不能直接做。那么考虑转化成 \((a, p) = 1\) 的情况去做。令 \(g = \gcd(a, p)\),则可以将等式两边同时除掉 \(g\),即化成 \(\frac{a}{g} \times a^{x - 1} \equiv \frac{b}{g} \pmod {\frac{p}{g}}\)。令 \(b \gets \frac{b}{g}, p \gets \frac{p}{g}\),然后不断重复直到 \((a, p) = 1\) 为止。但是当 \(g \nmid b\) 时咋办?我们将原式化成 \(a^x + qp = b\) 的形式。那么根据裴蜀定理可以得出该不定方程不存在整数解。于是该情况无解,判断一下即可。

然后做到 \((a, p) = 1\) 时,令重复的次数为 \(cnt\)\(\gcd\) 的乘积为 \(G\),则令 \(b \gets b \times G^{-1}\),然后做 \(\rm BSGS\) 并让最后答案加上 \(cnt\)

但是这里需要注意一下答案可能小于 \(cnt\),所以需要在除 \(\gcd\) 的过程中判断一下是否有 \(a^{cnt} \equiv b \pmod p\)

最后还要特判 \(p = 1\)\(b = 1\) 的情况,还有 \(a = 0\) 的情况。时间复杂度为 \(O(\log p + \sqrt{\varphi(p)})\)

qwq
#include<bits/stdc++.h>
#define ll long long
#define pb emplace_back
#define pir pair<int, ll>
#define fi first
#define se second
#define inv(x) qpow(x, mod - 2)
#define il inline
#define mkpir make_pair
#define ull unsigned long long
using namespace std;

const int N = 2e5 + 10, M = 2e5 + 10;
ll mod;

/*
struct edge{
  int v, next;
}edges[M << 1];
int head[N], idx;

void add_edge(int u, int v){
  edges[++idx] = {v, head[u]};
  head[u] = idx;
}
*/

il ll qpow(ll& x, ll y){
  ll ret = 1;
  for(; y; y >>= 1, x = x * x % mod) if(y & 1) ret = ret * x % mod;
  return ret;
}
il void chkmin(ll& x, ll y){if(y < x) x = y;}
il void chkmax(ll& x, ll y){if(y > x) x = y;}
il void chkmin(int& x, int y){if(y < x) x = y;}
il void chkmax(int& x, int y){if(y > x) x = y;}
il void ADD(ll& x, ll y){x += y; (x >= mod) ? (x -= mod) : 0;}
il void MUL(ll& x, ll y){x = x * y % mod;}
il void chkmod(ll& x){x = (x + mod) % mod;}
//#define int long long

ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a;}

void exgcd(ll a, ll b, ll& x, ll& y){
  if(b == 0){x = 1; y = 0; return;}
  exgcd(b, a % b, y, x); y -= (a / b) * x;
}

ll exBSGS(ll a, ll b){
  chkmod(a); chkmod(b);
  if(b == 1 || mod == 1) return 0ll;
  if(!a) return b ? -1ll : 1ll;
  ll g, mul = 1, cnt = 0;
  while((g = gcd(a, mod)) != 1){
    if(b % g) return -1;
    cnt++; b /= g; mod /= g; MUL(mul, a / g);
    if(mul == b) return cnt;
  }
  map<ll, int> mp;
  int B = sqrt(mod) + 1; ll x, y; exgcd(mul, mod, x, y); chkmod(x); MUL(b, x);
  mp[b] = 0;
  for(int i = 1; i <= B; i++) MUL(b, a), mp[b] = i;
  ll pw = qpow(a, B); b = 1;
  for(int i = 1; i <= B; i++) if(mp.count(b = b * pw % mod)) return i * B - mp[b] + cnt;
  return -1;
}

signed main(){
  ios::sync_with_stdio(0);
  cin.tie(0); cout.tie(0);
  ll a, b;
  while(cin >> a >> mod >> b && a && b && mod){
    ll res = exBSGS(a, b);
    if(res == -1) cout << "No Solution" << "\n";
    else cout << res << "\n";
  }

  return 0;
}

中国剩余定理(CRT/exCRT)

阶与原根

  • 阶: 对于模数 \(m\) 和底数 \(a\) ,若 \(g\) 是满足 \(a^g \equiv 1 \pmod m\) 的最小正整数,则称 \(g\) 为模 \(m\) 意义下 \(a\) 的阶。下面记 \(g = \delta_m(a)\)

相关性质:

  • 阶一定是 \(\varphi(m)\) 的某个约数,即 \(\delta_m(a) | \varphi(m)\)

使用该定理可以通过分解质因数的方式做到对于固定模数 \(m\) 的情况下,在多组询问 \(a\) 的情况下做到 \(O(\sqrt {\varphi(m)} + T \log m)\) 的时间复杂度回答 \(a\) 的阶。

  • 若对于正整数 \(a, n(a \neq 1)\)\(a^n \equiv 1 \pmod m\),则有 \(\delta_m(a) | n\)

Proof: 考虑反证法,令 \(\delta_m(a) = g, n = qg + r(0 < r < g)\)。于是有 \((a^g)^q \times a^r \equiv 1 \pmod m\)。由于 \(a^g \equiv 1 \pmod m\),于是得到 \(a^r \equiv 1 \pmod m\)。但是 \(r < g = \delta_m(a)\),与阶的最小性矛盾。

  • \(\delta_m(g^k) = \frac{\delta_m(g)}{\gcd(\delta_m(g), k)}\)

Proof:

  • 注意到 \((g^k)^{\delta_m(g^k)} \equiv 1 \pmod m\),即 \(g^{k \delta_m(g^k)} \equiv 1 \pmod m\),由上面的结论有 \(\delta_m(g) | k\delta_m(g^k)\),即 \(\frac{\delta_m(g)}{\gcd(\delta_m(g), k)} | \delta_m(g^k)\)

  • 又注意到 \((g^{\delta_m(g)})^{\frac{k}{\gcd(\delta_m(g), k)}} \equiv 1 \pmod m\),即 \((g^k)^{\frac{\delta_m(g)}{\gcd(\delta_m(g), k)}} \equiv 1 \pmod m\)。与上面同理得到 \(\delta_m(g^k) | \frac{\delta_m(g)}{\gcd(\delta_m(g), k)}\)

结合两式得到 \(\delta_m(g^k) = \frac{\delta_m(g)}{\gcd(\delta_m(g), k)}\)

  • 原根: 若对于模数 \(m\),若存在某个 \(a\) 满足 \(a\) 的阶为 \(\varphi(m)\),则称 \(a\)\(m\) 的原根。

注意:不是对于所有 \(m\) 均存在原根!(下面将给出所有存在原根的 \(m\) 的具体形式)

  1. 对于给定的模数 \(m\) 和正整数 \(g\),则 \(g\) 为原根 当且仅当 对于 \(\varphi(m)\) 的任意因子 \(d\),满足 \(g^{\frac{\varphi(m)}{d}} \not \equiv 1 \pmod m\)。(原根判定定理)

用此定理可以做到 \(O(\sqrt m) - O(\log \varphi(m))\) 时间复杂度下判定单个数是否为原根。

  1. 对于模数 \(m\)\(m\) 存在原根 当且仅当 \(m\)\(1, 2, 4, p^q, 2p^q\) 形式中的一种,其中 \(p\)奇质数\(q\) 为正整数。(原根存在定理)

证明见 OI-wiki。我不会。

此定理告诉我们 \(m\) 存在原根的条件是固定的,而非没有规律的。

  1. 对于模数 \(m\),若 \(m\) 存在原根,则原根的个数为 \(\varphi(\varphi(m))\) 的,并且在 \(2 \sim m - 1\) 几乎是均匀分布的。具体的,假设 \(m\) 存在最小原根 \(g\),则对于 \((a, \varphi(m)) = 1, a \le \varphi(m)\)\(g^a\) 也是 \(m\) 的原根,且除此之外不再存在 \(m\) 的原根。于是有进一步的结论:\(m\)最小原根 的大小是 \(m^{0.25}\) 级别的。

证一下前面的结论。首先由于只有 \((x, m) = 1\)\(x\) 才有可能是原根,而且 \((g, m) = 1\),因此 \(S = \{g, g^2, \dots, g^{\varphi(m)}\}\) 为模 \(m\) 意义下的简化剩余系,其包含了 所有 可能产生原根的数字。即所有原根都可以被表述为 \(g^a\)

然后我们由上面的结论有 \(\delta_m(g^a) = \frac{\delta_m(g)}{\gcd(a, \delta_m(g))}\),那么若 \(g^a\) 为原根,则一定有 \(\delta_m(g^a) = \delta_m(g) = \varphi(m)\),于是 \(\gcd(a, \delta_m(g)) = 1\)。即 \(\gcd(a, \varphi(m)) = 1\),于是满足条件的 \(a\)\(\varphi(\varphi(m))\) 个,从而满足条件的 \(g^a\) 也有 \(\varphi(\varphi(m))\) 个。

后面的结论不会证,但是此结论为后面我们暴力求解原根的时间复杂度提供了保障。

  • 求解原根: 先对 \(\varphi(m)\) 进行质因数分解,然后从 \(2\) 开始枚举正整数 \(g\),并使用原根判定定理判定 \(g\) 是否为原根。时间复杂度大约为 \(O(\sqrt {\varphi(m)} + m^{0.25} \log m)\)

代码晚点补。

posted @ 2025-07-16 11:18  Little_corn  阅读(21)  评论(0)    收藏  举报