El Postulado de Bertrand establece que por cada número entero n ≥ 1 hay al menos un primo p tal que n <p ≤ 2n . Para verificar este teorema para n <4000 no tenemos que verificar 4000 casos: el truco de Landau dice que es suficiente verificar que
2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003
son todos primos Debido a que cada uno de estos números es menos del doble de su predecesor, cada intervalo {y: n <y ≤ 2n} contiene al menos uno de esos números primos.
Esta secuencia de números son los Primas de Bertrand (OEIS A006992) y se definen de la siguiente manera:
a(1) = 2
a(n) = largest prime below 2a(n-1)
Reto
Implementa esta secuencia. Puedes escribir
- una función o programa que da algo de n devuelve a (n) (0 o 1 indexado),
- una función o programa que da algo de n devuelve las primeras n (o n-1 o n + 1 ) entradas de esta secuencia,
- una lista infinita o corriente o generador o equivalente similar en su idioma.
Fx.ØØ
está tan cerca ... Funciona para todo lo anteriorn > 2
.$F·ÅPθ
para el mismo recuento de bytes.Haskell , 50 bytes
Pruébalo en línea!
Emite una lista infinita.
Haskell , 40 bytes?
Pruébalo en línea!
Esto funciona si los números primos de Bertrand no contienen pseudoprimos Fermat para 2 .
fuente
Jalea , 6 bytes
Pruébalo en línea!
0 indexado.
Explicación
fuente
MATL , 9 bytes
Entradas n , salidas a ( n ), 1 indexado.
Pruébalo en línea!
Explicación
fuente
Stax , 10 bytes
Ejecutar casos de prueba
Este problema ha expuesto un error en la implementación de stax
:p
, que es una instrucción que obtiene el mayor primo menos que su entrada. Si funcionara correctamente, habría una solución de56 bytes.Pero, por desgracia, no lo hace, y no lo hay.Como creador del lenguaje, lo arreglaré, pero parece un poco barato arreglarlo y usarlo después de que se publicó el problema.De todos modos, aquí está la representación ascii correspondiente del programa anterior.
Es una implementación relativamente sencilla de la declaración del problema. Lo único posiblemente interesante al respecto es el uso de la
gs
forma del generador. Los generadores son una familia de construcciones que combinan una condición inicial, una transformación y un filtro para producir uno o más valores satisfactorios. En este caso, se usa en lugar de la:p
instrucción rota .Editar: aquí está la solución de 6 bytes, pero requiere una corrección de errores que solo se aplicó después de publicar este desafío.
fuente
Python 2 , 63 bytes
Pruébalo en línea!
Imprime para siempre.
Utiliza el generador principal de Theorem de Wilson aunque generar primos hacia adelante es complicado para este problema. Realiza un seguimiento del mayor número actual visto
r
y el límite de duplicaciónm
.Se guardan dos bytes en
P*=k
lugar deP*=k*k
lo habitual, ya que el único efecto es afirmar que 4 es primo, y la secuencia de duplicación se pierde.fuente
CJam (15 bytes)
Demo en línea . Tenga en cuenta que esto está indexado a 0.
Un enfoque más eficiente sería buscar hacia atrás, pero esto requiere un carácter más porque no puede usar implícito
,
(rango):fuente
Japt ,
16141312 bytesDos soluciones por el precio de una, ambas indexadas.
Enésimo término
Finalmente, un desafío para el que puedo escribir una solución de trabajo
F.g()
.Intentalo
Primeros términos N
Intentalo
fuente
Pari / GP , 34 bytes
Pruébalo en línea!
fuente
Python 2 , 64 bytes
Pruébalo en línea! Imprime la secuencia indefinidamente
fuente
Haskell , 58 bytes
Pruébalo en línea!
fuente
Python 2 , 68 bytes
Imprime la secuencia indefinidamente (debe hacer clic en "Ejecutar" la segunda vez para detener la ejecución).
Pruébalo en línea!
Python 3 , 90 bytes
Devuelve el n enésimo término.
Pruébalo en línea!
fuente
C (gcc) ,
9787868079 bytesP
en el bucle principal.printf
llamada.i
entrada de la secuencia número (indexada a 0) en lugar de generar una secuencia interminable.Pruébalo en línea!
fuente
Adjunto , 38 bytes
Pruébalo en línea!
Basado en 0; devuelve el
n
th prime Bertrand.Actualmente no hay una función integrada para encontrar los primos anteriores / siguientes, por lo que uso la función
Series
integrada para calcular todos los primos hasta2*$[_-1]
. Esta última expresión utiliza la recursión implícita (vinculada a$
) para definir fácilmente la relación de recurrencia. La condición if se usa para determinar una condición base.fuente
Perl 6 , 35 bytes
Pruébalo en línea!
Esta expresión es una lista infinita de primos de Bertrand.
fuente
Retina , 39 bytes
Pruébalo en línea! Explicación:
Comience con 1.
Repita el ciclo usando la entrada como el conteo del ciclo.
Duplica el valor.
Encuentre el primo más alto menos que el valor.
Imprimirlo.
fuente
Ruby , 51 + 7 (-prime) = 58 bytes
Pruébalo en línea!
Una lamba que acepta
n
y devuelve lanth
prima de Bertrand, indexada en 0. No hay mucho aquí, pero déjame quitarle el golf de todos modos:Ruby , 48 + 7 = 55 bytes
Pruébalo en línea!
Por diversión, aquí hay una solución de bucle infinito. Imprime a medida que avanza y requiere una interrupción. Dependiendo de exactamente cuándo interrumpe, puede o no ver la salida. Sin golf:
fuente
APL (Dyalog Extended) , 12 bytes
Toma la entrada del usuario como N, devuelve el enésimo elemento de la secuencia (0 indexado).
Pruébalo en línea!
Explicación:
fuente
R , 87 bytes
n
Resultados dadosa(n)
Pruébalo en línea!
Todavía estoy trabajando en "Dada n salida a (1), a (2) ... a (n)". Pensé que podría modificar ligeramente este código, pero parece más difícil que eso.
fuente