IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 扩展欧几里得算法及其简单应用 -> 正文阅读

[数据结构与算法]扩展欧几里得算法及其简单应用

1. 整除与取模

先普及一下整除符号“|”
对于整数a,b(a≠0),若存在整数k,使b=ka,则称a整除b,或b能被a整除,记为a∣b

然后是取模运算

取模运算不用说,大家都懂,不过有几条性质希望大家也都明白。

(a+b)%m = (a%m + b%m ) %m;

(a-b)%m = (a%m - b%m ) %m;

(a*b)%m = (a%m * b%m ) %m;

除法在这里是不成立的:(a/b)%m = (a%m / b%m ) %m; 这是错误的

2. 欧几里得算法

g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\% b) gcd(a,b)=gcd(b,a%b)

若a<b,则gcd(a,b)=gcd(b,a)=gcd(b,a% b),命题成立。

若a>=b,不妨设a=q*b+r,其中0≤r<b。显然r=a%b。
对于a,b的任意公约数d, 因为d|a, d|(qb),故d|(a-qb), 即d| r, 因此d也是b,r的公约数。
对于b,r的任意公约数k, 因为k|b, k|(a-qb)\ [r=a-qb], 故k|a,因此k也是a,b的公约数
故a,b的公约数集合与b,a%b的公约数集合相同。于是它们的最大公约数自然也相等。

如果觉得不自然,请再往下看。

假设(a,b)>(b,a%b),令d等于a,b的最大公约数,即d=(a,b))
根据上面的推导可知:d同时也是b,r的公约数,而b,r的最大公约数一定大于等于d,假设不成立
假设(a,b)<(b,a%b),和上面一样的道理,假设不成立。
(a,b)既不大于也不小于(b,a%b),两者相等。

3. 最大公约数、最小公倍数

int gcd(int a,int b)
{
	if(b==0) return a;
    return gcd(b,a%b);
}

int lcm(int a,int b)
{
    return a/gcd(a,b)*b;
}

4. 扩展欧几里得算法

满足ax+by=(a,b) 时,可以用扩展欧几里得算法求出一组特解 ( x0 , y0 )

int ec_gcd(int a,int b,int &x,int &y)
{
	if(b==0){
		x=1,y=0;
		return a;
	}
	int d=ec_gcd(b,a%b,x,y);
	int t=x;
    x=y;
    y=t-(a/b)*y;
    return d;
}

a x + b y = b x + ( a % b ) y = a y + ( x ? a / b ? y ) b 于 是 我 们 可 以 不 断 递 归 至 b = 0 , 使 得 a x + b y = ( a , 0 ) = a , x = 1 , y = 0 ; ax+by = bx+(a\%b)y = ay + ( x -a/b*y)b\\ 于是我们可以不断递归至b=0,使得\\ ax+by=(a,0)=a,x=1,y=0; ax+by=bx+(a%b)y=ay+(x?a/b?y)bb=0使ax+by=(a,0)=a,x=1,y=0;

5. ax+by=n

5.1 有解条件

当 且 仅 当 n 是 g c d ( a , b ) 的 倍 数 时 , 才 有 整 数 解 。 当且仅当n是gcd(a,b)的倍数时,才有整数解。 ngcd(a,b)

5.2 求解步骤

1. 判 断 a x + b y = n 是 否 有 整 数 解 , 有 解 的 条 件 是 g c d ( a , b ) ∣ n 2. 求 a x + b y = d = ( a , b ) 的 一 个 解 ( x 0 , y 0 ) 3. 在 得 到 的 a x 0 + b y 0 = d 两 边 同 时 乘 n / d 得 到 ?? a x 0 ? n / d + b ??? y 0 ? n / d = n 4. 对 照 a x + b y = n 得 到 它 的 一 个 解 x = x 0 ? n / d , ?? y = y 0 ? n / d 5. 它 的 通 解 表 达 式 为 ? x = x + b / d ???? y = y ? a / d 1.判断ax+by=n 是否有整数解,有解的条件是 gcd(a,b)|n\\ 2.求ax+by= d=(a,b) 的一个解 (x_0, y_0) \\ 3.在得到的 ax_0+by_0 = d 两边同时乘 n/d 得到 \ \ ax_0 *n/d+b\ \ \ y_0 *n/d = n\\ 4.对照 ax+by=n 得到它的一个解 x = x_0 *n/d,\ \ y = y_0 *n/d \\ 5.它的通解表达式为 \ x=x+b/d\ \ \ \ y=y-a/d\\ 1.ax+by=ngcd(a,b)n2.ax+by=d=(a,b)(x0?,y0?)3.ax0?+by0?=dn/d??ax0??n/d+b???y0??n/d=n4.ax+by=nx=x0??n/d,??y=y0??n/d5.?x=x+b/d????y=y?a/d

如果要求x的最小正整数解,令t=b/d x=(x%t+t)%t; 求y同理

5.3 代码

int slove(int a,int b,int n)
{
	int x,y;
	int d=exgcd(a,b,x,y);
	if(n%d) return -1;
	x=x*n/d;
	int t=b/d;
	if(t<0) t=-t;
	return (x%t+t)%t;
}

6. 同余方程

1.同余

两个整数a、b和正整数m ,如果a除以m所得的余数和b除以m所得的余数相等,即a %m=b%m.

称a和b对于m同余.m称为同余的模。同余的概念也可以这样理解: m l(a-b)。即a-b是m的整数倍。

例如 6|(16-4)16和4对6同余。同余的符号记为
a ≡ b ( m o d ? m ) a \equiv b(mod \ m) ab(mod?m)

2.同余方程

a x ≡ b ( m o d ? m ) ax \equiv b(mod \ m) axb(mod?m)

a x ? b 是 m 的 整 数 倍 , 即 满 足 a x ? b = m y ?? 其 中 y 可 以 是 负 数 于 是 可 以 改 写 为 a x + m y = b ax-b 是m的整数倍,即满足ax-b=my \ \ 其中y可以是负数\\ 于是可以改写为 ax+my=b ax?bmax?b=my??yax+my=b
于是解同余方程就变成了求解二元一次不定方程,用扩展欧几里得算法,有解条件是gcd(a,m)能整除b

7. 逆元

什么是逆元?百度百科:逆元

这里只讨论我们需要的乘法逆元:
满 足 a x ≡ 1 ( m o d ? m ) 的 x , 称 为 a 在 模 m 下 的 逆 元 , 即 a x 模 m 等 于 1 满足ax \equiv 1(mod \ m)的x,称为a在模m下的逆元,即ax模m等于1 ax1(mod?m)xamaxm1

int slove(int a,int m)
{
	int x,y;
	exgcd(a,m,x,y);
	return (x%m+m)%m;
}

除法取模

逆元有什么用?

求(a/b)%m,当a,b是很大的数时,作除法会损失精度

使用逆元可以避免除法:设k是b的逆元,则bk模m等于1
( a b % m ) = ( a b % m ) ? b k % m = a k % m o d (\frac{a}{b}\% m)=(\frac{a}{b}\% m)*bk\%m=ak\%mod (ba?%m)=(ba?%m)?bk%m=ak%mod
于是a/b就变成了ak,是不是很nice

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:27:37  更:2022-04-06 23:29:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:32:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码