Computer Science/μ•Œκ³ λ¦¬μ¦˜

GCD(μ΅œλŒ€ κ³΅μ•½μˆ˜), LCM(μ΅œμ†Œ 곡배수) κ΅¬ν•˜κΈ°

육볡 2021. 11. 2. 22:19

μ΅œλŒ€ κ³΅μ•½μˆ˜ κ΅¬ν•˜κΈ° 

μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ΄λž€?

μ΅œλŒ€ κ³΅μ•½μˆ˜(GCD)λ₯Ό ꡬ할 수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, gcd(a,b)와 (r=a%b라고 ν•  λ•Œ), gcd(b,r)의 μ΅œλŒ€ κ³΅μ•½μˆ˜λŠ” κ°™λ‹€. 

즉, gcd(a,b) == gcd(b,r)이닀.

 

이 μ„±μ§ˆμ— 따라 gcd(a,b) == gcd(b, a%b) == gcd(a%b, (a%b)%b).... λ°˜λ³΅ν•˜μ—¬ λ‚˜λ¨Έμ§€κ°€ 0이 λ˜μ—ˆμ„ λ•Œ λ‚˜λ‰˜μ–΄μ§€λŠ” μˆ˜κ°€ a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜κ°€ λœλ‹€. 

 

μ •λ¦¬ν•˜μžλ©΄ gcd(a,b) -> cdg(a, a%b) .... -> gcd(x, 0)이면 a와 b의 μ΅œλŒ€ κ³΅μ•½μˆ˜λŠ” x이닀. 

 

κ΅¬ν˜„

    private static int gcd(int a, int b) {
        if(b == 0) return a;
        return gcd(b, a%b);
    }

 

μ΅œμ†Œ 곡배수λ₯Ό κ΅¬ν•˜λŠ” 방법 

μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜μ˜ 관계 

A,B의 μ΅œλŒ€κ³΅μ•½μˆ˜ = G, μ΅œμ†Œκ³΅λ°°μˆ˜ = L이라고 ν•˜μž. 

A = Ga, B = Gb (a와 bλŠ” μ„œλ‘œμ†Œμ΄λ‹€.) 

L = Gab = AB/G

GL = ab

λ”°λΌμ„œ μ΅œμ†Œ 곡배수 L = a*b/G 이닀. 

 

κ΅¬ν˜„

    private static int gcd(int a, int b) {
        if(b == 0) return a;
        return gcd(b, a%b);
    }

    private static int lcm(int a, int b) {
        return a * b / gcd(a,b);
    }