Una potencia prima es un número entero positivo n que se puede escribir en la forma n = p k donde p es un número primo yk es un número entero positivo. Por ejemplo, algunas potencias principales son [2, 3, 5, 4, 9, 25, 8, 27, 125]
.
A continuación, considere los poderes primarios de 2. Estos son [2, 4, 8, 16, ...]
y pueden escribirse en la forma 2 k . Todos se incluirían al considerar las potencias principales por debajo de 20. Sin embargo, 16 es la potencia principal máxima con una base de 2 en ese rango. Una potencia primaria p k es máxima en un rango si es la potencia más alta de p en ese rango. Solo estamos interesados en la potencia primaria máxima en cada rango, por lo que todas las potencias primarias inferiores deben excluirse.
Su objetivo es escribir una función o programa que tome un número entero positivo n y produzca las potencias máximas máximas en el rango [2, 3, 4, ..., n]
.
Gracias a @ Peter Taylor por aclarar la definición de potencia máxima máxima y más.
Reglas
- Este es el código de golf, así que haga su código lo más corto posible.
- Las potencias máximas máximas se pueden emitir en cualquier orden, pero no debe haber duplicados.
Casos de prueba
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]
La lista completa de potencias máximas máximas para 10000 se puede encontrar aquí .
Power floor
Qué diablosMathematica,
444340 bytesGuardado 4 bytes gracias a millas y Martin Ender
n#^⌊#~Log~n⌋&/@Select[Range@n,PrimeQ]
⌊
y⌋
son los3
caracteres de bytesU+230A
yU+230B
representan\[LeftFloor]
y\[RightFloor]
, respectivamente.Explicación:
Pura función.
#
es la abreviatura de loSlot[1]
que representa el primer argumento de laFunction
.PrimePi@#
cuenta el número de primos menor o igual a#
,Range@PrimePi@#
es la lista de los primerosPrimePi[#]
enteros positivos, y también loPrime@Range@PrimePi@#
es la lista de primos menor o igual a#
(este es un byte más corto queSelect[Range@#,PrimeQ]
). El símbolox
esSet
igual a esta lista, entonces elevado a laPower
⌊x~Log~#⌋
, que es la lista deFloor[Log[n,#]]
para cadan
enx
. En Mathematica, elevar una lista aPower
otra lista de la misma longitud da como resultado la lista de las potencias de sus elementos correspondientes.fuente
Range@#~Select~PrimeQ
que sería más corto quePrime@Range@PrimePi@#
... pero es un empateTreeForm
MATL, 13 bytes
Pruébalo en línea!
Explicación
fuente
Jalea , 8 bytes
Pruébalo en línea!
Cómo funciona
fuente
Jalea ,
129 bytesPruébalo en línea! (El método es demasiado lento para el caso 10000).
¿Cómo?
Construye la lista de p k en orden de p .
fuente
Pyth, 13 bytes
Pruébalo aquí!
No he jugado con Pyth en mucho tiempo, por lo que agradezco cualquier consejo de golf.
fuente
No pude obtener una solución de Mathematica más corta que la solución de ngenisis , pero pensé en ofrecer un par de enfoques alternativos (con suerte interesantes).
Mathematica, 65 bytes
Primero usamos
{#,#}&/@Range@#~Select~PrimeQ
para construir una lista de todos los primos en el rango apropiado, pero con pares ordenados de cada primo, como{ {2,2}, {3,3}, ...}
. Luego, operamos en esa lista repetidamente con la regla de reemplazo{a_,b_}/;a<=#:>{b a,b}
, que multiplica el primer elemento del par ordenado por el segundo hasta que el primer elemento excede la entrada. Luego aplicamos#/#2&@@@
a la salida, para cada par ordenado, el primer elemento dividido por el segundo. (Terminan ordenados por el primo subyacente: un resultado de ejemplo es{16, 9, 5, 7, 11, 13, 17, 19}
).Mathematica, 44 bytes
La función de von Mangoldt
Λ(n)
es una función interesante de teoría de números: es igual a 0 a menos quen
sea una potencia primaria p k , en cuyo caso es iguallog p
(nolog n
). (Estos son registros naturales, pero no importará). Por lo tanto,MangoldtLambda@#->#&~Array~#
crea una matriz de reglas{ 0->1, Log[2]->2, Log[3]->3, Log[2]->4, Log[5]->5, 0->6, ... }
cuya longitud es el entero de entrada.Luego convertimos esta lista de reglas en una "asociación" usando
<|...|>
. Esto tiene el efecto de retener solo la última regla con cualquier valor dado a la izquierda. En otras palabras, será tirarLog[2]->2
yLog[2]->4
yLog[2]->8
y mantener sóloLog[2]->16
(suponiendo que la entrada se encuentra entre 16 y 31 para este ejemplo). Por lo tanto, los únicos lados derechos restantes son las potencias máximas máximas, a excepción de la única regla restante0->n
, donden
es la potencia no principal más grande hasta el entero de entrada. PeroRest
descarta esa regla no deseada yValues
extrae el lado derecho de las reglas de la asociación. (Terminan ordenados como anteriormente).Una versión un poco más larga (46 bytes), que cuenta el número de apariencias de cada uno
log p
y luego expone para convertir a las potencias primarias máximas:fuente
CJam ,
2120 bytesGuardado 1 byte gracias a Martin Ender
Pruébalo en línea!
Explicación
fuente
Brachylog , 15 bytes
Pruébalo en línea!
Esto genera los poderes de mayor a menor.
Esto es muy ineficiente.
Explicación
Esto encontrará primero las descomposiciones principales más grandes para cada primo debido a la forma en que
⊇
funciona: de izquierda a derecha y de subconjuntos más grandes a más pequeños.fuente
Brachylog ,
242119 bytes3 + 2 bytes guardados gracias a Fatalize!
Esta es la primera vez que uso Brachylog, y sé que algunas cosas podrían haberse hecho de manera más corta, pero estoy feliz de que incluso funcione: D
Pruébalo en línea! (Los valores de retorno están ordenados por sus primos base)
Explicación:
fuente
?
y.
para Entrada y Salida, en lugar deI
yX
, como tal:{≥N~^.hṗ:N×>?∧0<~t}ᶠ^ᵐ
0<~t
y declarando que cada elemento de la Salida.
estáℕ₁ = [1, ..., +inf)
como tal:{≥N~^.ℕ₁ᵐhṗ:N×>?∧}ᶠ^ᵐ
{≥.~^ℕ₁ᵐhṗ:.×>?∧}ᶠ
(usando N directamente como salida) no funciona? Primero intenté algo como esto, pero luego tuve que recurrir al uso de X y aplicar ^ sobre él{...}ᶠ
que se produce un comportamiento extraño. Tengo la intención de cambiar eso y analizaré específicamente por qué este programa no funciona de la misma manera que el anterior.{≥.~^ℕ₁ᵐhṗ:.≜×>?∧}ᶠ
esa manera obtienes la etiqueta correcta. (Mientras tanto, se realizó un cambio en las especificaciones, pero en realidad no cambia el comportamiento de este programa en particular, por lo que no lo hace no competitivo). Esto ahorra 2 bytes05AB1E ,
1512 bytesPruébalo en línea!
Explicación
fuente
Bash + utilidades GNU, 74 bytes
Pruébalo en línea!
El número de entrada se pasa como argumento. La salida se imprime en stdout. (Como es habitual, se ignora stderr).
Salida de muestra:
Así es como funciona:
Llame al argumento N.
seq
genera todos los números del 1 al N y losfactor
factoriza a todos.La expresión regular en la llamada a sed identifica aquellas líneas donde el número es un P principal, y reemplaza esas líneas con líneas que tienen la forma `
(donde P y N se reemplazan por sus valores numéricos reales, y todo lo demás se copia literalmente, incluso las comillas y los puntos y comas, y la cadena
print
).Estas líneas se alimentan como entrada a
bc -l
; bc imprime los valores de los tres números indicados, cada uno seguido de una nueva línea, y luego imprime los caracteres/^p
. (En bc, l (x) denota el logaritmo natural de x.) JK KLas cadenas que imprime bc se alimentan como entrada a dc; dc imprime el valor de cada P ^ (log (N) / log (P)) usando aritmética de enteros (truncamiento); esa es la mayor potencia de P que es <= N.
Una cosa que se ha pasado por alto es lo que sucede con las líneas producidas por factores que no corresponden a los números primos. Esas líneas no coinciden con la expresión regular en la llamada a sed, por lo que no se realiza ningún reemplazo en ellas. Como resultado, esas líneas comienzan con un número seguido de dos puntos, lo que genera un error cuando se alimenta como entrada
bc
. Pero bc simplemente imprime en stderr entonces, lo cual ignoramos; no imprime nada en stdout. Por defecto, stderr se ignora en PPCG .fuente
Haskell ,
73 6766 bytesPruébalo en línea! Uso:
Editar: 6 bytes de descuento gracias a Zgarb!
Explicación:
fuente
last[x^i|i<-[1..n],x^i<=n]
.Jalea , 9 bytes
Un byte más largo que mi otra respuesta , pero termina con la entrada 10,000 es un par de segundos.
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6),
118120119114112105 bytesSugerencias bienvenidas. Esto es un poco largo, pero parecía que valía la pena publicarlo porque realiza todas las pruebas de divisibilidad explícitamente en lugar de usar elementos integrados relacionados con números primos.
Notas:
fuente
Sabio, 43 bytes
Asigna cada primo en el rango
primes(i)
a su potencia máxima máxima.ln
es solo un alias de,log
por lo que acepta bases alternativas, aunque su nombre sugiere que solo puede usar basee
.fuente
primes
función y me emocioné mucho. Nunca volver a confiar en stackoverflow.Haskell,
11090 bytes--actualizado por los comentarios de Laikoni
fuente
Exception: Prelude.last: empty list
paraf 2
yf 3
.f 4
regresa en[2,3]
lugar de[4,3]
, creo que tustakeWhile(<n)
necesidades deben sertakeWhile(<=n)
. Sin embargo, usar enfst.span
lugar detakeWhile
es un byte más corto.Haskell , 70 bytes
Define una función
f
. Pruébalo en línea!Explicación
La idea es filtrar el rango
[2..n]
para aquellos númerosk
que satisfacenk == p^length(divisors k)
yp*k > n
, dondep
es el divisor primo más pequeño dek
.fuente
PHP,
101939188 bytessolo un poco de matemática real ...
Descompostura
fuente
JavaScript ES7, 93 bytes
Recurrir iterativamente
i
desde 0 hasta e inclusiven
. Sii
es primo, elevarlo al exponente de piso más alto que lo haga<= n
(i ^ floor(log(n) / log(i))
)fuente