数学基础学习笔记

数学基础

1. 辗转相除法

1.1 结论

\[gcd(a,b) = gcd(b,a \bmod b) \]

1.2 证明

设两个正整数为 \(a,b\)

根据带余除法,\(a\) 可以表示为

\[a=q \times b + r \]

其中, \(q\) 为商, \(r\) 为余数(即 \(r=a \bmod b\) ),并有 \(0 \leq r <b\)


step 1

证明 \(a\)\(b\) 的任意公约数,也是 \(b\)\(r\) 的公约数

\(d\)\(a,b\) 的任意公因数,所以存在整数 \(m,n\) 使得

\[a = m \times d\\ b = n \times d \]

将其带入带余除法等式中可得

\[m \times d = q \times ( n \times d ) + r\\ \therefore r = m \times d - q \times ( n \times d )\\ \therefore r = d \times ( m - q \times 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 1step 2 可知,集合 \(\{ a,b 的公约数 \}\) 与集合 \(\{ b,r 的公约数 \}\) 是完全相等的

既然两个集合包含完全相同的元素,那么这两个集合中的最大元素也必然相同。

因此得出:

\[gcd(a,b) = gcd(b,r) = gcd(b,a \bmod b) \]

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;
		}
	}
}
posted @ 2026-08-21 21:04  Sail-With-Dawn  阅读(18)  评论(0)    收藏  举报