#include <bits/stdc++.h>
using namespace std;
long long int _seive_size;
bitset<1000000> bs;
vector<long long int> primes;
void seive(long long int upperbound) {
  _seive_size = upperbound + 1;
  bs.set();
  bs[0] = bs[1] = 0;
  for (long long int i = 2; i <= _seive_size; i++) {
    if (bs[i]) {
      for (long long int j = i * i; j <= _seive_size; j += i) {
        bs[j] = 0;
      }
      primes.push_back((int)i);
    }
  }
}
bool isTrime(long long int N) {
  long long int temp;
  long long int start = 0;
  long long int end = primes.size() - 1;
  while (start <= end) {
    long long int mid = start + (end - start) / 2;
    temp = primes[mid] * primes[mid];
    if (temp == N) {
      return true;
    } else if (temp < N) {
      start = mid + 1;
    } else {
      end = mid - 1;
    }
  }
  return false;
}
int main() {
  seive(1000000);
  long long int n;
  cin >> n;
  long long int arr[n];
  for (int i = 0; i < n; i++) {
    cin >> arr[i];
  }
  for (int i = 0; i < n; i++) {
    if (isTrime(arr[i])) {
      cout << "YES" << endl;
    } else {
      cout << "NO" << endl;
    }
  }
  return 0;
}
