Cornacchia's algorithm

In computational number theory, Cornacchia's algorithm is an algorithm for solving the Diophantine equation , where and d and m are coprime. The algorithm was described in 1908 by Giuseppe Cornacchia.[1]

The algorithm

First, find any solution to (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 r0m/2 (if not, then replace r0 with m - r0, which will still be a root of -d). Then use the Euclidean algorithm to find , and so on; stop when . If 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.

Example

Solve the equation . A square root of 6 (mod 103) is 32, and 103  7 (mod 32); since and , there is a solution x = 7, y = 3.

gollark: Since obviously you wouldn't actually check in your own git repository by *accident*.
gollark: As I said, I assumed you *deliberately* did that as a bluff.
gollark: I know, right?
gollark: No, I like pattern matching.
gollark: You're wrong! This is not in accordance with the gollark algorithm!

References

  1. Cornacchia, G. (1908). "Su di un metodo per la risoluzione in numeri interi dell' equazione ". Giornale di Matematiche di Battaglini. 46: 33–90.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.