Наибольший простой фактор соседних чисел


13

Я думаю, что проще всего объяснить эту проблему последовательно. Начните с ввода номера N и:

  1. Найти его самый высокий главный фактор
  2. Проверка номера выше и ниже N и посмотреть , если наивысший главным фактором выше (т.е. самый высокий первичный фактор N-1 и / или N + 1 , выше , чем фактор N .
  3. Продолжайте проверять более высокие и / или более низкие числа, соседние с N, в направлениях, где наибольшие коэффициенты увеличиваются ( (N-2, N-3 ...) и / или (N + 2, N + 3 ...) и т. Д. на)
  4. Если в обоих направлениях нет простых факторов, которые выше, чем те, которые мы уже нашли, мы останавливаемся и выводим самый высокий простой фактор, с которым мы столкнулись.

Давайте посмотрим на пример:

245имеет главные факторы 5, 7, 7. Его соседи:

244 -> 2,  2,  61
245 -> 5,  7,  7
246 -> 2,  3,  41

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

243 -> 3,   3,  3,  3,  3
244 -> 2,   2,  2,  61
245 -> 5,   7,  7
246 -> 2,   3,  41
247 -> 13,  19

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

Другой пример:

Давайте посмотрим на 1024. Его главные факторы 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. Главные факторы его ближайших соседей:

1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41

Наивысший главный фактор увеличивается в обоих направлениях, от или 2до . Давайте посмотрим на соседей:3141

1022 -> 2, 7,  73
1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41
1026 -> 2,  3,  3, 19

Самый высокий главный фактор для 1022есть 73, и самый высокий главный фактор для 1026это 19. Поскольку 19ниже, чем 41мы не заинтересованы в этом. Он по-прежнему увеличивается для чисел меньше N, поэтому мы проверим следующее в этом направлении :

1021 -> 1021
1022 -> 2, 7,  73
1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41
1026 -> 2,  3,  3, 19

1021 это простое число, и самое высокое простое число, с которым мы столкнулись, поэтому оно должно быть возвращено.

Правила:

  • Вы получите только позитив Nбольше 1и меньше, чем 2^31-2.
  • Форматы ввода и вывода необязательны, но цифры должны быть в базе 10.
  • Вы должны продолжить поиск более высоких простых чисел, пока наибольшее значение увеличивается в этом направлении. Направления не зависят друг от друга.

Тестовые случаи:

Формат: N, highest_factor

2, 3
3, 3
6, 7
8, 11
24, 23 
1000, 997
736709, 5417 
8469038, 9431

Допустим, мы получаем наивысший простой множитель 2для N. Затем получаем 5для N-1 и 61для N + 1. Тогда мы получаем 19для N-2 и 67для N + 2. Должны ли мы продолжать пробовать меньшие числа, с 19>5или прекратить, с тех пор 5<61? Т.е. максимумы хранятся на стороне? (Я не уверен, что этот пример математически возможен.)
PurkkaKoodari

@ Pietu1998, теперь вопрос понятнее?
Стьюи Гриффин

N=2на самом деле, кажется, это крайний случай, так 1как не имеет простых факторов, поэтому нет максимального простого фактора, с которым мы можем сравнивать, чтобы решить, следует ли нам продолжать.
Джонатан Аллан

Ответы:


4

Mathematica, 82 74 байта

Спасибо Мартину Эндеру за сохранение 8 байт!

Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&

Безымянная функция принимает целочисленный ввод и возвращает целое число.

±n_:=#//.x_/;l[t=x+n]>l@x:>tопределяет унарную функцию, ±которая продолжает увеличивать целочисленный ввод глобальной функции nдо тех пор, пока увеличивается наибольший простой фактор. (Функция наибольшего простого множителя определяется с помощью l=FactorInteger[#][[-1,1]]&.), {±-1,±1}Поэтому применяет эту функцию дважды к целочисленному входному значению, с приращением -1и снова с приращением 1. Затем Max@@(...l...)/@...берет больший из двух найденных таким образом факторов наибольшего простого числа.

Предыдущее представление:

Max@@(l=FactorInteger[#][[-1,1]]&)/@(#//.x_/;l[t=x+#2]>l[x]:>t&@@@{{#,-1},{#,1}})&

Сохраняя несколько байтов, избегая @@@(и вы можете использовать l@xтам):Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&
Мартин Эндер

1

Perl, 137 байт

122 байта кода + 15 байтов для -pи -Mntheory=:all.

sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_

Чтобы запустить это:

perl -pMntheory=:all -e 'sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_' <<< 736709

Если вы не ntheoryустановили, вы можете установить его, набрав (echo y;echo) | perl -MCPAN -e 'install ntheory'в своем терминале.


0

Рубин, 99 байт

->n{f=->n{i=2;n%i<1?n/=i:i+=1while i<n;n};g=->s,z{s+=z while f[s+z]>b=f[s];b};[g[n,1],g[n,-1]].max}

Объяснение:

  • f () - высший простой множитель
  • g () - функция, ищущая соседей в одном направлении
  • применить g к (n, -1) и к (n, + 1) для поиска в обоих направлениях
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.