転置原理の競プロでの使い方について考えたことを雑に並べた。 普段なら Twitter に書いているような内容だが、長かったので。
転置原理
非常に雑に言うと、以下のような定理である。
を 行列とする。「任意の 次元ベクトル を入力とし、 を計算する」ことができるアルゴリズムがあるなら、同じ時間計算量で「任意の 次元ベクトル を入力とし、 を計算する」ことができるアルゴリズムがある。 アルゴリズムを具体的に構成することも出来る。
ただし、アルゴリズム内で使える操作に制限があったり、同じ時間計算量と言っても くらいの違いはあったりする。 丁寧な説明は https://qiita.com/ryuhe1/items/c18ddbb834eed724a42b この記事などを読むと良い。
競プロにおける使われ方
計算したい 次元ベクトル が、 行列 と 次元ベクトル を用いて と表せるとする。 このとき、 を入力として を計算するアルゴリズムが発見できれば、転置原理から を入力として を計算するアルゴリズムが存在し、 を入力すれば が計算できる。 実は、 の計算は難しいが の計算は簡単であるというような例がいくつも存在するので、この議論は有用である。
考えたこと
をどのように取るかというのは一意ではないので、どう取ると良いのか?という疑問が生まれる。 要件は が高速に計算できるようなアルゴリズムを思いつけることである。 そこで、 がそのような要件を満たすと仮定する。 すると、実は もまた要件を満たすように思われる ( を 行列、 を 次元ベクトルと見做している)。 が高速に計算できるのだから、 も高速に計算できることになるからである。 結局、競プロにおける転置原理の利用は以下のように言い換えても良さそうに思えてくる。
計算したいベクトルを とする。 を入力として を高速に計算できるなら、 は高速に計算できる。
では、この特殊化された転置原理だけがあれば良いかというと、それも違うかもしれない。 まず、 を高速に計算する時、 を直接求めて内積を取ることはできない。 を求めること自体が目的だったからである。 転置原理の適用条件の都合上、 を掛ける操作は何らかの線形変換の繰り返しによるものとなる。 すると と計算しているのだが、計算結果がスカラーになるから は行ベクトルである。 とおけば、これは と表示していることに他ならない。 よって、結局は特殊化されていない転置原理に戻ってきてしまう。
多点評価とその転置を例にして試してみる。 を で評価することを考える。 これに特殊化された転置原理を適用してみると、以下のような問題を考えることになる。
に対し、 を求めよ。
この問題の (多点評価を直接使わない) 解法は以下のようになる。
各 に対して を計算する。 これは であるから、分数式の和の計算をして各係数を見ればよい。 最後に、それらに を掛けて足し合わせると答えを得る。
正直、これを思いつくのは難しい気がする。 一方で、これは多点評価を と定義される行列とベクトルの積で表現して、特殊化されていない転置原理を適用していると理解できる。 私が個人的に解いてきた転置原理を利用する問題は、多くはこのパターンだったと思う。つまり、
を求めたい答えとして、 を計算しようとすると、結局 という表現を経由することになる。 そのような は様々なものが考えられるが、明らかに自然な表現が つあり、それが の計算にも役立つ。
しかし Bostan-Mori 法を転置した問題では、そのような自然な表現が無い *1。 結局、転置原理において特殊化されたものとされていないもののどちらを考えるべきかというのはよく分からない。
*1: 表現はできるのだが、問題設定から自然に思いつけるものではないと思う