private static uint[] sub(uint[] x, int xl, uint[] y, int yl) {
Debug.Assert(xl >= yl);
uint[] z = new uint[xl];
int i;
bool borrow = false;
for (i = 0; i < yl; i++) {
uint xi = x[i];
uint yi = y[i];
if (borrow) {
if (xi == 0) {
xi = 0xffffffff;
borrow = true;
} else {
xi -= 1;
borrow = false;
}
}
if (yi > xi) borrow = true;
z[i] = xi - yi;
}
if (borrow) {
for (; i < xl; i++) {
uint xi = x[i];
z[i] = xi - 1;
if (xi != 0) { i++; break; }
}
}
for (; i < xl; i++) {
z[i] = x[i];
}
return z; // may have leading zeros
}