Как это регулярное выражение находит простые числа?
Возможный дубликат:
Как определить, является ли число простым с регулярным выражением?
На этой странице утверждается, что это регулярное выражение обнаруживает не простые числа (и контрпримером: простые числа):
/^1?$|^(11+?)\1+$/
Как это найти простые числа?
2 ответа
Я думаю, что статья объясняет это довольно хорошо, но я попробую свои силы в этом также.
Ввод в унарной форме. 1 является 1
2 является 11
3 является 111
и т. д. Ноль - пустая строка.
Первая часть регулярного выражения соответствует 0 и 1 как непростая. Во-вторых, где волшебство начинает действовать.
(11+?)
начинается с поиска делителей. Начинается с того, что определяется как 11
или 2. \1
переменная, ссылающаяся на ранее записанное совпадение, поэтому \1+
определяет, делится ли число на этот делитель. (111111
начинается с присвоения переменной 11
, а затем определяет, что оставшиеся 1111
является 11
повторяется, поэтому 6 делится на 2)
Если число не делится на два, механизм регулярных выражений увеличивает делитель. (11+?)
становится 111
и мы попробуем еще раз. Если в любой точке регулярное выражение совпадает, число имеет делитель, который не дает остатка, и поэтому число не может быть простым.
Мне потребовалась минута, чтобы понять, что это предназначено для чисел в base-1 (унарный?)
Несколько человек в этом обсуждении ycombinator объясняют это довольно хорошо. На самом деле эти объяснения более краткие, чем я думаю, что я могу получить, поэтому я оставлю это по ссылке.