web-dev-qa-db-ja.com

5で割り切れる2進数の正規表現

5で割り切れる2進数の正規表現を書きたい。
2で割り切れる2進数と3の正規表現はすでに実行しましたが、5の正規表現が見つかりませんでした。

助言がありますか?

9
The Beast
2^0 =  1 =  1 mod 5
2^1 =  2 =  2 mod 5
2^2 =  4 = -1 mod 5
2^3 =  8 = -2 mod 5
2^4 = 16 =  1 mod 5
2^5 = 32 =  2 mod 5
   ...     -1 mod 5
   ...     -2 mod 5

したがって、1、2、-1、-2のパターンがあります。数字の符号のみが交互になる2つのサブパターンがあります。nを数字とし、最下位桁の数字を0とします。奇妙なパターンは

(-1)^(n)

そしてパターンさえ

2x((-1)^(n))

それで、これをどのように使用するのですか?

元の数を100011とし、数の桁を偶数と奇数の2つの部分に分割します。各パーツの桁を個別に合計します。奇数桁の合計に2を掛けます。ここで、結果が偶数桁の合計で割り切れる場合、元の数値は5で割り切れます。それ以外の場合は割り切れません。例:

100011
1_0_1_ 1+0+1 = 2
_0_0_1 0+0+1 = 1; 1x2 = 2

2 mod(2) equals 0? Yes. Therefore, original number is divisible.

正規表現内でそれを適用する方法は?正規表現内で callout 関数を使用すると、適用できます。コールアウトは、正規表現のパターンマッチングの途中で、スクリプトに一時的に制御を渡す手段を提供します。

ただし、ndnの回答の方が適切で簡単なので、彼の回答を使用することをお勧めします。

1
ferit

ただし、「^(0 | 1(10)*(0 | 11)(01 * 01 | 01 * 00(10)*(0 | 11))1) $」は空の文字列に一致します。

0
user2742080