오일러 피 함수

NK590·2023년 10월 4일
0

정의

오일러 피 함수(Euler phi function) φ(n)\varphi(n)는 정수론에서 정의되는 함수 중의 하나로, 다음과 같다.

φ(n){m:1mn,gcd(m,n)=1}(nN)\varphi(n) \equiv |\{m : 1 \leq m \leq n, \gcd(m, n) = 1\}| \quad (n \in \mathbb{N})

즉, φ(n)\varphi(n)은 1보다 크거나 같고 nn보다 작은 정수, 즉 nn 이하 자연수들 중에서 nn과 서로소인 수의 개수이다.

nn의 값에 따른 φ(n)\varphi(n)의 값을 일부 나타내면 다음과 같다.

nnφ(n)\varphi(n)
11
21
32
42
54
104
208
5020

성질

오일러 피 함수가 만족하는 성질은 다음과 같다.

  • 자연수 a,ba, b에 대해 gcd(a,b)=1\gcd(a, b) = 1이라면, φ(ab)=φ(a)φ(b)\varphi(ab) = \varphi(a)\varphi(b).
  • 임의의 자연수 kk와 소수 pp에 대해, φ(p)=p1, φ(pk)=pk1(p1)\varphi(p) = p-1,\ \varphi(p^k) = p^{k-1}(p-1)
  • 자연수 m,nm, n에 대해 mnm | n이면, φ(m)φ(n)\varphi(m) | \varphi(n)도 성립한다.

오일러 곱 공식

여기에서 다음과 같은 오일러 곱 공식(Euler's product formula)를 유도 가능하다.

φ(n)=npn(11p)\varphi(n) = n\prod_{p | n}\left(1 - \frac{1}{p} \right)

여기서, pn\prod_{p | n}nn을 나누어 떨어지게 만드는 소수 pp에 대한 곱이다.

오일러 곱 공식 증명

자연수 nn은 소수들로 소인수분해 가능하다. 즉, 다음과 같이 쓸 수 있다.

n=p1k1p2k2pikin = p_1^{k_1}p_2^{k_2}\cdots p_i^{k_i}

이를 오일러 피 함수에 대입하면 다음과 같다.

φ(n)=φ(p1k1p2k2piki)=φ(p1k1)φ(p2k2)φ(piki)=p1k11(p11)p2k21(p21)piki1(pi1)=p1k1p2k2piki(11p1)(11p2)(11pi)=npn(11p)\begin{aligned} \varphi(n) &= \varphi(p_1^{k_1}p_2^{k_2}\cdots p_i^{k_i}) \\ &= \varphi(p_1^{k_1})\varphi(p_2^{k_2})\cdots\varphi(p_i^{k_i}) \\ &= p_1^{k_1 - 1}(p_1 -1)p_2^{k_2 - 1}(p_2 -1)\cdots p_i^{k_i - 1}(p_i -1) \\ &= p_1^{k_1}p_2^{k_2}\cdots p_i^{k_i}\left(1 - \frac{1}{p_1}\right)\left(1 - \frac{1}{p_2}\right)\cdots\left(1 - \frac{1}{p_i}\right) \\ &= n\prod_{p | n}\left(1 - \frac{1}{p} \right) \end{aligned}

증명이 완료되었다.


오일러 피 함수 구현

오일러 피 함수는 위의 성질들을 이용해 다음과 같이 c++ 코드로 구현 가능하다.

#include <bits/stdc++.h>

typedef long long ll;

ll phi(ll k) {
    ll result = k;
    for (ll i = 2; i*i <= k; i++) {
        if (k % i == 0) {
            result -= result / i;
            while (k % i == 0) {
                k /= i;
            }
        }
    }
    if (k > 1) {
        result -= result / k;
    }
    return result;
}
profile
AI 엔지니어 (진)

0개의 댓글