Метод Contains не использует оператор ==. В чем проблема?
Правильно.
Этот метод [Содержит] определяет равенство с помощью сопоставления равенства по умолчанию, как определено реализацией объекта метода IEquatable.Equals для T (тип значений в списке).
http://msdn.microsoft.com/en-us/library/bhkz42b3 ( v = vs.110) .aspx
Вы также должны переопределить Equals (). Обратите внимание, когда вы перегружаете Equals (), почти всегда правильно также отменять GetHashCode ().
Сначала вы должны реализовать Extended Euclidean Algorithm :
public static BigInteger Egcd(BigInteger left,
BigInteger right,
out BigInteger leftFactor,
out BigInteger rightFactor) {
leftFactor = 0;
rightFactor = 1;
BigInteger u = 1;
BigInteger v = 0;
BigInteger gcd = 0;
while (left != 0) {
BigInteger q = right / left;
BigInteger r = right % left;
BigInteger m = leftFactor - u * q;
BigInteger n = rightFactor - v * q;
right = left;
left = r;
leftFactor = u;
rightFactor = v;
u = m;
v = n;
gcd = right;
}
return gcd;
}
И затем
public static BigInteger ModInverse(BigInteger value, BigInteger modulo) {
BigInteger x, y;
if (1 != Egcd(value, modulo, out x, out y))
throw new ArgumentException("Invalid modulo", "modulo");
if (x < 0)
x += modulo;
return x % modulo;
}