A veces, al escribir un programa, debe usar un número primo por alguna razón u otra (por ejemplo, criptografía). Supongo que a veces, también necesitas usar un número compuesto. A veces, al menos aquí en PPCG, su programa tiene que poder manejar cambios arbitrarios. Y en circunstancias convenientemente diseñadas para hacer una pregunta interesante de PPCG, tal vez incluso los números que está usando tienen que ser resistentes a la corrupción ...
Definiciones
Un número compuesto es un número entero ≥ 4 que no es primo, es decir, es el producto de dos números enteros más pequeños mayores que 1. Un número compuesto resistente al bitflip se define de la siguiente manera: es un número entero compuesto positivo para el cual, si lo escribe en binario en el mínimo número posible de bits, puede cambiar uno o dos bits del número, y el número sigue siendo compuesto.
Ejemplo
Por ejemplo, considere el número 84. En binario, eso es 1010100
. Aquí están todos los números que difieren en no más de 2 bits de eso:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
La primera columna es el número en binario; La segunda columna es el número en decimal. Como indica la tercera columna, todos estos números son compuestos. Como tal, 84 es un número compuesto resistente a bitflip.
La tarea
Debe escribir uno de los siguientes tres programas o funciones, el que tenga más sentido para su idioma:
- Un programa o función que toma un número entero no negativo n como entrada y emite los primeros n números compuestos resistentes a los cambios de bits.
- Un programa o función que toma un número entero no negativo n como entrada, y genera todos los números compuestos resistentes a bitflip menores que n (o si lo prefiere, menor o igual que n , es decir, puede elegir si n está incluido en la salida si bitflip -resistente).
- Un programa o función que no recibe entrada y genera todos los números compuestos resistentes a los cambios de bit (Esto debe usar un mecanismo de salida capaz de producir resultados mientras el programa aún se está ejecutando, como imprimir en stdout, una lista diferida o un generador; no puede calcular la lista completa y luego imprimirla).
Casos de prueba
Aquí están los primeros números compuestos resistentes a bitflip:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Aclaraciones
- Son solo los números que produce los que tienen que ser resistentes a los bitflips. Esta no es una tarea para hacer que el programa los encuentre resistentes a los bitflips; use cualquier número en el programa que le guste.
- Los números que genera no tienen que ser resistentes a un bitflip en los "ceros iniciales"; imagine que los números se almacenarán en el mínimo número posible de bits, y solo esos bits tienen que ser inmunes al volteo. Sin embargo, los 1 bits iniciales en los números que genera tienen que ser inmunes a los cambios de bits.
- Use cualquier algoritmo que le guste que produzca el resultado correcto; No estás siendo marcado en eficiencia aquí.
- Si puede probar que hay muchos números compuestos resistentes a los bitflip, entonces a) se levantan las restricciones en el formato de salida, yb) se permitirá codificar la lista (aunque probablemente sea más detallado que solo calcularlo). Esta regla es principalmente para completar; No espero que sea relevante.
Condición de victoria
Este es el código de golf , así que, como siempre, más corto es mejor También, como de costumbre, la longitud del programa se medirá en bytes.
n
sin
es resistente a los cambios de bits? (es decir, ¿hacerlo "menor o igual que n"?)Respuestas:
Jalea , 20? 22 bytes
Pruébalo en línea!
Produce los primeros n de tales números.
Tal vez
;0
se pueda eliminar (sin él no verificamos si el número en sí es compuesto, ¿hay algún primo con todos los cambios de bits compuestos?)Tenga en cuenta que es no suficiente para realizar la prueba
not(any(is prime))
al conjunto de números de bit-volteado. También debemos probar que0
no está en el conjunto.Esto se debe a
0
que no es primo ni compuesto (1
también lo es, pero vea a continuación).La necesidad de verificar
0
puede verse en un contraejemplo:131136
( 2 17 +2 6 ) tiene el siguiente conjunto de cambios de bits:Todos los cuales, excepto los
0
compuestos, no0
son primos.1
también es no primo y no compuesto y podría aparecer en el conjunto. Sin embargo, si queremos, podemos dejar esto como si fuera un compuesto:todas las entradas menores o iguales que
3
(si se considera en absoluto) contienen un de0
todos modos (de hecho, todas menos que7
hacer).para alcanzar
1
en un bit, el número original debe tener la forma 2 k +2 0 , y si es mayor que3
, es decir, k> 1 , entonces podemos alcanzar3
cambiando el k- bit y estableciendo el 1- bit ( 2 1 +2 0 = 3 ).para alcanzar los
1
saltos de dos bits, el número original debe ser de la forma 2 k y, si es mayor de3
lo que podemos alcanzar, puede alcanzar2
dos saltos y2
es primo.Tal y como está el código está manejando tanto
0
y1
junto con el átomo de "insignificante",Ị
.¿Cómo?
fuente
;0
está ahí:Œċ
obtiene todos los pares desordenados con el reemplazo de los índices (J
), por lo que para 84, que tiene 7 bits, es 28 (incluidos los gustos de [1,1] para los cambios de bits individuales (del parte "con reemplazo"), no 29 (más ningún cambio)Brachylog ,
3238 bytesPruébalo en línea!
Esta es una función / predicado
↰₀
que devuelve un generador que genera todos esos números. (El enlace TIO solo imprime el primer número, para que algo sea observable. Sin embargo, ejecutarlo localmente ha producido muchos más).Ahora actualizado para manejar números que están dentro de dos bits de bits de 0 o 1 (que no son primos ni compuestos) correctamente.
Explicación
Predicador auxiliar
↰₂
(devuelve una lista que es igual a la entrada, excepto tal vez un elemento)Me encantaría si hubiera una manera más tersa de hacer esta recursión relativamente simple, pero no estoy seguro de que la haya todavía; Hay algunas características prometedoras en la especificación, pero están marcadas como no implementadas.
Programa principal
↰₀
fuente
JavaScript (ES6), 96 bytes
Un programa completo que solicita la cantidad de enteros coincidentes y los muestra uno por uno, usando
alert()
.A menos que su navegador esté configurado para usar Tail Call Optimization, esto eventualmente se interrumpirá debido a un desbordamiento de recursividad.
A continuación se muestra una versión no recursiva (102 bytes).
Suposición
Este algoritmo se basa en la suposición de que todos los números compuestos resistentes a bitflip son pares. Esto lleva a una simplificación bastante importante: en lugar de voltear cada par de bits posible, solo volteamos el bit # 0 y otro (o ningún otro bit) y verificamos que todos los números resultantes sean compuestos.
Sin embargo, no puedo encontrar ninguna prueba obvia de que en realidad no exista un número compuesto resistente a los bitflip. Resulta que nunca es el caso para números pequeños (verifiqué hasta 1,000,000), y parece que la probabilidad de encontrar uno está disminuyendo a medida que aumenta el número de bits (pero esto es básicamente mi intuición al respecto).
fuente
Jalea ,
2017 bytesPruébalo en línea!
Cómo funciona
fuente
Python 2, 113 bytes
(La segunda línea es una función sin nombre que devuelve una lista de todos los números compuestos resistentes a los bitflip que son menores que la entrada a la función).
La sintaxis
all(u%q for q in range(2,u))
evaluará aTrue
siempreu
que sea primo o menor o igual que2
, y de lo contrario evaluará aFalse
. (Es por aspiraciónTrue
siu
es menor o igual que2
).En otras palabras,
all(u%q for q in range(2,u))
es igual a0
si y solo siu
es compuesto.Si la entrada de la función es menor que
2
, entonces la función devuelve una lista vacía (como se desee). Entonces suponga que la entradaN
es al menos2
, y suponga1 <= n < N
. Para cada unok
de a0
travésn
(incluido), el código verificará sin
XOR'd conk
es compuesto, y también verifica sik
tiene como máximo dos1
en su representación binaria. Sin^k
es compuesto, o sik
tiene más de dos1
, entonces pasa al siguiente valor dek
. Si se hace a través de todos los valores dek
a0
través den
esta forma, entonces se incluyen
en la lista.Por otro lado, si hay un valor de
k
como máximo dos1
quen^k
no es compuesto, entoncesn
no está incluido en la lista.fuente
Perl 6 ,
8785 bytesDevuelve todos esos números que son más pequeños o iguales al número de entrada.
Cómo funciona
Para cada número n del 2 a la entrada, hace lo siguiente:
Genera todos los enteros no negativos que tienen la misma longitud de bit o menor que n .
Filtra los números de esta lista que tienen menos de tres bits establecidos (usando una expresión regular).
XOR's n con cada uno de esos números, produciendo todas las "mutaciones" válidas de n .
Solo permitamos que n forme parte de la lista de salida si ninguna de las mutaciones no es compuesta (se verifica tomando cada mutación x módulo una unión total de números entre 2 y x -1).
fuente
Mathematica, 115 bytes
14 byte guardado gracias a @MartinEnderMuy ineficiente porque genera todos los números hasta 2 ^ ceil (lg (n)).
El segundo código usa U + F4A1 (
Function
función)fuente
Floroid ,
95109 bytesDevuelve una lista de números resistentes a bitflip hasta
input - 1
. Maneja las situaciones nerviosas (0 y 1) también.Floroid es un idioma antiguo que he usado solo un par de veces. No lo he tocado durante mucho tiempo, de ahí el tamaño del programa.
Se traduce al siguiente código de Python, que creo que podría reducirse con recursividad.
Cada función utilizada aquí está predefinida en Floroid. Esta página contiene todas las funciones y sus definiciones.
fuente
MATL ,
30282726 bytesPruébalo en línea!
Emite todos los números compuestos resistentes a los cambios de bits hasta (e incluidos) n. Utiliza ideas de ambas soluciones Jelly: solo considera 0 como un problema no primo problemático; y genera una lista de números dentro de una distancia 2 primero, luego toma un xor.
Solución alternativa, por bucle (30 bytes):
Emite todos los números compuestos resistentes a los cambios de bits hasta (e incluidos) n.
fuente
CJam ,
3433 bytesCalcula todos los compuestos resistentes a los bitflip estrictamente menores que n .
Al igual que Jonathan Allan, no estoy seguro de si es realmente necesario verificar 0 bitflips. Si resulta que ningún número primo tiene todos sus resultados de bitflips en números compuestos,
0+
se puede eliminar.Pruébalo en línea!
Explicación
fuente
MATL , 29 bytes
Gracias a Jonathan Allan por una corrección.
Esto toma un número n y genera todos los números compuestos resistentes a los cambios de bits hasta n .
Cómo funciona
¡Pruébalo en MATL Online!
fuente