Как выполнить modinverse в C #

Метод Contains не использует оператор ==. В чем проблема?

Правильно.

Этот метод [Содержит] определяет равенство с помощью сопоставления равенства по умолчанию, как определено реализацией объекта метода IEquatable.Equals для T (тип значений в списке).

http://msdn.microsoft.com/en-us/library/bhkz42b3 ( v = vs.110) .aspx

Вы также должны переопределить Equals (). Обратите внимание, когда вы перегружаете Equals (), почти всегда правильно также отменять GetHashCode ().

0
задан Dmitry Bychenko 13 July 2018 в 14:36
поделиться

1 ответ

Сначала вы должны реализовать 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;
}
2
ответ дан Dmitry Bychenko 17 August 2018 в 12:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: