/* 题目的意思很简单,就是求伪素数 wrong 之后就开始怀疑自己的算法有问题, 在别的oj交RE, 于是一直找不到错误。 有时候自信很重要的!! */ import java.util.*; import java.io.*; import java.math.*; public class Main1905 { static final int N = 40005; static boolean hash[] = new boolean[N]; static int prime[] = new int[N / 2]; static int p; public static void main(String[] args) { Scanner cin = new Scanner(System.in); int pp, a; Prime(); while(cin.hasNext()) { pp = cin.nextInt(); a = cin.nextInt(); if(pp == 0 && a == 0) break; //if(!hash[pp] || oula(pp) == pp -1) // 这里画蛇添足一直RE, 好久才检查差出来的 if(oula(pp) == pp - 1) { System.out.println("no"); continue; } // 是素数的话输出 no long temp = Erfen(a, pp, pp); if((int)temp == a ) { System.out.println("yes"); continue; } else { System.out.println("no"); continue; } } } static void Prime() { Arrays.fill(hash, (boolean)false); int tt = (int)Math.sqrt(1.0 * N); for(int i = 2; i < tt; i++) if(!hash[i]) for(int j = 2; j * i < N; j++) hash[i * j] = true; p = 0; for(int i = 2; i < N; i++) if(!hash[i]) prime[p++] = i; } static long Erfen(int a, int n, int mod) { long b = 1; long aa = a; while(n > 0) { if(n % 2 == 1) { n--; b *= aa; b %= mod; } else { aa *= aa; aa %= mod; n >>= 1; } } return b; } static int oula(int n) { int temp = n; int sum = n; for(int i = 0; i < p; i++) { if(temp % prime[i] != 0) continue; if(prime[i] > temp) break; while(temp % prime[i] == 0) { temp /= prime[i]; } sum = sum / prime[i] * (prime[i] - 1); } if(temp > 1) sum = sum / temp * (temp - 1); return sum; } }