티스토리 뷰
Number Theory with Code - 2. G.C.D and Euclid Algorithm
MathTrauma 2022. 12. 2. 19:49예고한 것처럼 '최대 공약수'를 다룬다. 두 정수의 '최대 공약수'가 두 수의 '일차결합'으로 표현된다는 점은 반드시 명심하자.
또한 이번 글에서 접혀있지 않은 증명은 모두 숙지해야 이후의 삶이 편해진다.
-
-
and -
and
정의는 이해가 되는데, 최대공약수를 구하는 방법이 궁금하다.
지난 시간에 공부한
[단독]
일차 결합은 공약수의 배수라 했으니 '최대공약수'는 모든 공약수의 배수가 된다!
'최소'라는 단어에 반응해서 '정렬성'을 떠올렸다면 훌륭하다. 온통 문자로 뒤덮혀서 뭔지 모를 집합에서 어떤 성질이 성립한다는 명제는 존재를 보장해주는 공리나 정리가 사용될 확률이 높다.
세 개 이상의 정수에 대해서도 같은 방식으로 최대공약수가 일차결합으로 표현된다.
집합
증명은 앞의 증명과 완전히 같으므로 생략한다. 다시 한 번 말하지만 4개 이상의 정수에 대해서도 같은 방식이 적용된다.
이 명제의 증명은 어렵지 않으나 상황 파악을 위해서 구체적인 예를 몇 개 다루어 보는 것이 좋겠다. 중고교 과정에서는 문자가 아닌 구체적인 두 수에 대해 '소인수 분해' 등을 통해서 최대공약수를 구했을 것이다. 그래서 일차결합으로 최대공약수가 표현된다는 사실이 잘 와닿지 않을 수 있기 때문이다.
20, 36 의 최대공약수는 4 이다. 일차결합으로 표현해 보자.
만약 정수
일차결합은 공약수(최대공약수 포함)의 배수임에 틀림없으니 2의 약수 중 하나가 최대공약수이겠지만
위의 경고에 해당되지 않는 특수한 경우인
최대공약수가 1인 두 수를 '서로 소'라고 한다.
-
이고 이면, 이다.일차결합 문법으로 써보자. 여기서 이므로 이다. -
이고 이면, 이다.
최대공약수가 두 수의 일차결합으로 표현됨을 알았지만, 집합
보조 정리의 식에서
최대공약수가 일차결합으로 표현된다는 사실과 보조 정리를 이용한 문제들을 몇 개 풀어보자.
-
이고 일 때, 임을 보여라. -
양의 정수
에 대하여 임을 보여라. -
일 때, 임을 보여라. -
일 때, 임을 보여라.
보조 정리의 힘으로 최대공약수를 구하는 알고리즘을 확보할 수 있다. 편의상
몫과 나머지를 반복적으로 구하는 다음 과정를 수행한다.
나머지는 점차 감소하므로 언젠가는 0이 되는데, 보조 정리로부터
위의 과정에서
이 결과는 반복적으로 적용되므로
'가까운 자연수'라는 표현이 등장한 차에 새로운 함수를 하나 정의하자.
정수
교육과정에서 '최대정수함수'라는 용어를 본 것 같은데, '바닥함수'로 쓰겠다. 어감이 좋다.
이쯤에서 연습을 조금 하는 것이 좋겠다.
-
이고 일 때, 이 정수이면 임을 증명하라. -
이고 일 때, 이면 가 정수가 아님을 보여라. (위 문제와 같은 문제이다.) -
임의의 정수
에 대하여 이 기약분수임을 보여라. ( 와 이 서로소임을 보여라. 제1회 IMO 1번 문제) -
두 자연수
과 (1988 자릿수) 의 최대공약수를 구하라.
With Code!
다음 코드에서 내부 함수(inner function)이 핵심이고 외부 코드는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def GCD(a,b): if a!=int(a) or b!=int(b): print('장난치지 마라!') return elif a==0 and b==0: print('둘 모두 0이면 최대공약수는 정의되지 않는다!') return if a>b : a,b=b,a def gcd(a,b): if a==0: return b return gcd(b%a, a) print(f'{a}, {b}의 최대공약수는 {gcd(a,b)} 입니다.') | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | function GCD (a, b) { if(a!==parseInt(a) || b!==parseInt(b)) return '뭐 하냐?'; else if (a===0 && b===0) return '0은 모든 수의 배수라서 둘 다 0이면 최대공약수 정의 안된다!'; if(a>b) { [a,b]=[b,a]; } console.log('a : '+a+ ' b: '+b); function gcd(a, b){ if(a==0) return b; return gcd(b%a,a); } return `두 정수 } | cs |
'Mathematics > Number Theory' 카테고리의 다른 글
[Number Theory with Code] 5. Wilson's Theorem (0) | 2023.01.09 |
---|---|
Number Theory with Code - 4. Congruence (0) | 2022.12.10 |
Number Theory with Code - 3. Prime and Unique Factorization (0) | 2022.12.07 |
Number Theory with Code - 1. Well-Ordering Principle, Division Algorithm (0) | 2022.08.30 |
- Total
- Today
- Yesterday
- 다익스트라
- persistent segment tree
- segment tree
- map
- bash
- number theory
- script
- dynamic programming
- stack
- bash script
- C++ big number
- JavaScript
- BOJ
- 세그먼트 트리
- Reference
- Aho-Corasick
- 정수론
- python3
- javascript array
- RUBY
- math font
- Shell Programming
- nearest common ancestor
- shell
- fenwick tree
- 백준
- Vim
- lazy propagation
- max flow
- Dijkstra
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
31 |