精华内容
下载资源
问答
  • 计算gcd(a,b) 不妨假设a>b,这样 所以每一次余数部分都要小于输入的一半,这样轮番操作a,b 最终的时间复杂度是O(log n)的

    计算gcd(a,b)

    不妨假设a>b,这样a=k_1b+r_1>k_1r_1+r_1\geq 2r_1

    所以每一次余数部分都要小于输入的一半,这样轮番操作a,b 最终的时间复杂度是O(log n)的

    展开全文
  • 辗转相除法时间复杂度

    万次阅读 2017-03-27 20:48:31
    以下程序是用辗转相除法来计算两个非负数之间的最大公约数: long long gcd(long long x, long long y) {  if (y == 0)  return x;  else  return gcd(y, x % y); }  我们假设x,y中最大的那个数的长度为n...

    以下程序是用辗转相除法来计算两个非负数之间的最大公约数:

    long long gcd(long long x, long long y) {
        if (y == 0)
            return x;
        else
            return gcd(y, x % y);
    }


      我们假设x,y中最大的那个数的长度为nx>y,基本运算时间复杂度为O(1),那么该程序的时间复杂度为( )

    求最大公约数的最常用的算法是欧几里得算法,也称为辗转相除法.
    问题定义为求ij的最大公约数gcd(i,j),其中ij是整数,不妨设i>j.
    算法可以递归的表示:
    1.如果j能整除i,那么gcd(i,j)=j;
    2.j不能整除i,r=i%j,那么gcd(i,j)=gcd(j,r).
    使用C语言实现:

    int gcd(int i, int j)
    {
        int r = i % j;
        return r == 0 ? j : gcd(j, r);
    }


    关键是要证明步骤 2. 正确性分析:
    算法的步骤1,显然成立(最大公约数定义).

    dij的最大公约数,
    那么i=md,j=nd,mn互质(否则d不是最大公约数).
    r=i%j可以得到i=kj+r,k=⌊m/n⌋,k≥1(我们前面假设过i>j).
    i=md,j=nd代入得到
    md=knd+r
    那么
    r=(m-kn)d
    m-knm也是互质的.
    所以得到djr的最大公约数.

    时间复杂度分析:
    逆着看该算法,最后的余数是0,倒数第二次余数是d,倒数第三次是kd,k>1…
    由于组成了一个数列,{0,d,kd,nkd+d,…}
    数列的n项加上n+1,n+2项要小,所以比斐波纳契数列增长的要快.
    我们已知斐波纳契数列增长速度是指数,那么待分析的数列也是指数增长.
    设欧几里得算法需要k,那么j=O(2^k),k=O(lg j).

    所以欧几里得算法求最大公约数的时间复杂度是对数量级的,速度非常快.

    zz from http://guozi149.me/tech/foundations/math/212

     

    展开全文
  • 斐波那契数列 注:此时 ...欧几里得算法复杂度: 我们不妨设A>B>=1(若a<b我们只需多做一次模运算, 若B=0或A=B模运算的次数分别为0和1) 构造数列{Un}:  U0=a, U1=b, Uk=Uk-2mod Uk-1(k&...

    斐波那契数列

      

    :此时  

    指数增长

      F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

    欧几里得算法复杂度:

    我们不妨设A>B>=1(若a<b我们只需多做一次模运算, 若B=0或A=B模运算的次数分别为0和1)

    构造数列{Un}:

      U0=a, U1=b, Uk=Uk-2 mod Uk-1 (k>=2)

    若算法需要n次模运算, 则有

      Un=gcd(a, b), Un+1=0

    我们比较数列{Un}和菲波那契数列{Fn}

      F0=0,F1=1<=Un ,F2=1<=Un-1

    又因为由  

      Uk mod Uk+1=Uk+2

    可得    

      Uk>=Uk+1+Uk+2     (Uk=r·Uk+1+Uk+2,r>=1) 

    由数学归纳法得到 :   

      Uk>=Fn-k+1

    于是得到:

      A=U0>=Fn+1

      B=U1>=Fn

    也就是说如果欧几里得算法需要做n次模运算, 则B必定不小于Fn.

    换句话说, 若 B<Fn, 则算法所需模运算的次数必定小于n.

    根据菲波那契数列的性质, 有

      Fn>1.618n/√5 

      b>1.618n/√5

    所以模运算的次数为 O( lg B ).

     

    转载于:https://www.cnblogs.com/Bird-Xu/p/8180036.html

    展开全文
  • 本文对欧几里得算法运行时间复杂度进行了简洁证明。证明过程仅仅利用了余数的定义。结论是该算法的时间复杂度为O(logN)。

    欧几里得算法描述

    /* 求M和N的最大公约数,假设M>=N(如果判断不满足,则直接交换)*/
    void gcd(int M,int N){
        while(n!=0){
            long rem=M%N;
            M=N;
            N=rem;
        }
    }
    

    时间复杂度证明

    证明之前先熟悉这些知识:

    1.m mod n的结果在[0,n-1]之间,如果 n > m 2 n>\frac{m}{2} n>2m,则m mod n的结果就是m -n

    2.m mod n < m 2 <\frac{m}{2} <2m

    对2的证明:

    ​ 记 remm mod n

    ​ 如果 n ≤ m 2 n\leq\frac{m}{2} n2m,,由1可知, r e m < n rem<n rem<n,则结论成立

    ​ 如果 n > m 2 n>\frac{m}{2} n>2m,则用1可知, r e m = m − n < m − m 2 = m 2 rem=m-n<m-\frac{m}{2}=\frac{m}{2} rem=mn<m2m=2m,则结论成立。

    证明过程

    知识2可知,在两次迭代之后,余数最多为原始值的一般。这就证明了迭代次数至多为 2 l o g ( N ) = O ( l o g N ) 2log(N)=O(logN) 2log(N)=O(logN).

    理解:观察欧几里得算法的执行过程,第一次迭代后余数至多为 M 2 \frac{M}{2} 2M,第二次迭代后余数至多为 N 2 \frac{N}{2} 2N

    展开全文
  • 欧几里得算法核心: gcd( a , b ) = gcd( b , a%b ) ,其中 gcd 表示 a 和 b 的最大公约数; 证明: ...设 a 和 b 的最大公约数为 c ...综上,最坏时间复杂度 约为 O(2logN) ,去掉常数即为 O(logN) , 底数为 2;
  • 辗转相除法证明及复杂度计算

    千次阅读 2016-08-30 17:45:54
    辗转相除法是计算两个数最大公约数(Greatest conmmon divisor)的一种对数复杂度算法。 问题:有两个正整数 x , y ,求 gcd(x,y): 算法证明: 设 x > y , 且 x = r + y * c , 其中 r >= 0, c >= 0 ; 1. if r = 0...
  • 首先看下辗转相除法的递归及非递归代码实现: //递归实现 int gcd(int a,int b) { return b?gcd(b,a%b):a; } //非递归实现 int gcd(int a,int b) { int t; while(b) { t = a; a = b; b = t%b; } ...
  • 欧几里得算法(即辗转相除法)的时间复杂度

    万次阅读 多人点赞 2015-03-28 16:56:34
    欧几里得算法(即辗转相除法)的时间复杂度 本文是参考新浪博客而写。 欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式 gcd(a, b) = gcd(b, a mod b) 其中...
  • 下载地址:http://pan.baidu.com/s/1jIt6UlK 转载于:https://www.cnblogs.com/cmyg/p/6604667.html
  • c++ 辗转相除法 递归非递归

    千次阅读 2016-03-26 18:22:52
    #include #include #include using namespace std;...//求最大公约数 辗转相除法 long long gcd(long long x,long long y){ if(x>y)return gcd(y,x); if(x==0)return y; return gcd(y%x,x); } long
  • 做一个实验:在10000以内两两辗转相除法,运算次数最多的是哪两个数呢? 6765和 4181 如果把上界再缩小或扩大,你会发现,出现的数都是斐波那契数列中的数,都是相邻的两项。 因为斐波那契数列相邻两项在做...
  • 图解辗转相除法

    千次阅读 2019-11-25 23:25:32
    虽然在很久很久以前刚入门ACM的时候就已经知道辗转相除法的存在,并且也用GCD解了不少题,不过说实话辗转相除法的原理一直不是很清楚。 直到最近做到这样一道题: Codeforces - 343A,本以为是一道憨批构造,结果构造...
  • 高斯消元辗转相除法复杂度分析 高斯消元在模意义下时有一种流传甚广的写法——辗转相除法复杂度也是 O(n3)O(n^3)O(n3) ,但是码量小,十分好写。 具体操作是枚举第 iii 个未知数,将除第 iii 个方程以外的其他...
  • 浅谈辗转相除法

    2021-04-26 10:38:43
    本文主要包含辗转相除法的正确性证明,以及时间复杂度证明。已经懂了的老铁可以右滑退出了(或者拉倒最下面点亮小手)~ 如何求最大公约数 给定两个正整数,求解最大公约数,代码很简单,比如直接使用__gcd: int gcd =...
  • 高中学过的求大公约数的方法就是辗转相除法和更相减损术了。 辗转相除法递归版 #include <iostream> using std::cin; using std::cout; using std::endl; int gcd(int a, int b) { return b == 0 ? a : gcd(b...
  • 辗转相除法:两个正整数a和b(a&gt;b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数。 以上代码存在取模运算,...
  • 辗转相除法 求最大公约数 问题:线上格点的个数 给定平面上两个格点(格点是指纵横坐标都为整数的点)P1=(x1,y2),P1=(x2,y2)P_1=(x_1,y_2),P_1=(x_2,y_2)P1​=(x1​,y2​),P1​=(x2​,y2​) ,线段P1P2P_1P_2P1​P2​...
  • 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 其算法用C语言描述为 int gcd(int m, int n) { if (m == 0) return n; if (n =...
  • 辗转相除法

    2017-11-23 17:51:00
    自从转载了来自圣经的算法一文后,就想把这些算法比较详细地搞清楚,先拿辗转相除法开刀了,谁让她最简单呢。呵呵。  下面的大部分内容来自维基百科。  辗转相除法,又被称为欧几里德(Euclidean)算法, 是求最大...
  • 辗转相除法详解

    千次阅读 2017-08-13 10:02:12
    欧几里得算法,又称辗转相除法,用于求两个自然数的最大公约数。算法基于数论等式gcd(a,b)=gcd(b,a mod b),其时间复杂度为O(logk),其中k=max(a,b),若k的位数为n,则时间复杂度为O(logn)。时间复杂度的证明比较麻烦...
  • 常见的时间复杂度

    2021-03-22 10:38:24
    二分法,倍增法,快速幂算法,辗转相除法 枚举法,双指针算法,单调栈算法,KMP算法,Rabin Karp,Manacher's Algorithm 又称作线性复杂度 快速排序,归并排序,堆排序 枚举法,...
  • 后附完整源代码:(含有求最大公倍数的函数,此代码测试的是...1. 辗转相除法:此种方法核心如其名,辗转,大数放a中,小数放b中。大的除以小的,余数为零,则小数为最大公约数,不为零则,将余数与b比较大的放a,...
  • long long gcd(long long x, long long y) { if (y == 0) return x; else return gcd(y, x % y); } 时间复杂度O(1),空间复杂度O(logy)
  • #include<bits/stdc++.h> using namespace std; int main() { int a,b; cin>>a>>b; if(a<b) swap(a,b); while(a%b!=0) { int c; c=b; b=...
  • 【算法】辗转相除法(欧几里得算法)备注功能介绍原理例如算法分析算法实现 备注 2019/7/30 星期二 高中数学必修三学习了“算法初步”,其中有一个叫做辗转相除的算法,这是一个神奇的算法,可以用来求两正整数的...
  • 辗转相除法 简介:辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公约数的算法。 原理:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数。 操作:用较大数除以较小数,再...
  • 我们在刚接触编程的时候,遇到求最大公因数的题,往往会选择从n-1开始用循环枚举的方法来找出能被它整除的最大的数,这种算法虽然操作简便易于理解,但时间复杂度是O(n)级别的遇到要求严格的题,可能会时间超限。...
  • 辗转相除法, 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。它是已知最古老的算法, 其可追溯至公元前300年前。 这条算法基于一个定理:两个正整数a和b(a>b),它们的最大公...
  • 辗转相除法求解最大公约数、最小公倍数 通常来说,求解两个数的最大公约数和最小公倍数是常见的算法问题,我们正常人最先想到的肯定是穷举法,通过while循环或者for循环,不断改变循环数,辗转取余判断是否为0。C++...
  • 题目给你两个正整数a和b, 输出它们的最大公约数辗转相除法辗转相除法的步骤def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd(b,a)即就是取如果b与a不能整除,就取a和b除以a的余数再考察是个递归的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,127
精华内容 850
关键字:

辗转相除法时间复杂度