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

$begingroup$

How would you formally derive the fact that integer $100$ has 9 divisors $(1,2,4,5,10,20,25,50,100)$, knowing in advance that, apart from 1, its prime divisors are 2 and 5, each recurring 2 times $(2 cdot 2 cdot 5 cdot 5 = 100)$?

This should be achievable using counting rules in combinatorics.

asked Nov 26, 2020 at 7:51

Giogre's user avatar

$endgroup$

$begingroup$

Yes, it is possible. Suppose we have $n = p_1^{k_1}…p_m^{k_m}$ where $p_1,…,p_m$ are distinct primes and $k_1,…,k_m ge 1$. Then, for each prime factor $p_i$, we have the options ${0,1,…,k_i}$ for its power $k_i$ since $p_i^a|p_i^{k_i}, forall a text{ such that } 0 le a le k_i$. So we have $k_i+1$ options for each. Considering the fact that the prime factors are independent from other prime factors (as they are prime numbers), can you get a general result from here?

answered Nov 26, 2020 at 7:58

ArsenBerk's user avatar

ArsenBerkArsenBerk

13.1k3 gold badges23 silver badges51 bronze badges

$endgroup$

2

$begingroup$

The divisor counting function is usually noted with $tau(n)$ (tau). In other words, $n$ has $tau(n)$ divisors.

$$n=prod_{i=1}^{m}p_m^{a_m}Rightarrowtau(n)=prod_{i=1}^{m}(a_i+1)$$

The proof for this? Well observe that $p^k$ with prime $p$ has indeed $k+1$ divisors ($1,p,…,p^k$). Finally, observe that $$taubigg(prod_{i=1}^{m}p_m^{a_m}bigg)=prod_{i=1}^{m}tau(p_i^{a_i})$$ and you are done.

answered Nov 26, 2020 at 8:01

$endgroup$

1

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.


Загрузить PDF


Загрузить PDF

Число называется делителем (или множителем) другого числа в том случае, если при делении на него получается целый результат без остатка.[1]
Для малого числа (например, 6) определить количество делителей довольно легко: достаточно выписать все возможные произведения двух целых чисел, которые дают заданное число. При работе с большими числами определить количество делителей становится сложнее. Тем не менее, если вы разложите целое число на простые множители, то легко сможете определить число делителей с помощью простой формулы.

  1. Изображение с названием Determine the Number of Divisors of an Integer Step 1

    1

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

    • Например, если вы хотите узнать, сколько делителей, или множителей имеет число 24, запишите 24 вверху страницы.
  2. Изображение с названием Determine the Number of Divisors of an Integer Step 2

    2

    Найдите два числа (помимо 1), при перемножении которых получается заданное число. Таким образом вы найдете два делителя, или множителя данного числа. Проведите от данного числа две ветки вниз и запишите на их концах полученные множители.

  3. Изображение с названием Determine the Number of Divisors of an Integer Step 3

    3

    Поищите простые множители. Простым множителем называется такое число, которое делится без остатка лишь на само себя и на 1.[2]
    Например, число 7 является простым множителем, так как оно делится без остатка лишь на 1 и 7. Для удобства обводите найденные простые множители кружком.

    • Например, 2 является простым числом, поэтому обведите  2 кружком.
  4. Изображение с названием Determine the Number of Divisors of an Integer Step 4

    4

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

  5. Изображение с названием Determine the Number of Divisors of an Integer Step 5

    5

    Представьте каждый простой множитель в степенной форме. Для этого подсчитайте, сколько раз встречается каждый простой множитель в нарисованном дереве множителей. Это число и будет степенью, в которую необходимо возвести данный простой множитель.[3]

  6. Изображение с названием Determine the Number of Divisors of an Integer Step 6

    6

    Запишите разложение числа на простые множители. Первоначально заданное число равно произведению простых множителей в соответствующих степенях.

    • В нашем примере 24=2^{{3}}times 3^{{1}}.

    Реклама

  1. Изображение с названием Determine the Number of Divisors of an Integer Step 7

    1

  2. Изображение с названием Determine the Number of Divisors of an Integer Step 8

    2

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

  3. Изображение с названием Determine the Number of Divisors of an Integer Step 9

    3

    Сложите величины в скобках. Просто прибавьте 1 к каждой степени.

  4. Изображение с названием Determine the Number of Divisors of an Integer Step 10

    4

    Перемножьте полученные величины. В результате вы определите количество делителей, или множителей данного числа n.

    Реклама

Советы

  • Если число представляет собой квадрат целого числа (например, 36 является квадратом числа 6), то оно имеет нечетное количество делителей. Если же число не является квадратом другого целого числа, количество его делителей четно.

Реклама

Похожие статьи

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

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

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

Представление числа в виде произведения простых множителей

Из различных разделов математики в спортивном программировании чаще всего
встречаются элементы элементарной теории чисел. В этом разделе значительную
роль имеет разложение числа на простые множители. Простыми называются такие
числа, которые не имеют делителей кроме 1 и самого себя. Ряд простых чисел
выглядит так:

[2, 3, 5, 7, 11, 13, 17, 19, 23, ldots]

Все остальные натуральные числа (кроме 1) называются составными, так как их
можно представить в виде произведения нескольких простых чисел. Например:

[12 = 2 * 2 * 3]

Часто это записывается со степенями простых множителей:

[12 = 2^2 * 3^1]

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

[x = p_1^{alpha_1} * p_2^{alpha_2} * ldots * p_n^{alpha_n} = prodlimits_i {p_i^{alpha_i}}]

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

Проверка числа на простоту

Чтобы проверить, является ли натуральное число (x) простым, достаточно просто
проверить, существует ли в отрезке ([2;sqrt{x}]) число, на которое делится (x).
Это достаточно очевидно: если бы существовало такое число (y), что (x) делится
на (y) и (sqrt{x} < y < x), то гарантированно существовало бы и число
(z = x/y), которое было бы меньше корня, а значит, изначального условия хватило
бы для проверки на простоту.

Реализация на C++:

1
2
3
4
5
6
7
8
9
bool is_prime(int x) {
    for (int i = 2; i <= sqrt(x); i++) {
        if (x % i == 0) {
            return false;
        }
    }

    return true;
}

Сложность этого алгоритма (O(sqrt{N})). Существуют алгоритмы, позволяющие
выполнять эту проверку быстрее (порядка (O(log^6 N))), но они исключительно
редко применяются в спортивном программировании.

Факторизация

Факторизацией называется разложение числа на простые множители. Алгоритм
факторизации основывается на тех же идеях, что и алгоритм проверки на простоту,
приведённый выше. А именно: если у числа существует простой делитель, отличный
от него самого, то он не превышает корня из числа. Для факторизации числа нужно
перебрать все числа в промежутке ([2;sqrt{x}]), и попытаться разделить (x) на
каждое из них по очереди.

Реализация на C++ (Сложность: (O(sqrt{N}))):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<int> factorize(int x) {
    vector<int> factors;

    for (int i = 2; i <= sqrt(x); i++) {
        while (x % i == 0) {
            factors.push_back(i);
            x /= i;
        }
    }

    if (x != 1) {
        factors.push_back(x);
    }

    return factors;
}

Корректность этого алгоритма доказать также несложно. Заметим, что если при
факторизации числа (x) мы нашли делитель (y), то нам, по факту, осталось
факторизовать число (x/y). Поэтому мы можем смело разделить число (x) на (y)
и продолжить работу алгоритма. Мы можем не начинать проверку сначала, так как
число (x/y) гарантированно не имеет делителей меньше (y), иначе мы бы их уже
нашли при факторизации (x).

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

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

Также можно реализовать алгоритм в виде поиска пар ((p_i, alpha_i)), где
(p_i) — множитель, (alpha_i) — его степень:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
map<int, int> factorize(int x) {
    map<int, int> factors;

    for (int i = 2; i <= sqrt(x); i++) {
        while (x % i == 0) {
            factors[i]++;
            x /= i;
        }
    }

    if (x != 1) {
        factors[x]++;
    }

    return factors;
}

Поиск делителей

Поиск делителей числа и разложение его на множители — разные понятия,
хотя термины в какой-то степени схожи. Под делителями числа подразумевают
все числа, на которые оно делится. Пример для числа 20:

Множители (2, 2, 5)
Делители (1, 2, 4, 5, 10, 20)

Алгоритм поиска делителей числа (x) во многом похож на другие алгоритмы,
приведённые выше. Мы рассматриваем делители парами: для каждого делителя (y)
мы учитываем соответствующий ему (x/y). Один из этих делителей гарантированно
не превышает (sqrt{x}), поэтому, как и раньше, мы можем рассматривать только
промежуток ([1;sqrt{x}]).

Реализация на C++ (Сложность: (O(sqrt{N}))):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<int> find_dividers(int x) {
    vector<int> dividers;

    for (int i = 1; i <= sqrt(x); i++) {
        if (x % i == 0) {
            dividers.push_back(i);

            //для корня из x не существует парного делителя
            if (i * i != x) {
                dividers.push_back(x / i);
            }
        }
    }

    return dividers;
}

Количество делителей

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

Для этого давайте определим понятие делителя в контексте простых множителей.
Запишем числа (x) и (y) в следующем виде:

[x = p_1^{alpha_1} * p_2^{alpha_2} * ldots * p_n^{alpha_n}]

[y = p_1^{beta_1} * p_2^{beta_2} * ldots * p_n^{beta_n}]

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

Утверждение: частное двух чисел можно записать следующим образом:

[{x over y} = p_1^{alpha_1 — beta_1} * p_2^{alpha_2 — beta_2} * ldots * p_n^{alpha_n — beta_n}]

Так как мы работаем с натуральными числами, это выражение имеет смысл тогда
и только тогда, когда все степени простых множителей целые и неотрицательные.
Отсюда можно выразить условие делимости двух чисел:

[forall i: alpha_i — beta_i ge 0]

или

[forall i: beta_i le alpha_i]

(Если вы не знакомы с подобной записью, (forall i) обозначает “для всех (i)”)

Из этого условия можно легко вывести количество делитей. Ещё раз запишем (x) в виде

[x = p_1^{alpha_1} * p_2^{alpha_2} * ldots * p_n^{alpha_n}]

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

Давайте рассмотрим, сколько возможных значений может принимать каждая степень
(beta_i). С ней связано два условия:

(beta_i ge 0)
(beta_i le alpha_i)

Значит, каждая из степеней (beta_i) может принимать (alpha_i + 1) различных
значений, и набор степеней (beta) однозначно описывает уникальный делитель.
Используя формулы комбинаторики мы можем выразить количество делителей следующим
образом:

[K = (alpha_1 + 1) * (alpha_2 + 1) * ldots * (alpha_n + 1) = prodlimits_i (alpha_i + 1)]

Реализация на C++:

1
2
3
4
5
6
7
8
9
int dividers_count(map<int, int>& factors) {
    int result = 1;

    for (map<int, int>::iterator it = factors.begin(); it != factors.end(); it++) {
        result *= it->second + 1;
    }

    return result;
}

Реализация на C++11:

1
2
3
4
5
6
7
8
9
int dividers_count(map<int, int>& factors) {
    int result = 1;

    for (auto p: factors) {
        result *= p.second + 1;
    }

    return result;
}

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

Возьмем различные простые числа в первой степени $%a_{1}, a_{2}, a_{3}, …,a_{n}$% и все их перемножим. У получившегося числа 2^n делителей включая его само и единицу (формула 1).

Снова возьмем те же числа с той разницей что одно из них будет в степени k, и перемножим. Количество делителей выражается формулой 2.

Возьмем те же числа, теперь одно будет в k-й, другое в l-й степени. Получается формула 3, но тут я уже неуверен что где-то не ошибся.

1) $%a_{1}cdot a_{2}cdot a_{3} …cdot a_{n}mapsto2^{n}$%
2) $%a_{1}^{k}cdot a_{2}cdot a_{3}…cdot a_{n}mapsto2^{n}+2^{n-1}(k-1)$%
3) $%a_{1}^{k}cdot a_{2}^{l}cdot a_{3}…cdot a_{n}mapsto2^{n}+2^{n-1}(k-1)+3cdot 2^{n-2}(l-1)$%

Как вывести общую формулу? Т.е. на входе произведение n разных простых чисел в каких-то степенях, на выходе количество делителей у этого произведения.

Задача найти количество делителей числа, являющихся четными квадратами.

Разложил число на простые множители. Например, 500940 разлагается на (1,2,2,3,3,5,11,11,23).
Считаем количество делителей
[math](4, 4*3^{2}, 4*11^{2}, 4*3^{2}*11^{2})[/math]

Или 249696 разлагается на (1, 2, 2, 2, 2, 2, 3, 3, 3, 17, 17). Количество делителей:
[math](4, 16, 4*3^2, 4*17^2, 16*3^2, 16*17^2, 4*3^2*17^2, 16*3^2*17^2)[/math]

Как это выглядит в комбинаторных формулах? И что это сочетания, размещение, перестановки?

Киньте ссылку, где ясно четко это описано. Буду весьма благодарен.

С уважением,
dangee

Понравилась статья? Поделить с друзьями:
  • Как найти потерявшийся один наушник айфон
  • Как найти утечку фреона r600
  • Велес как найти аномалию
  • Как найти ячейку в exel
  • Как найти емкость батареи конденсаторов соединенных последовательно