109. 一次合同方程式を拡張ユークリッド互除法で解く
一次合同方程式 を解くことを考えます。競技プログラミングでは稀に必要となる知識で、たとえば以下のような問題で要求されます。
この記事では、
- 【理論編】一次合同方程式 の解の個数
- 【実装編】拡張ユークリッド互除法による一次合同方程式の解き方
という流れで記述します。
【理論編】一次合同方程式 の解の個数
まずは結論から。
一次合同方程式 は、 として、
- が の倍数でないなら解を持たない
- が の倍数であるなら 個の解を持つ
証明
(1) のとき唯一の解が存在することについて
とする。
を、 を法とする剰余系として定める。このとき、 も を法とする剰余系となる。
なぜなら、 となるとき、 は互いに素なので両辺を で割って となり、これは と同値であるため。
よって、任意の に対して となる が唯一存在する。
(2) が の倍数でないとき解が存在しないことについて
に解があると仮定すれば、( は整数)と表せる。変形して とする。
として、 とおくと、 と表せる。つまり、 は の倍数となる。
よって、 が の倍数でないなら、背理法的に解は存在しない。
(3) が の倍数のとき解が 個存在することについて
(2) の議論の続きで、 が の倍数として、 とおく。あらためて式を整理すると、
ここで、 はその作成方法から互いに素。よって、 の解について、(1) より なる ()が唯一存在し、( は任意の整数)と表せる。
ここから、元の方程式の解の個数を考える。
が を法として合同となるのは、ある について、 となるとき。つまり、 となるときで、すなわち、( は整数)であるとき。
このとき、
すなわち、 が を法として合同となるのは、 に対して を法として合同な整数を与えたときであり、よって解は 個存在する。
(証明終わり)
【実装編】拡張ユークリッド互除法による一次合同方程式の解き方
まず、( は整数)を満たす を求めたいので、 として、 と置いて を考えてもよいです。以降、この操作を行った後と考え、 であるとします。
を解きたいので、 の逆元 を考えます。 は素数であるとは限らないので、フェルマーの小定理による逆元導出は使えません。
ここで、逆元を導出するための一次合同方程式は と表せます。先程の証明 (2)(3) より、逆元が存在するためには であることが必要です。よって、 のとき、解は存在しません。
さらに式を変形すると、
となり、これは拡張ユークリッド互除法により解けます。
拡張ユークリッド互除法
今回はだいぶ説明を省略して書きます(いずれ丁寧目な記事を出したいです)。
とします。上の式は求めたい一次不定方程式、下の式は を表しています。下の式を上の式に代入して、
です。なお、ユークリッド互除法より です。変形後の式の形に注目すると、元々の一次不定方程式と同じ形をしています。一段階変形した後の に相当する変数を と置くと、
となります。ここから、再帰的に解を求めることができます。
ユークリッド互除法と同様の操作のため、計算量は です。