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; }