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

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

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

「アドホック多相 vs パラメトリック多相」をマジメに考えてはいけない

アドホック多相」、「パラメトリック多相」という言葉は、覚えておけば便利に使えます。が、これらの言葉は、軽率に気分的・雰囲気的に使うものであり、違いや定義をマジメに議論すべきものではありません。

内容:

nLabを見てもモンヤリ

nLab(https://ncatlab.org/nlab/show/HomePage)は、数理科学*1の概念・用語に、できるかぎり圏論的な、できるかぎり厳密な定義を与えようとしているサイトです。そのnLabでも、「多相〈polymorphism〉」のエントリーには、よくある説明しか載ってません。

多相〈polymorphic〉な関数とは、単一の名前に複数の意味があるような関数だ、と、そんなことです。

単一の名前に複数の意味がある状況を二種類に分けて、

  1. 単一の名前が、複数の異なる関数を指している。
  2. 単一の名前が指す(単一の)関数が、複数の異なる型で使用できる。

一番目の状況をアドホック多相〈ad-hoc polymorphism〉、二番目の状況をパラメトリック多相〈parametric polymorphism〉と呼んでいます。

名前の同一性はハッキリした概念ですが、関数の同一性はハッキリしない概念です*2。ハッキリしない概念を使って説明されているアドホック多相/パラメトリック多相も、もちろんハッキリしない概念です。

ハッキリさせようと試みるのは良いことですが、アドホック多相/パラメトリック多相に関しては、ハッキリしないモンヤリした概念だと知った上で、カジュアルに(雰囲気的にテキトーに)使えばいいんじゃないか、と僕は思います。

オーバーロード、多相、総称

「多相」に類似していて、しばしば同時に登場する言葉に「オーバーロード」、「総称」があります。これらの言葉も区別したり、それぞれを厳密に定義したい人もいるでしょうが、あまり建設的じゃない。ありていに言えば、不毛です。

オーバーロード」、「多相」、「総称」はプログラミングの文脈で出現する(ことが多い)言葉ですが、そういう言葉はだいたい、プログラミング言語ごとに定義が違うのです。方言がたくさんあって、標準語はない状況なんですね。そんな状況で、「俺が使っている言葉こそは標準語だ」と訴えるのは無意味であり、ひんしゅくを買うだけです*3

個々のプログラミング言語からは離れた一般論としては、「オーバーロード」、「多相」、「総称」を区別/定義できても嬉しいことはないので、区別/定義する動機がありません。日常語と同じレベルで曖昧に恣意的に使うだけでしょう。

僕自身の曖昧で恣意的な使用法は次のようです; 僕は、言葉の多義的使用は何でも「オーバーロード」と呼びます。例えば、「一休さん」のおはなしのなかに、「このハシわたるべからず」に対して「橋の真ん中を渡った」というエピソードがあります。これは、「ハシ」と発音する日本語の多義性「ハシ → 橋、ハシ → 端」を利用したものです。つまり、日本語「ハシ」はオーバーロード〈多義的使用〉されています。

オーバーロード〈多義的使用〉されている言葉が、関数または関数類似物の名前であるとき、僕は「多相」といっています。オーバーロードを解決する(複数の意味からひとつを選ぶ)ときに、型の情報が使われる多相は「総称」がシックリくる気がします(個人的気分)。

多義的名前と識別インデックス

「名前 → 意味」という対応が、名前ひとつに意味ひとつなら多義的ではありません。「名前 → 意味1、名前 → 意味2、……、名前 → 意味n」(n ≧ 2)のときが多義的です。意味のほうに出てきた番号 1, 2, ..., n をインデックス〈index〉と呼びましょう。インデックスを使って、名前から意味への対応を書けば:

  • 名前[1] = 意味1
  • 名前[2] = 意味2
  • ……
  • 名前[n] = 意味n

となります。例えば、

  • ハシ[1] = 橋
  • ハシ[2] = 端
  • ハシ[3] = 箸

多義的言葉でも、インデックスを指定すれば意味を特定できます。このことから、多義的言葉は、インデックスに応じた意味を持つといえます。

インデックスは無限個あってもいいし、数ではない他の何か(文字列とか型とか)でもいいとしましょう。

多義的言葉が関数名である例を出しましょう。まず、基本的な関数として:

1. 与えられた2つの数を掛け算する関数を multiply(x, y) とします。
2. グラフィックスで、与えられた左上点座標と幅・高さを持つ矩形オブジェクトを生成して返す関数を Rectangle(top_left_x, top_left_y, width, height) とします。
3. 与えられた行数・列数を持ち、成分はすべて0で初期化された行列(2次元配列)を生成して返す関数を Matrix(n_rows, n_columns) とします。

これらの関数を利用して3つの関数を定義します。構文はJavaScript風です。

/* square[1] 二乗する関数 */
function square(x) {
  return multiply(x, x);
}

/* square[2] 正方形を生成する関数 */
function square(x) {
  return Rectangle(0, 0, x, x);
}
/* square[3] 単位正方行列を生成する関数 */
function square(n) {
  var m = Matrix(n, n);
  for (i = 0; i < n; i++) {
    m[i][i] = 1;
  }
  return m;
}

3つの関数はすべて同じ名前 square を持ちます。が、3つの中身はまったく違います。実際のJavaScript言語処理系では、同じ名前で異なる3つの関数を定義できませんが、ここでは、同じ名前で異なる3つの関数が定義できて、それらを区別したい場合はインデックス 1, 2, 3 をブラケット('[' と ']')内に入れればいいと想定しましょう。

これは、関数名オーバーロードの例であり、オーバーロードを明示的に(プログラマが人手で)解決するには、インデックスを指定することになります。

  • square[1](4) の値 = 16
  • square[2](4) の値 = (0, 0)を左上として 幅=高さ=4 である正方形オブジェクト
  • square[3](4) の値 = サイズが4×4の単位行列

オーバーロード解決のために、毎回手でインデックスを指定するのはめんどくさいですね。そこで、インデックス指定せずにどうやってオーバーロード解決するか? が問題になります。しかしながら、オーバーロードや多相が生じる現象・状況の話と、オーバーロードの自動解決の手段・メカニズムの話は切り離せます。むしろ、ゴッチャにすると混乱します。ここでは、オーバーロードの自動解決の話はしません

アドホック多相は複数の関数定義(なの?)

前節のsquareは、偶発的に同じ名前になってしまった例です。同じ名前にすべき強い根拠はありません。同じ名前にして便利ということもさほどありません。こういう多相(単一の関数名が複数の意味を持つこと)は、アドホック多相と呼びます。

アドホック多相のプログラムコード上の特徴は、関数定義が複数あることだとされています。実際、前節のsquareは、3つの関数定義がありました。しかし、関数定義の書き方なんて色々あるわけで、書き方によって関数定義がひとつだったり/たくさんだったりと変わると思いませんか? 実際、変わります。

もうひとつ別なアドホック多相(かも知れない)例を出します。increase(増やす、盛る)という名前で2つの関数を定義します。型の指定はTypeScript風です。

/* increase["num"] 数を1増やす関数 */
function increase(x:number):number {
  return (1 + x);
}
/* increase["str"] 語(文字列)の前に"more"を付ける関数 */
function increase(x:string):string {
  return ("more " + x);
}

今度は、インデックスに文字列 "num", "str" を使うことにしましょう。例えば:

  • increase["num"](4) の値 = 5
  • increase["str"]("beautiful") の値 = "more beautiful"

ちなみに、次のコードを使うと、実際のJavaScript処理系でも increase["num"](4), increase["str"]("beautiful") という呼び出しができます。

function isNumber(x) {
  return typeof(x) === "number";
}
function isString(x) {
  return typeof(x) === "string";
}

var increase = {
  "num" : function (x) {
    if (isNumber(x)) {
      return 1 + x;
    } else {
      throw new Error("Type Error");
    }
  },
  "str": function (x) {
    if (isString(x)) {
      return "more " + x;
    } else {
      throw new Error("Type Error");
    }
  }
}

さて、この2つの関数定義をひとつにまとめることはできるでしょうか? 次のようにすれば関数定義はひとつになります*4

function increase[i](x) {
  return (a[i] + x);
}

aは、多相な定数で、インデックスiにより値が変わります。

  • a["num"] = 1
  • a["str"] = "more "

実際のJavaScript処理系で動くように細工したもの(なんちゃって実装)は次*5increase[i](x) の代わりに、increase(i, x) として呼び出します。

var a = {
  "num": 1,
  "str": "more "
}

function increase(i, x) {
  return (a[i] + x);
}

関数定義がひとつで済む多相は、パラメトリック多相だということになっています。increase は関数定義ひとつでも済んだので、パラメトリック多相な関数なのでしょうか? でも、もともとは2つの関数定義だったし、同じ名前にする必然性も弱いし …

ここで、「アドホック多相、パラメトリック多相、いったいどっちなんだろう?」と真剣に考えるのではなくて、「アドホック多相とパラメトリック多相の境界線なんて、曖昧でイイカゲンなものなんだな」と了解すればいいのです。

それでもマジメに考えたいのなら

「マジメに考えてはいけない」と言われても「マジメに考えたいのだ」というマジメな人がいるかも知れません。おそらく2つのアプローチがあるでしょう。どちらの方法も、「アドホック多相とパラメトリック多相の境界線」を引くものではなくて、アドホック性(パラメトリック性でもいいが)の程度を測ろうとする試みです。

今までの話で分かるように、多相関数は、インデックスで識別される関数の集まりです。つまり、関数のインデックス族〈indexed family of functions〉とみなせます。関数のインデックス族は、インデックスの集合〈indexing set〉から関数の集まりへの写像です。

この関数のインデックス族の概念を一般化すると自然変換になります*6。多相関数を自然変換として定式化して、自然変換のあいだの関係をアドホック性を計る尺度に用います。実際、いくつかの方法で自然変換のあいだの順序を定義できます。その順序は、アドホック性の程度とみなせます。

別なアプローチは、同じ名前を持つ関数(の実体)達は、なんらかの共通性を持つだろう、と考える方法です。共通性を指標・仕様〈signature/specification〉として定義します*7。多相関数が、どのような指標・仕様によって記述されるか、言い方を変えれば、どのような指標・仕様に“所属”するかに注目します。

多相関数のアドホック性を測るために、多相関数そのものではなくて、それが所属する指標・仕様のあいだの関係性(より一般/より特殊)を利用します。よりリッチな機能を持つ/より制約の強い指標・仕様に所属する関数ほどアドホック性が低いとみなせます。

上記の2つのアプローチをミックスまたは統合することもできるでしょうし、もっと他のアプローチがあるかも知れません。

いずれにしても、通常いわれている「関数定義がひとつか複数か?」のような曖昧でイイカゲンな定義からは、曖昧でイイカゲンなことしか言えません(それでもいいと僕は思いますが*8)。より厳密な議論をしたいなら、より厳密な定義をスタートラインにする必要があります。

[追記]マジメに議論しても不毛な別な例:並列処理 vs 並行処理

[/追記]

*1:当初は、高次圏論の概念・用語を対象としていましたが、今では守備範囲が広がって、数学一般、物理、計算科学なども扱っています。

*2:集合論内での関数〈写像〉とその同一性の概念はハッキリしています。が、それは超越的同一性です。プログラムコードで記述された関数の同一性、あるいは関数を記述するプログラムコードの同一性は、それほど単純な話ではありません。

*3:プログラミングの文脈に限らず、専門用語の定義は、その用語を使う集団のローカルルールにより支えられています。よって、「これこそがスタンダード」のような物言いは、頭の悪さを印象付けてしまうので注意しましょう。

*4:インデックスiの値により関数の入出力の型が変わります。依存型を持つ関数になります。

*5:2つの関数をひとつにまとめることが出来た理由のひとつに、JavaScriptのプラス記号が最初から演算子オーバーロードされていることがあります。記号'+'が、+["num"] と +["str"] に、暗黙のインデックス付けされるのです

*6:パラメトリック多相関数は自然変換になるが、アドホック多相関数は自然変換にならない、と思っている人がいるかも知れません。そんなことはありません。アドホック多相関数(と呼ばれているもの)でも自然変換に仕立てることができます。

*7:指標・仕様という言葉の使い分けについては「指標と仕様」。

*8:二分法〈dichotomy〉の基準とならなくても、傾向性を表す言葉として使えます。「理系 vs 文系」とかも、ほぼ無意味だと思いますが、それでも会話のなかで使われています。

リー微分は共変微分か? -- 代数的に考えれば

「リー微分は共変微分か?」と聞かれたことがあります。定義からいって、リー微分は共変微分の一例です。単なる一例というだけでなく、標準的な共変微分と言っていいでしょう。

このことをできるだけ代数的に説明します。代数的な定式化の基本となることは、最近の記事でけっこう説明しています(今回の本文内でも適宜参照します)。

またここでは、ラムダ記法やカリー化を本質的に使うので、その解説もしています。今回登場する各種の微分演算はすべて、二項演算のカリー化により作り出されます。

内容:

はじめに

リー微分や共変微分は、多様体に関して定義されるものです。が、多様体も、その一部だけを見ればユークリッド空間の開集合と同じなので、局所的な議論なら、開集合 U⊆Rn 上で行ってもかまいません。アトラスと層のメカニズムを使えば、局所的な議論を貼り合わせて全域的な結果を構成することが出来ます。

今回はアトラスも層も使いませんが、アトラスに関しては次の記事に書いています。

貼り合わせの道具である層に関しては:

ここではとりあえず、ユークリッド空間の開集合に関する議論を代数的に行います。それでも、多様体全域の議論と大きく変わるわけではありません。

代数的な定式化をすることにより、加群/ベクトル空間のテンソル積や、双線形写像のカリー化が、微分計算でも重要な役割を果たすことが分かると思います。

なお、「双対接続ペア」のときと同様に、次の想定で読んでもらえればいいです。

  • U : Rnの開集合
  • R-可換環 A : なめらかな関数のR-可換環 C(U)
  • Der(A) : U上の接ベクトル場のC(U)-加群(有限生成自由加群
  • Ω(A) : U上の(1次の)微分形式のC(U)-加群(有限生成自由加群

カリー化

カリー化は、関数型プログラミング/型付きラムダ計算/デカルト閉圏などではお馴染みなんですが、通常の数学のなかだと意外と使われてなくて、それが理由で話が曖昧・晦渋になっていたりします。微分もリー微分も、カリー化によって構成するんですけどね…… なので、ここでカリー化について説明しておきます。

今は圏の一般論をやりたくないので、集合と写像の例を使います。集合AからBへの写像の全体を Map(A, B) と書くことにします。Map(A, B) もまた集合になります。集合 Map(A, B) を BA とか [A, B] とも書きます。以下では、[A, B] を使います。

f∈Map(A×B, C) に対して、g∈Map(A, [B, C]) と h∈Map(B, [A, C]) が次のように決まります。

  • (g(a))(b) := f(a, b)
  • (h(b))(a) := f(a, b)

gもhも、fから完全に決まる写像です。[B, C] = Map(B, C), [A, C] = Map(A, C) だったので、g:A→Map(B, C), h:B→Map(A, C) となります。

gもhもfから決まるので、次のように書きます。

  • g = f
  • h = f

この記法の由来は、次の記事をザッと眺めれば分かるでしょう(由来を気にしないなら、見る必要はありません)。

関係する絵は次のようです(絵と記号の説明は「非対称閉圏のカリー化:記号法を工夫すれば、右と左の混乱も解消」参照)。

f:A→[B, C] を f:A×B→C の右カリー化〈right currying〉、f:B→[A, C] を f:A×B→C の左カリー化〈left currying〉と呼びます。

ラムダ記法と無名ラムダ変数

微分計算を行う際に、ラムダ記法/ラムダ計算も知っていたほうがいいよ、という話を次の記事でしました。

上記記事で、次の過去記事を参照しています。ラムダ記法/ラムダ計算をまったく知らないなら、これらの記事が入門になるでしょう。

微分幾何でもラムダ記法は使ったほうがいい、という話は:

ラムダ記法を使って、前節の右カリー化と左カリー化を定義すると次のようになります。

  • f := λx∈A.(λy∈B.f(x, y))
  • f := λy∈B.(λx∈A.f(x, y))

通常のラムダ記法の代わりに、ラムダ変数('λ'の直後に書く変数)をハイフンやアンダースコアにした式が使われます。例えば、λt∈R.(2×t + 1) の代わりに 2×(-) + 1 とかです。この略式の書き方では、ラムダ変数の型の情報は書けません。右カリー化と左カリー化を略式ラムダ記法を使って書くなら:

  • f(a) := f(a, -)
  • f(b) := f(-, b)

次のようにも使えます。

  • (-)a := λx∈R.xa
  • c(-) := λx∈R.cx

略式ラムダ記法で使われるハイフンやアンダースコアを無名ラムダ変数〈{anonymous | unnamed} {lambda}? variable〉といいます。

fの右カリー化 f、左カリー化 f の、別な書き方を導入しておきます。

  • f(-) := f(-)
  • f(-) := f(-)

つまり、

  • fx := f(x) = λy∈B.f(x, y)
  • fy := f(y) = λx∈A.f(x, y)

あるいは、

  • fx(y) := (f(x))(y) = f(x, y)
  • fy(x) := (f(y))(x) = f(x, y)

この書き方は、方向微分、リー微分などで実際に使います

微分適用と外微分

関数 f∈Map(A, B) と要素 a∈A に対して、関数の値 f(a) を求める操作を評価〈evaluation〉とか適用〈application〉と呼びます。評価/適用も関数なので、eval, appなどの名前で利用します。

  • app:Map(A, B)×A→B
    app(f, a) = f(a)

R-可換環の導分に対して、適用写像を考えましょう -- その代数的準備としては、「双対接続ペア」の最初の節「可換環と加群」を読んでおいてください。ここから先で使う [-, -]R, [-, -]Aは、「カリー化」の節で使った“単なる写像の集合”ではなくて、“R-線形写像R-ベクトル空間”、“A-線形写像のA-加群”です*1

R-可換環Aの導分の集合 Der(A) は Map(A, A) の部分集合なので、適用を考えることができます。

  • app:Der(A)×A→A

Der(A) の要素(導分)は、「微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場」で述べた結果(領域導分定理)から、(解析的な)微分作用素と思っていいので、上記のappを微分適用〈{differential | derivative} application〉と呼び、Dと書くことにします。

  • D:Der(A)×A→A
    D(X, a) = X(a)

Dはニ変数の関数(二項演算)ですが、第一変数を固定してR-線形(A-線形ではない)、第二変数を固定してA-線形になります。カリー化のときはこのことを考慮します。

前節のカリー化に関する記法を使うと:

  • D:Der(A)→[A, A]R
  • D:A→[Der(A), A]A

別な書き方は:

  • DX := D(X) = λa∈A.D(X, a)
  • Da := D(a) = λX∈Der(A).D(X, a)

あるいは、

  • DX(a) := (D(X))(a) = D(X, a)
  • Da(X) := (D(a))(X) = D(X, a)

D = D(-)方向微分〈directional {derivative | differential}〉の記法として使います。D = D(-) は小文字'd'を使って、

  • d(-) = D(-) = D(-)
  • d(a)(X) = Da(X) = (D(a))(X)

と表します。この d:A→[Der(A), A]A微分〈exteriou {derivative | differential}〉です。微分とは、微分適用の左カリー化に過ぎないのです*2。外微分のdに、ミステリアスな印象を持つ必要はありません、少なくとも代数的には。

リー括弧とリー微分

[A, A]R は、R-ベクトル空間とみたAからAへの線形写像の空間でした。足し算と実数スカラー倍は備わっています。さらに、写像の結合(合成)を掛け算(積)とみなすと、[A, A]Rは、非可換(可換とは限らない)結合的単位的な多元環〈associative unital algebra〉となります。

任意の結合的多元環に対して、その交換子積〈commutator〉を考えると、リー環リー代数〉(Wikipedia項目「リー代数」)となります。この構成を [A, A]R に適用して、リー環を作れます。その交換子積をリー括弧〈Lie bracket〉とも呼びます*3

  • For X, Y ∈[A, A]R,
    [X, Y] := XY - YX = X\circY - Y\circX

同じ大括弧〈角括弧 | ブラケット〉記号を使ってますが、指数(関数集合、線形関数加群)とは全然別で、二項演算です。混同しないように注意してください。

R-ベクトル空間として Der(A)⊆[A, A]R ですが、実はリー環としても、Der(A)⊆[A, A]R となります。つまり、次が成立します。

  • X, Y ∈Der(A) ならば、[X, Y]∈Der(A)

X, Y がライプニッツ法則を満たすとき、[X, Y] もライプニッツ法則を満たすことを確認すればいいので簡単です。

さて、リー括弧 [-, -] を L とも書くことにします。

  • [-, -] = L(-, -) = L : Der(A)×Der(A)→Der(A)

LはR-双線形な二変数関数(二項演算)なので、左カリー化/右カリー化を行うことができます。L(X, Y) = -L(Y, X) なので、左カリー化も右カリー化も(符号の差を除けば)同じことです。

Lの右カリー化 L = L(-) : Der(A)→[Der(A), Der(A)]Rリー微分〈Lie derivative〉と呼びます。リー微分の幾何的・解析的定義は、接ベクトル場が生成する流れ〈flow〉を使って行いますが、代数的には、リー微分はリー括弧(交換子積)の右カリー化です。

リー微分 L(-) は、共変微分〈covariant derivative〉になります。「双対接続ペア // 接続付き加群」で、共変微分の定義の変種を幾つか挙げています。そのなかの4番目の定義がリー微分の定義としてふさわしいでしょう。(実数/関数によるスカラー乗法はドットで書いてます。)

  1. LXR-線形である。
    1. LX(Y + Z) = LX(Y) + LX(Z)
    2. LX(r・Y) = r・LX(Y) for r∈R
  2. LXライプニッツ法則を満たす。
    LX(a・Y) = X(a)・Y + a・LX(Y) for a∈A

R-線形性は明らかなので、示すべきはライプニッツ法則だけです。リー括弧のレベルでライプニッツ法則を書くと:

  • [X, a・Y] = X(a)・Y + a・[X, Y] for a∈A

これは定義に従った計算で示せます。念のため、計算を書いておきます。導分に対する関数によるスカラー乗法はドット、導分の結合と関数の積(可換環Aの積)は併置で表します。

b∈A に対して、

  [X, a・Y](b)
= (X(a・Y) - (a・Y)X)(b)
= (X(a・Y))(b) - ((a・Y)X)(b)

          (X(a・Y))(b)
        = X((a・Y)(b))
        = X(aY(b))
        = X(a)Y(b) + a(X(Y(b))
        = (X(a)・Y)(b) + (a・(XY))(b)

          ((a・Y)X)(b)
        = a(Y(X(b)))
        = (a・(YX))(b)

= (X(a)・Y)(b) + (a・(XY))(b) - (a・(YX))(b)
= ( X(a)・Y + a・(XY) - a・(YX) )(b)
= ( X(a)・Y + a・[X, Y] )(b)

まとめ

リー括弧 L:Der(A)×Der(A)→Der(A) に対して、右カリー化 L = L(-) :Der(A)→[Der(A), Der(A)]R がリー微分でした。左カリー化 L = L(-) : Der(A)→[Der(A), Der(A)]R でも同じことですが、左カリー化を Der(A)→Ω(A)\otimes_ADer(A) とみなしたものを小文字ℓで書くことにします。ℓのライプニッツ法則は:

  • ℓ(a・X) = d(a)\otimesX + a・ℓ(X)

と書けます。ℓは、本質的にはリー微分と何も変わりませんが、雰囲気としては外微分っぽくなります。

今回紹介した二項演算と左右のカリー化、その記法を表にまとめると:

二項演算 右カリー化 左カリー化
微分適用 D 方向微分 D(-) 微分 d
リー括弧 L リー微分 L(-) 微分風リー微分

方向微分/外微分/リー微分/外微分風リー微分はいずれも、二項演算(双線形写像)をカリー化しただけの線形写像です。スカラー乗法の左右の違いとか、テンソル積か指数のどちらを使うか、などのどうでもいい差異から、様々な流儀や記法が(無駄に)派生しているだけです。

*1:[A, B] や BA という書き方は、一般に圏の指数対象に対して使われます。指数対象に関する、コンピュータ寄りの解説が「圏論的指数の周辺:ラムダ計算、デカルト閉圏、ノイマン型コンピュータ」にあります。

*2:ちなみに、 D(-) = D :Der(A)→[A, A]R は、Der(A) をR-ベクトル空間 [A, A]R に埋め込んでいるだけなので、事実上恒等写像です。

*3:交換子積として定義されたかどうかとは無関係に、リー環の積をリー括弧と呼ぶこともあります。

双対接続ペア

情報幾何の入り口: 雑感と補遺 // プライマル接続とパートナー接続」で、2つの接続(共変微分)が互いに共役〈conjugate〉である状況について述べました。この状況は、情報幾何だけでなくて、一般的な接続(共変微分)の文脈でも意味を持つし、なんかの役に立つ可能性があります。

ここでは、接続と共変微分完全な同義語として扱います。代数的な手法により、可換環上の(たちの良い)加群に対して共変微分=接続を定義します。

この記事の話は、次の特殊ケースを想定すれば十分です。UはRnの開集合として:

この特殊ケースを貼り合わせれば、多様体上での議論になります。

内容:

可換環加群

基礎体は実数体Rに固定します(他の体でもいいのですが、たいていはRを使うので)。AはR上のベクトル空間であり、可換・結合的・単位的な掛け算を持っているとします。このとき、AをR-可換環R-commutative-ring〉と呼ぶことにします。A上の加群A-加群〈A-module〉と呼びます。A-加群は必然的にR-ベクトル空間です。

Aは可換環なので、左加群と右加群の区別はしなくてもいいのですが、なんらかの事情(書き方の習慣とか、本質的ではないくだらない事情もある)で、左右の片一方しか許さない(あるいは、推奨しない)こともあります。そこで、ここでは左A-加群と右A-加群いちおう区別します。ただし、必要なときはいつでも、左A-加群も右-A加群も両側A-加群とみなします。ここでの左A-加群は、「どちらかというと、左からのスカラー乗法を推奨」という程度のものです。

以下に登場する(左、右、両側)A-加群は、すべて有限基底を持つとします。有限基底を持つ加群(有限生成の自由加群)は、ベクトル空間と同じように扱えます。この仮定が不要なことも多いですが、いざとなったら有限基底で議論できるとしておけば安心です*1

Der(A) は、A上のR-導分R-derivation〉の全体からなるR-ベクトル空間とします。これについては、「微分はライプニッツ法則に支配されている 2: 局所性 // R-導分の復習」を見てください。X∈Der(A) ならば、X:A→A というR-線形写像で、Aの掛け算(積)に関してライプニッツの法則を満たします。

M, N を両側A-加群だとして、両側A-加群準同型写像の全体を A-Mod(M, N) と書きます。これは、両側A-加群の圏のホムセットです。M, N はR-ベクトル空間にもなります。R-ベクトル空間としての M, N のあいだのR-線形写像の全体は R-Vect(M, N) と書きます。集合としては、A-Mod(M, N) ⊆ R-Vect(M, N) となります。

両側A-加群とみなした A-Mod(M, N) を [M, N]A と書きます。同様に、R-ベクトル空間とみなした R-Vect(M, N) を [M, N]R と書きます。[M, N]A, [M, N]R をそれぞれ、(Nを底とする)指数加群〈exponential module〉、指数ベクトル空間〈exponential vector space〉ともいいます。指数と呼ぶ理由は、[M, N] を NM と書くことがあるからです。

両側A-加群MとNの、可換環Aに対するテンソル積を M\otimes_AN と書きます。同様に、R-ベクトル空間MとNの、体Rに対するテンソル積を M\otimes_{\bf R}N と書きます。

テンソル積と指数の同型と同一視

これから述べる同型/同一視は、ちゃんと述べずに暗黙の常識として使われてしまうことが多いのですが、モヤッとする人もいるかも知れないのでハッキリさせます。

Mは左A-加群とします。繰り返しますが、Aが可換環なので、Mを右加群/両側加群にすることも出来ます。左からのスカラー乗法が推奨されているだけです。Nも左A-加群として、[N, A]A を N*A とも書きます。N*A は、Nの(Aに関する)双対加群です。N*A は右A-加群と考えます。このへんの左右の決め方は、絶対的な意味があるわけではなくて、記法のツジツマを合わせるための便宜的な約束です(くだらない約束とも言える)。

以上のセッティングで、次の同型が成立します。

  • N*A\otimes_AM \stackrel{\sim}{=} [N, M]A

この同型を与える加群同型写像を、右肩に乗せる演算子記号を使って (-)# としましょう。(-)# の具体的な定義は、f∈N*A, n∈N, m∈M として、

  • (f\otimesm)#(n) = f(n)・m

ここで、f∈N*A ⇔ f:N→A だったので、f(n) は関数の値です。'・'は加群スカラー乗法です。

多くの場合、(-)# を使って、N*A\otimes_AM と [N, M]A を同一視してしまいます。例えば、f\otimesm と (f\otimesm)# を区別せずに次のように書きます。

  • (f\otimesm)(n) = f(n)・m

M, N が右A-加群のとき(右スカラー乗法が推奨のとき)は、

  • M\otimes_AN*A \stackrel{\sim}{=} [N, M]A

この同型を与える加群同型写像を、(-) とすれば:

  • (m\otimesf)(n) = m・f(n)

(-) を使って、M\otimes_AN*A と [N, M]A も同一視します。

結果的に、N*A\otimes_AM と M\otimes_AN*A と [N, M]A は、ほんとは違うものだけど、テキトーに同じものだとみなす、という習慣があります。こういう、明示化されない暗黙の習慣は(僕は)嫌いなんですが、現に使われているのでしょうがないです。

微分形式の加群と外微分

R-可換環Aに対して、Der(A) はR-導分の加群でした。「微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場」で述べたように、A = C(U) の場合は、Der(A) はU上の接ベクトル場の加群とみなしてかまいません。Der(C(U)) = TVF(U) (TVFは Tangent Vector Field)ですね。

(1次の)微分形式の加群は、接ベクトル場の加群の双対なので、[Der(C(U)), C(U)]C(U)微分形式の加群です。この構成をR-可換環Aに関しても適用して:

  • Ω(A) := [Der(A), A]A = Der(A)*A

と定義します。これを、R-可換環Aの(1次の)微分形式の加群〈module of differential forms〉と呼びます。余導分の加群〈module of coderivations | coderivation module〉という言葉が適切な気がします(使われているのを見たことはありませんが)。導分=ベクトル場、余導分=余ベクトル場=微分形式 というわけです。

さらに、微分〈exterior {derivative | differential}〉 d:A→Ω(A) を次のように定義します。

  • (d(a))(X) := X(a)

Ω(A) = [Der(A), A]A だったことを思い出せば、この定義がwell-definedであることが分かるでしょう。

この記事内で使うわけではありませんが、ベクトル場=導分 や 微分形式=余導分 を具体的に計算するときは、基底による表示を使います。ベクトル場の加群=導分の加群 Der(A) が有限基底を持つとして、それを X1, ..., Xn としましょう。すると、任意の Y∈Der(A) は、

  •   Y = \sum_{i=1}^n y^i X_i \:\:\: {\mbox where}\: y^i \in A

と書けます。

x1, ..., xn∈A があって、Xi達と次の関係があるとします。

  •   X_i(x^j) = \delta_i^j

このとき、d(xj) 達は Ω(A) の有限基底となって、

  •  (d(x^j))(X_i) = \delta^j_i

となります。つまり、Xi 達と d(xj) 達は、互いに双対基底の関係にあります。伝統的記法では、

 X_i = \frac{\partial}{\partial x^i}, \:\: d(x^j) = dx^j, \\ (d(x^j))(X_i) = dx^j(X_i) = dx^j(\frac{\partial}{\partial x^i}) = \frac{\partial x^j}{\partial x^i}

と書きます。

接続付き加群

Mを左A-加群(左スカラー乗法を推奨)とします。写像 ∇:M→Ω(A)\otimes_AM が共変微分〈covariant derivative〉だとは、∇が次の性質をもつことです。

  1. ∇はR-線形である。
    1. ∇(m + m') = ∇(m) + ∇(m')
    2. ∇(r・m) = r・∇(m) for r∈R
  2. ∇はライプニッツ法則を満たす。
    ∇(a・m) = d(a)\otimesm + a・∇(m) for a∈A

Mを左A-加群とみての共変微分なので、左右の区別をしたいなら左共変微分となります。

Mが右A-加群の場合の右共変微分 ∇:M→M\otimes_AΩ(A) は次のようです。

  1. ∇はR-線形である。
    1. ∇(m + m') = ∇(m) + ∇(m')
    2. ∇(m・r) = ∇(m)・r for r∈R
  2. ∇はライプニッツ法則を満たす。
    ∇(m・a) = ∇(m)・a + m\otimesd(a) for a∈A

さきに述べた Ω(A)\otimes_AM \stackrel{\sim}{=} [Der(A), A]A、M\otimes_AΩ(A) \stackrel{\sim}{=} [Der(A), A]A という同型を使うと、共変微分を ∇:M→[Der(A), A]A の形で定義することもできます。

  1. ∇はR-線形である。
    1. ∇(m + m') = ∇(m) + ∇(m')
    2. ∇(r・m) = r・∇(m) for r∈R
  2. ∇はライプニッツ法則を満たす。
    (∇(a・m))(X) = d(a)(X)・m + a・(∇(m)(X)) for a∈A, X∈Der(A)

この場合は、∇(m)(X) を ∇X(m) とも書きます。この書き方を使えば:

  1. XR-線形である。
    1. X(m + m') = ∇X(m) + ∇X(m')
    2. X(r・m) = r・∇X(m) for r∈R
  2. Xライプニッツ法則を満たす。
    X(a・m) = X(a)・m + a・∇X(m) for a∈A

以上に述べたような細かい違いは、要するに書き方の習慣の違いだけです。書き方(記法)は大事ですが、書き方の違いだけで混乱・困惑しないように注意しましょう。

A-加群Mと共変微分∇を一緒にした (M, ∇) は共変微分付き加群です。共変微分と接続は同義語(として扱う約束)なので、接続付き加群〈module with connection〉と呼ぶことにします。

双対接続ペア

前節までで準備が出来たので、双対接続ペアを定義しましょう。

2つのA-加群 M, M' と、A-双線形写像 <-|->:M'×M→A が(A-加群の)双対ペア〈dual pair〉であるとは、<-|-> が非退化なことです。

  • b∈M' が ∀x∈M.(<b|x> = 0) ならば b = 0
  • a∈M が ∀y∈M'.(<y|a> = 0) ならば a = 0

M(またはM')が有限基底を持つとき、互いに双対な有限基底を取れるので、MとM'はA-加群として同型になります。しかし、この同型は標準的ではないので、積極的に使うべきものではありません。

(M, M', <|>) がA-加群の双対ペアのとき、A-双線形写像 <-|->:M'×M→A を拡張できます。

  • 拡張その1: <-|->' : Ω(A)\otimes_AM' × M → Ω(A)
  • 拡張その2: <-|->'' : M' × Ω(A)\otimes_AM → Ω(A)

それぞれの定義は:

  • \otimesb|a>' := ω・<b|a>
  • <b|a\otimesω>'' := <b|a>・ω

<-|->' も <-|->'' も <-|-> と書いてしまうことにします。つまり、<-|-> を、3種類の意味でオーバーロード〈多義的使用〉します。また、テンソル積やスカラー乗法の左右に関して神経質に気にすることもしません。普通のイイカゲンサで定義や計算をします。

双対接続ペアを構成する素材〈構成素〉は次のものです。

  • A-加群 M, M'
  • A-双線形写像 <-|->:M'×M→A
  • M上の接続 ∇:M→M\otimes_AΩ(A)
  • M'上の接続 ∇':M'→Ω(A)\otimes_AM'

(M, M', <-|->, ∇, ∇') が双対接続ペア〈dual connection pair〉だとは、(M, M', <-|->) がA-加群の双対ペアで、∇, ∇' が次のライプニッツの法則を満たすことです。

  • d<b | a> = <∇'b | a> + <b | ∇a> in Ω(A)

M = M' = C(U) で、<-|-> がリーマン計量を定義する内積のとき、情報幾何の共役接続ペアは、双対接続ペアになります。情報幾何の共役接続では、捩れ無しという付加的条件が付きます。M = M' = A、∇ = ∇' = d として、<-|-> はAの積とすれば、自明な双対接続ペアができます。


接続付き加群の圏における双対ペアの概念として、今定義した双対接続ペアは自然なのではないかと思います。

*1:なめらかな多様体を代数的に扱う場合、有限基底を持つことは強すぎる仮定ではありません。ベクトルバンドルのセクション加群は、局所的には有限基底を持ちますから。

微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場

U⊆Rn を開集合として、X:C(U)→C(U) が、ライプニッツ法則を満たすR-線形写像のとき、Xは通常の偏微分作用素 \partial_i = \frac{\partial}{\partial x^i} の関数係数線形結合で書けます。このことを示すことにしましょう。

また、ライプニッツ法則を満たすR線形写像Xと、接ベクトル場の関係についても述べます。これにて、「微分ライプニッツ法則に支配されている」というお話は完結です。

内容:

シリーズ目次:

  1. 微分はライプニッツ法則に支配されている
  2. 微分はライプニッツ法則に支配されている 2: 局所性
  3. 微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場

寄り道しながら

微分ライプニッツ法則に支配されている」というタイトルの一連の記事で僕が言いたいことは、ライプニッツ法則という代数法則で定義される作用素と、解析(微積分)的に定義される微分作用素が実は同じものだよ、ってことです。でも、そのことを述べる最短経路をとっているわけではありません。

微分はライプニッツ法則に支配されている」にて:

関数ジャームの空間を定義します。もっとも、関数ジャームの空間を作るのが面倒なら、代わりに、適当な開集合Uに対する C(U) でも大差ないです。「この機会に関数ジャームを紹介しました」という感じです。ジャームは、それだけでもけっこう役に立つ概念ですが、層の理論のなかで考えるのが自然かも知れません。

微分はライプニッツ法則に支配されている 2: 局所性」にて:

ユークリッド空間Rnの開集合Uで定義された関数の範囲では、後述の層(小さな開集合への制限)を使わなくても、前節最後の定理は出るような気がします。
...[snip]...
局所性を定式化するには、層の概念を使います。とはいえ、層の理論が必要なわけではなく、層の定義だけです。「層」という言葉を出す必要もないくらいです。

「絶対必要ではないけど…」と断りながら、色々な概念をつまみ食い的に紹介しています。関数ジャーム(無限小近傍で定義された関数)や層(関数の制限や貼り合わせのメカニズム)は、どっちみち使う道具なので、無駄な寄り道ではないでしょう。今回も、寄り道スタイルで、幾つかの概念を紹介します。ローカルな用語・記法も含まれます(断り書きを入れてます)。

Cr級関数、r = ∞ と r = -∞

U⊆Rn を開集合として、C0(U) は、連続関数 f:U→R の全体だとします。整数 r ≧ 1 に対して、Cr(U) は、r回微分可能で、微分した結果が連続であるような関数の全体とします。

第i方向への(通常の)偏微分作用素は、Di, ∂i, \frac{\partial}{\partial x_i} などと書きます。\frac{\partial}{\partial x_i} は、変数名が入るのが好ましくないので(「微分計算、ラムダ計算、型推論」参照)、僕はあまり使いません。f∈Cr(U) だとは、{∂1, ∂2, ..., ∂n} から、(重複を許して)r個選んで並べた作用素をfに作用させると(作用は可能だとして)、結果は連続関数になることです。次の言い方もします。

  • fはCr級の関数〈function of class Cr〉である ⇔ f∈Cr(U)

任意の r ≧ 0 に対して、f∈Cr(U) である関数の全体は C(U) と書きます。C(U) に入る関数をなめらかな関数〈smooth function〉と呼びます。

  •  C^{\infty}(U) = \bigcap_{r\in {\bf N}}C^r(U)

微分可能でも連続でもない(かも知れない)関数を考えることもあるので、任意の関数の全体を C-∞(U) と書くことにします。この記法はここだけのものです。

  • f∈C-∞(U) ⇔ fは単なる写像 ⇔ f∈Map(U, R)

アンダーラインを付けた U, R は、単なる集合としての(構造をすべて忘れた)UとR です*1

以下では、単に「関数」というとなめらかな関数を意味するので、何の条件もないC-∞級の関数は「勝手な関数」ということにします(ローカルルール)。

次のような包含の系列があります。

  • C(U)⊆ ... ⊆C2(U)⊆C1(U)⊆C0(U)⊆C-∞(U)

r = ∞ と r = -∞ も含めて、rの値が大きくなると小さな関数集合になります。

点導分と領域導分

微分はライプニッツ法則に支配されている」では、一般的な可換環加群に対して導分を定義しました。ここでは、二種類の導分を扱います。

[導分その1] Pが、C(U)からRへの点aでの導分だとは

  1. P:C(U)→R
  2. PはR-線形写像である。
  3. P(fg) = (Pf)g(a) + f(a)(Pg) --- ライプニッツ法則

[導分その2] Xが、C(U)からC(U)への導分だとは

  1. X:C(U)→C(U)
  2. XはR-線形写像である。
  3. X(fg) = (Xf)g + f(Xg) --- ライプニッツ法則

導分その1は、「微分はライプニッツ法則に支配されている」でジャームに対して定義しものと同じです。今回はジャームではなくて、関数そのものに作用するとします。

導分その2は、関数に関数を対応させるものです。通常の偏微分作用素i は、このタイプの導分になります。注意すべきは、導分といった場合、代数的に(公理的に)定義される作用素であり、特定の偏微分作用素かどうかは(今は)分からないことです。

導分その1を点導分〈point derivation〉、導分その2を領域導分〈region{nal}? derivation〉と呼ぶことにします。点導分は一般的に使われる言葉ですが、領域導分は見たことがないのでローカル用語です。

U上の関数の“点aでの点導分”の全体を PtDer(U, a) と書くことにします。U上の関数の“領域導分”の全体は RgnDer(U) にしましょう。「微分はライプニッツ法則に支配されている」で導入した一般的な記法である Der(A/K, M) を使うなら:

  • PtDer(U, a) := Der(C(U)/R, (R, a))
  • RgnDer(U) := Der(C(U)/R, C(U))

Der(A/K, M) という書き方で、MはA-加群です。点導分の場合は、Rに次のスカラー乗法(記号は'・')を入れた加群が (R, a) です。

  • For f∈C(U), r∈R,
    • f・r := f(a)r (fが左から作用)
    • r・f := rf(a) (fが右から作用)

領域導分の場合のスカラー乗法は:

  • For f∈C(U), g∈C(U)
    • f・g := fg (fが左から作用)
    • g・f := gf (fが右から作用)

作用素汎関数、なめらかさ

既に作用素という言葉を使ってますが、ここでは、限定的な意味で作用素」を使うことにします。U⊆Rn を開集合として、C(U) から C-∞(U) への写像R-線形であるとき作用素〈operator〉と呼びます。

作用素の余域〈codomain〉が勝手な関数の空間であることに注意して下さい。なめらかな関数fに対する作用素Kによる値 K(f) がなめらかかとは限りません。例えば、次のディリクレ関数hを掛け算する作用素 K(f) := hf を考えてください。

  • For x∈R, h(x) = if (xが有理数) then 1 else 0

f∈C(U) でも、K(f)∈C(U) とはなりません。

なめらかな関数を不連続関数に写して〈移して〉しまうような作用素はあんまり扱いやすくないですね。そこで、作用素なめらか〈smooth〉であることを、なめらかな関数をなめらかな関数に写すことと定義します。

  • K:C(U)→C-∞(U) がなめらか :⇔ For f∈C(U), K(f)∈C(U)

通常の偏微分作用素i は、定義からあきらかになめらかな作用素です。

汎関数」という、ちょっと古臭い言葉があります。ここでは、次の意味で使います。

  • F:C(U)→RR-線形のとき、Fを汎関数〈functional〉という。

作用素」に「線形」を付けなくとも線形性を仮定したので、同様に「汎関数」だけで線形性を仮定します(線形は織り込み済みとする)。

a∈U を決めて F(f) := f(a) は汎関数になります。a, b∈C として F(f) := f(a) + f(b) も汎関数です。X⊆U をコンパクト領域として、F(f) := \int_K f(x) dx という積分汎関数です。

K:C(U)→C作用素で、F:C(U)→R汎関数のとき、G = F\circK が汎関数であることは定義から明らかです。例えば、G(f) := (∂if)(a) は汎関数になります。

K:C(U)→C作用素で、a∈U のとき、K|a という汎関数を次のように定義できます。

  • (K|a)(f) := (K(f))(a)

既に使っている記法 ∂i|a は、偏微分作用素i に、この構成を施したものです。

勝手な(なめらかとは限らない)関数 g∈C-∞ と、勝手な(なめらかとは限らない)作用素 K:C→C-∞ を掛け算した gK を定義できます。そして、次の公式が成立します。

  • ((gK)(f))(a) = (g(a)(K|a))(f)

K = ∂i ならば、

  • ((g∂i)(f))(a) = (g(a)(∂i|a))(f)

iはなめらかですが、gが不連続だと、(g∂i)(f) はなめらかではないかも知れません。作用素  \sum_{i = 1}^n g^i \partial_i がなめらかかどうかは、次の命題から判断できます。

  • 関数  g^i 達がすべてなめらか ⇔ 作用素 K =  \sum_{i = 1}^n g^i \partial_i がなめらか

この(成立する)命題を、「なめらかさ補題〈smoothness lemma〉」と(ローカルに)呼ぶことにします。

なめらかさ補題を示しましょう。⇒方向は明らかなので、逆方向を示します。まず、第i射影関数 pi:RnR を、pi := λx∈Rn.(xi) と定義します。'λ'はラムダ記法のラムダです。微分幾何の習慣に従い添字は上付きです。pi を適当な開集合に制限した関数も同じ記号 pi と書きます。

次の事実はよく知られています。

  •  \partial_i p^j = \delta_i^j

ここで、 \delta_i^jクロネッカーのデルタです。変数名を使って書けば:

  •  \frac{\partial x^j}{\partial x^i} = \delta_i^j

これを使って、 K(p^j) を計算してみます。


K(p^j) \\
= (\sum_{i = 1}^n g^i \partial_i)(p^j) \\
= \sum_{i = 1}^n g^i (\partial_i p^j) \\
= \sum_{i = 1}^n g^i \delta_i^j \\
= g^j

関数pjはもちろんなめらかです。作用素Kは仮定よりなめからだったので、K(pj) はなめらかです。つまり、関数 gj 達はすべてなめらかになります。

領域導分の表示

通常の偏微分作用素i:C(U)→C(U) は領域導分です。つまり、ライプニッツ法則を満たすR-線形写像です。一般の領域導分 X:C(U)→C(U) が、∂i達の関数係数線形結合で書けることを示しましょう。なお、この事実を後で参照するときは領域導分定理〈region{al}? derivation theorem〉と呼ぶことにします。

最初に、「微分はライプニッツ法則に支配されている」の内容を、補題としてまとめておきます。

  • 点導分補題〈point derivation lemma〉: P:C(U)→R が点aでの点導分ならば、適当な実数 ξ1, ..., ξn が存在し、 P = \sum_{i = 1}^n \xi^i (\partial_i|_a) と書ける。

X:C(U)→C(U) が領域導分のとき、汎関数 X|a:C(U)→R が点導分になることはすぐにわかります。よって、点導分補題から、

  •  X|_a = \sum_{i = 1}^n \xi^i (\partial_i|_a) \:\:\: {\mbox where}\: \xi_i \in {\bf R}

と書けます。Uのすべての点aでこの表示を考えると、実数達 ξi, ..., ξn はaの関数となるので、次のように書けます。

  •  X|_a = \sum_{i = 1}^n \xi^i(a) (\partial_i|_a) \:\:\: {\mbox for}\: a \in U

これは、

  •  X = \sum_{i = 1}^n \xi^i \partial_i

を意味します。念のために、f∈C(U) にXを作用させて確認してみます。('//'は、等式変形に対するコメントです。)


(Xf)(a) \\
= (X|_a)f \\
// \:\: X|_a = \sum_{i = 1}^n \xi^i(a) (\partial_i|_a)  \\
= (\sum_{i = 1}^n \xi^i(a) (\partial_i|_a) )f \\
=  \sum_{i = 1}^n (\xi^i(a) (\partial_i|_a)f) \\
// \:\: (\partial_i|_a)f = (\partial_i f)(a) \\
=  \sum_{i = 1}^n \xi^i(a)( (\partial_i f)(a)) \\
=  ( (\sum_{i = 1}^n \xi^i \partial_i) f)(a) \\
これが、任意の a∈U に対して成立するので、

 Xf = (\sum_{i = 1}^n \xi^i \partial_i) f

さらにこれが、任意の f∈C(U) に対して成立するので、

 X = \sum_{i = 1}^n \xi^i \partial_i

これで得られた関数達 ξi がなめらかかどうかは、ただちには分かりませんが、領域導分Xは定義によりなめらかだったので、なめらかさ補題により ξi 達もなめらかです。

以上により、領域導分Xは  \sum_{i = 1}^n \xi^i \partial_i という一意的表示を持つことが分かりました。一点だけではなく領域(開集合全体)においても、ライプニッツ法則を満たす線形作用素は、我々が知っている「あの微分」(後述の方向微分)に限るのです。別な言い方をすると、代数的に定義された導分は、解析的に定義された微分に一致します

接ベクトル場

「接ベクトル場」というと、心に描くイメージは次のようなものでしょう。

*2

ユークリッド空間Rnの点 a = (a1, ..., an) にくっついているベクトル v(a) の成分表示を、


v(a) = v(a_1, \cdots, a_n) = \begin{pmatrix}
v^1(a_1, \cdots, a_n) \\
\cdots \\
\cdots \\
v^n(a_1, \cdots, a_n) \\
\end{pmatrix}

とします。点の座標を a = (a1, ..., an)、接ベクトル場の成分表示を (v1(a), ..., vn(a)) と書いています。aが動く範囲を U⊆Rn とすると、接ベクトル場は v:U→Rn という写像で表現できます。これを接ベクトル場の仮の定義として採用します。つまり:

  • U⊆Rn上の接ベクトル場(仮)〈tangent vector field (provisional)〉とは、v:U→Rn というなめらかな(Cな)写像である。

さてここで、異なる点の接ベクトルは異なるとして、点aにおける接ベクトルは (a, ξ) または ξ@a と書くことにします。すると、接ベクトルの全体は U×Rn = {(a, ξ) | a∈U, ξ∈Rn} となります。

ベクトル場は、点aに、その点における接ベクトルを対応させます。よって、次のような写像になります。

  • w:U→U×Rn
  • π\circw = idU

ここで、π:U×Rn→U は、π(a, ξ) = π(ξ@a) = a と定義される射影です。wを、w(a) = (f(a), v(a)) と分解してみると、上記二番目の条件から、f(a) = a となり、w(a) = (a, v(a)) と書けます。これは、wはvだけで決まってしまうことを意味します。しかし、「異なる点の接ベクトルは異なる」という発想は、接ベクトル場(仮)とは違います。次の定義をします。

  • U⊆Rn上の接ベクトル場〈tangent vector field〉とは、w:U→U×Rn というなめらかな(Cな)写像で、π\circw = idU を満たすものである。

接ベクトル場wは、w(a) = v(a)@a と書けます。wとvは1:1に対応するので、記号の乱用で、v(a) = v(a)@a と書いていしまうことがあります。不正確でヨロシクナイけど、このような乱用は使われます。

a∈U に対して、Rn@a を次のように定義します*3

  • Rn@a = {ξ@a | ξ∈Rn} = {(x, ξ)∈U×Rn | x = a} = {a}×Rn

射影 π:U×Rn→U を使って書けば:

  • Rn@a = π-1(a)

もし、ファイバーバンドルのファイバーの記法をご存知なら、

  • Rn@a = (U×Rn)a

領域導分と接ベクトル場の対応

前節で接ベクトル場を定義しました。領域(開集合)U上の接ベクトル場の全体を TVF(U) とします(TVF = Tangent Vector Field)。

X:C(U)→C(U) がU上の領域導分(X∈RgnDer(U))のとき、U上の接ベクトル場 v = ΞX が決まります。ここで、Ξは、Ξ:RgnDer(U)→TVF(U) という写像です*4

また、vがU上の接ベクトル場(v∈TVF(U))のとき、U上の領域導分 X = Dv が決まります。ここで、Dは、D:TVF(U)→RgnDer(U) という写像です。

今述べたΞとDをちゃんと定義した上で、互いに逆であること(↓)を示しましょう。

  1. For X∈RgnDer(U),
    let v = ΞX
    then Dv = X
  2. For v∈TVF(U),
    let X = Dv
    then ΞX = v

まず、Ξの定義; X∈RgnDer(U) とすると、領域導分定理により、なめらかな関数達 ξi∈C(U) があって、 X = \sum_{i=1}^n \xi^i \partial_i と書けるのでした。このξi達を使って、

  • v = ΞX = λa∈U.((ξ1(a), ..., ξn(a))@a)

と定義します。簡潔に書くなら v(a) = ξ(a)@a です。X \mapsto ξ \mapsto v という対応が Ξ:C(U)→TVF(U) です。

次に、Dの定義; v∈TVF(U) として、乱用記法により v(a) = v(a)@a と書きます。v(a)を成分表示すると、v(a) = (v1(a), ..., vn(a)) 、この関数達 vi を使って、

  •  D_v := \sum_{i=1}^n v^i \partial_i

と定義します。v \mapsto Dv が D:TVF(U)→RgnDer(U) です。Dvは、接ベクトル場vによる方向微分〈directional {derivative | differential}〉といいます。

一点aで考えると、点導分  \sum_{i=1}^n\xi^i (\partial_i|_a) と、接ベクトル (ξ1, ..., ξn)@a (ただし、ξ1, ..., ξn は実数)が対応することになります。

ΞとDが互いに逆になることは容易に確認できるでしょう(割愛)。

領域導分と接ベクトル場の同一視

この記事では、U上の接ベクトル場を写像 v:U→U×Rn として定義しました。そして、接ベクトル場と領域導分が1:1に対応することを示しました。

最近の流儀だと、いきなり「接ベクトル場とは領域導分のことである」と定義することが多いです。このほうが手っ取り早く効率的です。が、唐突過ぎて困惑する人もいるでしょう。僕は「はぁーっ??」と思いました。領域導分は、接ベクトル場の直感と(当初は)かけ離れていますから。

そんな事情があるので、だいぶ丁寧に「領域導分を接ベクトル場とみなしてもいい」事情を説明したのでした。

前節で説明した「領域導分と接ベクトル場のあいだの対応」を使って、領域導分と接ベクトル場を同一視してしまいます。つまりは、「接ベクトル場とは領域導分のことである」と定義するのと同じことです。

なぜこのような同一視をするかと言うと、接ベクトル場の直感的イメージよりは、領域導分のほうがはるかに扱いやすいからです。

このような定義は、概念が“高階化”してますが、それにより“代数化”されています。代数的(代数化された)定義は、計算に向いており、等式的変形で命題が示せる場合が多くなります。これは、扱いやすさにつながります。

言いたいことは言ったので、「微分ライプニッツ法則に支配されている」シリーズ(結果的に3回)はオシマイです。

*1:アンダーラインを付けるのは、underlying set だから、underlying ≒ underlining というダジャレです。

*2:元画像: https://reference.wolfram.com/language/howto/PlotAVectorField.html.ja Wolfram言語&システムのマニュアルから。

*3:この記事内では、Rn@a は使いませんでした。が、いつか使うかも知れないので定義を残しておきます。

*4:Ξは、Uごとに決まるので、UΞ:RgnDer(U)→TVF(U) と書くべきでしょうが、開集合Uによるインデックスは省略します。

微分はライプニッツ法則に支配されている 2: 局所性

微分はライプニッツ法則に支配されている」において、ライプニッツ法則を満たす線形作用素は、我々が知っている微分に限ることを示しました。しかし、それは一点での話です。ある領域全体に対して、「ライプニッツ法則を満たす線形作用素 = 我々が知っている微分」とは言ってません。

それで、領域全体での話をしようと思ったのですが、今日は気力に欠けるので、話の半分(だか1/3だか?)だけすることにします。微分作用素の特徴として、「R-線形性」と「ライプニッツ法則」以外に、「局所性」もあるよ、という話です。

内容:

シリーズ目次:

  1. 微分はライプニッツ法則に支配されている
  2. 微分はライプニッツ法則に支配されている 2: 局所性
  3. 微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場

R-導分の復習

まずは、「微分はライプニッツ法則に支配されている」の復習をすると同時に、状況を特殊化して、用語・記法を簡略にします。

前の記事では、一般的な2つの可換環 K, A に対して相対可換環 A/K を考えましたが、ここでは、K = R固定します。相対可換環 A/RR-多元環R-代数〉と言っても同じです。Aが一般的な多元環ではなく、Aも可換環なので、A/RR-可換環R-commutative-ring〉ということにします。常に A/R と書くのもバカバカしいので、単にAと略記します。

AがR-可換環、MはA-加群(必然的にR-ベクトル空間)として、導分 X:A→M (X∈Der(A/R, M))を、AのMへのR-導分R-derivation of A into M〉と呼ぶことにします。R-導分の'R-'もしばしば省略します。単に導分といえば、R-導分です。

A = CGerm(Rn, 0), M = R(ただし、RにA-加群構造を考える) として、\partial_i|_0:A→RR-導分になるのでした。逆に、X:A→RR-導分なら、それは \partial_i|_0 達の実数係数線形結合で書けます。(それが、「微分はライプニッツ法則に支配されている」の主たる内容。)

関数ジャームの可換環ではなくて、なめらかな(Cな)普通の関数の環をAとしましょう。つまり、U⊆Rn を開集合として A = C(U) 。このとき、導分 X:A→A はどのように書けるか? が次の課題になります。結論を言えば、Xは我々が知っている偏微分作用素 \partial_i = \frac{\partial}{\partial x_i} の関数係数の線形結合で書けます。([追記]微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場」で示しています。[/追記]

  •  X = \sum_{i=1}^n f^i \partial_i  \:\:\: {\mbox where}\: f^i \in C^{\infty}(U)

関数の番号を上付き添字にしたのは、微分幾何の習慣(和を取る添字は上下に現れる)に従って、です。

作用素の局所性

前節最後に述べた結果を示そうと思うと、XがR-線形でライプニッツ法則を満たす作用素だという仮定だけからは難しいようです。別な言い方をすると、我々が知っている通常の偏微分作用素(関数から関数への作用素)は、R-線形性とライプニッツ性という代数的な条件だけでは特徴付け出来ないのです。([追記]ユークリッド空間Rnの開集合Uで定義された関数の範囲では、後述の層(小さな開集合への制限)を使わなくても、前節最後の定理は出るような気がします。たぶん、そのうち書きます。[/追記])([さらに追記]微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場」に書きました。[/さらに追記]

我々が知っている偏微分作用素は、代数的ではない条件としての「局所性」を持っています。局所性〈locality〉とは、開集合Uの小さな部分領域V(別に小さくなくてもいいんだけどさ)においてだけ偏導関数を求めたいとき、Vの外における関数の挙動は関係しないことです。

局所性をハッキリと述べるために記号を導入します。偏微分作用素 \partial_i が作用する空間が C(V) のとき、 {}^V\partial_i と書くことにします。奇妙な記法ですが、右下添字は方向の番号、右上も  \partial_i^2 = \partial_i \partial_i として使う可能性があります。開集合Vを書く場所が左側添字しか残ってないのですよ*1

V⊆U⊆Rn、VもUも開集合として、次が成立します。

  • For f∈C(U),
     ({}^V\partial_i)(f|_V) = (({}^U\partial_i)f )|_V

ここで、'|V'は、関数の定義域をVに制限することを意味します。この等式が言っていることは:

  • 関数fを小さな領域Vに制限してから微分しても、微分した関数fを小さな領域Vに制限しても同じ。

これが局所性の定式化です。

R-可換環

R-可換環R-導分という代数的な道具だけだと、「関数を小さな領域に制限する」ことを表現できません。したがって、局所性を定式化することもできません。局所性を定式化するには、層の概念を使います。とはいえ、層の理論が必要なわけではなく、層の定義だけです。「層」という言葉を出す必要もないくらいです。

以下、開集合 U⊆Rn を固定します。R-可換環Aをひとつだけ考えるのではなくて、開集合V(ただし、V⊆U)ごとにR-可換環 A(V) がくっついている状況を考えます。開集合でインデックスされたR-可換環の族〈family〉ですね。次のような書き方をしましょう。

  • (A(V) | V⊆U)

「関数を小さな領域に制限する」ことに対応した、制限準同型写像〈restriction homomorphism〉の族もあります。V, WがUの部分開集合で、W⊆V のとき、

  • ρW⊆V:A(V)→A(W)

というR-可換環準同型写像(これが制限準同型写像)があるとします。a∈A(V) に対して、ρW⊆V(a)∈A(W) を a|W と略記します。この書き方をすると「制限した」雰囲気がただよいます。

R-可換環の族 (A(V) | V⊆U) と準同型写像の族 (ρW⊆V:A(V)→A(W) | W⊆V⊆U) からなるシステムがR-可換環の層〈sheaf of R-commutative-rings〉です。これらは、「制限する」にふさわしい幾つかの性質を持ちます。が、その性質(公理)は直感的に自然なものなので割愛します。

導分の層

AがR-可換環のとき、AのAへのR-導分〈R-derivation of A into A〉とは(復習):

  1. X:A→A は、R-線形写像
    1. X(a + b) = Xa + Xb
    2. X(ra) = r(Xa)
  2. X:A→A は、ライプニッツ法則を満たす X(ab) = (Xa)b + a(Xb)

単一のR-可換環の導分ではなくて、R-可換環の層に対する導分を考えましょう。((A(V) | V⊆U), (ρW⊆V:A(V)→A(W) | W⊆V⊆U)) を前節で述べたR-可換環の層だとします。層のシステム全体をまとめてAで表します。

  • A = ((A(V) | V⊆U), (ρW⊆V:A(V)→A(W) | W⊆V⊆U))

これから、層Aに対して、Xが A→A という導分(AのAへの導分)を定義しましょう。もちろん、Xは単独の導分ではダメです。Aが層、つまりインデックス族〈indexed family〉なので、Xもインデックス族になります。V⊆U に対して:

  • VX:A(V)→A(V)

全体としては、

  • X = (VX:A(V)→A(V) | V⊆U)

VX が導分になっていることは要求するので、X = (VX:A(V)→A(V) | V⊆U) は、導分のインデックス族です。

さらに、VX 達は、制限準同型写像 ρW⊆V 達と整合性を持たなくてはなりません。具体的に言えば、次の等式の成立を要求します。

  •  ({}^W X)\circ(\rho_{\,W \subseteq V}) =  (\rho_{\,W \subseteq V} )\circ({}^V X)

a∈A(V) を引数に渡せば:

  •  ({}^W X)(\rho_{\,W \subseteq V}(a)) = \rho_{\,W \subseteq V}( ({}^V X)a)

制限を縦棒記法で書けば:

  •  ({}^W X)(a|_W) = (({}^V X)a)|_W

この等式が言っていることは:

  • 要素aを小さな領域Wに制限してからXしても、Xした要素aを小さな領域Wに制限しても同じ。

つまり、Xが局所性を持つことです。

今述べたようなXを導分の層〈sheaf of derivations〉(ちゃんと言えばR-導分の層)といいます。導分の層とは、局所性を持つ導分の族です。

[追記][補足]「導分の層」という言い方は、誤解と混乱をまねくリスクが少しあるかも知れません。補足しておきます。U⊆Rn は開集合とします。

話を簡単にするために、代数構造が入ってない単なる集合と写像の例で話します。AとBが、U上の集合の層だとします。つまり、部分開集合 V⊆U ごとに、集合 A(V), B(V) が割り当てられており、制限写像も備わっているとします。

この状況で、写像の層とは、V⊆U でインデックスされた写像の族

  • Vf:A(V)→B(V)

のことです。Vが左肩に乗っているのは行きがかり上です。右下添字が多いです。

写像の層は、集合の層のあいだの準同型なので、集合の層の準同型〈homomorphism〉といったほうが正確で誤解は少ないでしょう。

2つの集合があると、写像の集合が定義できます。それを、Map(-, -) で表しましょう。2つの集合の層 A, B に対して、第三の集合の層 M を次のように定義できます。

  • M(V) = Map(A(V), B(V))

これは、“写像集合の層”という集合の層です。写像の層と写像集合の層は別物です。写像の層は、写像集合の層のセクションになっています。次のことが言えます。

  • 写像の層は、集合の層ではなくて、写像集合の層のセクションである。

となると、「写像の層」という言い方は不適切だとも言えます。「(集合の)層じゃなくて、セクションでしょ。セクションを層と呼ぶのはいかがなものか?」と言われれば、おっしゃるとおり。

「導分の層」も、「可換環の層/加群の層と整合性を持つ導分の族」とか言えば正確でしょう。でも、長ったらしい。このへんの言い回しは悩みますねー。
[/補足][/追記]

微分作用素の抽象化・公理化

我々が知っている具体的な微分作用素は局所性を持っています。局所性は大事な性質です。微分作用素を抽象化・公理化しようとするとき、局所性を取り除いてしまうわけにはいかないので、抽象的セッティングで局所性を定式化する必要があります。

R-可換環の層、可換環上の加群の層、可換環準同型の層*2、導分の層などの、ナントカの層を使うと、代数的な構造と局所性がミックスされた状況をうまく表現できます。

単一の導分ではなくて、導分の層が、微分作用素の抽象化・公理化としてふさわしいものです。局所性を備えていますからね。

*1: \partial_{i, V} のように書くテもありますが。

*2:可換環の層”の準同型(層のあいだの準同型)と可換環準同型の層は、同じになります。が、この2つの概念が同値であることをキチンと述べるのはけっこう大変です。

長時間労働について: 檜山の地雷を踏まないで 2

掛け算の順序問題: 檜山の地雷を踏まないで」において、掛け算の順序を区別することに反対するエモーショナルな理由を説明しました。ここでは、長時間労働に反対するエモーショナルな理由を説明します。

内容:

僕はムカついた

人が何かをする動機って、けっこう感情的ですよね。僕も、「カッとなってやった」がたまにあります。次の2つの記事を書いたのも、カッとなって、です。

実はね、米村さんの発言(下のツイート)を見た瞬間にムカッとしたのね。

米村歩@日本一残業の少ないIT企業社長(@yonemura2006)

100mを12秒で走れる人が1000mを120秒で走れるわけではないという事実は誰でも理解できるのに、1日16時間働いても8時間働く場合の2倍の成果になるわけではないということを理解できない人が結構いるのはなぜなのか。

「なんだコイツ」って感じ*1。でも、「ムカついたぞ、バカヤロー」的発言はしたくはない -- ひとつの理由は気恥ずかしいから。素直じゃないと言えば、そのとおり。もうひとつの理由は、ムカついたときの判断は間違っている可能性が高い。過剰反応だったり誤解してたり。

それで、間違いが表面化しにくい体裁で記事を書きました*2。でも、ムカついたのが動機だから、どうしても攻撃的になりますね。「あなたの議論は論理的に杜撰だ」という形になってますが、本音は「おめえの言ってることは気に入らねー」です。

もし僕の言うことが、やっぱり過剰反応や誤解だとしたら、ごめんなさい。そこは檜山の地雷だったんです*3。踏んだ人はイノセントかも知れません。

疲労による効率低下は当たり前

三番目になるこの記事を書いた動機は、何日かたってムカつきはおさまっても「気に入らねー」感覚が残っていること、それと、knさんのコメントへの応答で、ごく短く本音を書いてしまったので、もうチョイ長い説明をしたほうがいいかな、と思ったからです。

knさんは、仕事でも陸上競技でも共通すること(アナロジー)として「疲労による効率の低下」を挙げています。米村さんご自身が、疲労と効率の問題に主眼を置いていたかどうかは分かりませんが、「かけた時間と成果は比例しない」と言っているので、疲労と効率の問題も含まれるでしょう。

ですが、長時間労働を論ずるにあたって、疲労と効率の問題なんてどうでもいいんです。だって、「疲労による効率低下はない」からと長時間労働をする/させる人なんていないでしょう。「かけた時間と成果は比例しない」なんて誰だって知ってます。陸上競技による比喩なんて不要。

例えば、締め切りまであと2日で、3日分(8時間×3)の作業が残っているとき、効率低下を見越して1日16時間働くことはありますよね。2倍の時間で1.5倍の成果を見積もっているわけです。

非効率的だからマズイのではない

いま例に出したような、締め切り前に16時間労働とかは、僕もよくやったし、皆さんも経験あるでしょう。それが悪いですか? しょうがないですよね、そんなこともあります。

長時間労働がマズイのは、それが組織の習慣、文化(とは言わねーか)として常態化しているときです。常態化した長時間労働が、効率や成果の観点から劣っているかどうかはなんともいえません。2倍の時間で1.5倍の成果が出れば、ビジネス的には「良い」という判断もあるでしょう。

米村さんの発言について、僕は次のように批判的な言い方をしました:

詭弁を反駁するために詭弁を使ってしまうと、より強力な(よりインチキな)詭弁で反論される危険があります。しかも、「それは詭弁だろう」とも言い返せません -- 自分が詭弁を弄しているので。

ここで「詭弁」と言っているのは、論理的不整合よりはむしろ、効率や成果という尺度で語っていること自体が、アンチ長時間労働にふさわしくないと思えるからです。「2倍の時間で1.5倍の成果が出ればいい」の人々と同じ土俵にいます。そこでは、論点がずれた詭弁の応酬になります。

常態化した長時間労働は、働く人や家族の心身や生活を犠牲にするからダメなんです。2倍の時間働くことで売り上げが増えたとしても、その増えた分は、働く人や家族の痛みをお金に換えたものです。効率や成果の尺度で測ってダメなのではなく、やってはいけないことだからダメなんです。

*1:言いたいことの結論(長時間労働に反対)が自分と一致していることが、かえって感情を逆なでしたのかも知れません。

*2:カッとなっても、こういう冷静さを保っているところは歪んでいるな、嫌な性格だ。

*3:地雷の在り処は、「掛け算の順序問題: 檜山の地雷を踏まないで」とそこから参照されている過去記事に書いてあります。

微分はライプニッツ法則に支配されている

一昨日某所にて、「微分計算は、線形性とライプニッツ法則があれば OK」みたいな話が出ました。これがウソではない傍証として、とある状況において、ライプニッツ法則を満たす線形作用素は、我々が知っている「あの微分」に限ることを見てみましょう。

内容:

シリーズ目次:

  1. 微分はライプニッツ法則に支配されている
  2. 微分はライプニッツ法則に支配されている 2: 局所性
  3. 微分はライプニッツ法則に支配されている 3/3: 領域導分と接ベクトル場

相対可換環の導分

議論を代数的に行うので、代数的な概念を幾つか導入しておきます。

KとAは可換環とします。'K'と書くと体のような感じがするでしょうし、実際にKが体の場合が多いのですが、「体である」とは言ってません、可換環です。ここに、可換環準同型写像 σ:K→A があるとき、これらの組 (K, A, σ) を相対可換環〈relative commutative ring〉と呼びます*1

習慣により、相対可換環 (K, A, σ) を A/K と書きます*2。スラッシュは商をとっているわけではなくて、"A over K" と読みます。このスラッシュには要注意! σ:K→A は、建前としては単射とは仮定していません。でも、単射でないときは K/Ker(σ) (今度のスラッシュは、イデアルによる商)を新たにKと置いて、σは単射と仮定してもかまいません。つまり、K⊆A とみなしていいわけです。K⊆A であるなら、r∈K に対して、σ(r)∈A を単に r と書いても同じですから、そう書きます(若干、混乱の危険がありますが)。

さて、写像 D:A→A が、A/Kの導分〈derivation〉だとは、次が成立することです。

  1. Dは、Kに関して線形である。
    1. a, b∈A に対して、D(a + b) = D(a) + D(b)
    2. r∈K, a∈A に対して、D(ra) = r(D(a))
  2. Dは、ライプニッツ法則を満たす。D(ab) = (D(a))b + a(D(b))

以下、D(a) を Da のようにも書きます。

相対可換環A/Kの導分の全体を Der(A/K) または DerK(A) と書きます。

次に、MをA-加群とします。Aは可換だったので、左加群と右加群の区別をする必要はありません。AがMに(左または右または左右から)作用しているので、KもMに作用し、MはK-加群にもなります。AまたはKによるMへの作用(スカラー乗法)は、ドット'・'で書くことにします。

写像 D:A→M が、A/KのMに値を持つ導分〈derivation〉だとは、次が成立することです。

  1. Dは、Kに関して線形である。
    1. a, b∈A に対して、D(a + b) = Da + Db in M
    2. r∈K, a∈A に対して、D(ra) = rDa in M
  2. Dは、環の乗法(無印)とスカラー乗法'・'に対して、ライプニッツ法則を満たす。D(ab) = (Da)・b + a・(Db) in M

相対可換環A/KのMに値を持つ導分の全体を Der(A/K, M) または DerK(A, M) または DerA/K(M) と書きます。先の「A/Kの導分」は、「A/KのAに値を持つ導分」ですから、Der(A/K) = Der(A/K, A) です。

ちなみに、導分を微分〈differential〉と呼んでもかまいませんが、ここでは、代数的に定義される作用素なので微分とは別な言葉を使いました。

ユークリッド空間上の関数ジャームの空間

関数fの一点aでの微分係数は、fの、点aのまわりの局所的な振る舞いで決まります。このことをハッキリと述べるために、関数ジャームの空間を定義します。もっとも、関数ジャームの空間を作るのが面倒なら、代わりに、適当な開集合Uに対する C(U) でも大差ないです*3

ここから先、U, V などは、Rnの原点('0'と書く)を含む開集合とします。

  • C(U) = {f:U→R | fは、U上で定義された何回でも微分可能な関数}

f∈C(U) と g∈C(V) が、原点のまわりでの振る舞いが同じことを f ~ g と書きましょう。~ の定義は:

  • f ~ g :⇔ 0∈W, W⊆U, W⊆V である開集合Wが存在して、f|W = g|W

ここで、f|W は、fの定義域をWに制限した関数です。

~ は同値関係になりますが、その同値関係が載る集合は次のような大きな集合です。

  •  \bigcup_{U\in Open({\bf R}^n, 0)}C^\infty(U)

ここで、Open(Rn, 0) は、Rnの原点を含む開集合からなる集合とします。

関数ジャームの空間 CGerm(Rn, 0) は次の商集合です。

  •  C^{\infty}Germ({\bf R}^n, 0 ) := (\bigcup_{U\in Open({\bf R}^n, 0)}C^\infty(U))/\sim

要するに、0の近くで同じ関数は同一視してしまった関数集合が CGerm(R, 0) です。CGerm(R, 0) の要素を(0における)関数ジャーム〈germ of a function〉と呼びます*4。関数ジャームは、適当なUに対するC(U)の要素f(普通の関数)を用いて、[f](fの同値類)の形で表せます。

関数ジャーム可換環の実数値の導分

関数ジャームの空間 CGerm(Rn, 0) は、自明な方法で可換環になります。

  • 足し算: [f] + [g] := [f + g]
  • 掛け算: [f][g] := [fg]

実数を定数関数とみなすことにより、可換環準同型写像 σ:R→CGerm(Rn, 0) を定義できます。したがって、(CGerm(Rn, 0), R, σ) = CGerm(Rn, 0)/R相対可換環になります。この例では、Rは体で、σは単射準同型写像です。

次に、加法群としてのRを、可換環CGerm(Rn, 0)/R上の加群とみなしましょう。係数環がCGerm(Rn, 0)/Rで、加群の台加法群〈underlying additive group〉がRですから注意してください。

関数ジャーム φ = [f] による実数rへの作用(スカラー乗法)は:

  • 左から: φ・r := φ(0)r
  • 右から: r・φ := rφ(0)

ここで、φ(0) = f(0) ですが、代表元fの取り方によらずに決まる実数値です。

いま定義したスカラー乗法'・'により、Rは関数ジャーム可換環CGerm(Rn, 0)上の加群となり、必然的に相対可換環 CGerm(Rn, 0)/R 上の加群となります。

以上のセットアップで、相対可換環 CGerm(Rn, 0)/RRに値を持つ導分の集合 Der(CGerm(Rn, 0)/R, R) を考えることができるようになりました。

Der(CGerm(Rn, 0)/R, R) が、実数体R上のベクトル空間になることは容易に分かります。さて、どんなベクトル空間なのでしょうか? 有限次元でしょうか? 有限次元ならどんな基底を取れるでしょうか? -- 次節と次々節でこの疑問に答えましょう。

導分の有限次元表示

X∈Der(CGerm(Rn, 0)/R, R) とします。つまり、Xは関数ジャーム可換環Rに値を持つ導分 X:CGerm(Rn, 0)→R です。導分Xは、実は次の形に書けます。

  •  X = \sum_{i=0}^n \xi^i (\partial_i|_0)

ここで、ξi達はn個の実数です。添字を上にしたのは習慣に従ってです。∂i|0 は、関数(のジャーム)の原点0における第i偏微分係数を取る作用素です。

  •  (\partial_i|_0)[f] := [(D_i f)(0)]

いちいちジャームとしての同値類を取る(ブラケットを付ける)のが煩雑なら、次のように書いてもかまいません*5

  •  (\partial_i|_0)f := (D_i f)(0) = (\frac{\partial}{\partial x^i} f)(0)

作用素 (\partial_i|_0)は、関数に作用するとみても、ジャームに作用するとみてもかまいません。テキトーに融通してください。

先の表示  X = \sum_{i=0}^n \xi^i (\partial_i|_0) におけるξi達は一意に決まります。つまり、R上のベクトル空間 Der(CGerm(Rn, 0)/R, R) は、基底 {(∂1|0), (∂2|0), ..., (∂n|0)} を持つ有限次元ベクトル空間なのです。そのことを次節で示します。

有限次元性の証明

引き続き X∈Der(CGerm(Rn, 0)/R, R) とします。

X1 = 0 はすぐにわかります。なぜなら… … … ウーンと、困ったな、1と1のジャーム可換環内での積をどう書こうか? '11'だとジュウイチになるし、'1・1'はスカラー乗法と約束したし… 1×1 にするわ。

  • For 1∈CGerm(Rn, 0),
    X1 = X(1×1) = (X1)・1 + 1・(X1) in R

よって、

  • For 1∈CGerm(Rn, 0),
    X1 = X1 + X1 in R

Rの要素でこれを満たすのは0だけなので、X1 = 0 です。導分はR-線形だったので、r∈R に対して、

  • For 1∈CGerm(Rn, 0),
    X(r1) = r(X1) = r0 = 0 in R

これより、定数関数の導分(の結果)はゼロです。

次に、φ(0) = 0, ψ(0) = 0 のとき、X(φψ) = 0 です。なぜなら、

  • For φ, ψ∈CGerm(Rn, 0),
    X(φψ) = (Xφ)・ψ + φ・(Xψ) in R

さらに、スカラー乗法'・'の定義と φ, ψ に関する仮定により、

  • (Xφ)・ψ + φ・(Xψ) = (Xφ)ψ(0) + φ(0)(Xψ) = (Xφ)0 + 0(Xψ) = 0

以上で補題が準備できました。

  1. 補題1: r∈R に対して、X(r1) = 0
  2. 補題2: φ(0) = 0, ψ(0) = 0 ならば、X(φψ) = 0

微分の話をするので、100%代数的というわけにはいきません。解析からの結果も使います。0∈U⊆Rn は開集合だとして、関数 f∈C(U) は、次のようにテイラー/マクローリン展開できます。

  •  f(x) = f(0) + \sum_{i=1}^n (\frac{\partial f}{\partial x^i}(0))x^i + \sum_{i=1}^n g_i(x)x^i

ここで、giは、gi(0) = 0 である関数です。偏微分係数 \frac{\partial f}{\partial x^i}(0)は実定数なので、

  •  a_i := \frac{\partial f}{\partial x^i}(0)

と置きます。また、(下の二番目に出てくるλはラムダ記法のλです。)

  •  \phi = [f]
  •  \pi^i = [\lambda x \in {\bf R}^n.(x^i)]
  •  \psi_i  = [g_i]

と置くと、上のテイラー/マクローリン展開を関数ジャームの等式に落とせます。

  •  \phi = f(0) + \sum_{i=1}^n a_i\pi^i + \sum_{i=1}^n \psi_i \pi^i \:\:\:\: in\: C^{\infty}Germ({\bf R}^n, 0)

φ = [f] に導分Xを作用させてみると、Xの線形性により:


X\phi = X(f(0) + \sum_{i=1}^n a_i\pi^i + \sum_{i=1}^n \psi_i \pi^i) \\
\:\:\ = X(f(0)) + \sum_{i=1}^n a_i X(\pi^i) + \sum_{i=1}^n X(\psi_i \pi^i)

補題1と補題2により、第1項と後半の総和は消えてしまうので、


X\phi = \sum_{i=1}^n a_iX(\pi^i)

ξi = X(πi) と置いて、ai達を(形を変えて)偏微分係数に戻すと:


X\phi = \sum_{i=1}^n \xi^i (\partial_i|_0)(\phi)

これで目的の等式が得られました。

まとめると; 任意の導分 X:CGerm(Rn, 0)→R は、基底 {(∂1|0), (∂2|0), ..., (∂n|0)}⊆CGerm(Rn, 0) のR-線形結合として書けます。

  •  X = \sum_{i=1}^n \xi^i (\partial_i|_0)

このときの実数係数ξiは、

  •  \xi^i =  X(\pi^i)

別な言い方をすると、写像  X \mapsto (X(\pi^i))_{i=1,\cdots,n} が、Der(CGerm(Rn, 0)/R, R)→Rn というベクトル空間のあいだの同型を与えます。

  • Der(CGerm(Rn, 0)/R, R) \stackrel{\sim}{=} Rn 基底 (∂i|0)達による同型

*1:[追記]AはK-可換代数〈K-可換多元環〉だと言っても同じです。また、CRing可換環の圏だとして、アンダー圏 K/CRing の対象が相対可換環だとも言えます。Kを固定しないなら、関手圏 [{・→・}, CRing] の対象が相対可換環になります。[/追記]

*2:体の拡大を L/K と書くのと同じ習慣なのだと思います。

*3:「この機会に関数ジャームを紹介しました」という感じです。ジャームは、それだけでもけっこう役に立つ概念ですが、層の理論のなかで考えるのが自然かも知れません。「層に関してちょっと」、「層に関してちょっと 2: 層化」、「局所元のジャームセクションとセクションジャームの評価」などを参照。

*4:"germ"は「芽〈め | が〉」と訳しますが、僕はあまり使いません。

*5: \frac{\partial}{\partial x^i} という書き方は、フォーマルにはちょっと問題ありです。「微分計算、ラムダ計算、型推論」参照。でも、常識的に解釈すれば大丈夫です。

不適切なアナロジーと反駁の失敗

昨日の記事「説得的非論理文を使うのは好ましくない」へのid:bonotakea.k.a. たけを)さんのコメントで、『アナロジーの罠』という本が在ることを教えていただきました。

アナロジーの罠―フランス現代思想批判

アナロジーの罠―フランス現代思想批判

不適切なアナロジー/比喩について書かれているようです。僕は読んだことがないし、存在さえ知りませんでした。

昨日取り上げた米村さんの発言は、詐欺や扇動によく使われる不適切なアナロジーというより、アナロジーの使用を失敗している例ですね。そこらへんのところを補足しておきます。


最初にお断りしておくと、アナロジーは悪いものではありません。アナロジーは、物事を理解したり、共通構造を抽出したりする際に物凄く役に立ちます。人に何かを伝達するときも、適切に使用されたアナロジーは強力なコミュニケーション手段となります。話がうまい人は、たいていは比喩がうまい人です。

ただし、いかにも不適切なアナロジーの使用例もあります。13年前に書いた記事「白金は錆びない金属だから、塗ったり食べたりすると体が錆びない」を蒸し返すと; 白金が体に良いことをアナロジーで説明していた事例です。

金属が錆びることと、人間が老化したり病気することをアナロジー(類似な現象)と捉えます。白金は錆びない金属なので、白金を摂取すれば、老化や病気を防げるだろう、というリクツです。

ここまでひどいと、説明や説得の手段というより、「体に良さそう」な雰囲気を醸し出す稚拙な演出ですが、それでも「なるほど、体に良さそう」と思う人がいるのかも知れません。不適切な(つうか出来の悪い)アナロジーです。


米村さんのケースは白金の不適切なアナロジーとはだいぶ違います。アナロジーを出すことにより、自分の主張(内容はまっとう)を自分で壊してしまったのです。

米村さんが否定し非難したかった主張は次のものです。

  • [主張 A] 8時間の2倍である16時間働いたら、働いた成果は2倍になる。

この主張を反駁(否定)するために、陸上競技の例を出しました。

  • [主張 B] 12秒の10倍である120秒走ったら、走った距離は10倍になる。

[主張 A][主張 B]は類似しています。[主張 B]が過ちなので、[主張 A]も過ちである、と結論したのです。根拠は、「働くこと」と「走ること」のアナロジーです。

アナロジーを根拠に持ち出したことにより、相手([主張 A]の立場の人)が同じアナロジーを使うことを許すことになります。より精密なアナロジーは:

  • [主張 A] 8時間の2倍である16時間働いたら、働いた成果は2倍になる。
  • [主張 C] 12秒の2倍である24秒走ったら、走った距離は2倍になる。

[主張 C]は厳密には成立しないものの、「走った距離は1.8倍」くらいにはなりそうです(日本記録が状況証拠)。したがって、

  • [主張 A'] 8時間の2倍である16時間働いたら、働いた成果は1.8倍程度にはなる。よって、長時間労働は十分に有効である。

が、アナロジーを根拠として妥当性を持つことになります。

要するに、陸上競技のアナロジーを持ち出すことにより、相手に有利な状況をお膳立てしてしまったのです。詭弁を反駁するために詭弁を使ってしまうと、より強力な(よりインチキな)詭弁で反論される危険があります。しかも、「それは詭弁だろう」とも言い返せません -- 自分が詭弁を弄しているので

[追記]本音[/追記]

説得的非論理文を使うのは好ましくない

たまたま、次のようなツイートを目にしました。

米村歩@日本一残業の少ないIT企業社長(@yonemura2006)

100mを12秒で走れる人が1000mを120秒で走れるわけではないという事実は誰でも理解できるのに、1日16時間働いても8時間働く場合の2倍の成果になるわけではないということを理解できない人が結構いるのはなぜなのか。

米村さんが訴えたい内容に関しては全面的に同意・賛成します。僕自身「長時間労働なんてろくなもんじゃないから、やっちゃダメだ」と言い続けていました。

「1日16時間働いても8時間働く場合の2倍の成果になるわけではない」のはそのとおりだと思います。ですが、そのことを言いたいがために使っている根拠が、

  • 100mを12秒で走れる人が1000mを120秒で走れるわけではない

なんですよね。これって根拠になりますか? これはダメです。ダメな議論のやり口です*1

少し分析してみましょう。まず、

  • [掛け算による論法 1] 12秒走ると100m進む。だから、12秒×10=120秒走ると100m×10=1000m進む。

このような単純な掛け算による論法はマチガイだと主張しています。確かにそうなので皆んなが納得します。そして、同様な論法である次の言明もまたマチガイだと結論付けられます(あくまで米村さんによれば、です)。

  • [掛け算による論法 2] 8時間働くと○○の成果が出る。だから、8時間×2=16時間働くと○○×2の成果が出る。

そんな単純な掛け算なんて通用しないよ、ってわけです。

[掛け算による論法 1][掛け算による論法 2]は、ほんとうに同様な論法でしょうか? [掛け算による論法 1]で掛け算している数は10ですが、[掛け算による論法 2]で掛け算している数は2です。この数を揃えると*2

  • [掛け算による論法 1'] 12秒走ると100m進む。だから、12秒×2=20秒走ると100m×2=200m進む。

[掛け算による論法 1']が正しいのかマチガイなのか、陸上の日本記録を調べてみました。

距離 時間 選手 記録した日時
100m 9秒97 サニブラウン・アブデル・ハキーム 2019年6月8日
200m 20秒03 末續慎吾 2003年6月7日

[掛け算による論法 1']はほぼ正しいのです。サニブラウン選手が100m走るのにかかった時間9.97秒を2倍した時間19.94秒あれば、末續選手は約199m走れます。もちろん、等速直線運動に換算しているので正確ではありませんが、「100m 9秒97」と「200m 20秒03」を比べれば、時間が2倍になれば距離もほぼ2倍であることは分かるでしょう*3

揚げ足取りだと言われそうですが、いずれにしても、米村さんの議論は、論理的には極めて杜撰です*4。しかし一方、陸上競技の例を出すことは、具体的で鮮明な印象を描くためには効果的です。

「論理的には破綻しているが、鮮明な印象により説得力を持つ文言」を表すうまい言葉がないので*5、「説得的非論理文」という不格好な言葉を使うことにします。説得的非論理文が効果的(?)に使われる場面は詐欺や扇動です。

米村さんが詐欺や扇動をしてないことはもちろんモチロン承知です。しかし、

  • 詐欺や扇動のために、説得的非論理文を使うのはいけない。
  • 啓蒙や鼓舞のために、説得的非論理文を使うのはかまわない。

とはならないのです。少なくとも僕は、目的が正しければ望ましくない手段が許されるとは思いません。「掛け算の順序問題: 檜山の地雷を踏まないで」において、自分が嫌いなことの共通点を次のようにまとめました。

非常に抽象度の高いくくり方をすると、「正しい目的のためには、多少は乱暴な/望ましくない手段も許される」という考え方が、それはそれは物凄く、とてつもなく嫌いなんです。

つまり*6

  • 詐欺や扇動のために、説得的非論理文を使うのはいけない
  • 啓蒙や鼓舞のために、説得的非論理文を使うのもいけない


説得的非論理文の実例と使い方(悪用)に関しては次の記事を参照してください。

[追記]本音[/追記]

*1:[追記]毎回注意を入れているのに、今回は忘れたので注釈に書きます。僕がこういう記事を書いてしまう動機には、なんの論理性もありません。感情にドライブされているのです。「掛け算の順序問題: 檜山の地雷を踏まないで」とか「論理的言明を装った感情論は嫌い、という感情論」の最後のほうを参照。[/追記]

*2:16時間働けば2倍の成果が出ると本気で信じている人がいたとしても、8時間×10=80時間連続で働かせれば10倍の成果が出るとは主張しないでしょう。その意味で、「×2」と「×10」の違いは効いてくるのです。

*3:僕の議論もまた、「印象深い特定個別事例を出して語っている」と言われれば、実はそうです。僕の議論が無意味だとして、米村さんの議論はそれと同程度に無意味だと認識してもらえれば、それでいいです。

*4:陸上競技における「走った時間 \mapsto 距離」という関数と、仕事における「働いた時間 \mapsto 成果」という2つの関数があります。片方の関数が非線形であることからもう一方も非線形であると結論付ける根拠は薄弱です。どちらも非線形であるとしても、まったく違った性質を持つ2つの関数かも知れません。

*5:「詭弁」が比較的近いですが、ピッタリではないです。

*6:もうひとつ、目的によらずに好ましくない例:
・ 恫喝やイジメのために、暴力を使うのはいけない。
・ 教育やしつけのために、暴力を使うのもいけない。
暴力は人を傷付ける手段だからダメです。そして、説得的非論理文は人をだます手段だからダメです。

リアルなバグ

分かりにくい写真(↓)だけど、このブログを表示しているコンピュータ・ディスプレイの上に蜘蛛が這っている様子です。

蜘蛛〈クモ〉は生物学的に昆虫ではありませんが、ムシと呼んでもよさそう。画面上にバグが出たわけだけど、このとき僕は、思わずマウスポインタで追い払おうとしました。蜘蛛は全然動きませんでしたね、手で追い払いました。