web-dev-qa-db-ja.com

この正規表現はどのように素数を見つけるのですか?

可能性のある複製:
数値が正規表現を持つ素数であるかどうかを判断する方法?

このページ は、この正規表現が素数以外の数を発見すると主張します(反例:素数):

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

これはどのように素数を見つけるのですか?

56
Dinah

記事はそれをかなりよく説明していると思いますが、私もそれを手に入れます。

入力は nary 形式です。 1は1、2は11、3は111などです。ゼロは空の文字列です。

正規表現の最初の部分は、非素数として0と1に一致します。 2つ目は、魔法が始まる場所です。

(11+?)は、除数を見つけることから始まります。 11、または2として定義されることから始まります。\1は、以前にキャプチャされた一致を参照する変数であるため、\1+は、数値がその除数で割り切れるかどうかを決定します。 (111111は、変数を11に割り当てることから始まり、残りの111111の繰り返しであるため、6は2で割り切れる。)

数が2で割り切れない場合、正規表現エンジンは除数を増分します。 (11+?)111になり、再試行します。いずれかの時点で正規表現が一致した場合、数値には余りが生じない除数があるため、数値を素数にすることはできません。

88
Matchu

これがbase-1(単項ですか?)

このycombinatorの議論 の何人かの人々はこれを非常によく説明しています。実際、私が思うよりも簡潔な説明なので、リンク先にお任せします。

6
Dan LaRocque