62 votes

Comment cette regex trouve-t-elle les nombres premiers ?

Duplicata possible :
Comment déterminer si un nombre est un nombre premier avec regex ?

Cette page affirme que cette expression régulière découvre les nombres non premiers (et par contre-exemple : les nombres premiers) :

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

Comment cela permet-il de trouver des primes ?

10 votes

C'est pas un double. Il s'agit d'une regexp différente et d'une technique différente, et elle a de meilleures réponses, en plus.

2 votes

@bmargulies : Ce est une copie. La regex est la même, étant donné les restrictions de saisie de cette question et le fait que la méthode String.matches de Java fait correspondre la regex à la chaîne entière (donc ^ et $ sont implicites), ce qu'elle fait apparemment.

1 votes

@Rog - les réponses votées là-bas ne mentionnent jamais l'unaire.

98voto

Matchu Points 37755

Je pense que l'article l'explique assez bien, mais je vais également m'y essayer.

L'entrée est en unaire formulaire. 1 est 1 2 est 11 3 est 111 etc. Le zéro est une chaîne vide.

La première partie de la regex correspond à 0 et 1 comme non primaires. La deuxième partie est celle où la magie opère.

(11+?) commence par trouver des diviseurs. Il commence par être défini comme 11 ou 2. \1 est une variable se référant à cette correspondance précédemment capturée, donc \1+ détermine si le nombre est divisible par ce diviseur. ( 111111 commence par assigner la variable à 11 et détermine ensuite que les autres 1111 est 11 répétées, donc 6 est divisible par 2).

Si le nombre n'est pas divisible par deux, le moteur de regex incrémente le diviseur. (11+?) devient 111 et nous réessayons. Si, à un moment quelconque, la regex correspond, le nombre a un diviseur qui ne donne pas de reste, et donc le nombre ne peut pas être premier.

23 votes

C'est vraiment génial.

1 votes

Cette réponse est vraiment étonnante :)

6voto

Dan LaRocque Points 2923

Il m'a fallu une minute pour réaliser que c'est destiné aux nombres en base 1 (unaire ?).

Plusieurs personnes en cette discussion sur le ycombinator expliquent cela très bien. En fait, ces explications sont plus succinctes que ce que je pense pouvoir faire, je vais donc m'en remettre au lien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X