图解 欧几里德算法

把整数看成保持面积不变,可以重排为长宽为整数的矩阵

取两个整数的最大公因子,可以看作把两个整数重排后保持一端对齐,求对齐端的最大长度

当两个整数一端对齐时,他们的差也保持对其。所以原问题问题gcd(m,n)能归结为gcd(m-n,n)

最终其中的一者成为长=1,宽=gcd(m,n)的矩形,算法终结

而不断的减这一过程就是除法的直观描述,算法中循环减的过程可优化为除法取余的过程

以上,得到了基于减法与基于除法的两种欧几里德算法图像上的直观解释

原文地址:https://www.cnblogs.com/qmcj/p/9095223.html

时间: 2024-11-11 23:33:00

图解 欧几里德算法的相关文章

扩展欧几里德算法

文章来源:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

欧几里德与扩展欧几里德算法(转)

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a

HDU 1098 Ignatius's puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到

POJ 2773 Happy 2006 (分解质因数+容斥+二分 或 欧几里德算法应用)

Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10309   Accepted: 3566 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are a

如何使用循环而不是递归反推的方式实现拓展欧几里德算法

平常我们使用拓展欧几里德算法求pm + qn = gcd(m, n)这种表示时,一般都会选择递归的方式来实现,因为欧几里得算法的递归深度最多也只有O(lgn), according to lame's theorem,所以这个递归用栈是可以忽略的. 但其实只需要循环就可以求出一组pm + qn = gcd(m, n)的表示,将栈深度保持在O(1),这样的写法在使用函数调用的高级语言中看起来复杂一点但在汇编编程时就显得比较简单. 方法是假设第k次迭代中的两个数分别为 M(k) 和 N(k),我们始

ACM数论之旅4---扩展欧几里德算法(欧几里德(???)?是谁?)

为什么老是碰上 扩展欧几里德算法 ( •?∀•? )最讨厌数论了 看来是时候学一学了 度娘百科说: 首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •?∀•? )她说根据数论中的相关定理可以证明,反正我信了) 所以 ax+by = gcd(a, b) * k 也肯定有解 (废话,把x和y乘k倍就好了) 那么已知 a,b 求 一组解 x,y 满足 ax+by = gcd(a, b) 这个公式 1 #include<cstdio> 2 typedef long long LL;

欧几里德与扩展欧几里德算法

转自网上大牛博客,讲的浅显易懂. 原文地址:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有

算法总结之欧几里德算法

算法总结之欧几里德算法 1.欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数. 其计算原理依赖于下面的定理: gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0) 代码实现: 1 int gcd(int a,int b) 2 { 3 return b==0?a:gcd(b,a%b); 4 } 2.扩展欧几里德算法 基本算法: 对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y,