์๋ ํ์ธ์, ์ ๋์ฐ์ ๋๋ค.
์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ์ฅ ์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฒ์ ๊ณต๋ถํ๋ฉด ์ดํด๊ฐ ์ด๋ ต๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ด ๋์๋ ์ํ์ ๊ด๊ณ๋ฅผ ์ค์ ์ ์ผ๋ก ์ดํด๋ณด๋ฉด ์ดํด์ ๋์์ด ๋ฉ๋๋ค.
๋ณธ๋ฌธ์์ ์์ธํ ๋ค๋ฃฐ ํฐ์ด๋ ์ดํด์ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
1. Euclidean Algorithm
์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (์ ํด๋ฆฌ๋ ํธ์ ๋ฒ)์ ๋ ์์ ์ต๋๊ณต์ฝ์๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ์ฌ์ค์ ๊ธฐ๋ฐ์ ๋ก๋๋ค.
1. $gcd(a, b) == gcd(b, r)$ ($r = a\: mod \: b$, $a > b > 0$์ธ ์ ์)
2. $gcd(a, 0) = a$
$gcd(a, b) = gcd(b, a \mod b)$ ์ฆ๋ช
๊ท๋ฅ๋ฒ์ ์ฌ์ฉํด 1์ ์์ด ์ฐธ์ด ๋จ์ ์ฆ๋ช ํ๊ฒ ์ต๋๋ค.
[Proof]
gcd(a, b) == gcd(b, r) (r = a%b, a > b > 0)
g = gcd(a, b)
g' = gcd(b, r)
1. Assume that g > g' > 0
(1) r = a - kb (k๋ ์ ์)
a, b๋ ๋ชจ๋ g์ ๋ฐฐ์์ด๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํด ๋ํ๋ด๋ฉด
(2) r = g * (a/g) - k * g * (b/g)
(3) r = g ( a/g - k * (b/g) )
๋ฐ๋ผ์ r์ g์ ๋ฐฐ์์ด๋ค.
(4) r, b๋ ๋ชจ๋ g์ ๋ฐฐ์์ด๊ณ , gcd(r, b) = g' ์ด๋ฏ๋ก g' >= g ์์ด ์ฑ๋ฆฝ.
(5) ์ด๋ ๊ฐ์ ์ ๋ชจ์.
2. Assume that g' > g > 0
(1) a = k*b + r
b, r์ ๋ชจ๋ g'์ ๋ฐฐ์์ด๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํด ๋ํ๋ด๋ฉด
(2) a = k * g' * (b/g') + g' * (r/g')
(3) a = g' * (k * (b/g') + (r/g'))
๋ฐ๋ผ์ a๋ g'์ ๋ฐฐ์์ด๋ค.
(4) a, b๋ ๋ชจ๋ g'์ ๋ฐฐ์์ด๊ณ , gcd(a, b) = g ์ด๋ฏ๋ก g >= g' ์์ด ์ฑ๋ฆฝ.
(4) ์ด๋ ๊ฐ์ ์ ๋ชจ์.
๋ฐ๋ผ์ g = g' ์์ด ์ฆ๋ช
๋์๋ค.
gcd() ํจ์์ ๋ ๋ฒ์งธ ์ธ์๊ฐ 0์ด ๋ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ฉด ๋๋๋ฐ, ๋ ๋ฒ์งธ ์ธ์๊ฐ 0์ผ ๋์ ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ ์ฒ์ ๋ ์์ ์ต๋๊ณต์ฝ์์
๋๋ค.
์์๋ฅผ ์ข ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
40๊ณผ 32์ ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ gcd(40, 32)์ ๊ฒฝ์ฐ๋ฅผ ํตํด์์.
1. gcd(40, 32) ํธ์ถ
2. gcd(32, 40%32) == gcd(32, 8) ํธ์ถ
3. gcd(8, 32%8) == gcd(8, 0) ํธ์ถ. ๋ ๋ฒ์งธ ์ธ์๊ฐ 0์ด๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์ธ์์ธ 8์ด ์ต๋๊ณต์ฝ์๊ฐ ๋ฉ๋๋ค.
์ด๋ ๊ฒ ์์๋ฅผ ๋ค์ด ์ดํดํ๋ฉด ์ ๋ง ์ฝ์ต๋๋ค.
๊ตฌํ์ ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ๊ท ํจ์๋ก Euclidean Algorithm ๊ตฌํํ๊ธฐ
def gcd(a, b):
if(b == 0):
return a
else:
return gcd(b, a%b)
while ๋ฌธ์ผ๋ก Euclidean Algorithm ๊ตฌํํ๊ธฐ
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
ํฐ์คํ ๋ฆฌ indent๊ฐ ์ข ์ด์ํ ๊ฒ ๊ฐ์๋ฐ ์ํด ๋ฐ๋๋๋ค.
2. Extended Euclidean Algorithm (xgcd)
ํ์ฅ ์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ๋ฒ ์ฃผ ํญ๋ฑ์ $ax+by=gcd(a, b)$ ๋ฅผ ๋ง์กฑํ๋ $x$, $y$๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
($gcd(a, b) = 1$ , ์ฆ $a$์ $b$๊ฐ ์๋ก์์ธ ๊ฒฝ์ฐ ์ด๋ค์ modulo inverse ๋ํ xgcd๋ฅผ ํตํด ๊ณ์ฐํ ์ ์์ต๋๋ค.)
xgcd๋ gcd ๊ณ์ฐ ๊ณผ์ ์ ๋ฐ๋ผ๊ฐ๋ฉด์๋ ์ด๋ ์ฌ์ฉ๋๋ ๊ฐ๋ค์ ์ถ๊ฐ์ ์ผ๋ก ๊ธฐ๋กํจ์ผ๋ก์จ ๊ตฌํํ ์ ์์ต๋๋ค. ์, ์์ ๋ง์กฑํ๋ $x$, $y$๋ ์ ์ผํ์ง ์์ง๋ง ์ด ๊ธ์์๋ ์์๊ฐ ์๋ ์ต์ ์ ์๋ก ํ์ ํ๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํฉ๋๋ค.
$gcd(a, b) = gcd(b, r) = g$ ๋ผ๋ ์์ ํตํด ํ์ฅ ์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๋จ๊ณ์์ ์ฌ์ฉ๋๋ ๋ณ์ ๊ฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ดํด๋ด
์๋ค.
๋จผ์ $r$์ $a, b$์ ๋ํด ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$r = a - bq$, ($q = a//b$)
๋ฐ๋ผ์ $gcd(b, r) = b*x_1 + r*y_1$ ์ด๋ผ๋ ๋ฒ ์ฃผ ํญ๋ฑ์์ ์๋์ ์์ผ๋ก ์ ๋ฆฌ๋ฉ๋๋ค.
$gcd(b, r) = b * x_1 + (a - bq) * y_1$
๊ทธ ๋ค์, $gcd(a, b)$๋ฅผ $x_2$์ $y_2$๋ผ๋ ๋ณ์๋ฅผ ์ฌ์ฉํด ๋ฒ ์ฃผ ํญ๋ฑ์ ํํ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
$gcd(a, b) = a * x_2 + b * y_2$
์ด๋ $gcd(a, b) = gcd(b, r)$ ์ด๋ฏ๋ก ๋ ์์ ๋ฑํธ๋ก ๋ฌถ์ด ์ ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
$a * x_2 + b * y_2 = b * x_1 + (a - bq) * y_1$
์ ์ ํ $a$, $b$๋ก ๋ฌถ์ด ์ ๋ฆฌํ ์์ ์๋์ ๊ฐ์ต๋๋ค.
$a * x_2 + b*y_2 = a * y_1 + b (x_1-q*y_1)$
๋ฐ๋ผ์ $x_2 = y_1$์ด๊ณ , $y_2 = (x_1 - q * y_1)$์์ ์ ์ ์์ต๋๋ค.
xgcd๋ gcd์ ์ฌ๊ท ํธ์ถ ํ๋ฆ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ์งํ๋ฉ๋๋ค.
gcd์ ํธ์ถ ํ๋ฆ์ด $gcd(5, 2) -> gcd(2, 1) -> gcd(1, 0)$ ๊ณผ ๊ฐ์ ์์ด๋ผ๋ฉด, xgcd๊ฐ ๋ฒ ์ฃผ ํญ๋ฑ์์ ๋ง์กฑํ๋ ๊ฐ์ ๊ตฌํ ๋ ์ฌ์ฉํ๋ ์์ $gcd(1, 0) -> gcd(2, 1) -> gcd(2, 5)$ ์ด๋ฐ ์์์ธ ๊ฒ์
๋๋ค. ๋๋ฌด ๋น์ฐํ ์ด์ผ๊ธฐ์ง๋ง $gcd(5, 2)$์์ ๋ฐ๋ก $x$, $y$ ๊ฐ์ ๊ณ์ฐํด๋ผ ์ ์์์ผ๋ฉด ์ด ๊ณ ์์ ํ์ง ์์์ ๊ฒ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ์์๋ฅผ ๋ $gcd(a, b) = gcd(b, r)$์ ๊ฒฝ์ฐ๋ฅผ ๋ฐ์ ธ๋ณด์๋ฉด, $gcd(b, r)$๋ก๋ถํฐ $x_1$, $y_1$์ ๋จผ์ ๊ตฌํด๋ธ ๋ค $gcd(a, b)$์์ $x_2$, $y_2$๋ฅผ ๊ตฌํด๋ด๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์์์
๋๋ค. ์ด๋ ์ด์ ๋จ๊ณ ($gcd(b, r)$)์์ ๊ตฌํ $y$ ๊ฐ์ ๋ค์ ๋จ๊ณ ($gcd(a, b)$)์ $x$ ๊ฐ์ผ๋ก ์ฐ์ด๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ฐ ์ฐ์์ ํน์ฑ์ ์ด์ฉํด gcd์ ํ๋ฆ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ์ต์ข
์ ์ธ $x$, $y$ ๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด xgcd ์๊ณ ๋ฆฌ์ฆ์
๋๋ค.
๊ณ์ฐ ๊ณผ์ ์ ์๋ก ๋ค์ด ์ดํด๋ณด๋ฉด ์ดํด๊ฐ ๋์ฑ ์ฌ์ธ ๊ฒ๋๋ค.
Example. $xgcd(5, 17)$
$xgcd(5, 17)$๋ก $5x + 17y = gcd(5, 17) = 1$์ ์์ ๋ง์กฑํ๋ $x$, $y$ ๊ฐ์ ๊ตฌํ๋ ๊ณผ์ ์ ์ดํด๋ด
์๋ค.
$gcd(5, 17)$์ ์ฌ๊ท์ ์ผ๋ก ๊ณ์ฐํ๋ค๋ฉด ํธ์ถ ํ๋ฆ์ ์๋์ ๊ฐ์ต๋๋ค.
$gcd(5, 17)$ -> $gcd(17, 5)$ -> $gcd(5, 2)$ -> $gcd(2, 1)$ -> $gcd(1, 0)$ -> yield $1$
$gcd(1, 0)$๋ถํฐ ํ๋ฆ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉด์ $gcd(a, b) = ax + by$ ํ์์ ๋ฒ ์ฃผ ํญ๋ฑ์์ ์์ฑํด๋ด
์๋ค.
$gcd(1, 0) = 1 = 1*x_1 + 0*y_1$
์ด๋ $x_1$๋ 1์ด์ด์ผ ํ๊ณ , $y_1$์ ์๋ฌด ๊ฐ์ด๋ ๋ค์ด์๋ ๋ง์กฑํ์ง๋ง ์์๊ฐ ์๋ ์ต์ ์ ์๋ฅผ ๊ตฌํ ๊ฒ์ด๋ฏ๋ก $y_1$์ 0์
๋๋ค.
๋ฐ๋ผ์, $1 = 1 * 1 + 0 * 0$ ์ด ์ฌ๋ฐ๋ฅธ ๋ฒ ์ฃผ ํญ๋ฑ์์
๋๋ค.
$gcd(2, 1) = 1 = 2*x_2 + 1*y_2$
์ด๋ $x_2$๋ ์ด์ ๊ณ์ฐ์์ ๊ตฌํ $y_1$์ด์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ $x_2 = 0$์ด๊ณ , $y_2 = 1$์
๋๋ค.
$gcd(5, 2) = 1 = 5*x_3 + 2*y_3$
$x_3 = 1$์ด๋ฏ๋ก $y_3 = (1 - 5*x_3)/2 = (1-5*y_2)/2 = -2$ ์
๋๋ค.
$gcd(17, 5) = 1 = 17*x_4 + 5*y_4$
$x_4 = -2$์ด๋ฏ๋ก $y_4$ ์ญ์ ๊ฐ๋จํ๊ฒ ๊ณ์ฐํ ์ ์์ต๋๋ค. $y_4 = (1 - 17*x_4)/5 = (1 - 17*y_3)/5 = 7$
$gcd(5, 17) = 1 = 5*x_5 + 17*y_5$
$x_5 = y_4$, $y_5 = -2$ ์
๋๋ค.
์ด๋ก์จ $xgcd(5, 17)$์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.
$1 = 5*7 + 17*(-2)$
์ฌ๊ท ํจ์๋ก Extended Euclidean Algorithm ๊ตฌํํ๊ธฐ
xgcd()๋ฅผ ๊ตฌํํ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
def xgcd(a, b):
if(b == 0):
# ์ต์ข
๋จ๊ณ gcd(a, 0) = a*1 + 0*0 ์ด๋ฏ๋ก.
return (a, 1, 0)
else:
g, x1, y1 = xgcd(b, a%b)
# ์ด์ ๋จ๊ณ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ g(์ต๋๊ณต์ฝ์), x1 (์ด์ ๋จ๊ณ์ x๊ฐ), y1(" y๊ฐ) ์ ์ ์ฅ
x, y = y1, (g - a * y1)//b
# ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์ด๋ฒ ๋จ๊ณ์ x, y ๊ฐ์ ๊ตฌ์ฑํ ๋ค ๋ฐํ
return (g, x, y)
์๊ฐ๋ณด๋ค ์ ๋ง ๊ฐ๋จํ์ง ์๋์
๊ทธ๋ผ ๊ฑด์น์ ๋น๋๋ค