Как найти множество общих делителей чисел

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

Как найти все делители числа

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

Если речь идет о простом числе, то его можно разделить только на единицу и на само себя. Значит, у любого простого числа a есть всего 4 делителя, два из которых больше 0 и два меньше: 1, -1, a, -a. Возьмем простое число 7: у него есть делители 7, -7, 1 и -1, и все. Еще один пример: 367 – тоже простое число, которое можно разделить лишь на 1, -1, 367 и -367.

Сложнее определить все делители составного числа. Сформулируем теорему, которая лежит в основе данного действия.

Теорема 1

Допустим, у нас есть выражение, означающее каноническое разложение числа на простые множители, вида a=p1s1·p2s2·…·pnsn. Тогда натуральными делителями числа a будут следующие числа: d=p1t2·p2t2·…·pntn, где t1=0, 1, …, s1, t2=0, 1, …, s2, …, tn=0, 1, …, sn.

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

Перейдем к доказательству этой теоремы. Зная основное определение делимости, мы можем утверждать, что a можно разделить на d, если есть такое число q, что делает верным равенство a=d·q, т.е. q=p1(s1−t1)·p2(s2-t2)·…·pn(sn-tn).

Любое число, делящее a, будет иметь именно такой вид, поскольку, согласно свойствам делимости, других простых множителей, кроме p1, p2, …, pn, оно иметь не может, а их показатели в данном случае не превысят s1, s2, …, sn.

Учитывая доказательство этой теоремы, мы можем сформировать схему нахождения всех положительных делителей данного числа.

Для этого нужно выполнить следующие действия:

  1. Выполнить каноническое разложение на простые множители и получить выражение вида a=p1s1·p2s2·…·pnsn.
  2. Найти все значения d=p1t2·p2t2·…·pntn, где числа t1, t2, …, tn будут принимать независимо друг от друга каждое из значений t1=0, 1, …, s1, t2=0, 1, …, s2, …, tn=0, 1, …, sn.

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

Пример 1

Условие: найти все делители 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.

Возьмем пример чуть сложнее: в нем при разложении числа получится не один, а два множителя.

Пример 2

Условие: найдите все делители числа 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

Условие: найти все делители 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 делителя.

Пример 4

Условие: определите, сколько делителей имеет 84.

Решение 

Раскладываем число на множители.

844221712237

Записываем каноническое разложение: 84=22·3·7. Определяем, сколько у нас получится положительных делителей: (2+1)·(1+1)·(1+1) =12. Для учета отрицательных нужно умножить это число на 2:2·12=24.

Ответ: всего у 84 будет 24 делителя – 12 положительных и 12 отрицательных.

Как вычислить общие делители нескольких чисел

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

Разберем пару таких задач.

Пример 5

Условие: сколько будет натуральных общих делителей у чисел 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.

Пример 6

Условие: выясните, сколько общих положительных делителей есть у чисел 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.

Ответ: у данных чисел шесть общих делителей.

Онлайн калькулятор НОД и НОК двух чисел

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

Определение НОД

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

Если натуральное число 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.

Как найти наименьшее общее кратное (НОК)

Чтобы найти НОК двух чисел, необходимо:

  1. Разложить числа на простые множители;
  2. Выписать множители, входящие в состав первого числа и добавить к ним множители, которые входят в состав второго и не ходят в состав первого;
  3. Найти произведение чисел, найденных на шаге 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


Загрузить PDF


Загрузить PDF

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

  1. Изображение с названием Find the Greatest Common Factor Step 1

    1

    Найдите делители чисел. Начните с поиска всех делителей первого и второго числа.

  2. Изображение с названием Find the Greatest Common Factor Step 2

    2

    Сравните делители обоих чисел и найдите самое большое число, которое есть в списке делителей как первого, так и второго числа. Это число равно НОД.

    Реклама

  1. Изображение с названием Find the Greatest Common Factor Step 3

    1

    Разложите каждое число на простые множители. Простое число – это число, большее 1 и которое делится только на 1 и на само себя. Примеры простых чисел: 5, 17, 97, 331.

  2. Изображение с названием Find the Greatest Common Factor Step 4

    2

    Найдите общие простые множители. Общий простой множитель может быть только один, или их может быть несколько.

  3. Изображение с названием Find the Greatest Common Factor Step 5

    3

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

  4. Изображение с названием Find the Greatest Common Factor Step 6

    4

    Изучите пример. Чтобы продемонстрировать этот метод, изучите пример, приведенный на рисунке.

    Реклама

Советы

  • Простое число – это число, которое делится только на 1 и на само себя.
  • Знаете ли вы, что в третьем веке до н.э. математик Евклид создал алгоритм для вычисления наибольшего общего делителя двух натуральных чисел и двух многочленов?

Реклама

Об этой статье

Эту страницу просматривали 7347 раз.

Была ли эта статья полезной?

  1. Наибольший общий
    делитель и алгоритм Евклида.

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

  3. Взаимно простые
    числа.

  4. Наименьшее общее
    кратное.

Содержание

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

Определение
3.

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

Наибольший
общий
делитель чисел а
и
b
будем обозначать одним из символов –
НОД(а;b)
или
(а;
b).

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

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

Другой,
наиболее рациональный, способ нахождения
НОД был предложен Евклидом (III
в. до н.э.).

Теорема
6.

Алгоритм
Евклида.
Если
а
разделить с остатком на b
0,
затем разделить с остатком b
на
полученный остаток, затем разделить с
остатком первый остаток на второй и
т.д., то последний, отличный от нуля,
остаток равен (а;b).

Доказательство.
Проводя
последовательно деления с остатком,
указанные в формулировке теоремы,
получим:

(3)

Поскольку
последовательность остатков является
убывающей последовательностью целых
неотрицательных чисел, то через конечное
число шагов очередной остаток (например,
rп+1)
окажется равным нулю. Пусть rп
последний,
отличный от нуля, остаток. Покажем, что
rп
= (а;b).

Прежде
всего, докажем, что если а
=
bq
+
r,
то
(а;b)
= (b;r).

Действительно,
если

и
,
то
по
теореме 2 о делимости разности. С другой
стороны, если
и,
то
по
теореме 1 о делимости суммы.

Таким
образом, множества общих делителей
чисел а
и
b
равны,
а значит, равны и их наибольшие общие
делители, то есть (а;b)
= (b;r).

Применяя
доказанный факт к первому из равенств
3, получим

(а;b)
=
(b;r1).
(4)

Аналогично,
из второго равенства последовательности
(3)

(b;r1)
= (r1;r2).
(5)

Продолжая
аналогичные
рассуждения,
получим равенства:

;
(6)

.
(7)

Исходя
из равенств (4) – (7), можем записать: (а;b)
= (b;r1)
= (r1;r2)
= … = (rn2;rn1)
= (rn1;rn)
= (rn;0)
= rn.
Итак, (а;b)
= rn.
Теорема
доказана.

Пример.
Найти
НОД(481; 703).

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

НОД
чисел
обозначается одним из символов – НОД()
или ().
Если,
то ()
=dn.

Пример.
Найти
НОД чисел 840, 720, 640 и 160.

1) НОД(840; 720) = 120;

2) НОД(120; 640) = 40;

3) НОД (40; 160) = 40.

Следовательно,
НОД(840; 720; 640; 160) = 40.

2.
Рассмотрим
основные свойства НОД, выраженные
следующими теоремами.

Теорема
7.

НОД двух данных чисел делится на любой
другой общий делитель этих чисел:

.

Доказательство
теоремы вытекает из алгоритма Евклида.
Действительно, из первого равенства
последовательности (3) следует, что если
и,
то.
Во втором равенствеи,
а значит, и.
Рассуждая аналогично, мы можем установить,
что в правой части каждого из следующих
равенств алгоритма вторые слагаемые
должны делиться нас,
то есть
.
Ноrn
= (а;b).
Следовательно,
и теорема доказана.

Теорема
8.
Любой
делитель НОД двух данных чисел является
общим делителем этих чисел:

.

Доказательство.
Очевидно, что теорема 8 является обратной
для теоремы 7. Пусть
.
Докажем, чтои.

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

,
где
.
(8)

Кроме
того, по условию теоремы,
,
где
.
Заменив
в равенствах (8) НОД(а;b)
произведением

,
получим равенства
и,
которые
можно записать в виде
,.
Это означает, чтои.
Таким
образом, теорема доказана.

Теорема
9.
Если
каждое из двух данных чисел умножить
на натуральное число, то НОД этих чисел
умножится на то же число:

.

Доказательство.
Пользуясь свойством монотонности
умножения, умножим обе части каждого
из равенств (3) на одно и то же число k.
В
полученных равенствах вместо натуральных
чисел

будут,
соответственно, стоять новые числа:

.

Значит,
(ak;
bk)
=
rnk,
или
(ak;
bk)
=
dk,
что
и требовалось доказать.

Теорема
10.
Если
каждое из двух данных чисел разделить
на натуральное число, то НОД этих чисел
разделится на то же число:

.

Доказательство.
Поскольку
данная теорема является обратной теореме
9, то для ее доказательства достаточно
к последовательности равенств (3)
алгоритма Евклида применить преобразования
обратные тем, что были проведены в
теореме 9.

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

Определение
4.

Если НОД чисел равен единице, то числа
называются взаимно
простыми.

–взаимно
просты
.

Если
– совокупность взаимно простых чисел,
то отсюда не следует, что любые подмножества
этой совокупности взаимно просты.

Пример.
Так,
(35; 55; 77) = 1, но (35; 55) = 5, (55; 77) = 11, (35; 77) = 7.

Теорема
11.

Если данные числа разделить на их НОД,
то полученные частные будут числами
взаимно простыми:

.

Следует
заметить, что символы
издесь представляют натуральные числа.

Справедливость
теоремы 11 вытекает из теоремы 10.
Действительно, если каждое из чисел а
и b
разделить на натуральное число d,
то и НОД этих чисел разделится на d,
а
значит, будет равен 1.

Теорема
12.

Если произведение двух чисел делится
на число, взаимно простое с одним из
множителей, то другой множитель делится
на это число:

Доказательство.
По
условию теоремы, (а;
с)
=
1.
Пользуясь
теоремой 9, умножим каждое из чисел а
и с
на число b.
Тогда
НОД этих чисел также умножится на b,
то есть (аb;
с
b)
= b.
По
условию теоремы,
.
Кроме
того, очевидно, что
.
Следовательно,
с
является общим делителем чисел ab
и
сb
.
Но
тогда, по теореме 7, НОД этих чисел также
делится на с,
то есть
.

Теорема
13.

(Признак
делимости на составное число.)
Если
числа а
и
b
взаимно
просты, то число с
делится
на их произведение ab
тогда
и только тогда, когда с
делится
на а
и на b:

.

Доказательство.
Необходимость
вытекает
из транзитивности отношения делимости.
Так как
,
то.
Аналогично,
из условия
b
следует,
что
.

Достаточность.
Пусть
и,
причем (а;b)
= 1. Докажем, что
.
Так как,
то
с
=
aq1,
где
.
Зная,
что
,
имеем,
где (а;b)
= 1.
По
теореме 12 это означает, что
,
то естьql
=
bq2,
где
.
Итак,
с
=
aq1
=
a(bq2)
=
(ab)q2,
то
есть
.
Теорема
полностью доказана.

Из
этой теоремы вытекает ряд признаков
делимости на числа, каждое из которых
является произведением двух взаимно
простых чисел. Например:

1.
Число х
делится
на 6 тогда и только тогда, когда оно
делится на 2 и 3.

2.
Число х
делится
на 36 тогда и только тогда, когда оно
делится на 4 и 9.

Аналогично
формулируются признаки делимости на
числа 12, 15, 18, 24, 45 и др.

4.
Пусть
а
и
b
– произвольные натуральные числа.
Натуральное число m
называется общим
кратным
этих
чисел, если m
делится на каждое из чисел а
и
b.
Если
m
– общее кратное чисел а
и
b,
то,
по транзитивности отношения делимости,
каждое из чисел 2m,
3m,
4m,
… также является общим кратным чисел
а
и
b.
Среди
натуральных общих кратных, по принципу
наименьшего числа, существует наименьшее
общее кратное.

Определение
5.

Наименьшим
общим кратным
(НОК)
чисел а
и
b
называется
наименьшее натуральное число т,
являющееся
общим кратным этих чисел.

Наименьшее
общее кратное
чисел а
и
b
будем
обозначать
одним
из
символов – НОК(а;b)
или
[а;
b].

Примечание.
Нуль,
как известно, является общим кратным
для любых натуральных чисел, но, по
определению, НОК(а;b)
> 0.

Теорема
14.

Любое общее кратное двух чисел делится
на их наименьшее общее кратное.

Доказательство
теоремы
проведем методом от противного. Пусть
с
произвольное
общее кратное чисел а
и
b,
т =
[а;
b].
Предположим, что с
не
делится нацело на m.
Тогда, разделив
с
на
m
с
остатком, получим с
=
mq
+
r,
0 ≤ r
< m.
Поскольку
с
кратно а
и
b,
mq
кратно
а
и
b,
то, по теореме 2 о делимости разности, r
кратно
а
и
b.
Но
это противоречит тому, что m
является НОК, ибо r
< m.
Полученное противоречие доказывает
теорему.

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

Теорема
15.

НОК и НОД двух натуральных чисел а
и
b
связаны
соотношением

аb
=
(а;b)
· [а;
b].

Доказательство.
По
определению НОД можем записать равенства
а
= (а;
b)
а
1,
b
=
(а;
b)b1.
Тогда


и
.

Из
последних равенств следует, что число


является общим кратным чисел а
и
b,
а значит, по теореме 14, оно делится на
[а;
b].

Следовательно,
можем записать:

.
(9)

Докажем
теперь, что последнее равенство возможно
только при q
=
1.

По
определению НОК можем записать: [а;
b]
= aq1
и
[а;
b]
= bq2.
Подставляя
новые
выражения НОК в равенство (9), получим


и

.

Из последних
равенств, в свою очередь, имеем


и

.

Отсюда
и.Таким
образом, выражение (а;b)q
является
общим делителем чисел а
и
b.
Но это возможно только
при q
=
1.

Итак, равенство
(9) можем переписать в виде

,
или
ab
=
(а;b)
[а;
b]

Теорема доказана.

Следствие.
НОК двух взаимно простых чисел равно
их произведению.

Пример.
Найти НОК чисел 315 и 126.

НОК(315;
126) =
.

Мы
рассмотрели определение и способ
нахождения НОК двух чисел. Аналогично
определяется НОК любого конечного
множества чисел. НОК чисел
обозначают[]
и находят по следующему правилу: сначала
находят
[а1;а2]
= m2,
затем – [m2;a3]
= m3,
[m3;a4]
= m4,
…, [mn1;an]
= mn.
Тогда [a1;a2;
…;an]
=mn.

Пример.
Найти
НОК чисел 30, 120, 72 и 64.

1) НОК(30; 120) = 120;

2)
НОК(120; 72) =
;

3)
НОК(360;64) =
.

Следовательно,
НОК(30; 120; 72; 64) = 2880.

Добавить комментарий