隨筆-348  評論-598  文章-0  trackbacks-0

          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算法如下:

          1. 如果A=0,B是最大公約數,算法結束
          2. 如果B=0,A是最大公約數,算法結束
          3. 設置A1 = A、B1=B和C1 = 1
          4. 如果An和Bn都是偶數,則An+1 =An /2,Bn+1 =Bn /2,Cn+1 =Cn *2(注意,乘2只要把整數左移一位即可,除2只要把整數右移一位即可)
          5. 如果An是偶數,Bn不是偶數,則An+1 =An /2,Bn+1 =Bn ,Cn+1 =Cn (很顯然啦,2不是奇數的約數)
          6. 如果Bn是偶數,An不是偶數,則Bn+1 =Bn /2,An+1 =An ,Cn+1 =Cn (很顯然啦,2不是奇數的約數)
          7. 如果An和Bn都不是偶數,則An+1 =|An -Bn|,Bn+1 =min(An,Bn),Cn+1 =Cn
          8. n++,轉4

          這個算法的原理很顯然,所以就不再證明了?,F在考察一下該算法和歐幾里德方法效率上的差別。

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


          http://blog.vckbase.com/arong/archive/2004/06/15/458.aspx


          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2007-07-28 11:13 TiGERTiAN 閱讀(452) 評論(0)  編輯  收藏 所屬分類: Other technique
          主站蜘蛛池模板: 淳化县| 金华市| 莫力| 洛浦县| 镇坪县| 崇义县| 普兰店市| 宾川县| 泰州市| 仪陇县| 博白县| 大同市| 临安市| 勃利县| 信阳市| 兴安县| 汕头市| 深圳市| 开化县| 福安市| 望都县| 三江| 汶川县| 望城县| 新民市| 土默特左旗| 永宁县| 嘉黎县| 明光市| 大同县| 玉溪市| 瓦房店市| 托里县| 濮阳县| 区。| 黄浦区| 彭泽县| 临武县| 汉阴县| 时尚| 建瓯市|