Наибольший общий делитель способы нахождения

8 способов нахождения наибольшего общего делителя

Эта статья появилась на свет совершенно неожиданно. Мне на глаза случайно попался код вычисления НОД на C#.

С первого взгляда мне даже всё понравилось: простенько, лаконичненько и без лишнего выпендрёжа. Однако чем дольше я рассматривал этот код, тем больше возникало сомнений в его эффективности. Я решил сделать маленькое исследование.

В адаптации на C++ код выглядел примерно так:

Подготовка

  1. перейти от типа int к типу long , что бы иметь больший простор для маневра;
  2. оформить вычисление НОД в виде функции;
  3. в функции main вызывать альтернативные версии функции вычисления НОД и сравнивать их производительность.

Очевидный прототип функции: long gcd(long a, long b) . Имя функции от англ. Greatest Common Divisor – т.е. НОД.

Для такой несложной задачи я не стал связываться с профилировщиком, а использовал примитивный тайминг (подробности можно посмотреть в статье «Оптимизация кода через ручной тайминг»).

Окончательный вариант «испытательного стенда» приведён в конце статьи. А в процессе исследований я пользовался его упрощённым вариантом, обеспечивавшим запуск одной из испытуемых функций и таймирование.

В коде я не пользоваться библиотечными функциями, что бы максимальный объём кода был контролируемым. Использование библиотечных функций типа min или swap — отдельная тема для экспериментов. Оставляю её для особо дотошных читателей.

01 перебор от произвольного числа

Этот алгоритм – стартовая точка исследования. Идея алгоритма очень проста: гоним переменную цикла от первого числа до 1. Если оба числа делятся на переменную цикла без остатка, значит переменная цикла и равна НОД; цикл можно завершить досрочно. Если цикл прошёл до конца, значит для этих чисел НОД равен 1.

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

02 перебор от минимального числа

Просто добавляем простейшую функцию для вычисления минимального числа для пары чисел и инициализируем переменную цикла меньшим из двух чисел. В половине случаев такая оптимизация работать не будет (когда первый аргумент и так меньше второго); зато в другой половине случаев выигрыш по времени может быть весьма значительным.

03 алгоритм с разложением на делители

Но второй вариант так и остался алгоритмом с последовательным перебором. Что можно попробовать ещё?

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

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

Реализуем эту идею:

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

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

Третий вариант по производительности не плох. Но пока это самопал. А что придумали умные люди за многовековую историю математики? «O’key, Гуг. то есть, Википедия, что такое НОД?» Вот, кстати, описано нахождение НОД через каноническое разложение на простые множители, которое мы уже реализовали. А вот что-то новенькое.

04 алгоритм Евклида (рекурсивный)

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

Реализуем рекурсивную версию:

Считается, что рекурсивные алгоритмы менее эффективны, чем итерационные, за счёт накладных расходов на вызов функции. Для проверки делаем и итерационный вариант.

05 алгоритм Евклида (итерационный)

Кстати, в Викиучебнике есть и другие реализации алгоритма Евклида.

06 бинарный алгоритм (рекурсивный)

  1. НОД(0, n) = n; НОД(m, 0) = m; НОД(m, m) = m;
  2. НОД(1, n) = 1; НОД(m, 1) = 1;
  3. Если m, n чётные, то НОД(m, n) = 2*НОД(m/2, n/2);
  4. Если m чётное, n нечётное, то НОД(m, n) = НОД(m/2, n);
  5. Если n чётное, m нечётное, то НОД(m, n) = НОД(m, n/2);
  6. Если m, n нечётные и n > m, то НОД(m, n) = НОД((n-m)/2, m);
  7. Если m, n нечётные и n REPEAT_TIMES раз. Время работы функции записывается в элемент массива, соответствующий этой функции. После того, как все тесты пройдены, результаты из массива делятся на количество наборов данных – получаем среднее время для набора.

Тестирование

Программа компилировалась под MS Visual Studio 2013 и TDM-GCC 4.8.1 в режиме 64-bit Release.

Как и ожидалось, первый алгоритм катастрофически неэффективен. Алгоритм №2 – минимальный костыль для №1 – работает почти в 2 раз быстрее.

Третий алгоритм неожиданно показал очень достойный результат: в 50 раз быстрее алгоритма №2.

Четвёртый и пятый варианты – алгоритм Евклида: рекурсивная версия, как ни странно, обогнала итерационную. По сравнению с третьим вариантом время улучшилось почти на порядок.

Бинарный алгоритм Евклида показал наилучшие результаты. Из трёх вариантов реализации рекурсивная версия – самая неторопливая. Наилучший результат у оптимизированной версии с использованием битовых операций.

Итого, самая производительная версия работает более чем в 2500 раз быстрее, чем изначальный вариант.

Примечание. Время, указанное в таблице – это время выполнения REPEAT_TIMES вызовов функции.

Выводы

Выводы достаточно банальны, но всё же:

  1. Первый пришедший на ум алгоритм решения какой-то задачи часто неоптимален. Хотя и может правильно и достаточно приемлемо работать в определённых условиях.
  2. Всегда надо попробовать подумать над усовершенствованием алгоритма или над альтернативным вариантом.
  3. Учите математику!
  4. Если есть возможность, посмотрите что сделали люди до вас. Может не стоит изобретать велосипед?
  5. Оптимизируйте код.

Источник

Нахождение НОД по алгоритму Евклида и с помощью разложения на простые множители

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

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

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

Суть алгоритма заключается в том, чтобы последовательно проводить деление с остатком, в ходе которого получается ряд равенств вида:

a = b · q 1 + r 1 , 0 r 1 b b = r 1 · q 2 + r 2 , 0 r 2 r 1 r 1 = r 2 · q 3 + r 3 , 0 r 3 r 2 r 2 = r 3 · q 4 + r 4 , 0 r 4 r 3 ⋮ r k — 2 = r k — 1 · q k + r k , 0 r k r k — 1 r k — 1 = r k · q k + 1

Мы можем закончить деление тогда, когда r k + 1 = 0 , при этом r k = НОД ( a , b ) .

Найдите наибольший общий делитель чисел 64 и 48 .

Решение

Введем обозначения: a = 64 , b = 48 .

На основе алгоритма Евклида проведем деление 64 на 48 .

Получим 1 и остаток 16 . Получается, что q 1 = 1 , r 1 = 16 .

Вторым шагом разделим 48 на 16 , получим 3 . То есть q 2 = 3 , а r 2 = 0 . Таким образом число 16 – это наибольший общий делитель для чисел из условия.

Ответ: НОД ( 64 , 48 ) = 16 .

Чему равен НОД чисел 111 и 432 ?

Решение

Делим 432 на 111 . Согласно алгоритму Евклида получаем цепочку равенств 432 = 111 · 3 + 99 , 111 = 99 · 1 + 12 , 99 = 12 · 8 + 3 , 12 = 3 · 4 .

Таким образом, наибольший общий делитель чисел 111 и 432 – это 3 .

Ответ: НОД ( 111 , 432 ) = 3 .

Найдите наибольший общий делитель чисел 661 и 113 .

Решение

Проведем последовательно деление чисел и получим НОД ( 661 , 113 ) = 1 . Это значит, что 661 и 113 – это взаимно простые числа. Мы могли выяснить это до начала вычислений, если бы обратились к таблице простых чисел.

Ответ: НОД ( 661 , 113 ) = 1 .

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

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

Если мы разложим числа 220 и 600 на простые множители, то получим два произведения: 220 = 2 · 2 · 5 · 11 и 600 = 2 · 2 · 2 · 3 · 5 · 5 . Общими в этих двух произведениях будут множители 2 , 2 и 5 . Это значит, что НОД ( 220 , 600 ) = 2 · 2 · 5 = 20 .

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

Решение

Найдем все простые множители чисел 72 и 96 :

72 36 18 9 3 1 2 2 2 3 3

96 48 24 12 6 3 1 2 2 2 2 2 3

Общими для двух чисел простые множители: 2 , 2 , 2 и 3 . Это значит, что НОД ( 72 , 96 ) = 2 · 2 · 2 · 3 = 24 .

Ответ: НОД ( 72 , 96 ) = 24 .

Правило нахождения наибольшего общего делителя двух чисел основано на свойствах наибольшего общего делителя, согласно которому НОД ( m · a 1 , m · b 1 ) = m · НОД ( a 1 , b 1 ) , где m – любое целое положительное число.

Нахождение НОД трех и большего количества чисел

Независимо от количества чисел, для которых нам нужно найти НОД, мы будем действовать по одному и тому же алгоритму, который заключается в последовательном нахождении НОД двух чисел. Основан этот алгоритм на применении следующей теоремы: НОД нескольких чисел a 1 , a 2 , … , a k равен числу d k , которое находится при последовательном вычислении НОД ( a 1 , a 2 ) = d 2 , НОД ( d 2 , a 3 ) = d 3 , НОД ( d 3 , a 4 ) = d 4 , … , НОД ( d k — 1 , a k ) = d k .

Найдите наибольший общий делитель четырех чисел 78 , 294 , 570 и 36 .

Решение

Введем обозначения: a 1 = 78 , a 2 = 294 , a 3 = 570 , a 4 = 36 .

Начнем с того, что найдем НОД чисел 78 и 294 : d 2 = НОД ( 78 , 294 ) = 6 .

Теперь приступим к нахождению d 3 = НОД ( d 2 , a 3 ) = НОД ( 6 , 570 ) . Согласно алгоритму Евклида 570 = 6 · 95 . Это значит, что d 3 = НОД ( 6 , 570 ) = 6 .

Найдем d 4 = НОД ( d 3 , a 4 ) = НОД ( 6 , 36 ) . 36 делится на 6 без остатка. Это позволяет нам получить d 4 = НОД ( 6 , 36 ) = 6 .

d 4 = 6 , то есть, НОД ( 78 , 294 , 570 , 36 ) = 6 .

Ответ: НОД ( 78 , 294 , 570 , 36 ) = 6 .

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

Вычислите НОД чисел 78 , 294 , 570 и 36 .

Решение

Произведем разложение данных чисел на простые множители: 78 = 2 · 3 · 13 , 294 = 2 · 3 · 7 · 7 , 570 = 2 · 3 · 5 · 19 , 36 = 2 · 2 · 3 · 3 .

Для всех четырех чисел общими простыми множителями будут числа 2 и 3 .

Получается, что НОД ( 78 , 294 , 570 , 36 ) = 2 · 3 = 6 .

Ответ: НОД ( 78 , 294 , 570 , 36 ) = 6 .

Нахождение НОД отрицательных чисел

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

Найдите НОД отрицательных целых чисел − 231 и − 140 .

Решение

Для выполнения вычислений возьмем модули чисел, данных в условии. Это будут числа 231 и 140 . Запишем это кратко: НОД ( − 231 , − 140 ) = НОД ( 231 , 140 ) . Теперь применим алгоритм Евклида для нахождения простых множителей двух чисел: 231 = 140 · 1 + 91 ; 140 = 91 · 1 + 49 ; 91 = 49 · 1 + 42 ; 49 = 42 · 1 + 7 и 42 = 7 · 6 . Получаем, что НОД ( 231 , 140 ) = 7 .

А так как НОД ( − 231 , − 140 ) = НОД ( 231 , 140 ) , то НОД чисел − 231 и − 140 равен 7 .

Ответ: НОД ( − 231 , − 140 ) = 7 .

Определите НОД трех чисел − 585 , 81 и − 189 .

Решение

Заменим отрицательные числа в приведенном перечне на их абсолютные величины, получим НОД ( − 585 , 81 , − 189 ) = НОД ( 585 , 81 , 189 ) . Затем разложим все данные числа на простые множители: 585 = 3 · 3 · 5 · 13 , 81 = 3 · 3 · 3 · 3 и 189 = 3 · 3 · 3 · 7 . Общими для трех чисел являются простые множители 3 и 3 . Получается , что НОД ( 585 , 81 , 189 ) = НОД ( − 585 , 81 , − 189 ) = 9 .

Ответ: НОД ( − 585 , 81 , − 189 ) = 9 .

Источник

Наибольший общий делитель (НОД), свойства и формулы

О чем эта статья:

5 класс, 6 класс

Понятие наибольшего общего делителя

Начнем с самого начала и вспомним, что такое общий делитель. У целого числа может быть несколько делителей. А сейчас нам особенно интересно, как обращаться с делителями сразу нескольких целых чисел.

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

Общий делитель нескольких целых чисел — это такое число, которое может быть делителем каждого числа из указанного множества. Например, у чисел 12 и 8 общим делителем будет четверка. Чтобы это проверить, напишем верные равенства: 8 = 4 * 2 и 12 = 3 * 4. Но у этой пары чисел есть и другие общие делители: 1, -1 и -4.

Любое число можно разделить на 1, -1 и на само себя. Значит у любого набора целых чисел будет как минимум три общих делителя. Если общий делитель больше 0 — противоположное ему значение со знаком минус также является общим делителем.

Если b — делитель целого числа a, которое не равно нулю, то модуль числа b не может быть больше модуля числа a. Значит любое число, не равное 0, имеет конечное число делителей.

Наибольшим общим делителем двух чисел a и b называется наибольшее число, на которое a и b делятся без остатка. Для записи может использоваться аббревиатура НОД. Для двух чисел можно записать вот так: НОД (a, b).

Например, для 4 и -16 НОД будет 4. Как мы к этому пришли:

Проверить результаты вычислений можно с помощью онлайн-калькулятора НОД и НОК.

  1. Зафиксируем все делители четырех: ±4, ±2, ±1.
  2. А теперь все делители шестнадцати: ±16, ±8, ±4, ±3 и ±1.
  3. Выбираем общие: это -4, -2, -1, 1, 2 и 4. Самое большое общее число: 4. Вот и ответ.

Наибольшим общим делителем трех чисел и более будет самое большое целое число, которое будет делить все эти числа одновременно.

Найдем наибольший общий делитель нескольких целых чисел: 10, 6, 44, -18. Он будет равен трем. Ответ можно записать так: НОД (12, 6, 42, -18) = 3. А чтобы проверить правильность ответа, нужно записать все делители и выбрать из них самые большие.

Взаимно простые числа — это натуральные числа, у которых только один общий делитель — единица. Их НОД равен 1.

Помимо НОД есть еще и НОК, что расшифровывается, как наименьшее общее кратное и означает наименьшее число, которое делится на каждое из исходных чисел без остатка.

Еще один пример. Рассчитаем НОД для 28 и 64.

    Распишем простые множители для каждого числа и подчеркнем одинаковые

Д (64) = 2 * 2 * 2 * 2 * 2 * 2

Найдем произведение одинаковых простых множителей и запишем ответ

НОД (28; 64) = 2 * 2 = 4

Ответ: НОД (28; 64) = 4

Оформить поиск НОД можно в строчку, как мы сделали выше или в столбик, как на картинке.

Свойства наибольшего общего делителя

У наибольшего общего делителя есть ряд определенных свойств. Опишем их в виде теорем и сразу приведем доказательства.

Важно! Все свойства НОД будем формулировать для положительных целых чисел, при этом будем рассматривать делители только больше нуля.

Свойство 1. Наибольший общий делитель чисел а и b равен наибольшему общему делителю чисел b и а, то есть НОД (a, b) = НОД (b, a). Перемена мест чисел не влияет на конечный результат.

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

Свойство 2. Если а делится на b, то множество общих делителей чисел а и b совпадает со множеством делителей числа b, поэтому НОД (a, b) = b.

Доказательство

Любой общий делитель чисел а и b является делителем каждого из этих чисел, в том числе и числа b. Так как а кратно b, то любой делитель числа b является делителем и числа а, благодаря свойствам делимости. Из этого следует, что любой делитель числа b является общим делителем чисел а и b.

Значит, если а делится на b, то совокупность делителей чисел а и b совпадает с совокупностью делителей одного числа b. А так как наибольшим делителем числа b является само число b, то наибольший общий делитель чисела и b также равен b, то есть НОД (а, b) = b.

В частности, если a = b, то НОД (a, b) = НОД (a, a) = НОД (b, b) = a = b.

  • Например, НОД (25, 25) = 25.

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

  • Например, НОД (4, 40) = 4, так как 40 кратно 4.

Свойство 3. Если a = bq + c, где а, b, с и q — целые числа, то множество общих делителей чисел а и b совпадает со множеством общих делителей чисел b и с. Равенство НОД (a, b) = НОД (b, c) справедливо.

Доказательство

Существует равенство a = bq + c, значит всякий общий делитель чисел а и b делит также и с, исходя из свойств делимости. По этой же причине, всякий общий делитель чисел b и с делит а. Поэтому совокупность общих делителей чисел а и b совпадает с совокупностью общих делителей чисел b и c.

Поэтому должны совпадать и наибольшие из этих общих делителей, и равенство НОД (a, b) = НОД (b, c) можно считать справедливым.

Свойство 4. Если m — любое натуральное число, то НОД (mа, mb) = m * НОД(а, b).

Доказательство

Если умножить на m обе стороны каждого из равенств алгоритма Евклида, то получим, что НОД (mа, mb)= mr, где r — это НОД (а, b). На этом свойстве наибольшего общего делителя основан поиск НОД с помощью разложения на простые множители.

Свойство 5. Пусть р — любой общий делитель чисел а и b, тогда НОД (а : p, b : p) = НОД (а, b) : p. А именно, если p = НОД (a, b) имеем НОД (a : НОД (a, b), b: НОД (a, b)) = 1, то есть, числа a : НОД (a, b) и b : НОД (a, b) — взаимно простые.

Так как a = p(a : p) и b = p(b : p), и в силу предыдущего свойства, мы можем записать цепочку равенств вида НОД (a, b) = НОД (p(a : p), p(b : p)) = p * НОД (a : p, b : p), откуда и следует доказываемое равенство.

Способы нахождения наибольшего общего делителя

Найти наибольший общий делитель можно двумя способами. Рассмотрим оба, чтобы при решении задач выбирать самую оптимальную последовательность действий.

1. Разложение на множители

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

Пример 1. Найти НОД (84, 90).

    Разложим числа 84 и 90 на простые множители:



Подчеркнем все общие множители и перемножим их между собой:

Ответ: НОД (84, 90) = 6.

Пример 2. Найти НОД (15, 28).

    Разложим 15 и 28 на простые множители:

  • Числа 15 и 28 являются взаимно простыми, так как их наибольший общий делитель — единица.
  • Ответ: НОД (15, 28) = 1.

    Пример 3. Найти НОД для 24 и 18.

      Разложим оба числа на простые множители:



    Найдем общие множители чисел 24 и 18: 2 и 3. Для удобства общие множители можно подчеркнуть.



    Перемножим общие множители:

    НОД (24, 18) =2 * 3 = 6

    Ответ: НОД (24, 18) = 6

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

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

    Алгоритм Евклида заключается в следующем: если большее из двух чисел делится на меньшее — наименьшее число и будет их наибольшим общим делителем. Использовать метод Евклида можно легко по формуле нахождения наибольшего общего делителя.

    Формула НОД: НОД (a, b) = НОД (b, с), где с — остаток от деления a на b.

    Пример 1. Найти НОД для 24 и 8.

    Так как 24 делится на 8 и 8 тоже делится на 8, значит, 8 — общий делитель этих чисел. Этот делитель является наибольшим, потому что 8 не может делиться ни на какое число, большее его самого. Поэтому: НОД (24, 8) = 8.

    В остальных случаях для нахождения наибольшего общего делителя двух чисел нужно соблюдать такой порядок действий:

    1. Большее число поделить на меньшее.
    2. Меньшее число поделить на остаток, который получается после деления.
    3. Первый остаток поделить на второй остаток.
    4. Второй остаток поделить на третий и т. д.
    5. Деление продолжается до тех пор, пока в остатке не получится нуль. Последний делитель и есть наибольший общий делитель.

    Пример 2. Найти наибольший общий делитель чисел 140 и 96:

    1. 140 : 96 = 1 (остаток 44)
    2. 96 : 44 = 2 (остаток 8)
    3. 44 : 8 = 5 (остаток 4)
    4. 8 : 4 = 2

    Последний делитель равен 4 — это значит: НОД (140, 96) = 4.

    Ответ: НОД (140, 96) = 4

    Пошаговое деление можно записать столбиком:

    Чтобы найти наибольший общий делитель трех и более чисел, делаем в такой последовательности:

    1. Найти наибольший общий делитель любых двух чисел из данных.
    2. Найти НОД найденного делителя и третьего числа.
    3. Найти НОД последнего найденного делителя и четвёртого числа и т. д.

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

    Источник

    Читайте также:  Чертеж проверить разными способами
    Оцените статью
    Разные способы