Как это регулярное выражение находит простые числа?

Возможный дубликат:
Как определить, является ли число простым с регулярным выражением?

Эта страница утверждает, что это регулярное выражение обнаруживает не простые числа (и по встречному примеру: простые числа):

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

Как это найти простые числа?

Ответ 1

Я думаю, что статья объясняет это довольно хорошо, но я тоже попробую ее.

Вход находится в форме unary. 1 - 1, 2 - 11, 3 - 111 и т.д. Zero - это пустая строка.

Первая часть регулярного выражения соответствует 0 и 1 как неглавная. Второй - это то, где волшебство срабатывает.

(11+?) начинается с нахождения дивизоров. Он начинается с определения 11 или 2. \1 - это переменная, относящаяся к ранее зафиксированному совпадению, поэтому \1+ определяет, делится ли этот делитель на этот делитель. (111111 начинается с назначения переменной 11 и затем определяет, что оставшийся 1111 является 11 повторен, поэтому 6 делится на 2.)

Если число не делится на два, механизм регулярных выражений увеличивает делитель. (11+?) становится 111, и мы снова пытаемся. Если в любой точке регулярное выражение совпадает, число имеет делитель, который не дает остатка, поэтому число не может быть простым.

Ответ 2

Я понял, что это предназначено для чисел в базе-1 (унарный?)

Несколько человек в это обсуждение ycombinator объясняют это довольно хорошо. На самом деле эти объяснения более сжатые, чем я думаю, я могу получить, поэтому я оставлю его по ссылке.