public BigInteger Difference (BigInteger a, BigInteger b)
{
Sign cmp = Kernel.Compare (a, b);
BigInteger diff;
switch (cmp) {
case Sign.Zero:
return 0;
case Sign.Positive:
diff = a - b; break;
case Sign.Negative:
diff = b - a; break;
default:
throw new Exception ();
}
if (diff >= mod) {
if (diff.length >= mod.length << 1)
diff %= mod;
else
BarrettReduction (diff);
}
if (cmp == Sign.Negative)
diff = mod - diff;
return diff;
}