数学基础学习笔记
数学基础
1. 辗转相除法
1.1 结论
1.2 证明
设两个正整数为 \(a,b\)
根据带余除法,\(a\) 可以表示为
其中, \(q\) 为商, \(r\) 为余数(即 \(r=a \bmod b\) ),并有 \(0 \leq r <b\)
step 1
证明 \(a\) 和 \(b\) 的任意公约数,也是 \(b\) 和 \(r\) 的公约数
设 \(d\) 为 \(a,b\) 的任意公因数,所以存在整数 \(m,n\) 使得
将其带入带余除法等式中可得
因为整数的封闭性,所以 \(m - q \times n\) 一定为整数,所以 \(d|r\)
step 2
证明 \(b\) 和 \(r\) 的任意公约数,也是 \(a\) 和 \(b\) 的公约数
设 \(d'\) 为 \(b,r\) 的任意公约数,根据等式 \(a=q \times b + r\) ,因为等号右侧的每一项都可以被 \(d'\) 整除,所以它们的和也一定可以被 \(d'\) 整除,所以 \(d'|a\)
结论:\(a\) 和 \(b\) 的所有公约数,也都是 \(b\) 和 \(r\) 的公约数
step 3
得出最大公约数相等的结论
综合 step 1 和 step 2 可知,集合 \(\{ a,b 的公约数 \}\) 与集合 \(\{ b,r 的公约数 \}\) 是完全相等的
既然两个集合包含完全相同的元素,那么这两个集合中的最大元素也必然相同。
因此得出:
2. 素数筛
2.1 埃氏筛
2.1.1 原理
素数的定义是:在大于 \(1\) 的自然数中,除了 \(1\) 和它本身以外不再有其他因数的数。根据算术基本定理,任何一个大于 \(1\) 的合数都可以唯一分解为若干素数的乘积
基于这一公理,埃氏筛的核心反向逻辑便成立了:如果我们从小到大枚举每一个数,只要它是素数,那么它的所有倍数就必定包含这个素因子,因此它们绝对是合数。 通过不断标记已知素数的倍数,剩下的就只能是没有更小素因子的数,即素数本身
埃氏筛互动演示
2.1.2 实现
埃氏筛参考部分代码
void era(int n){ vis[0]=vis[1]=1; for(int i=2;i*i<=n;i++){ if(!vis[i]){ for(int j=i*i;j<=n;j+=i) vis[j]=1; } } for(int i=2;i<=n;i++){ if(!vis[i]) pri[++cnt]=i; } }
2.2 欧拉筛
2.2.1 原理
在探讨了埃氏筛之后,我们指出了其存在的显著缺陷: 一个合数会被其多个不同的素因子重复标记 。为了将筛选算法的时间复杂度从 \(O(n \log \log n)\) 彻底降至绝对的线性复杂度 \(O(n)\) ,欧拉筛应运而生
欧拉筛的核心思想可以用一句话概括:“确保每一个合数,仅仅被它最小的素因子筛掉一次”
欧拉筛互动演示
2.2.2 实现
欧拉筛参考部分代码
void euler(int n){ vis[0]=vis[1]=1; for(int i=2;i<=n;i++){ if(!vis[i]) pri[++cnt]=i; for(int j=1;j<=cnt&&1LL*i*pri[j]<=n;j++){ vis[i*pri[j]]=1; if(i%pri[j]==0) break; } } }

浙公网安备 33010602011771号