关于方程
我又来写博客了哈哈嗨
Chapter I 方程
方程的基本定义:含有未知数的等式
发展路线:
1
-
二元一次方程组 -> 多元一次方程组
-
一元二次方程 -> 一元高次方程
-
多项式方程 -> 超越方程
-
方程的形式越来越复杂
2
特定空间下求解
-
e.g.一元二次方程
-
实数域
R 内求解 -> 判别式 -
复数域
C 内求解 -> 必有2根x1,x2
不定方程:
在数论背景下,方程的解空间限制一般在整数集
这种方程称为丢番图方程。
这种方程大多数时候解不唯一,故又称不定方程。
Chapter II 二元一次不定方程
定义:
设
容易发现,方程左边
因此立即得到该方程有整数解的一个必要条件是
而充分条件需要使用
如果裴蜀定理成立,则必要条件
设有
为
Chapter III 扩展欧几里得算法 exgcd
相当于给了裴蜀定理一个构造性的证明
利用辗转相除法过程中得到的等式
不断地将较小的
设原有
带入
整理得递推式
代码在这里的Chapter III
用这份代码实现exgcd具有以下特点
-
求解过程中
|x| \le |b| , |y| \le |a| ,因此不会溢出,大喜 -
设
|a| \ge |b| ,则求出的x 满足 绝对值最小,即最小范数解
然后有了exgcd,就可以通过裴蜀定理求
-
exgcd求
ax+by=d 的一组解x_0,y_0 -
同时乘以
\dfrac{c}{d} 得到ax+by=c 的一组解x_1,y_1 -
得到全部解为
x = x_1 + \dfrac{b}{d} \times k , y = y_1 - \dfrac{a}{d} \times k
Chapter IV 一些方程
- 多元一次不定方程
先解决
所有的
原方程化为
继续这样,每次将两个式子合并为一个式子,最后得到
然后解出
代码:
#include<bits/stdc++.h>
using namespace std;
long long a[10];
long long n,b;
long long exgcd(long long a,long long b,long long &x,long long &y){
long long d=a;
if(b==0){
x=1;
y=0;
return a;
}else{
d=exgcd(b,a%b,y,x);
y-=a/b*x;
}
return d;
}
long long gcd(long long a,long long b){
return b==0?a:gcd(b,a%b);
}
stack<long long>s;
void getjie(long long a,long long b,long long c,long long &x,long long &y){
long long d=exgcd(a,b,x,y);
x=x*(c/d);
y=y*(c/d);
long long k;
if(x>0){
k=min((x/b),-(y/a));
x-=k*b,y+=k*a;
}
else{
k=min(-(x/b),(y/a));
x+=k*b,y-=k*a;
}
}
long long g[10];
long long t[10];
int main(){
scanf("%lld%lld",&n,&b);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
long long x,y;
long long last=0;
for(long long i=1;i<=n;i++){
if(i==1){
g[i]=a[i];
}else{
g[i]=gcd(g[i-1],a[i]);
}
}
long long xxx;
for(long long i=n;i>=2;i--){
if(i==n){
getjie(g[i-1],a[i],b,x,y);
s.push(y);
}else if(i==2){
xxx=x;
getjie(g[i-1],a[i],g[i]*xxx,x,y);
s.push(y);
s.push(x);
}else{
xxx=x;
getjie(g[i-1],a[i],g[i]*xxx,x,y);
s.push(y);
}
}
while(!s.empty()){
printf("%d ",s.top());
s.pop();
}
return 0;
}
n b
a1 a2 a3 … an
因此,该方程有整数解的充分必要条件为
- 多元不定方程组
高斯消元,暂不讨论。
- 线性同余方程
含有未知数的同余式,且同余式中未知数次数为1,例如
注意到同余式的其他等价写法,该同余方程与不定方程
因此可以用exgcd求解得
通常也习惯将解也写为同余式
- 利用exgcd求逆元
解同余方程
相比于费马小定理+矩阵快速幂的方法,优势是不要求
int getinv(int a,int m){
int x,y;
int d=exgcd(a,m,x,y);
if(d!=1)//不互质
return -1;//当场逝世
else
return (x%m+m)%m;//求解得到的x,mod一下
}
- 多元线性同余方程
解法和多元一次不定方程差不多。
- 线性同余方程组
求解
答案:
70为5和7的倍数且%3同余1 21为3和7的倍数且%5同余1 15为3和5的倍数且%7同余1
因此易验得
下面则是这个问题的结论:
Chapter IV 中国剩余定理
China RecudeChinese Remainder Theorem,简称CRT
设
记作
-
解
u_i\times M_i \equiv 1 \pmod m_i 得到关键参数e_i = u_i \times M_i -
计算出解为
x\ \equiv e_1 b_1 + e_2 b_2 + \dots + e_n b_n \pmod m
中国剩余定理的本质为
既可以正向应用解方程,也可以逆向应用分解问题。也就是说,中国剩余定理存在逆定理
中国剩余定理及其构造性的解法要求模数两两互质
不互质时,可以逆用中国剩余定理,将其拆分为多个模
e.g.
这个方法实在太麻烦了,所以我们让CRT学习gcd同志,让他稍微ex一下,变成
exCRT 拓展/扩展中国剩余定理
将同余式
是关于
解除
注意到
再次将解改为同余式
这样,我们做一次exgcd就可以把两个同余方程合并为一个
此外,拓展中国剩余定理分三种数据范围
-
[m_1,m_2,m_3 \dots m_n] \le 10^{18} -
保证有解,且解不超过
10^{18} -
不保证有解,但有解的时候解不超过
10^{18}
Chapter V 高次方程
各种方程。
高次同余方程
如果
也就是
上述方程有解的条件显然为
且有解时解的数量为
如果
而
高次不定方程
<= 这几把就是个没通用解法的东西 =>
不再深究。
Chapter VI 方程的应用
应用
勾股数
不定方程
当
所有本原解可以唯一表示为
二平方和问题
解不定方程
当
四平方和问题
解不定方程
这个东西看似结果应该很复杂,实际上很简洁:必定有正整数解
任意正整数可以分解为4个整数的平方之和
高斯整数和高斯质数
涉及虚数,不再深究
费马大定理
注意是大定理不是小定理
关于
各位可以去尝试感性证明一下,提示:勾股定理
至于理性证明,各位可以长逝。