/*
直接费马小定理
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#define ll long long
using namespace std;
ll slow_mul(ll a,ll b,ll c)
{
ll ans=0;
a=a%c;b=b%c;
while(b)
{
if(b&1)
{
b--;
ans+=a;
ans%=c;
}
a<<=1;a%=c;b>>=1;
}
return ans;
}
ll Mi(ll p,ll a,ll mod)
{
if(p==0)return 1;
ll x=Mi(p/2,a,mod)%mod;
x=slow_mul(x,x,mod);
if(p%2==1)x=slow_mul(x,a,mod);
return x;
}
int main()
{
srand(unsigned(time(0)));
ll p,d,a;
cin>>p;
int falg=0;
if(p==2)
{
printf("Yes");
return 0;
}
if(p==1)
{
printf("No");
return 0;
}
for(int i=1;i<=10;i++)
{
a=rand()%(p-1)+1;
d=Mi(p-1,a,p);
if(d!=1)
{
falg=0;
break;
}
else falg=1;
}
if(falg==1)printf("Yes");
else printf("No");
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#define ll long long
#define T 10
using namespace std;
ll slow_mul(ll a,ll b,ll c)//防止爆掉
{
ll ans=0;
a=a%c;b=b%c;
while(b)
{
if(b&1)
{
b--;ans+=a;
ans=ans%c;
}
a=a<<1;a=a%c;
b=b>>1;
}
return ans;
}
ll Mi(ll a,ll m,ll n)//快速幂 a^m%n
{
if(m==0)return 1;
ll x=Mi(a,m/2,n)%n;
x=slow_mul(x,x,n);
if(m%2==1)x=slow_mul(x,a,n);
return x;
}
bool Miller_Rabin(ll n)
{
if(n<2)return 0;
if(n==2)return 1;
if(n%2==0)return 0;
ll m=n-1,j=0;
while(m%2==0)//计算m j 使得n-1=m*2^j且j尽量大
{
j++;
m >>=1;
}
srand(unsigned(time(0)));
for(int i=1;i<=T;i++)//T次测试
{
ll a=rand()%(n-1)+1;
ll x=Mi(a,m,n);//计算a^m%n
ll y;
for(int k=1;k<=j;k++)
{
y=slow_mul(x,x,n);
if(y==1&&x!=1&&x!=n-1)return 0;//一定不是素数
x=y;
}
if(x!=1)return 0;//不符合费马小定理
}
return 1;
}
int main()
{
ll n;
cin>>n;
if(Miller_Rabin(n))printf("Yes\n");
else printf("No\n");
}