7-数论

1066 字
5 分钟
7-数论

数论#

中国剩余定理(CRT)#

m2m3x1(modm1)m_2 \cdot m_3 \cdot x \equiv 1 \pmod{m_1}a1(m2m3x)a1(modm1)a_1 \cdot (m_2 \cdot m_3 \cdot x) \equiv a_1 \pmod{m_1}

扩展CRT#

using ll = long long;
// 扩展gcd
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1; y = 0;
return a;
}
ll x1, y1;
ll g = exgcd(b, a % b, x1, y1);
x = y1;
y = x1 - a / b * y1;
return g;
}
// 扩展CRT
// a[i] ≡ x (mod m[i])
// 返回 (x, lcm) 或 (-1, -1) 表示无解
pair<ll, ll> excrt(vector<ll>& a, vector<ll>& m) {
ll A = a[0], M = m[0];
for (int i = 1; i < a.size(); ++i) {
ll a2 = a[i], m2 = m[i];
ll x, y;
ll g = exgcd(M, m2, x, y);
ll c = a2 - A;
if (c % g != 0) return {-1, -1}; // 无解
// 防溢出写法
ll mod = m2 / g;
x = (__int128)x * (c / g) % mod;
A = A + x * M;
M = M / g * m2;
A = (A % M + M) % M;
}
return {A, M};
}

快速乘#

unsigned long long 溢出相当于对2642^{64}取余

ll qmul(ll a, ll b, ll p) {
ll q = (ld)a / p * b;
ll res = (ull)a * b - (ull)q * p;
return (res + p) % p;
}

快速幂#

ll qmi(ll a, ll b, ll p) {
ll res = 1 % p;
while (b) {
if (b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}

扩展欧几里得定理(EXGCD)#

求as + bt = gcd(a, b)的s和t

25s + 11t = gcd(11, 3)

11s1 + 3t1 = gcd(3, 2)

3s2 + 2t2 = gcd(2, 1)

2s3 + t3 = gcd(1, 0)

s4 = 1, t4 = 0

as+bt=bs+rtas + bt = bs' +rt'q=abq = \lfloor\frac{a}{b}\rfloorr=abqr = a - bqas+bt=bs+(aabb)tas + bt = bs' + (a - \lfloor\frac{a}{b}\rfloor \cdot b)\cdot t'as+bt=at+b(sqt)as + bt = at' + b \cdot(s' - qt')

s = t’, t = s’ - qt’

pair<int, int> extgcd(int a, int b) {
if (!b) return make_pair(1, 0);
auto [s, t] = extgcd(b, a % b);
return make_pair(t, s - a / b * t);//t * (1,s/t-a/b)
}

欧拉定理#

gcd(a, m) = 1

aφ(m)1(modm)a^{\varphi(m)} \equiv 1 \pmod{m}

费马小定理#

本身为欧拉定理的特例

p是素数,gcd(a, m) = 1, 有

apa(modp)a^p \equiv a \pmod{p}ap11(modp)a^{p-1} \equiv 1 \pmod{p}

既约剩余系 * 任意数a的数是既约剩余系的重排列

乘法在同余等价关系上有幺元,当乘数和模数互素时有逆元

gcd(a, n) = 1

贝祖定理 as + nt = 1,则有

as1(modn)as \equiv 1 \pmod{n}

则a有逆元s,同时可以进行同余除法

命题#

设模 ( n ) 的既约剩余系为:

[R=r1,r2,,rφ(n)][ R = {r_1, r_2, \dots, r_{\varphi(n)}} ]

其中:

[gcd(ri,n)=1][ \gcd(r_i, n) = 1 ]

若整数 ( a ) 满足:

[gcd(a,n)=1][ \gcd(a, n) = 1 ]

则集合:

[aR=ar1,ar2,,arφ(n)(modn)][ aR = {ar_1, ar_2, \dots, ar_{\varphi(n)}} \pmod n ]

仍然是模 ( n ) 的一个既约剩余系(只是一个重排列)。


证明思路#

分三步:


第一步:仍然互质#

因为:

[gcd(a,n)=1,gcd(ri,n)=1][ \gcd(a,n)=1,\quad \gcd(r_i,n)=1 ]

则:

[gcd(ari,n)=1][ \gcd(ar_i, n)=1 ]

理由:

若某质因子 (pn),由于 (a) 与 (n) 互质,(pa)由于 (ri) 与 (n) 互质,(pri)\text{若某质因子 } ( p \mid n ), \text{由于 } ( a ) \text{ 与 } ( n ) \text{ 互质,} ( p \nmid a ) \text{由于 } ( r_i ) \text{ 与 } ( n ) \text{ 互质,} ( p \nmid r_i )

因此:

[pari][ p \nmid ar_i ]

故:

[gcd(ari,n)=1][ \gcd(ar_i,n)=1 ]

所以每个元素仍在单位群里。


第二步:不会产生重复#

假设:

[ariarj(modn)][ ar_i \equiv ar_j \pmod n ]

则:

[a(rirj)0(modn)][ a(r_i - r_j) \equiv 0 \pmod n ]

因为:

[gcd(a,n)=1][ \gcd(a,n)=1 ]

所以 ( a ) 在模 ( n ) 下可逆。乘以 ( a^{-1} ) 得:

[rirj(modn)][ r_i \equiv r_j \pmod n ]

但既约剩余系中本来互不相同,因此:

[i=j][ i=j ]

所以不会出现重复。


第三步:个数相同#

原集合有:

[φ(n)][ \varphi(n) ]

个元素。

现在:

  • 每个元素仍互质
  • 无重复
  • 个数不变

因此必然是既约剩余系的一个排列。

质数#

筛法#

线性筛法

int primes[N], idx;
bool vis[N];
void getp(int n) {
memset(primes, 0, sizeof primes);
primes[1] = 0;
for (int i = 2; i <= n; ++i) {
if (!vis[i]) primes[++idx] = i;
for (int j = 1; i * primes[j] <= n; ++j) {
vis[i * primes[j]] = 1;
if (i % primes[j] == 0) break;
}
}
}

埃筛

int primes[N], idx;
bool vis[N];
void getp(int n) {
for (int i = 2; i <= n; ++i) {
if (vis[i]) continue;
primes[idx++] = i;
for (int j = i; j <= n / j; ++j) {
vis[j * i] = 1;
}
}
}

约数#

质因数分解#

纯暴力

unordered_map<int, int> pcnt;
void getfactor(int n) {
for (int i = 2; i <= n / i; ++i) {
while (n % i == 0) {
++pcnt[i];
n /= i;
}
}
}

阶乘的质因数分解

p 指数的数量=k=0Npk\text{p 指数的数量}=\sum_{k = 0}^{\infty}{\lfloor \frac{N}{p^k} \rfloor}

约数计算#

质因数分解 p0c0p1c1pkck\text{质因数分解 } p_0^{c_0} p_1^{c_1} \cdots p_k^{c_k}约数之和=i=0kj=0cipij\text{约数之和}=\sum_{i = 0}^{k}\sum_{j=0}^{c_i}{p_i^j}约数的数量=i=0k(ci+1)\text{约数的数量}=\prod_{i=0}^{k}{(c_i + 1)}

欧拉函数#

φ(p)=[1, p1] 内与 p 互质的数的数量\varphi(p) = \text{[1, } p - 1 \text{] 内与 } p \text{ 互质的数的数量}

性质#

gcd(m,n)=1φ(mn)=φ(m)φ(n)gcd(m,n) = 1 \Rightarrow \varphi(mn) = \varphi(m) \cdot \varphi(n)

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

7-数论
https://skaco2.com/posts/01-algorithm/7-数论/
作者
SKACO2
发布于
2026-04-05
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
SKACO2
Hello……
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
53
分类
8
标签
54
总字数
58,255
运行时长
0
最后活动
0 天前

目录