#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y;
};
vector<node> a[1005];
bool change(int x1, int y1, int x2, int y2) {
  bool flag = true;
  if (-x1 * x2 + y1 * y2 == 0 && y1 != y2) {
    printf("YES\n%d %d\n%d %d\n%d %d\n", 0, 0, -x1, y1, x2, y2);
  } else if (-x1 * y2 + y1 * x2 == 0 && y1 != x2) {
    printf("YES\n%d %d\n%d %d\n%d %d\n", 0, 0, -x1, y1, y2, x2);
  } else if (-y1 * x2 + x1 * y2 == 0 && x1 != y2) {
    printf("YES\n%d %d\n%d %d\n%d %d\n", 0, 0, -y1, x1, x2, y2);
  } else if (-y1 * y2 + x1 * x2 == 0 && x1 != x2) {
    printf("YES\n%d %d\n%d %d\n%d %d\n", 0, 0, -y1, x1, y2, x2);
  } else
    flag = false;
  return flag;
}
int main() {
  int i, j;
  int x, y;
  int ans, num;
  node cur;
  for (i = 1; i <= 1000; ++i) {
    for (j = i; j <= 1000; ++j) {
      ans = (int)sqrt(i * i + j * j);
      if (ans > 1000) continue;
      if (ans * ans == i * i + j * j) {
        cur.x = i;
        cur.y = j;
        a[ans].push_back(cur);
      }
    }
  }
  bool flag = false;
  scanf("%d %d", &x, &y);
  for (i = 0; i < a[x].size(); i++) {
    for (j = 0; j < a[y].size(); j++) {
      if (change(a[x][i].x, a[x][i].y, a[y][j].x, a[y][j].y)) {
        flag = true;
        break;
      }
    }
    if (flag) break;
  }
  if (!flag) printf("NO\n");
  return 0;
}
