최소 공배수

초등학교 5학년 때 약수(divisor or factor)와 배수(multiple)를 배운 뒤에 최대공약수(greatest common divisor or greatest common factor) 와 함께 배우게 되는 내용. 공배수(common multiple)란, 이름에서 알 수 있듯이 두 수, 혹은 그 이상의 수들의 공통인 배수라는 뜻이다. 최소공배수(least common multiple)는 당연히 공배수 중에서 가장 작은 것. 두 수 �,�의 최소공배수를 기호로  혹은 로 표기하며,더욱 줄이면로 표기하기도 한다.

간혹 최공배수로 잘못 부르는 경우가 있는데, 최대공배수는 존재하지 않는다. 공배수는 한없이 커지므로, 가장 큰 숫자를 정의할 수 없기 때문. 마찬가지로 최공약수 또한 어떤 수 집합이든 무조건 1이므로 의미가 없다.

2. 찾는 법

예시로 두 수 10, 12의 공배수를 찾고 싶다고 하자. 먼저 두 수의 배수를 쭉 나열한다.
10: 10, 20, 30, 40, 50, 60, 70, ...
12: 12, 24, 36, 48, 60, 72, ...
여기서 위아랫줄 동시에 나타나는 수가 바로 공배수이다. 최소공배수는 앞서 설명했듯이 공배수 중 가장 작은 것. 이 예시의 경우에는 60이 최소공배수가 된다. 같은 방법으로 세 수 이상의 최소공배수도 구할 수 있다.

하지만 숫자를 나열하는 방법으로 최소공배수를 찾는게 힘들다면? 이 때는 소인수분해를 이용해서 최소공배수를 찾는다. 10과 12를 각각 소인수분해하면,
10=2⋅5
12=22⋅3
이제 중복되는 소인수는 차수가 큰 횟수만큼, 그리고 나머지 소인수를 모두 곱해주면 그 값이 최소공배수이다. 위 예시에서는 2를 두 번,[3] 3을 한 번, 그리고 5를 한 번 곱한 값, 즉 60이 최소공배수가 된다. 특히, 숫자가 서로소이면, 그냥 아무런 생각도 하지않고 두 수를 곱해주기만 하면 그 값이 최소공배수가 됨을 알 수 있다.

위에서 봤듯이 최소공배수는 대수학적으로는 그 성질을 다루기가 매우 까다롭기 때문에 특수함수에 속한다.

최대공약수 gcd⁡를 이용하는 방법도 있다. 최대공약수와 다음과 같은 관계가 성립한다:
lcm(a, b)=

단, 최대공약수도 최소공배수도 모를 경우 순환논법이 될 수 있음을 주의해야 한다.


 

최대 공약수

정수의 성질 중 하나. 초등학교 5학년 때 나오며, 약수(divisor or factor)에 대해서 먼저 배운 뒤, 바로 배우게 될 것이다. 먼저 공약수(common divisor or common factor)란, 이름에서 알 수 있듯이 두 수, 혹은 그 이상의 여러 수의 공통인 약수라는 뜻이다. 최대공약수 (greatest common divisor) 는 당연히 공약수 중 가장 큰 것. 두 수 의 최대공약수를 수학적 기호로 표시하면, 이며,더욱 줄여서 (로 표기하기도 한다. 특히,이면 두 수  서로소(relatively prime, coprime)라고 한다. 중1 입학하면 소인수분해랑 연계해서 더 심화된 과정으로 최소공배수랑 같이 또 나온다. 최대공약수ㆍ최소공배수는 약분과 통분, 분모가 다른 분수의 계산, 분수의 곱셈ㆍ나눗셈, 6학년 때 배우는 비의 성질, 비례식의 성질, 중1 정수와 유리수의 혼합계산, 방정식ㆍ부등식의 풀이 등 다방면으로 나온다.

가끔 최소공약수라고 잘못 부르는 경우가 있는데, 최소공약수는 무조건 1이므로 논할 가치도 없다. 반대로 최대공배수도 결국 무한으로 발산하므로 논할 가치 자체가 없다.

2. 찾는 법

예시로 두 수 12, 18의 공약수 및 최대공약수를 찾고 싶다고 하자. 간단하게, 두 수의 약수를 모두 나열한다.
12: 1, 2, 3, 4, 6, 12
18: 1, 2, 3, 6, 9, 18
여기서 위아랫줄 모두 같이 있는 숫자가 공약수가 된다. 즉, 이 경우에는 1, 2, 3, 6이 공약수가 된다. 최대공약수는, 찾은 공약수 중 가장 큰 것, 즉 이 경우에는 6이 최대공약수가 된다. 같은 방법으로 세 수 이상의 최대공약수도 구할 수 있다.

 

 

 

소인수 분해

 

합성수를 소수들의 곱으로 나타내는 것을 말한다.소수를 처음 배우는 중학교부터 자주는 아니더라도 계속 쓰이는 기본적인 수학 도구. 모든 합성수가 소인수분해된 형태를 가지고 있다는 것은 산술의 기본정리로 증명된다

 

https://www.youtube.com/watch?v=wsTEul5kzTs 소인수분해의 직관적 영상

 

배수 판정

정수 에 대해서,
  1. 2의 배수: 일의 자리 숫자가 짝수.
  2. 3의 배수: 각 자릿수의 합이 3의 배수.
  3. 4의 배수: 맨 뒤 두 자리가 00이거나 4의 배수.
  4. 5의 배수: 일의 자리가 0이거나 5인 경우.
  5. 6의 배수: 이 2의 배수이면서 3의 배수.
  6. 8의 배수: 맨 뒤 세 자리가 000 또는 8의 배수.
  7. 9의 배수: 각 자릿수의 합이 9의 배수.
  8. 10의 배수: 일의 자리가 무조건 0.
  9. 10n의 배수: 가장 끝의 n개의 자리가 모두 0.
  10. 7, 11, 13의 배수: 일의 자리부터 세 자리씩 끊은 뒤, 각 부분을 교대로 빼고 더한 값이 7, 11, 13의 배수.
  11. 15의 배수: 이 5의 배수이면서 3의 배수.
  12. 25의 배수: 맨 뒤 두 자리가 00 또는 25의 배수(25, 50, 75)
  13. 12의 배수: 이 3의 배수이면서 4의 배수.
  14. 20의 배수: 이 4의 배수이면서 5의 배수.
  15. 30의 배수: 이 5의 배수이면서 6의 배수.
  16. 48의 배수: 이 3의 배수이면서 16의 배수.
  17. 72의 배수: 이 8의 배수이면서 9의 배수.
  18. 27, 37의 배수: 일의 자리부터 3자리씩 끊은 뒤 이들을 모두 합한 결과가 27, 37의 배수인 수.

 

 

프로그래밍에서 소인수 분해를 쓸 때

 

프로그래밍으로 소인수를 구할 때는 위와 같은 자질구레한 규칙을 따질 필요 없이, 주어진 숫자 n의 소인수를 구한다고 할 경우 아래와 같은 순서로 진행하면 된다.

 

* 1. i=2로 시작하여 i++ 하면서 n%i == 0 인지 체크한다.
* 2. n%i==0이 성립하는 경우 i를 소인수로 등록한 후 n은 i로 나눈 값을 저장하고 i는 i++ 하지 않고 i부터 다시 시작하도록 한다.
* 3. n이 1이 될 때까지 위 과정을 반복한다.

 

 

어차피 작은 소수에서 n%i == 0이 성립하지 못한다면 그보다 큰 합성수는 n%i == 0가 성립하지 못하므로 n%i == 0이 성립하는 첫번째 i는 소수라는 점을 이용한 알고리즘이다.
이 알고리즘으로 소인수를 구하면 천억이 넘는 숫자도 소인수가 순식간에 구해진다.

간단하게 파이썬으로 코딩 해보면 다음과 같다.

 

# -*- coding: utf-8 -*-
import os
import sys

def find_prime(input_num):
    if input_num <= 2:
        return [input_num,]
    for idx in range(2,input_num):
        if input_num % idx == 0:
            ret_list = []
            val_a    = find_prime(idx)
            val_b    = find_prime(int(input_num/idx))
            ret_list = val_a + val_b
            return ret_list
    return [input_num,]

def main():
    try:
        input_num  = int(sys.argv[1])
    except:
        print("usage: python main.py <number>")
        print(" ex>   python main.py 12345")
        quit()
    prime_list = find_prime(input_num)
    check_num  = 1
    for prime_at in prime_list:
        check_num *= prime_at
    print("[%s] input_num=%d, check_num=%d" % (input_num == check_num, input_num, check_num))
    print("%s" % prime_list)

main()


다만 위의 프로그램은 프로그래밍을 익히는 용도로는 유용할수 있으나, 실제 소인수분해 용으로 쓰기에는 적합하지 않다. 실제로 컴퓨터로 다루는 수는 1000억은 '겨우'라는 소리가 나올만큼 큰 수를 다룰 필요가 있기 때문이다.

가장 쉬운 방법은 다른 프로그램을 이용해서 미리 소수 테이블을 작성해 두고, 이를 활용하는 것이다. 예를 들어 216 보다 작은 소수는 6542개인데, 이를 미리 배열에 저장해 두면, 42억 (=232 ) 보다 작은 수는 겨우 6542번 나누어 보기만 하면 소수인지 판정하거나, 1개 이상의 소인수를 구할 수 있다. 232 보다 작은 소수는 모두 약 2억개(203,280,221 개) 인데, 이를 미리 구해서 적절한 DB 에 저장해 두면 약 1844 (= 264 = 18,446,744,073,709,551,616) 보다 작은 수의 소인수 분해를 쉽게 할 수 있다.

20자리 정도 되는 이정도 수면 큰 수라고 생각할 수 있지만, RSA 암호화같은 암호학에서 기본 수백자리 수를 다뤄야 한다. RSA 넘버를 보면 가장 작은 것이 100자리 부터 시작하는데, 그마저 250자리 수 까지는 모두 소인수분해되었다. 가장 큰 RSA-2048 은 무려 617자리 수이다. 수의 단위 중 이름이 붙은 최고 단위인 구골이 101자리 수라는 것을 생각해보면, RSA 암호화에서 다루는 수는 사람에게는 어마어마하게 큰 수이다.

 

출처-나무위키

'기초수학 > 초~고등수학' 카테고리의 다른 글

순열  (0) 2023.03.17

들어가기 전에..

- 경우의 수

여러 개의 사건이 일어날 때 경우의 수를 따지는 방법. 조합론에서 다루는 수많은 논의를 가능케하는 가장 기본적인 두 원리.
  • 합의 법칙: 경우의 수를 구해야 할 여러 사건들이 영향을 주거나 일어나는 상황의 구조가 닮지 않은 다른 경우, 경우의 수를 쪼개서 계산하게 된다. or이 합의 법칙이다.
    두 사건 A, B의 경우의 수를 따진다면, 사건 A가 일어나는 경우의 수가 가지, 사건 B가 일어나는 경우의 수는 가지라면 A와 B 어느 쪽이 일어나는 경우의 수는 m + n 가지다. '또는', '~이거나'라는 표현을 사용한다면 합의 법칙 문제이다.
  • 곱의 법칙: 경우의 수를 구해야 할 여러 사건들이 서로 영향을 주지 않거나 일어나는 상황이 구조가 닮은 경우, 경우의 수를 뭉쳐서 계산하게 된다. and가 곱의 법칙이다.
    두 사건 A, B의 경우의 수를 따진다면, 사건 A가 일어나는 경우의 수가 가지, 사건 B가 일어나는 경우의 수는 가지라면 A와 B가 동시에 일어나는 경우의 수는  가지다.

합의 법칙은 주사위의 눈이 2 또는 5가 나올 경우의 수를 생각하면 된다. 주사위의 눈이 2 또는 5가 나오면 되므로 2가 나올 경우의 수 1가지와 5가 나올 경우의 수 1가지를 더하여 2가지가 나온다. 1+1=2

곱의 법칙은 주사위를 두 번 던져 처음엔 짝수가 나오고 그 다음 홀수가 나올 경우의 수를 생각하면 된다. 처음에 짝수가 나올 경우의 수 3가지(2, 4, 6)에 두번째 홀수가 나올 경우의 수 3가지(1, 3, 5)를 곱하면 9가지이다. 3×3=9

그런데 이 두 가지를 구분하는 부분에서 많이 헷갈리게 되는데, 간단히 말해 사건과 사건이 이전의 결과에 영향을 받거나 관계가 서로 엮여있을 때 합의 법칙을 사용하고, 영향을 받지 않는 독립적인 사건이라면 곱의 법칙을 사용하면 된다. '동시성'이라는 단어가 애매한 것이, 예를 들어 3개의 갈림길을 지나 다시 2개의 갈림길중 하나를 선택하는 문제라면, 분명 동시에 일어나는 사건은 아니지만 곱의 법칙을 사용해야 한다. 어떤 두 사건이 즉 동시에 일어날 경우 곱의 법칙을 쓰지만(동시에 일어나지만 합의 법칙을 쓰는 경우는 없으므로) 곱의 법칙을 쓴다고 해서 어떤 두 사건이 항상 동시에 일어나는 것은 아니다.정 모르겠다면 문제에서 숫자를 줄여서 상상해보자. EBS강좌에서 한 강사는 동시성의 혼란을 방지하고자 '잇달아'라는 개념을 도입하면 이해하기 쉽다고 하니 참고할 것.어디까지나 캐바케지만 이런 연습을 여러번 거치다 보면 자유자재로 두 법칙을 사용하게 될 것이다.

고등학교 과정에서 법칙이란 이름을 붙이기 부끄러운 간단한 내용에 다짜고짜 '법칙'인가 싶지만 공부를 깊이 하면 결국 순열과 조합의 기술적인 부분을 제치고 결정적으로 중요한 내용이라는 것을 깨달을 수 있다. 문제를 풀 때 흔히 쓰는 공식과 기술은 고난도 문제가 다루는 변태적으로 특수한 상황에서는 결국 상황을 많이 복잡하게 만들 뿐이다. 결국엔 상황을 최대한 단순화시킨 후 각각의 케이스에 대해서 곱의 법칙으로 뭉친 항들을 곱하는 것이나, 상황이 여의치 않거나 단순하게 해결할 수 있다면 합의 법칙으로 해결하는 것도 나쁘지 않다.

기호로 간단하게 n!로 나타내며 부터 까지의 자연수를 모두 곱하는 것을 의미한다. 팩토리얼이라고도 불린다.

출처:나무위키

 

 

순열이란

서로다른 n개에서 r(0<r≤n)개를 택하여

일렬로 나열하는 것을

n개에서 r개를 택하는 순열이라 한다.

 식으로 표현하면 이렇다.

 

첫 번째 순열은 원순열

 

말그대로 원으로 배열하는 것인데 그림으로 보면 이렇다

위 사진과 같이 A, B, C, D를 배치시키는데

원형 탁자에 배열 시킨다면

위 네가지 경우가 똑같은 경우라고 할 수 있다

항상 A의 좌우측에는 B와 D가 배치되어 있고,

B,C,D 좌우측에도 변화가 없다.

그렇기에 4가지 경우는 같은 경우.

 

그럼 우리가 처음 배웠던 순열로 보면

4명을 일렬로 세우는 방법의 수는 4! 이지만

원형탁자에 배열 한다면 서로 같은 경우가 4가지씩 있으므로

확장해서 서로 다른 n개를 원형탁자에 배열한다고 하면

원순열의 수는

 

Q1. 원형 탁자에 A, B, C, D, E가 둘러 앉을 때 다음을 구하시오.

(1) 6명이 앉는 모든 경우의 수

(2) A, B가 이웃하여 앉는 모든 경우의 수

(3) D, E가 마주 보고 앉는 모든 경우의 수

 

두 번째 순열은 중복순열.

 

중복순열이란

서로 다른 n개에서 중복을 허용하여

r개를 택하여 일렬로 배열하는 것을

n개에서 r개를 택하는 중복순열이라 한다.

중복순열은 위와 같이 표현하는데,

중복을 허용하기 때문에

첫 번째 자리에 올 수 있는 경우의 수도 n,

두 번째 자리에 올 수 있는 경우의 수도 n,

계속해서 r번째 자리에 올 수 있는 경우의 수 또한 n개다.

 

Q2. 비밀번호를 만들 때 0부터 9까지의 번호를 사용할 수 있으며,

    비밀번호는 총 5개의 숫자로 이루어져 있다.

    만들 수 있는 비밀번호의 개수를 구하시오.

 

세 번째 순열은 중복순열이라고도 하는데,

같은 것이 있는 순열의 수를 구하는 경우.

 

만약 파란색 카드 2장과 빨간색 카드 3장이 있는데,

이 카드 5장을 일렬로 줄 세우는 방법은 당연히

5!.

 

하지만 같은 색끼리 카드는 구별이 불가능 하다면?

파란색 카드 2장끼리 순서가 바뀌는 경우 2!과

빨간색 카드 3장끼리 순서가 바뀌는 경우 3!만큼

나누어 주게되면 그 답을 쉽게 구할 수 있다?

 

정리하자면

 

 

출처 :https://mathmen.tistory.com/11

+ Recent posts