Зачем нужно уметь быстро находить число делителей числа? Этот навык пригодится для решения математических задач, оценки сложности алгоритмов, оптимизации программ. В статье мы рассмотрим несколько способов нахождения числа делителей и дадим практические советы по их применению.
Базовые понятия
Прежде чем перейти к методам нахождения числа делителей, давайте разберемся с базовыми определениями.
- Делитель числа A - это такое число B, которое делит A без остатка.
- Кратное числа A - это число, которое получается умножением A на некоторое целое число.
- Простые числа имеют ровно 4 делителя: 1, само число, -1 и число со знаком минус.
- У составных чисел число делителей больше 4.
Например, у числа 12 делителями являются 1, 2, 3, 4, 6, 12. А число 13 является простым, у него всего 4 делителя.
Разложение на множители
Как находить число делителей числа? Один из самых распространенных способов - это разложение исходного числа на простые множители. Алгоритм такой:
- Разложить число на простые множители
- Записать каноническое разложение в виде степеней этих множителей
- Найти число делителей по формуле: (степень 1-го множителя + 1) * (степень 2-го множителя + 1) * ... * (степень n-го множителя + 1)
Например, разложим число 500:
500 = 22 * 53
Подставляем в формулу:
(2 + 1) * (3 + 1) = 3 * 4 = 12
Получаем, что у 500 ровно 12 делителей.
Найдите наибольший общий делитель чисел
Часто нужно найти общие делители нескольких чисел. Для этого используется алгоритм Евклида.
Алгоритм Евклида - это пошаговая процедура для нахождения наибольшего общего делителя двух чисел.
Например, найдем НОД чисел 105 и 42:
- 105 = 42 * 2 + 21
- 42 = 21 * 2
НОД(105, 42) = НОД(42, 21) = 21.
Так как общие делители совпадают с делителями НОД, то делители 105 и 42 - это делители числа 21, то есть 1, 3, 7, 21.
Число 1 | Делители |
105 | 1, 3, 5, 7, 15, 21, 35, 105 |
42 | 1, 2, 3, 6, 7, 14, 21, 42 |
Таким образом, общими делителями чисел 105 и 42 являются числа 1, 3, 7, 21.
Решето Эратосфена
Находить число делителей числа можно эффективно с помощью решета Эратосфена - это алгоритм для нахождения всех простых чисел до некоторого числа N. Принцип работы такой:
- Записываем последовательность чисел от 2 до N
- Вычеркиваем кратные 2, оставляем само 2
- Переходим к следующему невычеркнутому числу (оно обязательно простое), вычеркиваем его кратные
- Повторяем пока есть невычеркнутые числа
В итоге остаются только простые числа. А если запоминать вычеркнутые числа, то мы получим раскладку любого числа до N на множители!
Например, запустим решето до 30:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29
Тогда раскладка числа 20:
20 = 22 * 5
Как находить делители по формуле
Как мы уже выяснили ранее, формула для подсчета числа делителей такая:
(степень 1-го множителя + 1) * (степень 2-го множителя + 1) * ... * (степень n-го множителя + 1)
Однако в некоторых случаях удобнее напрямую использовать общую формулу:
d(n) = (p1a1 + p1a1-1 + ... + 1) * ... * (pnan + pnan-1 + ... + 1)
Где a1 - степень 1-го множителя, an - степень n-го множителя.
Это позволяет быстро получить точное число делителей, не задействуя лишние вычислительные ресурсы.
Динамическое программирование делителей
Находить число делителей числа для последовательности чисел можно с помощью динамического программирования. А именно, если у нас уже посчитаны делители для чисел от 1 до N, то число делителей числа N+1 можно найти как:
- Разложить N+1 на множители
- Сложить число делителей этих множителей (которые мы уже знаем)
Это позволяет избежать лишних вычислений. Например, чтобы найти делители 100, достаточно сложить делители 4 (3 делителя) и делители 25 (3 делителя). Итого получаем 3 + 3 = 6 делителей.
Приближенные вычисления
Иногда не нужно точное число делителей, достаточно приблизительной оценки. Тогда можно воспользоваться следующими неравенствами:
- Число делителей < корня квадратного из числа
- Число делителей < корня кубического из числа (улучшенная оценка)
Эти неравенства позволяют быстро оценить порядок числа делителей. Например, для числа 10 000 000 оценка даст:
Число делителей < 100 = корень квадратный из 10 000 000
Связь делителей и НОД
Ранее мы рассмотрели, что общие делители чисел совпадают с делителями их наибольшего общего делителя. Этот факт можно использовать для оптимизации поиска делителей.
Например, чтобы найти общие делители чисел 18, 24 и 36, достаточно вычислить их НОД. Разложим числа на множители:
- 18 = 2 * 3 * 3
- 24 = 2 * 2 * 2 * 3
- 36 = 2 * 2 * 3 * 3
НОД(18, 24, 36) = 2 * 2 * 3 = 12
Значит, общими делителями будут делители числа 12: 1, 2, 3, 4, 6, 12.
Распространенные ошибки
Часто встречаются следующие ошибки при подсчете числа делителей:
- Неправильное разложение на множители. Например, число 20 записывают как 2 * 10 вместо 22 * 5.
- Неучтенные множители со степенью 0. Например, в числе 30 не учитывают множитель 70.
- Неверная формула подсчета. Используют упрощенный вариант (степень + 1) вместо полного.
Чтобы избежать ошибок, следует:
- Проверять разложение на калькуляторе или с помощью решета Эратосфена
- Явно указывать множители со степенью 0
- Применять общую формулу с суммой степеней
Распределенные вычисления
Для очень больших чисел имеет смысл использовать распределенные вычисления. Алгоритм:
- Разбить число на 2 приблизительно равные части
- В параллельных потоках подсчитать делители каждой части
- Перемножить полученные результаты
Это позволяет сократить время счета за счет параллельной обработки. Например, 10 000-значное число можно разбить на два 5 000-значных куска и обработать их на разных ядрах процессора.
Кеширование результатов
При многократных вызовах подсчета делителей одних и тех же чисел имеет смысл кешировать промежуточные результаты. А именно сохранять:
- Разложение на множители
- Делители часто встречающихся простых множителей
- Делители уже посчитанных чисел
Это избавит от повторных однотипных вычислений и ускорит работу алгоритмов.