Наибольший общий делитель (НОД / HCF / GCD)

В этом примере посмотрим, как найти наибольший общий делитель (НОД, в английской традиции — HCF или GCD) двух чисел на Python. Покажем два способа: простой перебор и более быстрый алгоритм Евклида.

Что нужно знать

Перед изучением примера полезно понимать:

Примечание

Наибольший общий делитель двух чисел — это наибольшее целое положительное число, на которое оба числа делятся без остатка. Например, НОД 12 и 14 равен 2.

Пример 1. Через цикл

# Python program to find H.C.F of two numbers

# define a function
def compute_hcf(x, y):

# choose the smaller number
    if x > y:
        smaller = y
    else:
        smaller = x
    for i in range(1, smaller+1):
        if((x % i == 0) and (y % i == 0)):
            hcf = i
    return hcf

num1 = 54
num2 = 24

print("The H.C.F. is", compute_hcf(num1, num2))

Вывод

The H.C.F. is 6

Два целых числа num1 и num2 передаются в функцию compute_hcf(). Внутри функция находит их НОД и возвращает его.

Сначала определяем меньшее из двух чисел: общий делитель не может быть больше любого из них. Затем циклом for пробегаем все числа от 1 до этого меньшего значения включительно.

На каждой итерации проверяем, делится ли каждое из исходных чисел на текущий делитель без остатка. Если да — запоминаем его как НОД. После цикла в переменной hcf останется самое большое число, на которое оба значения делятся нацело.

Совет

Такой способ простой и наглядный, но медленный. Для больших чисел лучше использовать алгоритм Евклида — он намного быстрее.

Алгоритм Евклида

Алгоритм основан на том, что НОД двух чисел равен НОДу их разности и меньшего из них.

На практике это делается так: большее число делится на меньшее, берётся остаток. Затем меньшее число делится на этот остаток. И так пока остаток не станет равен нулю.

Пример: ищем НОД для 54 и 24. Делим 54 на 24 — остаток 6. Делим 24 на 6 — остаток 0. Значит, НОД равен 6.

Пример 2. Алгоритм Евклида

# Function to find HCF the Using Euclidian algorithm
def compute_hcf(x, y):
   while(y):
       x, y = y, x % y
   return x

hcf = compute_hcf(300, 400)
print("The HCF is", hcf)

Цикл крутится, пока y не станет равно нулю. Выражение x, y = y, x % y — это короткая запись для одновременного обмена и пересчёта значений: x получает старый y, а y — остаток от деления x на y.

Как только y обнуляется, искомый НОД оказывается в x.