Black box linear algebra
Latest Author
はじめに
この記事では、競技プログラミングにおいて使える Black box linear algebra, 特に Wiedemann [1] によるアプローチのテクニックについていくつか書きます。
この記事はCompetitive Programming Advent Calendar 2015の4日目の記事です。
導入
競技プログラミングにおいて、数え上げ問題は1つの大きなジャンルです。 多くの場合、などの数で割った余りを求めることを行います。今回は、特に素数による剰余を取る場合について考えていきます。
数え上げ問題の解法には多くの種類がありますが、その中でも大きなものとしてあるのは行列を用いた解法です。線形代数を用いているとも言えるでしょう。 そのような例として、今回は以下の2つを取り上げます。
行列累乗によるDPの高速化
行列累乗は数え上げ問題で非常によく用いられるテクニックです。 状態遷移を行列として表することでDPを表現します。 つまり、初期状態をベクトル, 遷移行列をとしたとき、回遷移した後の状態はとして表現できます。 バイナリ法により累乗することにより、行列サイズをとしたとき時間で答えを求められます。
行列累乗は様々な特殊ケースにおいてさらに高速化ができることがあります。 たとえば行列が巡回行列である場合、そのような行列同士の掛け算は時間(または高速多項式乗算を用いてその計算量)で求めることができ、 また巡回行列同士の積は巡回行列であるので合計時間で実行できます。 三角テプリッツ行列の場合でも同じように高速化できます。
今回は、高速に行列累乗ができるクラスを上記の特殊ケースたちから大きく広げ、一般の場合の行列累乗をも高速化できるテクニックを紹介します。
行列式を求める問題
競技プログラミングにおいて、行列式が必要になることはよくあります。 これは準同型写像であり、非常に基本的なものであるといえ、応用も数えきれないほどあります。 そのため、それを使う問題が多くあることは驚くことではないでしょう。
たとえば、行列木定理と呼ばれる定理は、 グラフが与えられたとき、全域木の個数を行列式を用いて求められると述べています。 非自明な数え上げを多項式時間で行ってしまうというのだから行列式の力の大きさがわかるでしょう。
の行列の行列式はガウスの消去法を用いて時間で求めることができます。 より高速にできる特殊ケースとしては、重対角行列の場合時間でガウスの消去法を実行できます。
今回は、他の大きなクラスにおいて計算を高速化させます。
準備
線型漸化列とその最小多項式
を体上のベクトル空間とする。 上の無限列が線型漸化的であるとは、 ある上の多項式が存在し、全てのに対してとなることをいう。 このとき、がをannihilateしていると呼ぶ。
をannihilateする多項式の集合はイデアルを成す。 多項式環はPIDなので生成元が存在するが、零イデアルでないならそのうちleading係数が1のものが唯一に決まり、それをの最小多項式と呼ぶ。 ただし、零イデアルが生成される場合を最小多項式とする。そうでない場合を線型漸化的であると呼ぶ。
を2つのベクトル空間上の線形写像とすると、の最小多項式はの最小多項式の約数である。
行列の最小多項式と特性多項式
正方行列に対し、列を考える。 この列の最小多項式を行列の最小多項式と呼ぶ。
正方行列の特性多項式はとして定義される。ここでは多項式の変数。 をの大きさとするとき、であることを確認しておく。
ケイリー・ハミルトンの定理は、 は線型漸化的であり、最小多項式は特性多項式の約数であると述べている。 また、大きさの行列の最小多項式の次数は以下であることは帰結である。
行列のある固有値とそれに対応する固有ベクトルをとしたとき、 多項式に対しであることが確認できる。つまり、をannihilateするに対し、全ての固有値はの根となる。 また、最小多項式が特性多項式の約数であることと組み合わせると、最小多項式と特性多項式の根の集合は一致するということが言える。
最小多項式を求める
最小多項式はどうやっても求めればいいのだろうか? そもそも、無限列は普通には入力できない。 そこで、最小多項式の次数の上限と列の先頭要素を入力することにする。 先頭要素から最小多項式が一意に求められることは、以下のアルゴリズムと一緒に構成的に証明される。
体上の場合
入力列がある体の要素である場合を考える。 この場合、拡張ユークリッド互除法やBerlekamp–Massey algorithmを用いて 時間で求めることができる。詳細は文献を参考のこと。 なお、後者のアルゴリズムの実装は非常に簡単である。
ベクトルの場合
次に、入力列がある体のベクトルの要素である場合を考える。 まず、の有限部分集合を取り、そのから一様ランダムに要素を選びベクトルとする。 そしてとして新たな上の列を計算する。 このときの最小多項式が高確率での最小多項式と一致するというのが重要な定理である。詳細は割愛する。 合計時間となる。
行列の場合
最後に、行列の最小多項式を求めることを考える。 この場合、上の場合と同じように、ランダムなベクトルを取って列を求め、 その列に対して上記のアルゴリズムを適用することにより、これもまた高確率での最小多項式を求められる。 各に対しを求めるのに行列乗算は必要なく、あるベクトルとの乗算のみでよいことに注意する。 ここで、ベクトルとの乗算に時間かかるとすると、合計時間で最小多項式が求められた。
最小多項式の応用
行列累乗の高速化
行列, ベクトル, 自然数に対し、が求めたいのであった。 ここで、上記で述べたとおり列が線型漸化的であることに注目する。
まず、列の最小多項式を求める。すると、問題は線型漸化式の第項を求めるものとなる。 ここで、多項式を使うテクニックたちに書いてある方法が使える。 その方法を用いをの線型和で表せば、単純に求めた初項と掛けあわせればよい。 ベクトルとの乗算を時間で求められるとすると、合計時間で実行できる。 ここで、は多項式乗算の時間計算量を表す。
上記の計算量は、一般の場合の場合でもとなり、高速化となっている。 また、巡回行列や(三角とは限らない)テプリッツ行列の場合はとなる。 さらに、スパースな行列で非0要素が個のものの場合、ベクトルにそれを乗算することは時間で可能なので、で計算できることとなる。 DPの高速化の場合、遷移行列がスパースである場合は多い。
行列式を高速に求める
サイズの正方行列が与えられたとき、行列式を求めたいのであった。 行列式はであることを思い出すと、の特性多項式を求められればいいこととなる。
もしの最小多項式の次数がであれば、それは特性多項式と一致する。 また、上記のとおりそれらは根の集合が一致する。 しかし最小多項式の次数はより小さくなることがある。 アイデアは、に前処理を行うことで最小多項式と特性多項式を一致させるというものである。
まず、である場合、特性多項式と最小多項式は共にを根に持つということになるため、それにより判定できる。 が非特異行列であると仮定する。 をランダムに選んだとなる対角行列とする。このとき、の最小多項式は高確率で次数となるというのが重要な補題である。割愛する。 これによりの最小多項式を求め、それからを求め、で割れば答えが出る。
ベクトルとの乗算を時間で求められるとすると、ベクトルとの乗算は時間で求められるので、合計時間で行列式が求められる。
終わりに
Black box linear algebra
上記の例では、実際には行列は明示的に与えられなくてもよいことに注意する。 つまり、ベクトルを入力としてある行列を掛ける(別の言葉で言うと、線形変換を行う) 「ブラックボックス」さえ入力されれば、その中身に関係なくアルゴリズムは実行できるということである。 このような線形代数のアルゴリズムを"Black box linear algebra"と呼ぶ。
上記で紹介した以外にも様々なアルゴリズムが発見されている。 例えば、線形方程式も、同じようなアプローチで高速に解くことができる。
結論
今回は非常に幅広い計算問題を高速化する方法を紹介した。 競技プログラミングにおいても線形代数を使う問題は豊富にある。 たとえこの方法が想定解でなかったとしても使える場面は多いだろう。 是非活用していただきたい。