public void ExtendedEuclideanAlgorithmTest(int a, int b, int expectedGcd, int expectedX, int expectedY) { var(gcd, x, y) = ExtendedEuclideanAlgorithm.GetGcd(new BigInteger(a), new BigInteger(b)); gcd.Should().Be(expectedGcd); x.Should().Be(expectedX); y.Should().Be(expectedY); }
public void TestDivMod() { Calculator <BigInteger> DivMod(Calculator <BigInteger> denominator, Calculator <BigInteger> numerator, Calculator <BigInteger> prime) { var gcd = new ExtendedEuclideanAlgorithm <BigInteger>(); var result = gcd.Compute(denominator, prime); return(numerator * result.BezoutCoefficients[0] * result.GreatestCommonDivisor); } Calculator <BigInteger> d = (BigInteger)3000; Calculator <BigInteger> n = (BigInteger)3000; Calculator <BigInteger> p = Calculator <BigInteger> .Two.Pow(127) - Calculator <BigInteger> .One; Assert.Equal(n, d * DivMod(d, n, p) % p); }