書き込みの小数展開のため(なし有力で0
)。ましょうとbが付き整数、可能> 0。倍数の小数展開の言語を検討プラス定数を:
ある、通常の?コンテキストフリー?
(アフィン関数のグラフの言語と対比)
これは良い宿題の質問になると思います。ヒントやヒントから始めて、質問の解決方法だけでなく、使用するテクニックの決定方法も説明する回答をいただければ幸いです。
書き込みの小数展開のため(なし有力で0
)。ましょうとbが付き整数、可能> 0。倍数の小数展開の言語を検討プラス定数を:
ある、通常の?コンテキストフリー?
(アフィン関数のグラフの言語と対比)
これは良い宿題の質問になると思います。ヒントやヒントから始めて、質問の解決方法だけでなく、使用するテクニックの決定方法も説明する回答をいただければ幸いです。
回答:
非常に単純:数値が10進数で書かれていると仮定します(他の底は些細な変更によって処理されます)。で、DFAを構築する状態0、1、...、- 1。開始状態は0であり、入力qから入力dは状態(10 q + d )mod aになります。受け入れ状態はb mod aです(b > aの場合は微調整が必要になる場合があります)。
定期的です。任意のベースに一般化されますバイナリでみましょう最初の仕事、> 1.レッツ当該の言語であること。a = 1、b = 0の場合
上のすべての文字列である正規ある先行ゼロではないが、(それのための正規表現を構築します)。
今、任意のために、B、まだ0我々が得るとともに、M 、0からM 1 、0で数値的に乗算しては、それは、変換を行う、あるˉ X → ¯ A Xの各列のM 、0を。すなわち、シフトとの添加の順序によって、ビット単位を行うことができるX固定文字列のビットに依存しますˉ。必要な2つの変換は次のとおりです。
である ˉ X → ˉ X 0
そして
右側に0を連結すると、規則性が明らかに保持されます。したがって、2番目の操作で規則性が保たれることを証明するだけで済みます。それを行うための方法は、に取り組んで有限状態トランスデューサである、右から左へ。これが最も難しいステップです。状態を使用するのではなく、疑似コードプログラムといくつかの有限の補助メモリ(ビット変数など)を使用することをお勧めします。メモリがすべての入力にわたって固定サイズであり、厳密に右から左にスキャンする限り、それは有限状態変換であり、規則性を維持します。
最後に、取得するにはからM 、0我々は数値的に追加する必要がBの各文字列に、それは同様のトランスデューサで行うのTのB固定番号Bに依存します。
任意のベースで同じことを行うには、dに依存するトランスデューサーS dを使用して、そのベースで1桁のを乗算する方法をさらに示します。これにより、多桁の数字を掛けても、通常の言語のままです。または、dによる乗算は単に繰り返し加算されると言うことで、これを巧みに行うことができます。
ヒントだけが欲しかった。これらの各ステップは、かなり複雑な定理/手法に依存しているため、完全な証明を得ることを証明することは追加の作業になります。
ヒント#1:最初に、最も重要度の低いビットが最初に表示されるときに、「3で割り切れる数値の10進数/ 2進数表現を認識するオートマトンを作成する」というより一般的な問題を解決します。
中級質問:それを証明する規則的です。
#2ヒント:関数のグラフ "モジュロA "は有限です。数字のセットとオートマトンの言語の両方である{ 0 、… 、9 }の各dについてそれを計算できます。
#3のヒント:今、置き換えとX ∈ Nを。これは何が変わりますか?通常の言語は、アドホックなオートマトンを構築する代わりに、交差によって安定しているという事実を使用してみてください。
#4のヒント:今仮定する素数(したがってことであるZ / Zのフィールドである)、我々はケースに残っていることをX ∈ Z。ここで、最初のビットが最上位ビットである表現を使用します。同じ方法でオートマトンを作成できますか?
ヒント#5:言語が正規であることを証明するために、常にオートマトンを構築する必要はありません。以前の結果を使用して、が正則であることをどのように証明できますか?(最上位ビットが最初)
私は@vonbrandのアイデアに従っています:
ヒント1:
最初に解きます。Myhill-Nerode定理を使用できます。
私たちは、次のような関係を定義。これは明らかに等価関係です。我々は桁追加した場合ので、それは、右合同である dは我々が得る ˉ のx ≈ ˉ yの。Lは等価クラス[0]なので、最後にLを飽和させます。≈には有限数のクラスがあるため、Myhill-Nerodeの定理により、規則的であることがわかります。関連するFSAは最小限であり、状態があります。
ヒント2:
一般的なケースを解決し、ケースによって引き起こされるオートマトンを再利用します。
言語は定期的です。
ヒント: ナインをキャストアウトする
最後の桁数は有限であることに注意してください。
便利なテクニックを使用することに注意してください。この証明では、3つの主要な基本技法(正規表現、有限オートマトン、集合論的プロパティ)がすべて示されています。
は通常です。そしてそれが有限集合で、その言語の和集合であるので、そのために規則的です。したがって、証明を結論付けるには、とが規則的であることを証明するだけで十分です。
から始めましょう。つまり、法とする数値です。10進展開がである整数は、最後の桁で特徴付けられます。これは、桁をさらに左に変更すると、倍数が追加されることを意味するためですの倍数である。したがって、ここで、はすべての数字のアルファベットであり、は長さ有限の単語のセットであり、は通常の言語です。
ここでに目を向けます。つまり、がと素素で法と数値です。もし次に、全てナチュラルズの小数展開の集合である、すなわち、であり、通常の言語。ここでと仮定ます。ましょう。フェルマーの小さな定理により、、つまりが割り算することになります。次のように、を認識する確定的有限オートマトンを作成します。
単語から到達した状態は、満たします および。これは、オートマトンの遷移に従って、単語の帰納法によって証明できます。遷移は、という事実を使用して、このために計算されます。したがって、オートマトンは形式の数値の10進展開(初期ゼロを許可)を認識します。以来オートマトンは、数値の小数展開に等しい認識モジュロであり、初期のゼロを可能にします b a ′ 0 ∗ M ′ M ′ = (0 ∗ M ′)∩ ((ℵ ∖ { 0 } )ℵ ∗)。したがって、この言語は規則正しいことが証明されています。最後に、は通常の言語です。
以外のベースに一般化するには、上記のとベースのすべての素因数で置き換えます。2 5
読者のための演習として、お気に入りの定理証明者に任せてください。