Здесь - очень полезное объяснение, которое я нашел.
Для тех, кому лень его открыть, вот что он говорит:
Рассмотрим пример, когда выдолжен был найти ГКД (3084,1424).Предположим, что d это GCD.Что означает д |3084 и д |1424 (используя символ «|», чтобы сказать «делит»).
Следовательно, d |(3084 - 1424).Теперь мы постараемся максимально сократить эти числа, которые делятся на d (в данном случае 3084 и 1024), чтобы мы достигли 0 как одного из чисел.Помните, что GCD (a, 0) является a.
С д |(3084 - 1424) следует, что d |(3084 - 2 (1424)), что означает d |236.
Подсказка: (3084 - 2 * 1424 = 236)
Теперь забудьте о начальных числах, нам просто нужно решить для d, и мы знаем, что d является наибольшим числом, которое делит 236,1424 и 3084. Таким образом, мы используем два меньших числа, чтобы продолжить, потому что это сведет проблему к 0.
d |1424 и д |236 подразумевает, что d |(1424 - 236).Итак, д |(1424-6 (236)) => d |8.
Теперь мы знаем, что d - это наибольшее число, которое делит 8, 236, 1424 и 3084. Снова взяв два меньших, мы получим
d |236 и д |8, что подразумевает d |(236 - 8).Итак, д |(236 - 29 (8)) => d |4.
Снова список чисел, делимых на d, увеличивается и сходится (числа становятся меньше, ближе к 0).На данный момент d является наибольшим числом, которое делит 4, 8, 236, 1424, 3084.
Принимая те же шаги,
d |8 и д |4 подразумевает d |(8-4).Итак, д |(8 - 2 (4)) => d |0.
Список чисел, делимых на d, теперь равен 0, 4, 8, 236, 1484, 3084. GCD для (a, 0) всегда равен a.Итак, как только у вас будет 0 в качестве одного из двух чисел, другое число будет gcd оригинальных двух и всех тех, что были между ними.
Это именно то, что делает ваш код.Вы можете распознать состояние терминала как GCD (a, 0) = a.
Другой шаг - найти остаток от двух чисел и выбрать его и меньшее из двух предыдущих в качестве новых чисел.