簡單數論總結1——gcd與lcm

並不重要的前言

  最近學習了一些數論知識,可是本身都不懂本身到底學了些什麼qwq,在這裏把知識一併總結起來。算法

也不是很難的gcd和lcm

   顯而易見的結論:學習

  爲何呢?優化

  根據惟一分解定理:spa

        a和b均可被分解爲素因子的乘積,形如:3d

  則顯而易見的有一下結論:code

 

 

  相乘,得:blog

 

  得證io

 

幾種求gcd的算法

    1.   歐幾里得算法(展轉相除法)
    2.      展轉相減法(優化:stein_gcd)  

      

     歐幾里得算法class

 基於事實:原理

  

 實現:

1 int gcd(int a, int b){
2   return (b == 0) ? a : gcd( b , a % b) ;          
3 }

  簡短而容易實現和記憶,很是優美

  可是可能會被斐波那契數列卡住,證實或者緣由鴿了回頭再寫

 

      stein_gcd算法

  stein_gcd本質上是對更相減損術的優化,下面進行簡單的介紹:

  1.   若a,b都是偶數,則計算gcd(a/2,b/2)*2;  ————>由於都含有2的因數,因此同時除以2後gcd(a,b)變爲原來的1/2,再乘回去
  2.        若a是偶數,b是奇數,則計算gcd(a/2,b);  ————>由於只有一個數含有2做爲因數,因此除以2後gcd(a,b)不變
  3.        若a是奇數,b是偶數,則計算gcd(a,b/2);  ————>同2.
  4.        若a是奇數,b是奇數,則計算gcd(abs(x-y),min(x,y)); ————>經過相減,使其變成偶數,原理參見更相減損術實際上是我懶得寫

   實現:

int stein_gcd(int x,int y){
  if(x==0)
    return y;
  if(y==0)
    return x;
  if(x%2==0&&y%2==0)
    return stein_gcd(x>>1,x>>1)*2;
  else if(x%2 ==0)
    return stein_gcd(x>>1,y);
  else if(y%2==0)
    return stein_gcd(x,y>>1);
  else
    return stein_gcd(abs(x-y),min(x,y));                                 
}

  講到這裏,大概本期就結束了,至於沒涉及到的,就是鴿了下一期的事情了

  至於下一次何時填坑,已經在作了

相關文章
相關標籤/搜索