きたまさ法に関する記事です. よすぽさんの記事 を参照して書きました.

問題設定

整数 d0,,dk1a0,,ak1 が与えられている. 漸化式 an+k=d0an++dk1an+k1 で定義される数列の anO(k2logn) で求める.

行列

A=[dk1d01000010]

とすれば,

[anank+1]=Ank+1[ak1a0]

なので,An が計算できれば良い.あるいは,An の最上行だけでも良い. 計算量が O(k2logn) で押さえられて欲しいが, 普通の行列累乗だとO(k3logn) になる.

計算

yi たちを行ベクトルとする.d=[dk1,,d0] とする. また,sft([z0,,zk1])=[z1,,zk1,0] とする. 計算することによって以下がわかる:

(1)A[y1y2yk]=[y1yk1],[y1yk]A=[y11d+sft(y1)yk1d+sft(yk)]

したがって,An の最下行の行ベクトルを x(n) と書くと,以下が成り立つ:

(2)An=[x(n+k1)x(n)]

(1)の右の式より, x(n) の第1成分を x とすると, (3)x(n+1)=xd+sft(x(n)) であることが分かる. また,An の列ベクトルを w1T,,wkT とし,

[x(2n+k1)x(2n)]=A2n=(An)2=[x(n+k1)x(n)][ w1TwkT ]

と書いて,最下行を比較すると,

(4)x(2n)=[x(n)w1,,x(n)wk]

である.

以上より,次の手順で an を計算することができる.

  • an=x(nk+1+k1)[ak1,,a0] なので,x(n) が求められれば良い.
  • n を,「+1」 と 「×2」 で書く.たとえば,n=18 なら,n=((1×2×2×2)+1)×2. この内側から順に x(n) を求めていく.
  • +1 のときには,(3) を適用する.この計算量は,O(k)
  • ×2 のときには,まず (3) を k1 回適用して,x(n),,x(n+k1) を求める. すると(2) より An が決まるので,(4) の右辺が計算できる.この計算量は,O(k2)