[OI] 数学与推论证明 1
Contest
本博客更新很慢,有时候你会碰到施工现场(半成品草稿),是正常现象
前情提要
信息学数论也是数学内容,涉及繁杂的数学推理与证明过程,以下为了简明文章内容,说明如下.
-
"证明过程如下" 替换为 "
". -
"实现代码如下" 替换为 "
",并将代码折叠. -
上文提到的函数,定理等直接列出,必要处指出定义章节.
-
博客排布不等于撰写顺序,需要时会添加.
1.数论定义
1.1 积性函数与数论加性函数
1.1.1 概述
若函数
若函数
若函数
1.1.2 积性函数的性质
2.整除
2.1 概述
若存在整数
此外,对于一些特殊的数,满足:
2.2 整除推论
设
3.最大公约数与最小公倍数
3.1 最大公约数概述
定义
设
假设
若
3.2 裴蜀定理
不妨设
可得
令
由
我们知道,两个数的公约数一定不大于它们的最大公约数,而
3.3 欧几里得算法 (辗转相除法)
欧几里得算法主要用于求
不妨设
将
那么令
移项,
可得
int gcd(int a,int b){
if(b == 0) return a;
return gcd(b,a%b);
}
3.4 更相减损术
更相减损术是一种用加减法代替乘除法求最大公约数的过程,利用原理为
3.5 扩展欧几里得算法
扩展欧几里得算法可以求出裴蜀方程
GPT 证的,不保证正确性
欧几里得算法(Euclidean algorithm)是一种用来计算两个整数的最大公约数(Greatest Common Divisor, GCD)的算法。它不仅限于求解两个整数的最大公约数,还可以用于求解任意两个整数a和b的扩展欧几里得方程(Extended Euclidean Algorithm, ExGCD):
其中,
证明过程
-
基本步骤:
- 如果
,则 ,此时直接返回 。 - 如果
,那么可以将问题转化为求 ,然后递归调用这个函数。
- 如果
-
递归过程:
- 假设我们已经知道
,并且找到了一组整数 和 满足 。 - 现在考虑
,其中 。根据基本步骤,我们知道 ,并且有 。 - 由于
,我们可以将 和 的表达式代入到上述等式中,得到:
- 这样,我们得到了一个新的等式:
,其中 。
- 假设我们已经知道
-
最终结果:
- 经过递归调用,最终会得到一个简单的等式
,其中 。 - 通过不断调整
和 的值,可以逐步回溯到初始的 和 ,得到满足条件的 和 。
- 经过递归调用,最终会得到一个简单的等式
示例
以求解
- 第一步:
, 所以 - 第二步:
, 所以
使用扩展欧几里得算法,我们得到:
- 当
时, ,满足 。 - 当
时, ,满足 。
因此,对于任意两个整数
int exgcd(int a,int b,int &x,int &y){
if(b ==0){
x=1;
y=0;
return a;
}
int ret=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return ret;
}
3.6 求裴蜀等式最小正解
一般来说,我们求裴蜀等式都会解出一个解集组,这时候让我们对于其中一个解取一组特殊值. 因此我们需要根据一组求出来的一般解解出特殊解. 通常情况下我们采用如下等式.
下面我们来讨论解出最小正解的方式.
注意到我们只需要求出最大的
事实上,该式也可写作
3.7 扩展欧几里得算法解一般裴蜀等式
一般裴蜀等式是指
因此,对于
4.素数
4.1 概述
素数是除了
4.2 算术基本定理
4.3 质因数分解
假设该结论不成立,则说明存在
4.4 欧拉函数
4.4.1 概述
欧拉函数用于计算小于等于
其中
4.4.2 欧拉函数的性质
假设
4.4.3 关于欧拉函数的推论
因为
根据欧拉函数的定义,有
因为
4.4.4 欧拉筛
关于单独计算单值的欧拉函数,我们可以直接根据定义得到. 从小到大判断原数能否被当前数整除,若可以则将原数中全部相同质因子都去掉.
需要注意的是,与
int phi(int n){
int ans=n;
for(int i=2;i<=sqrt(n+0.5);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;
}
欧拉筛可以帮我们提前计算出区间内的全部欧拉函数.
我们使用线性筛做基础来进行.
代码中的解释:
- 第二行根据
- 循环前四行为判断素数,
数组标记合数, 数组按顺序记录全部的素数, 数组为欧拉函数. - 循环第三行利用
- 后面进行线性筛核心语句
- 循环第七行: 若一个合数
能被一个质数 整除,那么 中一定包含了能与 互质的全部整数. - 循环最后 : 利用
void euler(int n){
p[1]=1;
for(int i=2;i<=n;++i){
if(!b[i]){
prime[++num]=i;
p[i]=i-1;
}
for(int j=1;j<=num&&prime[j]*i<=n;++j){
b[i*prime[j]]=true;
if(i%prime[j]==0){
p[i*prime[j]]=p[i]*prime[j];
break;
}
else{
p[i*prime[j]]=p[i]*p[prime[j]];
}
}
}
}
当然,除了线性筛,我们还有一种
for(int i=1;i<=n;++i){
p[i]=i;
}
for(int i=2;i<=n;++i){
if(p[i]==i){
for(int j=i;j<=n;j+=i){
p[j]=p[j]*(i-1)/i;
}
}
}
4.5 约数个数函数
定义
对于一个大于
由约数的定义可知
由乘法原理得证.
5.同余
5.1 概述
若正整数
对于单纯的取模操作,我们也有:
5.2 费马小定理
5.3 线性同余方程
线性同余方程是形为
5.3.1 乘法逆元
若
因为除法取模不满足类分配律,因此出现了乘法逆元来进行
乘法逆元的定义推导
设
不妨设
联立上述式子,那么
一个逆元方程并不一定有解,
下面我们介绍求逆元的方法,因此以下默认
费马小定理可以求出当模数
正确性证明
根据费马小定理,有
int quickpow(int a,int n,int p){
int ans=1;
while(n){
if(n&1) ans=ans*a%p;
a=a*a%p;
n>>=1;
}
return ans;
}
int bace(int a,int p){
return quickpow(a,p-2,p);
}
扩展欧几里得算法可以求逆元.
正确性证明
若要
int exgcd(int a,int b,int &x,int &y){
if (b==0) {
x=1;
y=0;
return a;
}
// 注意传参顺序
int ret=exgcd(b, a%b, y, x);
y-=a/b*x;
return ret;
}
还有一种线性求逆元的方法,适合多次大量预处理时使用,利用的原理为
ny[1] = 1;
for (int i = 2; i < p; ++i) {
ny[i] = (long long)-(p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘记
}
// 因为 1<i<p,所以 p/i 一定小于 p
ny[1] = 1;
for (int i = 2; i < p; ++i) {
ny[i] = (long long)(p - p / i) * ny[p % i] % p; // 注意最后的模 p 不要忘记
}
5.3.2 线性同余方程
我们注意到
5.4 中国剩余定理
中国剩余定理算法可以用于求解一个线性同余方程组
中国剩余定理的主要内容体现流程如下:
-
计算
-
计算
-
计算
-
.
正确性证明
引用我们在步骤中使用到的变量.
因为全部的
因为互质,所以由乘法逆元的定义,我们可以推出
由
并且根据上述两两互质,又因为
根据构造,可得
符合原方程组的形式,即存在
6.排列与组合
6.1 概述
排列是指若干元素排成一列的不同情况 (考虑顺序). 从
排列数的计算公式为
也即
组合是将若干元素选入集合内的不同情况 (不考虑顺序). 从
组合数的计算公式为
也即
一般来说,我们有
6.1.1 二项式定理
二项式定理用于对
6.2 快速组合数求法
6.2.1 Lucas 定理
Lucas 定理的适用条件: 组合数很大,模数较小 (一般
不妨设
可以发现提出了一个因子
那么根据二项式定理,
因为已证得中间一项中一定有因子
也即
在这里我们进行构造,设
根据上面的结论,有
再根据二项式定理展开,那么
假若我们只观察
根据我们的定义
两边同时除以
那么根据定义,有
long long power(long long a,long long n){
long long ans=1;
while(n){
if(n&1)ans=ans*a%p;
a=a*a%p;
n>>=1;
}
return ans;
}
long long C(long long n,long long m){
if(n<m){
return 0;
}
if(m>n-m){
m=n-m; //C{n}{m}=C{n}{n-m};
}
long long a=1,b=1;
for(int i=0;i<m;++i){
a=(a*(n-i))%p;
b=(b*(i+1))%p;
}
return a*power(b,p-2)%p;
}
long long lucas(long long n,long long m){
if(!m) return 1;
return lucas(n/p,m/p)*C(n%p,m%p)%p;
}
long long fact[1000001];
long long power(long long a,long long n){
long long ans=1;
while(n){
if(n&1)ans=ans*a%p;
a=a*a%p;
n>>=1;
}
return ans;
}
void dofact(){
fact[0]=1;
for(int i=1;i<=1000000;++i){
fact[i]=fact[i-1]*i%p;
}
}
long long C(long long n,long long m){
if(!m){
return 1;
}
if(n<m){
return 0;
}
if(m>n-m){
m=n-m; //C{n}{m}=C{n}{n-m};
}
long long ans=fact[n]*power(fact[m],p-2)%p*power(fact[n-m],p-2)%p;
return ans;
}
long long lucas(long long n,long long m){
if(!m) return 1;
return lucas(n/p,m/p)*C(n%p,m%p)%p;
}
7.斐波那契数列
7.1 整除推论
设
因为
7.2 约数推论
设
则有
那么
即
若质数
若质数
则
则
所以我们引入
上述式子可以表示成
上述推论对全部
7.3 平方和推论
设
所以
同理,不妨设
则
7.4 通项公式
斐波那契的递推定义式为
考虑将递推式构造成等比数列形式,即
将
因为
解得
或
带回等比数列,归纳出通项公式:
或
因为这两个式子相对于原式均成立,因此我们尝试从两个式子中消掉
整理得
7.5 斐波那契间项积与中项平方的关系
正确性证明
为了简化我们的证明,以下令
将原式全部用通项公式代换,得
全部拆开
消项
变形
因为上文中设
7.6 斐波那契同比
当
正确性证明
由 7.5 可知,
同除
当
7.7 斐波那契黄金公比
由 7.6,设
此时将
消去
解得
8.导数与积分
8.1 导数
8.1.1 导数的意义
8.1.2 基本导数公式
推论
8.1.3 初等函数导数公式
8.1.4 反函数公式
8.1.5 复合函数导数公式
8.1.6 牛顿莱布尼茨公式
举点例子
对
套式子,
或者使用公式
对
8.2 积分
8.2.1 定义
表示
如
表示函数
积分符号用来表示 “某段区间内连续不断的加和” 这样的概念,不一定非得是面积. 只不过面积是长乘宽,当宽无穷小时(即
8.2.2 基本定理
令
实际上,它告诉我们的是 “将
根据基本定理,我们要求一个函数
比如我们需要求出
首先我们需要知道
8.2.3 算术定理
1
2
3
根据 1 有:
移项:
8.2.4 换元法
8.2.5 逆基本定理
9. 莫比乌斯函数与莫比乌斯反演
9.1 莫比乌斯函数
9.1.1 定义
设
直观地说,只要
9.1.2 性质
若
若
否则设
否则,设
显然,
使用二项式定理转化:
发现此时在定义域
9.2 莫比乌斯反演
9.2.1 不完全结论
设
对于
考虑到
根据
代入有:
即:
将原式等价转换,可以得到
其中
(可以发现,在这里仅仅是将判断条件与枚举条件互相变换了,而答案是不变的)
在区间
可以证明,当
9.2.2 完全结论
设两个函数
则有:
特别地:对于莫比乌斯反演还有如下等式:
设两个函数
则有:
10.容斥原理拓展
10.1 二项式反演
设
定义
可知对
同理有
因为
因此得出结论:
因为
因此
当
当
该式末项
事实上,二项式反演还有一个更常用的推导式:
根据二项式反演的性质,我们通常会构造一组
二项式反演还有其他形式:
10.2 Min-Max 容斥
对于满足全序关系并且其中元素满足可加减性的序列
一个常用的实际应用为 Min-Max 容斥的低维版本:
证明略.
10.3 错位排列
满足
10.3.1 公式
套用补集的公式,问题变成求
可以知道,
其中省略了
上述
那么选择
因此
10.3.2 递推式
待证明
10.4 Catalan 数
1 1 2 5 14 42 132
关于 Catalan 数的常见公式:
11.初等函数拓展
11.1 双曲三角函数
双曲正弦有两个渐进分别是
双曲余弦有两个渐进分别是
有几个比较好的等式:
证明第一个式子:
剩下的三个式子同理,暴力拆分合并即可
从这几个式子可以导出一些式子
可以通过
可以通过
可以通过
从定义还可以导出一些反函数
12.极限
从这一章开始就是高等数学内容了,我不会系统地按书照抄一遍,只挑一些好的讲讲
12.1 定义与求法
设
同样可以定义左极限和右极限
左极限:
右极限:
一般来说,当
. 杂项
.1 平方数模意义下的特殊性质
对于任意
设
则有
故
当
当
当
综上,
.2 调和级数的发散性
证明下述式子:
考虑对调和级数进行分组:
以此类推,将区间
.3 模意义概率
设有一分数
定理一
证明显然,因为
定理二
(定义
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!