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

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 閱讀(5506) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(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>
            午夜日本精品| 午夜天堂精品久久久久| 国产视频欧美视频| 亚洲美女视频在线观看| 亚洲国产成人久久综合一区| 亚洲调教视频在线观看| 亚洲精品美女91| 久久欧美肥婆一二区| 久久久久久久久久码影片| 国产精品美女久久| 夜夜精品视频一区二区| 99国产精品久久久久久久成人热 | 国产精品久99| 亚洲人成小说网站色在线| 精品999网站| 久久精品理论片| 久久免费的精品国产v∧| 国产亚洲精品7777| 午夜精品理论片| 久久高清一区| 国产一区二区按摩在线观看| 性18欧美另类| 久久精品国产免费观看| 国产亚洲精品一区二555| 亚洲欧美在线一区| 久久久久国色av免费看影院| 国产日产亚洲精品系列| 欧美一区二区三区视频免费播放 | 亚洲全部视频| aⅴ色国产欧美| 欧美午夜精品久久久久久久| 在线视频亚洲欧美| 欧美尤物一区| 极品少妇一区二区三区精品视频 | 午夜精品久久久久久久白皮肤| 亚洲女性裸体视频| 国产婷婷97碰碰久久人人蜜臀| 欧美一区二区精品久久911| 久久久久欧美精品| 91久久在线观看| 欧美人与禽猛交乱配| 亚洲五月六月| 久久夜精品va视频免费观看| 亚洲国产精品小视频| 欧美精品网站| 亚洲一卡久久| 免费人成精品欧美精品| 一本色道久久综合亚洲91| 国产精品视频免费| 久久久久国产精品午夜一区| 亚洲国产成人久久综合一区| 亚洲深夜福利视频| 国外成人在线视频| 欧美看片网站| 久久精品国产77777蜜臀| 亚洲福利国产| 欧美一区激情| 亚洲免费观看在线视频| 国产精品日韩高清| 欧美 日韩 国产一区二区在线视频| 亚洲久久视频| 久久人人97超碰精品888| 99国产精品久久久久老师| 国产精品永久免费视频| 美女视频一区免费观看| 亚洲欧美国产77777| 亚洲第一在线综合在线| 亚洲欧美在线另类| 亚洲片区在线| 国产在线欧美日韩| 欧美天堂在线观看| 欧美成人xxx| 久久久精品国产99久久精品芒果| 亚洲精品永久免费| 免费观看成人www动漫视频| 亚洲欧美一区二区在线观看| 亚洲激情影院| 精品二区久久| 国产欧美一区二区三区国产幕精品 | 国产精品99久久久久久久久| 依依成人综合视频| 国产精品手机视频| 欧美日韩一二三区| 美女视频黄a大片欧美| 欧美一区二区三区免费观看| av成人黄色| 亚洲人体大胆视频| 亚洲电影毛片| 欧美jizz19性欧美| 久久人人爽人人爽爽久久| 欧美一区成人| 亚洲一区在线免费| 亚洲午夜一二三区视频| 日韩视频中文字幕| 亚洲精品乱码久久久久久蜜桃麻豆| 黑人巨大精品欧美黑白配亚洲| 国产乱人伦精品一区二区| 国产精品久久久| 欧美亚洲成人精品| 欧美视频日韩| 欧美午夜免费| 欧美午夜精品理论片a级大开眼界| 欧美激情综合五月色丁香| 欧美成人69av| 欧美紧缚bdsm在线视频| 欧美国产在线视频| 欧美精品18+| 欧美美女bb生活片| 欧美午夜激情小视频| 国产精品成人在线| 国产精品在线看| 国产模特精品视频久久久久| 国产欧美日韩不卡免费| 国产一区二区精品久久99| 国产麻豆精品久久一二三| 国产视频综合在线| 黄色小说综合网站| 亚洲国产精品悠悠久久琪琪| 最新日韩在线| 亚洲深夜福利网站| 欧美一区二区三区四区在线观看地址 | 欧美激情a∨在线视频播放| 欧美激情一区二区三区| 亚洲国产精品久久久久婷婷老年| 亚洲第一在线综合网站| 日韩午夜激情电影| 午夜一区二区三区不卡视频| 久久国产精品黑丝| 欧美激情偷拍| 国产伦精品一区二区三区免费迷| 精品成人一区二区| 99成人免费视频| 欧美中文字幕在线视频| 母乳一区在线观看| 日韩午夜在线电影| 欧美一区二区三区啪啪| 欧美 日韩 国产精品免费观看| 欧美午夜精品久久久久久浪潮| 国产一区二区三区无遮挡| 亚洲欧洲日产国产网站| 亚洲欧美日韩国产一区| 欧美va天堂在线| 亚洲视频网站在线观看| 久久久综合精品| 欧美日韩在线一二三| 国内精品美女av在线播放| 亚洲免费av网站| 久久全球大尺度高清视频| 亚洲毛片在线观看.| 欧美在线视频日韩| 欧美日韩另类国产亚洲欧美一级| 国产午夜精品一区二区三区视频 | 久久久久久亚洲精品中文字幕| 亚洲破处大片| 欧美综合77777色婷婷| 欧美日韩午夜剧场| 亚洲黄色成人久久久| 久久精品国产99国产精品| 亚洲精品色婷婷福利天堂| 久久精品国产综合精品| 国产精品久久久久久av下载红粉| 亚洲国产日韩美| 久久精品视频免费| 在线视频日韩| 欧美理论大片| 亚洲人成在线观看网站高清| 久久成人人人人精品欧| 一本一本a久久| 欧美成人精品一区| 在线精品视频一区二区三四| 欧美一区二区观看视频| 妖精成人www高清在线观看| 欧美成人精品激情在线观看| 伊人久久婷婷色综合98网| 欧美主播一区二区三区美女 久久精品人 | 久久久久久久激情视频| 亚洲一区国产| 欧美日韩精品二区| 亚洲乱码国产乱码精品精| 男人的天堂亚洲在线| 久久精品视频在线播放| 国产一区二区三区av电影| 欧美亚洲综合另类| 亚洲综合清纯丝袜自拍| 国产精品久久一卡二卡| 亚洲一区国产精品| 一区二区三区四区在线| 欧美丝袜一区二区| 亚洲视频一二| 国产精品99久久久久久有的能看| 欧美日韩激情网| 亚洲午夜国产成人av电影男同| 亚洲伦理在线免费看| 欧美日韩一区二区三区免费看 | 亚洲图片在线| 日韩视频一区二区在线观看 | 亚洲黄一区二区| 亚洲国产va精品久久久不卡综合| 免费91麻豆精品国产自产在线观看| 亚洲成人在线网站|