Как найти наибольшее количество делителей

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

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

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

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

Здравствуйте, дорогие читатели! Как посчитать, сколько делителей у какого-нибудь числа? Если это число маленькое, то никаких сложностей не возникает. Например, для числа 10, мы легко можем найти все делители и посчитать их количество простым перебором. А вот как узнать, на какое количество различных чисел делится, например, число 720? Можно, конечно, опять же перебрать все делители, но это будет довольно трудоемко. При чем, 720 – еще и довольно маленькое число.

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

Как легко найти количество натуральных делителей любого числа

На самом деле, наша сегодняшняя формула будет даже проще, чем те, которые изображены на картинке выше)

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

Чудо-формула

Ну что ж, пора переходить от разговоров к делу.

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

Как легко найти количество натуральных делителей любого числа

Если не совсем понятно, о чем идет речь, то потом посмотрите пример ниже. На самом деле, все очень просто.

Так вот, после того, как мы найдем такое представление числа n, количество его делителей можно будет посчитать по формуле:

Как легко найти количество натуральных делителей любого числа

Посмотрим, как все это считается на примере

Пример

Как легко найти количество натуральных делителей любого числа

Раскладываем это число на простые множители, чтобы получить нужное представление:

Как легко найти количество натуральных делителей любого числа

Теперь, запишем число 720 в каноническом виде:

Как легко найти количество натуральных делителей любого числа

Ну и все, остается только применить чудо-формулу:

Как легко найти количество натуральных делителей любого числа

Вот и все, получили, что у числа 720 имеется 30 различных натуральных делителей. Стоит сделать замечание:

По этой формуле мы считаем количество делителей вместе с единицей и самим числом.

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

Читайте также ТОП-3 статьи, выпущенные в этом месяце на моем канале:

  1. Quincy: робот, который обучит Ваших детей математике, английскому и рисованию
  2. Почему вторая степень это квадрат, а третья – куб
  3. Необычное тригонометрическое уравнение


Загрузить 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 713 раз.

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

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

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

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

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

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

Общие соображения

Заметим, что:

  1. Величины
    С = lg (X * p1 * p2 * … * pk) и П = cnt(X) * lg p1 * lg p2 * … * lg pk
    — это сумма и произведение величин (a1+1) lg p1, (a2+1) lg p2,…, (ak+1) lg pk.
    Не будь задача дискретной, в соответствии с теоремами о средних оптимум достигался бы при равенстве этих величин, (а с учётом потенцирования – и величин вида piai+1).

  2. Наш случай – дискретное приближение к оптимуму, так что эти величины должны хотя бы стремиться к равенству. А поскольку основания растут, то показатели не должны возрастать (a1>=a2>=…>=ak).

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

  4. Так как показатели степеней канонического разложения не возрастают, то требуемое оптимальное число X можно представить в виде произведения X=Pk…P2P1, где Pk=p1p2…pk— это произведения последовательных простых чисел (праймориалы), которые могут повторяться и которые можно протабулировать.
    И поскольку праймориал при возрастании k растёт быстрее факториала, то их произведение для числа X подбирается очень быстро.

_Известно, что

Every highly composite number is a product of primorials_

Алгоритм и анализ результатов

Алгоритм по п.4 рекурсивный, параметром является частное от деления числа на уже готовую часть цепочки.
Для поиска текущего оптимального праймориала (звена цепочки) ведётся перебор по убыванию в границах от “жадного” звена для текущего частного до “жадного” звена для квадратного корня из этого частного.
Перебор обрывается, когда целевая функция (количество множителей) начинает падать.
Такая схема обеспечивает решение задачи.

Дополнительный контроль невозрастания звеньев в цепочке избавляет от повторения пройденного.

Для случая N=1018 оптимальное решение нашлось за 118 шагов и совпало с предыдущим ответом:
X = P12P4P2P2P1P1P1P1 = 28 * 34 * 52 * 72 * 11 * 13 37 = 897612484786617600,
cnt(X) = (8+1) (4+1) (2+1)2 (1+1)8 = 103680.

При этом порядок величин 29=512, 35=243, 53=125, 73=343, 112=121, …, 372=1369 примерно одинаков, что подтверждает теорию оптимума.

Для случая N=1036 (cnt(X)=127401984 множителей) понадобилось всего 168 шагов. Т.е. сложность алгоритма возрастает не быстрее логарифма. Хотя разрядность данных меняется.

Исходный код на PHP использует библиотеку BCMath. границу возможностей не тестировал (скорее всего, первым подведёт int для cnt(X)):

function prods(&$prod){
    $p = array( "2", "3", "5", "7", "11",       "13", "17", "19", "23", "29", 
            "31", "37", "41", "43", "47",   "53", "59", "61", "67", "71",
            "73", "79", "83", "89", "97",);
    $str="1"; 
    foreach($p as $val){
        $str = bcmul($str,$val);
        array_push($prod,$str);
    } 
    return 1;
}

function greedy_prod($n){
    global $p_prod;
    foreach($p_prod as $key=>$val){
        if(bccomp($val,$n)>0) break;
        $i_m=$key+1;
    }
    if (!isset($i_m)) $i_m=0;
    return $i_m;    
}

function show_chain($chain){
    $s = "[";
    foreach($chain as $len) $s = $s . sprintf("%d.",$len);  
    $s = $s."]";
    return $s; 
}

function multi_prod($chain){
    global $p_prod;     
    $m_prod = "1";
    foreach($chain as $val) $m_prod= bcmul($m_prod, $p_prod[$val-1]);
    return $m_prod;
}

function multi_count($chain){
    $cnt = array();
    for ($i=0; $i<$chain[0]; $i++)  array_push($cnt, 0);
    foreach($chain as $key=>$val){
        for ($i=0; $i<$val; $i++)   $cnt[$i]++;
    }
    $count=1;
    foreach($cnt as $val) $count *= $val+1;
    return $count;
}

function maxi_count($n, &$main_chain, &$latch_chain){
    global  $maxi_counter, $p_prod;
    $maxi_counter++;

    $m_prod = multi_prod($main_chain);
    $nn = bcdiv($n,$m_prod);

    $long_chain  = greedy_prod($nn);
    if(count($main_chain)>0){
        $last = array_pop($main_chain); array_push($main_chain,$last);
        $long_chain = min($long_chain, $last);
    }
    $short_chain = greedy_prod(bcsqrt($nn));
    $short_chain = max($short_chain,1);

    if ($long_chain==0) {
        $max_count = multi_count($main_chain);
        if($max_count> multi_count($latch_chain)) $latch_chain=$main_chain;
    }
    else {
        $max_count = 0;
        for ($cur_chain=$long_chain; $cur_chain>$short_chain-1; $cur_chain--){
            array_push($main_chain,$cur_chain);     
            $counter = maxi_count($n, $main_chain, $latch_chain);
            array_pop($main_chain);
            if($counter>$max_count) $max_count = $counter;
            else break;
        }
    }       
    $s1 = show_chain($main_chain);  $s2=show_chain($latch_chain);
    print("<tr><td align="right">&emsp;$m_prod</td><td align="right">$max_count</td><td>$s2</td><td>$s1</td></tr>");
    return $max_count;
}   

//$N="1000000000000000000";     
$N="1000000000000000000000000000000000000";
$p_prod = array();
if (prods($p_prod)>0){
    print("<br>p_prod:<br>");   
    foreach($p_prod as $key=>$val) printf("&emsp;%d=>%s", $key, $val); 
}

$maxi_counter = 0; $chain=array(); $optimal_chain=array();
print("<br><br>maxi_count:<br>N=$N");
print('<table border="2">');
print('<tr><th>current number</th><th>multi_prod</th><th>optimal chain</th><th>current chain</th></tr>');
$max_count=maxi_count($N, $chain, $optimal_chain);
print('</table>');
printf("<br>Количество последовательностей = %d<br>Цепочка произведений = %s,<br>Kоличество множителей = %d<br>Минимальное число = %s", $maxi_counter, show_chain($optimal_chain), $max_count, multi_prod($optimal_chain)); 

Результаты для N = 1036:

<pre>
p_prod:
 0=>2 1=>6 2=>30 3=>210 4=>2310 5=>30030 6=>510510 7=>9699690 8=>223092870
 9=>6469693230 10=>200560490130 11=>7420738134810 12=>304250263527210
 13=>13082761331670030 14=>614889782588491410 15=>32589158477190044730
 16=>1922760350154212639070 17=>117288381359406970983270
 18=>7858321551080267055879090 19=>557940830126698960967415390
 20=>40729680599249024150621323470 21=>3217644767340672907899084554130
 22=>267064515689275851355624017992790 23=>23768741896345550770650537601358310
 24=>2305567963945518424753102147331756070

maxi_count:
N=1000000000000000000000000000000000000
    current number	                 multi_prod	optimal chain	current chain
 713062256890366523119516128040749300	56623104	[24.3.]	[24.3.]
 855674708268439827743419353648899160	67108864	[24.2.2.]	[24.2.2.]
 570449805512293218495612902432599440	62914560	[24.2.2.]	[24.2.1.1.]
 285224902756146609247806451216299720	62914560	[24.2.2.]	[24.2.1.]
 142612451378073304623903225608149860	67108864	[24.2.2.]	[24.2.]
 23768741896345550770650537601358310	67108864	[24.2.2.]	[24.]
 616919031242227216631491481563344900	63700992	[24.2.2.]	[23.5.]
 673002579536975145416172525341830800	94371840	[23.4.2.1.]	[23.4.2.1.]
 336501289768487572708086262670915400	94371840	[23.4.2.1.]	[23.4.2.]
 897336772715966860554896700455774400	99090432	[23.4.1.1.1.1.]	[23.4.1.1.1.1.]
 448668386357983430277448350227887200	99090432	[23.4.1.1.1.1.]	[23.4.1.1.1.]
 224334193178991715138724175113943600	99090432	[23.4.1.1.1.1.]	[23.4.1.1.]
 112167096589495857569362087556971800	99090432	[23.4.1.1.1.1.]	[23.4.1.]
 56083548294747928784681043778485900	99090432	[23.4.1.1.1.1.]	[23.4.]
 961432256481393064880246464774044000	100663296	[23.3.3.1.1.]	[23.3.3.1.1.]
 480716128240696532440123232387022000	100663296	[23.3.3.1.1.]	[23.3.3.1.]
 240358064120348266220061616193511000	100663296	[23.3.3.1.1.]	[23.3.3.]
 576859353888835838928147878864426400	94371840	[23.3.3.1.1.]	[23.3.2.2.1.]
 288429676944417919464073939432213200	94371840	[23.3.3.1.1.]	[23.3.2.2.]
 769145805185114451904197171819235200	100663296	[23.3.3.1.1.]	[23.3.2.1.1.1.1.]
 384572902592557225952098585909617600	100663296	[23.3.3.1.1.]	[23.3.2.1.1.1.]
 192286451296278612976049292954808800	100663296	[23.3.3.1.1.]	[23.3.2.1.1.]
 96143225648139306488024646477404400	100663296	[23.3.3.1.1.]	[23.3.2.1.]
 48071612824069653244012323238702200	100663296	[23.3.3.1.1.]	[23.3.2.]
 8011935470678275540668720539783700	100663296	[23.3.3.1.1.]	[23.3.]
 267064515689275851355624017992790	100663296	[23.3.3.1.1.]	[23.]
 579755234179442444545257054963143400	84934656	[23.3.3.1.1.]	[22.6.2.]
 773006978905923259393676073284191200	95551488	[23.3.3.1.1.]	[22.6.1.1.1.]
 386503489452961629696838036642095600	95551488	[23.3.3.1.1.]	[22.6.1.1.]
 193251744726480814848419018321047800	95551488	[23.3.3.1.1.]	[22.6.1.]
 96625872363240407424209509160523900	95551488	[23.3.3.1.1.]	[22.6.]
 891931129506834530069626238404836000	113246208	[22.5.3.1.1.]	[22.5.3.1.1.]
 445965564753417265034813119202418000	113246208	[22.5.3.1.1.]	[22.5.3.1.]
 222982782376708632517406559601209000	113246208	[22.5.3.1.1.]	[22.5.3.]
 535158677704100718041775743042901600	106168320	[22.5.3.1.1.]	[22.5.2.2.1.]
 267579338852050359020887871521450800	106168320	[22.5.3.1.1.]	[22.5.2.2.]
 713544903605467624055700990723868800	113246208	[22.5.3.1.1.]	[22.5.2.1.1.1.1.]
 356772451802733812027850495361934400	113246208	[22.5.3.1.1.]	[22.5.2.1.1.1.]
 178386225901366906013925247680967200	113246208	[22.5.3.1.1.]	[22.5.2.1.1.]
 89193112950683453006962623840483600	113246208	[22.5.3.1.1.]	[22.5.2.1.]
 44596556475341726503481311920241800	113246208	[22.5.3.1.1.]	[22.5.2.]
 7432759412556954417246885320040300	113246208	[22.5.3.1.1.]	[22.5.]
 851388805438342051430097773022798000	104857600	[22.5.3.1.1.]	[22.4.4.2.]
 567592536958894700953398515348532000	100663296	[22.5.3.1.1.]	[22.4.4.1.1.]
 283796268479447350476699257674266000	100663296	[22.5.3.1.1.]	[22.4.4.1.]
 141898134239723675238349628837133000	104857600	[22.5.3.1.1.]	[22.4.4.]
 608134861027387179592926980730570000	98304000	[22.5.3.1.1.]	[22.4.3.3.]
 729761833232864615511512376876684000	113246208	[22.5.3.1.1.]	[22.4.3.2.2.]
 973015777643819487348683169168912000	125829120	[22.4.3.2.1.1.1.]	[22.4.3.2.1.1.1.]
 486507888821909743674341584584456000	125829120	[22.4.3.2.1.1.1.]	[22.4.3.2.1.1.]
 243253944410954871837170792292228000	125829120	[22.4.3.2.1.1.1.]	[22.4.3.2.1.]
 121626972205477435918585396146114000	125829120	[22.4.3.2.1.1.1.]	[22.4.3.2.]
 20271162034246239319764232691019000	125829120	[22.4.3.2.1.1.1.]	[22.4.3.]
 675705401141541310658807756367300	125829120	[22.4.3.2.1.1.1.]	[22.4.]
 3217644767340672907899084554130	125829120	[22.4.3.2.1.1.1.]	[22.]
 790130551223459534127080290097448600	71663616	[22.4.3.2.1.1.1.]	[21.8.1.]
 395065275611729767063540145048724300	71663616	[22.4.3.2.1.1.1.]	[21.8.]
 623787277281678579574010755340091000	84934656	[22.4.3.2.1.1.1.]	[21.7.3.]
 748544732738014295488812906408109200	99532800	[22.4.3.2.1.1.1.]	[21.7.2.2.]
 998059643650685727318417208544145600	111476736	[22.4.3.2.1.1.1.]	[21.7.2.1.1.1.]
 499029821825342863659208604272072800	111476736	[22.4.3.2.1.1.1.]	[21.7.2.1.1.]
 249514910912671431829604302136036400	111476736	[22.4.3.2.1.1.1.]	[21.7.2.1.]
 124757455456335715914802151068018200	111476736	[22.4.3.2.1.1.1.]	[21.7.2.]
 20792909242722619319133691844669700	111476736	[22.4.3.2.1.1.1.]	[21.7.]
 513707169526088242002126504397722000	94371840	[22.4.3.2.1.1.1.]	[21.6.4.1.]
 256853584763044121001063252198861000	94371840	[22.4.3.2.1.1.1.]	[21.6.4.]
 880640862044722700575074007538952000	123863040	[22.4.3.2.1.1.1.]	[21.6.3.2.1.1.]
 440320431022361350287537003769476000	123863040	[22.4.3.2.1.1.1.]	[21.6.3.2.1.]
 220160215511180675143768501884738000	123863040	[22.4.3.2.1.1.1.]	[21.6.3.2.]
 587093908029815133716716005025968000	113246208	[22.4.3.2.1.1.1.]	[21.6.3.1.1.1.1.]
 293546954014907566858358002512984000	113246208	[22.4.3.2.1.1.1.]	[21.6.3.1.1.1.]
 146773477007453783429179001256492000	113246208	[22.4.3.2.1.1.1.]	[21.6.3.1.1.]
 73386738503726891714589500628246000	113246208	[22.4.3.2.1.1.1.]	[21.6.3.1.]
 36693369251863445857294750314123000	123863040	[22.4.3.2.1.1.1.]	[21.6.3.]
 528384517226833620345044404523371200	111476736	[22.4.3.2.1.1.1.]	[21.6.2.2.2.1.]
 264192258613416810172522202261685600	111476736	[22.4.3.2.1.1.1.]	[21.6.2.2.2.]
 704512689635778160460059206031161600	119439360	[22.4.3.2.1.1.1.]	[21.6.2.2.1.1.1.1.]
 352256344817889080230029603015580800	119439360	[22.4.3.2.1.1.1.]	[21.6.2.2.1.1.1.]
 176128172408944540115014801507790400	119439360	[22.4.3.2.1.1.1.]	[21.6.2.2.1.1.]
 88064086204472270057507400753895200	119439360	[22.4.3.2.1.1.1.]	[21.6.2.2.1.]
 44032043102236135028753700376947600	119439360	[22.4.3.2.1.1.1.]	[21.6.2.2.]
 7338673850372689171458950062824600	119439360	[22.4.3.2.1.1.1.]	[21.6.2.]
 1223112308395448195243158343804100	123863040	[22.4.3.2.1.1.1.]	[21.6.]
 869350594582610871080521776673068000	100663296	[22.4.3.2.1.1.1.]	[21.5.5.1.1.]
 434675297291305435540260888336534000	100663296	[22.4.3.2.1.1.1.]	[21.5.5.1.]
 217337648645652717770130444168267000	100663296	[22.4.3.2.1.1.1.]	[21.5.5.]
 592739041760871048463992120458910000	98304000	[22.4.3.2.1.1.1.]	[21.5.4.3.]
 711286850113045258156790544550692000	113246208	[22.4.3.2.1.1.1.]	[21.5.4.2.2.]
 948382466817393677542387392734256000	125829120	[22.4.3.2.1.1.1.]	[21.5.4.2.1.1.1.]
 474191233408696838771193696367128000	125829120	[22.4.3.2.1.1.1.]	[21.5.4.2.1.1.]
 237095616704348419385596848183564000	125829120	[22.4.3.2.1.1.1.]	[21.5.4.2.1.]
 118547808352174209692798424091782000	125829120	[22.4.3.2.1.1.1.]	[21.5.4.2.]
 19757968058695701615466404015297000	125829120	[22.4.3.2.1.1.1.]	[21.5.4.]
 508062035795032327254850388964780000	106168320	[22.4.3.2.1.1.1.]	[21.5.3.3.2.]
 677416047726709769673133851953040000	117964800	[22.4.3.2.1.1.1.]	[21.5.3.3.1.1.1.]
 338708023863354884836566925976520000	117964800	[22.4.3.2.1.1.1.]	[21.5.3.3.1.1.]
 169354011931677442418283462988260000	117964800	[22.4.3.2.1.1.1.]	[21.5.3.3.1.]
 84677005965838721209141731494130000	117964800	[22.4.3.2.1.1.1.]	[21.5.3.3.]
 609674442954038792705820466757736000	115605504	[22.4.3.2.1.1.1.]	[21.5.3.2.2.2.]
 812899257272051723607760622343648000	127401984	[21.5.3.2.2.1.1.1.]	[21.5.3.2.2.1.1.1.]
 406449628636025861803880311171824000	127401984	[21.5.3.2.2.1.1.1.]	[21.5.3.2.2.1.1.]
 203224814318012930901940155585912000	127401984	[21.5.3.2.2.1.1.1.]	[21.5.3.2.2.1.]
 101612407159006465450970077792956000	127401984	[21.5.3.2.2.1.1.1.]	[21.5.3.2.2.]
 16935401193167744241828346298826000	127401984	[21.5.3.2.2.1.1.1.]	[21.5.3.2.]
 2822566865527957373638057716471000	127401984	[21.5.3.2.2.1.1.1.]	[21.5.3.]
 94085562184265245787935257215700	127401984	[21.5.3.2.2.1.1.1.]	[21.5.]
 40729680599249024150621323470	    127401984	[21.5.3.2.2.1.1.1.]	[21.]
 746835726498886408969432055023615800	71663616	[21.5.3.2.2.1.1.1.]	[20.9.2.]
 995780968665181878625909406698154400	80621568	[21.5.3.2.2.1.1.1.]	[20.9.1.1.1.]
 497890484332590939312954703349077200	80621568	[21.5.3.2.2.1.1.1.]	[20.9.1.1.]
 248945242166295469656477351674538600	80621568	[21.5.3.2.2.1.1.1.]	[20.9.1.]
 124472621083147734828238675837269300	80621568	[21.5.3.2.2.1.1.1.]	[20.9.]
 974133556302895316047085289161238000	99532800	[21.5.3.2.2.1.1.1.]	[20.8.3.2.]
 649422370868596877364723526107492000	95551488	[21.5.3.2.2.1.1.1.]	[20.8.3.1.1.]
 324711185434298438682361763053746000	95551488	[21.5.3.2.2.1.1.1.]	[20.8.3.1.]
 162355592717149219341180881526873000	99532800	[21.5.3.2.2.1.1.1.]	[20.8.3.]
 779306845042316252837668231328990400	104509440	[21.5.3.2.2.1.1.1.]	[20.8.2.2.1.1.]
 389653422521158126418834115664495200	104509440	[21.5.3.2.2.1.1.1.]	[20.8.2.2.1.]
 194826711260579063209417057832247600	104509440	[21.5.3.2.2.1.1.1.]	[20.8.2.2.]
 519537896694877501891778820885993600	95551488	[21.5.3.2.2.1.1.1.]	[20.8.2.1.1.1.1.]
 259768948347438750945889410442996800	95551488	[21.5.3.2.2.1.1.1.]	[20.8.2.1.1.1.]
 129884474173719375472944705221498400	95551488	[21.5.3.2.2.1.1.1.]	[20.8.2.1.1.]
 64942237086859687736472352610749200	95551488	[21.5.3.2.2.1.1.1.]	[20.8.2.1.]
 32471118543429843868236176305374600	104509440	[21.5.3.2.2.1.1.1.]	[20.8.2.]
 5411853090571640644706029384229100	104509440	[21.5.3.2.2.1.1.1.]	[20.8.]
 657967402064236309961627783029959000	75497472	[21.5.3.2.2.1.1.1.]	[20.7.5.]
 717782620433712338139957581487228000	106168320	[21.5.3.2.2.1.1.1.]	[20.7.4.2.1.]
 358891310216856169069978790743614000	106168320	[21.5.3.2.2.1.1.1.]	[20.7.4.2.]
 957043493911616450853276775316304000	113246208	[21.5.3.2.2.1.1.1.]	[20.7.4.1.1.1.1.]
 478521746955808225426638387658152000	113246208	[21.5.3.2.2.1.1.1.]	[20.7.4.1.1.1.]
 239260873477904112713319193829076000	113246208	[21.5.3.2.2.1.1.1.]	[20.7.4.1.1.]
 119630436738952056356659596914538000	113246208	[21.5.3.2.2.1.1.1.]	[20.7.4.1.]
 59815218369476028178329798457269000	113246208	[21.5.3.2.2.1.1.1.]	[20.7.4.]
 512701871738365955814255415348020000	99532800	[21.5.3.2.2.1.1.1.]	[20.7.3.3.1.]
 256350935869182977907127707674010000	99532800	[21.5.3.2.2.1.1.1.]	[20.7.3.3.]
 615242246086039146977106498417624000	111476736	[21.5.3.2.2.1.1.1.]	[20.7.3.2.2.1.]
 307621123043019573488553249208812000	111476736	[21.5.3.2.2.1.1.1.]	[20.7.3.2.2.]
 820322994781385529302808664556832000	119439360	[21.5.3.2.2.1.1.1.]	[20.7.3.2.1.1.1.1.]
 410161497390692764651404332278416000	119439360	[21.5.3.2.2.1.1.1.]	[20.7.3.2.1.1.1.]
 205080748695346382325702166139208000	119439360	[21.5.3.2.2.1.1.1.]	[20.7.3.2.1.1.]
 102540374347673191162851083069604000	119439360	[21.5.3.2.2.1.1.1.]	[20.7.3.2.1.]
 51270187173836595581425541534802000	119439360	[21.5.3.2.2.1.1.1.]	[20.7.3.2.]
 8545031195639432596904256922467000	119439360	[21.5.3.2.2.1.1.1.]	[20.7.3.]
 284834373187981086563475230748900	119439360	[21.5.3.2.2.1.1.1.]	[20.7.]
 503151542755004237029480069375851000	67108864	[21.5.3.2.2.1.1.1.]	[20.6.6.]
 928895155855392437592886281924648000	110100480	[21.5.3.2.2.1.1.1.]	[20.6.5.2.1.1.]
 464447577927696218796443140962324000	110100480	[21.5.3.2.2.1.1.1.]	[20.6.5.2.1.]
 232223788963848109398221570481162000	110100480	[21.5.3.2.2.1.1.1.]	[20.6.5.2.]
 619263437236928291728590854616432000	100663296	[21.5.3.2.2.1.1.1.]	[20.6.5.1.1.1.1.]
 309631718618464145864295427308216000	100663296	[21.5.3.2.2.1.1.1.]	[20.6.5.1.1.1.]
 154815859309232072932147713654108000	100663296	[21.5.3.2.2.1.1.1.]	[20.6.5.1.1.]
 77407929654616036466073856827054000	100663296	[21.5.3.2.2.1.1.1.]	[20.6.5.1.]
 38703964827308018233036928413527000	110100480	[21.5.3.2.2.1.1.1.]	[20.6.5.]
 738893873975880348085250451530970000	92160000	[21.5.3.2.2.1.1.1.]	[20.6.4.4.]
 633337606265040298358786101312260000	106168320	[21.5.3.2.2.1.1.1.]	[20.6.4.3.2.]
 844450141686720397811714801749680000	117964800	[21.5.3.2.2.1.1.1.]	[20.6.4.3.1.1.1.]
 422225070843360198905857400874840000	117964800	[21.5.3.2.2.1.1.1.]	[20.6.4.3.1.1.]
 211112535421680099452928700437420000	117964800	[21.5.3.2.2.1.1.1.]	[20.6.4.3.1.]
 105556267710840049726464350218710000	117964800	[21.5.3.2.2.1.1.1.]	[20.6.4.3.]
 760005127518048358030543321574712000	115605504	[21.5.3.2.2.1.1.1.]	[20.6.4.2.2.2.]
 506670085012032238687028881049808000	113246208	[21.5.3.2.2.1.1.1.]	[20.6.4.2.2.1.1.]
 253335042506016119343514440524904000	113246208	[21.5.3.2.2.1.1.1.]	[20.6.4.2.2.1.]
 126667521253008059671757220262452000	115605504	[21.5.3.2.2.1.1.1.]	[20.6.4.2.2.]
 21111253542168009945292870043742000	115605504	[21.5.3.2.2.1.1.1.]	[20.6.4.2.]
 3518542257028001657548811673957000	117964800	[21.5.3.2.2.1.1.1.]	[20.6.4.]
 16754963128704769797851484161700	117964800	[21.5.3.2.2.1.1.1.]	[20.6.]
 557940830126698960967415390	119439360	[21.5.3.2.2.1.1.1.]	[20.]
 1	127401984	[21.5.3.2.2.1.1.1.]	[]

Количество последовательностей = 168
Цепочка произведений = [21.5.3.2.2.1.1.1.],
Kоличество множителей = 127401984
Минимальное число = 812899257272051723607760622343648000 

</pre>

Расширенная постановка задачи

Итак, мы нашли оптимальное решение задачи, которому соответствует минимальное среди n<N. В приведённом примере отношение N/n=1.23. Но если бы потребовалось найти все возможные числа до N с полученным количеством делителей, то возникла бы комбинаторная задача на тему возможных обменов простых множителей.

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