가짜소수

면접 대비

시간 제한1초메모리 제한128 MB

요약
각 입력에서 p가 합성수이면서 a^p mod p = a를 만족하는 의사소수인지 판정해 yes 또는 no를 출력한다.
난이도

보통10점 중 4점

유형
수학, 정수론, 이분 탐색, 비트 연산
정답자
아직 제출이 없습니다

문제

페르마의 소정리(Fermat's little theorem)는 다음과 같다.

pp가 소수이면, 11보다 큰 임의의 정수 aa에 대해 ap≡a(modp)a^p \equiv a \pmod{p}가 성립한다. 즉, aa를 pp제곱한 값을 pp로 나눈 나머지는 aa와 같다.

그런데 pp가 소수가 아니어도 어떤 정수 aa에 대해 위 합동식이 성립하는 경우가 있다. 이때 pp를 밑이 aa인 가짜소수(pseudoprime)라고 한다. (모든 aa에 대해 이 합동식을 만족하는 합성수를 카마이클 수라고 한다.)

pp와 aa가 주어졌을 때, pp가 밑이 aa인 가짜소수인지 판별하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 한 줄에 두 정수 pp와 aa가 공백으로 구분되어 주어진다. 입력의 마지막 줄에는 0 0이 주어지며, 이 줄은 처리하지 않는다.

2<p≤1092 < p \le 10^9, 1<a<p1 < a < p

출력

각 테스트 케이스마다 pp가 밑이 aa인 가짜소수이면 yes를, 아니면 no를 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    3 2
    10 3
    341 2
    341 3
    1105 2
    1105 3
    0 0
    
    예상 출력
    no
    no
    yes
    no
    yes
    yes