Алгоритм Евклида — это один из старейших численных алгоритмов для нахождения наибольшего общего делителя двух целых чисел. Алгоритм назван в честь греческого математика Евклида (III век до н. э.), который впервые его описал.

def nod(x, y):
    while (x != y):
        if x > y:
            x = x - y
        else:
            y = y - x
    return x

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 1. Функция нахождения наибольшего общего делителя двух целых чисел с вычитанием меньшего числа из большего числа.

Введите первое число: 30855
Введите второе число: 41514
Наибольший общий делитель 561

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

def nod(x, y):
    while (x != y):
        x, y = abs(x - y), min(x, y)
    return x

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 2. Функция нахождения наибольшего общего делителя двух целых чисел с вычитанием меньшего числа из большего числа.

В программе листинг 2 используются функции abs() и min() вместо операторов if и else в программе листинг 1.

def nod(x, y):
    while (x % y !=0 and y % x !=0):
        if x > y:
            x = x % y
        else:
            y = y % x
    return min(x, y)

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 3. Функция нахождения наибольшего общего делителя двух целых чисел с нахождением остатка от деления большего числа на меньшее.

def nod(x, y):
    while (x % y !=0 and y % x !=0):
        x, y = max(x, y) % min (x, y), min(x, y)
    return min(x, y)

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 4. Функция нахождения наибольшего общего делителя двух целых чисел с нахождением остатка от деления большего числа на меньшее.

В программе листинг 4 используются функции max() и min() вместо операторов if и else в программе листинг 3.

def nod(x, y):
    if (y != 0):
        return nod(min(x, y), max(x, y) % min (x, y))
    else:
        return x

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 5. Рекурсивная функция нахождения наибольшего общего делителя двух целых чисел.

Рекурсивная функция нахождения наибольшего общего делителя двух целых чисел в программе листинг 5 написана исходя из следующих двух утверждений:

  1. Пусть Y = X⋅Q + R, тогда НОД (X, Y) = НОД (X, R), где Q целая часть, а R дробная часть от деления Y/X.
  2. НОД(R, 0) = R для любого ненулевого R (так как 0 делится на любое целое число).
def nod(x, y):
    while y != 0:
        x, y = y, x % y
    return x

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 6. Функция нахождения наибольшего общего делителя двух целых чисел без рекурсии.

Функция нахождения наибольшего общего делителя двух целых чисел без рекурсии в программе листинг 6 написана исходя из тех же двух утверждений что и программа листинг 5.

Следует заметить, что в программе листинг 6, так же как и в остальных выше приведённых программах с нахождением остатка от деления большего числа на меньшее используется нахождение остатка от деления большего числа на меньшее. Но в отличие от других приведённых выше программ, выбор большего и меньшего значения аргументов x и y в программе листинг 6 осуществляется за счёт лишней итерации цикла while, вместо использования функций min() и max(). Кроме того, эта лишняя итерация цикла while в программе листинг 6 происходит только в том случае, когда x оказывается меньше y. А это случается только один раз, когда аргументы функции следуют в порядке, с начала меньший, а затем больший.

Сказанное справедливо и для рекурсивной функции нахождения наибольшего общего делителя двух целых чисел.

def nod(x, y):
    if (y != 0):
        return nod(y, x % y)
    else:
        return x

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 7. Рекурсивная функция нахождения наибольшего общего делителя двух целых чисел.

def nod(x, y):
    return x if (y == 0) else nod(y, x % y)

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 8. Рекурсивная функция нахождения наибольшего общего делителя двух целых чисел с использованием тернарного оператора Python.

def nod(x, y): return x if (y == 0) else nod(y, x % y)

x = int(input('Введите первое число: '))
y = int(input('Введите второе число: '))
print('Наибольший общий делитель', nod(x, y))

Лист. 8-2. Рекурсивная функция нахождения наибольшего общего делителя двух целых чисел одной строкой.

Такой короткой, как в программе листинг 8, функции нахождения наибольшего общего делителя двух целых чисел я ещё не видел, поэтому заявляю об авторских правах.

© Диордица Александр, гор. Лыткарино, 01.08.2021.