如何在 C# 中执行乘法逆运算

问题描述

我有以下代码:

BigInteger b = new BigInteger(12345678912345678912);
var modedInteger = b * 3712931 % (2 ^ 64);

鉴于此,我将如何获得 b from modedInteger 的值?我看到我们可以使用 BigInteger.ModPow() 但我不确定...

解决方法

好吧,您可以尝试从扩展欧几里德算法开始,例如(让它实现为扩展方法

    public static (BigInteger LeftFactor,BigInteger RightFactor,BigInteger Gcd) Egcd(this BigInteger left,BigInteger right) {
      BigInteger leftFactor = 0;
      BigInteger 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 (LeftFactor: leftFactor,RightFactor: rightFactor,Gcd: gcd);
    }

然后你可以继续mod inversionmod Division

    public static BigInteger ModInversion(this BigInteger value,BigInteger modulo) {
      var egcd = Egcd(value,modulo);

      if (egcd.Gcd != 1)
        throw new ArgumentException("Invalid modulo",nameof(modulo));

      BigInteger result = egcd.LeftFactor;

      if (result < 0)
        result += modulo;

      return result % modulo;
    }

    public static BigInteger ModDivision(
      this BigInteger left,BigInteger right,BigInteger modulo) =>
           (left * ModInversion(right,modulo)) % modulo;

最后,您的测试:

  BigInteger b = new BigInteger(12345678912345678912);

  //DONE: Please,note that ^ stands for XOR,so 2 ^ 64 == 66
  BigInteger mod = BigInteger.Pow(2,64);

  var modedInteger = b * 3712931 % mod;

  BigInteger result = modedInteger.ModDivision(3712931,mod);

  Console.Write(result);

结果:

 12345678912345678912

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...