欧几里得最大公约数算法

最大公约数

想必大家小学就学过什么事最大公约数吧,现在给出一个数学上的定义:定义$g$是整数$a$和$b$的最大公约数,当且仅当$g$是同时整除$a$和$b$的数中最大的那个。

欧几里得算法

欧几里得算法可以写成如下简单的形式:

$$gcd(a,b) =\begin{cases} a, & \mbox{if }b=0 \\gcd(b,a\ mod\ b), & \mbox{if }b\ne0\end{cases}$$

算法的证明

算法的过程可以写成如下的形式:

$$a=q_0b+r_0$$

$$b=q_1r_0+r_1$$

$$r_0=q_2r_1+r_2$$

$$r_1=q_3r_2+r_3$$

$$\cdots$$

$$r_{k-1}=q_{k+1}r_k$$

显然,欧几里得算法的答案就是$r_k$。

先证明$r_k$能整除$a$和$b$:

$$\because r_{k-1}=q_{k+1}r_k$$

$$\therefore r_{k-2}=q_kr_{k-1}+r_k=(q_{k+1}q_k+1)r_k$$

$$\therefore r_k\mid r_{k-2}$$

$$\cdots$$

$$\therefore r_k\mid b$$

$$\therefore r_k\mid a$$

$$\therefore gcd(a,b)=g\ge r_k$$

接下来证明$gcd(a,b)=g$能整除r_k

$$\mbox{令} a=ng\ b=mg$$

$$\because a=q_0b+r_0$$

$$\therefore r_0=a-q_0b=ng-q_0mg=(n-q_0m)g$$

$$\mbox{同理}g\mid r_k$$

$$\therefore g\le r_k$$

$$\mbox{由前面的证明我们知道} g\ge r_k$$

$$\therefore g=r_k$$

代码

int gcd(int a, int b){
    return b==0?a:gcd(b,a%b);
}
时间: 2024-08-08 10:28:16

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

浅谈关于欧几里得的一系列算法

浅谈关于欧几里得的一系列算法 --------- 这里有个叫分界线的家伙说,本章的所有讨论均在整数的范围中,所有除法都为带余除法o---------------- 朴素欧几里得算法 又名辗转相除法,代码实现如下: int gcd(int a, int b) // a >= b { if(b == 0) return a; return gcd(b, a % b) } 想一想为什么可以这样计算? 我们设 \(a=k_1m, \ b=k_2m \ ,gcd(a,b)=m,\ gcd(k_1,k_2)

UVA 1347(POJ 2677)Tour(双调欧几里得旅行商问题)

Tour                 Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John mus

[ACM] POJ 2677 Tour (动态规划,双调欧几里得旅行商问题)

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3585   Accepted: 1597 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must

实验一 算法问题求解基础--欧几里得递归算法和递归算法

1.欧几里得递归算法 2.欧几里得迭代算法 3.连续整数检测算法 4.递归算法 实验一算法问题求解基础 实验名称:算法问题求解基础 实验章节:算法设计与分析第一章内容 实验内容 第一部分 欧几里得算法求最大公约数 问题: 1. 计算:34931与 75236 的最大公约数: 1 #include<iostream.h> 2 3 //1.欧几里得递归算法 4 void Swap(int&a,int&b) 5 { 6 int c=a;a=b;b=c; 7 } 8 9 int RGc

欧几里得求最大公约数--JAVA递归实现

欧几里得算法求最大公约数算法思想: 求p和q的最大公约数,如果q=0,最大公约数就是p:否则,p除以q余数为r,p和q的最大公约数即q和r的最大公约数. java实现代码: 1 public class Demo0 { 2 public static void main(String[] args) { 3 4 System.out.println(gcd(24,120)); 5 } 6 7 8 public static int gcd(int p,int q){ 9 10 if(q==0)

【算法学习】双调欧几里得旅行商问题(动态规划)(转)

双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的一般形式为NP的(在多项式时间内可以求出) J.L. Bentley 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点.下图(b)显示了 同样的7个点的最短双调路线.在这种情况下,多项式的算法是可能的.事实上,存

《算法导论》思考题15-1 双调欧几里得旅行商问题(动态规划)

欧几里得旅行商问题 是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题.图a给出了7个点问题的解,这个问题的一般形式是NP完全的,故其解需要多于多项式的时间. J.K.Bentley建议通过只考虑双调旅程来简化问题,这种旅程即为从最左点开始,严格从左到最右点,再严格地从最右点回到最左点.图b显示了同样的7个点的问题的最短双调路线,在这种情况下,多项式的时间的算法是有可能的. 描述一个确定最优双调路线的O(n^2)时间的算法.可以假设任何两点的x坐标都不相同. 解法: 读了很多遍这个题,也

欧几里德算法 以及 欧几里得拓展

一.欧几里得算法 二.欧几里得拓展 一. 欧几里得算法: gcd(a,b) = gcd(b,a mod b) (b < a) int gcd(int x,int y){ if(y == 0) return x; if(y > 0) return f(y,x%y);//即使 y > x, 调用 gcd ( y , x%y) 就等于互换 y与x. } int gcd(int x,int y){ return y ? gcd(y,x%y) : x; } 二. 拓展欧几里得算法: 原文地址:ht

公约数算法

/* 对于已知的两个自然数m, n,假设m>n 计算m除以n,将得到的余数记做r 如果r=0,则此时的n为求得的最大公约数.否则,将n的值保存在m中,将r的值保存在n中, 重复执行下去. */ //欧几里得->辗转相除法 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <iostream> #include &l