Это Вы про зацикливания что ли?
А Вы проверьте на всех числах до миллиона. Если гипотеза подтвердится (в чем есть большие сомнения) будем думать дальше.
Метод, конечно, непрактичный из-за необходимости разложения на простые множители, тем более, что для больших чисел это нужно проделывать много раз. Для чисел порядка
разложение на множители является чрезвычайно трудоёмкой задачей, и поиск простого числа такого размера в настоящее время превратится в непосильную задачу. Для чисел порядка
задача вполне осуществимая, но требующая много времени.
Обычно простые числа ищут или в арифметических прогрессиях, или среди случайных чисел.
Например, в программе Mathematica 5.1 это можно сделать так. Сначала для удобства определим функцию, которая ищет простое число в заданном промежутке:
Код:
RP[a_Integer, b_Integer] := Module[{p, k}, k = 0; Label[One]; p = Random[Integer, {Min[a, b], Max[a, b]}]; k++; If[¬ PrimeQ[p], Goto[One]]; {k, p}]
А затем будем искать стозначные простые числа командой
Код:
Timing[RP[10^99, 10^100 - 1]]
Вот результаты трёх запусков:
Код:
{0.094 Second, {241, 3497272595820281454664276953652790343250146482044693148828840290142096286847097707189729132107364493}}
Код:
{0.094 Second, {416, 3931349754388581399463815401230611581102729548322447129439450981074145932969360659984645133307351533}}
Код:
{0.141 Second, {494, 9410281456082685220062615083796778093978280318062064663516867732838722427196773151704596649069031801}}
Здесь первое число — время работы функции RP, второе — количество проверенных чисел, третье — найденное простое число.
Здесь есть ещё одна проблема. Дело в том, что использованная функция PrimeQ является простой (и потому быстрой), и не даёт гарантии, что проверенное и "объявленное простым" число обязательно является простым, хотя вероятность ошибки очень мала. Но на такой случай есть функция ProvablePrimeQ, которая проверяет, действительно ли число простое, и, если её "попросить", печатает сертификат, удостоверяющий, что число действительно простое (или, наоборот, составное). Сертификат потом может быть проверен другой программой. В данном случае результаты проверки перечисленных выше чисел командой
Код:
Timing[ProvablePrimeQ[P]]
(куда вместо буквы "P" нужно подставить проверяемое число) следующие:
Код:
{11.981 Second, True}
Код:
{6.147 Second, True}
Код:
{2.511 Second, True}
Сертификат для стозначного простого числа — это довольно длинный текст, поэтому я его не привожу.
По поводу зацикливания предложенного метода. Я проверил числа до
, зацикливания нет. Функция, которая по заданному натуральному числу
предложенным методом находит простое число
, может быть, например, такой:
Код:
DP[x_Integer] := Module[{f, k, n}, n = x; k = 0;
While[¬ PrimeQ[n], f = FactorInteger[n]; n = n + f[[1, 1]] - 1; k++; Print["p = ", f[[1, 1]], ", n = ", n]]; k]
Пример:
Код:
DP[115]
p = 5, n = 119
p = 7, n = 125
p = 5, n = 129
p = 3, n = 131
4
Первая строчка — это команда, последняя — число шагов алгоритма. В промежуточных строчках
— наименьший простой делитель проверяемого числа,
— новое проверяемое число, полученное прибавлением
. Последнее значение
— найденное простое число.
Для использования в цикле операторы печати нужно убрать, поэтому функция будет выглядеть так:
Код:
DPP[x_Integer] := Module[{f, k, n}, n = x; k = 0; While[¬ PrimeQ[n], f = FactorInteger[n]; n = n + f[[1, 1]] - 1; k++]; k]
Цикл, проверяющий натуральные числа до
и отыскивающий число, требующее наибольшего числа шагов, выглядит так:
Код:
K = 0; For[m = 2, m ≤ 2000000, m++, KK = DPP[m]; If[KK > K, K = KK; M = m]]; Print["K = ", K, ", M = ", M]
Запустив его и подождав некоторое время, получим результат:
Код:
K = 59, M = 900660
Это означает, что среди чисел, не превышающих двух миллионов, наибольшее число шагов (а именно,
) требует число
. С помощью приведённой выше функции DP можно выяснить, что после
шагов получится простое число
. (Наименьшее простое число, которое следует за
, есть
.)
Побережный Александр, я всё это написал, чтобы Вы мне позавидовали, обзавелись системой компьютерной математики, способной выполнять нужные Вам вычисления, и сами проверяли свои идеи с её помощью.
Возможность зацикливания мне представляется маловероятной. Предположим, что цикл наименьших простых делителей есть
. Ясно, что число
в этом цикле встретиться не может, так как чётным может быть только самое первое число, а все следующие автоматически нечётные. Далее, если
, то сумма
должна делиться на все простые числа, не превосходящие
. Например, если
, то
должно делиться на
. Ясно также, что одно и то же простое число в периоде не может встретиться дважды подряд, поэтому должно быть не менее двух различных нечётных простых чисел. В частности, поэтому
и
делится на
. Мы также можем считать, что первый делитель в периоде равен
. Искать период можно следующими рассуждениями.
Пусть
. Тогда, как уже сказано,
должно делиться на
. Пусть мы начинаем с нечётного числа
, делящегося на
(и не делящегося на
). Тогда следующее число
должно делиться на
. Третье число
должно делиться на
, но это невозможно, так как
по предположению делится на
.
Пусть
. Тогда
делится на
. Начинаем с нечётного числа
, делящегося на
и не делящегося на меньшие нечётные простые числа
и
. Получаем
. Оно не может делиться на
, так как иначе и
делилось бы на
, тогда как у
наименьший простой делитель равен
. Поэтому
должно делиться на
. Следующее число равно
. Оно должно делиться либо на
, либо на
. На
оно делиться не может, так как
делится на
, а разность
на
не делится. Если
делится на
, то
. Оно не может делиться на
, так как
делится на
, а
не делится на
. Число
не может делиться также на
, так как
делится на
, а разность
не делится на
.
Далее нужно рассматривать
и так далее. Рассуждения выглядят вполне программируемыми. В процессе добавления нового элемента цикла
возникают коллизии двух типов:
1) при некотором
оказывается, что
, в то время как
не делится на
;
2) при некотором
оказывается, что
делится на
, в то время как
.
Если этих коллизий удалось избежать, и цепочка продолжилась до такого
, что
делится на
(произведение всех простых чисел, не превосходящих выбранного
), то цикл закончен, но необходимо проверить ещё одно условие.
3) Если простое число
не встречается в цикле
, то множество остатков
не должно совпадать с множеством
.
Проверку этого условия также можно осуществлять в процессе построения, постепенно исключая из проверяемого списка те числа, которые включаются в цикл. Это позволит сократить перебор.
Если это условие тоже выполняется (например, если чисел, упомянутых в последнем условии, вообще нет), то остаётся только выяснить, какие остатки при делении на простые числа, не превосходящие
, может давать начальное число
, и найти его. На нём алгоритм, предложенный в первом сообщении, будет зацикливаться.
Мне как-то не верится, что такой цикл удастся найти, но чем чёрт не шутит… Идей по доказательству отсутствия такого цикла у меня нет.