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()); }