32.5(コ)ホモロジー
アーベル圏における蛇の補題の証明は長くなりそうなので、別の場所に写すことにした。
(コ)ホモロジーの長完全系列
先に示した蛇の補題がどのような場面で使われるのかを見ながら、これから我々が考えていく対象について確認しておこう。
環に対し、-加群の中で最も基本的なものとして自由加群を挙げた。その理由としては、任意の-加群に対し、適当な自由加群を取り全射が作れるからである。特に核をと置くと、準同型定理よりが成り立つ。これを完全列の言葉で書き直すと
は完全となる。ここでは「の元のコピー」であり、はそれらの間の「関係」を表している。
ところで自身もやはり-加群なので、再び自由加群を取り、全射が得られる。だから、
は完全となる。この作業を繰り返していけば、任意の長さの自由加群による完全系列
を得ることができる。得られた系列は「関係」つまりの内部構造を反映したものではあるが、自由加群の取り方に依るためのみに注目していただけでは得られないある種の「のデータ」である。もちろんこの例は素朴過ぎて、新しい情報は何も得ることは出来ないだろう。しかし、このようなデータを集めれば、について何か言えるかもしれない。そう考えるのは自然なはずだ。
定義 加群の系列
がを満たすとき、鎖複体(chain complex)あるいは単に複体と呼びやなどと表す。このとき各を鎖あるいはチェイン(chain)と呼び、を輪体あるいはサイクル(cycle)、を境界輪体あるいは単に境界やバウンダリー(boundary)などと呼ぶ。そしてを(次)ホモロジー(homology)と呼ぶ。複体が完全とは、全てのホモロジーがゼロとなることを意味する。
我々は無限列について考えることにする。先の例では、自由加群による完全系列を任意の長さで構成できることは主張していたが、無限列の存在までは主張していない。これにはクラスに対する依存選択公理など超限的な操作が必要になる。しかし例えばがネーター環の場合、が有限生成ならとして有限次元(の有限個の直和)なものが取れる。その部分加群もまた有限次元であるから、の次元はの次元より小さくなる。従って少なくともが従うように系列が取れて無限列
が完全となる。
定義 複体に対し、準同型の組がとの間の射であるとは、を満たすことをいう。
すぐに確認できることだが、対象を複体、射を複体の間の射とすることで圏の公理を満たす。これを-加群の複体の圏と言いと表す。ちなみにこれはアーベル圏となり、零対象は
である。の核などが
などとなるが、言葉として用いたいだけなので確認する必要はないだろう。
定理 (ホモロジーの長完全系列) 複体の系列は完全であるとする。つまり
は-加群の完全系列であるとする。このとき
を完全とする準同型が存在する。
(証明)次の可換図式
に蛇の補題を用いれば完全列
及び
を得る。これをなどで繋いで、再び蛇の補題を用いれば及びなどより求めたい長完全系列を得る。はこの連結準同型である。
所感
単体的複体とかから導入してもいいけど、位相的な話題は全然やってないからなぁ、どうするか。
32.蛇の補題
アーベル圏に対する議論は自明に思えることでもきちんと示していく必要がある。
加群の場合
加群の完全系列に対して、良く知られている補題が幾つかある。今後の議論を冗長にしないためにも、ここで示しておこう。
補題 (5項補題(five lemma)) 加群の系列及びは完全とする。加群の準同型が図式を可換にするとする。このときが同型であれば、真ん中のも同型となる。
(証明)まず単射性を示そう。を取り、が成り立つとする。
であるから、が同型なのでを得る。従ってとなるから、としてを満たすように取れる。
よりが分かる。そこでをとなるように取れば、が同型なので
が従う。故にであるからとなる。つまりである。
次に全射性を示そう。とする。が同相だからをとなるように取れる。も同相だから、
となる。従ってだから、としてを満たすものが取れる。
となるから、を得る。そこでをを満たすように取れば、は同相だから
となる。故にが従う。
上のような証明を図式追跡(diagram chasing)と言ったりする。一見難しそうだが、特別高度な推論を行っているわけではないので、慣れれば感覚が掴めるはずだ。人生に一度位はゼロから計算してみるのも悪くないと思う。次の補題は、誰が命名したかは分からないが、聞いただけで心の踊る命題である。
補題 (蛇の補題(snake lemma)) 加群の系列及びは完全であるとする。加群の準同型は図式を可換にするとする。またを完全系列で定めておく。このとき制限による及びは図式を可換にし、更にある準同型が存在して、
は完全となる。
(証明)全部は大変なのでの存在のみ示そう。図式の可換性と完全性は簡単な図式追跡で示せる。
とする。は全射なので、をを満たすように取れる。
より、が分かる。そこでとしてとなるように取る。このときと定めたい。この定義がwell-definedであることを示すためには、同様にを取り、となることを示せば良い。まずであるから、をとなるように取れる。
だが、は単射なのでが従う。
ちなみにが単射ならも単射であり、が全射ならも全射である。のことを連結準同型(connecting homomorphism)などと言うこともある。
補題 (9項補題(nine lemma)) 加群の系列は完全であるとする。加群の準同型
が図式を可換にするとする。このとき次が成り立つ。
- が完全ならも完全となる。
- が完全ならも完全となる。
(証明)上はに蛇の補題を用いればの完全性が従う。下も同様。
なおが完全であっても、が完全になるとは限らない。
アーベル圏の場合
アーベル圏においても上記の補題は同様に成り立つことが知られている。ただし系列とはを満たす対象と射の列のことを指し、系列が完全であるとは、系列に対して定まる自然な射がイソであることを意味する。
まずは零対象を持つ圏における一般論から始めよう。
命題 圏は零対象を持つとする。このとき以下が成り立つ。は任意の対象とする。
- はモノである。
- はエピである。
- が成り立つ。
- が成り立つ。
- が成り立つ。
- が成り立つ。
- が成り立つ。
- が成り立つ。
- が成り立つ。
- が成り立つ。
(証明)偶数番目は奇数番目の双対圏における主張であるから、奇数番目のみ示せば良い。まずがモノであることは、射の唯一性より従う。便宜上と名前を付けると、図式を可換にするに対し、モノであることからが従う。故に核はと同型になる。ここまでの双対命題を示しておけば、
よりの余像もゼロとなる。余核に対してはが普遍性を満たすことは直ぐに分かる。像についてはがイソつまりモノであることからが最初と同様に従う。
上によれば、の核、余核、像、余像は常に存在することが分かる。ちなみに証明中にも軽く触れたがの核、余核、像、余像も常に存在する。纏めると次のようになる。
核 | |||
余核 | |||
像 | |||
余像 |
次にアーベル圏で成り立つ一般論を述べておこう。
命題 圏はアーベル圏とする。に対し以下が成り立つ。
以下は同値となる。
- がモノである。
- が成り立つ。
以下は同値となる。
- がエピである。
- が成り立つ。
更にがバイ(モノかつエピ)ならイソである。
(証明)核がゼロとなることは、先の命題と同様に示せる。実際が図式を可換とするときが従うのでが普遍性を満たす。
とする。がを満たすとする。このときを考えれば、これはと図式を可換にするので核を経由する。故にが従う。つまりはモノとなる。
エピの場合も同様である。最後にをバイとすると、かつであるから、アーベル圏の定義より自然な射はイソになる。自然な射とはそのものであるからはイソとなる。
系 圏はアーベル圏とする。に対し以下が成り立つ。
以下は同値となる。
- はモノである。
- は完全である。
以下は同値となる。
- はエピである。
- は完全である。
TODO
Unityで数値計算ライブラリMath.NET Numericsを使う方法
Math.NETとは行列計算とかできるライブラリらしい。ゲームエンジンであるUnity上で使う用途はあまりないかもしれないが、Win8.1環境で導入できたので手順を以下にメモしとく。
まずNuGetのページでnupackファイルをダウンロードする。
Unityは.NETFrameworkのバージョンが3.5らしいので、Task Parallel Libraryもついでにダウンロードする。
nupackファイルはただのzipファイルらしいので展開する。MathNetはlib/net35に、TaskParallelはlibにあるdllをUnityのAssetsにドラッグ&ドロップする。
二つのdllのInspectorのPlatform settingsをx86_x64, winにする。
スクリプト上では
using MathNet.Numerics;
などを加えて、あとは公式サンプルなど自由にどうぞ。
もっともUnityの関数とは互換性がないので、そこを埋めるには適当に自作する必要はある。
例
var A = Matrix<double>.Build.DenseOfArray(new double[,]
{
{ 3, 2, -1 },
{ 2, -2, 4 },
{ -1, 0.5, -1 }
});
var b = Vector<double>.Build.Dense(new double[] { 1, -2, 0 });
var x = A.Solve(b);
Vector3 t;
t.x = (float)(x.ToArray())[0];
t.y = (float)(x.ToArray())[1];
t.z = (float)(x.ToArray())[2];
Debug.Log( t ); // (1.0, -2.0, -2.0)
他のdllとかも同じように使えそうね。