Cada palíndromo con un número par de dígitos es divisible por 11, por lo que 11 es el único [primo palindrómico] con un número par de dígitos. - David Wasserman, OEIS
Aprendí esto hoy de forma manual, antes de hacer mi investigación, cuando mi programa omitió números con un número par de dígitos (excepto 11) al calcular números primos palindrómicos. Su tarea: crear un programa o función que, cuando se le da una entrada entera N, genera el enésimo término en Stephen's Palindromic Sequence ™.
Secuencia Palindrómica de Stephen ™
Stephen's Palindromic Sequence ™ comienza con 11, y continúa con semiprimes palindrómicos divisibles por 11. Básicamente, todas las semiprimes que serían primos si 11 no "contaran". ¡Lo bueno es que esta lista contiene números con un número par de dígitos! Hurra. Y se omiten muchos números con un número impar de dígitos, ya que ya eran primos.
El comienzo de la secuencia:
1 : 11
2 : 22
3 : 33
4 : 55
5 : 77
6 : 121
7 : 737
8 : 979
9 : 1111
10 : 1441
11 : 1661
12 : 1991
13 : 3113
14 : 3223
15 : 3443
16 : 3883
17 : 7117
18 : 7447
19 : 7997
20 : 9119
21 : 9229
22 : 9449
23 : 10901
* Aunque 1331 (11 ^ 3) y similares se ajustan al espíritu de esta secuencia, no se ajustan a las reglas.
Casos de prueba más largos:
26 : 91619
31 : 103301
41 : 139931
51 : 173371
61 : 305503
71 : 355553
81 : 395593
91 : 725527
101 : 772277
127 : 997799
128 : 1099901
141 : 3190913
151 : 3739373
161 : 7589857
171 : 9460649
200 : 11744711
528 : 39988993
Entrada
Entero N,> = 1. Puede usar un N indexado a 0 (asegúrese de ajustar los casos de prueba) si así lo especifica en su respuesta. Nuevas líneas finales permitidas.
Salida
El enésimo término en Stephen's Palindromic Sequence ™. Nuevas líneas finales permitidas.
Reglas
- La única entrada que su programa / función puede tomar es N. Su programa no puede, por ejemplo, obtener una secuencia de OEIS (también conocido como lagunas estándar ).
- Debe poder imprimir una salida de hasta seis dígitos (N = 127). El tiempo no es un factor, sin embargo, si su programa / función se alarga mucho, debe probar que el algoritmo funciona. Si su idioma permite naturalmente salidas más largas, puede dejar que se expanda naturalmente hasta su límite, o limitarlo a diez dígitos, lo que prefiera. La salida / terminación más allá de su límite no importa, siempre que no parezca una salida válida.
- La función de programa / función en una entrada no válida es irrelevante.
Respuestas:
Jalea ,
1813 bytesPor alguna razón, esto es mucho más lento que mi revisión inicial, a pesar de hacer exactamente lo mismo.
Pruébalo en línea!
N = 127
Cómo funciona
fuente
Python 2 ,
767372706968 bytes¡Gracias a @WheatWizard por jugar golf en 3 bytes!
¡Gracias a @ ØrjanJohansen por jugar golf en 1 byte!
¡Gracias a @xnor y @ ØrjanJohansen por allanar el camino a 68 bytes!
La entrada está indexada en 0. Pruébalo en línea! o verificar los primeros 31 casos de prueba .
Antecedentes
Recordemos que el teorema de Wilson establece que para todos los enteros p> 1 ,
lo que significa que (p - 1)! + 1 es divisible por p si y solo si p es primo.
Si p> 1 no es primo, es compuesto; sea q el divisor primo más pequeño de p . Claramente, q ≤ p / q . Hay dos casos:
Si q = p / q , tenemos que p = q² .
Si q = 2 , (p - 1)! = 3! = 6 , entonces (p - 1)! es congruente con 2 módulo p .
Si p / q = q> 2 , entonces 2q <p . De esta manera, q y 2q están entre 1, ..., p - 1 , cuyo producto es el factorial de p - 1 , entonces 2p = 2q² = q · 2q divide (p - 1). igualmente.
Si q <p / q , q y p / q están ambos entre 1, ..., p - 1 , entonces p = q · p / q se divide (p - 1). igualmente.
Resumiendo,
para todos los enteros p> 1 .
Ahora, para todas las congruencias enteros y todos los números enteros a , b , y c , se cumple lo siguiente.
Cuando a = -1 , b = 11 y c = -1 , seguimos que
y, dado que 21 y -23 son congruentes módulo 44 y -1 y 11p-1 son congruentes módulo 11p , llegamos a la siguiente conclusión.
Para todos los valores posibles de p , el resultado ( 11 , 21 o 11p - 1 ) estará en el rango 0, ..., 11p - 1 , por lo que estos valores coinciden con los que devolverá el
%
operador de Python .Cómo funciona
Inicializamos c , k y m a 11 después de guardar la entrada en n . c será constante durante el resto del programa. Como hay tres ocurrencias de c en la siguiente línea y la asignación de c cuesta solo dos bytes, esto ahorra un byte. k puede pensarse en 11p usando el significado de p del párrafo anterior; inicialmente, k = 11 = 11 · 1! . m toma el lugar de 11 · (p - 1)! ; inicialmente, m = 11 = 11 · 0! . k y msatisfará la relación m = 11 · (k / 11)! en todo momento.
n representa el número de "palíndromos de Stephen" que tenemos que encontrar. Como k = 11 inicialmente, podemos generar k textualmente sin más cálculos. Sin embargo, cuando n es positivo, ingresamos al ciclo while. El ciclo comienza multiplicando m por k / c = p , luego sumando 11 a k , incrementando así p . Si k es un miembro de la secuencia, restamos 1 de n y comenzamos de nuevo. Una vez que n alcanza 0 , encontramos el miembro de secuencia en el índice deseado y salimos del bucle, luego imprimimos el último valor de k.
La expresion
realiza la prueba real, y su resultado ( Verdadero / 1 para miembros de secuencia, 0 / Falso de lo contrario) se resta de n . Como se vio antes, ~ m% k = (-m - 1)% k = (-11 · (p - 1)! - 1)% 11p es igual a 10 si p es primo, 21 si p = 4 y 11p - 1 > 43 si p> 4 es compuesto. Por lo tanto, después de restar c = 11 , nos queda -1 con primo p y un entero positivo mayor que 9 de lo contrario.
Para prime p ,
`k`[::-1]
nos da la representación de cadena de k con orden inverso de dígitos, por lo que la compara con`k`
cheques si k es un palíndromo. Si es así, se cumplen todas las condiciones yk es un miembro de secuencia. Sin embargo, si p no es primo, el paso de rango grande y el hecho de que k siempre tendrá más de un dígito significa que`k`[::-1]
no puede tener el mismo número de dígitos que`k`
, y mucho menos ser igual a él.fuente
Brachylog , 17 bytes
Pruébalo en línea!
Esto es 1 indexado.
Explicación
Dos realizaciones con esta respuesta:
⁽
) no funciona si no hay entrada para pasar (por eso tengo que agregar:I
).N
resultado de un predicado (lo que evitaría usarᶠ⁽t
y, por el contrario, por ejemploⁿ⁽
).Implementar ambos cambios haría que la respuesta sea de 14 bytes.
fuente
Mathematica,
6560 bytesItera directamente a través de primos usando
NextPrime
y comprueba si 11 veces el primo es un palíndromo Funciona hasta N = 528 . Los resultados 528 y 529 están separados por más de 2 16 primos, en cuyo punto//.
no se podrá intentar un número suficiente de sustituciones.fuente
Python 2 ,
111107103102101100919089 bytesDennis me ha golpeado aquí , así que ve a ver su respuesta.
Esta respuesta es cero indexada
Pruébalo en línea!
Un byte guardado gracias al adicto a las matemáticas
Explicación
Primero tomamos datos y lo configuramos para
n
que también hagamos una nueva variabler=1
. Seguiremosr
buscando palíndromos que sean producto de un primo y 11. Cada vez que encontremos uno disminuiremosn
hasta llegar a 0.Entonces comenzamos un ciclo:
Lo primero que hacemos es incrementar
r
También predefinimos una variable
c
como la representación de cadena der*11
Ahora queremos disminuir
n
si hemos encontrado ese número. Simplemente restaremos un booleano que representa si ser*11
ajusta al patrónr
. Si esto esFalse
así, restaremos cero y si esTrue
así, restaremos 1.Para calcular el booleano hacemos:
La primera parte
all
determinará sir
es primo. Multiplicamos el resultado porc
sir
es primo, esto solo será,c
pero sir
es compuesto, será""
la cadena vacía. Luego comparamos esto con loc[::-1]
que es lo contrario dec
. Sir
es primo yc
es un palíndromo, esto seráTrue
, si alguno falla, todo se evaluará como falso.Cuando
n
es cero, simplementeprint c
.83 bytes
Aquí hay una solución recursiva que es más corta pero desafortunadamente no cumple con las especificaciones porque alcanza el límite de recursión de Python demasiado rápido.
Pruébalo en línea!
fuente
05AB1E , 15 bytes
0 indexado.
Pruébalo en línea!
Explicación
fuente
Haskell ,
9490 bytesPruébalo en línea! Ejemplo de uso:
([n|n<-[0,11..],(==)=<<reverse$show n,3>2#n]!!) 127
.[0,11..]
construye la lista infinita[0,11,22,33, ...]
(el cero es necesario para hacer que la secuencia esté indexada en 1). Para cada unon
en esta lista, verificamosn==(read.reverse.show)n
sin
es un palíndromo.3>2#n
comprueba sin
tiene como máximo dos divisores primos. Debido an
que siempre es divisible por 11, no obtenemos primos reales sino solo semiprimes.Editar: ¡ Gracias a Ørjan Johansen por jugar al golf 4 bytes!
fuente
div n h
. Además, solo afecta la eficiencia, pero el primero2#
probablemente puede serloh#
.(==)=<<reverse$show n
Es más corto.PHP, 82 bytes
Pruébalo en línea!
fuente
$argn=81;
es la variable de entrada que está disponible en una versión de línea de comandosAxioma, 105 bytes
ungolf, código de prueba y resultados
Aquí g (700) = 92511529, entonces el límite sería> 700; ww (1000) = 703999307 pero usando nextPrime ()
fuente