一只蒟蒻的数论学习笔记(约数篇二)

更多请见DUMBLOG

一只蒟蒻的数论学习笔记(约数篇二)

欧拉函数

定义

1 到 N N N 中与 N N N 互质的数的个数被称为欧拉函数,记为 φ ( N ) \varphi(N) φ(N)

性质

显然,如果 N N N 为质数,则 φ ( N ) = N − 1 \varphi(N)=N-1 φ(N)=N1

欧拉函数为 积性函数 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(1p1)

证明:
x x x p k p^{k} pk 不互质,则有 p ∣ x p|x px 成立。
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)=npn=n(1p1)

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×p1p11×p2p21×...×pmpm1
φ ( 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×(1p11)×(1p21)×...×(1pm1)
即:
φ ( 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=1m(1pi1)

证明: φ \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} ab(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 \} {xx=a+km,a[0,m1],kZ} 的所有数模 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} a1(modn) a a 1 ≡ 1 ( m o d n ) aa_{1} \equiv 1 \pmod{n} aa11(modn)
∴ a a 1 ≡ 1 ( m o d n ) \therefore aa_{1} \equiv 1 \pmod{n} aa11(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} apa(modp),即 a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\pmod{p} ap11(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=x0y0q 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 kZ




乘法逆元

若整数 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}} baa×x(modm)
x x x b b b 的模 m m m 乘法逆元,记为 b − 1 ( m o d m ) b^{-1} \pmod{m} b1(modm)
可以推得: m m m 为质数时, b m − 2 b^{m-2} bm2 即为 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 bp2modp,所以能用快速幂求。

#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} i1=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} pmodiip×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} i1=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×b1(modp)

∵ b − 1 = i n v [ b ] \because b^{-1}=inv[b] b1=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]modppip(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} axc(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 即为解。




剩下的下次再说吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值