What happens in the previous algorithm if *x* is much bigger than *y* (or
vice-versa)?

*Example:*

gcd(1000, 2) | gcd(1001, 500) | |||||

1000 | 2 | 1001 | 500 | |||

998 | 2 | 501 | 500 | |||

996 | 2 | 1 | 500 | |||

2 | 2 | 1 | 1 |

To compress this long sequence of subtractions, it is sufficient to observe that we are actually calculating the rest of the integer division.

**Method by Euclid:** let
*x* = *y*^{ . }*k* + *r* (with 0 < = *r* < *y*)

gcd(*x*, *y*) =

The algorithm can be implemented in Java as follows:

public static int greatestCommonDivisor(int x, int y) { while ((x != 0) && (y != 0)) { if (x > y) x = x % y; else y = y % x; } return (x != 0)? x : y; }