コード例 #1
0
ファイル: Problem66.cs プロジェクト: JakeBayer/ProjectEuler
        private BigInteger ChooseM(Diophantine d, long N)
        {
            // we need m such that k | (a + bm) that minimizes (m^2 - N)
            // first find possible m
            // a + bm = 0 mod k
            // => m = -a(b^-1) mod k
            var sqrtN = (int)Math.Sqrt(N);
            var k     = BigInteger.Abs(d.k);
            var invB  = Modular.ModularMultiplicativeInverse(d.b, k); // apparently gcd(b, k) = 1 always, so this is legit ¯\_(ツ)_/¯
            var m     = (-d.a) * invB;
            var m0    = m + ((sqrtN - m) / k) * k;
            var m1    = m + ((sqrtN - m) / k + 1) * k;

            return(new[] { m0, m1 }.OrderBy(x => BigInteger.Abs(x * x - N)).First());
        }