5で割り切れる2進数の正規表現を書きたい。
2で割り切れる2進数と3の正規表現はすでに実行しましたが、5の正規表現が見つかりませんでした。
助言がありますか?
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の回答の方が適切で簡単なので、彼の回答を使用することをお勧めします。
ただし、「^(0 | 1(10)*(0 | 11)(01 * 01 | 01 * 00(10)*(0 | 11))1) $」は空の文字列に一致します。