private static uint div(uint[] n, ref int nl, uint d) {
ulong rem = 0;
int i = nl;
bool seenNonZero = false;
while (--i >= 0) {
rem <<= BitsPerDigit;
rem |= n[i];
uint v = (uint)(rem / d);
n[i] = v;
if (v == 0) {
if (!seenNonZero) nl--;
} else {
seenNonZero = true;
}
rem %= d;
}
return (uint)rem;
}