Question Méthode Ruby isPrime


('1' * N) !~ /^1?$|^(11+?)\1+$/

Sur le net, j'ai trouvé ce code Ruby qui fonctionne pour N> = 0 qui détermine si N est un nombre premier. D'après ce que je peux dire, cela ressemble à jouer avec regex mais je n'ai aucune idée de la façon dont cela fonctionne. Quelqu'un pourrait-il me dire comment ça marche?


24
2017-09-29 01:47


origine


Réponses:


Vous pouvez trouver une longue explication de ce code ici: http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/


25
2017-09-29 01:53



Ceci est probablement plutôt hors sujet, mais dans Ruby 1.9, vous pouvez le faire:

 require 'mathn'
 38749711234868463.prime?
 => false

20
2018-01-18 19:58



require 'prime'

Prime.prime?(4)
# => false

Prime.prime?(5)
# => true

Ou:

require 'prime'

Prime.instance.prime?(4)
# => false

Prime.instance.prime?(5)
# => true

3
2018-04-01 08:44



Voir également Quelle est la regex la plus brillante que vous ayez jamais utilisée? (et oui, je peux confirmer que cette expression rationnelle a été écrite à l'origine par Abigail. Je l'ai même entendue expliquer comment cela fonctionne :)


2
2017-09-29 07:55



Le plus grand diviseur commun (gcd):

/^(1+)\1*=\1+$/.match('1' * x + '=' + '1' * y)[1].length

Cela et le is_prime on travaille à peu près de la même manière. Il essaye toutes les combinaisons avant d'abandonner.

Celui-ci essaiera de diviser le premier nombre en parties égales et de faire correspondre le deuxième nombre avec une ou plusieurs de ces parties. S'il trouve une correspondance, il renvoie la longueur de la partie sélectionnée.


1
2017-09-29 07:42



Encore un autre blog avec une très bonne explication: Célèbre Perl One-Liners Explained (partie III)


1
2018-01-18 20:35



Si la longueur d'une chaîne de 1 est composée, alors la chaîne peut être décomposée en plusieurs sous-chaînes identiques, comme 111111 -> 11 11 11

Par exemple, 1111111111 a 10 1 et correspond à (11) {5} ou (11111) {2}, où {2} signifie répété 2 fois. 111111111, a 9 1 et correspond à (111) {3}.

En généralisant le nombre de 1 et le nombre dans {}, l'expression rationnelle est /(1{2,}){2,}/. Cependant, 1 {2,} peut également être écrit en tant que 11+, et (...) {2,} peut être réécrit en tant que (...) \ 1+, avec des références arrière.

le ^1?$ participer aux premiers contrôles d'alternance pour 0 et 1 cas.


1
2017-11-13 20:52