Как найти нод методом евклида

Как найти НОД двух чисел по алгоритму Евклида

Содержание:

  • Что такое алгоритм Евклида
  • Понятие НОД
  • Основная суть алгоритма Евклида

    • Последовательность нахождения НОД при помощи деления:
    • Последовательность нахождения НОД при помощи вычитания:
  • Примеры решения задач с алгоритмом Евклида

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

Алгоритм Евклида — один из наиболее ранних численных алгоритмов в истории. Название было дано в честь греческого математика Евклида, который впервые дал ему описание в книгах «Начала». Изначально назывался «взаимным вычитанием», так как его принцип заключался в последовательном вычитании из большего числа меньшего, пока в результате не получится ноль. Сегодня чаще используется взятие остатка от деления вместо вычитания, но суть метода сохранилась.

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

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

Осторожно! Если преподаватель обнаружит плагиат в работе, не избежать крупных проблем (вплоть до отчисления). Если нет возможности написать самому, закажите тут.

Понятие НОД

Аббревиатура НОД расшифровывается как «наибольший общий делитель».

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

Основная суть алгоритма Евклида

Суть алгоритма заключается в построении ряда следующего вида (при условии, что a больше b):

a, b, x1, x2, x3, … xn.

В нем каждое последующее число — это остаток от деления двух предыдущих, ряд заканчивается, когда остаток от деления становится равным 0 — при условии использования деления.

В нем каждое последующее число является результатом вычитания двух предыдущих, ряд заканчивается, когда частное становится равным 0 — при условии использования вычитания.

Последовательность нахождения НОД при помощи деления:

  1. Большее число делится на меньшее.
  2. Если результат деления:
  • без остатка, то меньшее число и есть НОД;
  • с остатком, тогда большее число заменяется на остаток.
  1. Переход к пункту 1.

Пример №1

60 / 36 = 1 (остаток 24)

36 / 24 = 1 (остаток 12)

24 / 12 = 2 (остаток 0)

НОД для 60 и 36 равен 12 (делитель).

Последовательность нахождения НОД при помощи вычитания:

  1. Из большего числа вычитается меньшее.
  2. Если результат вычитания:
  • равен 0, то числа равны друг другу и являются НОД;
  • не равен 0, в таком случае большее число заменяется на результат вычитания.
  1. Переход к пункту 1.

Пример №2

60 — 36 = 24

36 — 24 = 12

24 — 12 = 12

12 — 12 = 0

НОД для 60 и 36 равен 12 (уменьшаемое, вычитаемое)

Примеры решения задач с алгоритмом Евклида

Задача №1

Найти наибольший общий делитель для чисел 128 и 96.

Решение:

128 — 96 = 32

96 — 32 = 64

64 — 32 = 32

32 — 32 = 0

Или

128 / 96 = 1 (остаток 32)

96 / 32 = 3

Ответ: 32

Задача №2

Найти наибольший общий делитель для чисел 37 и 17.

Решение:

37 / 17 = 2 (остаток 3)

17 / 3 = 5 (остаток 2)

3 / 2 = 1 (остаток 1)

2 / 1 = 2 (остаток 0)

Или

37 — 17= 20

20 — 17 = 3

17 — 3 = 14

14 — 3 = 11

11 — 3 = 8

8 — 3 = 5

5 — 3 = 2

3 — 2 = 1

2 — 1 = 1

1 — 1 = 0

Числа 37 и 17 являются простыми, соответственно, их НОД — единица. Совет: перед вычислениями проверяйте таблицу простых чисел.

Ответ: 1

Насколько полезной была для вас статья?

Рейтинг: 4.50 (Голосов: 18)

Выделите текст и нажмите одновременно клавиши «Ctrl» и «Enter»

Текст с ошибкой:

Расскажите, что не так

Поиск по содержимому

Алгоритм Евклида — нахождение наибольшего общего делителя

Алгоритм Евклида – это алгоритм нахождения наибольшего общего делителя (НОД) пары целых чисел.

Наибольший общий делитель (НОД) – это число, которое делит без остатка два числа и делится само без остатка на любой другой делитель данных двух чисел. Проще говоря, это самое большое число, на которое можно без остатка разделить два числа, для которых ищется НОД.

Решение задачи на языке программирования Python

Алгоритм нахождения НОД делением

  1. Большее число делим на меньшее.
  2. Если делится без остатка, то меньшее число и есть НОД (следует выйти из цикла).
  3. Если есть остаток, то большее число заменяем на остаток от деления.
  4. Переходим к пункту 1.

Пример:
Найти НОД для 30 и 18.
30 / 18 = 1 (остаток 12)
18 / 12 = 1 (остаток 6)
12 / 6 = 2 (остаток 0)
Конец: НОД – это делитель 6.
НОД (30, 18) = 6

a = int(input())
b = int(input())
 
while a != 0 and b != 0:
    if a > b:
        a = a % b
    else:
        b = b % a
 
print(a + b)

В цикле в переменную a или b записывается остаток от деления. Цикл завершается, когда хотя бы одна из переменных равна нулю. Это значит, что другая содержит НОД. Однако какая именно, мы не знаем. Поэтому для определения НОД находим сумму этих переменных. Поскольку в одной из переменных ноль, он не оказывает влияние на результат.

Если условием завершения цикла является равенство хотя бы одной из переменных нулю (a == 0 or b == 0), то условием продолжения его работы является обратное этому условие — обе переменные должны иметь отличные от нуля значения (a != 0 and b != 0).

Блок-схема алгоритма Евклида

Для того, чтобы вышеприведенная программа могла обрабатывать отрицательные числа, в логическом выражении при if должны сравниваться модули значений переменных: if abs(a) > abs(b):. Иначе большим числом может оказаться меньшее по модулю. В этом случае интерпретатор Питона в качестве остатка от деления выдает вещественное число. В результате это приводит к зацикливанию, так как низвести переменные до нуля становится как минимум маловероятным.

Алгоритм нахождения НОД вычитанием

  1. Из большего числа вычитаем меньшее.
  2. Если получается 0, значит, числа равны друг другу и являются НОД (следует выйти из цикла).
  3. Если результат вычитания не равен 0, то большее число заменяем на результат вычитания.
  4. Переходим к пункту 1.

Пример:
Найти НОД для 30 и 18.
30 — 18 = 12
18 — 12 = 6
12 — 6 = 6
6 — 6 = 0
Конец: НОД – это уменьшаемое или вычитаемое.
НОД (30, 18) = 6

a = int(input())
b = int(input())
 
while a != b:
    if a > b:
        a = a - b
    else:
        b = b - a
 
print(a)

Функция, вычисляющая НОД

def gcd(m, n):
    while m != n:
        if m > n:
            m = m - n
        else:
            n = n - m
    return n
 
 
a = int(input())
b = int(input())
 
print(gcd(a, b))

Функция gcd модуля math

В модуле math языка программирования Python есть функция gcd, вычисляющая наибольший общий делитель двух чисел.

>>> import math
>>> math.gcd(30, 18)
6

Больше задач в PDF

Алгоритм Евклида (или алгоритм Евклида) — это метод эффективного нахождения наибольшего общего делителя (НОД) двух чисел. НОД двух целых чисел, X а также Y, является наибольшим числом, которое делит оба X а также Y не оставляя остатка.

Например,

Euclid(30, 50) = 10

 
Euclid(2740, 1760) = 20

Потренируйтесь в этой проблеме

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

Например, 21 — это НОД 252 и 105 (252 = 21 × 12 а также 105 = 21 × 5), а то же число 21 также является НОД 105 и 147 (147 = 252 - 105).

 
Поскольку эта замена уменьшает большее из двух чисел, повторение этого процесса дает последовательно меньшие пары чисел, пока два числа не станут равными. Когда это происходит, они являются GCD исходных двух чисел.

Следующая программа на C демонстрирует это:

C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include <stdio.h>

// Итерационная функция для вычисления НОД двух чисел

// с использованием алгоритма Евклида (базовая версия)

int euclid(int a, int b)

{

    // делаем до тех пор, пока два числа не станут равными

    while (a != b)

    {

        // заменить большее число на его разность с меньшим числом

        if (a > b) {

            a = a b;

        }

        else {

            b = b a;

        }

    }

    return a;        // или `b` (поскольку оба равны)

}

int main()

{

    int a = 30;

    int b = 50;

    printf(«Euclid(%d, %d) = %d», a, b, euclid(a, b));

    return 0;

}

Скачать  Выполнить код

результат:

Euclid(30, 50) = 10

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

 
Более эффективная версия алгоритма заменяет большее из двух чисел его остатком при делении на меньшее. Алгоритм останавливается при достижении нулевого остатка, и теперь алгоритм никогда не требует больше шагов, чем пятикратное количество цифр (по основанию 10) меньшего целого числа.

Итеративную и рекурсивную реализацию можно увидеть ниже на C:

Итеративный

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#include <stdio.h>

// Итерационная функция для вычисления НОД двух чисел

// используя алгоритм Евклида

int euclid(int a, int b)

{

    int q, r;

    // цикл до остатка 0

    while (b > 0)

    {

        q = a / b;      // частное

        r = a q * b;  // остаток

        // или мы можем просто использовать `a % b` для вычисления `r`

        // `a` становится `b`, а `b` становится `r` (`a % b`)

        a = b;

        b = r;

    }

    return a;

}

int main()

{

    int a = 2740;

    int b = 1760;

    printf(«Euclid(%d, %d) = %d», a, b, euclid(a, b));

    return 0;

}

Скачать  Выполнить код

результат:

Euclid(2740, 1760) = 20

Рекурсивный

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#include <stdio.h>

// Рекурсивная функция для вычисления НОД двух чисел

// используя алгоритм Евклида

int euclid(int a, int b)

{

    // если остаток равен 0, возвращаем второе число

    if (b == 0) {

        return a;

    }

    int q = a / b;      // частное

    int r = a q * b;  // остаток

    // или мы можем просто использовать `a % b` для вычисления `r`

    // `a` становится `b`, а `b` становится `r` (`a % b`)

    return euclid(b, r);

}

int main()

{

    int a = 2740;

    int b = 1760;

    printf(«Euclid(%d, %d) = %d», a, b, euclid(a, b));

    return 0;

}

Скачать  Выполнить код

результат:

Euclid(2740, 1760) = 20

Мы можем расширить приведенную выше программу для чтения нескольких входных данных из файла, как показано ниже на C:

C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

#include <stdio.h>

#include <stdlib.h>

// Итерационная функция для вычисления НОД двух чисел

// используя алгоритм Евклида

int euclid(int a, int b)

{

    int r;

    // цикл до остатка 0

    while (b > 0)

    {

        // вычисляем остаток

        r = a % b;

        // `a` становится `b`, а `b` становится `r`

        a = b;

        b = r;

    }

    return a;

}

int main()

{

    FILE *in, *out;

    in = fopen(«input.txt», «r»);

    if (in == NULL)

    {

        printf(«Cannot open the source file.n»);

        exit(1);

    }

    out = fopen(«output.txt», «w»);

    if (out == NULL)

    {

        printf(«Cannot open the destination file.n»);

        exit(1);

    }

    int a, b;

    char ch;

    // делаем до тех пор, пока не будет достигнут конец файла

    while (!feof(in))

    {

        // прочитать следующую пару входных данных из файла

        fscanf(in, «%d %d», &a, &b);

        // вычисляем gcd и печатаем в выходной файл

        fprintf(out, «Euclid(%d, %d) = %dn», a, b, euclid(a, b));

        // переходим к следующей строке

        ch = getc(in);

    }

    // закрыть входной и выходной файловый поток

    fclose(out);

    fclose(in);

    return 0;

}

 
результат:


input.txt
2740 1760
6 4

 
output.txt
Euclid(2740, 1760) = 20
Euclid(6, 4) = 2

 
Также см:

Расширенный алгоритм Евклида — реализация на C, C++, Java и Python

Понравилась статья? Поделить с друзьями:
  • Как в моем телефоне найти мои файлы
  • Как найти человека по фото нейросеть
  • Если dns сервер не отвечает что делать windows 10 как исправить
  • Как найти колодец на огороде
  • Как найти свой сайт с нуля