数学基础-整除和不定方程超详解

数学:

一:整除

概念:

如果 A A A 能整除 B B B 则记之为 A ∣ B A|B AB 即存在一个数 k ∈ Z k \in Z kZ 使 A k = B Ak = B Ak=B。即 B B B A A A 的倍数。

性质:
1. 如果 a ∣ b , b ∣ c a|b,b|c ab,bc 那么 a ∣ c a|c ac 表明整除具有传递性。
2. 如果 a ∣ b , a ∣ c a|b,a|c ab,ac 那么对于任意整数对 ( x , y ) (x,y) (x,y) 满足 x ∈ Z , y ∈ Z x \in Z,y \in Z xZ,yZ 都有 a ∣ b x + c y a|bx+cy abx+cy
下面证明这两个性质。
证明性质1:

因为 a ∣ b a|b ab,所以 b = x a , x ∈ Z b = xa,x \in Z b=xa,xZ
因为 b ∣ c b|c bc,所以 c = y b , y ∈ Z c = yb,y \in Z c=yb,yZ
综上所以 c = y b c = yb c=yb,即 c = y × ( x a ) = x y a c = y\times (xa) = xya c=y×(xa)=xya
因为 x ∈ Z , y ∈ Z x \in Z,y \in Z xZ,yZ,所以 x y ∈ Z xy \in Z xyZ,所以 a ∣ c a|c ac

证明性质2:

因为 a ∣ b a|b ab 所以 b = k a , k ∈ Z b = ka,k \in Z b=ka,kZ
因为 a ∣ c a|c ac 所以 c = K a , K ∈ Z c = Ka,K \in Z c=Ka,KZ
因为对于任意整数对 ( x , y ) (x,y) (x,y) 满足 x ∈ Z , y ∈ Z x \in Z,y \in Z xZ,yZ 所以 b x ∈ Z , c y ∈ Z bx \in Z,cy \in Z bxZ,cyZ
综上;故:原式 b x + c y = k a x + K a y bx + cy = kax + Kay bx+cy=kax+Kay 合并同类项得 b x + c y = a ( k x + K y ) bx + cy = a(kx + Ky) bx+cy=a(kx+Ky)
因为 k ∈ Z , x ∈ Z , K ∈ Z , y ∈ Z k \in Z,x \in Z,K \in Z,y \in Z kZ,xZ,KZ,yZ,所以 k x ∈ Z , K y ∈ Z kx \in Z,Ky \in Z kxZ,KyZ
所以 k x + K y ∈ Z kx + Ky \in Z kx+KyZ
至此原式得: a ∣ a × ( k x + K y ) a|a\times (kx + Ky) aa×(kx+Ky)
所以,对于任意整数对 ( x , y ) (x,y) (x,y) 满足 x ∈ Z , y ∈ Z x \in Z,y \in Z xZ,yZ 都有 a ∣ b x + c y a|bx+cy abx+cy

证明题:
一:设 a ∣ n , b ∣ n a|n,b|n an,bn 且存在整数 a x + b y = 1 ax + by = 1 ax+by=1,证明 a b ∣ n ab|n abn
证明:

因为 a ∣ n , b ∣ n a|n,b|n an,bn 所以 n = k a , n = K b , k ∈ Z , K ∈ Z n = ka,n = Kb,k \in Z,K \in Z n=ka,n=Kb,kZ,KZ
因为 a x + b y = 1 ax + by = 1 ax+by=1
所以 n = n × ( a x + b y ) n = n\times (ax + by) n=n×(ax+by)
n = n a x + n b y n = nax + nby n=nax+nby
n = ( K b ) a x + ( k a ) b y n = (Kb)ax + (ka)by n=(Kb)ax+(ka)by
n = K a b x + k a b y n = Kabx + kaby n=Kabx+kaby
n = a b ( K x + k y ) n = ab(Kx + ky) n=ab(Kx+ky)
因为 K ∈ Z , x ∈ Z , k ∈ Z , y ∈ Z K \in Z,x \in Z,k \in Z,y \in Z KZ,xZ,kZ,yZ
所以 K x ∈ Z , k y ∈ Z Kx \in Z,ky \in Z KxZ,kyZ
所以 K x + k y ∈ Z Kx + ky \in Z Kx+kyZ
所以 a b ∣ n ab|n abn

二:exgcd算法

形如求解 a x + b y = c ax+by=c ax+by=c 知道 a , b , c a,b,c a,b,c 求解整数解 x , y x,y x,y 的值。
通常使用 exgcd 算法求解。
首先考虑无整数解的情况,根据贝祖定理,对于 a ∈ Z , b ∈ Z , c ∈ Z a\in Z,b\in Z,c\in Z aZ,bZ,cZ 如果有两个整数 x , y x,y x,y 满足 a x + b y = c ax+by=c ax+by=c 那么 c = k × gcd ⁡ ( a , b ) , k ∈ Z c=k\times\gcd(a,b),k\in Z c=k×gcd(a,b),kZ
即:如果 c m o d    gcd ⁡ ( a , b ) ! = 0 c\mod\gcd(a,b)!=0 cmodgcd(a,b)!=0 那么就无解。
如果有解,那么:
a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) b x + ( a m o d    b ) y = gcd ⁡ ( b , a m o d    b ) bx+(a\mod b)y=\gcd(b,a\mod b) bx+(amodb)y=gcd(b,amodb)
因为 gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) \gcd(a,b)=\gcd(b,a\mod b) gcd(a,b)=gcd(b,amodb)
所以 a x + b y = b x + ( a m o d    b ) y ax+by=bx+(a\mod b)y ax+by=bx+(amodb)y
因为 a m o d    b = a − ⌊ a / b ⌋ × b a\mod b=a-\lfloor a/b\rfloor\times b amodb=aa/b×b
所以原式为 a x + b y = b x + ( a − ⌊ a / b ⌋ × b ) y ax+by=bx+(a-\lfloor a/b\rfloor\times b)y ax+by=bx+(aa/b×b)y
化简下得: a x + b y = b x + a y − ⌊ a / b ⌋ b y ax+by=bx+ay-\lfloor a/b\rfloor by ax+by=bx+aya/bby
也就是 a x + b y = b ( x − ⌊ a / b ⌋ y ) + a y ax+by=b(x-\lfloor a/b\rfloor y)+ay ax+by=b(xa/by)+ay
所以 x = y , y = x − ⌊ a / b ⌋ y x=y,y=x-\lfloor a/b\rfloor y x=y,y=xa/by
但是这么做只能求出 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b) 的特解,并不能求出 a x + b y = c ax+by=c ax+by=c 的特解,但是因为贝祖定理得 c = k × gcd ⁡ ( a , b ) , k ∈ Z c=k\times\gcd(a,b),k\in Z c=k×gcd(a,b),kZ 所以将两边同时乘 c / gcd ⁡ ( a , b ) c/\gcd(a,b) c/gcd(a,b) 因为 c m o d    gcd ⁡ ( a , b ) = 0 c\mod\gcd(a,b)=0 cmodgcd(a,b)=0 所以 c / gcd ⁡ ( a , b ) ∈ Z c/\gcd(a,b)\in Z c/gcd(a,b)Z
又因为 x , y ∈ Z x,y\in Z x,yZ 所以 x × ( c / gcd ⁡ ( a , b ) ) ∈ Z x\times(c/\gcd(a,b))\in Z x×(c/gcd(a,b))Z 同理 y × ( c / gcd ⁡ ( a , b ) ) ∈ Z y\times(c/\gcd(a,b))\in Z y×(c/gcd(a,b))Z。所以不用担心是不是整数的问题。
模板题:
https://www.luogu.com.cn/problem/CF7C
代码:

#include<bits/stdc++.h>
using namespace std;
typedef __int128 ll;
ll a,b,x,y,c;
 
ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	ll d=exgcd(b,a%b,x,y);
	ll t=x;
	x=y;
	y=t-(a/b)*y; 
	return d;
}
template<typename T>inline void rd(T&r){
	r=0;char c=getchar(),m=1;
	for(;!isdigit(c);c=getchar()){
		if(c=='-')m=-1;
	}
	for(;isdigit(c);c=getchar()){
		r=(r<<3)+(r<<1)+(c^48);
	}
	r*=m;
}
template<typename T>inline void wt(T r){
	if(r<0){
		putchar('-');wt(-r);return;
	}
	if(r>9) wt(r/10);
	putchar(r%10+'0');
}
int main(){
	rd(a);rd(b);rd(c);
	c=-c;
	ll g=exgcd(a,b,x,y);
	if(c%g){
		puts("-1");
		return 0;
	}
	ll t=c/g;
	wt(x*t);
	putchar(' ');
	wt(y*t);
	putchar('\n');
	return 0;
}
  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值