Uma potência principal é um número inteiro positivo n que pode ser escrito na forma n = p k, em que p é um número primo e k é um número inteiro positivo. Por exemplo, alguns poderes principais são [2, 3, 5, 4, 9, 25, 8, 27, 125]
.
Em seguida, considere potências primárias de 2. Essas são [2, 4, 8, 16, ...]
e podem ser escritas no formato 2 k . Todos seriam incluídos ao considerar potências primárias abaixo de 20. No entanto, 16 é a potência primária máxima com uma base primária de 2 nesse intervalo. Um primo de energia p k é máxima em um intervalo se ele é o mais alto poder de p nesse intervalo. Estamos interessados apenas na potência primária máxima em cada faixa, portanto todas as potências primárias inferiores devem ser excluídas.
Seu objetivo é escrever uma função ou programa que use um número inteiro positivo n e produza as potências primárias máximas no intervalo [2, 3, 4, ..., n]
.
Agradecemos a Peter Taylor por esclarecer a definição de potência primária máxima e muito mais.
Regras
- Isso é código-golfe, então faça seu código o mais curto possível.
- As potências primárias máximas podem ser emitidas em qualquer ordem, mas não deve haver duplicatas.
Casos de teste
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]
A lista completa de potências primárias máximas para 10000 pode ser encontrada aqui .
Power floor
O que diabosMathematica,
444340 bytesEconomizou 4 bytes graças a milhas e Martin Ender
n#^⌊#~Log~n⌋&/@Select[Range@n,PrimeQ]
⌊
e⌋
são os3
caracteres de byteU+230A
eU+230B
representam\[LeftFloor]
e\[RightFloor]
, respectivamente.Explicação:
Função pura.
#
é a abreviação deSlot[1]
qual representa o primeiro argumento para oFunction
.PrimePi@#
conta o número de números primos menor ou igual a#
,Range@PrimePi@#
é a lista dos primeirosPrimePi[#]
números inteiros positivos e tambémPrime@Range@PrimePi@#
a lista de números primos menor ou igual a#
(este é um byte menor queSelect[Range@#,PrimeQ]
). O símbolox
éSet
igual a esta lista, em seguida, elevada àPower
⌊x~Log~#⌋
, que é a lista deFloor[Log[n,#]]
para cadan
nox
. No Mathematica, elevar uma lista paraPower
outra lista do mesmo comprimento resulta na lista dos poderes de seus elementos correspondentes.fonte
Range@#~Select~PrimeQ
seria mais curto do quePrime@Range@PrimePi@#
... mas é um laçoTreeForm
MATL, 13 bytes
Experimente Online!
Explicação
fonte
Geléia , 8 bytes
Experimente online!
Como funciona
fonte
Geléia ,
129 bytesExperimente online! (o método é muito lento para o caso 10000).
Quão?
Constrói a lista de p k na ordem de p .
fonte
Pitão, 13 bytes
Experimente aqui!
Eu não jogo com Pyth há algum tempo, então qualquer dica de golfe é apreciada.
fonte
Não consegui uma solução Mathematica mais curta que a da ngenisis , mas pensei em oferecer algumas abordagens alternativas (espero que interessantes).
Mathematica, 65 bytes
Primeiro, usamos
{#,#}&/@Range@#~Select~PrimeQ
para criar uma lista de todos os números primos no intervalo apropriado, mas com pares ordenados de cada número primo, como{ {2,2}, {3,3}, ...}
. Em seguida, operamos nessa lista repetidamente com a regra de substituição{a_,b_}/;a<=#:>{b a,b}
, que multiplica o primeiro elemento do par ordenado por segundo até que o primeiro elemento exceda a entrada. Em seguida, aplicamos#/#2&@@@
à saída, para cada par ordenado, o primeiro elemento dividido pelo segundo. (Eles acabam classificados pelo primo subjacente: um exemplo de saída é{16, 9, 5, 7, 11, 13, 17, 19}
).Mathematica, 44 bytes
A função von Mangoldt
Λ(n)
é uma função interessante da teoria dos números: é igual a 0, a menos quen
seja uma potência principal pk , caso em que é igual alog p
(nãolog n
). (Estes são logs naturais, mas não importa.) Assim,MangoldtLambda@#->#&~Array~#
cria uma série de regras{ 0->1, Log[2]->2, Log[3]->3, Log[2]->4, Log[5]->5, 0->6, ... }
cujo comprimento é o número inteiro de entrada.Em seguida, transformamos essa lista de regras em uma "associação" usando
<|...|>
. Isso tem o efeito de reter apenas a última regra com qualquer valor à esquerda. Em outras palavras, ele vai deitar foraLog[2]->2
eLog[2]->4
eLog[2]->8
e manter apenasLog[2]->16
(partindo do princípio que a entrada está compreendida entre 16 e 31 para este exemplo). Portanto, os únicos lados direitos restantes são as potências primárias máximas - exceto a regra restante0->n
, onden
é a maior potência não primária até o número inteiro de entrada. MasRest
joga fora essa regra indesejada eValues
extrai o lado direito das regras da associação. (Eles acabam classificados como acima.)Uma versão um pouco mais longa (46 bytes), que conta o número de aparências de cada uma
log p
e depois exponencia a conversão para as potências primárias máximas:fonte
CJam ,
2120 bytesGuardado 1 byte graças a Martin Ender
Experimente online!
Explicação
fonte
Braquilog , 15 bytes
Experimente online!
Isso gera os poderes do maior para o menor.
Isso é muito ineficiente.
Explicação
Ele encontrará as maiores decomposições primárias para cada primo primeiro, devido à maneira como
⊇
funciona: da esquerda para a direita e do maior para o menor subconjunto.fonte
Braquilog ,
242119 bytes3 + 2 bytes salvos graças ao Fatalize!
Esta é a minha primeira vez usando Brachylog, e sei que algumas coisas poderiam ter sido feitas de maneiras mais curtas, mas estou feliz que funcione: D
Experimente online! (Os valores retornados são ordenados por seus primos base)
Explicação:
fonte
?
e.
para Entrada e Saída, em vez deI
eX
, como tal:{≥N~^.hṗ:N×>?∧0<~t}ᶠ^ᵐ
0<~t
e informando que cada elemento do Output.
estáℕ₁ = [1, ..., +inf)
como tal:{≥N~^.ℕ₁ᵐhṗ:N×>?∧}ᶠ^ᵐ
{≥.~^ℕ₁ᵐhṗ:.×>?∧}ᶠ
(usando N diretamente como saída) não funciona? Tentei primeiro algo assim, mas depois teve que recorrer ao uso de X e aplicando ^ sobre ele{...}ᶠ
que causa um comportamento estranho. Pretendo mudar isso e analisarei especificamente por que esse programa não funciona da mesma maneira que o acima.{≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠ
Dessa forma, você obtém uma rotulagem correta. (Entretanto, uma alteração foi feita nas especificações, mas na verdade não altera o comportamento desse programa em particular, portanto não o torna não competitivo). Isso economiza 2 bytes05AB1E ,
1512 bytesExperimente online!
Explicação
fonte
Utilitários Bash + GNU, 74 bytes
Experimente online!
O número de entrada é passado como argumento. A saída é impressa em stdout. (Como é habitual, stderr é ignorado.)
Saída de amostra:
Veja como funciona:
Chame o argumento N.
seq
gera todos os números de 1 a N efactor
fatora todos eles.O regex na chamada para sed identifica as linhas em que o número é um P primo e substitui essas linhas por linhas com a forma `
(onde P e N são substituídos por seus valores numéricos reais e todo o resto é copiado literalmente, até as aspas e ponto-e-vírgula e a sequência
print
).Essas linhas são alimentadas como entrada para
bc -l
; bc imprime os valores dos três números indicados, cada um seguido por uma nova linha e, em seguida, imprime os caracteres/^p
. (Em bc, l (x) denota o logaritmo natural de x.) JK KAs strings que bc imprime são então alimentadas como entrada para dc; dc imprime o valor de cada P ^ (log (N) / log (P)) usando aritmética inteira (truncando); esse é o maior poder de P que é <= N.
Uma coisa que foi encoberta acima é o que acontece com as linhas produzidas por fatores que não correspondem a números primos. Essas linhas não correspondem ao regex na chamada para sed, portanto, nenhuma substituição é feita nessas. Como resultado, essas linhas começam com um número seguido de dois pontos, que gera um erro quando alimentado como entrada para
bc
. Mas bc apenas imprime para stderr então, o que ignoramos; não imprime nada no stdout. Por padrão, stderr é ignorado no PPCG .fonte
Haskell ,
73 6766 bytesExperimente online! Uso:
Edit: 6 bytes de desconto graças ao Zgarb!
Explicação:
fonte
last[x^i|i<-[1..n],x^i<=n]
.Geléia , 9 bytes
Um byte mais longo que minha outra resposta , mas termina com a entrada de 10.000 segundos.
Experimente online!
Como funciona
fonte
JavaScript (ES6),
118120119114112105 bytesSugestões são bem-vindas. Isso é meio longo, mas parecia valer a pena postar, porque ele faz todo o teste de divisibilidade explicitamente, em vez de usar os built-ins relacionados aos números primos.
Notas:
fonte
Sábio, 43 bytes
Mapeia cada prime no intervalo
primes(i)
para sua potência máxima no prime.ln
é apenas um alias de,log
portanto, ele aceita bases alternativas, embora seu nome sugira que ele possa usar apenas basee
.fonte
primes
função e fiquei realmente empolgado. Nunca mais confiando no stackoverflow.Haskell,
11090 bytes- atualizado pelo feedback de Laikoni
fonte
Exception: Prelude.last: empty list
paraf 2
ef 3
.f 4
retorna em[2,3]
vez de[4,3]
, acho que vocêtakeWhile(<n)
precisatakeWhile(<=n)
. No entanto, usar emfst.span
vez detakeWhile
é um byte mais curto.Haskell , 70 bytes
Define uma função
f
. Experimente online!Explicação
A idéia é filtrar o intervalo
[2..n]
para os númerosk
que satisfazemk == p^length(divisors k)
ep*k > n
, ondep
é o menor divisor principal dek
.fonte
PHP,
101939188 bytesapenas um pouco de matemática real ...
demolir
fonte
JavaScript ES7, 93 bytes
Faça iterações recursivas
i
de 0 até e inclusiven
. Sei
é raise prime-lo ao mais alto expoente piso que torna<= n
(i ^ floor(log(n) / log(i))
)fonte