Найти максимальные основные полномочия


23

Простая степень - это положительное целое число 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 можно найти здесь .

Ответы:


16

Желе , 7 4 байта

æḟÆR

Попробуйте онлайн!

Как это работает

æḟÆR  Main link. Argument: n

  ÆR  Prime range; yield all primes in [1, ..., n].
æḟ    Power floor; round n down to the nearest power of each prime in the range.

О, так очевидно, как только это увидишь!
Джонатан Аллан

15
Power floorКакого черта
JungHwan Мин

1
Этот пост официально убедил меня выучить желе.
Чендлер Уотсон

10

Mathematica, 44 43 40 байт

Сохранено 4 байта благодаря милям и Мартину Эндеру

n#^⌊#~Log~n⌋&/@Select[Range@n,PrimeQ]

(x=Prime@Range@PrimePi@#)^⌊x~Log~#⌋&

и являются 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@#... но это галстук
Грег Мартин

Это хорошая фигура. Был ли он создан с использованием встроенного или создан вручную?
миль

@miles Создано с помощьюTreeForm
ngenisis

Спасибо. Я не помню, чтобы когда-либо видел это, но очевидно это было вокруг навсегда.
миль

7

MATL, 13 байт

ZqG:!^tG>~*X>

Попробуйте онлайн!

объяснение

        % Implicitly grab the input as a number (N)
Zq      % Get an array of all primes below N
G:!     % Create an array from [1...N]
^       % Raise each prime to each power in this array which creates a 2D matrix
        % where the powers of each prime are down the columns
tG>~    % Create a logical matrix that is TRUE where the values are less than N
*       % Perform element-wise multiplication to force values > N to zero
X>      % Compute the maximum value of each column
        % Implicitly display the resulting array

7

Желе , 8 байт

ÆR*ÆE€»/

Попробуйте онлайн!

Как это работает

ÆR*ÆE€»/  Main link. Argument: n

ÆR        Prime range; yield all primes in [1, ..., n].
   ÆE€    Prime exponents each; yield the exponents of 2, 3, 5, ... of the prime
          factorization of each k in [1, ..., n].
          For example, 28 = 2² × 3⁰ × 5⁰ × 7¹ yields [2, 0, 0, 1].
  *       Exponentiation; raise the elements of the prime range to the powers
          of each of the exponents arrays.
      »/  Reduce the columns by maximum.

6

Желе , 12 9 байт

RÆEz0iṀ$€

Попробуйте онлайн! (метод слишком медленный для случая 10000).

Как?

Строит список p k в порядке p .

RÆEz0iṀ$€ - Main link: n                      e.g. 7
R         - range(n)                          [1 ,2  ,3    ,4  ,5      ,6    ,7]
 ÆE       - prime factor vector (vectorises)  [[],[1],[0,1],[2],[0,0,1],[1,1],[0,0,0,1]]
   z0     - transpose with filler 0           [[0,1,0,2,0,1,0],[0,0,1,0,0,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,1]]
       $€ - la$t two links as a monad, for €ach       ^             ^                   ^                   ^
     i    -     first index of                        4             3                   5                   7
      Ṁ   -     maximum                       [4,3,5,7]

5

Pyth, 13 байт

m^ds.lQdfP_TS

Попробуй это здесь!

        f   S -  filter(v, range(1, input))
         P_T  -   is_prime(T)
m             - map(v, ^)
    .lQd      -    log(input, d)
   s          -   int(^)
 ^d           -  d ** ^

Я давно не играл с Питом, поэтому любые советы по игре в гольф приветствуются.


5

Я не мог получить более короткое решение Mathematica, чем решение ngenisis , но я думал, что пару (надеюсь, интересных) альтернативных подходов.

Mathematica, 65 байт

#/#2&@@@({#,#}&/@Range@#~Select~PrimeQ//.{a_,b_}/;a<=#:>{b a,b})&

Сначала мы используем {#,#}&/@Range@#~Select~PrimeQдля построения списка всех простых чисел в соответствующем диапазоне, но с упорядоченными парами каждого простого числа, как { {2,2}, {3,3}, ...}. Затем мы несколько раз оперируем этим списком с помощью правила замены {a_,b_}/;a<=#:>{b a,b}, которое умножает первый элемент упорядоченной пары на второй, пока первый элемент не превысит входные данные. Затем мы применяем #/#2&@@@к выводу для каждой упорядоченной пары первый элемент, деленный на второй. (В конечном итоге они сортируются по основному простому числу: пример выходных данных {16, 9, 5, 7, 11, 13, 17, 19}.)

Mathematica, 44 байта

Values@Rest@<|MangoldtLambda@#->#&~Array~#|>&

Функция фон Мангольда Λ(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и затем возводит в степень для преобразования в максимальные простые степени:

E^(1##)&@@@Rest@Tally[MangoldtLambda~Array~#]&

1
Аккуратное использование ассоциаций. Они вышли с 2014 года, но я не думаю, что они видели много пользы в гольфе. Очень полезно знать, что он заменяет идентичные ключи значениями слева направо.
миль

4

CJam , 21 20 байт

Сохранено 1 байт благодаря Мартину Эндеру

ri_){mp},f{\1$mLi#}p

Попробуйте онлайн!

объяснение

ri                    e# Read an integer from input (let's call it n)
  _                   e# Duplicate it
   ){mp},             e# Push the array of all prime numbers up to and including n
         f{           e# Map the following block to each prime p:
           \          e#   Swap the top two elements of the stack
            1$        e#   Copy the second element down in the stack. Stack is now [p n p]
              mL      e#   Take the base-p logatithm of n
                i     e#   Cast to int (floor)
                 #    e#   Raise p to that power
                  }   e# (end of map block)
                   p  e# Print

4

Брахилог , 15 байт

⟧{ḋ=}ˢ⊇Xhᵐ≠∧X×ᵐ

Попробуйте онлайн!

Это выводит силы от самого большого до самого маленького.

Это очень неэффективно.

объяснение

⟧                   The Range [Input, Input - 1, ..., 1, 0]
 {  }ˢ              Select:
  ḋ=                  The elements of that range whose prime decompositions are lists of the
                      same element (e.g. [3,3,3]); output is those prime decompositions
      ⊇X            X is an ordered subset of that list of prime decompositions
       Xhᵐ≠         All first elements of the prime decompositions are different (that is,
                      X contains prime decompositions with different primes each times)
           ∧
            X×ᵐ     Output is the result of mapping multiplication to each element of X

Это позволит найти самые большие простые разложения для каждого простого первого из-за способа работы: слева направо и от самого большого до самого маленького подмножества.


4

Брахилог , 24 21 19 байт

3 + 2 байта сохранены благодаря Fatalize!

Я впервые использую Brachylog, и я знаю, что некоторые вещи можно было бы сделать более короткими способами, но я счастлив, что это даже работает: D

{≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠ

Попробуйте онлайн! (Возвращаемые значения упорядочены по их базовым простым числам)

Объяснение:

{................}ᶠ           #Find all possible results of what's inside.
 ≥.                           #Input is >= than the output.
  .~^ℕ₁ᵐ                      #Output can be calculated as A^B, where A and B are
                              #Natural numbers >=1.
        hṗ                    #The first of those numbers (A) is prime
          :.≜×>?              #That same element (A), multiplied by the output
                              #is greater than the input - This means 
                              #that B is the maximal exponent for A.
                ∧             #No more restrictions on the output.

1
Большой! Вы можете сохранить два байта, используя конкретные имена переменных ?и .для ввода и вывода, вместо Iи X, как таковой:{≥N~^.hṗ:N×>?∧0<~t}ᶠ^ᵐ
Fatalize

1
Вы также можете сохранить еще один байт, удалив 0<~tи указав, что каждый элемент вывода .находится в следующем ℕ₁ = [1, ..., +inf)виде:{≥N~^.ℕ₁ᵐhṗ:N×>?∧}ᶠ^ᵐ
Fatalize

@ Фатализировать спасибо! Я обновлю решение вашими предложениями :) Кстати, вы знаете, почему не работает такое решение, как {≥.~^ℕ₁ᵐhṗ:.×>?∧}ᶠ(использование N непосредственно в качестве вывода)? Сначала я попробовал что-то вроде этого, но потом мне пришлось прибегнуть к использованию X и применить ^ к нему
Лев

2
Я действительно удивлялся тому же самому; это возможно из-за неявного шага метки, который происходит в конце предиката, {...}ᶠчто вызывает странное поведение. Я намереваюсь это изменить, и я специально рассмотрю, почему эта программа не работает так же, как и выше.
Роковая

1
Это на самом деле работает, если вы делаете это так: таким {≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠобразом вы получаете правильную маркировку. (Тем временем было внесено изменение в спецификации, но оно фактически не меняет поведение этой конкретной программы, поэтому оно не делает ее неконкурентной). Это экономит 2 байта
Fatalize


3

Утилиты Bash + GNU, 74 байта

seq $1|factor|sed "s@.*: \(\w*\)\$@\1;l($1);l(\1);print \"/^p\"@"|bc -l|dc

Попробуйте онлайн!

Введенный номер передается в качестве аргумента. Вывод выводится на стандартный вывод. (Как обычно, stderr игнорируется.)

Пример вывода:

./maximalprimepowers 100 2>/dev/null
64
81
25
49
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

./maximalprimepowers 10000 2>/dev/null | wc -l
1229

Вот как это работает:

Назовите аргумент Н.

seqгенерирует все числа от 1 до N и factorучитывает их все.

Регулярное выражение в вызове sed идентифицирует те строки, где число - простое число P, и заменяет эти строки строками, имеющими форму `

P;l(N);l(P);print "/^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 .


3

Haskell , 73 67 66 байт

p n=[last[x^i|i<-[1..n],x^i<=n]|x<-[2..n],all((>0).mod x)[2..x-1]]

Попробуйте онлайн! Использование:

Prelude> p 50
[32,27,25,49,11,13,17,19,23,29,31,37,41,43,47]

Редактировать: 6 байт благодаря Zgarb!

Объяснение:

p n=[... x|x<-[2..n]                         ] -- list of all x in the range 2 to n
p n=[... x|x<-[2..n],        mod x<$>[2..x-1]] -- where the remainders of x mod the numbers 2 to x-1
p n=[... x|x<-[2..n],all(>0)$mod x<$>[2..x-1]] -- are all greater 0. This yields all primes in the range.

p n=[    [x^i|i<-[1..n]       ]|...] -- for each of those x generate the list of all x^i with i in the range 1 to n
p n=[last[x^i|i<-[1..n],x^i<=n]|...] -- where x^i is smaller or equal to n
p n=[last[x^i|i<-[1..n],x^i<=n]|...] -- and take the last (that is the largest) element

1
Я думаю, что левая сторона может быть last[x^i|i<-[1..n],x^i<=n].
Згарб

@ Zgarb Спасибо! Это всегда список понимания, не так ли ...
Лайкони

2

Желе , 9 байт

Ræl/ÆF*/€

На один байт длиннее, чем мой другой ответ , но для ввода 10 000 - пара секунд.

Попробуйте онлайн!

Как это работает

Ræl/ÆF*/€  Main link. Argument: n

R          Range; yield [1, ..., n].
 æl/       Reduce by least common multiple.
    ÆF     Factor the LCM into [prime, exponent] pairs.
      */€  Reduce each pair by exponentiation.

Есть также 7-байтовая версия в Jelly, которая быстро заканчивается.
миль

Я посмотрю твою
Деннис

Ничего себе, я не знал, что это был встроенный тоже. Это берет торт.
миль

2

JavaScript (ES6), 118 120 119 114 112 105 байт

(n,r)=>(r=k=>[...Array(k-1)].map((_,i)=>i+2),r(n).filter(q=>r(q).every(d=>q%d|!(d%(q/d)*(q/d)%d)&q*d>n)))

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

Заметки:

  • Натуральное число q является простой степенью <=> все делители q являются степенями одного и того же простого числа <=> для любого d, которое делит q, один из d и q / d является делителем другого.
  • Если q - степень p, то q максимально <=> q ​​* p> n <=> q ​​* d> n для каждого нетривиального делителя d из q.

2

Sage, 43 байта

lambda i:[x^int(ln(i,x))for x in primes(i)]

Сопоставляет каждое простое число в диапазоне primes(i)с его максимальной степенью простоты. lnэто просто псевдоним, logпоэтому он принимает альтернативные базы, хотя его имя предполагает использование только базы e.


Сначала я подумал, что это Python, увидел primesфункцию и очень обрадовался. Никогда больше не доверяю stackoverflow.
sagiksp

@sagiksp Я не понимаю, какое это имеет отношение к StackOverflow?
Busukxuan

2

Haskell, 110 90 байт

s[]=[];s(x:t)=x:s[y|y<-t,y`rem`x>0];f n=[last.fst.span(<=n).scanl1(*)$repeat x|x<-s[2..n]]

- обновлено по отзывам Лайкони


Это бросает Exception: Prelude.last: empty listза f 2и f 3.
Лайкони

1
Также f 4возвращается [2,3]вместо [4,3], я думаю, ваши takeWhile(<n)потребности должны быть takeWhile(<=n). Однако использование fst.spanвместо takeWhileодного байта короче.
Лайкони

2

Haskell , 70 байт

f n=[k|k<-[2..n],p:q<-[[d|d<-[2..k],mod k d<1]],k==p*p^length q,p*k>n]

Определяет функцию f. Попробуйте онлайн!

объяснение

Идея состоит в том, чтобы отфильтровать диапазон [2..n]для тех чисел, kкоторые удовлетворяют k == p^length(divisors k)и p*k > nгде pнаименьший простой делитель k.

f n=                -- Define f n as
 [k|                -- the list of numbers k, where
  k<-[2..n],        -- k is drawn from [2..n],
  p:q<-[            -- the list p:q is drawn from
   [d|              -- those lists of numbers d where
    d<-[2..k],      -- d is drawn from [2..k] and
    mod k d<1]      -- d divides k
   ],               -- (so p:q are the divisors of k except 1, and p is the smallest one),
  k==p*p^length q,  -- k equals p to the power of the divisor list's length
                    -- (so it's in particular a prime power), and
  p*k>n]            -- p*k, the next power of p, is not in the range [2..n].

1

PHP, 101 93 91 88 байт

просто немного настоящей математики ...

for($n=$argv[$i=1];$n>$j=$i++;$j?:$r[$p=$i**~~log($n,$i)]=$p)for(;$i%$j--;);print_r($r);

сломать

for($n=$argv[$i=1];     // loop $i from 2 to $n
    $n>$j=$i++;             // 0.: init $j to $i-1
    $j?:                    // 2. if $i is prime
        $r[$p=$i**~~log($n,$i)]=$p) // 3. add maximum power to results
    for(;$i%$j--;);         // 1. prime check (if $i is prime, $j will be 0)
print_r($r);            // print results

1

JavaScript ES7, 93 байта

Рекурсивно повторять iот 0 до включительно n. Если iпростое число, то поднимите его до наивысшей степени, которая делает это <= n( i ^ floor(log(n) / log(i)))

F=(n,i=n)=>i?[...((P=j=>i%--j?P(j):1==j)(i)?[i**((l=Math.log)(n)/l(i)|0)]:[]),...F(n,--i)]:[]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.