В данной статье мы поговорим о том, как найти все делители числа. Начнем с доказательства теоремы, с помощью которой можно задать вид всех делителей определенного числа. Далее возьмем примеры нахождения всех нужных делителей и покажем, как именно определить, сколько делителей имеет конкретное число. В последнем пункте подробно рассмотрим примеры задач на нахождение общих делителей нескольких чисел.
Как найти все делители числа
Чтобы понять материал, изложенный в данном пункте, нужно хорошо знать, что вообще из себя представляют кратные числа и делители. Здесь мы поговорим только о поиске делителей натуральных чисел, т.е. целых положительных. Этим можно ограничиться, поскольку свойство делимости гласит, что делители целого отрицательного числа аналогичны делителям целого положительного, которое будет противоположным по отношению к этому числу. Также сразу уточним, что у нуля есть бесконечно большое число делителей, и находить их смысла не имеет, поскольку в итоге все равно получится 0.
Если речь идет о простом числе, то его можно разделить только на единицу и на само себя. Значит, у любого простого числа a есть всего 4 делителя, два из которых больше 0 и два меньше: 1, -1, a, -a. Возьмем простое число 7: у него есть делители 7, -7, 1 и -1, и все. Еще один пример: 367 – тоже простое число, которое можно разделить лишь на 1, -1, 367 и -367.
Сложнее определить все делители составного числа. Сформулируем теорему, которая лежит в основе данного действия.
Допустим, у нас есть выражение, означающее каноническое разложение числа на простые множители, вида a=p1s1·p2s2·…·pnsn. Тогда натуральными делителями числа a будут следующие числа: d=p1t2·p2t2·…·pntn, где t1=0, 1, …, s1, t2=0, 1, …, s2, …, tn=0, 1, …, sn.
Перейдем к доказательству этой теоремы. Зная основное определение делимости, мы можем утверждать, что a можно разделить на d, если есть такое число q, что делает верным равенство a=d·q, т.е. q=p1(s1−t1)·p2(s2-t2)·…·pn(sn-tn).
Любое число, делящее a, будет иметь именно такой вид, поскольку, согласно свойствам делимости, других простых множителей, кроме p1, p2, …, pn, оно иметь не может, а их показатели в данном случае не превысят s1, s2, …, sn.
Учитывая доказательство этой теоремы, мы можем сформировать схему нахождения всех положительных делителей данного числа.
Для этого нужно выполнить следующие действия:
- Выполнить каноническое разложение на простые множители и получить выражение вида a=p1s1·p2s2·…·pnsn.
- Найти все значения d=p1t2·p2t2·…·pntn, где числа t1, t2, …, tn будут принимать независимо друг от друга каждое из значений t1=0, 1, …, s1, t2=0, 1, …, s2, …, tn=0, 1, …, sn.
Самым трудным в таком расчете является именно перебор всех комбинаций указанных значений. Разберем подробно решения нескольких задач, чтобы наглядно показать применение данной схемы на практике.
Условие: найти все делители 8.
Решение
Разложим восьмерку на простые множители и получим 8=2·2·2. Переведем разложение в каноническую форму и получим 8=23. Следовательно, a=8, p1=2, s1=3.
Поскольку все делители восьмерки будут значениями p1t1=2t1, то t1 может принять значения нуля, единицы, двойки, тройки. 3 будет последним значением, ведь s1=3. Таким образом, если t1=0, то 2t1=20=1, если 1, то 2t1=21=2, если 2, то 2t1=22=4, а если 3, то 2t1=23=8.
Для нахождения делителей удобно все полученные значения оформлять в виде таблицы:
t1 | 2t1 |
0 | 20=1 |
1 | 21=2 |
2 | 22=4 |
3 | 23=8 |
Значит, положительными делителями восьмерки будут числа 1, 2, 4 и 8, а отрицательными −1, −2, −4 и −8.
Ответ: делителями данного числа будут ±1, ±2, ±4, ±8.
Возьмем пример чуть сложнее: в нем при разложении числа получится не один, а два множителя.
Условие: найдите все делители числа 567, являющиеся натуральными числами.
Решение
Начнем с разложения данного числа на простые множители.
56718963217133337
Приведем разложение к каноническому виду и получим 567=34·7. Затем перейдем к вычислению всех натуральных множителей. Для этого будем присваивать t1 и t2 значения 0, 1, 2, 3, 4 и 0, 1, вычисляя при этом значения 3t1·7t2. Результаты будем вносить в таблицу:
t1 | t2 | 3t1·7t2 |
0 | 0 | 30·70=1 |
0 | 1 | 30·71=7 |
1 | 0 | 31·70=3 |
1 | 1 | 31·71=21 |
2 | 0 | 32·70=9 |
2 | 1 | 32·71=63 |
3 | 0 | 33·70=27 |
3 | 1 | 33·71=189 |
4 | 0 | 34·70=81 |
4 | 1 | 34·71=567 |
Ответ: натуральными делителями 567 будут числа 27, 63, 81, 189, 1, 3, 7, 9, 21 и 567.
Продолжим усложнять наши примеры – возьмем четырехзначное число.
Условие: найти все делители 3 900, которые будут больше 0.
Решение
Проводим разложение данного числа на простые множители. В каноническом виде оно будет выглядеть как 3 900=22·3·52·13. Теперь приступаем к нахождению положительных делителей, подставляя в выражение 2t1·3t2·5t3·13t4 значения t1, равные 0, 1 и 2, t2=0,1, t3=0, 1, 2, t4=0, 1. Результаты представляем в табличном виде:
t1 | t2 | t3 | t4 | 2t1·3t2·5t3·13t4 |
0 | 0 | 0 | 0 | 20·30·50·130=1 |
0 | 0 | 0 | 1 | 20·30·50·131=13 |
0 | 0 | 1 | 0 | 20·30·51·130=5 |
0 | 0 | 1 | 1 | 20·30·51·131=65 |
0 | 0 | 2 | 0 | 20·30·52·130=25 |
0 | 0 | 2 | 1 | 20·30·52·131=325 |
0 | 1 | 0 | 0 | 20·31·50·130=3 |
0 | 1 | 0 | 1 | 20·31·50·131=39 |
0 | 1 | 1 | 0 | 20·31·51·130=15 |
0 | 1 | 1 | 1 | 20·31·51·131=195 |
0 | 1 | 2 | 0 | 20·31·52·130=75 |
0 | 1 | 2 | 1 | 20·31·52·131=975 |
t1 | t2 | t3 | t4 | 2t1·3t2·5t3·13t4 |
1 | 0 | 0 | 0 | 21·30·50·130=2 |
1 | 0 | 0 | 1 | 21·30·50·131=26 |
1 | 0 | 1 | 0 | 21·30·51·130=10 |
1 | 0 | 1 | 1 | 21·30·51·131=130 |
1 | 0 | 2 | 0 | 21·30·52·130=50 |
1 | 0 | 2 | 1 | 21·30·52·131=650 |
1 | 1 | 0 | 0 | 21·31·50·130=6 |
1 | 1 | 0 | 1 | 21·31·50·131=78 |
1 | 1 | 1 | 0 | 21·31·51·130=30 |
1 | 1 | 1 | 1 | 21·31·51·131=390 |
1 | 1 | 2 | 0 | 21·31·52·130=150 |
1 | 1 | 2 | 1 | 21·31·52·131=1950 |
t1 | t2 | t3 | t4 | 2t1·3t2·5t3·13t4 |
2 | 0 | 0 | 0 | 22·30·50·130=4 |
2 | 0 | 0 | 1 | 22·30·50·131=52 |
2 | 0 | 1 | 0 | 22·30·51·130=20 |
2 | 0 | 1 | 1 | 22·30·51·131=260 |
2 | 0 | 2 | 0 | 22·30·52·130=100 |
2 | 1 | 0 | 1 | 22·30·52·131=1300 |
2 | 1 | 0 | 0 | 22·31·50·130=12 |
2 | 1 | 0 | 1 | 22·31·50·131=156 |
2 | 1 | 1 | 0 | 22·31·51·130=60 |
2 | 1 | 1 | 1 | 22·31·51·131=780 |
2 | 1 | 2 | 0 | 22·31·52·130=300 |
2 | 1 | 2 | 1 | 22·31·52·131=3900 |
Ответ: делителями числа 3 900 будут:195, 260, 300, 325, 390, 650, 780, 975, 75, 78, 100, 130, 150, 156, 13,15, 20, 25, 26, 30, 39, 50,52, 60, 65, 1, 2, 3, 4, 5, 6, 10, 12, 1 300, 1 950, 3 900
Как определить количество делителей конкретного числа
Чтобы узнать, сколько положительных делителей у конкретного числа a, каноническое разложение которого выглядит как a=p1s1·p2s2·…·pnsn, нужно найти значение выражения (s1+1) ·(s2+1) ·…·(sn+1). О количестве наборов переменных t1, t2, …, tn мы можем судить по величине записанного выражения.
Покажем на примере, как это вычисляется. Определим, сколько будет натуральных делителей у числа 3 900, которое мы использовали в предыдущей задаче. Каноническое разложение мы уже записывали: 3 900=22·3·52·13. Значит, s1=2, s2=1, s3=2, s4=1. Теперь подставим значения s1, s2, s3 и s4 в выражение (s1+1) ·(s2+1) ·(s3+1) ·(s4+1) и вычислим его значение. Имеем (2+1)·(1+1)·(2+1)·(1+1)=3·2·3·2=36. Значит, это число имеет всего 36 делителей, являющихся натуральными числами. Пересчитаем то количество, что у нас получилось в предыдущей задаче, и убедимся в правильности решения. Если учесть и отрицательные делители, которых столько же, сколько и положительных, то получится, что у данного числа всего будет 72 делителя.
Условие: определите, сколько делителей имеет 84.
Решение
Раскладываем число на множители.
844221712237
Записываем каноническое разложение: 84=22·3·7. Определяем, сколько у нас получится положительных делителей: (2+1)·(1+1)·(1+1) =12. Для учета отрицательных нужно умножить это число на 2:2·12=24.
Ответ: всего у 84 будет 24 делителя – 12 положительных и 12 отрицательных.
Как вычислить общие делители нескольких чисел
Зная свойства наибольшего общего делителя, можно утверждать, что количество делителей некоторого набора целых чисел будет совпадать с количеством делителей НОД тех же чисел. Это будет справедливо не только для двух чисел, но и для большего их количества. Следовательно, чтобы вычислить все общие делители нескольких чисел, надо определить их наибольший общий множитель и найти все его делители.
Разберем пару таких задач.
Условие: сколько будет натуральных общих делителей у чисел 140 и 50? Вычислите их все.
Решение
Начнем с вычисления НОД (140, 50).
Для этого нам потребуется алгоритм Евклида:
140=50·2+40, 50=40·1+10, 40=10·4, значит, НОД (50, 140)=10.
Далее выясним, сколько положительных делителей есть у десяти. Разложим его на простые множители и получим 20·50=1, 20·51=5, 21·50=2 и 21·51=10. Значит, все натуральные общие делители исходного числа – это 1, 2, 5 и 10, а всего их четыре.
Ответ: данные числа имеют четыре натуральных делителя, равные 10, 5, 2 и 1.
Условие: выясните, сколько общих положительных делителей есть у чисел 585, 315, 90 и 45.
Решение
Вычислим их наибольший общий делитель, разложив число на простые множители. Поскольку 90=2·3·3·5, 45=3·3·5, 315=3·3·5·7 и 585=3·3·5·13, то таким делителем будет 5: НОД (90, 45, 315, 585) =3·3·5=32·5.
Чтобы узнать количество этих чисел, нужно выяснить, сколько положительных делителей имеет НОД.
Считаем:
НОД (90, 45, 315, 585) =32·5:(2+1)·(1+1) =6.
Ответ: у данных чисел шесть общих делителей.
Для этого термина существует аббревиатура «НОД», которая имеет и другие значения, см. Нод.
Наибольшим общим делителем (НОД) для двух целых чисел и называется наибольший из их общих делителей[1]. Пример: для чисел 54 и 24 наибольший общий делитель равен 6.
Наибольший общий делитель существует и однозначно определён, если хотя бы одно из чисел или не равно нулю.
Возможные обозначения наибольшего общего делителя чисел и :
Понятие наибольшего общего делителя естественным образом обобщается на наборы из более чем двух целых чисел.
Связанные определения[править | править код]
Наименьшее общее кратное[править | править код]
Наименьшее общее кратное (НОК) двух целых чисел и — это наименьшее натуральное число, которое делится на и (без остатка). Обозначается НОК(m,n) или , а в английской литературе .
НОК для ненулевых чисел и всегда существует и связан с НОД следующим соотношением:
Это частный случай более общей теоремы: если — ненулевые числа, — какое-либо их общее кратное, то имеет место формула:
Взаимно простые числа[править | править код]
Числа и называются взаимно простыми, если у них нет общих делителей, кроме . Для таких чисел НОД. Обратно, если НОД то числа взаимно просты.
Аналогично, целые числа , где , называются взаимно простыми, если их наибольший общий делитель равен единице.
Следует различать понятия взаимной простоты, когда НОД набора чисел равен 1, и попарной взаимной простоты, когда НОД равен 1 для каждой пары чисел из набора. Из попарной простоты вытекает взаимная простота, но не наоборот. Например, НОД(6,10,15) = 1, но любые пары из этого набора не взаимно просты.
Способы вычисления[править | править код]
Эффективными способами вычисления НОД двух чисел являются алгоритм Евклида и бинарный алгоритм.
Кроме того, значение НОД(m,n) можно легко вычислить, если известно каноническое разложение чисел и на простые множители:
где — различные простые числа, а и — неотрицательные целые числа (они могут быть нулями, если соответствующее простое отсутствует в разложении). Тогда НОД(n,m) и НОК[n,m] выражаются формулами:
Если чисел более двух: , их НОД находится по следующему алгоритму:
-
- ………
- — это и есть искомый НОД.
Свойства[править | править код]
- Основное свойство: наибольший общий делитель и делится на любой общий делитель этих чисел. Пример: для чисел 12 и 18 наибольший общий делитель равен 6; он делится на все общие делители этих чисел: 1, 2, 3, 6.
- Если делится на , то НОД(m, n) = n. В частности, НОД(n, n) = n.
- . В общем случае, если , где – целые числа, то .
- — общий множитель можно выносить за знак НОД.
- Если , то после деления на числа становятся взаимно простыми, то есть, . Это означает, в частности, что для приведения дроби к несократимому виду надо разделить её числитель и знаменатель на их НОД.
- Мультипликативность: если взаимно просты, то:
-
- и поэтому представим в виде линейной комбинации чисел и :
- .
- Это соотношение называется соотношением Безу, а коэффициенты и — коэффициентами Безу. Коэффициенты Безу эффективно вычисляются расширенным алгоритмом Евклида. Это утверждение обобщается на наборы натуральных чисел — его смысл в том, что подгруппа группы , порождённая набором , — циклическая и порождается одним элементом: НОД(a1, a2, … , an).
Вариации и обобщения[править | править код]
Понятие делимости целых чисел естественно обобщается на произвольные коммутативные кольца, такие, как кольцо многочленов или гауссовы целые числа. Однако, определить НОД(a, b) как наибольший из общих делителей , нельзя, так как в таких кольцах, вообще говоря, не определено отношение порядка. Поэтому в качестве определения НОД берётся его основное свойство:
-
- Наибольшим общим делителем НОД(a, b) называется тот общий делитель, который делится на все остальные общие делители и .
Для натуральных чисел новое определение эквивалентно старому. Для целых чисел НОД в новом смысле уже не однозначен: противоположное ему число тоже будет НОД. Для гауссовых чисел число различных НОД возрастает до 4.
НОД двух элементов коммутативного кольца, вообще говоря, не обязан существовать. Например, для нижеследующих элементов и кольца не существует наибольшего общего делителя:
В евклидовых кольцах наибольший общий делитель всегда существует и определён с точностью до делителей единицы, то есть количество НОД равно числу делителей единицы в кольце.
См. также[править | править код]
- Бинарный алгоритм вычисления НОД
- Делимость
- Алгоритм Евклида
- Наименьшее общее кратное
Литература[править | править код]
- Виноградов И. М. Основы теории чисел. М.-Л.: Гос. изд. технико-теоретической литературы, 1952, 180 с.
Примечания[править | править код]
- ↑ Математическая энциклопедия (в 5 томах). — М.: Советская Энциклопедия, 1982. — Т. 3. страница 857
Онлайн калькулятор НОД и НОК двух чисел
Наибольший общий делитель (НОД)
НОД двух или более целых чисел — это наибольшее целое число, которое является делителем каждого из этих чисел.
Если натуральное число a делится на натуральное число bb, то bb называют делителем числа aa, а число aa называют кратным числа bb. aa и bb являются натуральными числами. Число gg называют общим делителем и для aa и для bb. Множество общих делителей чисел aa и bb конечно, так как ни один из этих делителей не может быть больше, чем aa. Значит, среди этих делителей есть наибольший, который называют наибольшим общим делителем чисел aa и bb и для его обозначения используют записи: НОД (a;b)(a;b) или D(a;b)(a;b)
Пример
Наибольший общий делитель (НОД) чисел 1818 и 2424 — это 66.
Как найти наибольший общий делитель (НОД)
Существует несколько способов нахождения наибольшего общего делителя (НОД) двух или более целых чисел:
- Алгоритм Евклида: НОД(a,b)=(a, b) = НОД (b,a(b, a mod b)b), где «mod» – это операция взятия остатка от деления большего числа на меньшее. Этот алгоритм можно продолжать до тех пор, пока одно из чисел не станет равно нулю. В этом случае НОД равен ненулевому числу.
Пример
НОД(18,24)=НОД(24,18)=НОД(18,6)=НОД(6,0)=6НОД(18, 24) = НОД(24, 18) = НОД(18, 6) = НОД(6, 0) = 6
- Разложение на простые множители: Найти все простые множители каждого из чисел и их степени. НОД будет равен произведению всех общих простых множителей в минимальной степени.
Пример
НОД(60,84)=22⋅31=12(60, 84) = 2^{2} cdot 3^{1} = 12, так как общие простые множители −2- 2 и 33, их минимальные степени −2- 2 и 11 соответственно.
- Таблица делителей: Составить таблицы всех делителей каждого числа и найти наибольшее общее число, которое является делителем обоих чисел. Этот метод не рекомендуется для больших чисел, так как он требует много времени и усилий.
Наименьшее общее кратное (НОК)
НОК двух или более целых чисел — это наименьшее число, которое делится на каждое из этих чисел без остатка.
Общими кратными чисел называются числа которые делятся на исходные без остатка. Например для чисел 2525 и 5050 общими кратными будут числа 50,100,150,20050,100,150,200 и т.д Наименьшее из общих кратных будет называться НОК и обозначается НОК(a;b)(a;b) или K(a;b).(a;b).
Пример
Наименьшее общее кратное чисел 88 и 1212 – это 2424. Т.е. НОК (8,12)=24(8, 12) = 24.
Как найти наименьшее общее кратное (НОК)
Чтобы найти НОК двух чисел, необходимо:
- Разложить числа на простые множители;
- Выписать множители, входящие в состав первого числа и добавить к ним множители, которые входят в состав второго и не ходят в состав первого;
- Найти произведение чисел, найденных на шаге 2. Полученное число и будет искомым наименьшим общим кратным.
Пример
Рассмотрим два числа: 88 и 1212. Найдем их НОКНОК:
- Разложим 88 и 1212 на простые множители: 8=23,12=22⋅38 = 2^3, 12 = 2^2 cdot 3.
- Выпишем все простые множители: 23⋅32^3 cdot 3.
- Для каждого простого множителя выберем наибольшую кратность: 232^3 и 33.
- Умножим выбранные простые множители между собой: 23⋅3=242^3 cdot 3 = 24.
Таким образом, НОК чисел 88 и 1212 равен 2424.
Свойства НОД и НОК
- Любое общее кратное чисел aa и bb делится на K(a;b)(a;b);
- Если a⋮bavdots b , то К(a;b)=a(a;b)=a;
- Если К(a;b)=k(a;b)=k и mm-натуральное число, то К(am;bm)=km(am;bm)=km. Если dd-общий делитель для aa и bb,то К(ad;bdfrac{a}{d};frac{b}{d})= kd frac{k}{d}
- Если a⋮cavdots c и b⋮cbvdots c ,то abcfrac{ab}{c} – общее кратное чисел aa и bb;
- Для любых натуральных чисел aa и bb выполняется равенство D(a;b)⋅К(a;b)=abD(a;b)cdot К(a;b)=ab;
- Любой общий делитель чисел aa и bb является делителем числа D(a;b)D(a;b).
Given two integer numbers, the task is to find count of all common divisors of given numbers?
Examples :
Input : a = 12, b = 24 Output: 6 // all common divisors are 1, 2, 3, // 4, 6 and 12 Input : a = 3, b = 17 Output: 1 // all common divisors are 1 Input : a = 20, b = 36 Output: 3 // all common divisors are 1, 2, 4
It is recommended to refer all divisors of a given number as a prerequisite of this article.
Naive Solution
A simple solution is to first find all divisors of first number and store them in an array or hash. Then find common divisors of second number and store them. Finally print common elements of two stored arrays or hash. The key is that the magnitude of powers of prime factors of a divisor should be equal to the minimum power of two prime factors of a and b.
- Find the prime factors of a using prime factorization.
- Find the count of each prime factor of a and store it in a Hashmap.
- Prime factorize b using distinct prime factors of a.
- Then the total number of divisors would be equal to the product of (count + 1)
of each factor. - count is the minimum of counts of each prime factors of a and b.
- This gives the count of all divisors of a and b.
C++
#include <bits/stdc++.h>
using
namespace
std;
map<
int
,
int
> ma;
void
primeFactorize(
int
a)
{
for
(
int
i = 2; i * i <= a; i += 2)
{
int
cnt = 0;
while
(a % i == 0)
{
cnt++;
a /= i;
}
ma[i] = cnt;
}
if
(a > 1)
{
ma[a] = 1;
}
}
int
commDiv(
int
a,
int
b)
{
primeFactorize(a);
int
res = 1;
for
(
auto
m = ma.begin();
m != ma.end(); m++)
{
int
cnt = 0;
int
key = m->first;
int
value = m->second;
while
(b % key == 0)
{
b /= key;
cnt++;
}
res *= (min(cnt, value) + 1);
}
return
res;
}
int
main()
{
int
a = 12, b = 24;
cout << commDiv(a, b) << endl;
return
0;
}
Java
import
java.util.*;
import
java.io.*;
class
GFG {
static
HashMap<Integer, Integer> ma =
new
HashMap<>();
static
void
primeFactorize(
int
a)
{
for
(
int
i =
2
; i * i <= a; i +=
2
) {
int
cnt =
0
;
while
(a % i ==
0
) {
cnt++;
a /= i;
}
ma.put(i, cnt);
}
if
(a >
1
)
ma.put(a,
1
);
}
static
int
commDiv(
int
a,
int
b)
{
primeFactorize(a);
int
res =
1
;
for
(Map.Entry<Integer, Integer> m : ma.entrySet()) {
int
cnt =
0
;
int
key = m.getKey();
int
value = m.getValue();
while
(b % key ==
0
) {
b /= key;
cnt++;
}
res *= (Math.min(cnt, value) +
1
);
}
return
res;
}
public
static
void
main(String args[])
{
int
a =
12
, b =
24
;
System.out.println(commDiv(a, b));
}
}
Python3
import
math
ma
=
{}
def
primeFactorize(a):
sqt
=
int
(math.sqrt(a))
for
i
in
range
(
2
, sqt,
2
):
cnt
=
0
while
(a
%
i
=
=
0
):
cnt
+
=
1
a
/
=
i
ma[i]
=
cnt
if
(a >
1
):
ma[a]
=
1
def
commDiv(a, b):
primeFactorize(a)
res
=
1
for
key, value
in
ma.items():
cnt
=
0
while
(b
%
key
=
=
0
):
b
/
=
key
cnt
+
=
1
res
*
=
(
min
(cnt, value)
+
1
)
return
res
a
=
12
b
=
24
print
(commDiv(a, b))
C#
using
System;
using
System.Collections.Generic;
class
GFG{
static
Dictionary<
int
,
int
> ma =
new
Dictionary<
int
,
int
>();
static
void
primeFactorize(
int
a)
{
for
(
int
i = 2; i * i <= a; i += 2)
{
int
cnt = 0;
while
(a % i == 0)
{
cnt++;
a /= i;
}
ma.Add(i, cnt);
}
if
(a > 1)
ma.Add(a, 1);
}
static
int
commDiv(
int
a,
int
b)
{
primeFactorize(a);
int
res = 1;
foreach
(KeyValuePair<
int
,
int
> m
in
ma)
{
int
cnt = 0;
int
key = m.Key;
int
value = m.Value;
while
(b % key == 0)
{
b /= key;
cnt++;
}
res *= (Math.Min(cnt, value) + 1);
}
return
res;
}
static
void
Main()
{
int
a = 12, b = 24;
Console.WriteLine(commDiv(a, b));
}
}
Javascript
<script>
let ma =
new
Map();
function
primeFactorize(a)
{
for
(let i = 2; i * i <= a; i += 2)
{
let cnt = 0;
while
(a % i == 0)
{
cnt++;
a = parseInt(a / i, 10);
}
ma.set(i, cnt);
}
if
(a > 1)
{
ma.set(a, 1);
}
}
function
commDiv(a,b)
{
primeFactorize(a);
let res = 1;
ma.forEach((values,keys)=>{
let cnt = 0;
let key = keys;
let value = values;
while
(b % key == 0)
{
b = parseInt(b / key, 10);
cnt++;
}
res *= (Math.min(cnt, value) + 1);
})
return
res;
}
let a = 12, b = 24;
document.write(commDiv(a, b));
</script>
Output:
6
Time Complexity: O(√n log n)
Auxiliary Space: O(n)
Efficient Solution –
A better solution is to calculate the greatest common divisor (gcd) of given two numbers, and then count divisors of that gcd.
C++
#include <bits/stdc++.h>
using
namespace
std;
int
gcd(
int
a,
int
b)
{
if
(a == 0)
return
b;
return
gcd(b % a, a);
}
int
commDiv(
int
a,
int
b)
{
int
n = gcd(a, b);
int
result = 0;
for
(
int
i = 1; i <=
sqrt
(n); i++) {
if
(n % i == 0) {
if
(n / i == i)
result += 1;
else
result += 2;
}
}
return
result;
}
int
main()
{
int
a = 12, b = 24;
cout << commDiv(a, b);
return
0;
}
Java
class
Test {
static
int
gcd(
int
a,
int
b)
{
if
(a ==
0
)
return
b;
return
gcd(b % a, a);
}
static
int
commDiv(
int
a,
int
b)
{
int
n = gcd(a, b);
int
result =
0
;
for
(
int
i =
1
; i <= Math.sqrt(n); i++) {
if
(n % i ==
0
) {
if
(n / i == i)
result +=
1
;
else
result +=
2
;
}
}
return
result;
}
public
static
void
main(String args[])
{
int
a =
12
, b =
24
;
System.out.println(commDiv(a, b));
}
}
Python3
from
math
import
sqrt
def
gcd(a, b):
if
a
=
=
0
:
return
b
return
gcd(b
%
a, a)
def
commDiv(a, b):
n
=
gcd(a, b)
result
=
0
for
i
in
range
(
1
,
int
(sqrt(n))
+
1
):
if
n
%
i
=
=
0
:
if
n
/
i
=
=
i:
result
+
=
1
else
:
result
+
=
2
return
result
if
__name__
=
=
"__main__"
:
a
=
12
b
=
24
;
print
(commDiv(a, b))
C#
using
System;
class
GFG {
static
int
gcd(
int
a,
int
b)
{
if
(a == 0)
return
b;
return
gcd(b % a, a);
}
static
int
commDiv(
int
a,
int
b)
{
int
n = gcd(a, b);
int
result = 0;
for
(
int
i = 1; i <= Math.Sqrt(n); i++) {
if
(n % i == 0) {
if
(n / i == i)
result += 1;
else
result += 2;
}
}
return
result;
}
public
static
void
Main(String[] args)
{
int
a = 12, b = 24;
Console.Write(commDiv(a, b));
}
}
PHP
<?php
function
gcd(
$a
,
$b
)
{
if
(
$a
== 0)
return
$b
;
return
gcd(
$b
%
$a
,
$a
);
}
function
commDiv(
$a
,
$b
)
{
$n
= gcd(
$a
,
$b
);
$result
= 0;
for
(
$i
= 1;
$i
<= sqrt(
$n
);
$i
++)
{
if
(
$n
%
$i
== 0)
{
if
(
$n
/
$i
==
$i
)
$result
+= 1;
else
$result
+= 2;
}
}
return
$result
;
}
$a
= 12;
$b
= 24;
echo
(commDiv(
$a
,
$b
));
?>
Javascript
<script>
function
gcd(a, b)
{
if
(a == 0)
return
b;
return
gcd(b % a, a);
}
function
commDiv(a, b)
{
let n = gcd(a, b);
let result = 0;
for
(let i = 1; i <= Math.sqrt(n); i++) {
if
(n % i == 0) {
if
(n / i == i)
result += 1;
else
result += 2;
}
}
return
result;
}
let a = 12, b = 24;
document.write(commDiv(a, b));
</script>
Output :
6
Time complexity: O(n1/2) where n is the gcd of two numbers.
Auxiliary Space: O(1)
This article is contributed by Aarti_Rathi and Shashank Mishra ( Gullu ). If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Another Approach:
1. Define a function “gcd” that takes two integers “a” and “b” and returns their greatest common divisor (GCD) using the Euclidean algorithm.
2. Define a function “count_common_divisors” that takes two integers “a” and “b” and counts the number of common divisors of “a” and “b” using their GCD.
3. Calculate the GCD of “a” and “b” using the “gcd” function.
4. Initialize a counter “count” to 0.
5. Loop through all possible divisors of the GCD of “a” and “b” from 1 to the square root of the GCD.
6. If the current divisor divides the GCD evenly, increment the counter by 2 (because both “a” and “b” are divisible by the divisor).
7. If the square of the current divisor equals the GCD, decrement the counter by 1 (because we’ve already counted this divisor once).
8. Return the final count of common divisors.
9. In the main function, define two integers “a” and “b” and call the “count_common_divisors” function with these integers.
10. Print the number of common divisors of “a” and “b” using the printf function.
C
#include <stdio.h>
int
gcd(
int
a,
int
b) {
if
(b == 0) {
return
a;
}
return
gcd(b, a % b);
}
int
count_common_divisors(
int
a,
int
b) {
int
gcd_ab = gcd(a, b);
int
count = 0;
for
(
int
i = 1; i * i <= gcd_ab; i++) {
if
(gcd_ab % i == 0) {
count += 2;
if
(i * i == gcd_ab) {
count--;
}
}
}
return
count;
}
int
main() {
int
a = 12;
int
b = 18;
int
common_divisors = count_common_divisors(a, b);
printf
(
"The number of common divisors of %d and %d is %d.n"
, a, b, common_divisors);
return
0;
}
C++
#include <bits/stdc++.h>
using
namespace
std;
int
gcd(
int
a,
int
b) {
if
(b == 0) {
return
a;
}
return
gcd(b, a % b);
}
int
count_common_divisors(
int
a,
int
b) {
int
gcd_ab = gcd(a, b);
int
count = 0;
for
(
int
i = 1; i * i <= gcd_ab; i++) {
if
(gcd_ab % i == 0) {
count += 2;
if
(i * i == gcd_ab) {
count--;
}
}
}
return
count;
}
int
main() {
int
a = 12;
int
b = 18;
int
common_divisors = count_common_divisors(a, b);
cout<<
"The number of common divisors of "
<<a<<
" and "
<<b<<
" is "
<<common_divisors<<
"."
<<endl;
return
0;
}
Java
import
java.util.*;
public
class
Main {
public
static
int
gcd(
int
a,
int
b) {
if
(b ==
0
) {
return
a;
}
return
gcd(b, a % b);
}
public
static
int
countCommonDivisors(
int
a,
int
b) {
int
gcd_ab = gcd(a, b);
int
count =
0
;
for
(
int
i =
1
; i * i <= gcd_ab; i++) {
if
(gcd_ab % i ==
0
) {
count +=
2
;
if
(i * i == gcd_ab) {
count--;
}
}
}
return
count;
}
public
static
void
main(String[] args) {
int
a =
12
;
int
b =
18
;
int
commonDivisors = countCommonDivisors(a, b);
System.out.println(
"The number of common divisors of "
+ a +
" and "
+ b +
" is "
+ commonDivisors +
"."
);
}
}
Python3
import
math
def
gcd(a, b):
if
b
=
=
0
:
return
a
return
gcd(b, a
%
b)
def
count_common_divisors(a, b):
gcd_ab
=
gcd(a, b)
count
=
0
for
i
in
range
(
1
,
int
(math.sqrt(gcd_ab))
+
1
):
if
gcd_ab
%
i
=
=
0
:
count
+
=
2
if
i
*
i
=
=
gcd_ab:
count
-
=
1
return
count
a
=
12
b
=
18
common_divisors
=
count_common_divisors(a, b)
print
(
"The number of common divisors of"
, a,
"and"
, b,
"is"
, common_divisors,
"."
)
C#
using
System;
public
class
MainClass
{
public
static
int
GCD(
int
a,
int
b)
{
if
(b == 0)
{
return
a;
}
return
GCD(b, a % b);
}
public
static
int
CountCommonDivisors(
int
a,
int
b)
{
int
gcd_ab = GCD(a, b);
int
count = 0;
for
(
int
i = 1; i * i <= gcd_ab; i++)
{
if
(gcd_ab % i == 0)
{
count += 2;
if
(i * i == gcd_ab)
{
count--;
}
}
}
return
count;
}
public
static
void
Main()
{
int
a = 12;
int
b = 18;
int
commonDivisors = CountCommonDivisors(a, b);
Console.WriteLine(
"The number of common divisors of {0} and {1} is {2}."
, a, b, commonDivisors);
}
}
Javascript
function
gcd(a, b) {
if
(b === 0) {
return
a;
}
return
gcd(b, a % b);
}
function
count_common_divisors(a, b) {
let gcd_ab = gcd(a, b);
let count = 0;
for
(let i = 1; i * i <= gcd_ab; i++) {
if
(gcd_ab % i === 0) {
count += 2;
if
(i * i === gcd_ab) {
count--;
}
}
}
return
count;
}
let a = 12;
let b = 18;
let common_divisors = count_common_divisors(a, b);
console.log(`The number of common divisors of ${a} and ${b} is ${common_divisors}.`);
Output
The number of common divisors of 12 and 18 is 4.
The time complexity of the gcd() function is O(log(min(a, b))), as it uses Euclid’s algorithm which takes logarithmic time with respect to the smaller of the two numbers.
The time complexity of the count_common_divisors() function is O(sqrt(gcd(a, b))), as it iterates up to the square root of the gcd of the two numbers.
The space complexity of both functions is O(1), as they only use a constant amount of memory regardless of the input size.
Last Updated :
13 Apr, 2023
Like Article
Save Article
Калькулятор онлайн.
Нахождение (вычисление) НОД и НОК
Наибольшим общим делителем (НОД) для двух целых чисел m и n называется наибольший из их общих делителей.
Пример: для чисел 6 и 9 наибольший общий делитель равен 3.
Наибольший общий делитель существует и однозначно определён, если хотя бы одно из чисел m или n не равно нулю.
В школьной программе обозначается так: НОД(m, n)
Понятие наибольшего общего делителя (НОД) распространяется на любой набор из более чем двух целых чисел.
Чаще всего НОД используется для сокращения дроби – если найти НОД числителя и знаменателя, то на это число можно сократить
числитель и знаменатель данной дроби.
Наименьшее общее кратное (НОК) двух целых чисел m и n это наименьшее натуральное число, которое делится на m и n без остатка.
В школьной программе обозначается так: НОК(m, n)
Пример: НОК(16, 20) = 80
Одно из наиболее частых применений НОК — приведение дробей к общему знаменателю.
С помощью данной математической программы вы можете найти (вычислить) НОД и НОК двух целых чисел.
Программа нахождения НОД и НОК не только выводит ответ задачи, но и отображает процесс вычисления НОД и НОК двух чисел.
Вводить можно только целые положительные числа.
Наши игры, головоломки, эмуляторы:
Немного теории.
Наибольший общий делитель (НОД). Взаимно простые числа
Определение. Наибольшее натуральное число, на которое делятся без остатка числа а и b, называют
наибольшим общим делителем (НОД) этих чисел.
Найдём наибольший общий делитель чисел 24 и 35.
Делителями 24 будут числа 1, 2, 3, 4, 6, 8, 12, 24, а делителями 35 будут числа 1, 5, 7, 35.
Видим, что числа 24 и 35 имеют только один общий делитель — число 1. Такие числа называют взаимно простыми.
Определение. Натуральные числа называют взаимно простыми, если их наибольший общий делитель (НОД) равен 1.
Наибольший общий делитель (НОД) можно найти, не выписывая всех делителей данных чисел.
Разложим на множители числа 48 и 36, получим:
48 = 2 * 2 * 2 * 2 * 3, 36 = 2 * 2 * 3 * 3.
Из множителей, входящих в разложение первого из этих чисел, вычеркнем те, которые не входят в разложение второго числа
(т. е. две двойки).
Остаются множители 2 * 2 * 3. Их произведение равно 12. Это число и является наибольшим общим делителем чисел 48 и 36.
Так же находят наибольший общий делитель трёх и более чисел.
Чтобы найти наибольший общий делитель нескольких натуральных чисел, надо:
1) разложить их на простые множители;
2) из множителей, входящих в разложение одного из этих чисел, вычеркнуть те, которые не входят в разложение других чисел;
3) найти произ ведение оставшихся множителей.
Если все данные числа делятся на одно из них, то это число и является наибольшим общим делителем данных чисел.
Например, наибольшим общим делителем чисел 15, 45, 75 и 180 будет число 15, так как на него делятся все остальные числа: 45, 75 и 180.
Наименьшее общее кратное (НОК)
Определение. Наименьшим общим кратным (НОК) натуральных чисел а и b называют наименьшее натуральное число,
которое кратно и a и b.
Наименьшее общее кратное (НОК) чисел 75 и 60 можно найти и не выписывая подряд кратные этих чисел. Для этого разложим 75 и 60 на
простые множители: 75 = 3 * 5 * 5, а 60 = 2 * 2 * 3 * 5.
Выпишем множители, входящие в разложение первого из этих чисел, и добавим к ним недостающие множители 2 и 2 из разложения
второго числа (т.е. объединяем множители).
Получаем пять множителей 2 * 2 * 3 * 5 * 5, произведение которых равно 300. Это число является наименьшим общим кратным чисел 75 и 60.
Так же находят наименьшее общее кратное для трёх и более чисел.
Чтобы найти наименьшее общее кратное нескольких натуральных чисел, надо:
1) разложить их на простые множители;
2) выписать множители, входящие в разложение одного из чисел;
3) добавить к ним недостающие множители из разложений остальных чисел;
4) найти произведение получившихся множителей.
Заметим, что если одно из данных чисел делится на все остальные числа, то это число и является наименьшим общим кратным данных
чисел.
Например, наименьшим общим кратным чисел 12, 15, 20 и 60 будет число 60, так как оно делится на все данные числа.
Пифагор (VI в. до н. э.) и его ученики изучали вопрос о делимости чисел. Число, равное сумме всех его делителей (без самого числа),
они называли совершенным числом. Например, числа 6 (6 = 1 + 2 + 3), 28 (28 = 1 + 2 + 4 + 7 + 14) совершенные. Следующие совершенные
числа — 496, 8128, 33 550 336. Пифагорейцы знали только первые три совершенных числа. Четвёртое — 8128 — стало известно в I в. н. э.
Пятое — 33 550 336 — было найдено в XV в. К 1983 г. было известно уже 27 совершенных чисел. Но до сих пор учёные не знают, есть ли
нечётные совершенные числа, есть ли самое большое совершенное число.
Интерес древних математиков к простым числам связан с тем, что любое число либо простое, либо может быть представлено в виде
произведения простых чисел, т. е. простые числа — это как бы кирпичики, из которых строятся остальные натуральные числа.
Вы, наверное, обратили внимание, что простые числа в ряду натуральных чисел встречаются неравномерно — в одних частях ряда их больше,
в других — меньше. Но чем дальше мы продвигаемся по числовому ряду, тем реже встречаются простые числа. Возникает вопрос: существует
ли последнее (самое большое) простое число? Древнегреческий математик Евклид (III в. до н. э.) в своей книге «начала», бывшей на
протяжении двух тысяч лет основным учебником математики, доказал, что простых чисел бесконечно много, т. е. за каждым простым числом
есть ещё большее простое число.
Для отыскания простых чисел другой греческий математик того же времени Эратосфен придумал такой способ. Он записывал все числа
от 1 до какого-то числа, а потом вычёркивал единицу, которая не является ни простым, ни составным числом, затем вычёркивал через
одно все числа, идущие после 2 (числа, кратные 2, т. е. 4, 6, 8 и т. д.). Первым оставшимся числом после 2 было 3. Далее
вычёркивались через два все числа, идущие после 3 (числа, кратные 3, т. е. 6, 9, 12 и т. д.). в конце концов оставались
невычеркнутыми только простые числа.