gcd以及exgcd入门讲解

gcd就是最大公约数,gcd(x, y)一般用(x, y)表示。与此相对的是lcm,最小公倍数,lcm(x, y)一般用[x, y]表示。

人人都知道:lcm(x, y) = x * y / gcd(x, y)

证明起来也不是很难:

(这真的是我自己写的,因为博客园不支持这格式……)

至于gcd的求法,想必各位在高中都学过辗转相除法和更相减损之术,这里只讲辗转相除法(更相减损之术略慢)

首先不妨设 x ≤ y,则gcd(x, y)  =gcd(x, x +y) = gcd(x, y - x).所以gcd(x, y) = gcd(y % x, x),因此可以递归求解。

复杂度证明:因为y % x ≤ x && x ≤ y,所以y % x < y / 2。因此在最坏情况下为O(nlogn)。(用斐波那契数列的相邻两个数可以达到最坏复杂度)

那么接下来讲一下扩展gcd。

exgcd可以用来判断并求解形如ax +by = c 的方程,当且仅当gcd(a, b) | c时,存在整数解x, y。

也就是说,exgcd可以用来求解方程ax +by = gcd(a, b)

令a = b, b = a % b,则有方程b *x1 +(a % b) * y1 = gcd(b, a % b)

又因为gcd(a, b) = gcd(a % b),且a % b = a - b * ?a / b?

则b * x1 + (a - b * ?a / b?) * y1  =gcd(a, b)

整理得:a * y1 +b * (x1 - ?a / b? *y1) = gcd(a, b)

所以原方程中:x = y1, y = x1 - ?a / b? *y1。于是我们只要递归求出x1, y1就能求出x, y。

代码很短

1 void exgcd(ll a, ll b, ll& x, ll& y, ll& c)
2 {
3     if(!b) {y = 0; x = 1; c = a; return;}
4     exgcd(b, a % b, y, x); y -= a / b * x;
5 }

其中c = gcd(a, b)

值得注意的是,递归调用的时候y的位置上传了x,x位置上是y,也就是说,y里存的是x1,x里存的是y1,所以y -= a / b *y1,即y -= a / b * x。

我们现在已经求得了ax +by = gcd(a, b)的解,那么对于方程ax + by = c (gcd(a, b) | c)呢?

因为已经知道a *x1 +b * y1 = gcd(a, b)的解x1, y1,左右两边同乘以c / gcd(a, b) 得:

a * x1 * c / gcd(a, b) +b * y1 * c / gcd(a, b) = c

则原方程的一组解x2 = x1 * c / gcd(a, b), y2 = y1 * c / gcd(a, b)

由此得出解集{(x, y) | x = x2 + k * b / gcd(a, b), y = y2 - k * a / gcd(a, b), k ∈ z}

原文地址:https://www.cnblogs.com/mrclr/p/9380300.html

时间: 2024-10-03 15:20:54

gcd以及exgcd入门讲解的相关文章

AndEngine入门讲解

摘要:AndEngine是一款基于OpenGL ES技术的2D游戏引擎,可以运行在Android1.6及以上版本的系统中.拥有更多的游戏组件与扩展功能,在默认情况下已经可以支持中文. 虽然AndEngine作为游戏引擎在功能上较libGDX更为丰富和人性化,但相比libGDX的绘图渲染机能却逊色不少.libGDX有较为完善的OpenGLES环境适应性,而AndEngine在这方面的投入明显不足.所以你是否选择AndEngine,需要从实际出发,多做几次真机测试才好下决定,下面小编将逐步讲解And

DevStore技术支持:AndEngine入门讲解

摘要:AndEngine是一款基于OpenGL ES技术的2D游戏引擎,可以运行在Android1.6及以上版本的系统中.拥有更多的游戏组件与扩展功能,在默认情况下已经可以支持中文. 虽然AndEngine作为游戏引擎在功能上较libGDX更为丰富和人性化,但相比libGDX的绘图渲染机能却逊色不少.libGDX有较为完善的OpenGLES环境适应性,而AndEngine在这方面的投入明显不足.所以你是否选择AndEngine,需要从实际出发,多做几次真机测试才好下决定,下面小编将逐步讲解And

Mysql C语言API编程入门讲解

原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.  API,全称Application Programming Interfaces,即应用程序编程接口,我们可以调用这些接口,执行API函数提供的功能.  Mysql C语言API就是用C语言编写的Mysql编程接口,使用这些接口函数可以实现对Mysql数据库的查询等操作.  Mysql的安装  要进

HTML5游戏开发引擎Pixi.js新手入门讲解

在线演示 本地下载 ?这篇文章中,介绍HTML5游戏引擎pixi.js的基本使用. 相关代码如下: Javascript 导入类库:(使用极客的cdn服务:http://cdn.gbtags.com) <scripttype="text/javascript"src="http://cdn.gbtags.com/pixi.js/1.6.1/pixi.js"></script> 引擎使用: .... .... 阅读原文:HTML5游戏开发引擎P

AngularJS入门讲解4:多视图,事件绑定,$resource服务讲解

上一课,大家知道,手机详细模板我们没有写出来,使用的是一个占位模板. 这一课,我们先实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 为了实现手机详细信息视图,我们将会使用$http来获取数据. 以下json对象就是手机详细的信息,我们会在手机详细信息视图中显示这些数据. { "additionalFeatures": "Contour Display, Near Field Communications (NFC),...", &quo

每周四JEECG社区公开课:微信公众账号运营(jeewx使用)入门讲解

JEECG即将推出免费公开课新专题,欢迎大家报名听课,共同交流! 课程名称:微信公众账号运营(jeewx使用)入门讲解 时        间:每周四晚九点 报名方式:点击链接http://ke.qq.com/cgi-bin/courseDetail?course_id=91547 版权声明:本文为博主原创文章,未经博主允许不得转载.

spring3.1.1入门讲解二(注解篇)

在第一篇博客中主要讲解了如何搭建spring框架和运行示例项目:在本篇文章中主要讲解如何采用注解的方式简化开发! 一.准备篇-jar包的准备 这里就不详细说明了详见上一篇博客--spring3.1.1入门讲解一(非注解篇)中的准备篇讲解 二.环境搭建篇 1.在web.xml文件中添加的配置跟上一篇的配置代码一样,直接复制过去就行了. 2.配置spring-mvc.xml,重点就在这里 重点配置如下: 1).如果像我们采用非注解的方式去创建和访问controller控制器时,我们都需要在sprin

数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p2^{a2}p3^{a3}...pn^{an},b=p1^{b1}p2^{b2}p3^{b3}...pn^{bn}\),那么\(gcd(a,b)=\prod_{i=1}^{n}pi^{min(ai,bi)},lcm(a,b)=\prod_{i=1}^{n}pi^{max(ai,bi)}\)(0和任何

hdu1695 GCD(莫比乌斯入门题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意: 给出n.m.k ,求出1<=x<=n, 1<=y<=m 且gcd(x,y) == k 的(x,y)的对数 解析: 显然就是求 [1,n/k] 与 [1, m/k]有多少数对的最大公约数是1 莫比乌斯入门题 我们设 为满足且和的的对数 为满足且和的的对数 那么,很显然,反演后得到 我们所需要的答案便是  f(1) = ∑i=1μ(i)*(n/i)*(m/i)  ,求解这个式