このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

圏上のチェーンの畳み込み積

ふと気が付いたことがあって、なんか面白い解釈や応用がないかいな? と考えてみましたが何も思いつかないので事実だけ述べます。

モノイド上のチェーン

数(スカラー)として実数Rを採用します。別に有理数でも複素数でもなんでもいいけど、とにかく「数とは何か」を決めておきます。(M, ・, 1)をモノイドとします。・が掛け算で、1は単位。この状況で、Mの有限個の元の形式的な線形結合を考えます。k1, k2, ..., kn がn個の実数、a1, a2, ..., an がn個のMの元のとき、k1[a1] + k2[a2] + ... + kn[an] のような形の表現が形式的線形結合です。[a1], [a2] などは、Mの元 a1, a2 に対応する形式的記号です。

いま定義した表現(形式的線形結合)をとりあえずチェーンと呼んでおきましょう。チェーンの足し算とスカラー倍は形式的な計算で定義できます。例えば、a, b, c∈M として、2[a] + 1[b] と -3[b] + 5[c] の足し算は:


(2[a] + 1[b]) + (-3[b] + 5[c])
= 2[a] + 1[b] + (-3)[b] + 5[c]
= 2[a] + (1 + (-3))[b] + 5[c]
= 2[a] + (-2)[b] + 5[c]

です。全部同じ「+」で書いてますが、形式的な結合を「+」、チェーンの足し算を「」、数の足し算「」とでも書き分けると:


(2[a] + 1[b]) (-3[b] + 5[c])
= 2[a] + 1[b] + (-3)[b] + 5[c]
= 2[a] + (1 (-3))[b] + 5[c]
= 2[a] + (-2)[b] + 5[c]

もっと分かりやすいチェーンの表現は、チェーンをM上の実数値関数と考えることです。例えば、2[a] + 1[b] ならば、次のような関数f:M→Rだと考えます。

  • f(a) = 2
  • f(b) = 1
  • xがaでもbでもないなら f(x) = 0

ただし、f(x)≠0 となるxは有限個しかないとします。このとき、チェーンの足し算とスカラー倍は、関数の足し算とスカラー倍で与えられます。

チェーンの掛け算

M上のチェーンを、関数f, g:M→Rで表現して、その掛け算 f*g を定義します。f*g = h とすると、hは次のような関数です。

  • h(x) = Σs・t = x (f(s)g(t))

これだけだと分かりにくいので、M = {1, 2, 3, ...}、・は普通の掛け算として、より具体的に書いてみます。

  • h(1) = Σs・t = 1 (f(s)g(t)) = f(1)g(1)
  • h(2) = Σs・t = 2 (f(s)g(t)) = f(1)g(2) + f(2)g(1)
  • h(3) = Σs・t = 3 (f(s)g(t)) = f(1)g(3) + f(3)g(1)
  • h(4) = Σs・t = 4 (f(s)g(t)) = f(1)g(4) + f(2)g(2) + f(4)g(1)
  • h(5) = Σs・t = 5 (f(s)g(t)) = f(1)g(5) + f(5)g(1)
  • h(6) = Σs・t = 6 (f(s)g(t)) = f(1)g(6) + f(2)g(3) + f(3)g(2) + f(6)g(1)

別な例として、M = {0, 1, 2, 3, ...}、・は足し算+のことだとすれば:

  • h(0) = Σs + t = 0 (f(s)g(t)) = f(0)g(0)
  • h(1) = Σs + t = 1 (f(s)g(t)) = f(0)g(1) + f(1)g(0)
  • h(2) = Σs + t = 2 (f(s)g(t)) = f(0)g(2) + f(1)g(1) + f(2)g(0)
  • h(3) = Σs + t = 3 (f(s)g(t)) = f(0)g(3) + f(1)g(2) + f(2)g(1) + f(3)g(0)

なんか見たことあるような気がしませんか。形式的な変数(不定元)Xを導入して、f(0) + f(1)X + f(2)X2 + f(3)X3 + ... 、それと g(0) + g(1)X + g(2)X2 + g(3)X3 + ... という2つの多項式を作ると、f*g = h に対応する多項式は:

  • f(0)g(0) + (f(0)g(1) + f(1)g(0))X + (f(0)g(2) + f(1)g(1) + f(2)g(0))X2 + (f(0)g(3) + f(1)g(2) + f(2)g(1) + f(3)g(0))X3 + ...

つまり、いま定義した積は多項式の普通の積と思ってもいいわけです。M = {..., -2, -1, 0, 1, 2, 3, ...}のときは、負の指数も許すのでローラン多項式の積になります。

  • h(x) = Σs + t = x (f(s)g(t))

において、s, t, x が負でもいいなら、s + t = x から t = x - s となるので、

  • h(x) = Σs (f(s)g(x - s))

Σs積分 ∫ds にした形を見たことがある方もいるでしょう。積分のときは畳み込み積(convolution product)と呼ぶので、モノイドM上の関数(チェーン)の積 f*g も、fとgの畳み込み積と呼ぶことにします。

圏上のチェーンと畳み込み積

モノイドは特殊な圏(対象が1個しかない圏)とみなせます。であるなら、チェーンと畳み込みの概念を圏に対して一般化できそうです。Cを圏として、Cの射(1-セル)の集合も同じ記号Cで表します。モノイドのときと同じく、圏C上の実数値関数F:C→Rをチェーンと呼びます。大文字Fを使ったのは、Cの射をf, g などと書くからです。

Fは有限個の射を除いて0の値を取るので、実数 k1, k2, ..., kn と、射 f1, f2, ..., fn から作った形式的線形結合 k1[f1] + k2[f2] + ... + kn[fn] をチェーンとも思えます。好きなほうで考えてください。

F, G:C→R が2つのチェーンのとき、F*G = H は、

  • H(h) = Σf;g = h (F(f)G(g))

となります。H(h) を求めたいなら、h = f;g という分解に対して実数値の積 F(f)G(g) を作って、あらゆる分解に渡って足し合わせます。

特別な例:行列の掛け算

圏Cを次のように作ります。

  1. Cの対象は{1, 2, 3}
  2. 任意の i, j∈{1, 2, 3}に対して、i→j の射が1本ずつ在るとする。この射を[i, j]と書く。
  3. 射の結合は [i, j];[j, k] = [i, k] と定義する。
  4. 対象iに対する恒等射は[i, i]。

Cは有向完全グラフの形をしています。射の結合(合成)と恒等射に関して、結合律と単位律が成り立つのは明らかなので、Cは実際に圏です。

C上のチェーンは、射[i, j]に対して値を取ります。F([i, j])の代わりにF[i, j]と書きましょう。iとjは1, 2, 3の範囲で動くので、Fは、[1, 1], [1, 2], ..., [3, 3] の9個の射に対して値を持ちます。Fは、F[1, 1], F[1, 2], ..., F[3, 3] という9個の実数値達で決まるので、結局は3×3の行列と同じことです。

h = f;g という射の分解は、h = [i, k] とすれば、f = [i, j], g = [j, k] ([i, k] = [i, j];[j, k])で与えられるので、FとGの畳み込み積は:

  • H[i, k] = Σ[i, j];[j, k] = [i, k] (F[i, j]G[j, k])

iとkが固定されているので、動くのはjだけ、つまり:

  • H[i, k] = Σj (F[i, j]G[j, k])

具体的な例では:

  • H[1, 3] = Σj(F[1, j]G[j, 3]) = F[1, 1]G[1, 3] + F[1, 2]G[2, 3] + F[1, 3]G[3, 3]

これは行列の掛け算そのものです。



圏上のチェーンと畳み込み積を定義して、簡単な実例を試してみたら、行列演算とバッチリ一致したので、背後にナニカあるのか? と期待したのですが、僕の能力と気力では、これ以上のことは分かりませんでした。