Contents
Problem
Solution
參考:
http://www.csie.ntnu.edu.tw/~u91029/Divisor.html#5
https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
基本上就是擴展歐幾里得的練習題,不過理解上總覺得有點轉不過來。
老實說還有很多模糊的地方就是了,我的數學R…
每階段都可以分成三部份去看:
- 輾轉相除求出餘數
- 餘數的相等形式
- 欲求出的等式
以 a = 47, b = 30 來看:(連續三行順序如上所述,除了 init 那)
而因為是遞迴去實作,順序可從下面往上看,可能比較好理解。
1 = 0 x 0 + 1
1 = 1 x 1 + 0 x 0
init: (i, j) = (1, 0)
4 = 1 x 4 + 0
0 = 4 x 1 + 1 x -4
1 = 4 x 0 + 1 x 1
13 = 4 x 3 + 1
1 = 13 x 1 + 4 x -3
1 = 13 x 1 + 4 x -3
17 = 13 x 1 + 4
4 = 17 x 1 + 13 x -1
1 = 17 x -3 + 13 x 4
30 = 17 x 1 + 13
13 = 30 x 1 + 17 x -1
1 = 30 x 4 + 17 x -7
47 = 30 x 1 + 17
17 = 47 x 1 + 30 x -1
1 = 47 x -7 + 30 x 11
每次將上一次 3. 等式 中的值用現在所算出的餘數形式去做替換。1
2
3int t = i;
i = j;
j = t - (a / b) * j;
就是在做這件事。
舉例來說,用 17 = 47 x 1 + 30 x -1,把 1 = 30 x 4 + 17 x -7 中的 17 換掉,
就變成了 1 = 30 x 4 + (47 x 1 + 30 x -1) x -7 = 47 x -7 + 30 x 11。
1 |
|
至於非遞迴的版本,就…。
Code
1 |
|