수와 연산 · 집합 · 복소수
2주차에서 다룬 수 체계의 기초를 정리한다. 진법과 지수·로그, 합·곱 연산자, 집합론의 기본 연산, 수열과 급수, 그리고 복소수를 순서대로 살펴본다.
진법
진법base 은 수를 셀 때 자릿수가 올라가는 단위의 기준을 으로 하는 셈법이다. 우리가 흔히 쓰는 것은 진법이고, 컴퓨터 과학에서는 주로 진법을 쓴다.- 임의의 자연수
와 에 대해 다음과 같이 표현할 수 있으며, 이 표현은 존재성existence과 유일성uniqueness을 가진다.
- 이를
로 표기하며, 진법은 아래첨자를 생략한다. - 진법 변환은 변환하려는 수를 목표 진법 수로 나누어 가며 생기는 나머지를 역순으로 나열해 수행한다. 예를 들어
진수 를 진법으로 바꾸는 과정은 다음과 같다.
- 유리수·무리수·복소수 진법도 정의할 수 있다.
python
def to_base(a, n):
if a == 0:
return "0"
digits = []
while a > 0:
digits.append(a % n) # 나머지를 모으고
a //= n
return "".join(str(d) for d in reversed(digits)) # 역순으로 나열
for a, n in [(345, 7), (13, 2), (100, 5)]:
print(f"{a}(10) = {to_base(a, n)}({n})")
# 역변환으로 검증: 7진수 1002 -> 10진수
s = "1002"
val = sum(int(d) * 7**i for i, d in enumerate(reversed(s)))
print("1002(7) =", val, "(10)")지수와 로그
- 임의의 수
를 번 거듭해 곱한 것을 으로 표기한다. 지수exponent는 다음 성질을 가진다.
- 로그log는 지수의 역연산으로 다음과 같이 정의된다.
- 컴퓨터 과학에서는 밑을
로, 자연과학·공학에서는 (자연로그 )을, 경제학·일상에서는 (상용로그)을 약속한다. - 정의로부터 다음 성질이 유도된다.
합 연산과 곱 연산
- 합 연산자
와 곱 연산자 는 다음과 같이 정의된다.
- 두 연산자는 각각 다음 성질을 가진다.
python
import numpy as np
# 로그 밑 변환 공식으로 log_2 B 계산: log_2 B = ln B / ln 2
for B in [1, 2, 1024]:
print(f"log2({B}) = {np.log(B)/np.log(2):.4f}")
# 합 연산자로 라이프니츠 급수를 계산해 pi/4 근사
n = np.arange(0, 100000)
s = np.sum((-1.0)**n / (2*n + 1)) # 1 - 1/3 + 1/5 - 1/7 + ...
print(f"\n4 x (부분합) = {4*s:.6f}, np.pi = {np.pi:.6f}")집합
- 집합set
에 원소element 가 속하면 , 아니면 로 쓴다. 모임collection·족family은 집합의 동의어이다. 는 조건 을 만족하는 모든 의 집합이며, 원소가 없는 집합을 공집합empty set 이라 한다. 의 모든 원소가 의 원소이면 를 의 부분집합subset이라 하고 로 표기한다.
의 모든 부분집합을 모은 집합을 멱집합power set 라 한다. 원소가 개이면 이다.
- 합집합union·교집합intersection·차집합set difference은 다음과 같다.
이면 두 집합은 서로소disjoint set이며, 일 때 를 의 여집합complement이라 한다.
분배 법칙과 드 모르간의 법칙
분배 법칙distributive law:
드 모르간의 법칙De Morgan's laws (
- 색인 집합index set
에 대해 색인indexed된 모임 의 합집합·교집합은 다음과 같이 일반화된다.
- 수 체계는 자연수natural number
(페아노 공리계Peano's axioms로 정의)에서 시작해 확장된다.
- 무리수irrational number
는 정수비로 나타낼 수 없는 수이고, 실수real number 이며, 허수단위 에 대해 복소수complex number 이다. - 볼록 집합convex set
는 을 만족하는 집합으로, 두 점을 잇는 선분이 항상 집합에 포함된다. 최적화·기계학습machine learning에서 서포트 벡터 머신support vector machine의 결정 경계 문제 등 볼록 최적화의 기반이 된다.
python
from itertools import combinations
A = {0, 1, 2}
B = {1, 2, 3}
print("A ∪ B =", A | B)
print("A ∩ B =", A & B)
print("B \\ A =", B - A)
# 멱집합 구성
elems = sorted(A)
power = [set(c) for r in range(len(elems)+1) for c in combinations(elems, r)]
print(f"\n|P(A)| = {len(power)} (= 2^{len(elems)})")
print("P(A) =", [sorted(s) for s in power])수열과 급수
- 수열sequence은 자연수 집합을 정의역으로 하는 함수로
처럼 표기한다. 대표적인 수열은 다음과 같다.
- 피보나치 수열Fibonacci sequence은 점화식과 일반항으로 다음과 같이 주어진다.
Thm. 피보나치 수열의 이웃한 두 항은 항상 서로소이다
- 수열
의 부분합 의 극한limit을 급수series라 한다.
- 극한값이 실수로 수렴converge하면 급수가 수렴한다고 하고, 그렇지 않으면 발산diverge한다고 한다. 급수는 "부분합의 극한"이지 "무한 번 더하는 것"이 아니며, 리만 재배열 정리Riemann rearrangement theorem가 그 차이를 보여준다.
- 테일러 급수Taylor series는 함수
를 점 주변에서 다항식의 합으로 전개한다. 인 경우를 매클로린 급수Maclaurin series라 한다.
- 전개 차수가 높을수록 원래 함수에 가까워진다. 예를 들어
의 매클로린 전개는 다음과 같다.
복소수
- 복소수
에서 를 실수부, 를 허수부라 한다. 켤레복소수complex conjugate와 절댓값absolute value은 다음과 같다.
- 복소수의 덧셈과 곱셈은 다음과 같이 정의되며, 둘 다 결합법칙associative property·교환법칙commutative property을 만족하고 항등원·역원이 존재한다(곱셈의 역원
).
- 복소수는 행렬 표현matrix representation으로도 나타낼 수 있다. 특히 단위허수
의 행렬 표현은 회전 행렬rotation matrix과 같다.
- 이를 일반화하면
은 각도 의 회전에 대응하며, 로 주기 를 갖는다. - 극형식polar form은 편각
를 이용해 로 쓴다. 제1사분면에서는 이며(일반적으로는 를 사용), 여기서 오일러 공식Euler's formula을 얻는다.
python
import numpy as np
from math import gcd
# 피보나치 수열과 이웃 항의 서로소성
F = [1, 1]
for _ in range(10):
F.append(F[-1] + F[-2])
print("피보나치 F =", F)
print("이웃 항 gcd =", [gcd(F[i], F[i+1]) for i in range(len(F)-1)])
# 복소수 i^n 의 주기성과 오일러 공식
print("\ni^n 의 주기성:")
for n in range(5):
print(f" i^{n} = {np.round(1j**n, 2)}")
print("오일러 공식 e^(iπ)+1 =", np.round(np.exp(1j*np.pi) + 1, 4))