微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。