ベクトルの外積と呼ばれる演算には3種類あります。

  1. テンソル積 $\otimes$(直積)
  2. ウェッジ積 $\wedge$(楔積)
  3. ベクトル積 $\times$(クロス積)

これらについて簡単に紹介します。

※ 外積と言えばベクトル積を指すことが一般的です。ここでは使用頻度ではなく、説明の都合で番号を振っています。

内積と外積を同時に扱えるクリフォード代数の幾何学積も紹介します。

最後に、代数式・テンソル積・ウェッジ積・ベクトル積・幾何学積・四元数を計算するプログラムを掲載します。

シリーズの記事です。

  1. 多項式の積を計算
  2. 外積と愉快な仲間たち ← この記事
  3. ユークリッド空間のホッジ双対とバブルソート
  4. 四元数を作ろう
  5. 四元数と行列で見る内積と外積の「内」と「外」
  6. 八元数を作ろう
  7. 八元数の積をプログラムで確認
  8. 外積の成分をプログラムで確認
  9. 多元数の積の構成
  10. 十六元数を作ろう

関連するコードをまとめたリポジトリです。

この記事には関連記事があります。

基底ベクトル表示

座標軸を表すベクトルを基底ベクトルと呼びます。

ここでは一般論には立ち入らず、通常の2次元$xy$座標で、$x$軸方向の基底ベクトルを$\vec{e_1}$、$y$軸方向の基底ベクトルを$\vec{e_2}$とします。

\vec{e_1}=\left(\begin{matrix}1\\0\end{matrix}\right),
\vec{e_2}=\left(\begin{matrix}0\\1\end{matrix}\right)

基底ベクトルを使えば、ベクトルを代数式のスタイルで記述できます。

\left(\begin{matrix}x\\y\end{matrix}\right)
=\left(\begin{matrix}x\\0\end{matrix}\right)+
 \left(\begin{matrix}0\\y\end{matrix}\right)
=x\left(\begin{matrix}1\\0\end{matrix}\right)+
 y\left(\begin{matrix}0\\1\end{matrix}\right)
=x\vec{e_1}+y\vec{e_2}

具体例を示します。

\left(\begin{matrix}2\\3\end{matrix}\right)
=2\vec{e_1}+3\vec{e_2}

3次元の場合は$\vec{e_3}$も使います。

\vec{e_1}=\left(\begin{matrix}1\\0\\0\end{matrix}\right),
\vec{e_2}=\left(\begin{matrix}0\\1\\0\end{matrix}\right),
\vec{e_3}=\left(\begin{matrix}0\\0\\1\end{matrix}\right)\\
\left(\begin{matrix}x\\y\\z\end{matrix}\right)
=x\vec{e_1}+y\vec{e_2}+z\vec{e_3}

今回は扱いませんが、同様に任意の次元に拡張できます。

式の展開

代数式のスタイルで記述すれば、ベクトルの掛け算を普通の代数式のように考えて扱うことができます。

比較対象として、ベクトルを使わない通常の式の展開を考えます。

\begin{align}
&(ax+by+cz)(dx+ey+fz) \\
&=ax(dx+ey+fz)+by(dx+ey+fz)+cz(dx+ey+fz) \\
&=adx^2+aexy+afxz+bdyx+bey^2+bfyz+cdzx+cezy+cfz^2 \\
&=adx^2+bey^2+cfz^2+(ae+bd)xy+(bf+ce)yz+(af+cd)zx
\end{align}

交換法則($xy=yx$ など)を使って同類項をまとめていることに注意してください。

テンソル積

先ほどの式の展開と同じようなことを考えます。

最も簡単なベクトル同士の掛け算として、単純に結合するだけの積を考えます。これをテンソル積と呼んで、専用の演算子 $\otimes$ を使用します。名前は計算結果がテンソル(行列のようなもの)になることを表します。

交換法則は成り立たないため、順番の入れ替えは禁止です(理由は後で考えます)。

\vec{e_1}\otimes\vec{e_2}\neq\vec{e_2}\otimes\vec{e_1}

基底ベクトル表示したベクトル同士のテンソル積を計算してみます。矢印が付いていない $a$ などは交換法則の成り立つ通常の掛け算として扱います。

\begin{align}
&(a\vec{e_1}+b\vec{e_2}+c\vec{e_3})\otimes(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=a\vec{e_1}\otimes(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +b\vec{e_2}\otimes(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +c\vec{e_3}\otimes(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=ad\vec{e_1}\otimes\vec{e_1}+ae\vec{e_1}\otimes\vec{e_2}+af\vec{e_1}\otimes\vec{e_3} \\
&\quad +bd\vec{e_2}\otimes\vec{e_1}+be\vec{e_2}\otimes\vec{e_2}+bf\vec{e_2}\otimes\vec{e_3} \\
&\quad +cd\vec{e_3}\otimes\vec{e_1}+ce\vec{e_3}\otimes\vec{e_2}+cf\vec{e_3}\otimes\vec{e_3}
\end{align}

※ 矢印の付いていない $e$ は基底とは無関係です。

交換法則が成り立たないため同類項は存在せず、式はこれ以上整理できません。

行列表現

$\vec{e_i}$ の係数を縦ベクトルの$i$行成分、$\vec{e_i}\otimes\vec{e_j}$ の係数を行列の$i$行$j$列の成分とすれば、ベクトルと行列の計算として書き直せます。

\left(\begin{matrix}a\\b\\c\end{matrix}\right)\otimes\left(\begin{matrix}d\\e\\f\end{matrix}\right)
=\left(\begin{matrix}a\otimes\left(\begin{matrix}d\\e\\f\end{matrix}\right)\\b\otimes\left(\begin{matrix}d\\e\\f\end{matrix}\right)\\c\otimes\left(\begin{matrix}d\\e\\f\end{matrix}\right)\end{matrix}\right)
=\left(\begin{matrix}ad&ae&af\\bd&be&bf\\cd&ce&cf\end{matrix}\right)

テンソル積が何を計算しているのか、少しイメージが湧いたでしょうか。計算結果がテンソル(行列のようなもの)になると前述しましたが、確かに行列として現れています。背後にある考え方が分かれば、ベクトルや行列で書いた方が計算が簡単になります。

交換法則が成り立たないため順番の入れ替えは禁止だと前述しましたが、そのようなことをすれば行列の対応する位置が変わってしまうためです。

テンソル積を使わない計算

先ほどのテンソル式の行列表現を見て、右のオペランドを横ベクトルにして掛けただけではないかと思われた方は鋭いです。実際、テンソル積を持ち出さなくても、縦ベクトルと横ベクトルの積を計算しても同じ結果が得られます。

\begin{align}
\left(\begin{matrix}a\\b\\c\end{matrix}\right)\left(\begin{matrix}d&e&f\end{matrix}\right)
=\left(\begin{matrix}a\left(\begin{matrix}d&e&f\end{matrix}\right)\\b\left(\begin{matrix}d&e&f\end{matrix}\right)\\c\left(\begin{matrix}d&e&f\end{matrix}\right)\end{matrix}\right)
&=\left(\begin{matrix}ad&ae&af\\bd&be&bf\\cd&ce&cf\end{matrix}\right)
\end{align}

量子力学関係の本ではこの種の積を外積と呼ぶことがありますが、他の分野では一般的ではありません。英語表記は outer product です。

直積

計算結果をよく見ると、オペランドの成分を組み合わせていることが分かります。

集合論では類似の演算を直積と呼びます。

\begin{align}
&\{a,b,c\}\times\{d,e,f\} \\
&=\{(a,d),(a,e),(a,f),(b,d),(b,e),(b,f),(c,d),(c,e),(c,f)\}
\end{align}

このアナロジーでベクトル同士のテンソル積を直積と呼ぶことがあります。

ウェッジ積

テンソル積は同類項の整理が進まずに煩雑でしたが、ウェッジ積 $\wedge$ と呼ばれる演算を定義することでもう少し単純な結果を得ることができます。

\vec{a}\wedge\vec{b}:=\vec{a}\otimes\vec{b}-\vec{b}\otimes\vec{a}

数値計算での $ab-ba$ は常にゼロですが、これは積に交換法則が成り立つからです。テンソル積で得られたテンソルの一部には交換法則が成り立つ成分(対称成分)があり、ウェッジ積はテンソル積から対称成分を取り除くことで反対称成分だけを分離しています。

※ 線形代数で行列が対称行列と反対称行列に分離できることを習いますが、それと同じ考え方です。

ウェッジ積は一般化した外積とされ、専門に扱う分野を外積代数と呼びます。

※ 一般化する前の外積は後述のベクトル積を指します。

ウェッジ積を指す「外積(exterior product)」は、直積を指す「外積(outer product)」とは別物で、英語では区別されています。日本語に訳すときにどちらも「外積」を当ててしまったようです。

wedge は楔の意味です。楔(くさび)積と呼ぶこともあります。

反対称性

オペランドの順番を入れ替えると符号が反転します。これを反対称性(反交換性)と呼びます。

\begin{align}
\vec{a}\wedge\vec{b}
&=\vec{a}\otimes\vec{b}-\vec{b}\otimes\vec{a} \\
&=-(\vec{b}\otimes\vec{a}-\vec{a}\otimes\vec{b}) \\
&=-\vec{b}\wedge\vec{a}
\end{align}

同じベクトル同士のウェッジ積はゼロになります。これは対称成分を取り除くことを意味します。

\vec{a}\wedge\vec{a}=\vec{a}\otimes\vec{a}-\vec{a}\otimes\vec{a}=0

これらを毎回テンソル積から導出するのは大変なので、ルールとして覚えておく方が良いでしょう。

なお、反対称性を使ってもゼロになる結果を導けます。

\vec{a}\wedge\vec{a}=-(\vec{a}\wedge\vec{a})=0

符号を変えても一致するということは、ゼロしかあり得ないことを意味します。同様の考え方は、反対称行列の対角成分がゼロになったり、奇関数が原点を通ったりするときにも使います。

面積

ウェッジ積は面積と関係があります。

日常では次のように単位を考えます。

  • 長さ(m)×長さ(m)=面積(㎡)

これを基底に適用すれば、次のように考えられます。

  • 長さ($\vec{e_1}$)∧長さ($\vec{e_2}$)=面積($\vec{e_1}\wedge\vec{e_2}$)

$\vec{e_1}\wedge\vec{e_2}$ が面を意味する基底で、係数が面積の値を表します。

簡単な例を示します。

(2\vec{e_1})\wedge(3\vec{e_2})=6(\vec{e_1}\wedge\vec{e_2})

左辺は辺が2と3の長方形を表して、右辺の $6$ は面積を表します。

平行四辺形

斜めを向いた2成分のベクトルではどうなるでしょうか。計算の際に、反対称性によって対称成分が消えたり同類項が整理できるのに注意します。

\begin{align}
&(a\vec{e_1}+b\vec{e_2})∧(c\vec{e_1}+d\vec{e_2}) \\
&=ac\underbrace{\vec{e_1}\wedge\vec{e_1}}_{0}+ad\vec{e_1}\wedge\vec{e_2} \\
&\quad +bc\underbrace{\vec{e_2}\wedge\vec{e_1}}_{-\vec{e_1}\wedge\vec{e_2}}+bd\underbrace{\vec{e_2}\wedge\vec{e_2}}_{0} \\
&=(ad-bc)\vec{e_1}∧\vec{e_2}
\end{align}

$ad-bc$ は2本のベクトルで表される平行四辺形の面積です。行列式を思い浮かべた人は鋭いです。今回は触れませんが、この関係は留意しておいてください。

\left|\begin{matrix}a&b\\c&d\end{matrix}\right|=ad-bc

3成分のウェッジ積

テンソル積でやったのと同じ計算をウェッジ積でもやってみます。

\begin{align}
&(a\vec{e_1}+b\vec{e_2}+c\vec{e_3})\wedge(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=a\vec{e_1}\wedge(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +b\vec{e_2}\wedge(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +c\vec{e_3}\wedge(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=ad\underbrace{\vec{e_1}\wedge\vec{e_1}}_{0}+ae\vec{e_1}\wedge\vec{e_2}+af\underbrace{\vec{e_1}\wedge\vec{e_3}}_{-\vec{e_3}\wedge\vec{e_1}} \\
&\quad +bd\underbrace{\vec{e_2}\wedge\vec{e_1}}_{-\vec{e_1}\wedge\vec{e_2}}+be\underbrace{\vec{e_2}\wedge\vec{e_2}}_{0}+bf\vec{e_2}\wedge\vec{e_3} \\
&\quad +cd\vec{e_3}\wedge\vec{e_1}+ce\underbrace{\vec{e_3}\wedge\vec{e_2}}_{-\vec{e_2}\wedge\vec{e_3}}+cf\underbrace{\vec{e_3}\wedge\vec{e_3}}_{0} \\
&=(ae-bd)\vec{e_1}\wedge\vec{e_2}+(bf-ce)\vec{e_2}\wedge\vec{e_3}+(cd-af)\vec{e_3}\wedge\vec{e_1}
\end{align}

最後の行で、巡回的(サイクリック)に基底を並べています。

射影

テンソル積よりは計算が進みましたが、何やら複雑な結果が出て来ました。

これは2本のベクトルが表す平行四辺形を、基底が張る3つの平面に射影した面積成分で表現しています。

内積

ゼロになって消えた項の係数は $ad+be+cf$ ですが、これは内積を表します。内積は交換法則が成り立つ対称成分のため、反対称成分だけが残るウェッジ積では消えてしまいます。

※ 内積が残るように改良した幾何学積というものがあり、後述します。

行列表現

ウェッジ積の計算は代数スタイルで行いますが、計算結果をテンソル積に戻して行列で表現することがあります。符号を反転した成分が影のように現れることに注意してください。

\begin{align}
&(ae-bd)\vec{e_1}\wedge\vec{e_2} \\
&\quad +(bf-ce)\vec{e_2}\wedge\vec{e_3} \\
&\quad +(cd-af)\vec{e_3}\wedge\vec{e_1} \\
&=(ae-bd)(\vec{e_1}\otimes\vec{e_2}-\vec{e_2}\otimes\vec{e_1}) \\
&\quad +(bf-ce)(\vec{e_2}\otimes\vec{e_3}-\vec{e_3}\otimes\vec{e_2}) \\
&\quad +(cd-af)(\vec{e_3}\otimes\vec{e_1}-\vec{e_1}\otimes\vec{e_3}) \\
&=\left(\begin{matrix}\underbrace{0}_{対角}&\underbrace{ae-bd}_{独立}&\underbrace{-(cd-af)}_{影}\\\underbrace{-(ae-bd)}_{影}&\underbrace{0}_{対角}&\underbrace{bf-ce}_{独立}\\\underbrace{cd-af}_{独立}&\underbrace{-(bf-ce)}_{影}&\underbrace{0}_{対角}\end{matrix}\right)
\end{align}

これは反対称行列です。反対称行列の対角成分は常にゼロです。

ホッジ双対

独立成分が3つしかないので、行列表現は冗長です。独立成分だけをベクトルとして表現することを考えます。

3次元では平面に対して法線ベクトルが一意に定まります。「面と面積」と「法線と長さ」の関係をホッジ双対と呼びます。ホッジ双対の相互変換を単項演算子 $\star$(ホッジスター)で表します。

※ 実際の定義はもっと一般化されていますが、今回は省略します。

面から法線への変換を見ます。巡回的な組み合わせ(1→2→3→1→2→…)を正とします。

\begin{align}
\star(\vec{e_1}\wedge\vec{e_2})&=\vec{e_3} \\
\star(\vec{e_2}\wedge\vec{e_3})&=\vec{e_1} \\
\star(\vec{e_3}\wedge\vec{e_1})&=\vec{e_2}
\end{align}

巡回的でなければ負になります。

\begin{align}
\star(\vec{e_2}\wedge\vec{e_1})=\star(-\vec{e_1}\wedge\vec{e_2})&=-\vec{e_3} \\
\star(\vec{e_3}\wedge\vec{e_2})=\star(-\vec{e_2}\wedge\vec{e_3})&=-\vec{e_1} \\
\star(\vec{e_1}\wedge\vec{e_3})=\star(-\vec{e_3}\wedge\vec{e_1})&=-\vec{e_2}
\end{align}

逆に変換すれば、法線から面に戻ります。

\begin{align}
\star\vec{e_1}&=\vec{e_2}\wedge\vec{e_3} \\
\star\vec{e_2}&=\vec{e_3}\wedge\vec{e_1} \\
\star\vec{e_3}&=\vec{e_1}\wedge\vec{e_2}
\end{align}

擬ベクトル

先ほどの計算結果をホッジ双対で表せば、独立成分だけで表せてすっきりします。

\begin{align}
&(ae-bd)\vec{e_1}\wedge\vec{e_2}+(bf-ce)\vec{e_2}\wedge\vec{e_3}+(cd-af)\vec{e_3}\wedge\vec{e_1} \\
&=\star\{(ae-bd)\vec{e_3}+(bf-ce)\vec{e_1}+(cd-af)\vec{e_2}\} \\
&=\star\{(bf-ce)\vec{e_1}+(cd-af)\vec{e_2}+(ae-bd)\vec{e_3}\} \\
&=\star\left(\begin{matrix}bf-ce\\cd-af\\ae-bd\end{matrix}\right)
\end{align}

ホッジスターが示しているように、これは実際には反対称行列であってベクトルそのものではありません。このような見かけ上のベクトルを擬ベクトルと呼びます。

ベクトル積

先ほどホッジ双対により面を法線ベクトルに変換しましたが、最初から計算結果を法線ベクトルで表すのがベクトル積です。名前は計算結果がベクトルになることを表します。演算子は $\times$ を使うためクロス積とも呼ばれます。

\vec{a}\times\vec{b}:=\star(\vec{a}\wedge\vec{b})

普通はベクトル積を「外積」として習い、「2本のベクトルで表される平行四辺形の面積を長さとする法線ベクトル」と説明されます。

基底同士のベクトル積を確認します。

\begin{align}
\vec{e_1}\times\vec{e_2}&=\star(\vec{e_1}\wedge\vec{e_2})=\vec{e_3} \\
\vec{e_2}\times\vec{e_3}&=\star(\vec{e_2}\wedge\vec{e_3})=\vec{e_1} \\
\vec{e_3}\times\vec{e_1}&=\star(\vec{e_3}\wedge\vec{e_1})=\vec{e_2}
\end{align}

ウェッジ積と同様に反対称性があります。

\begin{align}
\vec{e_1}\times\vec{e_1}&=0 \\
\underbrace{\vec{e_1}\times\vec{e_2}}_{\vec{e_3}}&=\underbrace{-\vec{e_2}\times\vec{e_1}}_{-(-\vec{e_3})}
\end{align}

少し慣れれば、ウェッジ積を経由しなくても直に計算できるでしょう。

3成分のベクトル積

テンソル積やウェッジ積でやったのと同じ計算をベクトル積でもやってみます。

\begin{align}
&\left(\begin{matrix}a\\b\\c\end{matrix}\right)\times\left(\begin{matrix}d\\e\\f\end{matrix}\right) \\
&=(a\vec{e_1}+b\vec{e_2}+c\vec{e_3})\times(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=a\vec{e_1}\times(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +b\vec{e_2}\times(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +c\vec{e_3}\times(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=ad\underbrace{\vec{e_1}\times\vec{e_1}}_{0}+ae\underbrace{\vec{e_1}\times\vec{e_2}}_{\vec{e_3}}+af\underbrace{\vec{e_1}\times\vec{e_3}}_{-\vec{e_2}} \\
&\quad +bd\underbrace{\vec{e_2}\times\vec{e_1}}_{-\vec{e_3}}+be\underbrace{\vec{e_2}\times\vec{e_2}}_{0}+bf\underbrace{\vec{e_2}\times\vec{e_3}}_{\vec{e_1}} \\
&\quad +cd\underbrace{\vec{e_3}\times\vec{e_1}}_{\vec{e_2}}+ce\underbrace{\vec{e_3}\times\vec{e_2}}_{-\vec{e_1}}+cf\underbrace{\vec{e_3}\times\vec{e_3}}_{0} \\
&=(bf-ce)\vec{e_1}+(cd-af)\vec{e_2}+(ae-bd)\vec{e_3} \\
&=\left(\begin{matrix}bf-ce\\cd-af\\ae-bd\end{matrix}\right)
\end{align}

これはベクトル積(外積)の定義として紹介されますが、個々の基底の直交性から決まることを理解していれば、必要に応じて導けます。得られるのは2本のベクトルで表される面の法線ですが、面という概念を省略して、2本のベクトルに直交するベクトルを求めるという解釈が一般的です。

次元

2次元では1本のベクトルに直交するベクトルは一意に定まりますが、3次元では角度が定まらずに1回転分の自由度があります。3次元では直交するベクトルを一意に定めるには2本のベクトルが必要となり、これが前述のベクトル積の図形的解釈となります。

同様に次元を増やして直交するベクトルを一意に定めるには、4次元では3本のベクトル、5次元では4本のベクトルが必要になります。このため4次元以上では二項演算としてのベクトル積は定義できません。これは面に対する垂線が一意に定まらないことを意味します。

※ 例外的に7次元のベクトル積を考えることは可能です。3次元のベクトル積は四元数の積として計算できますが(四元数を作ろうを参照)、7次元のベクトル積は八元数の積として計算できるためです(八元数を作ろうを参照)。ただしこれは八元数の計算に依存した定義で、原理的には2本のベクトルに直交するベクトルが一意に定まるわけではありません。

ベクトル積は法線ベクトルを表現するため次元に依存するのに対して、ウェッジ積は面を表現しているため次元に依存しません。このことを指して、ウェッジ積は外積(ベクトル積)の一般化だと言われます。

ベクトル積の方が先に普及してしまったため、テキストではベクトル積を法線や軸として説明していることが多いです。もしベクトル積の説明が分かりにくければ、ウェッジ積に読み替えて考えるというのも一つの手です。

幾何学積

ウェッジ積では同じ基底があると $0$ になりましたが、それを $1$ として計算するのが幾何学積です。それ以外の反対称性はウェッジ積と同じです。演算子は使わずに基底を連続して書きます。

\begin{align}
\vec{e_1}\vec{e_1}&=1 \\
\vec{e_1}\vec{e_2}&=-\vec{e_2}\vec{e_1}
\end{align}

後で見ますが幾何学積は内積と外積の両方を含むため、幾何学積が外積と呼ばれることはありません。専門に扱う分野をクリフォード代数や幾何学的代数と呼びます。日本ではあまり馴染みのない分野ですが、ある種の計算がきれいに書けるため、今後は物理やコンピュータビジョンでの普及が期待されます。

ウェッジ積との関係

ウェッジ積は幾何学積と以下の関係があります。幾何学積には対称成分が定数項として含まれるため、それを取り除くことでウェッジ積と対応させています。

\vec{a}\wedge\vec{b}=\frac{1}{2}(\vec{a}\vec{b}-\vec{b}\vec{a})

対称成分(同じ基底の積)を含まない場合に限り、ウェッジ積は幾何学積に置き換えられます。

\vec{e_1}∧\vec{e_2}=\frac{1}{2}(\vec{e_1}\vec{e_2}-\underbrace{\vec{e_2}\vec{e_1}}_{-\vec{e_1}\vec{e_2}})=\vec{e_1}\vec{e_2}

反対称性により同類項となるため $1/2$ で調整しています。

それに対してテンソル積は同類項とはならずにそこで計算が終わります。定義を再掲するので、比較しながら意味を考えてみてください。

\vec{a}\wedge\vec{b}:=\vec{a}\otimes\vec{b}-\vec{b}\otimes\vec{a}

内積と外積

幾何学積と呼ばれる理由は、2本のベクトルの幾何学積が内積と外積(ウェッジ積スタイル)を含むためのようです。

成分計算で確認します。

\begin{align}
\vec{a}\vec{b}
&=(a\vec{e_1}+b\vec{e_2}+c\vec{e_3})(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=a\vec{e_1}(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +b\vec{e_1}(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&\quad +c\vec{e_2}(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=ad\underbrace{\vec{e_1}\vec{e_1}}_{1}+ae\vec{e_1}\vec{e_2}+af\underbrace{\vec{e_1}\vec{e_3}}_{-\vec{e_3}\vec{e_1}} \\
&\quad +bd\underbrace{\vec{e_2}\vec{e_1}}_{-\vec{e_1}\vec{e_2}}+be\underbrace{\vec{e_2}\vec{e_2}}_{1}+bf\vec{e_2}\vec{e_3} \\
&\quad +cd\vec{e_3}\vec{e_1}+ce\underbrace{\vec{e_3}\vec{e_2}}_{-\vec{e_2}\vec{e_3}}+cf\underbrace{\vec{e_3}\vec{e_3}}_{1} \\
&=\underbrace{(ad+be+cf)}_{内積} \\
&\quad +\underbrace{(ae-bd)\vec{e_1}\vec{e_2}+(bf-ce)\vec{e_2}\vec{e_3}+(cd-af)\vec{e_3}\vec{e_1}}_{外積} \\
&=\underbrace{\vec{a}\cdot\vec{b}}_{内積}+\underbrace{\vec{a}∧\vec{b}}_{外積}
\end{align}

定数項が内積、それ以外が外積となります。

四元数でもほぼ同様の計算ができますが、内積にマイナスが付き、外積がベクトル積スタイルなのが異なります。

\vec{a}\vec{b}=-\underbrace{\vec{a}\cdot\vec{b}}_{内積}+\underbrace{\vec{a}×\vec{b}}_{外積}

詳細は四元数と行列で見る内積と外積の「内」と「外」を参照してください。次の行列もこちらが元ネタです。

行列で計算

同じ計算を行列の二次形式でやってみます。

\begin{align}
&(a\vec{e_1}+b\vec{e_2}+c\vec{e_3})(d\vec{e_1}+e\vec{e_2}+f\vec{e_3}) \\
&=\left(\begin{matrix} \vec{e_1} &  \vec{e_2} &  \vec{e_3} \end{matrix}\right)
  \left(\begin{matrix} a \\ b \\ c \end{matrix}\right)
  \left(\begin{matrix} d &  e &  f \end{matrix}\right)
  \left(\begin{matrix} \vec{e_1} \\ \vec{e_2} \\ \vec{e_3} \end{matrix}\right) \\
&=\left(\begin{matrix} \vec{e_1} &  \vec{e_2} &  \vec{e_3} \end{matrix}\right)
  \left(\begin{matrix} ad & ae & af \\ bd & be & bf \\ cd & ce & cf \end{matrix}\right)
  \left(\begin{matrix} \vec{e_1} \\ \vec{e_2} \\ \vec{e_3} \end{matrix}\right) \\
&=(ad+be+cf) \\
&\quad +(ae-bd)\vec{e_1}\vec{e_2}+(bf-ce)\vec{e_2}\vec{e_3}+(cd-af)\vec{e_3}\vec{e_1}
\end{align}

ここで3行目中央の行列に注目します。

\left(\begin{matrix}
  \underbrace{ad}_{内} & \underbrace{ae}_{外} & \underbrace{af}_{外} \\
  \underbrace{bd}_{外} & \underbrace{be}_{内} & \underbrace{bf}_{外} \\
  \underbrace{cd}_{外} & \underbrace{ce}_{外} & \underbrace{cf}_{内}
\end{matrix}\right)

内側が内積で、外側が外積の成分です!

関係式

関係式を移項してウェッジ積の定義を代入すれば、内積の関係式が得られます。

\begin{align}
\vec{a}\vec{b}&=\vec{a}\cdot\vec{b}+\vec{a}∧\vec{b} \\
\vec{a}\cdot\vec{b}&=\vec{a}\vec{b}-\vec{a}∧\vec{b} \\
&=\vec{a}\vec{b}-\frac{1}{2}(\vec{a}\vec{b}-\vec{b}\vec{a}) \\
&=\frac{1}{2}(\vec{a}\vec{b}+\vec{b}\vec{a})
\end{align}

幾何学積からウェッジ積(反対称成分)を引けば内積(対称成分)が残ると解釈できます。幾何学積とウェッジ積が一致するのは内積がゼロのときだけです。

関係式をまとめます。

\begin{align}
\vec{a}\cdot\vec{b}&=\frac{1}{2}(\vec{a}\vec{b}+\vec{b}\vec{a}) \\
\vec{a}\wedge\vec{b}&=\frac{1}{2}(\vec{a}\vec{b}-\vec{b}\vec{a}) \\
\vec{a}\vec{b}&=\vec{a}\cdot\vec{b}+\vec{a}∧\vec{b} \\
&=\frac{1}{2}(\vec{a}\vec{b}+\vec{b}\vec{a})+\frac{1}{2}(\vec{a}\vec{b}-\vec{b}\vec{a})
\end{align}

ホッジ双対

幾何学積を使えばホッジ双対が簡単に導出できます。詳細は続編のユークリッド空間のホッジ双対とバブルソートを参照してください。

プログラム

代数式・テンソル積・ウェッジ積・ベクトル積・幾何学積・四元数を比較するため、プログラムで計算してみます。

ExtProduct.fsx を分割して引用します。Math7.fsxMath7.Term.fsx に依存しています。全体はリポジトリを参照してください。

係数と基底の関係を見るため、係数は $a,b,c$ ではなく添字を用いた $a_1,a_2,a_3$ を使用します。

代数式

いわゆる普通の数式です。これを基本に他の積との違いを比較すると良いでしょう。

ExtProduct.fsx
#load "Math7.Term.fsx"
open Math7

Term.showProd "## 代数式" ""
    (Seq.map (fun e -> [""; "x"; "y"; "z"].[e]) >> Term.strPower)
    (function
    | [x; y] when y % 3 + 1 = x -> Term.fromE [y; x]
    | es -> Term.fromE es)
    (function
    | [x; y] as xs when x = y -> (-2, xs)
    |           xs            -> (-1, xs))
    Term.byIndexSign ((=) 3)
    [for i in [1..3] -> term(1, [sprintf "a_%d" i], [i])]
    [for i in [1..3] -> term(1, [sprintf "b_%d" i], [i])]
\begin{align}
&(a_1x+a_2y+a_3z)(b_1x+b_2y+b_3z) \\
&=a_1x(b_1x+b_2y+b_3z) \\
&\quad +a_2y(b_1x+b_2y+b_3z) \\
&\quad +a_3z(b_1x+b_2y+b_3z) \\
&=a_1b_1x^2+a_1b_2xy+a_1b_3\underbrace{xz}_{zx} \\
&\quad +a_2b_1\underbrace{yx}_{xy}+a_2b_2y^2+a_2b_3yz \\
&\quad +a_3b_1zx+a_3b_2\underbrace{zy}_{yz}+a_3b_3z^2 \\
&=a_1b_1x^2+a_2b_2y^2+a_3b_3z^2 \\
&\quad +(a_1b_2+a_2b_1)xy+(a_2b_3+a_3b_2)yz+(a_1b_3+a_3b_1)zx \\
\end{align}

テンソル積

同類項の整理がないため簡単です。

ExtProduct.fsx(続き)
Term.showProd "## テンソル積" @"\otimes "
    (Term.vec @"\otimes ")
    Term.fromE id Term.byIndexSign (fun _ -> false)
    [for i in [1..3] -> term(1, [sprintf "a_%d" i], [i])]
    [for i in [1..3] -> term(1, [sprintf "b_%d" i], [i])]
\begin{align}
&(a_1\vec{e_1}+a_2\vec{e_2}+a_3\vec{e_3})\otimes (b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1\vec{e_1}\otimes (b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_2\vec{e_2}\otimes (b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_3\vec{e_3}\otimes (b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1b_1\vec{e_1}\otimes \vec{e_1}+a_1b_2\vec{e_1}\otimes \vec{e_2}+a_1b_3\vec{e_1}\otimes \vec{e_3} \\
&\quad +a_2b_1\vec{e_2}\otimes \vec{e_1}+a_2b_2\vec{e_2}\otimes \vec{e_2}+a_2b_3\vec{e_2}\otimes \vec{e_3} \\
&\quad +a_3b_1\vec{e_3}\otimes \vec{e_1}+a_3b_2\vec{e_3}\otimes \vec{e_2}+a_3b_3\vec{e_3}\otimes \vec{e_3} \\
\end{align}

ウェッジ積

Math7に反対称性を教えます。

ExtProduct.fsx(続き)
Term.showProd "## ウェッジ積" "∧"
    (Term.vec "∧")
    (function
    | [x; y] when x = y -> term.Zero
    | [x; y] when y % 3 + 1 = x -> term(-1, [], [y; x])
    | es -> Term.fromE es)
    id Term.byIndexSign (fun _ -> false)
    [for i in [1..3] -> term(1, [sprintf "a_%d" i], [i])]
    [for i in [1..3] -> term(1, [sprintf "b_%d" i], [i])]
\begin{align}
&(a_1\vec{e_1}+a_2\vec{e_2}+a_3\vec{e_3})∧(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1\vec{e_1}∧(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_2\vec{e_2}∧(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_3\vec{e_3}∧(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1b_1\underbrace{\vec{e_1}∧\vec{e_1}}_{0}+a_1b_2\vec{e_1}∧\vec{e_2}+a_1b_3\underbrace{\vec{e_1}∧\vec{e_3}}_{-\vec{e_3}∧\vec{e_1}} \\
&\quad +a_2b_1\underbrace{\vec{e_2}∧\vec{e_1}}_{-\vec{e_1}∧\vec{e_2}}+a_2b_2\underbrace{\vec{e_2}∧\vec{e_2}}_{0}+a_2b_3\vec{e_2}∧\vec{e_3} \\
&\quad +a_3b_1\vec{e_3}∧\vec{e_1}+a_3b_2\underbrace{\vec{e_3}∧\vec{e_2}}_{-\vec{e_2}∧\vec{e_3}}+a_3b_3\underbrace{\vec{e_3}∧\vec{e_3}}_{0} \\
&=(a_1b_2-a_2b_1)\vec{e_1}∧\vec{e_2}+(a_2b_3-a_3b_2)\vec{e_2}∧\vec{e_3}+(a_3b_1-a_1b_3)\vec{e_3}∧\vec{e_1} \\
\end{align}

$(a_1b_2-a_2b_1)\vec{e_1}∧\vec{e_2}$ より、係数と基底ともに添字は1と2が使われており、特定の面に関係する量であることが直観的にも分かります。他の項も同様です。

ベクトル積

Math7に反対称性と巡回性を教えます。

ExtProduct.fsx(続き)
Term.showProd "## ベクトル積" "×"
    (Term.vec "×")
    (function
    | [x; y] when x = y -> term.Zero
    | [x; y] when x % 3 + 1 = y -> term( 1, [], [y % 3 + 1])
    | [x; y] when y % 3 + 1 = x -> term(-1, [], [x % 3 + 1])
    | es -> Term.fromE es)
    id Term.byIndexSign (fun _ -> false)
    [for i in [1..3] -> term(1, [sprintf "a_%d" i], [i])]
    [for i in [1..3] -> term(1, [sprintf "b_%d" i], [i])]
\begin{align}
&(a_1\vec{e_1}+a_2\vec{e_2}+a_3\vec{e_3})×(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1\vec{e_1}×(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_2\vec{e_2}×(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_3\vec{e_3}×(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1b_1\underbrace{\vec{e_1}×\vec{e_1}}_{0}+a_1b_2\underbrace{\vec{e_1}×\vec{e_2}}_{\vec{e_3}}+a_1b_3\underbrace{\vec{e_1}×\vec{e_3}}_{-\vec{e_2}} \\
&\quad +a_2b_1\underbrace{\vec{e_2}×\vec{e_1}}_{-\vec{e_3}}+a_2b_2\underbrace{\vec{e_2}×\vec{e_2}}_{0}+a_2b_3\underbrace{\vec{e_2}×\vec{e_3}}_{\vec{e_1}} \\
&\quad +a_3b_1\underbrace{\vec{e_3}×\vec{e_1}}_{\vec{e_2}}+a_3b_2\underbrace{\vec{e_3}×\vec{e_2}}_{-\vec{e_1}}+a_3b_3\underbrace{\vec{e_3}×\vec{e_3}}_{0} \\
&=(a_2b_3-a_3b_2)\vec{e_1}+(a_3b_1-a_1b_3)\vec{e_2}+(a_1b_2-a_2b_1)\vec{e_3} \\
\end{align}

$(a_2b_3-a_3b_2)\vec{e_1}$ より、係数は基底(1)を除いた添字(2,3)が使われており、相補的な関係にあることが分かります。他の項も同様です。

幾何学積

Math7に対称性と反対称性を教えます。ウェッジ積に似ていますが対称成分(内積)が残ります。

ExtProduct.fsx(続き)
Term.showProd "## 幾何学積" ""
    (Term.vec "")
    (function
    | [x; y] when x = y -> term.One
    | [x; y] when y % 3 + 1 = x -> term(-1, [], [y; x])
    | es -> Term.fromE es)
    id Term.byIndexSign ((=) 1)
    [for i in [1..3] -> term(1, [sprintf "a_%d" i], [i])]
    [for i in [1..3] -> term(1, [sprintf "b_%d" i], [i])]
\begin{align}
&(a_1\vec{e_1}+a_2\vec{e_2}+a_3\vec{e_3})(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1\vec{e_1}(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_2\vec{e_2}(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&\quad +a_3\vec{e_3}(b_1\vec{e_1}+b_2\vec{e_2}+b_3\vec{e_3}) \\
&=a_1b_1\underbrace{\vec{e_1}\vec{e_1}}_{1}+a_1b_2\vec{e_1}\vec{e_2}+a_1b_3\underbrace{\vec{e_1}\vec{e_3}}_{-\vec{e_3}\vec{e_1}} \\
&\quad +a_2b_1\underbrace{\vec{e_2}\vec{e_1}}_{-\vec{e_1}\vec{e_2}}+a_2b_2\underbrace{\vec{e_2}\vec{e_2}}_{1}+a_2b_3\vec{e_2}\vec{e_3} \\
&\quad +a_3b_1\vec{e_3}\vec{e_1}+a_3b_2\underbrace{\vec{e_3}\vec{e_2}}_{-\vec{e_2}\vec{e_3}}+a_3b_3\underbrace{\vec{e_3}\vec{e_3}}_{1} \\
&=(a_1b_1+a_2b_2+a_3b_3) \\
&\quad +(a_1b_2-a_2b_1)\vec{e_1}\vec{e_2}+(a_2b_3-a_3b_2)\vec{e_2}\vec{e_3}+(a_3b_1-a_1b_3)\vec{e_3}\vec{e_1} \\
\end{align}

係数と基底の関係はウェッジ積と同様です。

四元数

Math7に対称性と反対称性と巡回性を教えます。ベクトル積に似ていますが対称成分(内積)が残ります。

ExtProduct.fsx(続き)
Term.showProd "## 四元数" ""
    (Seq.map (fun e -> [""; "i"; "j"; "k"].[e]) >> Term.strPower)
    (function
    | [x; y] when x = y -> term -1
    | [x; y] when x % 3 + 1 = y -> term( 1, [], [y % 3 + 1])
    | [y; x] when x % 3 + 1 = y -> term(-1, [], [y % 3 + 1])
    | es -> Term.fromE es)
    id Term.byIndexSign ((=) 1)
    [for i in [1..3] -> term(1, [sprintf "a_%d" i], [i])]
    [for i in [1..3] -> term(1, [sprintf "b_%d" i], [i])]
\begin{align}
&(a_1i+a_2j+a_3k)(b_1i+b_2j+b_3k) \\
&=a_1i(b_1i+b_2j+b_3k) \\
&\quad +a_2j(b_1i+b_2j+b_3k) \\
&\quad +a_3k(b_1i+b_2j+b_3k) \\
&=a_1b_1\underbrace{i^2}_{-1}+a_1b_2\underbrace{ij}_{k}+a_1b_3\underbrace{ik}_{-j} \\
&\quad +a_2b_1\underbrace{ji}_{-k}+a_2b_2\underbrace{j^2}_{-1}+a_2b_3\underbrace{jk}_{i} \\
&\quad +a_3b_1\underbrace{ki}_{j}+a_3b_2\underbrace{kj}_{-i}+a_3b_3\underbrace{k^2}_{-1} \\
&=-(a_1b_1+a_2b_2+a_3b_3) \\
&\quad +(a_2b_3-a_3b_2)i+(a_3b_1-a_1b_3)j+(a_1b_2-a_2b_1)k \\
\end{align}

係数と基底の関係はベクトル積と同様です。

参考

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.