#include <bits/stdc++.h>
using namespace std;
double a, b;
int dx[4] = {1, 1, -1, -1};
int dy[4] = {1, -1, 1, -1};
vector<pair<int, int> > A, B;
bool isRight(int x1, int y1, int x2, int y2) {
  if (x1 == x2 || y1 == y2) return false;
  double len = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
  if (len == a * a + b * b) return true;
  return false;
}
int main() {
  scanf("%lf%lf", &a, &b);
  for (int i = 1; i < a; i++) {
    double res = a * sin(acos((double)i / a)) + 1e-10;
    if (fabs(res - floor(res)) <= 1e-9) {
      A.push_back(make_pair(i, (int)res));
    }
  }
  for (int i = 1; i < b; i++) {
    double res = b * sin(acos((double)i / b)) + 1e-10;
    if (fabs(res - floor(res)) <= 1e-9) {
      B.push_back(make_pair(i, (int)res));
    }
  }
  for (int i = 0; i < A.size(); i++) {
    for (int j = 0; j < B.size(); j++) {
      for (int t = 0; t < 2; t++) {
        swap(B[j].first, B[j].second);
        for (int k = 0; k < 4; k++) {
          if (isRight(A[i].first, A[i].second, dx[k] * B[j].first,
                      dy[k] * B[j].second)) {
            puts("YES");
            puts("0 0");
            printf("%d %d\n", A[i].first, A[i].second);
            printf("%d %d\n", dx[k] * B[j].first, dy[k] * B[j].second);
            return 0;
          }
        }
      }
    }
  }
  puts("NO");
}
