Hatena::Grouptopcoder

pepsin-amylaseの日記

 | 

2013-12-03競技プログラミング アドベントカレンダー Div.2013 3日目

連立一次方程式と線型代数

20:43

つぎのような連立一次方程式を考えます。

\{_{2x+3y=7}^{x+2y=4}

もちろんみなさんは解けますよね?

上の式の 2 倍を下の式から引いて

\{_{-y=-1}^{x+2y=4}

下の式を -1 倍して

\{_{y=1}^{x+2y=4}

下の式の 2 倍を上の式から引いて

\{_{y=1}^{x=2}

このように項を消して整理していくことで解を得ます。

実はこの連立一次方程式は行列の形て次のように書きなおすことができます。

\left( \begin{array}{cc} 1 & 2 \\ 2 & 3 \end{array} \right) \cdot \left( \begin{array}{c} x \\ y \end{array} \right) = \left( \begin{array}{c} 4 \\ 7 \end{array} \right)

実際に成分を計算することでもとの連立一次方程式と同値であることがわかります。

一般に n 元 m 連立の一次方程式は m 行 n 列の行列を用いて書きなおすことができます。各行がひとつの等式に対応します。

掃き出し法

このように書きなおした行列の方程式についても、冒頭で項を消して整理するのと同じ操作をすることで解くことができます。これがいわゆる掃き出し法です。蟻本にも載っていますし、ライブラリとして持っている方も多いかと思います。

典型的な実装は、係数行列に定数ベクトルの列を追加した拡大係数行列に対して掃き出していくものです。蟻本の実装もそうなっています。

例題 Find the Outlier

掃き出し法をもちいて、昨年度のアジア地区予選の問題を解いてみましょう。

問題はこちらです。no title

問題概要

ある d 次多項式 f が存在し、入力として f(0), f(1), ..., f(d+2) が与えられる。ただし、入力のうちちょうど1つは誤った値である。誤った値がどれであるか指摘せよ。

解法

f(x) = \sum_{i=0}^{d}a_{i}x^{i}

とおくと、入力の各値を用いてa_{i}に関する連立一次方程式を立てることができます。これを用いると f を決定することができますが、このとき入力値の選び方により2通りの場合にわかれます。

  • 使った入力値が全て正しいとき、残り2つのうち正しい方は決定した f で再現できるが、もうひとつの間違った方は再現できない。
  • 使った入力値に間違った値が含まれているとき、残り2つの値はともに正しく再現できない。

前者は自明ですね。では後者について証明しましょう。d 次多項式は通る d+1 点を指定すると一意に定まるという定理 *1 を用います。残った値が正しく再現できているとすると、構成した多項式と使った入力値のうち正しいものと再現しようとした点を用いて決まる多項式は同一となるはずですが、前者はもとの f とは異なるものに一意に定まっているはずで後者は f にほかならないので矛盾します。

この事実を用いて、各点を外して連立一次方程式を立てることを繰り返せば解けます。

*1:相異なる d 次式 f, g が条件を満たすとすると f(x) = g(x) は d+1 個の解を持つはずだが、この方程式はたかだか d 次であり、解をたかだか d 個しか持たないので矛盾。

 |