CS - 뫼비우스 함수

CS - 뫼비우스 함수
Photo by Daniil Silantev / Unsplash

Introduction

혹시 궁금해하는 사람을 위해 미리 말해두지만, 이 뫼비우스가 아니다.

Morbius (film)

이분이다.

August Ferdinand Möbius

이름 자체는 수학 함수의 대부분이 그렇듯이 만든 사람 이름 따온 별거 아닌 것 같지만, 그 효과만큼은 대단하다. 오늘은 뫼비우스 함수, 그리고 그것을 확장한 뫼비우스 반전 공식을 살펴보자.

Before We Begin..

시작하기 전에, 함수들이 어떻게 생겼는지 정도만 알아보고 가자. 뫼비우스 함수는 아래와 같이 생겼다.

\[\mu(n) = \begin{cases}
1 & \text{if } n = 1 \\
(-1)^k & \text{if } n \text{ is the product of } k \text{ distinct primes} \\
0 & \text{if } n \text{ is divisible by a square } > 1
\end{cases}\]

뫼비우스 반전 공식은 아래와 같다.

\[f(n) = \sum_{d|n} \mu(d)g(\frac{n}{d}) \text{ for every integer }n \geq 1\]

이제부터 각 함수의 자세한 내막을 알아보자.

The Möbius Function

바로 위에 있긴 하지만, 뫼비우스 함수는 아래와 같이 생겼다.

\[\mu(n) = \begin{cases}
1 & \text{if } n = 1 \\
(-1)^k & \text{if } n \text{ is the product of } k \text{ distinct primes} \\
0 & \text{if } n \text{ is divisible by a square } > 1
\end{cases}\]

즉, 1이면 함수는 1, 제곱수로 나누어지면 함수는 0, 아니면 -1의 소수 개수 제곱을 하면 된다.

아래에서 설명하는 것이 조금 더 적절하겠지만, 미리 예열을 해놓자면, 이는 곧 포함과 배제의 기본 배경을 마련한다.

Example

간단한 예시를 생각해보자. 내가 만일 손으로 \(\phi (n)\)를 구하려고 한다면, 식을 어떻게 세워야 할까?

\(n=p_1^{k_1} \cdot p_2^{k_2} \cdot \cdot \cdot p_n ^{k_n} (p_i \in \mathbb{P} \text{, the set of primes})\)이라 생각해보자. 그럼 \(\phi(n)\)를 전개해보면 아래와 같이 될 것이다.

\[\phi(n) = n - \sum_{p | n} \lfloor \frac{n}{p} \rfloor + \sum_{p_i | n} \sum_{p_j | n \text{ & } i < j} \lfloor \frac{n}{p_i p_j} \rfloor\ - \cdot \cdot \cdot (p_k\text{ are all primes)}\]

여기서 눈여겨볼 점은 각 \( \sum\) 앞의 부호이다. 현재 처리하고 있는 '소인수의 개수'를 \(k\)라고 한다면 항 앞의 부호가 \((-1)^k\)가 된다는 것을 알 수 있다. 어디서 많이 본 듯한 식이다.

Compression

Stage 1 : the basics

자 그럼 저 위에 식을 압축할 방법이 있을까? 생각해보자. 만일 \( \sum\)에서 순회하는 값들을 '소인수'가 아니라 '약수'로 바꾸면 어떨까? 식이 아래와 같이 압축된다 :

\[\phi(n) = \sum_{p | n} (-1)^{\omega (n)} \lfloor \frac{n}{p} \rfloor \]

단순 감으로 보면 이게 끝일 것 같을수도 있지만, 우리가 고려 안한 케이스가 있다.

Stage 2 : squares

\(\phi(18) \)를 생각해보자. 18을 소인수분해한다면 2 * 3 * 3이 나올 것이다. 하지만, 우리는 "2개의 소인수로 구성된" 수들을 셀때 9를 세지는 않는다. 왜 그럴까? 이것은 이미 3때 처리되었기 때문이다. 즉, 우리는 같은 소인수가 2번 이상 반복될 경우 사실상 그것이 없는 것처럼 처리해야 한다는 것을 알 수 있다.

Stage 3 : final cleanup

그럼 지금까지 나온 점들을 정리해보자.

\(\phi(n) = \sum_{p | n} k(x) \lfloor \frac{n}{p} \rfloor \)라는 식이 있다고 해보자. 지금까지의 정보를 조합하여 \(k(x)\)를 서술해본다면,

\[k(x) = \begin{cases}
(-1)^k & \text{if } x \text{ is the product of } k \text{ distinct primes} \\
0 & \text{if } x \text{ is divisible by a square } > 1
\end{cases}\]

1은 소인수 0개라고 정리한다면, 저 식은 사실상 \( \mu(n)\)의 식이 된다.

The Mobius Inversion Formula

자, 그럼 위에서 유도한 사실을 공식으로 정리하면 무엇이 될까? 첫 함수의 \((-1)^{\omega (n)}\)를 \(\mu(n)\)으로 치환한다면 아래와 같은 식이 된다.

\[\phi(n) = \sum_{p | n} \mu (n) \lfloor \frac{n}{p} \rfloor \]

축하한다, 이걸 마지막으로 여러분은 뫼비우스 반전 공식, Mobius Inversion Formula를 유도해낸 것이다.

여기서 포인트는 이것이 일반화가 가능하다는 것이다. 서로 간의 합으로 표현되는(\(f(x) = \sum_{d | x} g(d)\)) 함수들은 이 inversion formula를 통하여 역변환이 가능하다(\(g(x) = \sum_{d | x} \mu(d) f(\frac{x}{d})\)).

Example Problem

다른 예시를 살펴보자. 백준 문제이다.

1557번: 제곱 ㄴㄴ

무언가 익숙해 보인다. 대충 문제의 조건을 식으로 표현하면,

\[\phi(n) = n - \sum_{p}^{p < \sqrt{n}} \lfloor \frac{n}{p^2} \rfloor + \sum_{p_i}^{p_i < \sqrt{n}} \sum_{p_j, i < j}^{p_j < \sqrt{n}} \lfloor \frac{n}{p_i^2 p_j^2} \rfloor\ - \cdot \cdot \cdot \text{(p_k are all primes)}\]

이제는 확실하다. 압축하면,

\[\phi(n) = \sum_{p}^{p < \sqrt{n}} \mu (n) \lfloor \frac{n}{p^2} \rfloor \]

가 된다. 풀이 끝이다. 정답 코드가 궁금하다면 여기에 첨부하였다.

Conclusion

오늘은 정보과학에서 함수의 역함수 계산, 그리고 포함과 배제 구현에 도움이 많이 되는 뫼비우스 함수와 반전 공식에 대하여 알아보았다.