数学整理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xyyxyyx/article/details/86736947

持续更新。

upd2019.7.20 BSGS和拓展BSGS

upd.2019.8.7 欧拉定理和费马小定理

upd.2019.10.9 欧几里得和拓展欧几里得 + 中国剩余定理及其拓展 + 卢卡斯定理及拓展卢卡斯定理


线性筛

欧几里得和拓展欧几里得

一、 欧几里得定理

叫欧几里得定理的定理还挺多的,这里只是指辗转相除而已。用于求两个数的最小公因数。

二、 拓展欧几里得定理

拓欧求解的是这样一个式子:

a x + b y = g c d ( a , b ) ax+by=gcd(a,b)

已知 a , b a,b ,求其中一对可行解 ( x , y ) (x,y)

考虑欧几里得求解最小公因数时的递归求解:

g c d ( x , y ) = g c d ( y , x    m o d    y ) gcd(x,y)=gcd(y,x\; mod \; y)

假如我们已经知道了

a y + b ( x    m o d    y ) = g c d ( y , x    m o d    y ) a'y+b'(x\; mod \; y)=gcd(y,x\; mod \; y)

那么把 x    m o d    y x\; mod \; y 写成 x x y y x-\lfloor \frac{x}{y}\rfloor y ,再稍微整理一下式子,就可以得到

b x + ( a x y b ) y = g c d ( x , y ) b'x+(a'-\lfloor \frac{x}{y}\rfloor b')y=gcd(x,y)

也就是说

{ a = b b = a x y b \begin{cases}a=b'\\ b=a'-\lfloor \frac{x}{y}\rfloor b' \end{cases}

那我们就可以递归求解了,边界和gcd一样,当 y = 0 y=0 时, 1 x + 0 y = x = g c d ( x , y ) 1*x+0*y=x=gcd(x,y)

贴一个代码方便理解

template<class T> T exgcd(T x, T y, T &a, T &b)
{
	if (y == 0){
		a = 1; b = 0;
		return x;
	}
	T _a, _b;
	T g = exgcd(y, x % y, _a, _b);
	a = _b;
	b = _a - x / y * _b;
	return g;
}

中国剩余定理及其扩展

一、中国剩余定理

问题:求解一个 x x 满足

{ x a 1 ( m o d    m 1 ) x a 2 ( m o d    m 2 ) x a n ( m o d    m n ) \begin{cases}x \equiv a_1 (mod \; m_1) \\ x \equiv a_2 (mod \; m_2) \\ \dots \\ x \equiv a_n (mod \; m_n)\end{cases}

保证所有的 m i m_i 互质。

大致思路:对于每一个同余式 x a 1 ( m o d    m 1 ) x \equiv a_1 (mod \; m_1) ,求出能被其他所有 m j ( m j m i ) m_j(m_j\not=m_i) 整除,并且满足 x a 1 ( m o d    m 1 ) x \equiv a_1 (mod \; m_1) x i x_i ,因为满足自己的式子,并且是其他模数的倍数,不会对其他式子产生影响,所以最后的答案就是 x i \sum x_i

具体来说:

M = m i M = \prod m_i

M i = M / m i M_i = M/m_i

M i t i a i ( m o d    m i ) M_it_i\equiv a_i(mod \; m_i)

所以

x i M i t i ( m o d    M ) x_i\equiv M_it_i(mod\; M)

x = x i x=\sum x_i

其中的 M i t i a i ( m o d    m i ) M_it_i\equiv a_i(mod \; m_i) 可以用拓展欧几里得来求,上面刚刚讲过。

最小的非负整数解显然也可以求,就是 x m i n = ( x    m o d    M + M )    m o d    M x_{min}=(x\; mod\; M+M)\; mod \; M

二、拓展中国剩余定理

(废话:网上很多人说拓展CRT和CRT没什么关系,将两者割裂开来看,我觉得很fake。实际上exCRT的方法也是基于CRT答案的构造方法的。)

求解的问题和上面一样,但是少了一个条件,就是 m i m_i 之间不一定保证互质。

{ x a 1 ( m o d    m 1 ) x a 2 ( m o d    m 2 ) x a n ( m o d    m n ) \begin{cases}x \equiv a_1 (mod \; m_1) \\ x \equiv a_2 (mod \; m_2) \\ \dots \\ x \equiv a_n (mod \; m_n)\end{cases}

经过上面的启发,我们仍旧用类似的方法来构造一个可行解。

假设现在我们已经得到了前 k 1 k-1 个方程的一个解,现在要把第 k k 个加进去求前 k k 个方程的解。

设前 k 1 k-1 个的解为 x k 1 x_{k-1} ,前 k 1 k-1 m i m_i 的最小公倍数是 M k 1 M_{k-1} ,那么新的解

x k = x k 1 + t M k 1 x_k=x_{k-1}+tM_{k-1}

x k a k ( m o d    m k ) x_k\equiv a_k (mod \; m_k)

联立得

t M k 1 a k x k 1 ( m o d    m k ) tM_{k-1}\equiv a_k-x_{k-1} (mod \; m_k)

下面就是拓欧的管辖范围了。把这个式子展开

t M k 1 + s m k = a k x k 1 tM_{k-1}+s\cdot m_k=a_k-x_{k-1}

假如 g c d ( M k 1 , m k ) a k x k 1 gcd(M_{k-1},m_k)\nmid a_k-x_{k-1} 就无解,不然就拓欧算出 t t 得到新解,再假如第 k + 1 k+1 个式子。

卢卡斯定理及拓展卢卡斯定理

(废话:卢卡斯定理的证明和拓展卢卡斯的还是有很大区别的,不想上面的CRT这样联系紧密)

一、卢卡斯定理

求解的问题:

C n m    m o d    p C_n^m\;mod\;p

其中 p p 是质数。

需要求证:

C n m C n p m p C n    m o d    p m    m o d    p ( m o d    p ) C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}*C_{n\;mod\;p}^{m\;mod\;p}(mod\;p)

然后就可以递归求解了。

证明如下:

  • 引理1:

p C p i ( 1 i < p ) p \mid C_{p}^{i}(1 \le i < p)

很好证明,将组合数写成阶乘的形式

C p i = p ! i ! ( p i ) ! = p i ( p 1 ) ! ( i 1 ) ! ( p i ) ! = p i C p 1 i 1 C_p^i=\frac{p!}{i!*(p-i)!}=\frac{p}{i}*\frac{(p-1)!}{(i-1)!*(p-i)!}=\frac{p}{i}C_{p-1}^{i-1}

得证。

由此,用二项式定理展开下面的式子可以推知:

( 1 + x ) p i = 0 p C p i x i = C p 0 1 + 0 x + 0 x 2 + . . . + C p p x p 1 + x p ( m o d    p ) (1+x)^p\equiv \sum_{i=0}^{p}C_p^i x_i=C_p^0*1+0*x+0*x^2+...+C_p^p*x^p\equiv 1+x^p(mod\;p)

接下来证明定理:

假设 n = a p + b , m = c p + d ( 0 b , d < p ) n=ap+b,m=cp+d(0\le b,d<p) ,则

C n m = C a p + b c p + d C_n^m=C_{ap+b}^{cp+d}

用上引理1的推论:

( 1 + x ) n = ( 1 + x ) p a ( 1 + x ) b ( 1 + x p ) a ( 1 + x ) b ( m o d    p ) (1+x)^n=(1+x)^{p*a}*(1+x)^b \equiv (1+x^p)^a*(1+x)^b(mod\;p)

二项式定理展开,观察左边的式子 x m x^m 的系数和右边式子 x c p + d x^{cp+d} 的系数,

C n m C a c C b d ( m o d    p ) C_n^m\equiv C_a^c*C_b^d(mod\;p)

C n m C n p m p C n    m o d    p m    m o d    p ( m o d    p ) C_n^m\equiv C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor}*C_{n\;mod\;p}^{m\;mod\;p}(mod\;p)

证毕。

二、拓展卢卡斯定理

需要解决的问题是:

C n m    m o d    p C_n^m\;mod\;p

其中 p p 并没有限制。

尝试简化问题。

  • Part One:组合数对质数的幂取模

容易想到,将 p p 质因数分解为 p = p i k i p=\prod p_i^{k_i}

求解 C n m    m o d    p i k i C_n^m\;mod\;p_i^{k_i} ,然后用中国剩余定理(上面有)合并,即

n ! m ! ( n m ) !    m o d    p i k i \frac{n!}{m!(n-m)!}\;mod\;p_i^{k_i}

  • Part Two:阶乘除去质因子之后模质数幂

因为并不能直接求逆元,所以将上下阶乘除 p i p_i 一直除到没有 p i p_i 这个因子为止,式子长下面这个样子

n ! p x m ! p y ( n m ) ! p z p i x y z    m o d    p i k i \frac{\frac{n!}{p^x}}{\frac{m!}{p^y}*\frac{(n-m)!}{p^z}}*p_i^{x-y-z}\; mod\;p_i^{k_i}

假如能够求 n ! p x    m o d    p k \frac{n!}{p^x}\; mod\;p^{k} ,那么问题就解决了。

事实上这个东西可以递归去求,方法如下:

1 1 n n 的数分为 p p 的倍数和不是 p p 的倍数,不是 p p 的倍数的数 O ( p k ) O(p^k) 暴力计算(假如题目保证一个 p k p^k 不会太大的话也可以预处理), p p 的倍数递归。

n ! = ( 1 2 . . . ( p 1 ) ( p + 1 ) . . . ( p k 1 ) ) n p k ( 1 2 ( p 1 ) ( p + 1 ) . . . ( n    m o d    p k ) ) p n p ! \begin{aligned} &n! \\=&(1*2*...*(p-1)*(p+1)*...*(p^k-1))^{\lfloor\frac{n}{p^k}\rfloor} \\&*(1*2*(p-1)*(p+1)*...*(n\;mod\;p^k)) \\&*p*\lfloor\frac{n}{p}\rfloor! \end{aligned}

  • Part Three:中国剩余定理合并

如上面所说,得到这样的方程组

{ C n m a 1 ( m o d    p 1 k 1 ) C n m a 2 ( m o d    p 2 k 2 ) C n m a n ( m o d    p n k n ) \begin{cases}C_n^m \equiv a_1 (mod \; p_1^{k_1}) \\ C_n^m \equiv a_2 (mod \; p_2^{k_2}) \\ \dots \\ C_n^m \equiv a_n (mod \;p_n^{k_n})\end{cases}

贴上中国剩余定理板子,完成啦!!!

总复杂度大概 O ( P log P ) O(P\log P)

一个是CRT的复杂度 O ( n log p ) O(n\log p) (n是质因子个数,p是最大的质因子大小)

还有一个是递归求阶乘,递归 log p k n \log_{p^k} n 层,每层都 O ( p k ) O(p^k) 爆扫,复杂度与 O ( P log P ) O(P\log P) 同阶。

假如预处理而不是 O ( p k ) O(p^k) 爆扫,复杂度可以降到 O ( p k + T log p k n ) O(\sum p^k+T\log_{p^k} n) (其中T是数据组数)。

流程比较长,但是层次分明。虽然只是一个模板,但也可以说是数论各种定理的综合应用。贴个代码方便理解:

namespace exLucas
{
	typedef long long LL;
	LL M, ans;
	LL fpow(LL x, LL y, LL p){
		LL ret = 1;
		while (y){
			if (y & 1) ret = ret * x % p;
			x = x * x % p;
			y >>= 1;
		}
		return ret;
	}
	LL exgcd(LL x, LL y, LL &a, LL &b){
		if (y == 0){
			a = 1; b = 0;
			return x;
		}
		LL _a, _b;
		LL g = exgcd(y, x % y, _a, _b);
		a = _b;
		b = _a - x / y * _b;
		return g;
	}
	LL inv(LL x, LL p){
		LL tmp1, tmp2;
		exgcd(x, p, tmp1, tmp2);
		return (tmp1 % p + p) % p;
	}
	LL fac(LL n, LL p, LL pk){
		if (n == 0) return 1;
		LL ret = 1;
		for (LL i = 2; i < pk; ++ i) if (i%p) (ret *= i) %= pk;
		ret = fpow(ret, n/pk, pk);
		for (LL i = 2, sz = n%pk; i <= sz; ++ i) if (i%p) (ret *= i) %= pk;
		return ret * fac(n / p, p, pk) % pk;
	}
	LL C(LL n, LL m, LL p, LL pk){
		LL cnt = 0;
		for (LL i = n; i; i /= p) cnt += i / p;
		for (LL i = m; i; i /= p) cnt -= i / p;
		for (LL i = n-m; i; i /= p) cnt -= i / p;
		return fac(n, p, pk) * inv(fac(m, p, pk), pk) % pk * inv(fac(n-m, p, pk), pk) % pk * fpow(p, cnt, pk) % pk;
	}
	LL CRT(LL a, LL b){return a * inv(M / b, b) % M * (M / b) % M;}
	LL exLucas(LL n, LL m, LL p){
		M = p; ans = 0;
		for (LL i = 2, sz = sqrt(p) + 1; i <= sz; ++ i)
			if (p % i == 0){
				LL pk = 1;
				while (p % i == 0)
					pk *= i, p /= i;
				(ans += CRT(C(n, m, i, pk), pk)) %= M;
			}
		if (p > 1) (ans += CRT(C(n, m, p, p), p)) %= M;
		return ans;
	}
}

欧拉函数

费马小定理

内容:p是质数且a不是p的倍数时,

a p 1 1 ( m o d    p ) a^{p-1}\equiv 1(mod\; p)

是欧拉定理的一个特殊情况,证明略。

欧拉定理与拓展

一、

欧拉定理内容:在a与m互质的情况下,

a φ ( m ) 1 ( m o d    m ) a^{\varphi(m)}\equiv 1(mod\; m)

证明如下:

[ 1 , m ] [1,m] 中与m互质的数为 x 1 , x 2 , . . . , x φ ( m ) x_1, x_2, ... , x_{\varphi(m)}

p 1 = a x 1 , p 2 = a x 2 , . . . , p φ ( m ) = a x φ ( m ) p_1=ax_1,p_2=ax_2,..., p_{\varphi(m)}=ax_{\varphi(m)}

引理1: i , j [ 1 , φ ( m ) ] , i = , p i ̸ p j ( m o d    m ) \forall i,j\in [1,\varphi(m)],i=\not j,p_i\equiv\not p_j(mod\; m)

使用反证法,假设存在 p i p j ( m o d    m ) p_i\equiv p_j(mod\; m) ,那么 a ( x i x j ) 0 ( m o d    m ) a(x_i-x_j)\equiv 0(mod\; m) ,即 a ( x i x j ) = k m a(x_i-x_j)=km ,又因为 ( x i x j ) = (x_i-x_j)=\not 0 a a m m 互质,所以等式恒不成立。证毕。

引理2: i [ 1 , φ ( m ) ] , g c d ( p i , m ) = 1 \forall i\in [1,\varphi(m)],gcd(p_i,m)=1

使用显然法,因为 p i = a x i p_i=ax_i g c d ( a , m ) = 1 , g c d ( x i , m ) = 1 gcd(a,m)=1,gcd(x_i,m)=1 ,所以 g c d ( p i , m ) = 1 gcd(p_i,m)=1

由此可知 { x 1 , . . . x φ ( m ) } = { p 1    m o d    m , . . . , p φ ( m )    m o d    m } \{x_1,...x_{\varphi(m)}\}=\{p_1\;mod\;m,...,p_{\varphi(m)}\;mod\;m\} 因为两个集合中的元素都与 m m 互质,且在 [ 1 , m ] [1,m] 中不存在集合之外的数与m互质,所以一个 p i    m o d    m p_i\;mod\;m 一定能找到一个 x j x_j 与他相等。

所以 x i p i ( m o d    m ) \prod x_i\equiv \prod p_i(mod\;m) 两边同除 x i \prod x_i ,得到 a φ ( m ) 1 ( m o d    m ) a^{\varphi(m)}\equiv1(mod\;m)

证毕。

二、

拓展欧拉定理多讨论了 a a m m 不互质的情况,

a c = { a c    m o d    φ ( m ) , g c d ( a , m ) = 1 a c , g c d ( a , m ) = , c < φ ( m ) a c    m o d    φ ( m ) + φ ( m ) , g c d ( a , m ) = , c φ ( m ) a^c=\left\{ \begin{aligned} &a^{c\;mod\;\varphi(m)}, &gcd(a,m)=1 \\ &a^c,&gcd(a,m)=\not 1,c < \varphi(m) \\ &a^{c\;mod\;\varphi(m)+\varphi(m)},&gcd(a, m)=\not1,c \ge \varphi(m) \end{aligned} \right.

下面证明 a c = a c    m o d    φ ( m ) + φ ( m ) , g c d ( a , m ) = , c φ ( m ) a^c=a^{c\;mod\;\varphi(m)+\varphi(m)},gcd(a, m)=\not1,c \ge \varphi(m)

引理1:

p P , x φ ( p x ) \forall p\in \mathbb{P},x\le \varphi(p^x)

首先, φ ( p x ) = ( p 1 ) p x 1 \varphi(p^x)=(p-1)p^{x-1}

p = 2 p=2 时,使用数学归纳法, x = 1 x=1 时等式左右都为1,在 x > 1 x>1 时,x每增加1,不等式左边加1,右边乘2(加上右边的数),因为满足右边的数大于等于1,所以不等式仍旧成立。

p > 2 p>2 时, x 2 x 1 ( p 1 ) p x 1 x\le 2^{x-1}\le (p-1)p^{x-1} ,成立。

证毕。

引理2:

对于任意质数p满足 p c = p c + φ ( m ) , p m , c φ ( m ) p^c=p^{c+\varphi(m)},p|m,c \ge \varphi(m)

m = s p k , g c d ( s , p ) = 1 m=s\cdot p^k,gcd(s,p)=1 ,首先由欧拉定理得 p φ ( s ) 1 ( m o d    s ) p^{\varphi(s)}\equiv1(mod\;s) 由欧拉函数定义式可知 φ ( s ) φ ( m ) \varphi(s)|\varphi(m) ,所以 p φ ( m ) 1 ( m o d    s ) p^{\varphi(m)}\equiv1(mod\;s)

由同余的性质,两边同乘 p k p^k p φ ( m ) + k p k ( m o d    m ) p^{\varphi(m)+k}\equiv p^k(mod\;m)

因为 c φ ( m ) k c\ge \varphi(m) \ge k 所以 p c = p c k p k = p c + φ ( m ) , p m , c φ ( m ) p^c=p^{c-k}p^k=p^{c+\varphi(m)},p|m,c \ge \varphi(m)

由引理2可知, p c p c    m o d    φ ( m ) + φ ( m ) , p m , c φ ( m ) p^c\equiv p^{c\;mod\;\varphi(m)+\varphi(m)},p|m,c \ge \varphi(m)

随后利用同余的性质和唯一分解定理,可以证得 a c = a c    m o d    φ ( m ) + φ ( m ) , g c d ( a , m ) = , c φ ( m ) a^c=a^{c\;mod\;\varphi(m)+\varphi(m)},gcd(a, m)=\not1,c \ge \varphi(m)

乘法逆元的三种求法

卡特兰数

斯特林数

原根和指标

BSGS和拓展BSGS

用于求形如 a x b ( m o d    p ) a^x\equiv b(mod \; p) 的高次同余方程

思想很简单,利用分块,把 x x 看成 x = p i j x=\sqrt{p}*i-j ,然后式子变成这个样子 a p i b a j ( m o d    p ) a^{\sqrt{p}*i}\equiv b*a^j(mod\; p)

但是假如 a a p p 不互质的话,由下面那个式子并不能推出上面那个式子,举个简单的例子: 2 6 ( m o d    4 ) 1 ( m o d    4 ) 2\equiv 6(mod \; 4) \\ 1\equiv\not 3(mod \; 4)

所以我们需要除掉 a a p p 的公约数来使 a a p p 互质,这就是ex_BSGS, a k g i a x b g i ( m o d    b g i ) \frac{a^k}{\prod g_i}a^x\equiv \frac{b}{\prod g_i}(mod \; \frac{b}{\prod g_i})

好像也就只能求这么一个式子,简直太没用了

某次课的笔记

g c d ( a , b ) = ( a , b ) gcd(a, b) = (a, b)

l c m ( a , b ) = [ a , b ] lcm(a, b) = [a, b]

b a , a % b a / 2 b \le a , a \% b \le a / 2

唯一分解定理

同余性质:

弱化 a b ( m o d    m ) , n m , a b ( m o d    n ) a \equiv b(mod \; m), n|m, \therefore a \equiv b(mod \; n)

除法 a c b c ( m o d    c ) , a b ( m o d    c / g c d ( c , m ) ) ac \equiv bc (mod \; c), a \equiv b (mod \; c/gcd(c, m))

中国剩余定理

{ x a 1 ( m o d    m 1 ) x a 2 ( m o d    m 2 ) x a n ( m o d    m n ) \begin{cases}x \equiv a_1 (mod \; m_1) \\ x \equiv a_2 (mod \; m_2) \\ \dots \\ x \equiv a_n (mod \; m_n)\end{cases}

M = m i M i = M / m i t i M i 1 ( m o d    m i ) M = \prod m_i \\ M_i = M/m_i \\ t_i\equiv M_i^{-1}(mod \; m_i)
$$

拓展中国剩余定理

费马小定理

欧拉函数 ϕ ( n ) = n ( p i 1 ) / p i \phi(n)=n*\prod(p_i-1)/p_i

积性函数 ϕ ( n m ) = ϕ ( n ) ϕ ( m ) , ( g c d ( n , m ) = 1 ) \phi(nm)=\phi(n)\phi(m),(gcd(n,m)=1)

线性筛算 ϕ \phi 函数

欧拉定理 g c d ( a , m ) = 1 , a ϕ ( m ) 1 ( m o d    m ) gcd(a, m) =1,a^{\phi(m)}\equiv 1(mod \; m)

拓展欧几里得

线性方程组一般解法
{ x a 1 ( m o d    m 1 ) x a 2 ( m o d    m 2 ) \begin{cases}x \equiv a_1 (mod \; m_1) \\ x \equiv a_2 (mod \; m_2) \end{cases}

防爆LL的快速幂式乘法

n 1 + n 2 + + n n = O ( n l n ( n ) ) \frac{n}{1}+\frac{n}{2}+\dots+\frac{n}{n}=O(n ln(n))

[NOI2015]寿司晚宴

dirichlet卷积

( f g ) ( n ) = d n f ( d ) g ( n d ) (f*g)(n)=\sum_{d|n} f(d)g(\frac{n}{d})

常见数论函数

猜你喜欢

转载自blog.csdn.net/xyyxyyx/article/details/86736947