Processing math: 100%

2017年5月11日木曜日

数学外書輪講I(第3回)

[場所1E501(月曜日5限)]

HPに行く
manabaに行く

今日は前回残った問題とLangのLinear algebra とMatousekの33-Miniaturesの
Miniature 1を読みました。

Linear algebra 

以下のような文章がありました。

It is possible to add several elements of a vector space. Suppose we wish to add four elements, say u, v, w, z. We first add any two of them, then a third, and finally a fourth. Using the rules VS1 and VS4, we see that it does not matter in which order we perform the additions. 
ベクトル空間のいくらかの元を付け加えることができます。4つの元を付け加えたいとします。たとえば、u, v, w, zとしましょう。まず、それらの任意の2つを足し、それから3つめを足し、最後に、4つ目を足します。規則VS1とVS4使えば、足し算をする順番には問題がないことがわかります。

このorderというのは規律だとか命令、注文などの他に数学では順番(順序)という
文脈でよく使われます。数学では他に、群の位数(群の集合としての数と一つの元
が持つ単位元になるまでの最小の正の数という場合もある)という意味で用いられることも
あります。

本文に戻ります。

ベクトル空間において足し算は、厳密には2つの和が定義されているだけなので、一気に例えば4つを足すという操作は定義されていません。なので、便宜的に、まず、u+v をし、さらにそれに w を足し、さらにそれに、z を足してとりあえず定義しなさいと言っています。つまり、
((u+v)+z)+w
ということです。

しかし、ベクトル空間のベクトル同士の足し算は結合律と、可換性があるので、足し合わせ方を便宜的に定めたが、実はどのような順番に足しても同じになります。

ちなみに
VS1 は、(u+v)+w=u+(v+w)
VS4 は、u+v=v+u
です。

この2つのルールだけを使えば、4つに限らず、どんなに多くの数の元を
足すことも、その順番によらないことが示されます。
これは厳密に証明がいります。


少し脱線して、例えば、4つのベクトルを足し算する方法がいくつあるのかを
数えてみます。
足し算の形式としては以下の2種類が考えられます。
ただし、可換性を使ってU+V=V+Uを仮定しておきます。

最初に2つを足し、そのあとに、その他の1つを足し、最後に残りの1つを足す
という方法(上の本文に書いてあった方法)と、
最初に2つを足し、残りの2つ同士も足し、できた2つの元どうしを足す
という方法です。

かっこのつけ方で言えば、
((*+*)+*)+*



(*+*)+(*+*)

です。

最初の形式では、((a+b)+*)+*
の a,b を選ぶ方法は、{}_4C_2=6 通り。
のこりを並べる方法は2通りなので、全部で12通り。

2番目の形式であれば、4つを2つのグループに分ける方法の数ですが、
まず、4つのうち2つを取る方法の数は {}_4C_2=6
そのうち、4つの残りの2つをとる方法も同時に数えてしまっているので、
その分を割って 6/2=3 通りとなります。
(もしくは、どれか一つを固定して考える。それと一緒になる元をどれか選べば
2つのグループに分けることができるその相手の探しかたはのこりの3つの
どれかだから3通り)

よって、全部で 12+3=15 通りとなります。

Fibonacci Numbers, Quickly

の部分を読みました。内容としてはそれほど問題はなかったかと思います。
フィボナッチ数とは F_0=0, F_1=1, F_{n+2}=F_{n+1}+F_n なる漸化式を満たす
数列 F_n のことです。すぐわかることですが、全て自然数を値とする数列です。

この数列をいかに速く求めるか?という問題の内容です。普通に考えれば、
F_n の値を求めるには、この漸化式を使って、n 回くらい計算をすれば
求められるはずですが、実はもっと手早く計算する方法があるということです。


フィボナッチ数列の漸化式の行列表示

まず、フィボナッチ数列の漸化式を下のように、

\begin{pmatrix}F_{n+2}\\F_{n+1}\end{pmatrix}=M\begin{pmatrix}F_{n+1}\\F_n\end{pmatrix}
M=\begin{pmatrix}1&1\\1&0\end{pmatrix}

として、書き直しておけば、次のフィボナッチ数を求めるのに、足し算の漸化式
ではなく、行列 M を掛け算をすることでも得られることがわかります。
これを繰り返せば、任意のフィボナッチ数は、

\begin{pmatrix}F_{n+1}\\F_{n}\end{pmatrix}=M^n\begin{pmatrix}F_{1}\\F_0\end{pmatrix}

のように得られることがわかります。


2進法とその応用
次に2進法を使います。

任意の自然数は、
n=2^{k_1}+2^{k_2}+\cdots+2^{k_t}  (0\le k_1<k_2<\cdots<k_t) のように
2進展開をすることができます。
2進展開を用いれば、上の行列の n 乗は

M^n=M^{2^{k_1}}\cdots M^{2^{k_t}}

となります。

例えば、M^{2^m} を求めるには、
M,\ M^2,\ (M^2)^2=M^4=M^{2^2},\ (M^{2^2})^2=M^{2^3},\cdots

から、m 回計算をすれば済むことがわかります。
一般の自然数 n において F_n を求める計算にしても、

M^n=M^{2^{k_1}}\cdots M^{2^{k_t}}

ですが、2乗を繰り返す操作を k_t 回繰り返せば、それまでに M^{2^{k_i}} も同時に
求めていることになるので、それぞれの成分 M^{2^{k_1}}k_t 回計算すれば全て得られます。さらにその成分同士を t 回かける操作がありますので、
厳密には t+k_t だけ計算すればよいことになります。
しかし、t\le k_t であるので大体、2k_t くらい計算すればよいということになります。

また、掛け算といっても、行列を求めるには、本当は行列の成分の4倍くらい
計算しなければなりませんが、それを数えたとしても 8k_t くらいです。


M^n が計算できたとすれば、実はその  (2,1) 成分がちょうど F_{n} ですので、
高々 2k_t (計算の量を 8k_t と数えてもよい)くらいの計算量で求められるという
ことになります。
k_t\le \log_2n
なので、係数が2でも8でも高々、n\log のオーダー(order)くらいの計算量で済むということになります。(このオーダーも上の使い方とも異なります。)

結論として、フィボナッチ数列を計算する計算量を n から \log n まで節約(手早く)できたというこになります。


0 件のコメント:

コメントを投稿