数论基础知识

本 文 更 新 中 本文更新中

欧拉函数

欧 拉 函 数 : 小 于 n 的 正 整 数 中 与 n 互 质 的 数 的 数 目 , φ ( 1 ) = 1 欧拉函数:小于n的正整数中与n互质的数的数目,\varphi(1)=1 :nn,φ(1)=1,通式: φ ( x ) = x ∏ i = 1 n ( 1 − 1 p i ) \varphi(x)=x\displaystyle\prod^n_{i=1}\left(1-\frac{1}{p_i}\right) φ(x)=xi=1n(1pi1)
x = p 1 a 1 ⋯ p n a n 为 x 的 标 准 分 解 x=p_1^{a_1}\cdots p_n^{a_n}为x的标准分解 x=p1a1pnanx

性质:

  1. 若 n 是 素 数 , 有 φ ( n ) = n − 1 若n是素数 , 有\varphi(n)=n−1 n,φ(n)=n1
  2. n > 2 , φ ( n ) 是 偶 数 n>2,\varphi(n)是偶数 n>2,φ(n)
  3. 若 a 是 素 数 且 n 不 是 a 倍 数 , 有 φ ( n ∗ a ) = φ ( n ) ∗ ( a − 1 ) 若a是素数且n不是a倍数 , 有\varphi(n∗a)=\varphi(n)*(a−1) ana,φ(na)=φ(n)(a1)
  4. 若 a 是 素 数 且 n   m o d   a = 0 , 有 φ ( n ∗ a ) = φ ( n ) ∗ a 若a是素数且n\ mod\ a=0 , 有\varphi(n∗a)=\varphi(n)∗a an mod a=0,φ(na)=φ(n)a
  5. 若 g c d ( n , m ) = 1 , 有 φ ( m ∗ n ) = φ ( m ) ∗ φ ( n ) ( 积 性 函 数 ) 若gcd(n,m)=1 , 有\varphi(m∗n)=\varphi(m)∗\varphi(n)(积性函数) gcd(n,m)=1,φ(mn)=φ(m)φ(n)()
  6. 若 n 是 奇 数 , 有 φ ( 2 ∗ n ) = φ ( n ) 若n是奇数 , 有\varphi(2∗n)=\varphi(n) n,φ(2n)=φ(n)
  7. 若 n 和 m 是 素 数 , 有 φ ( n ∗ m ) = n ∗ m − 1 若n和m是素数 , 有\varphi(n∗m)=n∗m−1 nm,φ(nm)=nm1
  8. 若 p 是 素 数 , 有 φ ( p q ) = p q − p q − 1 若p是素数 , 有\varphi(p^q)=p^q−p^{q−1} p,φ(pq)=pqpq1
  9. ∑ d ∣ m φ ( d ) = m d 为 m 的 所 有 正 约 数 \displaystyle\sum_{d|m}\varphi(d)=m\quad d为m的所有正约数 dmφ(d)=mdm
#include 
#define ll long long
const int MAX_N = 1e6 + 5;
ll phi[MAX_N];
bool isprime[MAX_N];
//欧拉筛法
void Euler()
{
	for(int i = 1; i < MAX_N; ++i) phi[i] = i;
	memset(isprime, true, sizeof(isprime));
	isprime[0] = isprime[1] = false;
	for (int i = 2;i <= MAX_N; ++i){
		if (isprime[i])
			for (int j = i; j <= MAX_N; j += i){
				isprime[j] = false;
				phi[j] -= phi[j] / i;
			}
	}
}

void Euler()
{
	for (int i = 1; i < MAX_N; ++i) phi[i] = i;
	for (int i = 2; i < MAX_N; ++i)
		if (phi[i] == i)
			for (int j = i; j < MAX_N; j+=i)
				phi[j] = (i - 1) * phi[j] / i;
}
//单个欧拉函数值
ll phi(ll n)
{  
	ll ans = n;  
	for (ll i = 2; i * i <= x; ++i) {
		if (x % i == 0) { 
			ans -= ans / i; 
			while (x % i == 0) x /= i; 
		} 
	}
	if (x > 1) ans -= ans / x; 
	return ans;  
} 

著名数论定理

欧拉定理

T h e o r e m : 设 g c d ( a , m ) = 1 , 则 a φ ( m ) ≡ 1 ( m o d   m ) {\bf Theorem: }设gcd(a,m)=1,则a^{\varphi(m)}\equiv1(mod\ m) Theorem:gcd(a,m)=1,aφ(m)1(mod m)

费马小定理

T h e o r e m : 设 p 是 素 数 , p ∤ a , 则 a p − 1 ≡ 1 ( m o d   p ) {\bf Theorem:}设p是素数,p\nmid a,则a^{p-1}\equiv1(mod\ p) Theorem:p,pa,ap11(mod p)
对 于 素 数 p , 任 取 跟 其 互 素 的 数 a , 有 a p − 1 ( m o d   p ) = 1 所 以 任 取 b , 有 a b % p = a b % ( p − 1 ) ( % p ) 从 而 简 化 运 算 。 对于素数p,任取跟其互素的数a,有a^{p-1}(mod\ p)=1\\ 所以任取b,有a^b\%p=a^{b\%(p-1)}(\%p)从而简化运算。 paap1(mod p)=1bab%p=ab%(p1)(%p)

威尔逊定理

T h e o r e m : 设 p 是 素 数 , 则 ( p − 1 ) ! ≡ − 1 ( m o d   p ) {\bf Theorem:}设p是素数,则\left(p-1\right)!\equiv-1(mod\ p) Theorem:p,(p1)!1(mod p)

中国剩余定理

T h e o r e m : 对 于 两 两 互 质 的 m i , 同 余 方 程 组 { x ≡ r 1 ( m o d   m 1 ) x ≡ r 2 ( m o d   m 2 ) ⋮ x ≡ r n ( m o d   m n ) 的 解 为 x ≡ ∑ i = 1 n r i M i M i ‘ ( m o d   M ) , 其 中 M = ∏ i = 1 n m i , M i = M m i , M i ‘ ≡ M i − 1   ( m o d   m i ) {\bf Theorem:}对于两两互质的m_i,同余方程组\begin{cases} x\equiv r_1\quad(mod\ m_1)\\ x\equiv r_2\quad(mod\ m_2)\\ \vdots\\ x\equiv r_n\quad(mod\ m_n) \end{cases}的解为\\ x\equiv\sum_{i=1}^nr_iM_iM_i^`(mod\ M),其中M=\prod_{i=1}^nm_i,M_i=\frac{M}{m_i},M_i^`\equiv M_i^{-1}\ (mod\ m_i) Theorem:mi,xr1(mod m1)xr2(mod m2)xrn(mod mn)xi=1nriMiMi(mod M),M=i=1nmi,Mi=miM,MiMi1 (mod mi)
例 : 例: :POJ2891

#define ll long long
ll a[MAX_N], b[MAX_N];

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

ll crt()
{
    ll ans = 0, lcm = 1, x, y;
    for(ll i = 0; i < k; ++i) lcm *= b[i];
    for(ll i = 0; i < k; ++i) {
        ll t = lcm / b[i];
        exgcd(t, b[i], x, y);
        x = (x % b[i] + b[i]) % b[i];
        ans = (ans + t * x * a[i]) % lcm;
    }
    return (ans + lcm) % lcm;
}
  • 拓 展 中 国 剩 余 定 理 ( m i 不 一 定 两 两 互 质 ) : 拓展中国剩余定理(m_i不一定两两互质): (mi):
    例 : 例: :Luogu P4777

同余

  • g c d ( a , b ) = g c d ( a , b − a ) = g c d ( a , b   m o d   a ) gcd(a,b)=gcd(a,b-a)=gcd(a,b\ mod\ a) gcd(a,b)=gcd(a,ba)=gcd(a,b mod a)

  • a ⋅ b = g c d ( a , b ) ⋅ l c m ( a , b ) a\cdot b=gcd(a,b)\cdot lcm(a,b) ab=gcd(a,b)lcm(a,b)

  • 扩 展 欧 几 里 得 算 法 ( 贝 祖 ( B e z o u t ) 定 理 ) : 存 在 整 数 下 x , y , 使 得 a x + b y = g c d ( a , b ) 扩展欧几里得算法\left(贝祖\left(Bezout\right)定理\right):存在整数下x,y,使得ax+by=gcd(a,b) ((Bezout)):x,y使ax+by=gcd(a,b)
    b = 0 时 , g c d ( a , b ) = a , x = 1 , y = 0 , 否 则 a x 1 + b y 1 = g c d ( a , b ) , b x 2 + ( a   m o d   b ) y 2 = g c d ( b , a   m o d   b ) = g c d ( a , b ) a x 1 + b y 1 = a x 2 + ( a − [ a b ] b ) y 2 = a y 2 + b ( x 2 − [ a b ] y 2 ) 故 x 1 = y 2 , y 1 = x 2 − [ a b ] y 2 b=0时,gcd(a,b)=a,x=1,y=0,否则\\ax_1+by_1=gcd(a,b),\quad bx_2+(a\ mod\ b)y_2=gcd(b,a\ mod\ b)=gcd(a,b)\\ax_1+by_1=ax_2+(a-[\frac{a}{b}]b)y_2=ay_2+b(x_2-[\frac{a}{b}]y_2)\\故x_1=y_2,y_1=x_2-[\frac{a}{b}]y_2 b=0,gcd(a,b)=a,x=1,y=0,ax1+by1=gcd(a,b),bx2+(a mod b)y2=gcd(b,a mod b)=gcd(a,b)ax1+by1=ax2+(a[ba]b)y2=ay2+b(x2[ba]y2)x1=y2,y1=x2[ba]y2

ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (!b) {
		x = 1, y = 0;
		return a;
	}
	else {
        ll g = exgcd(b, a % b, y, x);
        y -= a / b * x;
        return g;
	}
}
  • 逆 元 : x 是 a 的 逆 元 , a x ≡ 1 ( m o d   p ) 逆元:x是a的逆元,ax\equiv1(mod\ p) :xa,ax1(mod p)
#define ll long long
//拓展欧几里得求逆元 o(logn)
void exgcd(ll a, ll b, ll &x, ll &y)
{
	if(!b) x = 1, y = 0;
	else {
		exgcd(b, a % b, y, x);
		y -= a / b * x;
	}
}

ll inv(ll a, ll b)
{
	ll x, y;
	exgcd(a, b, x, y);
	return (x + b) % b;
}
//费马小定理求逆元 o(logn)
ll qpow(ll a, ll n, ll p)
{
	ll ans = 1;
	for(; n; n >>= 1, a = a * a % p)
		if(n & 1) ans = ans * a % p;
}

ll inv(ll a, ll b)
{
	return qpow(a, b - 2, b);
}

例 : 例: :Luogu P2613

素数

素 数 定 理 : lim ⁡ n → ∞ π ( n ) n / ln ⁡ n 素数定理:\displaystyle\lim_{n\to\infty}\frac{\pi(n)}{n/\ln n} :nlimn/lnnπ(n)

  • 素 数 筛 ( 粗 略 ) 素数筛(粗略) ()
#include   
#include 
#define ll long long
const int MAX_N = 1e5;//求MAX_N范围内的素数  
ll prime[MAX_N], cnt;  
bool isprime[MAX_N];

void sieve()  
{  
	cnt = 1;
	memset(isprime, true, sizeof(isprime));
	isprime[0] = isprime[1] = false;  
	for (ll i = 2;i <= MAX_N; ++i) {  
		if (isprime[i]) {
			prime[cnt++] = i;
			for (ll j = 2 * i; j <= MAX_N; j += i)
				isprime[j] = false;
		}
	}  
}

int main()  
{
	sieve();
	for (ll i = 1; i < cnt; ++i)
		printf("%15d", prime[i]);
	return 0;  
}
  • 线 性 筛 线性筛 线
const int MAX_N = 1e5;
int prime[MAX_N], cnt;
bool check[MAX_N];

void sieve(){
	for (int i = 2;i <= MAX_N; ++i){
		if(!check[i]) prime[++cnt] = i;
		for (int j = 1; j <= cnt && prime[j] * i <= MAX_N; ++j) {
			check[prime[j] * i] = true;
			if(i % prime[j] == 0) break; //重点
		}
	}
}
  • M i l l e r − R a b i n 算 法 : 素 数 测 试 Miller-Rabin算法:素数测试 MillerRabin:
#include 
#define ll long long

ll qmul(ll a, ll b, ll p)
{
	a %= p, b %= p;
	ll ans = 0;
	while(b) {
		if(b & 1) ans = (ans + a) % p;
		a = (a << 1) % p;
		b >>= 1;
	}
	return ans;
}

ll qpow(ll a, ll n, ll p)
{
	ll ans = 1;
	for(; n; a = qmul(a, a, p), n >>= 1)
		if(n & 1) ans = qmul(ans, a, p);
	return ans;
}

bool miller_rabin(ll n)
{
	if(n == 2) return true;
	if(n < 2 || !(n & 1)) return false;
	ll s = n - 1, t = 0, a, x, y;
	while(!(s & 1)) {
		s >>= 1;
		t++;
	}
	for(int i = 0; i < 10; ++i) {
		a = rand() % (n - 1) + 1;
		x = qpow(a, s, n);
		for(int j = 0; j < t; ++j) {
			y = qmul(x, x, n);
			if(y == 1 && x != 1 && x != n - 1) return false;
			x = y;
		}
		if(x != 1) return false;
	}
	return true;
}

数论计数问题

  • 约 数 : 对 n 的 标 准 分 解 式 n = p 1 a 1 ⋯ p n a n , n 的 正 约 数 个 数 为 ∏ i = 1 n ( a i + 1 ) 约数:对n的标准分解式n=p_1^{a_1}\cdots p_n^{a_n},n的正约数个数为\displaystyle\prod_{i=1}^n(a_i+1) :nn=p1a1pnan,ni=1n(ai+1)
  • 勒 让 德 定 理 : 在 正 数 n ! 的 素 因 子 标 准 分 解 式 中 , 素 数 p 的 最 高 指 数 为 ( n ! ) = ∑ m = 1 ∞ [ n p m ] 勒让德定理:在正数n!的素因子标准分解式中,素数p的最高指数为(n!)=\displaystyle\sum_{m=1}^\infty\left[\frac{n}{p^m}\right] n!p(n!)=m=1[pmn]
    根 据 勒 让 德 定 理 计 算 C n k   m o d   p 根据勒让德定理计算C_n^k\ mod\ p Cnk mod p

你可能感兴趣的:(知识点)