如何解决如何在 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 inversion和mod 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 举报,一经查实,本站将立刻删除。