更多请见DUMBLOG
一只蒟蒻的数论学习笔记(约数篇二)
欧拉函数
定义
1 到 N N N 中与 N N N 互质的数的个数被称为欧拉函数,记为 φ ( N ) \varphi(N) φ(N)。
性质
显然,如果 N N N 为质数,则 φ ( N ) = N − 1 \varphi(N)=N-1 φ(N)=N−1
欧拉函数为 积性函数: 若 gcd ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1,则 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)。
若 n = p k n=p^{k} n=pk, p p p 为质数,则 φ ( n ) = n ( 1 − 1 p ) \varphi(n)=n(1-\dfrac{1}{p}) φ(n)=n(1−p1)。
证明:
若 x x x 与 p k p^{k} pk 不互质,则有 p ∣ x p|x p∣x 成立。
x x x 共有 n p \dfrac{n}{p} pn 个,因此 φ ( n ) = n − n p = n ( 1 − 1 p ) \varphi(n)=n-\dfrac{n}{p}=n(1-\dfrac{1}{p}) φ(n)=n−pn=n(1−p1)
若
N
=
p
1
c
1
p
2
c
2
.
.
.
p
m
c
m
N=p_{1}^{c_{1}}p_{2}^{c_{2}}...p_{m}^{c_{m}}
N=p1c1p2c2...pmcm,则:
φ
(
N
)
=
N
×
p
1
−
1
p
1
×
p
2
−
1
p
2
×
.
.
.
×
p
m
−
1
p
m
\varphi(N)=N \times \dfrac{p_{1}-1}{p_{1}} \times \dfrac{p_{2}-1}{p_{2}} \times ... \times \dfrac{p_{m}-1}{p_{m}}
φ(N)=N×p1p1−1×p2p2−1×...×pmpm−1
φ
(
N
)
=
N
×
(
1
−
1
p
1
)
×
(
1
−
1
p
2
)
×
.
.
.
×
(
1
−
1
p
m
)
\varphi(N)=N \times \left ( 1-\dfrac{1}{p_{1}} \right ) \times \left ( 1-\dfrac{1}{p_{2}} \right ) \times ... \times \left ( 1-\dfrac{1}{p_{m}} \right )
φ(N)=N×(1−p11)×(1−p21)×...×(1−pm1)
即:
φ
(
n
)
=
n
×
∏
i
=
1
m
(
1
−
1
p
i
)
{\small \varphi \left ( n \right ) = n \times \prod_{i=1}^{m} \left ( 1-\frac{1}{p_{i}} \right )}
φ(n)=n×i=1∏m(1−pi1)
证明: φ \varphi φ 是积性函数。把 n n n 拆成 p i a i p_{i}^{a_{i}} piai 的乘积形式可立即得证。
代码
我们只要在分解质因数时顺便将欧拉函数求出来就好了。
int phi(int n)
{
int ans = n;
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
ans = ans / i * (i - 1);
while (n % i == 0)n /= i;
}
}
if (n > 1)ans = ans / n * (n - 1);
return ans;
}
同余
定义
若 a m o d m = b m o d m a \bmod {m} = b \bmod {m} amodm=bmodm ,则称 a a a 与 b b b 同余,写作 a ≡ b ( m o d m ) a \equiv b \pmod{m} a≡b(modm)
同余类、剩余系
对于一个集合
{
x
∣
x
=
a
+
k
m
,
a
∈
[
0
,
m
−
1
]
,
k
∈
Z
}
\{ x|x=a+km,a \in \left [ 0,m-1 \right ] , k \in Z \}
{x∣x=a+km,a∈[0,m−1],k∈Z} 的所有数模
m
m
m 同余,余数都是
a
a
a 。该集合被称为一个模
m
m
m 的同余类,简记为 ā。
模
m
m
m 的同余类一共
m
m
m 个,它们构成
m
m
m 的完全剩余系。
1 到
m
m
m 中与
m
m
m 互质的数代表的同余类共有
φ
(
m
)
\varphi(m)
φ(m) 个,它们构成
m
m
m 的简化剩余系
欧拉定理
若正整数 a a a, n n n 互质,则 a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)} \equiv 1\pmod{n} aφ(n)≡1(modn),其中 φ ( n ) \varphi(n) φ(n) 为欧拉函数。
证明
设
S
=
{
a
1
,
a
2
,
.
.
.
,
a
φ
(
n
)
}
S=\{ a_{1},a_{2},...,a_{\varphi(n)} \}
S={a1,a2,...,aφ(n)} 为
n
n
n 的简化剩余系。
设
a
a
a 与
n
n
n 互质。
∵
a
≡
1
(
m
o
d
n
)
\because a \equiv 1\pmod{n}
∵a≡1(modn),
a
a
1
≡
1
(
m
o
d
n
)
aa_{1} \equiv 1 \pmod{n}
aa1≡1(modn)
∴
a
a
1
≡
1
(
m
o
d
n
)
\therefore aa_{1} \equiv 1 \pmod{n}
∴aa1≡1(modn)
同理,
a
a
2
,
a
a
3
,
.
.
.
,
a
a
φ
(
n
)
≡
1
(
m
o
d
n
)
aa_{2},aa_{3},...,aa_{\varphi(n)}\equiv 1 \pmod{n}
aa2,aa3,...,aaφ(n)≡1(modn)
∴
a
a
1
×
a
a
2
×
.
.
.
×
a
a
φ
(
n
)
≡
1
(
m
o
d
n
)
\therefore aa_{1} \times aa_{2} \times...\times aa_{\varphi(n)}\equiv1\pmod{n}
∴aa1×aa2×...×aaφ(n)≡1(modn)
∴
a
φ
(
n
)
(
a
1
a
2
.
.
.
a
φ
(
n
)
)
≡
a
1
a
2
.
.
.
a
φ
(
n
)
(
m
o
d
n
)
\therefore a^{\varphi(n)}\left ( a_{1}a_{2}...a_{\varphi(n)} \right )\equiv a_{1}a_{2}...a_{\varphi(n)} \pmod{n}
∴aφ(n)(a1a2...aφ(n))≡a1a2...aφ(n)(modn)
∴
a
φ
(
n
)
≡
1
(
m
o
d
n
)
\therefore a^{\varphi(n)}\equiv 1 \pmod{n}
∴aφ(n)≡1(modn)
费马小定理
若
p
p
p 为质数,则对于任意整数
a
a
a,有
a
p
≡
a
(
m
o
d
p
)
a^{p}\equiv a \pmod{p}
ap≡a(modp),即
a
p
−
1
≡
1
(
m
o
d
p
)
a^{p-1}\equiv 1\pmod{p}
ap−1≡1(modp)
证明太简单了,懒得证(用欧拉函数和欧拉定理证)
扩展欧几里得算法
贝祖定理(裴蜀定理)
定义
对于任意整数
a
a
a,
b
b
b,存在一对整数
x
x
x,
y
y
y,满足
a
x
+
b
y
=
gcd
(
a
,
b
)
\mathbf{ax + by = \gcd(a,b)}
ax+by=gcd(a,b)。特别地,一定存在
x
x
x,
y
y
y 满足
a
x
+
b
y
=
d
ax + by = d
ax+by=d。
等价的表述:不定方程
a
x
+
b
y
=
c
ax + by = c
ax+by=c (
a
a
a,
b
b
b,
c
c
c 为整数)有解的充要条件为
gcd
(
a
,
b
)
∣
c
\gcd(a,b)| c
gcd(a,b)∣c
推论:
a
a
a,
b
b
b 互质等价于
a
x
+
b
y
=
1
ax + by = 1
ax+by=1 有解
原理
考虑如何求得 a x + b y = d ax + by = d ax+by=d 的一个解。这里 d = gcd ( a , b ) d = \gcd(a,b) d=gcd(a,b)
考虑使用欧几里德算法的思想,令 a = b q + r a = bq + r a=bq+r,其中 r = a m o d b r= a \bmod b r=amodb;递归求出 b x + r y = d bx + ry = d bx+ry=d 的一个解。
设求出 b x + r y = d bx + ry = d bx+ry=d 的一个解为 x = x 0 x = x_{0} x=x0, y = y 0 y = y_{0} y=y0,考虑如何把它变形成 a x + b y = d ax + by = d ax+by=d 的解。
将 a = b q + r a = bq + r a=bq+r 代入 a x + b y = d ax + by = d ax+by=d、化简得 b ( x q + y ) + r x = d b(xq + y)+ rx = d b(xq+y)+rx=d
我们令 x q + y = x 0 xq + y = x_{0} xq+y=x0, x = y 0 x = y_{0} x=y0,则上式成立
故 x = y 0 x=y_{0} x=y0, y = x 0 − y 0 q y=x_{0}-y_{0}q y=x0−y0q 为 a x + b y = d ax + by = d ax+by=d 的解
边界情况: b = 0 b = 0 b=0 时,令 x = 1 x = 1 x=1, y = 0 y = 0 y=0
代码
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
求出 ax + by = c 的所有解
先用 exgcd 求出任意一个解
x
0
x_{0}
x0 和
y
0
y_{0}
y0。
则
a
x
0
+
b
y
0
=
c
ax_{0}+by_{0}=c
ax0+by0=c
再求出
a
x
+
b
y
=
0
ax + by = 0
ax+by=0 的最小(绝对值)解
x
′
=
b
gcd
(
a
,
b
)
x' = \dfrac{b}{\gcd(a,b)}
x′=gcd(a,b)b 和
y
′
=
−
a
gcd
(
a
,
b
)
y' = \dfrac{-a}{\gcd(a,b)}
y′=gcd(a,b)−a
则
(
a
x
0
+
b
y
0
)
+
k
(
a
x
′
+
b
y
′
)
=
c
(ax_{0}+by_{0})+k(ax'+by')=c
(ax0+by0)+k(ax′+by′)=c
即
a
(
x
0
+
k
x
′
)
+
b
(
y
0
+
k
y
′
)
=
c
a(x_{0}+kx')+b(y_{0}+ky')=c
a(x0+kx′)+b(y0+ky′)=c
所有解就是
x
=
x
0
+
k
x
′
x=x_{0}+kx'
x=x0+kx′,
y
=
y
0
+
k
y
′
y=y_{0}+ky'
y=y0+ky′,
k
∈
Z
k \in Z
k∈Z
乘法逆元
若整数 b,m 互质,并且
b
∣
a
\mathbf{b|a}
b∣a,则存在一个整数
x
x
x,使得
a
b
≡
a
×
x
(
m
o
d
m
)
\mathbf{\dfrac{a}{b}\equiv a \times x\pmod{m}}
ba≡a×x(modm)。
称
x
x
x 为
b
b
b 的模
m
m
m 乘法逆元,记为
b
−
1
(
m
o
d
m
)
b^{-1} \pmod{m}
b−1(modm)。
可以推得:当
m
m
m 为质数时,
b
m
−
2
b^{m-2}
bm−2 即为
b
b
b 的乘法逆元(即
x
x
x )。
那么咋求逆元捏?
快速幂求逆元
快速幂
快速幂是啥?
可以看成是二进制优化的用来求
a
b
m
o
d
p
\mathbf{a^{b}\bmod p}
abmodp 的东西。
代码
求逆元相当于求 b p − 2 m o d p b^{p-2}\bmod p bp−2modp,所以能用快速幂求。
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int unsigned long long
using namespace std;
const int N = 3000101;
int n, m;
inline int qm(int a, int k, int p)
{
int ans = 1;
while (k)
{
if (k & 1)ans = ans * a % p;
k >>= 1;
a = a * a % p;
}
return ans;
}
signed main() {
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++) printf("%lld\n", qm(i, m - 2, m));
return 0;
}
扩展欧几里得算法(贝祖定理)求逆元
求逆元又等价于求
a
x
+
b
y
=
1
ax + by = 1
ax+by=1
所以可以直接上板子。
代码
int inv(int a, int b)
{
int x, y;
exgcd(a, b, x, y);
return x;
}
线性求逆元
在求 i i i 的逆元时,
∵ p = ⌊ p i ⌋ × i + p m o d i \because p=\left \lfloor \dfrac{p}{i} \right \rfloor \times i+p \bmod i ∵p=⌊ip⌋×i+pmodi(⌊ ⌋为向下取整),
令 a = ⌊ p i ⌋ a = \left \lfloor \dfrac{p}{i} \right \rfloor a=⌊ip⌋, b = p m o d i b = p \bmod i b=pmodi,
∴ p = a × i + b \therefore p=a \times i+b ∴p=a×i+b
∵ a × i + b = p \because a \times i+b=p ∵a×i+b=p
∴ a × i + b = 0 ( m o d p ) \therefore a\times i+b=0 \pmod{p} ∴a×i+b=0(modp)
∴ a × i = − b ( m o d p ) \therefore a\times i=-b \pmod{p} ∴a×i=−b(modp)
∴ i = − b a ( m o d p ) \therefore i=-\dfrac{b}{a} \pmod{p} ∴i=−ab(modp)
∴ i − 1 = − a b ( m o d p ) \therefore i^{-1}=- \dfrac{a}{b}\pmod{p} ∴i−1=−ba(modp)
综上, i i i 的逆元为 − ⌊ p i ⌋ × i p m o d i \dfrac{-\left \lfloor \dfrac{p}{i} \right \rfloor\times i}{p \bmod i} pmodi−⌊ip⌋×i
设 i n v [ i ] inv[ i ] inv[i] 为 i i i 的逆元,
∵ i − 1 = − a b ( m o d p ) \because i^{-1}=-\dfrac{a}{b}\pmod{p} ∵i−1=−ba(modp)
∴ i n v [ i ] = − a × b − 1 ( m o d p ) \therefore inv[i]=-a\times b^{-1}\pmod{p} ∴inv[i]=−a×b−1(modp)
∵ b − 1 = i n v [ b ] \because b^{-1}=inv[b] ∵b−1=inv[b]
∴ i n v [ i ] = − a i n v [ b ] ( m o d p ) \therefore inv[i]=-\dfrac{a}{inv[b]}\pmod{p} ∴inv[i]=−inv[b]a(modp)
∴ i n v [ i ] = − ⌊ p i ⌋ i n v [ p m o d i ] ( m o d p ) \therefore inv[i]=-\dfrac{\left \lfloor \dfrac{p}{i} \right \rfloor}{inv[p\bmod i]}\pmod{p} ∴inv[i]=−inv[pmodi]⌊ip⌋(modp)
∴ i n v [ i ] = p − ⌊ p i ⌋ i n v [ p m o d i ] m o d p ( ∵ x m o d p = ( x + p ) m o d p ) \therefore inv[i]=\dfrac{p-\left \lfloor \dfrac{p}{i} \right \rfloor}{inv[p\bmod i]\bmod p}(\because x\bmod p=(x+p)\mod p) ∴inv[i]=inv[pmodi]modpp−⌊ip⌋(∵xmodp=(x+p)modp)
有了公式后就能用线性的复杂度求出每个数的逆元了。
代码
for (inv[1] = 1, i = 2; i <= n; ++i)
inv[i] = (p - p / i) * inv[p % i] % p;
线性同余方程
形如
a
x
≡
c
(
m
o
d
m
)
ax ≡ c\pmod{m}
ax≡c(modm) 的方程(关于
x
x
x),称为线性同余方程。
该方程等价于
a
x
+
m
y
=
c
ax + my = c
ax+my=c,有解条件为
gcd
(
a
,
m
)
∣
c
\gcd(a,m)| c
gcd(a,m)∣c 。
所以可以用 拓展
gcd
\gcd
gcd 来求。
求出
x
0
x_{0}
x0 和
y
0
y_{0}
y0,满足
a
x
0
+
m
y
0
=
gcd
(
a
,
m
)
ax_{0}+my_{0}=\gcd(a,m)
ax0+my0=gcd(a,m)。
然后
x
=
x
0
×
b
gcd
(
a
,
m
)
x=x_{0}\times\dfrac{b}{\gcd(a,m)}
x=x0×gcd(a,m)b
x
x
x 即为解。
剩下的下次再说吧。