В данной статье мы поговорим о том, как найти все делители числа. Начнем с доказательства теоремы, с помощью которой можно задать вид всех делителей определенного числа. Далее возьмем примеры нахождения всех нужных делителей и покажем, как именно определить, сколько делителей имеет конкретное число. В последнем пункте подробно рассмотрим примеры задач на нахождение общих делителей нескольких чисел.
Как найти все делители числа
Чтобы понять материал, изложенный в данном пункте, нужно хорошо знать, что вообще из себя представляют кратные числа и делители. Здесь мы поговорим только о поиске делителей натуральных чисел, т.е. целых положительных. Этим можно ограничиться, поскольку свойство делимости гласит, что делители целого отрицательного числа аналогичны делителям целого положительного, которое будет противоположным по отношению к этому числу. Также сразу уточним, что у нуля есть бесконечно большое число делителей, и находить их смысла не имеет, поскольку в итоге все равно получится 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.
Ответ: у данных чисел шесть общих делителей.
На этой странице вы узнаете
- Как быстро работает программа?
- Есть ли смысл перебирать делители после корня?
- Что количество делителей может сказать о самом числе?
Гадание на кофейной гуще или на картах Таро? Может, на ромашке? Хотя лучше не доверять свои отношения цветку. Наша судьба — только в наших руках. А судьба чисел предопределена заранее. Сегодня мы будем предсказывать их жизнь и судьбу по делителям. Но главная проблема — найти эти делители.
Постановка проблемы. Переборное решение
Встречали ли вы странных персонажей в задачах, которым резко понадобилось купить 50 арбузов? А что подумаете, если ваш учитель математики задаст найти число, у которого 50 делителей?
Поиск делителей в математике не самый сложный процесс. Есть разные способы: разложение на простые множители, обычный перебор и так далее. Сложность задания будет зависеть от самого числа. Довольно быстро получится найти делители числа 24 — число небольшое, красивое, удобное. Нахождение делителей числа 1234567 займет гораздо больше времени.
Я предлагаю включить компьютер, открыть среду разработки и заставить код сделать за нас всю работу.
Идея в следующем:
- Создадим список, в который мы сохраним все делители числа.
- С помощью цикла for переберем все числа из диапазона от 1 до самого числа.
- Если в переборе мы нашли такое число, которое является делителем исходного — остаток от деления будет равен 0 — сохраним это число в список.
В итоге мы получим список всех делителей исходного числа.
number = 1234567
dels = []
for i in range(1, number + 1):
if number % i == 0:
dels.append(i)
print(dels)
_____________________________________________________________________
Вывод: [1, 127, 9721, 1234567]
У этого метода есть очень большая проблема — время его работы.
Программа выполняет команды очень быстро, но не бесконечно быстро.
Время работы программы можно измерить. Например, Sublime Text 3 занимается этим автоматически. И он помог посчитать, что программа выше выполнилась за 0.2 секунды. Давайте постепенно повышать ставки и смотреть, сколько времени понадобится этой же программе для поиска делителей других чисел:
— число 1234567 — 0.2 секунды;
— число 12345670 — 0.9 секунды;
— число 123456700 — 8.0 секунд;
— число 1234567000 — 115.7 секунд.
С числом 1234567 программа сделала 1234567 шагов цикла for, и справилась неимоверно быстро. Но чем больше ей придется выполнять команд, тем дольше придется работать.
Замеры времени зависят от многих факторов, например, мощности компьютера. Но мы можем повысить эффективность работы программы.
Ускоренный перебор делителей
Идея ускоренного перебора делителей заключается в том, что, найдя один делитель, мы сразу можем подобрать второй — его пару.
Возьмем число 24. Найдя его делитель 2, мы сразу можем сказать, что у 24 есть еще один делитель — 12, потому что 12 = 24 / 2. Интересная мысль? Давайте ее развивать.
Найдем по такой логике все делители числа 16.
- Самый простой делитель числа — 1. И по этой логике сразу найдем второй делитель — само число 16, так как 16 / 1 = 16.
- Проверим число 2. Это делитель, так что сразу найдем его пару: 16 / 2 = 8.
- Проверяем число 3 — это не делитель, его просто пропускаем.
- При проверке числа 4 мы столкнемся с интересной ситуацией. Его парой будет 16 / 4 = 4 — то же самое число, а мы ищем различные пары. Значит, у корня числа пары не будет: найдя корень, мы найдем только один делитель.
Если мы продолжим перебор, числа 5, 6 и 7 — не будут делителями. А за ними — 8, делитель, который мы уже нашли.
Нет. Найдя “маленький” делитель, при ускоренном переборе мы можем найти его пару, которая будет “большим” делителем. Перебирая делители, рано или поздно мы дойдем до корня числа, у которого нет пары. Перебирая числа после корня, мы будем находить только “большие” делители, которые уже нашли в паре с “маленькими”.
Если у числа целого корня нет, перебираем до его округленного вниз значения.
Нам нет смысла перебирать числа после корня, так что будем перебирать до предельно близкого к нему значения, но не больше.
Логика программы будет такой:
- Перебираем числа от 1 до корня исходного числа.
- Если мы нашли корень числа, добавляем в список делителей только его.
- Если мы нашли не корень, а обычный делитель — добавляем в список сразу пару делителей.
Пример реализации ускоренного перебора делителей для числа 1234567000:
number = 1234567000
dels = []
for i in range(1, int(number ** 0.5) + 1):
if i * i == number:
dels.append(i)
elif number % i == 0:
dels.append(i)
dels.append(number // i)
print(len(dels))
_____________________________________________________________________
Вывод: 64
Эта программа нашла все делители числа и выдала их количество — 64. А на ее работу ушло меньше секунды.
Но и это не панацея. Что, если нам придется проверить делители сразу нескольких чисел? Например, мы хотим найти все числа, у которых ровно 7 делителей, в диапазоне от 1 до 10000.
Программу надо немного модифицировать:
- заведем переменную-счетчик, которая будет считать подходящие числа;
- number сделаем перебираемой переменной по нужному диапазону с помощью цикла for;
- ускоренный перебор будет внутри перебора number;
- в конце каждого шага цикла проверяем — если делителей у числа ровно 7, то увеличиваем наш счетчик на 1.
Теперь программа будет выглядеть следующим образом:
count = 0
for number in range(1, 10000):
dels = []
for i in range(1, int(number ** 0.5) + 1):
if i * i == number:
dels.append(i)
elif number % i == 0:
dels.append(i)
dels.append(number // i)
if len(dels) == 7:
count += 1
print(count)
_____________________________________________________________________
Вывод: 2
Эта программа работала всего 0.2 секунды. Звучит неплохо, но давайте снова поднимать ставки:
- диапазон 1 — 10000 — 0.2 секунды;
- диапазон 1 — 100000 — 2.6 секунды;
- диапазон 1 — 1000000 — 80.2 секунды.
Время снова увеличивается очень быстро. Что можно с этим сделать?
Еще более ускоренный перебор делителей
Не считаем, что не нужно
Обратите внимание — программа выше нашла среди чисел 1–10000 всего 2 числа, имеющих ровно 7 делителей. А сколько же у остальных? Может быть и больше, может быть и меньше. Например, у числа 9864 делителей аж 24 штуки. Стоило ли тратить время на поиск их всех, если количество делителей больше 7?
Конечно, нет. Как только мы нашли 8 штук, мы уже можем понять, что анализировать число далее нам неинтересно. Значит, нужно остановить работу цикла.
Команда break полностью останавливает работу цикла.
Мы можем модернизировать нашу последнюю программу: если в переборе делителей мы увидим, что их больше семи, завершаем цикл командой break.
count = 0
for number in range(1, 10000):
dels = []
for i in range(1, int(number ** 0.5) + 1):
if i * i == number:
dels.append(i)
elif number % i == 0:
dels.append(i)
dels.append(number // i)
if len(dels) > 7:
break
if len(dels) == 7:
count += 1
print(count)
При этом завершится именно цикл перебора делителей i, так как break находится именно в нем, а цикл перебора number продолжит свою работу.
Давайте произведем замеры еще раз:
- диапазон 1-10000 — 0.2 секунды;
- диапазон 1-100000 — 2.1 секунды;
- диапазон 1-1000000 — 53.5 секунды.
В последнем случае мы сэкономили около трети от времени работы программы. Но и это не предел.
Не считаем, что не нужно 2.0
Вернемся на несколько абзацев выше, когда мы искали делители числа 16. Мы нашли 5 делителей — 2 пары и 1 корень, который не даст пару. Это справедливо для любого числа: целый корень не будет давать пару ни с каким другим числом, а все остальные делители — будут.
Если у числа есть целый корень, количество делителей числа будет нечетным, так как корень не даст пару ни с кем.
Если же у числа целого корня нет — количество его делителей будет четным, так как все делители будут иметь пару.
Нам нужны числа, у которых ровно 7 делителей. Следовательно, нам нужны числа, у которых есть целый корень. Это можно проверить, вычислив точный корень числа и его округленное значение. Если они совпадут, значит, округлять корень было некуда и он целый.
Но как пропускать числа, которые нам не нужны?
Команда continue останавливает работу текущего шага цикла и сразу переходит к следующему.
Если мы найдем число number, у которого нет целого корня, мы можем применить команду continue: данный шаг цикла перебора number завершается, и мы сразу перейдем к следующему.
Включить эту проверку в программу можно следующим образом:
count = 0
for number in range(1, 10000):
if number ** 0.5 != int(number ** 0.5):
continue
dels = []
for i in range(1, int(number ** 0.5) + 1):
if i * i == number:
dels.append(i)
elif number % i == 0:
dels.append(i)
dels.append(number // i)
if len(dels) > 7:
break
if len(dels) == 7:
count += 1
print(count)
Снова посмотрим на время работы программы при разных диапазонах:
- диапазон 1-100000 — 0.1 секунды;
- диапазон 1-1000000 — 0.5 секунды;
- диапазон 1-10000000 — 4.5 секунды;
- диапазон 1-100000000 — 44.4 секунды.
А делители — это вообще для чего? А таблицы со временем — это точно важно? Может, подождать проще, чем учить все это?
Нахождению делителей чисел посвящена задача 25 ЕГЭ, и без этих теоретических знаний решить ее крайне сложно. Что же касается времени работы, то за ним приходится следить внимательнейшим образом, ведь в задачах могут встречаться ситуации, когда надо найти делители для сотен миллионов чисел за раз!
Зная все особенности ускорения перебора делителей и поиска чисел с конкретными делителями, за считанные секунды можно решать задачи огромных диапазонов.
Фактчек
- Ускоренный перебор делителей подразумевает нахождение делителей попарно, при этом перебирать делители достаточно только до корня числа.
- Команда break полностью останавливает работу цикла, а команда continue завершает работу лишь текущего шага цикла, перенося нас сразу на следующий.
- Если у числа есть целый корень, количество делителей числа будет нечетным, так как корень не даст пару ни с кем. Если же у числа целого корня нет — количество его делителей будет четным, так как все делители будут иметь пару.
Проверь себя
Задание 1.
Для чего нужен ускоренный перебор делителей?
- Обычный перебор слишком скучный
- Для большей точности вычислений
- Для ускорения работы программы
Задание 2.
Найдите количество делителей числа 2568568668.
- 5
- 6
- 7
- 8
Задание 3.
Найдите, сколько чисел из диапазона от 2000 до 1002000 имеют ровно 5 делителей.
- Ни одного
- 1
- 10
- 8
Ответы: 1. — 3; 2. — 3; 3. — 4.
Здравствуйте, дорогие читатели! Как посчитать, сколько делителей у какого-нибудь числа? Если это число маленькое, то никаких сложностей не возникает. Например, для числа 10, мы легко можем найти все делители и посчитать их количество простым перебором. А вот как узнать, на какое количество различных чисел делится, например, число 720? Можно, конечно, опять же перебрать все делители, но это будет довольно трудоемко. При чем, 720 – еще и довольно маленькое число.
Сегодня, я Вам расскажу, как находить количество делителей любого натурального числа, зная всего лишь одну простую формулу.
На самом деле, наша сегодняшняя формула будет даже проще, чем те, которые изображены на картинке выше)
Вы находитесь на канале Trifler, где я разбираю интересные математические задачи, а также рассуждаю на некоторые околоматематические темы. Если Вы искренне увлечены математикой, но еще не подписаны на этот канал, то самое время это исправить! Подписаться
Чудо-формула
Ну что ж, пора переходить от разговоров к делу.
Мы знаем, что любое натуральное число можно представить в виде произведения простых чисел, которые являются его делителями. Так как один и тот же простой делитель может встречаться несколько раз, то любое натуральное числа можно записать так:
Если не совсем понятно, о чем идет речь, то потом посмотрите пример ниже. На самом деле, все очень просто.
Так вот, после того, как мы найдем такое представление числа n, количество его делителей можно будет посчитать по формуле:
Посмотрим, как все это считается на примере
Пример
Раскладываем это число на простые множители, чтобы получить нужное представление:
Теперь, запишем число 720 в каноническом виде:
Ну и все, остается только применить чудо-формулу:
Вот и все, получили, что у числа 720 имеется 30 различных натуральных делителей. Стоит сделать замечание:
По этой формуле мы считаем количество делителей вместе с единицей и самим числом.
Если Вам понравилась статья, то обязательно ставьте лайки и комментируйте ее. Это поспособствует тому, чтобы ее увидело много людей!
Читайте также ТОП-3 статьи, выпущенные в этом месяце на моем канале:
- Quincy: робот, который обучит Ваших детей математике, английскому и рисованию
- Почему вторая степень это квадрат, а третья – куб
- Необычное тригонометрическое уравнение
День!
решая задачу пришлось найти в сети алгоритм поиска всех делителей числа.
ну то есть для восьми надо выдать [1,2,4,8], а не [2,2,2] – список делителей. Я переписал этот алгоритм наново, прошу “старших товарищей” подсказать как улучшить. Если есть время ))
def divisorss(n):
from collections import Counter
ls = get_ls(n) # for n=1568 -> ls = [2, 2, 2, 2, 2, 7, 7]
pairs = dict(Counter(ls)) # {2: 5, 7: 2}
from itertools import product, starmap
from operator import mul
from functools import reduce
# список всех различных делитей числа
bases = [b for b in pairs.keys()] # [2, 7]
# список степеней, в которые возводятся уникальные делители для получения числа
powers = [[i for i in range(k+1)] for k in pairs.values()]
# генерирование всех наборов для получения делителей исходного числа
multi = product(*powers)
# сцепка списка оснований с возможными вариантами степеней
wrk = (zip(bases,power) for power in multi)
# наборы чисел, которые нужно перемножить для получения делителя
rezzz = (starmap( pow, row) for row in wrk)
# возвращение списка всех делителей
return [reduce(mul,i) for i in rezzz]
например divisorss(1568)
возвращает [1, 7, 49, 2, 14, 98, 4, 28, 196, 8, 56, 392, 16, 112, 784, 32, 224, 1568]
Функция get_ls(n)
дает соответственно список разложения числа на произведение делителей
например такая:
def get_ls(n):
"""Разложить число на множители"""
#result = [1]
result = []
i = 2
while i*i <= n:
if n % i == 0:
n //= i
result.append(i)
else:
i += 1
if n > 1:
result.append(n)
return result
что можно улучшить?
Ну например, что лучше – reduce из functools или accumulate из itertools. Ну и вообще по алгоритму.
Понятно, что улучшения типа
return [reduce(mul,i) for i in (starmap(pow, row) for row in (zip(bases,power) for power in product(*powers)))]
не интересны.
Загрузить PDF
Загрузить PDF
Число называется делителем (или множителем) другого числа в том случае, если при делении на него получается целый результат без остатка.[1]
Для малого числа (например, 6) определить количество делителей довольно легко: достаточно выписать все возможные произведения двух целых чисел, которые дают заданное число. При работе с большими числами определить количество делителей становится сложнее. Тем не менее, если вы разложите целое число на простые множители, то легко сможете определить число делителей с помощью простой формулы.
-
1
Запишите заданное целое число вверху страницы. Вам понадобится достаточно места для того, чтобы расположить ниже числа дерево множителей. Для разложения числа на простые множители можно использовать и другие методы, которые вы найдете в статье Как разложить число на множители.
- Например, если вы хотите узнать, сколько делителей, или множителей имеет число 24, запишите вверху страницы.
-
2
Найдите два числа (помимо 1), при перемножении которых получается заданное число. Таким образом вы найдете два делителя, или множителя данного числа. Проведите от данного числа две ветки вниз и запишите на их концах полученные множители.
-
3
Поищите простые множители. Простым множителем называется такое число, которое делится без остатка лишь на само себя и на 1.[2]
Например, число 7 является простым множителем, так как оно делится без остатка лишь на 1 и 7. Для удобства обводите найденные простые множители кружком.- Например, 2 является простым числом, поэтому обведите кружком.
-
4
Продолжайте раскладывать составные (не простые) числа на множители. Проводите следующие ветки от составных чисел до тех пор, пока все множители не станут простыми. Не забывайте обводить простые числа кружками.
-
5
Представьте каждый простой множитель в степенной форме. Для этого подсчитайте, сколько раз встречается каждый простой множитель в нарисованном дереве множителей. Это число и будет степенью, в которую необходимо возвести данный простой множитель.[3]
-
6
Запишите разложение числа на простые множители. Первоначально заданное число равно произведению простых множителей в соответствующих степенях.
- В нашем примере .
Реклама
-
1
-
2
Подставьте в формулу величины степеней. Будьте внимательны и используйте степени при простых множителях, а не сами множители.
-
3
Сложите величины в скобках. Просто прибавьте 1 к каждой степени.
-
4
Перемножьте полученные величины. В результате вы определите количество делителей, или множителей данного числа .
Реклама
Советы
- Если число представляет собой квадрат целого числа (например, 36 является квадратом числа 6), то оно имеет нечетное количество делителей. Если же число не является квадратом другого целого числа, количество его делителей четно.
Реклама
Похожие статьи
Об этой статье
Эту страницу просматривали 120 854 раза.