Znajdź maksymalne moce podstawowe

23

Moc pierwsza jest dodatnią liczbą całkowitą n, którą można zapisać w postaci n = p k, gdzie p jest liczbą pierwszą, a k jest liczbą całkowitą dodatnią. Na przykład niektóre główne moce są [2, 3, 5, 4, 9, 25, 8, 27, 125].

Następnie rozważmy podstawowe potęgi 2. Są [2, 4, 8, 16, ...]i mogą być zapisane w formie 2 k . Wszystkie zostaną uwzględnione przy rozważaniu mocy pierwszych poniżej 20. Jednak 16 to maksymalna moc pierwotna z podstawową liczbą pierwszą 2 w tym zakresie. Moc pierwotna p k jest maksymalna w zakresie, jeśli jest to najwyższa moc p w tym zakresie. Interesuje nas tylko maksymalna moc pierwotna w każdym zakresie, więc należy wykluczyć wszystkie niższe moce podstawowe.

Twoim celem jest napisanie funkcji lub programu, który przyjmuje dodatnią liczbę całkowitą n i wyprowadza maksymalne liczby pierwsze w zakresie [2, 3, 4, ..., n].

Podziękowania dla @ Peter Taylor za wyjaśnienie definicji maksymalnej mocy pierwotnej i nie tylko.

Zasady

  • To jest więc ustaw swój kod tak krótko, jak to możliwe.
  • Te maksymalne prime uprawnienia mogą być wyprowadzane w dowolnej kolejności, ale nie może być żadnych duplikatów.

Przypadki testowe

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]

Pełną listę maksymalnych mocy pierwszych dla 10000 można znaleźć tutaj .

mile
źródło

Odpowiedzi:

16

Galaretka , 7 4 bajtów

æḟÆR

Wypróbuj online!

Jak to działa

æḟÆ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.
Dennis
źródło
Och, to takie oczywiste, kiedy się to zobaczy!
Jonathan Allan
15
Power floorCo do cholery
JungHwan Min
1
Ten post oficjalnie przekonał mnie do nauki galaretki.
Chandler Watson
10

Mathematica, 44 43 40 bajtów

Zaoszczędzone 4 bajty dzięki mile i Martinowi Enderowi

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

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

i 3znakami bajtowymi U+230Ai odpowiednio U+230Breprezentującymi \[LeftFloor]i \[RightFloor].

Wyjaśnienie:

wprowadź opis zdjęcia tutaj

Czysta funkcja. #jest skrótem od Slot[1]którego reprezentuje pierwszy argument do Function. PrimePi@#Liczy liczbę liczb pierwszych mniejszych lub równych #, Range@PrimePi@#jest listą pierwszych PrimePi[#]liczb całkowitych dodatnich, podobnie Prime@Range@PrimePi@#jak lista liczb pierwszych mniejszych lub równych #(jest to jeden bajt krótszy niż Select[Range@#,PrimeQ]). Symbol xjest Setrówny tej liście, a następnie podnoszony do Power ⌊x~Log~#⌋, który jest listą Floor[Log[n,#]]dla każdego nw x. W Mathematica podniesienie listy do Powerinnej listy o tej samej długości powoduje wyświetlenie listy mocy odpowiadających jej elementów.

ngenisis
źródło
Myślałem, że Range@#~Select~PrimeQbędzie krótszy niż Prime@Range@PrimePi@#... ale to remis
Greg Martin
To ładna postać. Czy został wygenerowany przy użyciu wbudowanego czy utworzony ręcznie?
mile
@miles Zostało wygenerowane przy użyciuTreeForm
ngenisis
Dzięki. Nie pamiętam, żeby kiedykolwiek to widziałem, ale najwyraźniej istniało już od zawsze.
mile
7

MATL, 13 bajtów

ZqG:!^tG>~*X>

Wypróbuj online!

Wyjaśnienie

        % 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
Suever
źródło
7

Galaretka , 8 bajtów

ÆR*ÆE€»/

Wypróbuj online!

Jak to działa

Æ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.
Dennis
źródło
6

Galaretka , 12 9 bajtów

RÆEz0iṀ$€

Wypróbuj online! (metoda jest zbyt wolna dla przypadku 10000).

W jaki sposób?

Tworzy listę p k w kolejności 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]
Jonathan Allan
źródło
5

Pyth, 13 bajtów

m^ds.lQdfP_TS

Wypróbuj tutaj!

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

Od jakiegoś czasu nie grałem w Pyth, więc wszelkie wskazówki dotyczące golfa są mile widziane.

niebieski
źródło
5

Nie mogłem znaleźć krótszego rozwiązania Mathematica niż rozwiązania ngenisis , ale pomyślałem, że zaproponuję kilka (mam nadzieję, że interesujących) alternatywnych podejść.

Mathematica, 65 bajtów

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

Najpierw {#,#}&/@Range@#~Select~PrimeQbudujemy listę wszystkich liczb pierwszych w odpowiednim zakresie, ale z uporządkowanymi parami każdej liczby pierwszej, na przykład { {2,2}, {3,3}, ...}. Następnie operujemy na tej liście wielokrotnie z regułą zastępowania {a_,b_}/;a<=#:>{b a,b}, która zwielokrotnia pierwszy element uporządkowanej pary przez drugi, aż pierwszy element przekroczy wejście. Następnie stosujemy #/#2&@@@do wyjścia, dla każdej uporządkowanej pary, pierwszy element podzielony przez drugi. (W końcu posortowane są według liczby pierwszej: przykładowy wynik to {16, 9, 5, 7, 11, 13, 17, 19}.)

Mathematica, 44 bajty

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

Funkcja von Mangoldta Λ(n)jest interesującą funkcją teorii liczb: jest równa 0, chyba że njest siłą pierwszą p k , w którym to przypadku jest równa log p(nie log n). (Są to dzienniki naturalne, ale to nie ma znaczenia.) W ten sposób MangoldtLambda@#->#&~Array~#tworzy tablicę reguł, { 0->1, Log[2]->2, Log[3]->3, Log[2]->4, Log[5]->5, 0->6, ... }których długość jest liczbą całkowitą wejściową.

Następnie przekształcamy tę listę reguł w „skojarzenie” za pomocą <|...|>. Skutkuje to zachowaniem tylko ostatniej reguły z dowolną wartością po lewej stronie. Innymi słowy, to wyrzucić Log[2]->2i Log[2]->4i Log[2]->8i zachować tylko Log[2]->16(przy założeniu, że wejście jest między 16 i 31 w tym przykładzie). Dlatego jedynymi pozostałymi prawymi stronami są maksymalne moce pierwotne - z wyjątkiem jednej pozostałej reguły 0->n, gdzie njest największa moc niepierwotna aż do wejściowej liczby całkowitej. Ale Restodrzuca to, co niepożądane, rządzi i Valueswyciąga prawą stronę z reguł w stowarzyszeniu. (W końcu posortowano jak wyżej.)

Nieco dłuższa (46 bajtów) wersja, która zlicza liczbę wystąpień każdego z nich, log pa następnie potęguje się, aby przekonwertować do maksymalnych liczb pierwszych:

E^(1##)&@@@Rest@Tally[MangoldtLambda~Array~#]&
Greg Martin
źródło
1
Staranne wykorzystanie skojarzeń. Są obecni od 2014 roku, ale nie sądzę, aby mieli wiele zastosowań w golfie. Bardzo przydatne, aby wiedzieć, że zastępuje identyczne klucze wartościami od lewej do prawej.
mile
4

CJam , 21 20 bajtów

Zaoszczędzono 1 bajt dzięki Martinowi Enderowi

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

Wypróbuj online!

Wyjaśnienie

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
Business Cat
źródło
4

Brachylog , 15 bajtów

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

Wypróbuj online!

To daje moc od największej do najmniejszej.

To jest bardzo nieefektywne.

Wyjaśnienie

⟧                   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

Najpierw znajdzie to największy rozkład liczb pierwszych dla każdej liczby pierwszej, ze względu na sposób działania: od lewej do prawej i od największych do najmniejszych podzbiorów.

Fatalizować
źródło
4

Brachylog , 24 21 19 bajtów

3 + 2 bajty zapisane dzięki Fatalize!

Po raz pierwszy korzystam z Brachylog i wiem, że niektóre rzeczy można było zrobić na krótsze sposoby, ale cieszę się, że to nawet działa: D

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

Wypróbuj online! (Zwracane wartości są uporządkowane według podstawowych liczb pierwszych)

Wyjaśnienie:

{................}ᶠ           #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.
Lew
źródło
1
Świetny! Możesz zapisać dwa bajty, używając określonych nazw zmiennych ?oraz .dla danych wejściowych i wyjściowych zamiast Ii Xjako takie:{≥N~^.hṗ:N×>?∧0<~t}ᶠ^ᵐ
Fatalize
1
Możesz także zapisać kolejny bajt, usuwając 0<~ti stwierdzając, że każdy element Wyjścia .jest ℕ₁ = [1, ..., +inf)taki:{≥N~^.ℕ₁ᵐhṗ:N×>?∧}ᶠ^ᵐ
Fatalize
@Fatalize dziękuję! Zaktualizuję rozwiązanie z twoimi sugestiami :) Nawiasem mówiąc, czy wiesz, dlaczego takie rozwiązanie {≥.~^ℕ₁ᵐhṗ:.×>?∧}ᶠ(używanie N bezpośrednio jako danych wyjściowych) nie działa? Najpierw spróbowałem czegoś takiego, ale potem musiałem użyć X i zastosować ^
Leo
2
Zastanawiałem się nad tym samym; jest to prawdopodobnie spowodowane niejawnym etapem znakowania, który występuje na końcu predykatu, w {...}ᶠktórym powoduje dziwne zachowanie. Zamierzam to zmienić i przyjrzę się konkretnie, dlaczego ten program nie działa tak samo jak powyższy.
Fatalize
1
To naprawdę działa, jeśli zrobisz to w ten {≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠsposób : W ten sposób uzyskasz prawidłową etykietę. (W międzyczasie wprowadzono zmiany w specyfikacjach, ale tak naprawdę nie zmieniają one zachowania tego konkretnego programu, więc nie wyklucza jego konkurowania). Oszczędza to 2 bajty
Fatalize
3

05AB1E , 15 12 bajtów

ƒNpiN¹N.nïm,

Wypróbuj online!

Wyjaśnienie

ƒ             # for N in [0 ... input]
 Npi          # if N is prime
    N         # push N
     ¹N.n     # push log_N(input)
         ï    # convert to int
          m   # raise N to this power
           ,  # print
Emigna
źródło
3

Narzędzia Bash + GNU, 74 bajty

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

Wypróbuj online!

Numer wejściowy jest przekazywany jako argument. Dane wyjściowe są drukowane na standardowym wyjściu. (Jak zwykle, stderr jest ignorowany).

Przykładowe dane wyjściowe:

./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

Oto jak to działa:

Wywołaj argument N.

seqgeneruje wszystkie liczby od 1 do N i factoruwzględnia je wszystkie.

Wyrażenie regularne w wywołaniu sed identyfikuje te linie, w których liczba jest liczbą pierwszą P, i zastępuje te linie liniami o postaci `

P;l(N);l(P);print "/^p"

(gdzie P i N są zastępowane ich rzeczywistymi wartościami liczbowymi, a wszystko inne jest kopiowane dosłownie, nawet cudzysłowy i średniki oraz ciąg znaków print).

Linie te są podawane jako dane wejściowe bc -l; bc drukuje wartości trzech wskazanych liczb, po których następuje nowa linia, a następnie drukuje znaki /^p. (W bc, l (x) oznacza logarytm naturalny z x.) JK K

Ciągi drukowane przez bc są następnie podawane jako dane wejściowe do dc; dc wypisuje wartość każdego P ^ (log (N) / log (P)) przy użyciu arytmetyki liczb całkowitych (obcinanie); to największa moc P, która wynosi <= N.

Jedną rzeczą, która jest powyżej, jest to, co dzieje się z liniami wytwarzanymi przez czynniki, które nie odpowiadają liczbom pierwszym. Te wiersze nie pasują do wyrażenia regularnego w wywołaniu sed, więc nie są zastępowane. W rezultacie linie te zaczynają się od liczby, po której następuje dwukropek, który generuje błąd, gdy jest podawany jako dane wejściowe bc. Ale bc po prostu drukuje do stderr, co ignorujemy; nie drukuje niczego na standardowe wyjście. Domyślnie stderr jest ignorowany w PPCG .

Mitchell Spector
źródło
3

Haskell , 73 67 66 bajtów

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

Wypróbuj online! Stosowanie:

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

Edycja: 6 bajtów off dzięki Zgarb!

Wyjaśnienie:

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
Laikoni
źródło
1
Myślę, że lewa strona może być last[x^i|i<-[1..n],x^i<=n].
Zgarb
@Zgarb Thanks! Zawsze jest to lista ze zrozumieniem, prawda ...
Laikoni,
2

Galaretka , 9 bajtów

Ræl/ÆF*/€

Jeden bajt dłuższy niż moja inna odpowiedź , ale kończy się na wejściu 10.000 to kilka sekund.

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
Istnieje również 7-bajtowa wersja w Galaretce, która szybko się kończy.
mile
Zobaczę twoją 7 i wychowam 4.: P
Dennis
Wow, nie wiedziałem, że to też było wbudowane. To zabiera ciastko.
mile
2

JavaScript (ES6), 118 120 119 114 112 105 bajtów

(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)))

Sugestie mile widziane. Jest to dość długie, ale wydawało się, że warto opublikować, ponieważ wykonuje wszystkie testy podzielności jawnie, zamiast używać wbudowanych funkcji liczb pierwszych.

Uwagi:

  • Liczba naturalna q jest siłą pierwszą <=> wszystkie dzielniki q są potęgami tej samej liczby pierwszej <=> dla dowolnego d, które dzieli q, jeden z di q / d jest dzielnikiem drugiego.
  • Jeśli q jest potęgą p, q jest maksymalne <=> q ​​* p> n <=> q ​​* d> n dla każdego nietrywialnego dzielnika d z q.
Micheasz
źródło
2

Szałwia, 43 bajty

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

Mapuje każdą liczbę pierwszą w zakresie primes(i)do maksymalnej mocy pierwszej. lnjest tylko aliasem, logwięc akceptuje alternatywne zasady, chociaż jego nazwa sugeruje, że można używać tylko zasad e.

busukxuan
źródło
Myślałem, że na początku był to python, zobaczyłem tę primesfunkcję i naprawdę się podnieciłem. Nigdy więcej nie ufaj przepełnieniu stosu.
sagiksp,
@sagiksp Nie rozumiem, co to ma wspólnego ze StackOverflow?
busukxuan
2

Haskell, 110 90 bajtów

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]]

- zaktualizowano według opinii Laikoni

brander
źródło
To rzuca Exception: Prelude.last: empty listza f 2i f 3.
Laikoni
1
Również f 4powraca [2,3]zamiast [4,3], myślę, że takeWhile(<n)musisz takeWhile(<=n). Jednak użycie fst.spanzamiast takeWhilejest o jeden bajt krótsze.
Laikoni
2

Haskell , 70 bajtów

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

Definiuje funkcję f. Wypróbuj online!

Wyjaśnienie

Chodzi o to, aby przefiltrować zakres [2..n]dla tych liczb, kktóre spełniają k == p^length(divisors k)i p*k > n, gdzie pjest najmniejszy główny dzielnik 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].
Zgarb
źródło
1

PHP, 101 93 91 88 bajtów

tylko trochę prawdziwych matematyki ...

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

awaria

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
Tytus
źródło
1

JavaScript ES7, 93 bajty

Rekurencyjnie iteruj iod 0 do włącznie n. Jeśli ijest liczbą pierwszą, podnieś ją do najwyższego wykładniczego wykładnika, który sprawia, że <= 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)]:[]
George Reith
źródło