Знайдіть максимальні прем'єр-сили


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 у цьому діапазоні. Потужна потужність p k є максимальною в діапазоні, якщо це найвища потужність p у цьому діапазоні. Нас цікавить лише максимальна потужність у кожному діапазоні, тому всі нижчі потужності мають бути виключені.

Ваша мета - написати функцію або програму, яка приймає додатне ціле число n та виводить максимальні прості сили в діапазоні [2, 3, 4, ..., n].

Дякуємо @ Пітеру Тейлору за уточнення визначення максимальної прем'єр-сили та багато іншого.

Правила

  • Це тому зробіть свій код якомога коротшим.
  • У максимальні головні повноваження можуть бути виведені в будь-якому порядку , але не повинно бути ніяких дублікатів.

Тестові справи

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 Min

1
Ця посада офіційно переконала мене навчитися Желлі.
Чендлер Уотсон

10

Математика, 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 ** ^

Я не грав з Pyth деякий час, тому будь-які поради щодо гольфу цінуються.


5

Я не зміг отримати коротше рішення Mathematica, ніж рішення ngenisis , але я подумав, що запропоную пару альтернативних підходів.

Математика, 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}.)

Математика, 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

@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

Спробуйте в Інтернеті!

Вхідний номер передається як аргумент. Вихід друкується в stdout. (Як це прийнято, 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

Ось як це працює:

Назвіть аргумент N.

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 тоді, що ми ігноруємо; він не друкує нічого для stdout. За замовчуванням 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 Дякую! Це завжди розуміння списку, чи не так ...
Laikoni

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.

Також в Jelly є 7-байтна версія, яка швидко закінчується.
миль

Я побачу вашу 7 і піднятиму вас 4.: P
Денніс

Нічого собі, я не знав, що це теж вбудований. Це займає торт.
миль

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

Шавлія, 43 байти

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

Картографує кожну прем'єр-мінімум у діапазоні primes(i)до максимальної потужності. lnце лише псевдонім, logтому він приймає альтернативні бази, хоча його назва говорить про те, що він може використовувати лише базу e.


Думав, що спочатку це був пітон, побачив 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.