#include <bits/stdc++.h>
using namespace std;
struct A {
  int x, y;
  A(){};
  A(int xx, int yy) : x(xx), y(yy){};
};
void check(int v, vector<A>& av) {
  int dv = v * v, i;
  for (i = 1; i < v; i++) {
    int t = dv - i * i;
    int st = (int)sqrt(t);
    if (st < i) break;
    if (st * st == t) {
      av.push_back(A(i, st));
    }
  }
}
int main() {
  int i, j, a, b;
  bool flag;
  vector<A> av, bv;
  {
    scanf("%d %d", &a, &b);
    av.clear();
    bv.clear();
    check(a, av);
    check(b, bv);
    if (av.size() == 0 || bv.size() == 0) {
      printf("NO\n");
    } else {
      flag = false;
      for (i = 0; i < av.size(); i++) {
        for (j = 0; j < bv.size(); j++) {
          if (av[i].x * bv[j].y == av[i].y * bv[j].x &&
              !(av[i].y == bv[j].x && av[i].x == bv[j].y)) {
            flag = true;
            break;
          }
        }
        if (flag) break;
      }
      if (flag) {
        printf("YES\n");
        if (av[i].y == bv[j].x) {
          printf("0 0\n%d %d\n%d %d\n", av[i].y, av[i].x, -bv[j].x, bv[j].y);
        } else
          printf("0 0\n%d %d\n%d %d\n", av[i].x, av[i].y, -bv[j].y, bv[j].x);
      } else {
        printf("NO\n");
      }
    }
  }
}
