[基础数论]不定方程笔记
Posted wonder-land
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[基础数论]不定方程笔记相关的知识,希望对你有一定的参考价值。
前言
在学习本节内容前,最好先学习同余的基本性质以加深理解。
一堆定理
- 定理1:
若
则
证明:
令 \\(a=ce,b=cf\\) ,
代入 \\(ma+nb\\) 再提公因式即可。
- 定理2:
若
则
证明:
由定理1证明二者公因子相同即可。
- 定理3:
两个不全为零的整数 \\(a,b\\) 的最大公因子是 \\(a,b\\) 线性组合的最小正整数.
证明:令 \\(d\\) 是 \\(a,b\\) 的线性组合中最小的正整数, \\(d = ma + nb\\) , 其中 \\(m,n\\) 是整数,我们将证明 \\(d \\mid a,d \\mid b\\) 。
由带余除法,得到 \\(a=dq+r, 0≤r<d\\) 。
由 \\(a=dq+r\\) 和 \\(d=ma+nb\\) ,得到 \\(r=a-dq=a-q(ma+nb)=(1-qm)a-qnb\\) .
这就证明了整数 \\(r\\) 是 \\(a,b\\) 的线性组合。因为 \\(0 ≤ r < d\\) ,而 \\(d\\) 是 \\(a,b\\) 的线性组合中最小的正整数,
于是我们得到 \\(r=0\\) (如果 \\(r\\) 不是等于 \\(0\\) ,那意味着 \\(r\\) 才是所有线性组合中最小的正整数,这与 \\(d\\) 是所有线性组合中最小的正整数矛盾),因此 \\(d \\mid a\\) ,同理可得, \\(d \\mid b\\) .
我们证明了 \\(a,b\\) 的线性组合中最小的正整数 \\(d\\) 是 \\(a,b\\) 的公因子,剩下要证的是它是 \\(a,b\\) 的最大公因子,为此只需证明 \\(a,b\\) 所有的公因子都能整除 \\(d\\) 。
由于 \\(d = ma + nb\\) ,因此如果 \\(c \\mid a\\) 且 \\(c \\mid b\\) ,那么由定理2有 \\(c \\mid d\\) ,因此 \\(d > c\\) 。
得证。
- 定理4:
若 \\(a,b\\) 是正整数,
则所有 \\(a,b\\) 的线性组合构成的集合与所有 \\((a,b)\\) 的倍数构成的集合相同。
证明:由定理1得 \\(a,b\\) 的线性组合都是 \\((a,b)\\) 倍数。
由定理3得 \\((a,b)\\) 属于线性组合,其倍数显然也属于线性组合。
得证。
- 定理5:
若
且有
则
证明:令 \\(ac=km+bc \\to (a-b)c=km\\)
两边同除 \\(d\\) 得到:\\((a-b)(c/d)=k(m/d)\\)
因为 \\((c/d)\\) 与 \\((m/d)\\) 互质,
所以有 \\((m/d) \\mid (a-b)\\)
得到结论:\\(a \\equiv b \\pmod m/d\\)
得证。
- 推论:
若
且有
则有
- 定理6:
若 \\(r_1,r_2,…,r_m\\) 是一个模 \\(m\\) 的完全剩余系,且有正整数 \\(a\\) 满足 \\((a,m)=1\\)
则对任何整数 \\(b\\) 有: \\(ar_1+b,ar_2+b,…,ar_m+b\\) 也是一个模 \\(m\\) 的完全剩余系。
证明:若有 \\(ar_i+b\\) 与 \\(ar_j+b\\) 同余,则有 \\(ar_i\\) 与 \\(ar_j\\) 同余。
由定理5推论可得:此时有 \\(r_i\\) 与 \\(r_j\\) 同余,矛盾!
故定理成立。
朴素欧几里得定理
若
则
证明:
令 \\(a=bq+r\\) ,
得 \\(r=a-bq\\).
由定理2得,
\\(gcd(a,b)=gcd(a-bq,b)=gcd(r,b)=gcd(a\\%b,b)=gcd(b,a\\%b)\\)
扩展欧几里得算法
-
扩展欧几里得算法就是在朴素欧几里得上求一组未知数 \\((x,y)\\) 的解。
-
公式推导
对于
不妨设 \\(a>b\\) ,
$(1) b=0 $ 则 \\(x=1,y=0\\).
$(2) a>b>0 $
设 \\(ax_1+by_1=gcd(a,b)\\),\\(bx_2+(a \\mod b) y_2\\)
由朴素欧几里得得:\\(gcd(a,b)=gcd(b,a \\mod b)\\)
所以 \\(ax_1 + by_1 = bx_2 + (a \\mod b)y_2\\)
即 \\(ax_1 + by_1 = bx_2 + (a - \\lfloor \\fracab \\rfloor *b)y_2\\)
化简得:\\(ax_1 + by_1 = bx_2 + ay_2 - \\lfloor \\fracab \\rfloor *b *y_2\\)
由贝祖等式得 \\(x_1 = y_2 , y_1 = x_2 - \\lfloor \\fracab \\rfloor *y_2\\)
裴蜀定理
若
则存在
证明:由定理3易证。
- 推论:
整数 \\(a\\) 与 \\(b\\) 互质,
当且仅当存在整数 \\(m,n\\) 使得 \\(ma+nb=1\\).
证明:若 \\(ma+nb=1\\) ,由定理3得 \\((a,b)=1\\) ,易证。
二元一次不定方程
对于一些方程形如
如果 \\(x = x_0, y = y_0\\) 是方程的一个特解,
那么所有的解可以表示为:
\\(x = x_0 + (b/d)n, y = y_0 - (a/d)n\\) ,其中 \\(n\\) 是整数。
code:
//二元一次不定方程
#include<bits/stdc++.h>
#define int long long
using namespace std;
int G,a,b,c,d,x,y;
void exgcd(int a,int b,int& d,int& x,int& y)
if(!b)
d=a,x=1,y=0;
return ;
exgcd(b,a%b,d,x,y);
int t=x;
x=y,y=t-a/b*y;
return ;
signed main()
scanf("%lld",&G);
while(G--)
scanf("%lld%lld%lld",&a,&b,&c);
exgcd(a,b,d,x,y);
if(c%d!=0)
printf("-1\\n");
continue;
x*=c/d,y*=c/d;
int mx=b/d,my=a/d,minx=-1,maxx=-1,miny=-1,maxy=-1,t;
if(x>0)
minx=x-(x/mx)*mx;
int ty=y+(x/mx)*my;
if(!minx) minx+=mx,ty-=my;
if(ty>0) maxx=minx+ty/my*mx-mx*(ty%my==0?1:0),t=ty/my+1-(ty%my==0?1:0);
else
minx=x+(-x)/mx*mx+mx;
int ty=y-((-x)/mx+1)*my;
if(ty>0) maxx=minx+ty/my*mx-mx*(ty%my==0?1:0),t=ty/my+1-(ty%my==0?1:0);
if(y>0)
miny=y-(y/my)*my;
int tx=x+(y/my)*mx;
if(!miny) miny+=my,tx-=mx;
if(tx>0) maxy=miny+tx/mx*my-my*(tx%mx==0?1:0);
else
miny=y+(-y)/my*my+my;
int tx=x-((-y)/my+1)*mx;
if(tx>0) maxy=miny+tx/mx*my-my*(tx%mx==0?1:0);
if(maxx!=-1) printf("%lld %lld %lld %lld %lld\\n",t,minx,miny,maxx,maxy);
else printf("%lld %lld\\n",minx,miny);
return 0;
多元一次不定方程
对于方程形如
由前文所述,我们知道
所以原式就可以换成:
重复以上操作,就可以得到:
再一层层解回去即可。
code:(仅供参考)
//多元一次不定方程
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5+5;
long long n,c,a[maxn],ans[maxn];
void exgcd(int a,int b,int& d,int& x,int& y)
if(!b)
d=a,x=1,y=0;
return ;
exgcd(b,a%b,d,x,y);
int temp=x;
x=y,y=temp-a/b*y;
return ;
void f(long long t,int now,int& nc)
if(now<n) f(__gcd(t,a[now]),now+1,nc);
int x,y,d;
exgcd(t,a[now],d,x,y);
if(nc%d!=0)
printf("-1");
exit(0);
x*=nc/d,y*=nc/d;
ans[now]=y;
if(now==2) ans[now-1]=x;
nc=t*x;
return ;
signed main()
scanf("%lld%lld",&n,&c);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
f(a[1],2,c);
for(int i=1;i<=n;i++)
printf("%lld ",ans[i]);
return 0;
数论笔记-同余
同余
带余数除法
带余数除法的定义与基本性质
定义 对于整数 \\(a,b\\) ,一定存在整数 \\(q,r\\) 满足 \\(a = bq + r\\) ,其中 \\(r\\) 与 \\(a\\) 同号且 \\(|r| \\in [0,b)\\) ,称 \\(q\\) 为 \\(a\\) 除以 \\(b\\) 的商, \\(r\\) 为 \\(a\\) 除以 \\(b\\) 的余数。
通常我们定义 \\(b\\) 是正整数,但为了和c++语法统一,因此修改了定义。
模运算的定义 \\(a \\bmod b\\) 表示 \\(a\\) 除以 \\(b\\) 的余数 \\(r\\) ,符号和 \\(a\\) 一致,运算优先级同乘除。
模 \\(m\\) 加法 \\((a+b) \\bmod m\\) 。
模 \\(m\\) 减法 \\((a-b) \\bmod m\\) 。
模 \\(m\\) 乘法 \\(ab \\bmod m\\) 。
性质1 \\(a \\bmod b = a - b\\times \\lfloor \\fracab\\rfloor\\) 。
性质2
性质3 \\(a \\bmod n = a\\bmod m = x\\) 且 \\(\\gcd(n,m) = 1\\) ,则 \\(a \\bmod nm = x\\)
模运算加速算法
龟速乘
用于可能爆 long long
数字的乘法取余。
不过一般可以用 __int128
替代了。
时间复杂度 \\(O(\\log b)\\)
空间复杂度 \\(O(1)\\)
const int P = 1e9 + 7;
ll qmul(ll a, ll b)
ll ans = 0;
while (b)
if (b & 1) ans = (ans + a) % P;
b >>= 1;
a = (a << 1) % P;
return ans;
快速幂
幂取余,\\(a\\) 越大速度越慢。
时间复杂度 \\(O(\\log k)\\)
空间复杂度 \\(O(1)\\)
const int P = 1e9 + 7;
ll qpow(ll a, ll k)
ll ans = 1;
while (k)
if (k & 1) ans = ans * a % P;
k >>= 1;
a = a * a % P;
return ans;
矩阵快速幂
矩阵幂取余。
时间复杂度 \\(O(n^3 \\log k)\\)
空间复杂度 \\(O(1)\\)
const int P = 1e9 + 7;
struct Matrix
int n, m;//不能const,快速幂要复制
vector<vector<ll>> mat;
explicit Matrix(int _n):n(_n), m(_n), mat(_n + 1, vector<ll>(_n + 1))
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
mat[i][j] = i == j;
//初始化n阶单位矩阵,explicit防止误用类型转换
Matrix(int _n, int _m):n(_n), m(_m), mat(_n + 1, vector<ll>(_m + 1)) //初始化nxm零矩阵
friend Matrix operator*(const Matrix &A, const Matrix &B)
Matrix ans(A.n, B.m);
if (A.m != B.n) return ans;
for (int i = 1;i <= A.n;i++)
for (int j = 1;j <= B.m;j++)
for (int k = 1;k <= A.m;k++) //a.m == b.n
ans.mat[i][j] = (ans.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % P;
return ans;
//矩阵乘法取余
friend Matrix operator^(Matrix A, ll k)
Matrix ans(A.n);//A必须是方阵
while (k)
if (k & 1) ans = ans * A;
k >>= 1;
A = A * A;
return ans;
//快速幂取余
void output() const
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cout << mat[i][j] << \' \';
cout << \'\\n\';
cout << \'\\n\';
//输出检测
;
同余的定义与基本性质
定义 若整数 \\(a,b\\) 模 \\(m\\) 相等,则称 \\(a,b\\) 模 \\(m\\) 同余,记作 \\(a \\equiv b \\pmod m\\) 。
以下讨论均为整数。
性质1(自反性) \\(a \\equiv a \\pmod m\\) 。
性质2(对称性) \\(a\\equiv b \\pmod m \\iff b \\equiv a \\pmod m\\) 。
性质3(传递性) \\(a \\equiv b \\pmod m,b \\equiv c \\pmod m \\Rightarrow a \\equiv c \\pmod m\\) 。
性质4(同加性)
性质5(同乘性)
性质6(同幂性) \\(a \\equiv b \\pmod m \\Rightarrow a^k \\equiv b^k \\pmod m\\) ,其中 \\(k \\geq 0\\)。
性质7(特殊同除性) \\(a \\equiv b \\pmod m \\Rightarrow \\dfracad \\equiv \\dfracbd \\pmod \\dfracm\\gcd(m,d)\\) ,其中 \\(d\\) 满足 \\(d \\mid a,d \\mid b\\) 。
性质8 \\(a \\equiv b \\pmod m,m\' \\mid m \\Rightarrow a \\equiv b \\pmod m\'\\) 。
性质9 \\(a \\equiv b \\pmod m_i(i = 1,2,\\cdots,n) \\iff a \\equiv b \\pmod M ,M = \\textlcm(m_1,m_2,\\cdots,m_n)\\) 。
性质10 \\(a \\equiv b \\pmod m \\Rightarrow \\gcd(a,m) = \\gcd(b,m)\\) 。
同余类与剩余系的定义与基本性质
同余类的定义 对于 \\(a \\in [0,m-1]\\) ,集合 \\(\\a + km\\,k \\in \\Z\\) 的所有数模 \\(m\\) 同余 \\(a\\) ,称这个集合为模 \\(m\\) 的一个同余类 \\(\\overline a\\) 。
完全剩余系的定义 模 \\(m\\) 的同余类有 \\(m\\) 个,分别为 \\(\\overline 0,\\overline 1,\\cdots ,\\overline m-1\\) ,它们构成了 \\(m\\) 的完全剩余系。
既约剩余系的定义 模 \\(m\\) 的同余类有 \\(\\varphi(m)\\) 个的代表元与 \\(m\\) 互质,它们构成了 \\(m\\) 的既约剩余系(简化剩余系)。
\\(\\varphi(m)\\) 为欧拉函数,下一节会讲到。
性质1 设 \\(S\\) 是模 \\(m\\) 的一个完全剩余系,若 \\(\\gcd(k,m) = 1\\) ,则 \\(S\' = \\x\' \\mid x\' = kx+b,x\\in S \\\\) 也是模 \\(m\\) 的一个完全剩余系。
性质2 设模 \\(m_1\\) 的完全剩余系为 \\(S_1\\) ,模 \\(m_2\\) 的完全剩余系为 \\(S_2\\) ,且 \\(\\gcd(m_1,m_2) = 1\\) ,则模 \\(m = m_1m_2\\) 的完全剩余系为 \\(S = \\x\\mid x = m_2x_1 + m_1x_2,x_1 \\in S_1,x_2 \\in S_2\\\\) 。
性质3 设 \\(S\\) 是模 \\(m\\) 的一个既约剩余系,若 \\(\\gcd(k,m) = 1\\) ,则 \\(S\' = \\x\' \\mid x\' = kx,x\\in S \\\\) 也是模 \\(m\\) 的一个既约剩余系。
性质4 设模 \\(m_1\\) 的既约剩余系为 \\(S_1\\) ,模 \\(m_2\\) 的既约剩余系为 \\(S_2\\) ,且 \\(\\gcd(m_1,m_2) = 1\\) ,则模 \\(m = m_1m_2\\) 的既约剩余系为 \\(S = \\x\\mid x = m_2x_1 + m_1x_2,x_1 \\in S_1,x_2 \\in S_2\\\\) 。
推论1(性质4的推论) \\(\\gcd(m_1,m_2) = 1 \\Rightarrow \\varphi(m_1m_2) = \\varphi(m_1)\\varphi(m_2)\\) ,即欧拉函数是积性函数。
性质1的证明:
假设存在 \\(kx_i + b \\equiv kx_j + b \\pmod m\\) ,则 \\(kx_i \\equiv kx_j \\pmod m\\) 。因为 \\(\\gcd(k,m) = 1\\) ,所以 \\(x_i \\equiv x_j \\pmod m\\) ,\\(x_i,x_j\\) 属于一个同余类,矛盾。综上,得证。
性质2的证明:
假设存在 \\(m_2x_1 + m_1x_2 \\equiv m_2x_1\'+m_1x_2\' \\pmod m\\) ,那么 \\(m_2(x_1-x_1\') \\equiv m_1(x_2\'-x_2) \\pmod m\\) 。因为 \\(m_1 \\mid m\\) ,所以 \\(m_2(x_1-x_1\') \\equiv m_1(x_2\'-x_2) \\equiv 0 \\pmod m_1\\) ,又 \\(\\gcd(m_1,m_2) = 1\\) ,所以 \\(x_1-x_1\' \\equiv 0 \\pmod m_1\\) ,矛盾。综上,得证。
性质3的证明:
根据性质1证明,类似可得 \\(S\'\\) 一定是 \\(m\\) 的一个剩余系,且有 \\(\\varphi(m)\\) 个元素,接下来只需证明任意元素都与 \\(m\\) 互质。
任意 \\(x \\in S\\) ,有 \\(\\gcd(x,m) = 1\\) ,又 \\(\\gcd(k,m) = 1\\) ,所以 \\(\\gcd(kx,m) = 1\\) ,所以 \\(S\'\\) 是模 \\(m\\) 的既约剩余系。
性质4的证明:
根据性质2证明,类似可得 \\(S\\) 一定是模 \\(m\\) 的一个剩余系,且有 \\(\\varphi(m_1)\\cdot\\varphi(m_2)\\) 个元素,但我们并不知道 \\(\\varphi(m_1)\\cdot\\varphi(m_2) = \\varphi(m_1m_2)\\) ,因此我们证明 \\(S\\) 的元素都与 \\(m\\) 互质只能说明 \\(S\\) 是模 \\(m\\) 的既约剩余系的一个子集,我们还需要证明模 \\(m\\) 的既约剩余系是 \\(S\\) 的一个子集。
若 \\(\\gcd(x_1,m_1) = \\gcd(x_2,m_2) = 1\\) ,又 \\(\\gcd(m_1,m_2) = 1\\) ,因此 \\(\\gcd(m_2x_1,m_1) = \\gcd(m_1x_2,m_2) = 1\\) ,所以 \\(\\gcd(m_2x_1 + m_1x_2,m_1) = \\gcd(m_1x_2+m_2x_1,m_2) = 1\\) ,于是 \\(\\gcd(m_1x_2+m_2x_1,m_1m_2) = 1\\) ,即 \\(S\\) 是模 \\(m\\) 的既约剩余系的子集。
因为 \\(\\gcd(m_1,m_2) = 1\\) ,因此 \\(m_2x_1+m_1x_2\\) 可以表达所有整数。那么令模 \\(m\\) 的既约剩余系的元素为 \\(m_2x_1+m_1x_2\\) ,则 \\(\\gcd(m_2x_1+m_1x_2,m_1m_2) = 1\\) ,因此 \\(\\gcd(m_2x_1+m_1x_2,m_1) = \\gcd(m_2x_1+m_1x_2,m_2) = 1\\) ,所以 \\(\\gcd(m_2x_1,m_1) = \\gcd(m_1x_2,m_2) = 1\\) ,又 \\(\\gcd(m_1,m_2) = 1\\) ,于是 \\(\\gcd(x_1,m_1) = \\gcd(x_2,m_2) = 1\\) ,即模 \\(m\\) 的既约剩余系是 \\(S\\) 的子集。
综上 \\(S\\) 就是模 \\(m\\) 的既约剩余系。
推论1的证明:
由性质4,可得 \\(S\\) 的元素个数是 \\(\\varphi(m_1)\\varphi(m_2)\\) ,而模 \\(m\\) 的既约剩余系的元素个数是 \\(\\varphi(m_1m_2)\\) 。因此,当 \\(\\gcd(m_1,m_2) = 1\\) , \\(\\varphi(m_1m_2) = \\varphi(m_1)\\varphi(m_2)\\) ,即欧拉函数是积性函数。
欧拉函数
欧拉函数的定义与基本性质
定义 \\([1,n]\\) 中与 \\(n\\) 互质的个数记作 \\(\\varphi(n)\\) 。
性质1 \\(\\varphi(p) = p-1\\) ,其中 \\(p\\) 为素数。
性质2 \\(\\varphi(p^k) = p^k - p^k-1\\) ,其中 \\(k\\in \\Z^+\\) , \\(p\\) 为素数。
性质3 欧拉函数是积性函数,即 \\(\\gcd(a,b) = 1 \\Rightarrow \\varphi(ab) = \\varphi(a)\\cdot \\varphi(b)\\) 。
性质4 int
范围内欧拉函数的最大值为 \\(1600\\) 。
由性质1、2、3可以得到引理:
引理1(欧拉函数的展开式)
其中 \\(p\\) 是素数。
欧拉函数的求法
试除法
线性筛求欧拉函数
欧拉函数的其他性质
同余重要定理
费马小定理
欧拉定理
威尔逊定理
二元一次不定方程
二元一次不定方程的定义与基本性质
裴蜀定理
解二元一次不定方程
扩展欧几里得算法
类欧几里得算法
乘法逆元
乘法逆元的定义与基本性质
乘法逆元的求法
费马小定理法
扩展欧几里得法
线性求乘法逆元
线性求阶乘逆元
一元一次同余方程
一元一次同余方程的定义与基本性质
解一元一次同余方程
扩展欧几里得算法
解一元一次同余方程组
中国剩余定理
扩展中国剩余定理
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/17051072.html
以上是关于[基础数论]不定方程笔记的主要内容,如果未能解决你的问题,请参考以下文章