public static uint[] bmod2(uint[] x, uint[] m, uint[] mu)
{
var xl = x.Length - (m.Length << 1);
if (xl > 0) return bmod2(x.Slice(0, xl).Concat(bmod2(x.Slice(xl), m, mu)), m, mu);
int ml1 = m.Length + 1, ml2 = m.Length - 1;
uint[] rr;
//var q1=x.slice(ml2)
//var q2=bmul(q1,mu)
var q3 = bmul(x.Slice(ml2), mu).Slice(ml1);
var r1 = x.Slice(0, ml1);
var r2 = bmul(q3, m).Slice(0, ml1);
var r = bsub(r1, r2);
if (r.Length == 0)
{
r1[ml1] = 1;
r = bsub(r1, r2);
}
for (var n = 0; ; n++)
{
rr = bsub(r, m);
if (rr.Length == 0) break;
r = rr;
if (n >= 3) return bmod2(r, m, mu);
}
return r;
}