Cornacchia's algorithm

In computational number theory, Cornacchia's algorithm is an algorithm for solving the Diophantine equation

and d and m are coprime.

The algorithm was described in 1908 by Giuseppe Cornacchia.

[1] First, find any solution to

( mod

(perhaps by using an algorithm listed here); if no such

exist, there can be no primitive solution to the original equation.

Without loss of generality, we can assume that r0 ≤ ⁠m/2⁠ (if not, then replace r0 with m - r0, which will still be a root of -d).

Then use the Euclidean algorithm to find

( mod

( mod

is an integer, then the solution is

; otherwise try another root of -d until either a solution is found or all roots have been exhausted.

In this case there is no primitive solution.

To find non-primitive solutions (x, y) where gcd(x, y) = g ≠ 1, note that the existence of such a solution implies that g2 divides m (and equivalently, that if m is square-free, then all solutions are primitive).

Thus the above algorithm can be used to search for a primitive solution (u, v) to u2 + dv2 = ⁠m/g2⁠.

If such a solution is found, then (gu, gv) will be a solution to the original equation.

Solve the equation

A square root of −6 (mod 103) is 32, and 103 ≡ 7 (mod 32); since