最大公约数的三种算法复杂度分析时间计算
- 格式:docx
- 大小:36.96 KB
- 文档页数:3
数组的最大公约数数组的最大公约数是指数组中所有元素的最大公约数。
在计算机科学中,最大公约数是一种常见的算法,用于计算两个或多个整数的最大公约数。
在这篇文章中,我们将讨论如何计算一个数组的最大公约数。
首先,我们需要了解什么是最大公约数。
最大公约数是指两个或多个整数的最大公因数。
例如,12和18的最大公约数是6,因为6是12和18的公因数中最大的一个。
计算一个数组的最大公约数需要使用一个算法。
以下是一个简单的算法:1. 找到数组中最小的数。
2. 从1到最小数之间的每个数依次遍历,检查它们是否是数组中所有数的公约数。
3. 如果一个数是所有数的公约数,则将其保存为当前的最大公约数。
4. 返回最大公约数。
这个算法的时间复杂度是O(nm),其中n是数组中的元素数量,m是数组中最小元素的大小。
这个算法的效率并不高,因为它需要遍历整个数组,并检查每个数是否是所有数的公约数。
另一个更高效的算法是欧几里得算法,也称为辗转相除法。
这个算法的基本思想是,如果a和b是两个整数,且a>b,则a和b的最大公约数等于b和a%b的最大公约数。
例如,12和18的最大公约数等于18和12%18=6的最大公约数,即6。
使用欧几里得算法计算一个数组的最大公约数的步骤如下:1. 找到数组中最小的数。
2. 从1到最小数之间的每个数依次遍历,检查它们是否是数组中所有数的公约数。
3. 如果一个数是所有数的公约数,则将其保存为当前的最大公约数。
4. 对最大公约数和数组中的下一个数执行欧几里得算法,得到它们的最大公约数。
5. 重复步骤4,直到遍历完整个数组。
这个算法的时间复杂度是O(nlogm),其中n是数组中的元素数量,m是数组中最小元素的大小。
这个算法的效率比第一个算法高得多,因为它使用了欧几里得算法的优化。
在实际应用中,我们可以使用递归来实现欧几里得算法。
以下是一个使用递归实现欧几里得算法的示例代码:int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}int arrayGcd(int[] arr) {int result = arr[0];for (int i = 1; i < arr.length; i++) {result = gcd(result, arr[i]);}return result;}```这个代码使用了递归来计算两个整数的最大公约数,然后在循环中使用它来计算整个数组的最大公约数。
求最大公约数的两种算法最大公约数(GCD)是指能够同时整除两个或多个整数的最大正整数。
在数学和计算机科学中,求最大公约数是一个常见的问题,并有多种算法可以解决。
以下是两种常见的求最大公约数的算法:1.暴力法:暴力法,也称为穷举法或试除法,是最简单直观的求最大公约数的方法。
该方法使用一个循环来遍历从2到较小的那个数之间所有的可能公约数,然后找到最大的。
算法步骤:-输入两个整数a和b,其中a>=b。
-从2开始,从小到大的顺序依次遍历所有的整数,直到找到最大的公约数。
-对于每一个遍历到的整数i,判断它是否同时整除a和b,如果是则更新最大公约数。
-返回最大公约数。
该算法的时间复杂度取决于较小整数b的大小,即O(b)。
然而,该算法对于较大的整数效率比较低,而且无法处理负整数。
2.辗转相除法(欧几里得算法):辗转相除法是一种通过反复用较小数除较大数,然后用余数去除旧的较小数,直到余数为0的方式来求解最大公约数的算法。
该算法基于下面的原理:两个整数a和b的最大公约数等于b和a mod b的最大公约数。
算法步骤:-输入两个整数a和b,其中a>=b。
- 计算a mod b,使用较小数b去除较大数a,将余数保存下来。
-如果余数为0,则b即为最大公约数。
-如果余数不为0,则将b赋值给a,将余数赋值给b,回到第二步继续计算。
-返回b作为最大公约数。
辗转相除法的时间复杂度较低,约为O(log b)。
它比暴力法更加高效且适用于处理较大整数。
此外,该算法也能正确处理负整数。
这两种算法是求最大公约数最常用的方法,它们在数学和计算机科学的许多领域都有广泛的应用。
可以根据具体情况选择合适的算法来求解最大公约数。
算法设计与分析11信本余启盛 118632011004一、上机目的及内容1.上机内容求两个自然数m和n的最大公约数。
2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
二、实验原理及基本技术路线图(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件matlab .2008四、实验方法、步骤(或:程序代码或操作过程)实验采用三种方法求最大公约数1、连续整数检测法。
2、欧几里得算法3、蛮力法(短除法)根据实现提示写代码并分析代码的时间复杂度:算法一:连续整数检测法。
CommFactor1输入:两个自然数m和n输出:m和n的最大公约数1.判断m和n哪个数小,t=min(m,n)2.如果m%t==0&&n%t==0 ,结束2.1 如果t不是m和n的公因子,则t=t-1;3. 输出t ;根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2;算法二:欧几里德算法CommFactor2输入:两个自然数m和n输出:m和n的最大公约数1. r = m % n;2. 循环直到r 等于02.1 m = n;2.2 n = r;2.3 r = m % n;3. 输出n ;根据代码辗转相除得到欧几里得的: O(n)= log n算法三:蛮力法(短除法)CommFactor3输入:两个自然数m和n输出:m和n的最大公约数1.factor=1;2.循环变量i从2-min(m,n),执行下述操作:2.1 如果i是m和n的公因子,则执行下述操作:2.1.1 factor=factor*i;2.1.2 m = m / i; n = n / i;2.2 如果i不是m和n的公因子,则i=i+1;3. 输出factor;根据代码考虑最坏情况他们的最大公约数,循环做了i-1次;最好情况是只做了1次,可以得出: O(n)=n/2;MATLAB程序代码:main.mx=fix(rand(1,1000)*1000);y=fix(rand(1,1000)*1000);for i=1:1000A(i)=CommFactor2(x(i),y(i));endx=x';y=y';算法一:function r=CommFactor1(m,n)tic;if m>n)t=n;else t=m;while(t)if(m%t==0&&n%t==0)break;else t=t-1;endendr=ttoc;算法二:function r=CommFactor2(m,n)tic;r=mod(m,n);while r~=0m=n;n=r;r=mod(m,n);endr=n;toc;算法三:function factor=CommFactor3(m,n)tic;factor=1;themax=max(m,n);for i=2:1:themaxwhile (mod(m,i)==0)&&(mod(n,i)==0) factor=factor*i;m=m/i;n=n/i;endendtoc;三种算法时间复杂度比较:(c++语言)#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"time.h"#define N 100int w,w2,w3;//用于计数int f1(int m,int n){int t;if(m>n)t=n;else t=m;while(t){if(m%t==0&&n%t==0)break;else t=t-1;w++;}return t;}int f2(int m,int n){int r;r=m%n;w2=1;while(r!=0){m=n;n=r;r=m%n;w2++;}return n;}int f3(int m,int n){int i, factor = 1;for (i = 2; i <= m && i <= n; i++){while (m % i == 0 && n % i == 0) //此处不能用if语句{factor = factor * i;m = m / i; n = n / i;w3++;}}return factor;}int main(void){int m,n;printf(" 请输入m,n :\n");scanf("%d%d",&m,&n);int k;k=f1(m,n);printf(" 方法一最大公约数为:%d\n",k);k=f2(m,n);printf(" 方法二最大公约数为:%d\n",k);k=f3(m,n);printf(" 方法三最大公约数为:%d\n",k);printf("\n--------------------\n");printf("\n计数器显示结果:\n\n\n");printf("方法一:%d \n",w2);printf("方法二:%d \n",w);printf("方法三:%d \n",w3);printf("\n--------------------\n");float a,i;clock_t start,finish;double usetime;i=0;start= clock();while (i<1000000){f1(m,n);i++;}finish=clock();usetime= finish-start;printf(" 方法一用时%.f*10^(-6) 豪秒\n", usetime);i=0;start= clock();while (i<1000000){f2(m,n);i++;}finish=clock();usetime= finish-start;printf(" 方法二用时%.f*10^(-6) 豪秒\n", usetime);i=0;start= clock();while (i<1000000){f3(m,n);i++;}finish=clock();usetime= finish-start;printf(" 方法三用时%.f*10^(-6) 豪秒\n", usetime); }结果:(示例)。
c语言求两个数最大公约数,穷举法的时间复杂度C语言求两个数最大公约数,穷举法的时间复杂度在计算机科学领域中,我们经常需要解决各种数学问题,例如求两个数的最大公约数。
而在C语言中,我们可以使用穷举法(也称为暴力法)来求解最大公约数。
在本篇文章中,我们将深入探讨C语言中求两个数最大公约数的问题,并分析穷举法的时间复杂度。
1. 最大公约数的概念最大公约数指的是两个或多个整数共有约数中最大的一个。
在数学上,常用的求最大公约数的方法有辗转相除法、更相减损术和质因数分解法等。
而在计算机科学中,我们可以使用穷举法来求解最大公约数。
下面,我们将以C语言为例,介绍如何使用穷举法来求解两个数的最大公约数。
2. C语言求最大公约数在C语言中,我们可以使用穷举法来求解两个数的最大公约数。
穷举法的基本思路是从较小的数开始,逐渐减小,直到找到两个数的一个公约数为止。
以下是一个简单的C语言程序示例:```c#include <stdio.h>int gcd(int a, int b) {int min = a < b ? a : b;int max = a > b ? a : b;int result = 0;for (int i = 1; i <= min; i++) {if (min % i == 0 && max % i == 0) {result = i;}}return result;}int main() {int a, b;printf("请输入两个整数:");scanf("%d %d", &a, &b);printf("它们的最大公约数是:%d\n", gcd(a, b)); return 0;}```3. 穷举法的时间复杂度穷举法的时间复杂度可以通过一个简单的分析得出。
在上面的C语言程序中,我们使用了一个for循环来进行穷举。
最大公约数的方法及其原理
求最大公约数的方法有多种,下面介绍其中两种常用的方法及其原理:
1. 辗转相除法(又称欧几里德算法):假设两个数为a和b,其中a>b。
通过a除以b得到余数r,再用b除以r得到余数
r1,依此类推直到余数为0为止。
此时,b即为最大公约数。
原理:根据辗转相除法,假设a=b*q+r,其中q为商,r为余数(0<=r<b)。
如果c同时是a和b的公约数,那么c也是a 和r的公约数,反之亦然。
因此,可以通过连续除法的过程,不断更新a和b的值,最终得到最大公约数。
2. 更相减损术:假设两个数为a和b,其中a>b。
通过用a-b 得到差c,然后用c和较小的数b进行同样的操作,直到a、b 相等,此时a(或b)即为最大公约数。
原理:更相减损术的思路是将较大数减去较小数,得到一个新的差值。
如果c同时是a和b的公约数,那么c也是b和差值c的公约数,反之亦然。
通过连续的减法操作,最终得到最大公约数。
这两种方法都是经典的求最大公约数的算法,但是辗转相除法相较于更相减损术的效率更高,因此在实际应用中更常使用辗转相除法计算最大公约数。
最大公约数算法复杂度分析与Java实现一、概述最大公约数(Greatest Common Divisor,简称GCD)是数论中的一个重要概念,常用于对两个整数的约数进行求解。
在实际应用中,对于两个数的最大公约数的求解经常会涉及到性能优化和算法复杂度的分析。
本文将对最大公约数算法的复杂度进行详细分析,并通过Java语言实现最大公约数算法。
二、最大公约数算法复杂度分析1. 暴力枚举法暴力枚举法是求解最大公约数的一种基本方法,其思想是通过遍历从1到两个整数中较小的一个数,找出它们的公共约数中的最大值。
该方法的时间复杂度为O(min(a, b)),其中a和b分别为两个整数。
2. 辗转相除法辗转相除法,又称欧几里德算法,是一种更有效的求解最大公约数的方法。
其基本思想是用较大的数除以较小的数,然后用上一步得到的余数再去除上一步的除数,一直重复这个过程,直到余数为0。
这时,除数就是最大公约数。
该方法的时间复杂度为O(log(max(a, b)))。
3. Stein算法Stein算法是一种更优化的求解最大公约数的方法,它结合了辗转相除法和位运算的思想。
该方法的时间复杂度为O(log(min(a, b)))。
4. 更优化的算法除了上述提到的算法,还有其他一些更为优化的最大公约数算法,比如质因数分解法、线性时间复杂度算法等。
辗转相除法和Stein算法是较为常用且性能较优的最大公约数算法,对于大整数的最大公约数求解,采用这两种算法能够更好地平衡性能和时间复杂度的需求。
三、Java实现最大公约数算法下面通过Java语言分别对辗转相除法和Stein算法进行实现。
1. 辗转相除法的Java实现```javapublic int gcd(int a, int b) {while (b != 0) {int temp = a b;a = b;b = temp;}return a;}```2. Stein算法的Java实现```javapublic int gcd(int a, int b) {if (a == b) {return a;}if (a == 0) {return b;}if (b == 0) {return a;}if ((~a 1) != 0) {if ((b 1) != 0) {return gcd(a >> 1, b);} else {return gcd(a >> 1, b >> 1) << 1; }}if ((~b 1) != 0) {return gcd(a, b >> 1);}if (a > b) {return gcd((a - b) >> 1, b);}return gcd((b - a) >> 1, a);}```四、总结最大公约数算法的性能对于整数处理和数论计算有着重要的影响。
,昆明理工大学信息工程与自动化学院学生实验报告( 2011 —2012 学年第 1 学期)课程名称:算法设计与分析开课实验室:信自楼机房444 2011 年10月 12日!一、上机目的及内容1.上机内容求两个自然数m和n的最大公约数。
2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
?二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)&1台PC及VISUAL C++软件四、实验方法、步骤(或:程序代码或操作过程)实验采用三种方法求最大公约数1、连续整数检测法。
2、欧几里得算法@3、分解质因数算法根据实现提示写代码并分析代码的时间复杂度:方法一:int f1(int m,int n){int t;if(m>n)t=n;else t=m;-while(t){if(m%t==0&&n%t==0)break;else t=t-1;}return t;}根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2;!方法二:int f2(int m,int n){int r;r=m%n;while(r!=0){m=n;n=r;—r=m%n;}return n;}根据代码辗转相除得到欧几里得的O(n)= log n方法三:int f3(int m,int n):{int i=2,j=0,h=0;int a[N],b[N],c[N];while(i<n){if(n%i==0){j++;。
最大公约数的计算方法最大公约数是数学中的基本概念之一,是指两个或多个数中最大的公约数。
在数学运算中,求解最大公约数是非常重要的,因此有多种计算方法,下面为大家介绍一些简便易行的方法。
一、辗转相除法辗转相除法,也称为欧几里得算法,是求两个数的最大公约数的常用方法之一。
该方法通过逐步取余,不断缩小问题规模,最终得出结果。
具体步骤如下:1. 将两个数中较大的数除以较小的数,得到余数。
2. 将较小的数和余数作为新的两个数,再次执行第一步操作。
3. 重复以上步骤,直到余数为0为止,此时的除数即为最大公约数。
下面以70和45为例,进行演示:1. 70 ÷ 45 = 1 余 252. 45 ÷ 25 = 1 余 203. 25 ÷ 20 = 1 余 54. 20 ÷ 5 = 4 余 0因此,70和45的最大公约数为5。
二、更相减损术更相减损术是中国古代传统的算术方法之一,也适用于求两个整数的最大公约数。
该方法通过不断相减,使得两个数的差趋近于最大公约数。
具体步骤如下:1. 将两个数中较大的数减去较小的数,得到差值。
2. 将较小的数和差值作为新的两个数,再次执行第一步操作。
3. 重复以上步骤,直到两个数相等或其中一个数为0,则最后的数即为最大公约数。
下面以80和56为例,进行演示:1. 80 - 56 = 242. 56 - 24 = 323. 32 - 24 = 84. 24 - 8 = 165. 16 - 8 = 8因此,80和56的最大公约数为8。
三、质因数分解法质因数分解法是将数分解为质因数的乘积,然后根据质因数的公共部分求出最大公约数的方法。
该方法适用于小数的求解。
具体步骤如下:1. 将两个数分别分解为质因数的乘积。
2. 将相同的质因数乘起来,得到公共部分。
3. 公共部分中的质因数乘积即为最大公约数。
下面以28和70为例,进行演示:1. 28 = 2 × 2 × 7,70 = 2 × 5 × 72. 相同的质因数有2和7,2 × 7 = 14因此,28和70的最大公约数为14。
最大公约数计算方法最大公约数(Greatest Common Divisor,简称GCD)是数学中的一个重要概念,指两个或多个整数共有约数中最大的一个。
在日常生活和编程中,我们经常需要计算两个数的最大公约数。
本文将详细介绍最大公约数的计算方法。
一、列举法列举法是最直观的计算最大公约数的方法。
首先,分别列出两个数的所有约数,然后找出最大的共同约数。
例如,计算48和18的最大公约数:48的约数有:1,2,3,4,6,8,12,16,24,4818的约数有:1,2,3,6,9,18最大公约数为6。
二、辗转相除法(也称欧几里得算法)辗转相除法是一种更高效的计算最大公约数的方法。
具体步骤如下:1.将两个数a和b进行比较,使a≥b。
2.用a除以b,得到余数r(0≤r<b)。
3.若r=0,则b即为两数的最大公约数。
4.若r≠0,则用b除以r,得到新的余数。
5.重复步骤2和3,直到余数为0。
例如,计算48和18的最大公约数:48 ÷ 18 = 2 余数1218 ÷ 12 = 1 余数612 ÷ 6 = 2 余数0因此,最大公约数为6。
三、更相减损术更相减损术是中国古代数学家发明的一种计算最大公约数的方法。
具体步骤如下:1.将两个数a和b进行比较,使a≥b。
2.用a减去b,得到差值c。
3.若c等于b,则b即为两数的最大公约数。
4.若c大于b,则用c减去b,得到新的差值。
5.重复步骤2和3,直到差值等于b。
例如,计算48和18的最大公约数:48 - 18 = 3030 - 18 = 1218 - 12 = 6因此,最大公约数为6。
四、使用编程语言计算最大公约数在许多编程语言中,都有现成的函数或方法可以计算最大公约数。
例如,在Python中,可以使用math模块的gcd函数计算最大公约数:```pythonimport matha = 48b = 18print(math.gcd(a, b)) # 输出结果为6```总结:最大公约数的计算方法有多种,包括列举法、辗转相除法、更相减损术等。
求解最大公约数问题最大公约数(Greatest Common Divisor, 简称GCD)是数论中一个重要的概念,用来表示两个或多个整数中最大的能够同时整除它们的正整数。
在数学和计算机科学领域,求解最大公约数问题有着广泛的应用,包括简化分数、判断两个数是否互质、简化矩阵等。
求解最大公约数的问题可以使用多种方法和算法来解决,下面将介绍其中的几种常用算法。
一、欧几里得算法(辗转相除法)欧几里得算法是求解最大公约数问题最常用的算法之一。
该算法基于一个简单的原理:两个整数a和b(a > b)的最大公约数等于a除以b的余数c和b之间的最大公约数。
具体步骤如下:1. 将较大的数a除以较小的数b,得到商q和余数c;2. 如果余数c等于0,则b即为最大公约数;3. 如果余数c不等于0,则将b赋值给a,将余数c赋值给b,然后继续进行第1步。
欧几里得算法的复杂度较低,适用于大部分正整数的最大公约数求解。
二、更相减损术法更相减损术法也是一种古老的求解最大公约数的方法。
该方法基于一个简单的原理:两个整数a和b(a > b)的最大公约数等于a减去b的差d和b之间的最大公约数。
具体步骤如下:1. 如果a等于b,则a即为最大公约数;2. 如果a不等于b,则计算两者之间的差d,将较大数赋值给a,将差d赋值给b,然后继续进行第1步。
更相减损术法的应用范围有限,对于较大的数值可能会出现较大的差值,导致算法效率降低。
三、辗转相减法和移位结合辗转相减法和移位结合是一种结合了欧几里得算法和更相减损术法的改进算法。
该算法的主要思想是在更相减损术法的基础上添加了位移操作,以减少差值的大小。
具体步骤如下:1. 如果a和b均为偶数,则a和b同时右移一位,继续进行该步骤,直到其中一个数为奇数;2. 如果a为偶数、b为奇数,则将a右移一位,继续进行该步骤,直到a为奇数;3. 如果b为偶数、a为奇数,则将b右移一位,继续进行该步骤,直到b为奇数;4. 此时,再使用更相减损术法计算a和b的差值d,并替换其中较大的数为d;5. 重复上述步骤,直到a和b相等,该相等的值即为最大公约数。
最大公约数的三种算法复杂度分析时间计算
1.辗转相除法(欧几里得算法)
辗转相除法是一种基于递归的算法,它通过不断地用两个数中较大的
数除以较小的数,直到两个数相等为止。
这时,较小的数就是最大公约数。
例如,求解49和28的最大公约数:
-49÷28=1 (21)
-28÷21=1 (7)
-21÷7=3 0
所以最大公约数为7
辗转相除法的时间复杂度分析如下:
设两个数中较大的数为a,较小的数为b,a mod b 的结果为r。
- 最好情况:当b能够整除a时,时间复杂度为O(loga),因为每次
递归时a和b的值都会减少至原来的一半。
-最坏情况:当a和b互质时,时间复杂度为O(a/b)。
例如,当a=2n 时,每次递归的b的值都会减少至1
- 平均情况:时间复杂度是O(logab)的。
2.更相减损术
更相减损术是一种基于减法的算法,它通过不断地用两个数中较大的
数减去较小的数,直到两个数相等为止。
这时,较小的数就是最大公约数。
例如,求解49和28的最大公约数:
-28-21=7
-21-7=14
-14-7=7
所以最大公约数为7
更相减损术的时间复杂度分析如下:
设两个数中较大的数为a,较小的数为b。
- 最好情况:当a和b的差值为1时,时间复杂度为O(logb),因为
每次减法操作后的差值都会减少一半。
-最坏情况:当a和b互质时,时间复杂度为O(a-b)。
例如,当a=2n 时,每次减法操作的差值都会减少至1
-平均情况:时间复杂度为O(a-b)的。
3. Stein算法(二进制法)
Stein算法是一种基于位运算的算法,它通过在两个数中同时除去2
的因子,直到两个数都变为奇数。
然后,继续用较小的数减去较大的数,
直到两个数相等为止。
这时,较小的数就是最大公约数的2的因子。
例如,求解49和28的最大公约数:
-49÷2=24
-28÷2=14
-24÷2=12
现在两个数都是奇数,继续减法操作:
-7-12=-5
-12-7=5
所以最大公约数为5
Stein算法的时间复杂度分析如下:
设两个数中较大的数为a,较小的数为b。
- 最好情况:当a和b的二进制表示中有大量的共同尾部0时,时间复杂度为O(logab),因为每次位运算操作都会将两个数的二进制表示右移一位。
- 最坏情况:当a和b互质时,时间复杂度为O(logab)。
例如,当a=2n时,位运算操作的次数等于a的二进制表示的位数。
- 平均情况:时间复杂度为O(logab)的。
综上所述,辗转相除法、更相减损术和Stein算法的时间复杂度分别为O(logab)、O(a-b)和O(logab)。
其中,辗转相除法和Stein算法是比较高效的求解最大公约数的算法,而更相减损术的性能则较差。