public static uint[] bmodexp(uint[] g, uint[] e, uint[] m)
{
var a = g.ToArray();
var l = e.Length - 1;
var n = m.Length * 2;
var mu = new uint[n + 1];
mu[n] = 1;
mu = bdiv(mu, m).q;
n = nbits(e[l]) - 2;
for (; l >= 0; l--)
{
for (; n >= 0; n -= 1)
{
a = bmod2(bsqr(a), m, mu);
if ((e[l] & (1 << n)) != 0) a = bmod2(bmul(a, g), m, mu);
}
n = bs - 1;
}
return a;
}