public static uint[] bsub(uint[] a, uint[] b)
{
var al = a.Length;
var bl = b.Length;
if (bl > al) return new uint[] { };
if (bl == al)
{
if (b[bl - 1] > a[bl - 1]) return new uint[] { };
if (bl == 1) return new uint[] { a[0] - b[0] };
}
var r = new uint[al];
uint c = 0;
int n;
for (n = 0; n < bl; n++)
{
c += a[n] - b[n];
r[n] = (uint)(c & bm);
c >>= bs;
}
for (; n < al; n++)
{
c += a[n];
r[n] = (uint)(c & bm);
c >>= bs;
}
if (c != 0) return new uint[] { };
return zclip(r);
}