最大公约数(欧几里得算法)

public static long gcd(long m, long n) {
	while(n != 0) {
		long rem = m%n;
		m = n;
		n = rem;
		gcd(m,n);
	}
	return m;
}

在一次迭代中余数并不按照一个常数因子递减,然而,我们可以证明,在两次迭代以后,余数最多是原始值的一半。这就证明了,迭代次数至多是2logN=O(logN)从而得到运行时间。

定理:如果M>N,则M mod N<M/2。

证明:如果N<= M/2,则由于余数小于N,固定理在这种情况下成立。另一种情形是N>M/2。但是此时M仅含有一个N从而余数为M-N<M/2,定理得证。

最大公约数(欧几里得算法)

时间: 2024-10-06 04:20:25

最大公约数(欧几里得算法)的相关文章

最大公约数-----欧几里得算法

欧几里得算法: 如果求两个数的最大公约数,那么最一般的求法是设置一个变量i=1,然后i不断加一,如果i加到某个数后两个数都能整除这个数了,然后把这个变量保存下来,然后最后的结果中最大的就是最大公约数. 然而这种方法时间复杂度可想而知有多高,所以一般情况瞎并不用这种方法,那么就有下面的欧几里得算法: 输入:两个数 a,b 输出:两个数的最大公约数 c 欧几里得算法:(1)找出两个数中最大的和最小的,分别为tmax.tmin, (2)不断令设置一个变量t代表tmin,tmin赋值为tmax  mod

求最大公约数——欧几里得算法

欧几里得算法的原理:基于这样一种观察,两个整数x和y(x>y)的最大公约数等同于y和(x%y)的最大公约数: 数t整除x和y,当且仅当t整数y和(x%y):这是因为:x = t*y + x%y; 具体代码如下: #include <iostream> #include <stdlib.h> using namespace std; int gcd(int x, int y) { cout << x << " " << y

查找两个数的最大公约数——欧几里得算法

欧几里得算法: 百度百科:欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数.应用领域有数学和计算机两个方面.计算公式gcd(a,b) = gcd(b,a mod b). 代码实现如下: import java.util.Scanner; public class Main { public static void main(String[] args) { //这里输入的a,b均是大于0的. Scanner cin = new Scanner(System.in); whil

求解最大公约数——欧几里得算法及其(解同余方程)拓展

最大公约数的求法中最过著名的莫过于欧几里得辗展相除法,它有两种形式(递归与非递归,其实是一样的,任何递归都可以写成非递归),下面看看GCD的实现代码: /***求a,b最大公约数***/ long long gcd(long long a, long long b) { if(b == 0) return a; else return gcd(b, a % b); } 證明过程(摘自维基百科:zh.wikipedia.org/wiki/輾轉相除法) 設 欲證 先設 可得且知 表示d是b,r的公因

欧几里得算法 - 计算两个正整数的最大公约数

欧几里得算法-计算两个正整数a,b的最大公约数 #定理:gcd(a,b) = gcd(b, a mod b) 终止条件:余数等于0 返回结果:余数等于0时的除数b # -*- coding: utf-8 -*- __author__ = 'nob' #迭代欧几里得 def iterative_gcd(a, b):     r = a % b     while(r):         a = b         b = r         r = a % b     return b     #

欧几里得算法求最大公约数(gcd)

关于欧几里得算法求最大公约数算法, 代码如下: int gcd( int a , int b ) { if( b == 0 ) return a ; else gcd( b , a % b ) ; } 证明: 对于a,b,有a = kb + r  (a , k , b , r 均为整数),其中r = a mod b . 令d为a和b的一个公约数,则d|a,d|b(即a.b都被d整除), 那么 r =a - kb ,两边同时除以d 得 r/d = a/d - kb/d = m (m为整数,因为r也

最小公约数(欧几里得算法&amp;&amp;stein算法)

求最小公约数,最容易想到的是欧几里得算法,这个算法也是比较容易理解的,效率也是很不错的.也叫做辗转相除法. 对任意两个数a,b(a>b),d=gcd(a,b),如果b不为零,那么gcd(a,b)=gcd(b,a%b) 证明: 令 r=a%b,即存在k,使得 a=b*k+r,那么r=a-b*k:显然r>=0,  r%d=((a%d)-(b*k)%d)%d,因为a%d=b%d=0,所以r%d=0: 因此求gcd(a,b)可以转移到求gcd(b,a%b),那么这就是个递归过程了,那什么时候递归结束呢

欧几里得算法——求取最小公约数

1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 14-5-20. 5 */ 6 public class Euclid { 7 public static void main(String[] args){ 8 Scanner scanner=new Scanner(System.in); 9 String str=scanner.nextLine(); 10 int a=Integer.parseInt(s

计算两个数的最大公约数 gcd(a,b) &amp;&amp; 证明欧几里得算法

求两个数a和b的最大公约数,可以想到的是从[1,min(a,b)]枚举每个正整数: #include<iostream> using namespace std; int gcd(int a,int b) { int ans=1; for(int i=2;i<=min(a,b);++i) { if(a%i==0 && b%i==0) ans=i; } return ans; } int main() { int a,b; cin>>a>>b; co

欧几里得算法求最大公约数+最小公倍数

1,两个数互质:如果说两个数的公因数只有1,则可以说这两个数互质. 欧几里得算法求最大公约数: 首先求最大公约数,假设我们要求a和b的最大公约数 设a mod b = c: 可以得到一下的递推过程: a = kb + c ; 假设a , b 的最大公约数为d,则可以得到: a = md , b = nd; 可知m , n 互质: c = a - kb = md - knd = (m-kn)d; 我们已经知道m,n互质,则可以知道n和m-kn互质,则c和b的最大公约数也是d; 所以由以上的推论,我