2010-07-21 28 views
45

Duplicar posible:
How to determine if a number is a prime with regex?¿Cómo funciona este regex encontrar primos?

This page afirmaciones de que esta expresión regular descubre los números no primos (y por contra-ejemplo: los números primos):

/^1?$|^(11+?)\1+$/ 

¿Cómo funciona este hallazgo primos?

+8

Esto es ** no ** un dup. Es una expresión regular diferente y una técnica diferente, y tiene mejores respuestas, para arrancar. – bmargulies

+0

@bmargulies: Este * es * un tonto. La expresión regular es la misma, dadas las restricciones de entrada en esta pregunta y que el método String.matches de Java coincide con la expresión regular frente a toda la cadena (por lo tanto^y $ están implícitos), lo que aparentemente hace. –

+1

@Rog - las respuestas vertidas por encima nunca mencionan unary. – bmargulies

Respuesta

76

Creo que el artículo lo explica bastante bien, pero voy a intentarlo también.

La entrada está en unary formulario. 1 es 1, 2 es 11, 3 es 111, etc. Zero es una cadena vacía.

La primera parte de la expresión regular coincide con 0 y 1 como no primo. El segundo es donde entra la magia.

(11+?) comienza por encontrar divisores. Comienza definiéndose como 11, o 2. \1 es una variable que se refiere a la coincidencia capturada anteriormente, por lo que \1+ determina si el número es divisible por ese divisor. (111111 se inicia mediante la asignación de la variable a 11, y luego determina que el 1111 es 11 restante repiten, por lo 6 es divisible por 2.)

Si el número no es divisible por dos, el motor de expresiones regulares incrementa el divisor. (11+?) se convierte en 111, y lo intentamos de nuevo. Si en algún momento la expresión regular coincide, el número tiene un divisor que no produce ningún resto, por lo que el número no puede ser primo.

+21

Esto es malditamente brillante. –

+1

esta respuesta es realmente increíble .. :) – espongha

6

Me tomó un minuto para darse cuenta de esto está dirigido a los números en la base-1 (unario?)

Varias personas en this ycombinator discussion explican esta bastante bien. En realidad, esas explicaciones son más sucintas de lo que creo que puedo obtener, así que lo dejo al enlace.