Philip N.Klein:行列プログラマー

2018-02-17

概要

Python で学ぶ線形代数。

Python か、線形代数か

この本は、Python を学ぶためにあるのだろうか、それとも線形代数を学ぶためにあるのだろうか。 前者だとすれば線形代数は既習ということが前提だし、後者だとすれば Python はすでに知っているということで進められる。 ひょっとしたら一粒で二度おいしい、すなわち線形代数を学びながら Python も覚えられるという効率のよい学習法を狙っているのかもしれない。

この分厚い本を通読してみた結果は、どちらかというと Python を知っている人が線形代数を復習するのによい本だということだ。 Python を知らない人はなんじゃこりゃ、となるだろう。そして、Python を知っていても線形代数の知識が全くない人は途方に暮れるのではないか、 と思った。原文の、あるいは翻訳の誤りがあってもなかなか気づかないのではないかと思うからだ。

Amazon のレビューである方が、p.3 の誤訳について指摘している。詳しくはそのレビューを見てほしいが、少しだけ言うと、 「余定義域とは……」で始まる文であり、指摘者は「終域とは……」が正しいとしている。

普通の線形代数とは違うところとして、行列の要素として `RR` や `CC` の場合だけでなく `GF(2)` の場合でも展開していることだ。 ここで `GF(p^n)` はガロア体 (Galois Field) のことであり、`p^n` を位数という(`p` は素数、`n` は自然数)。この本では 1.5 節(p.65) で説明されている。

行列式の扱い

本書はいろいろと特徴のある線形代数の教科書である。その最たる特徴は、行列式の扱いが類書と比較して非常に低いことだろう。本書の本文は 642 ページであるが、 行列式が初めて登場するのは p.580 である。しかも、行列式を扱っている 12.10 節はアスタリスクが付されている。これは、本書 viii ページによれば、 これは、補助的な数学の内容を提供するものであり、特にそれを読まないと本書が理解できないというものではない。とある。この行き方は面白いと思う。 ちなみに、本書での逆行列の初出は p.237 であるが、逆行列の具体的な計算方法については触れられていない。

問題を解いてみる

Amazon でのレビューでは、別のある方が「解答がない」と不満を表明していた。私の考えでは、解答はないよりあったほうがいいが、 ないならそれに甘んじるしかない、あるいは先生を探して先生から解答を教えてもらえばいい、というものだ。

私は先生ではないけれど、p.136 にある次の問題を考えてみた。

問題 2.14.4 : 以下に `GF(2)` 上の 6 つの 7 要素のベクトルがある。

`{:(bb(a) = 1100000) , (bb(b) = 0110000), (bb(c) = 0011000):}``{:(bb(d) = 0001100), (bb(e) = 0000110), (bb(f) = 0000011):}`

次のそれぞれのベクトル \( \boldsymbol{u}\) に対し、上記のベクトルの部分集合のうち、合計が \( \boldsymbol{u}\) となるものを求めよ。ない場合はその旨を述べよ。

  1. \( \boldsymbol{u} = 0010010\)
  2. \( \boldsymbol{u} = 0100010\)

解答は次のようになる。
1. は \( \boldsymbol{u}\) `= bb(c) + bb(d) + bb(e)`
2. は \( \boldsymbol{u}\) `= bb(b) + bb(c) + bb(d) + bb(e)`
これらを導くには、それぞれのビットが 0 になる場合を考えてみればよい。1. では最上位ビットと最下位ビットがともに 0 であるから、 `bb(a)` から `bb(f)` までを線形結合したときの `bb(a)` と `bb(f)` の係数はともにゼロでなければいけない。あとも同様。

なお、ここでの「合計」という語には違和感がある。「和」のほうがいいだろう。

p.553 にある次の問題を考えてみた。

問題 11.8.3 : 次は行列 `A` とその特異値分解 `A = U \Sigma V^T` である。

`A = [[1,0], [0,2],[0,0]], U = [[0,1],[1,0],[0,0]], \Sigma = [[2,0],[0,1]], V^T = [[0,1],[1,0]] `

1. ベクトル \( \boldsymbol{x} = [1,2] \) に対し、 \( V^T \boldsymbol{x} , \Sigma (V^T \boldsymbol{x}), U \Sigma (V^T \boldsymbol{x}) \) を計算せよ。
2. ベクトル \( \boldsymbol{x} = [2,0] \) に対し、 \( V^T \boldsymbol{x} , \Sigma (V^T \boldsymbol{x}), U \Sigma (V^T \boldsymbol{x}) \) を計算せよ。

計算だけなら私でもできる。まず、1. 2. を計算する前に、特異値分解の式が成り立っていることを確かめよう。
`\Sigma V^t = [[2,0],[0,1]][[0,1],[1,0]] = [[ 0,2],[1,0]]`
`U \Sigma V^T = [[0,1],[1,0],[0,0]][[2,0],[0,1]][[0,1],[1,0]] = [[0,1],[1,0],[0,0]][[0,2],[1,0]] = [[1,0],[0,2],[0,0]] = A`
となり、確かになりたっている。では 1. を計算しよう。

\( V^T \boldsymbol{x} \) `= [[0,1],[1,0]] ** [1,2] = [2, 1], ` \( \Sigma (V^T \boldsymbol{x}) \) `= [[2,0],[0,1]] ** [2,1] = [4, 1]`, \( U \Sigma (V^T \boldsymbol{x}) \) `=[[0,1],[1,0],[0,0]] ** [4,1] = [1,4,0]`

ジーン・ゴラブ

「11章 特異値分解」のp.540 に、次の記述がある。

後で見るように、特異値分解は数学の概念としても、計算の道具としても重要である。 特異値分解のよい計算アルゴリズムの開発に貢献した人の1人はジーン・ゴラブであり、彼の車のナンバープレートには次のように書かれている。(後略)

ナンバープレートの写真は本書を見てほしい。このジーン・ゴラブとは、金谷健一:線形代数セミナーで取り上げられている、ゴラブ・ラインシュ法に名前を遺している人だろうか。

スペクトル

本書で「スペクトル」は、上三角行列のみで定義されている。p.572 の定義 12.6.7 から引用する。

上三角行列 `U` のスペクトルspectrum)とは、対角要素の多重集合のことである。即ち、この多重集合の各要素は、`U` の対角要素に現れる回数と同じ数だけ含まれる。

そして、次の例12.6.8 で、`[[5,9,9],[0,4,7],[0,0,5]]` のスペクトルは多重集合 {5, 4, 4} であること、多重集合では、順序に意味はなく、重複は除かれないことが解説されている。 スペクトルの定義には、他の線形代数の本と異なるものもある。 線形代数セミナーを参照のこと。

文献

本書を参考文献として挙げている本がある。

数式について

数式表現には、MathJax4 を用いている。

書誌情報

書名行列プログラマー
著者Philip N.Klein
訳者松田晃一, 弓林司, 脇本佑紀, 中田洋, 齋藤大吾
発行日2016 年 9 月 23 日 初版第1刷
発行元オライリー・ジャパン、オーム社
定価5400円 (税別)
サイズ(26cm) 657ページ
ISBN9784873117775
NBC411.35
その他越谷市立図書館で借りて読む