日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

欧几里得算法(即辗转相除法)的时间复杂度

發(fā)布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 欧几里得算法(即辗转相除法)的时间复杂度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文是參考新浪博客而寫。
歐幾里得算法, 又稱輾轉(zhuǎn)相除法, 用于求兩個自然數(shù)的最大公約數(shù). 算法的思想很簡單, 基于下面的數(shù)論等式
gcd(a, b) = gcd(b, a mod b)
其中g(shù)cd(a, b)表示a和b的最大公約數(shù), mod是模運算, 即求a除以b的余數(shù). 代碼如下:

#include <iostream> #include <math.h> using namespace std;int gcd1(int a,int b)//遞歸版本 {if (a<b){int temp=a;a=b;b=temp;}if (b==0){return a;}else{return gcd1(b,a%b);} } int gcd2(int a,int b)//循環(huán)版本 {if (a<b){int temp=a;a=b;b=temp;}while ( b!=0){int c=a%b;a=b;b=c;}return a; } int main() {int a,b;cout<<"請輸入兩個正數(shù):"<<endl;cin>>a>>b;cout<<a<<"與"<<b<<"的最大公約數(shù)是:"<<gcd2(a,b)<<endl;//cout<<a<<"與"<<b<<"的最大公約數(shù)是:"<<gcd1(a,b)<<endl;}

歐幾里得算法是最古老而經(jīng)典的算法, 理解和掌握這一算法并不難, 但要分析它的時間復(fù)雜度卻并不容易. 我們先不考慮模運算本身的時間復(fù)雜度(算術(shù)運算的時間復(fù)雜度在Knuth的TAOCP中有詳細(xì)的討論), 我們只考慮這樣的問題: 歐幾里得算法在最壞情況下所需的模運算次數(shù)和輸入的a和b的大小有怎樣的關(guān)系?
我們不妨設(shè)a>b1, 構(gòu)造數(shù)列{un}:

u0=a,u1=b,...,uk=uk?2moduk?1(k2),
顯然, 若算法需要n次模運算, 則有 un=gcd(a,b),un+1=0. 我們比較數(shù)列 {un}和菲波那契數(shù)列 {Fn},
un1=F0un?11=F1 又因為由 ukmoduk+1=uk+2,可得 uk=uk+1×β+uk+2uk+1+uk+2,故可得 un?2un?1+unF0+F1=F2 ,以此類推,由數(shù)學(xué)歸納法容易得到 un?kFk, 也就是 ukFn?k 于是得到 a=u0Fn,b=u1Fn?1. 也就是說如果歐幾里得算法需要做n次模運算, 則b必定不小于 Fn?1. 根據(jù)斐波那契數(shù)列的性質(zhì), 有 Fn?1>(1.618)n5 , 即 b>(1.618)n5, 所以模運算的次數(shù)為 O(lgb).

總結(jié)

以上是生活随笔為你收集整理的欧几里得算法(即辗转相除法)的时间复杂度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。