public BigInteger ModPow(BigInteger power, BigInteger mod) {
if (object.ReferenceEquals(power, null)) {
throw new ArgumentNullException("power");
}
if (object.ReferenceEquals(mod, null)) {
throw new ArgumentNullException("mod");
}
if (power < 0) {
throw new ArgumentOutOfRangeException(MathResources.NonNegativePower);
}
BigInteger factor = this;
BigInteger result = One % mod;
while (power != Zero) {
if (power.IsOdd()) {
result = result * factor;
result = result % mod;
}
if (power == One) break; // avoid costly factor.Square()
factor = factor.Square();
factor = factor % mod;
power >>= 1;
}
return result;
}