青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
轉自:::::http://blog.chinaunix.net/u2/76292/showart_1418158.html
1. 歐幾里德算法和擴展歐幾里德算法

歐幾里德算法
歐幾里德算法又稱輾轉相除法,用于計算兩個整數a,b的最大公約數。其計算原理依賴于下面的定理:

定理:gcd(a,b) = gcd(b,a mod b)

證明:a可以表示成a = kb + r,則r = a mod b
假設d是a,b的一個公約數,則有
d|a, d|b,而r = a - kb,因此d|r
因此d是(b,a mod b)的公約數

假設d 是(b,a mod b)的公約數,則
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公約數

因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證

歐幾里德算法就是根據這個原理來做的,其算法用C++語言描述為:

int Gcd(int a, int b)
{
    
if(b == 0)
        
return a;
    
return Gcd(b, a % b);
}

當然你也可以寫成迭代形式:
int Gcd(int a, int b)
{
    
while(b != 0)
    
{
        
int r = b;
        b 
= a % b;
        a 
= r;
    }

    
return a;
}

本質上都是用的上面那個原理。

補充: 擴展歐幾里德算法是用來在已知a, b求解一組p,q使得p * a+q  * b = Gcd(a, b)  (解一定存在,根據數論中的相關定理)。擴展歐幾里德常用在求解模線性方程及方程組中。下面是一個使用C++的實現:
int exGcd(int a, int b, int &x, int &y)
{
    
if(b == 0)
    
{
        x 
= 1;
        y 
= 0;
        
return a;
    }

    
int r = exGcd(b, a % b, x, y);
    
int t = x;
    x 
= y;
    y 
= t - a / b * y;

    
return r;
}

把這個實現和Gcd的遞歸實現相比,發現多了下面的x,y賦值過程,這就是擴展歐幾里德算法的精髓。
可以這樣思考:
對于a' = b, b' = a % b 而言,我們求得 x, y使得 a'x + b'y = Gcd(a', b')
由于b' = a % b = a - a / b * b (注:這里的/是程序設計語言中的除法)
那么可以得到:
a'x + b'y = Gcd(a', b')  ===>
bx + (a - a / b * b)y = Gcd(a', b') = Gcd(a, b)  ===>
ay +b(x - a / b*y) = Gcd(a, b)
因此對于a和b而言,他們的相對應的p,q分別是 y和(x-a/b*y)

2. Stein算法
歐幾里德算法是計算兩個數最大公約數的傳統算法,他無論從理論還是從效率上都是很好的。但是他有一個致命的缺陷,這個缺陷只有在大素數時才會顯現出來。

考慮現在的硬件平臺,一般整數最多也就是64位,對于這樣的整數,計算兩個數之間的模是很簡單的。對于字長為32位的平臺,計算兩個不超過32位的整數的模,只需要一個指令周期,而計算64位以下的整數模,也不過幾個周期而已。但是對于更大的素數,這樣的計算過程就不得不由用戶來設計,為了計算兩個超過 64位的整數的模,用戶也許不得不采用類似于多位數除法手算過程中的試商法,這個過程不但復雜,而且消耗了很多CPU時間。對于現代密碼算法,要求計算 128位以上的素數的情況比比皆是,設計這樣的程序迫切希望能夠拋棄除法和取模。 (注:說到拋棄除法和取模,其實輾轉相除法可以寫成減法的形式)

Stein算法由J. Stein 1961年提出,這個方法也是計算兩個數的最大公約數。和歐幾里德算法 算法不同的是,Stein算法只有整數的移位和加減法,這對于程序設計者是一個福音。

為了說明Stein算法的正確性,首先必須注意到以下結論:

gcd(a,a) = a,也就是一個數和他自身的公約數是其自身
gcd(ka,kb) = k gcd(a,b),也就是最大公約數運算和倍乘運算可以交換,特殊的,當k=2時,說明兩個偶數的最大公約數必然能被2整除。

有了上述規律就可以給出Stein算法如下:

如果A=0,B是最大公約數,算法結束
如果B=0,A是最大公約數,算法結束
設置A1 = A、B1=B和C1 = 1
如果An和Bn都是偶數,則An+1 =An /2,Bn+1 =Bn /2,Cn+1 =Cn *2(注意,乘2只要把整數左移一位即可,除2只要把整數右移一位即可)
如果An是偶數,Bn不是偶數,則An+1 =An /2,Bn+1 =Bn ,Cn+1 =Cn (很顯然啦,2不是奇數的約數)
如果Bn是偶數,An不是偶數,則Bn+1 =Bn /2,An+1 =An ,Cn+1 =Cn (很顯然啦,2不是奇數的約數)
如果An和Bn都不是偶數,則An+1 =|An -Bn|,Bn+1 =min(An,Bn),Cn+1 =Cn
n++,轉4
這個算法的原理很顯然,所以就不再證明了。現在考察一下該算法和歐幾里德方法效率上的差別。

給出一個C++的實現:

int Gcd(int a, int b)
{
    
if(a == 0return b;
    
if(b == 0return a;
    
if(a % 2 == 0 && b % 2 == 0return 2 * gcd(a >> 1, b >> 1);
    
else if(a % 2 == 0)  return gcd(a >> 1, b);
    
else if(b % 2 == 0return gcd(a, b >> 1);
    
else return gcd(abs(a - b), Min(a, b));
}

考慮歐幾里德算法,最惡劣的情況是,每次迭代a = 2b -1,這樣,迭代后,r= b-1。如果a小于2N,這樣大約需要 4N次迭代。而考慮Stein算法,每次迭代后,顯然AN+1BN+1≤ ANBN/2,最大迭代次數也不超過4N次。也就是說,迭代次數幾乎是相等的。但是,需要注意的是,對于大素數,試商法將使每次迭代都更復雜,因此對于大素數Stein將更有優勢

練習:
OJ上面的赤裸裸的Gcd算法的題不多,大多都是套了一個外殼。
找了兩道,可以試試看
HDOJ 2028 Lowest Common Multiple Plus   這個是求n個數的最小公倍數(有了最大公約數,最小公倍數應該很容易了)
ZJU 2678 Bishops on a Toral Board  這個題目要發現規律,不錯的題目很老的東東了,其實也沒啥好整理的,網上很多資料了,就當備用把:-)
posted on 2009-05-31 19:09 chatler 閱讀(5503) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费观看在线观看| 欧美性猛交xxxx免费看久久久| 国产精品久久久对白| 亚洲午夜国产一区99re久久| 亚洲区免费影片| 欧美激情久久久| 一本色道久久综合亚洲精品高清| 亚洲精品一线二线三线无人区| 欧美色道久久88综合亚洲精品| 亚洲免费影视| 欧美中文字幕久久| 久久九九国产精品| 亚洲理论在线观看| 亚洲一区二区在线| 影音先锋久久久| 亚洲精品国精品久久99热一| 国产精品乱码人人做人人爱| 久久综合亚洲社区| 欧美精品成人一区二区在线观看| 在线中文字幕日韩| 久久久福利视频| 一本色道久久综合亚洲精品按摩| 亚洲自拍都市欧美小说| 亚洲高清一二三区| 亚洲性色视频| 最新国产成人av网站网址麻豆| 一区二区三区导航| 亚洲国产精选| 亚洲综合日韩| 一区二区三区精品在线 | 亚洲人成小说网站色在线| 亚洲精品影院在线观看| 韩日视频一区| 亚洲视频一区在线| 亚洲日本aⅴ片在线观看香蕉| 亚洲免费影院| 一区二区三区回区在观看免费视频| 久久国产欧美日韩精品| 亚洲——在线| 欧美日产在线观看| 欧美风情在线| 黄色影院成人| 亚洲欧美综合| 亚洲一区在线播放| 欧美日本免费| 亚洲精品老司机| 亚洲片国产一区一级在线观看| 香蕉久久夜色精品国产使用方法 | 国产午夜精品理论片a级探花| 亚洲大片精品永久免费| 精品91在线| 欧美在线网址| 久久久成人精品| 国产精品揄拍一区二区| 日韩午夜免费| 一区电影在线观看| 久久亚洲综合色一区二区三区| 久久精品一区二区| 国产亚洲精品美女| 欧美亚洲一区二区在线| 性色av一区二区三区在线观看| 欧美性大战xxxxx久久久| 亚洲最新合集| 亚洲欧美日韩成人高清在线一区| 欧美日韩精品一区二区三区| 亚洲国产视频直播| 夜夜嗨av一区二区三区免费区| 欧美大片在线影院| 亚洲欧洲一区二区三区久久| 亚洲国产精品精华液网站| 欧美有码在线观看视频| 老鸭窝91久久精品色噜噜导演| 黑人极品videos精品欧美裸| 久久国产精品99久久久久久老狼| 久久精品国产精品| 久久久久久久97| 欧美高清在线视频| 亚洲精品美女久久7777777| 欧美理论电影在线播放| 一区二区av在线| 久久国产精品一区二区| 精品999久久久| 欧美国产激情| 一级成人国产| 久久久久久久综合| 亚洲日韩欧美视频一区| 国产精品yjizz| 欧美一区二区三区久久精品茉莉花 | 欧美日韩国产不卡在线看| 亚洲午夜电影| 美女成人午夜| 亚洲在线国产日韩欧美| 国模精品娜娜一二三区| 欧美xart系列高清| 亚洲欧美一区二区视频| 亚洲高清不卡av| 亚洲欧美国内爽妇网| 狠狠入ady亚洲精品| 欧美好吊妞视频| 亚欧成人在线| 亚洲精品视频在线| 久久久久久亚洲精品中文字幕| 亚洲伦理在线| 国内成人精品一区| 欧美日韩在线免费视频| 久久久久久久999| 亚洲午夜未删减在线观看| 欧美肥婆在线| 久久久99免费视频| 正在播放亚洲| 最近中文字幕mv在线一区二区三区四区| 欧美性事在线| 欧美国产精品va在线观看| 欧美伊人精品成人久久综合97| 日韩视频免费大全中文字幕| 猫咪成人在线观看| 欧美在线高清| 亚洲一区二区三区乱码aⅴ蜜桃女| 经典三级久久| 国产日韩欧美在线观看| 欧美亚州一区二区三区| 欧美黑人在线观看| 久久欧美中文字幕| 久久国产成人| 欧美亚洲视频| 午夜久久黄色| 亚洲一区二区免费看| 日韩视频中文字幕| 亚洲激情综合| 亚洲国产综合在线看不卡| 免费精品99久久国产综合精品| 欧美一级视频一区二区| 午夜精品一区二区三区电影天堂 | 激情久久久久久久久久久久久久久久| 欧美日韩在线播放一区二区| 欧美人成免费网站| 欧美精品成人91久久久久久久| 欧美成人免费小视频| 欧美成人黄色小视频| 蜜臀av性久久久久蜜臀aⅴ| 久久九九国产精品| 久久影院亚洲| 噜噜噜在线观看免费视频日韩| 久久婷婷综合激情| 另类春色校园亚洲| 欧美成人伊人久久综合网| 免费亚洲一区| 欧美精品九九| 欧美午夜激情小视频| 欧美专区一区二区三区| 久久精品人人做人人综合 | 欧美在线精品免播放器视频| 午夜精品免费在线| 久久精品亚洲| 欧美大片免费观看在线观看网站推荐| 欧美国产第一页| 欧美日韩中文字幕在线| 国产精品久久久久久久app| 国产精品视频观看| 一区在线观看视频| 亚洲人成网站影音先锋播放| 亚洲香蕉成视频在线观看| 欧美一区二区三区在线免费观看 | 久久视频精品在线| 亚洲第一精品在线| 一区二区三区精密机械公司| 午夜精品久久久99热福利| 久久久久久久波多野高潮日日| 麻豆精品一区二区av白丝在线| 欧美日本免费| 国产一二三精品| 亚洲人成在线观看| 午夜国产精品视频| 欧美第一黄色网| 亚洲视频免费在线| 久久中文字幕导航| 国产精品伦子伦免费视频| 伊人久久大香线蕉av超碰演员| 9l视频自拍蝌蚪9l视频成人| 久久电影一区| 亚洲精品四区| 久久精品人人做人人爽| 欧美三区在线视频| 在线看国产日韩| 亚洲欧美视频一区二区三区| 欧美成人亚洲| 小处雏高清一区二区三区| 欧美成人免费在线视频| 国产日韩欧美在线| 亚洲影视九九影院在线观看| 久久综合色88| 午夜精品免费| 欧美日韩一区二区三区| 在线观看日韩av电影| 午夜精品久久久久久久蜜桃app | 久久久久久久久久久久久久一区| 亚洲国产高清一区| 久久久久久亚洲精品杨幂换脸| 国产精品永久免费在线| 亚洲无线一线二线三线区别av|