[알고리즘] 14. N 값 이하의 서로소 개수 구하기

문정준's avatar
Feb 11, 2025
[알고리즘] 14. N 값 이하의 서로소 개수 구하기

서로소 개수 구하기

  • 특정 값 이하의 서로소의 개수를 구하시오.
 

문제 분석

  • 오일러 피 함수 φ(n)=∣{m:1≤mn,gcd(mn)=1}∣
  • φ(n)은 n과 서로소이고 n보다 작은 자연수의 개수
  • 오일러 피 함수의 성질 1 : a, b가 서로소일 때, p(a)p(b) = p(ab)가 성립
    • notion image
  • 오일러 피 함수의 성질 2 : 소수 p의 a제곱의 서로소 개수는 p의 a제곱 - p의 (a-1)제곱과 같음
notion image
 

코드 작성 - Sampling, Moduling

package algo; public class Coprime01 { public static void main(String[] args) { // 1. Sampling : 10 이하의 서로소를 찾으시오. // 2. Hard Coding : 특징 찾기 1 - 10의 서로소 : 1, 3, 7, 9 - 4개 // 2. Hard Coding : 특징 찾기 2 - N이 짝수면, 2의 배수는 전부 서로소가 되지 못함 // 2. Hard Coding : 특징 찾기 3 - N-1은 무조건 서로소 (10과 9는 서로소) // 2. Hard Coding : 특징 찾기 4 - N이 소수면, 나머지 수들은 전부 서로소 (소수는 약수를 1과 자신밖에 가지지 않음) // 2. Hard Coding : 특징 찾기 5 - N이 소수의 거듭제곱이면, 그 소수를 제외한 나머지 수들은 전부 서로소 // 2. Hard Coding : 특징 찾기 6 - 오일러 피 함수 1 : 서로소인 a, b에 대하여 p(a*b) = p(a)*p(b) // 2. Hard Coding : 특징 찾기 7 - 오일러 피 함수 2 : p(n^a) = n^a - n^a-1 // 2. Hard Coding : 특징 찾기 8 - N과 특정 수(a)의 최대 공약수가 1이면 서로소 int a = 0, count = 0; final int N = 121; Uc f = new Uc(); // 3. Moduling : 코드 간소화 for (int i = 0; i < N; i++) { a++; if (f.gcd(a, N) == 1) { System.out.println(a + "는 서로소입니다."); count++; } else System.out.println(a + "는 서로소가 아닙니다."); } System.out.println(N + "의 서로소의 개수 : " + count); // QA : N = 121 (11^2)일 때, 서로소의 개수 // 오일러 피 함수 공식 : p(11^2) = 11^2 - 11^1 = 121 - 11 = 110 (O) } }
Hard Coding으로 알아낸 특징
  1. 서로소의 특징들 (코드에는 미적용 요소)
      • N이 짝수면 2의 배수는 서로소가 아님
      • N-1은 무조건 서로소
      • N이 소수면 나머지 수들은 전부 서로소
      • N이 소수의 거듭제곱이면 그 소수를 제외한 나머지 수는 서로소
        • 오일러 피 함수 2
  1. 오일러 피 함수
      • 서로소인 a, b에 대해 p(a*b) = p(a)*p(b)
      • 소수 p의 a제곱의 서로소 개수는 p의 a제곱 - p의 (a-1)제곱과 같음
  1. 서로소의 특징
      • 서로소인 두 수의 최대 공약수는 1
 

결과

notion image
Share article

sxias