首页 > 其他分享 >[基础数论]不定方程笔记

[基础数论]不定方程笔记

时间:2023-05-20 09:02:41浏览次数:54  
标签:数论 定理 mid 笔记 int 线性组合 my mx 不定

前言

在学习本节内容前,最好先学习同余的基本性质以加深理解。

一堆定理

  • 定理1:

\[a,b,m,n \in \mathbb Z,c \mid a,c \mid b \]

\[c \mid (ma+nb) \]

证明:
令 \(a=ce,b=cf\) ,
代入 \(ma+nb\) 再提公因式即可。

  • 定理2:

\[a,b,c \in \mathbb Z \]

\[(a+cb,b)=(a,b) \]

证明:
定理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:

\[a,b,c \in \mathbb Z , m \in \mathbb Z^+ ,d=(c,m) \]

且有

\[ac \equiv bc \pmod m \]

\[a \equiv b \pmod {m/d} \]

证明:令 \(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}\)

得证。

  • 推论:

\[a,b,c \in \mathbb Z , m \in \mathbb Z^+, (c,m)=1 \]

且有

\[ac \equiv bc \pmod m \]

则有

\[a \equiv b \pmod m \]

  • 定理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,b \in \mathbb Z \]

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

证明:

令 \(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)\) 的解。

  • 公式推导

对于

\[ax+by=(a,b) \]

不妨设 \(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 \frac{a}{b} \rfloor *b)y_2\)

化简得:\(ax_1 + by_1 = bx_2 + ay_2 - \lfloor \frac{a}{b} \rfloor *b *y_2\)

贝祖等式得 \(x_1 = y_2 , y_1 = x_2 - \lfloor \frac{a}{b} \rfloor *y_2\)

裴蜀定理

\[a,b \in \mathbb Z \]

则存在

\[x,y \in \mathbb Z,ax+by=(a,b) \]

证明:由定理3易证。

  • 推论:
    整数 \(a\) 与 \(b\) 互质,
    当且仅当存在整数 \(m,n\) 使得 \(ma+nb=1\).

证明:若 \(ma+nb=1\) ,由定理3得 \((a,b)=1\) ,易证。

二元一次不定方程

对于一些方程形如

\[ax+by=c \]

如果 \(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;
}

多元一次不定方程

对于方程形如

\[a_1x_1 + a_2x_2 + … + a_nx_n = c \]

由前文所述,我们知道

\[a_1x_1 + a_2x_2 = k(a_1,a_2) \ (k \in \mathbb Z) \]

所以原式就可以换成:

\[(a_1,a_2)x + a_3x_3 + … + a_nx_n = c \]

重复以上操作,就可以得到:

\[(a_1,a_2,…,a_{n-1})x + a_nx_n =c \]

再一层层解回去即可。

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;
}

标签:数论,定理,mid,笔记,int,线性组合,my,mx,不定
From: https://www.cnblogs.com/wonder-land/p/17416721.html

相关文章

  • 【数论】Rust使用Miller-Rabin primality test判别素数
    题目地址https://ac.nowcoder.com/acm/contest/57677/A代码usestd::io::{self,BufRead,Write};fnis_prime_triival(n:i128)->bool{ifn<=1{returnfalse;}ifn==2{returntrue;}ifn%2==0{retur......
  • 软件测试的笔记 黑马程序员
     我想学会软件测试的课程。认真学呗。全部学了过一遍。认真学,自己想学。 ......
  • 学习笔记
    2023.4.17CF1820CTheButcher思路口胡:最后答案显然要么长跟最大的一样,或者宽跟最大的一样。先考虑长跟最大的一样。然后考虑贪心,每次删除长一样或宽一样的宽或长即可,只要能递归到中任意长货款为。trick:这是一道边界删除问题。跟前面有道题类似,就递归下去。trick:有时候合并题可......
  • 线段树学习笔记
    让我们来一步一步理解! 1.向上更新voidpush_up(intrt){//向上更新sum[rt]=sum[rt<<1]+sum[rt<<1|1];} 2.向下更新voidpush_down(intrt,intm){if(add[rt]){//若有标记,则将标记向下移动一层add[rt<<1]+=add[rt];add[rt......
  • Redis笔记(三):事务
    什么是Redis事务Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。总结说:redis事务就是一次性、顺序性、排他性的执行一个......
  • es笔记六之聚合操作之指标聚合
    本文首发于公众号:Hunter后端原文链接:es笔记六之聚合操作之指标聚合聚合操作,在es中的聚合可以分为大概四种聚合:bucketing(桶聚合)mertic(指标聚合)matrix(矩阵聚合)pipeline(管道聚合)bucket类似于分类分组,按照某个key将符合条件的数据都放到该类别的组中mertic计......
  • kubebuilder笔记
    一、kubebuilder作用提供脚手架工具初始化CRDs工程,自动生成boilerplate代码和配置提供代码库封装底层的K8sgo-client二、kubebuilder整体流程用户自定义crd,将自定义的crd注册到scheme中,这样通过GVK能找到对应的go的struct,也能通过go的struct找对对应的GVKCache监听S......
  • 人月神话 读书笔记 03
    第9章削足适履9.1程序有多大?除了运行时间以外,它所占据的空间也是主要开销。当系统设计者认为对用户而言,常驻程序内存的形式比加法器、磁盘等更加有用时,他会将硬件实现中的一部分移到内存上。相反的,其他的做法是非常不负责任的。由于规模是软件系统产品用户成本中如此大的一个......
  • 人件集 人性化的软件开发阅读笔记03
    《人件集人性化的软件开发》第三部分工作组织第八章:团队的目标和规划这一章主要讲述如何制定合理的团队目标和规划,以及如何实现这些目标和规划。作者提出,确定特定的、可衡量的目标,并建立一个可靠的评估机制,以便团队能够不断改进和实现更好的效果。我认为这一章非常实用,对于团......
  • Redis笔记(二):三种特殊类型
    geospatial地理位置GEOADDkey[NX|XX][CH]longitudelatitudemember[longitudelatitudemember...]地球两极无法直接添加经度纬度GEODIST#单位m,km,mi,ftGEOHASHGEOPOSGEORADIUSGEORADIUSBYMEMBERJava中的数据结构......