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

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 閱讀(5500) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(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>
            亚洲国产成人午夜在线一区 | 亚洲成色999久久网站| 国产精品成人一区二区| 欧美精品在线免费播放| 欧美精品成人91久久久久久久| 欧美大片在线观看一区| 欧美日韩国产美女| 国产精品久久一区主播| 国产一区二区高清视频| 亚洲国产精品久久久久婷婷老年 | 一本色道久久综合狠狠躁篇的优点| 亚洲人成毛片在线播放| 亚洲婷婷综合色高清在线| 欧美一级日韩一级| 免费成人黄色av| 亚洲高清视频的网址| 日韩五码在线| 欧美亚洲系列| 欧美成人午夜剧场免费观看| 国产精品爱久久久久久久| 国产亚洲一二三区| 99re热精品| 久热爱精品视频线路一| 99热精品在线| 免费成人美女女| 国产精品日韩在线观看| 亚洲激情在线观看视频免费| 亚洲欧美在线免费| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美高清日韩| 国产一区二区三区自拍| 日韩午夜高潮| 免费亚洲婷婷| 午夜一区不卡| 欧美午夜精品理论片a级按摩| 国产亚洲aⅴaaaaaa毛片| 99视频超级精品| 麻豆成人在线播放| 亚洲欧美美女| 国产精品久久7| 一区二区av在线| 欧美福利小视频| 久久av免费一区| 国产精品一区二区男女羞羞无遮挡| 亚洲人成亚洲人成在线观看| 久久偷看各类wc女厕嘘嘘偷窃| 91久久综合| 久久综合给合久久狠狠色| 一区二区日韩| 欧美成人午夜影院| 欧美一二三区在线观看| 国产精品美女久久久免费| 日韩午夜中文字幕| 欧美激情在线有限公司| 久久久一二三| 在线成人性视频| 噜噜噜噜噜久久久久久91| 性欧美长视频| 国产一区二区三区在线观看精品 | 国产精品啊v在线| 9人人澡人人爽人人精品| 欧美xx69| 欧美大片免费久久精品三p| 最新中文字幕一区二区三区| 欧美成人免费小视频| 久久香蕉国产线看观看av| 黄网站免费久久| 美女主播精品视频一二三四| 亚洲欧美国产日韩中文字幕| 欧美日韩亚洲高清| 亚洲免费福利视频| 久热成人在线视频| 久久久精品一区二区三区| 国产欧美在线播放| 性欧美暴力猛交另类hd| 欧美一区二区三区在线| 伊人成人开心激情综合网| 亚洲福利视频二区| 欧美精品97| 欧美在线不卡视频| 日韩一级裸体免费视频| 欧美天堂亚洲电影院在线播放| 亚洲视频精品在线| 亚洲亚洲精品在线观看| 国产精品一区二区在线观看不卡| 久久精品视频在线观看| 久久综合伊人77777麻豆| 亚洲伦理久久| 亚洲一区二区欧美日韩| 韩国一区二区三区美女美女秀| 欧美国产日韩免费| 欧美性理论片在线观看片免费| 久久精品国产在热久久| 嫩模写真一区二区三区三州| 亚洲欧美成人一区二区在线电影 | 亚洲级视频在线观看免费1级| 欧美日韩伦理在线免费| 欧美一区二区三区在线| 美女在线一区二区| 亚洲欧美卡通另类91av| 久久大综合网| 欧美人妖另类| 久久久久国产一区二区三区四区| 美国成人直播| 西瓜成人精品人成网站| 免费成人黄色片| 久久精品国产亚洲高清剧情介绍| 欧美乱人伦中文字幕在线| 久久久久久久国产| 欧美视频三区在线播放| 欧美肥婆bbw| 国产精品有限公司| 亚洲精品色图| 亚洲国产欧美一区| 久久狠狠婷婷| 欧美综合国产| 国产精品美女999| 亚洲日韩欧美视频一区| 亚洲国产高清高潮精品美女| 欧美亚洲自偷自偷| 欧美一区91| 国产精品久久久久久久久久久久久 | 亚洲经典在线| 亚洲黄色影院| 久久九九全国免费精品观看| 午夜日韩在线| 国产精品萝li| 在线一区二区三区四区| 一区二区三区四区五区精品| 欧美成人精品一区| 欧美91精品| 在线精品国精品国产尤物884a| 亚洲欧美日韩精品久久亚洲区| 亚洲免费视频网站| 欧美性大战xxxxx久久久| 亚洲精品在线视频观看| 99国产精品自拍| 欧美精品免费播放| 亚洲日本va午夜在线电影| 亚洲精品免费电影| 欧美好吊妞视频| 亚洲精品一区二区三区av| 99在线精品观看| 国产精品久久| 久久精彩免费视频| 欧美jizz19hd性欧美| 亚洲欧洲精品一区二区三区 | 99国产一区二区三精品乱码| 亚洲性视频网站| 国产精品国产一区二区| 亚洲在线播放| 久久婷婷久久一区二区三区| 在线日韩欧美| 欧美精品在线观看| 亚洲欧美电影在线观看| 久久久最新网址| 亚洲国产欧美一区二区三区同亚洲| 亚洲人成啪啪网站| 99精品久久免费看蜜臀剧情介绍| 欧美人在线观看| 亚洲一区免费| 久久一本综合频道| 日韩视频一区二区在线观看 | 亚洲自拍偷拍色片视频| 久久狠狠一本精品综合网| 影音先锋日韩精品| 欧美日韩1234| 久久黄色级2电影| 亚洲精选成人| 久久午夜精品一区二区| 亚洲精品视频啊美女在线直播| 欧美日韩亚洲一区二| 欧美一区二区| 亚洲精品乱码久久久久久日本蜜臀| 亚洲欧美美女| 91久久精品一区| 国产日韩欧美一区二区三区在线观看 | 亚洲美女在线看| 国产欧美在线看| 欧美激情成人在线| 欧美一级午夜免费电影| 亚洲激情成人| 久久夜色撩人精品| 亚洲男人的天堂在线| 亚洲国产精品电影在线观看| 欧美特黄一区| 欧美区日韩区| 老司机67194精品线观看| 中文久久精品| 亚洲国产高潮在线观看| 久久久91精品国产| 亚洲欧美日韩国产一区| 亚洲精品欧美日韩| 在线播放不卡| 国产亚洲成年网址在线观看| 欧美日韩一区视频| 欧美激情一区二区三区蜜桃视频| 久久精品国产成人| 午夜激情久久久| 亚洲午夜精品网|