本文介绍欧拉函数、同余以及拓展欧几里得算法。
欧拉函数
定义
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 g cd( a , b ) = 1 ,则 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ ( a b ) = φ ( a ) φ ( b ) 。
若 n = p k n=p^{k} n = p k ,p p p 为质数,则 φ ( n ) = n ( 1 − 1 p ) \varphi(n)=n(1-\dfrac{1}{p}) φ ( n ) = n ( 1 − p 1 ) 。
证明:
若 x x x 与 p k p^{k} p k 不互质,则有 p ∣ x p|x p ∣ x 成立。
x x x 共有 n p \dfrac{n}{p} p n 个,因此 φ ( n ) = n − n p = n ( 1 − 1 p ) \varphi(n)=n-\dfrac{n}{p}=n(1-\dfrac{1}{p}) φ ( n ) = n − p n = n ( 1 − p 1 )
若 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 = p _ 1 c _ 1 p _ 2 c _ 2 . . . p _ m c _ m ,则:
φ ( 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 × p _ 1 p _ 1 − 1 × p _ 2 p _ 2 − 1 × . . . × p _ m p _ m − 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 − p _ 1 1 ) × ( 1 − p _ 2 1 ) × . . . × ( 1 − p _ m 1 )
即:
${\small \varphi \left ( n \right ) = n \times \prod_{i=1}^{m} \left ( 1-\frac{1}{p_{i}} \right )} $
证明:φ \varphi φ 是积性函数。把 n n n 拆成 p _ i a _ i p\_{i}^{a\_{i}} p _ i a _ i 的乘积形式可立即得证。
代码
我们只要在分解质因数时顺便将欧拉函数求出来就好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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} a m o d m = b m o d m ,则称 a a a 与 b b b 同余,写作 a ≡ b ( m o d m ) a \equiv b \pmod{m} a ≡ b ( m o d m )
同余类、剩余系
对于一个集合 { 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 + k m , 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 ( m o d n ) ,其中 φ ( n ) \varphi(n) φ ( n ) 为欧拉函数。
证明
设 S = { a _ 1 , a _ 2 , . . . , a _ φ ( n ) } S=\{ a\_{1},a\_{2},...,a\_{\varphi(n)} \} S = { a _ 1 , a _ 2 , . . . , 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 ( m o d n ) ,a a _ 1 ≡ 1 ( m o d n ) aa\_{1} \equiv 1 \pmod{n} a a _ 1 ≡ 1 ( m o d n )
∴ a a _ 1 ≡ 1 ( m o d n ) \therefore aa\_{1} \equiv 1 \pmod{n} ∴ a a _ 1 ≡ 1 ( m o d n )
同理,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} a a _ 2 , a a _ 3 , . . . , a a _ φ ( n ) ≡ 1 ( m o d n )
∴ 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} ∴ a a _ 1 × a a _ 2 × . . . × a a _ φ ( n ) ≡ 1 ( m o d n )
∴ 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 ) ( a _ 1 a _ 2 . . . a _ φ ( n ) ) ≡ a _ 1 a _ 2 . . . a _ φ ( n ) ( m o d n )
∴ a φ ( n ) ≡ 1 ( m o d n ) \therefore a^{\varphi(n)}\equiv 1 \pmod{n} ∴ a φ ( n ) ≡ 1 ( m o d n )
费马小定理
若 p p p 为质数,则对于任意整数 a a a ,有 a p ≡ a ( m o d p ) a^{p}\equiv a \pmod{p} a p ≡ a ( m o d p ) ,即 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod{p} a p − 1 ≡ 1 ( m o d p )
证明太简单了,懒得证 (用欧拉函数和欧拉定理证)
扩展欧几里得算法
贝祖定理(裴蜀定理)
定义
对于任意整数 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)} a x + b y = g cd( a , b ) 。特别地,一定存在 x x x ,y y y 满足 a x + b y = d ax + by = d a x + b y = d 。
等价的表述:不定方程 a x + b y = c ax + by = c a x + b y = c (a a a ,b b b ,c c c 为整数)有解的充要条件为 gcd ( a , b ) ∣ c \gcd(a,b)| c g cd( a , b ) ∣ c
推论:a a a ,b b b 互质等价于 a x + b y = 1 ax + by = 1 a x + b y = 1 有解
原理
考虑如何求得 a x + b y = d ax + by = d a x + b y = d 的一个解。这里 d = gcd ( a , b ) d = \gcd(a,b) d = g cd( a , b )
考虑使用欧几里德算法的思想,令 a = b q + r a = bq + r a = b q + r ,其中 r = a m o d b r= a \bmod b r = a m o d b ;递归求出 b x + r y = d bx + ry = d b x + r y = d 的一个解。
设求出 b x + r y = d bx + ry = d b x + r y = d 的一个解为 x = x _ 0 x = x\_{0} x = x _ 0 ,y = y _ 0 y = y\_{0} y = y _ 0 ,考虑如何把它变形成 a x + b y = d ax + by = d a x + b y = d 的解。
将 a = b q + r a = bq + r a = b q + r 代入 a x + b y = d ax + by = d a x + b y = d 、化简得 b ( x q + y ) + r x = d b(xq + y)+ rx = d b ( x q + y ) + r x = d
我们令 x q + y = x _ 0 xq + y = x\_{0} x q + y = x _ 0 ,x = y _ 0 x = y\_{0} x = y _ 0 ,则上式成立
故 x = y _ 0 x=y\_{0} x = y _ 0 ,y = x _ 0 − y _ 0 q y=x\_{0}-y\_{0}q y = x _ 0 − y _ 0 q 为 a x + b y = d ax + by = d a x + b y = d 的解
边界情况:b = 0 b = 0 b = 0 时,令 x = 1 x = 1 x = 1 ,y = 0 y = 0 y = 0
代码
1 2 3 4 5 6 7 8 9 10 11 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} x _ 0 和 y _ 0 y\_{0} y _ 0 。
则 a x _ 0 + b y _ 0 = c ax\_{0}+by\_{0}=c a x _ 0 + b y _ 0 = c
再求出 a x + b y = 0 ax + by = 0 a x + b y = 0 的最小(绝对值)解 x ′ = b gcd ( a , b ) x' = \dfrac{b}{\gcd(a,b)} x ′ = g cd( a , b ) b 和 y ′ = − a gcd ( a , b ) y' = \dfrac{-a}{\gcd(a,b)} y ′ = g cd( a , b ) − a
则 ( a x _ 0 + b y _ 0 ) + k ( a x ′ + b y ′ ) = c (ax\_{0}+by\_{0})+k(ax'+by')=c ( a x _ 0 + b y _ 0 ) + k ( a x ′ + b y ′ ) = c
即 a ( x _ 0 + k x ′ ) + b ( y _ 0 + k y ′ ) = c a(x\_{0}+kx')+b(y\_{0}+ky')=c a ( x _ 0 + k x ′ ) + b ( y _ 0 + k y ′ ) = c
所有解就是 x = x _ 0 + k x ′ x=x\_{0}+kx' x = x _ 0 + k x ′ ,y = y _ 0 + k y ′ y=y\_{0}+ky' y = y _ 0 + k y ′ ,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}} b a ≡ a × x ( m o d m ) 。
称 x x x 为 b b b 的模 m m m 乘法逆元,记为 b − 1 ( m o d m ) b^{-1} \pmod{m} b − 1 ( m o d m ) 。
可以推得:当 m m m 为质数时,b m − 2 b^{m-2} b m − 2 即为 b b b 的乘法逆元(即 x x x )。
那么咋求逆元捏?
快速幂求逆元
快速幂
快速幂是啥?
可以看成是二进制优化的用来求 a b m o d p \mathbf{a^{b}\bmod p} a b m o d p 的东西。
代码
求逆元相当于求 b p − 2 m o d p b^{p-2}\bmod p b p − 2 m o d p ,所以能用快速幂求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #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 a x + b y = 1
所以可以直接上板子。
代码
1 2 3 4 5 6 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 = ⌊ i p ⌋ × i + p m o d i (⌊ ⌋为向下取整),
令 a = ⌊ p i ⌋ a = \left \lfloor \dfrac{p}{i} \right \rfloor a = ⌊ i p ⌋ ,b = p m o d i b = p \bmod i b = p m o d i ,
∴ 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 ( m o d p )
∴ a × i = − b ( m o d p ) \therefore a\times i=-b \pmod{p} ∴ a × i = − b ( m o d p )
∴ i = − b a ( m o d p ) \therefore i=-\dfrac{b}{a} \pmod{p} ∴ i = − a b ( m o d p )
∴ i − 1 = − a b ( m o d p ) \therefore i^{-1}=- \dfrac{a}{b}\pmod{p} ∴ i − 1 = − b a ( m o d p )
综上,i i i 的逆元为 − ⌊ p i ⌋ × i p m o d i \dfrac{-\left \lfloor \dfrac{p}{i} \right \rfloor\times i}{p \bmod i} p m o d i − ⌊ i p ⌋ × i
设 i n v [ i ] inv[ i ] i n v [ i ] 为 i i i 的逆元,
∵ i − 1 = − a b ( m o d p ) \because i^{-1}=-\dfrac{a}{b}\pmod{p} ∵ i − 1 = − b a ( m o d p )
∴ i n v [ i ] = − a × b − 1 ( m o d p ) \therefore inv[i]=-a\times b^{-1}\pmod{p} ∴ i n v [ i ] = − a × b − 1 ( m o d p )
∵ b − 1 = i n v [ b ] \because b^{-1}=inv[b] ∵ b − 1 = i n v [ b ]
∴ i n v [ i ] = − a i n v [ b ] ( m o d p ) \therefore inv[i]=-\dfrac{a}{inv[b]}\pmod{p} ∴ i n v [ i ] = − i n v [ b ] a ( m o d p )
∴ 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} ∴ i n v [ i ] = − i n v [ p m o d i ] ⌊ i p ⌋ ( m o d p )
∴ 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) ∴ i n v [ i ] = i n v [ p m o d i ] m o d p p − ⌊ i p ⌋ ( ∵ x m o d p = ( x + p ) m o d p )
有了公式后就能用线性的复杂度求出每个数的逆元了。
代码
1 2 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} a x ≡ c ( m o d m ) 的方程(关于 x x x ),称为线性同余方程。
该方程等价于 a x + m y = c ax + my = c a x + m y = c ,有解条件为 gcd ( a , m ) ∣ c \gcd(a,m)| c g cd( a , m ) ∣ c 。
所以可以用 拓展gcd \gcd g cd 来求。
求出 x _ 0 x\_{0} x _ 0 和 y _ 0 y\_{0} y _ 0 ,满足 a x _ 0 + m y _ 0 = gcd ( a , m ) ax\_{0}+my\_{0}=\gcd(a,m) a x _ 0 + m y _ 0 = g cd( a , m ) 。
然后 x = x _ 0 × b gcd ( a , m ) x=x\_{0}\times\dfrac{b}{\gcd(a,m)} x = x _ 0 × g cd( a , m ) b
x x x 即为解。
剩下的下次再说吧。