public static class BigIntegerModExt
public static (BigInteger LeftFactor,
BigInteger Gcd) Egcd(this BigInteger left, BigInteger right) {
BigInteger leftFactor = 0;
BigInteger rightFactor = 1;
BigInteger q = right / left;
BigInteger r = right % left;
BigInteger m = leftFactor - u * q;
BigInteger n = rightFactor - v * q;
return (LeftFactor: leftFactor,
RightFactor: rightFactor,
public static BigInteger ModInversion(this BigInteger value, BigInteger modulo) {
var egcd = Egcd(value, modulo);
throw new ArgumentException("Invalid modulo", nameof(modulo));
BigInteger result = egcd.LeftFactor;
public static BigInteger ModDivision(
this BigInteger left, BigInteger right, BigInteger modulo) =>
(left * ModInversion(right, modulo)) % modulo;
public static void Main()
BigInteger b = new BigInteger(12345678912345678912);
BigInteger mod = BigInteger.Pow(2, 64);
var modedInteger = b * 3712931 % mod;
BigInteger result = modedInteger.ModDivision(3712931, mod);
Console.WriteLine(result);
Console.WriteLine("***********************************");
BigInteger z = BigInteger.Pow(2, 64);
BigInteger x = new BigInteger(3456789123456789345);
BigInteger y = new BigInteger(3456789123456789345);
var xyModInt = x * y % z;
BigInteger resultX = xyModInt.ModDivision(y, z);
Console.WriteLine(xyModInt);
Console.WriteLine(resultX);
Console.WriteLine(resultX == x);