演算法 最大公約數

2021-09-22 08:51:32 字數 3566 閱讀 2483

最大公約數是乙個很經典的數學問題,對於這個問題有四種通用的解法,質因數分解法,短除法,不過比較常用的還是輾轉相除法,演算法出自於歐幾裡的著作《幾何原本》,還有乙個就是出自《九章算術》的更相減損法,一般實現的時候都是通過輾轉相除法實現,基本的邏輯是這樣的:假設把a和b的最大公約數表示成為f(a,b),並且a>=b>0。現在取k=a/b,m=a%b,則a=k*b+m,變形為m=a - k*b;x和y能被f(a,b)整除,那麼m也能被f(a,b)整除,f(a,b) = f(b,a%b)。

基於上面的邏輯我們定義兩個數字a,b,首先mod=a%b餘數,然後將b賦值給a,mod賦值給b,跳出迴圈返回a就是最大公約數,**如下: 1

2

3

4

5

6

7

8

9

10

11

12

13

-(nsinteger)maxdivisor:(nsinteger)a secondnumber:(nsinteger)b

while(b!=0)

returna;

}

出於對迴圈的理解,我們可以通過遞迴實現: 1

2

3

4

5

6

7

8

9

10

11

12

-(nsinteger)maxmodrecursive:(nsinteger)a secondnumber:(nsinteger)b

if(b==0)else

}

輾轉相除法對大整數求最大公約數,輾轉相除法的效率就出現了瓶頸,對於大整數而言,取模運算(用到除法)的開銷非常的昂貴,這是歐幾里得演算法的侷限性,其實我們可以借鑑歐幾里得的輾轉相除法優化一下。我們需要認識到乙個數學知識就是兩個數的最大公約數等於較小數和兩個數差值之間的公約數。可以通過

「-」運算,即 f(a,b)=f(a-b,b)。 1

2

3

4

5

6

7

8

9

10

11

12

-(nsinteger)maxrecursive:(nsinteger)a secondnumber:(nsinteger)b

if(b==0)else

}

對於大數運算問題通過以上形式解決了,那就是當a和b相差很多時,演算法的迭代次數會過高,導致了演算法的效率較低,a=1000,b=1,們要考慮其他的優化。

上面的方法對於大整數和迭代的問題沒能很好的解決,我們可以通過移位運算很好解決以上的問題:

(1)如果b=k*b1,a=k*a1.那麼有f(a,b)=k*f(a1,b1)

(2)如果a=p*a2,p為素數,並且b%p != 0,那麼f(a,b) = f(p*a2,b) = f(a2,b)

於是我們得到下面的解決方法:

將p = 2,

若a,b均為偶數,f(a,b) = 2*f(a/2,b/2) = 2*f(a>>1,b>>1);

若a是偶數,b是奇數,f(a,b) = f(a/2,b) = f(a>>1,b);

若a是奇數,b是偶數,f(a,b) = f(a,b/2) = f(a,b>>1);

若a和b均為奇數,f(a,b) = f(b,a-b)。這時a-b一定是偶數,下一步一定會除以2,

演算法的時間複雜度是o(log2

(max(a,b))。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

-(nsinteger)maxlogic:(nsinteger)a secondnumber:(nsinteger)b

if(b==0)elseelse

}elseelse

}

}

return0;

}

通過移位運算和減法運算,避開了大整數除法,提高了演算法的效率,有些東西還是需要經常研究的~

最大公約數簡便演算法 最大公約數演算法

1 查詢約數法 先分別找出每個數的所有約數,再從兩個數的約數中找出公有的約數,其中最大的乙個就是 最大公約數 例如,求 12 和 30 的最大公約數 12 的約數有 1 2 3 4 6 12 30 的約數有 1 2 3 5 6 10 15 30 12 和 30 的公約數有 1 2 3 6,其中 6 ...

演算法 最大公約數

最大公約數是乙個很經典的數學問題,對於這個問題有四種通用的解法,質因數分解法,短除法,不過比較常用的還是輾轉相除法,演算法出自於歐幾裡的著作 幾何原本 還有乙個就是出自 九章算術 的更相減損法,一般實現的時候都是通過輾轉相除法實現,基本的邏輯是這樣的 假設把a和b的最大公約數表示成為f a,b 並且...

最大公約數演算法

1 查詢約數法 先分別找出每個數的所有約數,再從兩個數的約數中找出公有的約數,其中最大的乙個就是 最大公約數 例如,求 12 和 30 的最大公約數 12 的約數有 1 2 3 4 6 12 30 的約數有 1 2 3 5 6 10 15 30 12 和 30 的公約數有 1 2 3 6,其中 6 ...