Простая степень - это положительное целое число n, которое можно записать в виде n = p k, где p - простое число, а k - положительное целое число. Например, некоторые основные силы [2, 3, 5, 4, 9, 25, 8, 27, 125]
.
Далее рассмотрим простые степени числа 2. Они есть [2, 4, 8, 16, ...]
и могут быть записаны в виде 2 k . Все они будут включены при рассмотрении простых степеней ниже 20. Однако 16 - это максимальная простая степень с базовым простым числом 2 в этом диапазоне. Наглядным мощность р к является максимальным в диапазоне , если это наивысшая степень р в этом диапазоне. Нас интересует только максимальная первичная степень в каждом диапазоне, поэтому все нижние простые степени должны быть исключены.
Ваша цель - написать функцию или программу, которая принимает положительное целое число n и выводит максимальные простые степени в диапазоне [2, 3, 4, ..., n]
.
Спасибо @ Peter Taylor за разъяснение определения максимальной простой мощности и многое другое.
правила
- Это код-гольф, поэтому сделайте ваш код как можно короче.
- В максимальные главные полномочия могут быть выведены в любом порядке , но не должно быть никаких дубликатов.
Контрольные примеры
n result
1 []
2 [2]
3 [2, 3]
4 [3, 4]
5 [3, 4, 5]
6 [3, 4, 5]
7 [3, 4, 5, 7]
20 [5, 7, 9, 11, 13, 16, 17, 19]
50 [11, 13, 17, 19, 23, 25, 27, 29, 31, 32, 37, 41, 43, 47, 49]
100 [11, 13, 17, 19, 23, 25, 29, 31, 37, 41, 43, 47, 49, 53, 59, 61, 64, 67, 71, 73, 79, 81, 83, 89, 97]
10000 <1229 results>
[101, 103, 107, 109, 113, 127, 131, 137, 139, 149, ..., 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]
Полный список максимальных простых степеней для 10000 можно найти здесь .
Power floor
Какого чертаMathematica,
444340 байтСохранено 4 байта благодаря милям и Мартину Эндеру
n#^⌊#~Log~n⌋&/@Select[Range@n,PrimeQ]
⌊
и⌋
являются3
байтовыми символамиU+230A
иU+230B
представляют\[LeftFloor]
и\[RightFloor]
, соответственно.Объяснение:
Чистая функция.
#
это сокращение отSlot[1]
которого представляет первый аргумент дляFunction
.PrimePi@#
подсчитывает число простых чисел, меньших или равных#
,Range@PrimePi@#
- это список первыхPrimePi[#]
натуральных чисел, аPrime@Range@PrimePi@#
также список простых чисел, меньших или равных#
(это на один байт меньшеSelect[Range@#,PrimeQ]
). Символx
являетсяSet
равным этому списку, затем подняли наPower
⌊x~Log~#⌋
, что списокFloor[Log[n,#]]
для каждогоn
дюймаx
. В Mathematica возведение списка вPower
другой список такой же длины приводит к списку степеней соответствующих им элементов.источник
Range@#~Select~PrimeQ
что будет короче, чемPrime@Range@PrimePi@#
... но это галстукTreeForm
MATL, 13 байт
Попробуйте онлайн!
объяснение
источник
Желе , 8 байт
Попробуйте онлайн!
Как это работает
источник
Желе ,
129 байтПопробуйте онлайн! (метод слишком медленный для случая 10000).
Как?
Строит список p k в порядке p .
источник
Pyth, 13 байт
Попробуй это здесь!
Я давно не играл с Питом, поэтому любые советы по игре в гольф приветствуются.
источник
Я не мог получить более короткое решение Mathematica, чем решение ngenisis , но я думал, что пару (надеюсь, интересных) альтернативных подходов.
Mathematica, 65 байт
Сначала мы используем
{#,#}&/@Range@#~Select~PrimeQ
для построения списка всех простых чисел в соответствующем диапазоне, но с упорядоченными парами каждого простого числа, как{ {2,2}, {3,3}, ...}
. Затем мы несколько раз оперируем этим списком с помощью правила замены{a_,b_}/;a<=#:>{b a,b}
, которое умножает первый элемент упорядоченной пары на второй, пока первый элемент не превысит входные данные. Затем мы применяем#/#2&@@@
к выводу для каждой упорядоченной пары первый элемент, деленный на второй. (В конечном итоге они сортируются по основному простому числу: пример выходных данных{16, 9, 5, 7, 11, 13, 17, 19}
.)Mathematica, 44 байта
Функция фон Мангольда
Λ(n)
- интересная функция теории чисел: она равна 0, если неn
является простой степенью p k , и в этом случае она равнаlog p
(неlog n
). (Это естественные журналы, но это не имеет значения.) Таким образом,MangoldtLambda@#->#&~Array~#
создается массив правил{ 0->1, Log[2]->2, Log[3]->3, Log[2]->4, Log[5]->5, 0->6, ... }
, длина которого является входным целым числом.Затем мы превращаем этот список правил в «ассоциацию», используя
<|...|>
. В результате сохраняется только последнее правило с любым заданным левым значением. Другими словами, он будет выбрасыватьLog[2]->2
иLog[2]->4
и,Log[2]->8
и только сохранятьLog[2]->16
(при условии, что для этого примера ввод будет между 16 и 31). Поэтому единственными оставшимися правыми частями являются максимальные простые степени - за исключением одного оставшегося правила0->n
, гдеn
наибольшая непростая степень равна целому входному числу. НоRest
отбрасывает это нежелательное правило иValues
извлекает правые части из правил в ассоциации. (В итоге они сортируются, как указано выше.)Несколько более длинная (46 байт) версия, которая подсчитывает количество появлений каждого
log p
и затем возводит в степень для преобразования в максимальные простые степени:источник
CJam ,
2120 байтСохранено 1 байт благодаря Мартину Эндеру
Попробуйте онлайн!
объяснение
источник
Брахилог , 15 байт
Попробуйте онлайн!
Это выводит силы от самого большого до самого маленького.
Это очень неэффективно.
объяснение
Это позволит найти самые большие простые разложения для каждого простого первого из-за способа
⊇
работы: слева направо и от самого большого до самого маленького подмножества.источник
Брахилог ,
242119 байт3 + 2 байта сохранены благодаря Fatalize!
Я впервые использую Brachylog, и я знаю, что некоторые вещи можно было бы сделать более короткими способами, но я счастлив, что это даже работает: D
Попробуйте онлайн! (Возвращаемые значения упорядочены по их базовым простым числам)
Объяснение:
источник
?
и.
для ввода и вывода, вместоI
иX
, как таковой:{≥N~^.hṗ:N×>?∧0<~t}ᶠ^ᵐ
0<~t
и указав, что каждый элемент вывода.
находится в следующемℕ₁ = [1, ..., +inf)
виде:{≥N~^.ℕ₁ᵐhṗ:N×>?∧}ᶠ^ᵐ
{≥.~^ℕ₁ᵐhṗ:.×>?∧}ᶠ
(использование N непосредственно в качестве вывода)? Сначала я попробовал что-то вроде этого, но потом мне пришлось прибегнуть к использованию X и применить ^ к нему{...}ᶠ
что вызывает странное поведение. Я намереваюсь это изменить, и я специально рассмотрю, почему эта программа не работает так же, как и выше.{≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠ
образом вы получаете правильную маркировку. (Тем временем было внесено изменение в спецификации, но оно фактически не меняет поведение этой конкретной программы, поэтому оно не делает ее неконкурентной). Это экономит 2 байта05AB1E ,
1512 байтПопробуйте онлайн!
объяснение
источник
Утилиты Bash + GNU, 74 байта
Попробуйте онлайн!
Введенный номер передается в качестве аргумента. Вывод выводится на стандартный вывод. (Как обычно, stderr игнорируется.)
Пример вывода:
Вот как это работает:
Назовите аргумент Н.
seq
генерирует все числа от 1 до N иfactor
учитывает их все.Регулярное выражение в вызове sed идентифицирует те строки, где число - простое число P, и заменяет эти строки строками, имеющими форму `
(где P и N заменены их действительными числовыми значениями, а все остальное копируется буквально, даже кавычки и точки с запятой, и строка
print
).Эти строки подаются как входные данные для
bc -l
; bc печатает значения трех указанных чисел, за которыми следует новая строка, а затем печатает символы/^p
. (В bc l (x) обозначает натуральный логарифм x.) JK KСтроки, которые печатает bc, затем подаются как входные данные для dc; dc печатает значение каждого P ^ (log (N) / log (P)), используя целочисленную арифметику (усечение); это самая большая сила P, которая <= N.
Одна вещь, которая затенена выше, - это то, что происходит со строками, которые производятся факторами, которые не соответствуют простым числам. Эти строки не соответствуют регулярному выражению в вызове sed, поэтому их замена не производится. В результате эти строки начинаются с числа, за которым следует двоеточие, что приводит к ошибке при подаче в качестве входных данных
bc
. Но bc просто печатает в stderr, что мы игнорируем; он ничего не печатает на стандартный вывод. По умолчанию stderr игнорируется в PPCG .источник
Haskell ,
73 6766 байтПопробуйте онлайн! Использование:
Редактировать: 6 байт благодаря Zgarb!
Объяснение:
источник
last[x^i|i<-[1..n],x^i<=n]
.Желе , 9 байт
На один байт длиннее, чем мой другой ответ , но для ввода 10 000 - пара секунд.
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6),
118120119114112105 байтПредложения приветствуются. Это довольно долго, но, кажется, стоит опубликовать, потому что оно выполняет все тесты делимости явно, а не использует встроенные модули, связанные с простыми числами.
Заметки:
источник
Sage, 43 байта
Сопоставляет каждое простое число в диапазоне
primes(i)
с его максимальной степенью простоты.ln
это просто псевдоним,log
поэтому он принимает альтернативные базы, хотя его имя предполагает использование только базыe
.источник
primes
функцию и очень обрадовался. Никогда больше не доверяю stackoverflow.Haskell,
11090 байт- обновлено по отзывам Лайкони
источник
Exception: Prelude.last: empty list
заf 2
иf 3
.f 4
возвращается[2,3]
вместо[4,3]
, я думаю, вашиtakeWhile(<n)
потребности должны бытьtakeWhile(<=n)
. Однако использованиеfst.span
вместоtakeWhile
одного байта короче.Haskell , 70 байт
Определяет функцию
f
. Попробуйте онлайн!объяснение
Идея состоит в том, чтобы отфильтровать диапазон
[2..n]
для тех чисел,k
которые удовлетворяютk == p^length(divisors k)
иp*k > n
гдеp
наименьший простой делительk
.источник
PHP,
101939188 байтпросто немного настоящей математики ...
сломать
источник
JavaScript ES7, 93 байта
Рекурсивно повторять
i
от 0 до включительноn
. Еслиi
простое число, то поднимите его до наивысшей степени, которая делает это<= n
(i ^ floor(log(n) / log(i))
)источник