백준 13319번 문제 링크
문제 이름 : 가짜 소수
주 언어 : Python
추가 언어 : TEXT
태그 : 수학 / 정수론 / 구성적 / 소수 판정 / 런타임 전의 전처리 / 페르마의 소정리
solved.ac 등급 : Gold I (2023/02/11 확인)
문제에서 2^{n - 1} \equiv 1 \pmod{n} 을 만족하는 가장 작은 합성수인 Poulet Number 341대신 가장 작은 카마이클 수 561을 예시로 준 지점에서 힌트를 얻을 수 있습니다.
\gcd(a, n) = 1인 모든 a에 대하여 a^{n - 1} \equiv 1 \pmod{n}인 합성수 n이 카마이클 수 이므로, 문제에서 2 \leq a \leq 500인 모든 a에 대하여 a^{n - 1} \equiv 1 \pmod{n}이려면 카마이클 수 n의 가장 작은 소인수가 500보다 커야한다는 것을 알 수 있습니다.
카마이클 수인지를 판단하기 위해서 코셀트 판정법 을 응용하여 6m + 1, 12m + 1, 18m + 1이 모두 소수 라면 (6m + 1) (12m + 1) (18m + 1) 은 카마이클 수라는 정리를 이용해줍니다.
이 때는 6m + 1 > 500이면 되므로, 편의상 m = 100인 경우인 601, 1201, 1801이 소수인지 WolframAlpha에 검색해봤는데 (검색창에 N is prime? 이라고 치면 N이 소수인지 아닌지 알려줍니다.)
601 is Prime? / 1201 is Prime? / 1801 is Prime?
한번에 그냥 모두 소수로 나와서 당황했습니다.
6m + 1 > 500일 때 6m + 1, 12m + 1, 18m + 1이 모두 소수인지 일일히 소수판별법으로 판단해야하나 싶었는데 다행히도 그럴 일이 없었고, 다음과 같은 코드로 13319번을 통과했습니다.
print(601*1201*1801, 601) |
1299963601 601 |
N번째 푼 문제 (2022/XX/XX)