メモ(数論19): 妖精の鏡(八元数・第二部)

チラ裏 > 数論 i > メモ19

「チラ裏」は、きちんとまとまった記事ではなく、断片的なメモです。誤字脱字・間違いがあるかもしれません。このページは、八元数の話題の第二部(第一部)。

***

2023-11-27 妖精の鏡・虹色のきらめき 八元数の積

#数論 #FairyGlass #八元数

「妖精の鏡」を使って、八元数の積の法則を 1 行で表現できる。例えば…
  FairyGlass( 123, 145, 246, 347, 176, 257, 365 )

七つの数は和音集。どの和音も「七色の光」のうち三つの組み合わせ。妖精の鏡の内側では、一つの色の入射光に対し、3種類の「虹色のきらめき」が起きる。きらめきの一つ一つは、和音集のハーモニーに従って二つの色から成る。

これは「八元数の掛け算」あるいは「8次元の代数」についての、音と光の詩的表現。掛け算の法則(九九)は一つに決まっているわけではなく、和音集の選択に応じ、いろいろな「きらめき方」をする。3 桁の数を 7 個設定すればいいのだから、潜在的な選択肢は非常に多いように思える。ところが妖精の鏡は繊細なアイテムで、特定の480種類の和音集(どれも七つの和音の組み合わせ)のどれかが選ばれた場合に限り、正しく動作する。

*

19. 八元数は 1 個の実部と 7 個の虚部から成る次の形の数。
  X = x0 + x1e1 + x2e2 + … + x7e7
  Y = y0 + y1e1 + y2e2 + … + y7e7
ここで xn と yn は実数(n = 0, 1, 2, …, 7)。 e1, e2, …, e7 は、相異なる7種の虚数単位。古典的定義(GrC: Graves & Cayley)によると、八元数の積は、次の形を持つ

八元数の積(古典) XY = Z = z0 + z1e1 + z2e2 + … + z7e7 とすると:
  z0 = x0y0 − x1y1 − x2y2 − x3y3 − x4y4 − x5y5 − x6y6 − x7y7
  z1 = (x0y1 + x1y0) + (x2y3 − x3y2) + (x4y5 − x5y4) + (x7y6 − x6y7)
  z2 = (x0y2 + x2y0) + (x3y1 − x1y3) + (x4y6 − x6y4) + (x5y7 − x7y5)
  z3 = (x0y3 + x3y0) + (x1y2 − x2y1) + (x4y7 − x7y4) + (x6y5 − x5y6)
  z4 = (x0y4 + x4y0) + (x5y1 − x1y5) + (x6y2 − x2y6) + (x7y3 − x3y7)
  z5 = (x0y5 + x5y0) + (x1y4 − x4y1) + (x7y2 − x2y7) + (x3y6 − x6y3)
  z6 = (x0y6 + x6y0) + (x2y4 − x4y2) + (x1y7 − x7y1) + (x5y3 − x3y5)
  z7 = (x0y7 + x7y0) + (x3y4 − x4y3) + (x6y1 − x1y6) + (x2y5 − x5y2)
あるいは z5 以下について、丸かっこ単位でソートすると:
  z5 = (x0y5 + x5y0) + (x1y4 − x4y1) + (x3y6 − x6y3) + (x7y2 − x2y7)
  z6 = (x0y6 + x6y0) + (x1y7 − x7y1) + (x2y4 − x4y2) + (x5y3 − x3y5)
  z7 = (x0y7 + x7y0) + (x2y5 − x5y2) + (x3y4 − x4y3) + (x6y1 − x1y6)
はたまた x の添え字によって z1 以下を項単位でソートすると:
  z1 = x0y1 + x1y0 + x2y3 − x3y2 + x4y5 − x5y4 − x6y7 + x7y6
  z2 = x0y2 − x1y3 + x2y0 + x3y1 + x4y6 + x5y7 − x6y4 − x7y5
  z3 = x0y3 + x1y2 − x2y1 + x3y0 + x4y7 − x5y6 + x6y5 − x7y4
  z4 = x0y4 − x1y5 − x2y6 − x3y7 + x4y0 + x5y1 + x6y2 + x7y3
  z5 = x0y5 + x1y4 − x2y7 + x3y6 − x4y1 + x5y0 − x6y3 + x7y2
  z6 = x0y6 + x1y7 + x2y4 − x3y5 − x4y2 + x5y3 + x6y0 − x7y1
  z7 = x0y7 − x1y6 + x2y5 + x3y4 − x4y3 − x5y2 + x6y1 + x7y0

一体何が起きているのか把握困難だが、「0 ~ 7 番の添え字が入り乱れて、複雑にキラキラしてる」ってことは、感じ取れる。

20. 積の式の全体的な仕組みのうち、最も単純な部分について。八元数
  X = x0 + x1e1 + x2e2 + … + x7e7
を (x0, x1, …, x7) と略すことにする。第一に、7種の虚数単位は、どれも平方すると −1 になる。例えば…
  X = e3 = (0, 0, 0, 1, 0, 0, 0, 0)
  Y = e3 = (0, 0, 0, 1, 0, 0, 0, 0)
…のとき、積 Z = XY = (e3)2 の実部は上の公式から:
  z0 = x0y0 − x1y1 − x2y2 − x3y3 − x4y4 − x5y5 − x6y6 − x7y7
   = 0⋅0 − 0⋅0 − 0⋅0 − 1⋅1 − 0⋅0 − 0⋅0 − 0⋅0 − 0⋅0 = −1
一方、虚部については、添え字 3 番以外の全変数がゼロなので:
  z1 = (x0y1 + x1y0) + (x2y3 − x3y2) + (x4y5 − x5y4) + (x7y6 − x6y7)
  = (0⋅0 + 0⋅0) + (0⋅1 − 1⋅0) + (0⋅0 − 0⋅0) + (0⋅0 − 0⋅0) = 0
z2 以降も同様で、添え字 3 番同士の積 x3y3 以外は消滅する運命だが、x3y3 という項は虚部のどこにもないので、虚部は全滅。ここでは 3 番の虚数単位 e3 を考えたが e1 ~ e7 のどれでも同様になり、平方すれば −1。

ところで、
  X = 1 = (1, 0, 0, 0, 0, 0, 0, 0)
  Y = 1 = (1, 0, 0, 0, 0, 0, 0, 0)
のとき、当然 Z = XY = 12 = 1 になると期待される。その場合、虚部が(x0y0 という項を含まないので)全滅するのは、上記と同様。実部は
  z0 = x0y0 − x1y1 − x2y2 − x3y3 − x4y4 − x5y5 − x6y6 − x7y7  『
   = 1⋅1 − 0⋅0 − 0⋅0 − 0⋅0 − 0⋅0 − 0⋅0 − 0⋅0 − 0⋅0 − 0⋅0 = 1
なので、期待はかなう。『く』で最初の項はプラス、それ以外の項はマイナスになっていることから、虚数単位の平方・実数単位(つまり 1)の平方のどちらも期待通りになる。

第二に、ある八元数 X が与えられたとき、その X と同一の実部を持ち、虚部については「絶対値が同じで符号が反対」の八元数を X の共役と呼ぶ――ここでは、右肩にアスタリスクを付けて共役を表す。
  X = (x0, x1, x2, x3, x4, x5, x6, x7) のとき:
  X* = (x0, −x1, −x2, −x3, −x4, −x5, −x6, −x7)
一般に、ある八元数とその共役の積は、8成分の平方和(実数)になる:
  XX* = x02 + x12 + x22 + x32 + x42 + x52 + x62 + x72

この性質についても、実部は『く』から容易に確かめられる:
  Y = X* = (+x0, −x1, −x2, −x3, −x4, −x5, −x6, −x7) ならば
  z0 = x0(+x0) − x1(−x1) − x2(−x2) − x3(−x3) − x4(−x4) − x5(−x5) − x6(−x6) − x7(−x7)
  = x02 + x12 + x22 + x32 + x42 + x52 + x62 + x72

問題は Y = X* のとき XY の虚部が全滅することの確認だが、上記のように z1 ~ z7 の各式は、次の形を持つ。
  zn = (x0yn + xny0) + (xayb − xbya) + (xcyd − xdyc) + (xeyf − xfye)  『
  ただし n = 1, 2, …, 7 のどれか
  a, b, c, d, e, f は 1, 2, …, 7 のうち n 以外の六つを並び替えたもの
『け』の最初の丸かっこ内について、Y = X* のとき y0 = x0, yn = −xn だから:
  x0yn + xny0 = x0(−xn) + xnx0 = 0
次の丸かっこ以降には添え字 0 番が含まれないことに注意すると、yb = −xb, ya = −xa だから:
  xayb − xbya = xa(−xb) − xb(−xa) = 0
同様に下記のようになって『け』の四つの丸かっこ内は全部 0 に等しく、虚部は消滅する。
  xcyd − xdyc = xc(−xd) − xd(−xc) = 0
  xeyf − xfye = xe(−xf) − xf(−xe) = 0

21. 自由ソフトウェア PARI/GP を使って、実際に遊んでみよう。

八元数 X = (x0, x1, x2, x3, x4, x5, x6, x7) を次のコード(8次元のベクトル、要するに配列)で表すことにする:
  X = [x0,x1,x2,x3, x4,x5,x6,x7]
この処理系では、配列のインデックスは 1 から始まる: X[1] = x0; X[2] = x1; X[3] = x2; のように、添え字よりインデックスは 1 大きい。積の実装例は:

octomul5(X,Y) = {
 my(x0=X[1], x1=X[2], x2=X[3], x3=X[4], x4=X[5], x5=X[6], x6=X[7], x7=X[8]);
 my(y0=Y[1], y1=Y[2], y2=Y[3], y3=Y[4], y4=Y[5], y5=Y[6], y6=Y[7], y7=Y[8]);
 my(z0,z1,z2,z3, z4,z5,z6,z7);
 z0 = x0*y0 - x1*y1 - x2*y2 - x3*y3 - x4*y4 - x5*y5 - x6*y6 - x7*y7;
 z1 = (x0*y1 + x1*y0) + (x2*y3 - x3*y2) + (x4*y5 - x5*y4) + (x7*y6 - x6*y7);
 z2 = (x0*y2 + x2*y0) + (x3*y1 - x1*y3) + (x4*y6 - x6*y4) + (x5*y7 - x7*y5);
 z3 = (x0*y3 + x3*y0) + (x1*y2 - x2*y1) + (x4*y7 - x7*y4) + (x6*y5 - x5*y6);
 z4 = (x0*y4 + x4*y0) + (x5*y1 - x1*y5) + (x6*y2 - x2*y6) + (x7*y3 - x3*y7);
 z5 = (x0*y5 + x5*y0) + (x1*y4 - x4*y1) + (x7*y2 - x2*y7) + (x3*y6 - x6*y3);
 z6 = (x0*y6 + x6*y0) + (x2*y4 - x4*y2) + (x1*y7 - x7*y1) + (x5*y3 - x3*y5);
 z7 = (x0*y7 + x7*y0) + (x3*y4 - x4*y3) + (x6*y1 - x1*y6) + (x2*y5 - x5*y2);
 [z0,z1,z2,z3, z4,z5,z6,z7]; }

〔参考〕 関数名の octo は octonion(八元数)の略、mul は multiply(掛け算する)の略、5 は単なる識別子(実装バージョン5)。

2 個の八元数をでたらめに設定(2 の平方根と円周率に基づく):

X = [1, 4, -1, -4,  2, 1, 3, 5];
Y = [3, 1, 4, -1,  5, 9, 2, 6];

積 XY は、どんな数になると思いますか? まるで予想がつかないが、成分は整数のはず…。まぁやってみよう:
入力 Z = octomul5(X, Y) [Enter]
出力は [-56, 35, -49, 16, 9, 51, 52, -15]
意外とかわいい数(巨大ではない)が出た。 X の成分と Y の成分は一桁の掛け算で、それを足したり引いたりするので、巨大になるわけないか…。8次元空間内で、なにやら回転の合成(?)が起きて、結果はこうなった。ノルムを使って検算してみる。
sum_of_8sq(X) * sum_of_8sq(Y) == sum_of_8sq(Z)
めでたく 1 つまり true が返る!

交換法則は(既に四元数の段階で)破壊されている。どのくらい破壊されているのか、実地に試してみる:
Z2 = octomul5(Y, X) とタイプすると
出力 [-56, -9, 51, -42, 13, -27, -30, 57]
全然違う数が出たッ! 実部だけは上記 Z と同じ −56 だが…。ノルムは同じのはず。
sum_of_8sq(Z2) == sum_of_8sq(Z) とタイプすると、うん 1 が返る。

八元数では、結合法則も破壊される。どのくらい壊れているのか、これも実験してみよう。
入力 A = [1, 7, 3, 2, 0, 5, 0, 8]; XY = octomul5(X,Y) [Enter]
出力 [-56, 35, -49, 16, 9, 51, 52, -15]
XY_A = octomul5(XY,A)
出力 [-321, -874, 308, 684, 189, -49, 432, -515] ★
これは (XY)A である。次に X(YA) を計算する。
YA = octomul5(Y,A)
出力 [-107, 42, 46, 30, 89, -29, -24, 27]
X_YA = octomul5(X,YA)
出力 [-321, -580, -278, 230, 405, 399, -714, -719] ★
★ を見比べると、実部以外は全部異なる! 小心に検算:
sum_of_8sq(XY_A)==sum_of_8sq(X_YA) よし 1 が返る!

うわさの「弱い結合法則」を試してみたい。
XX = octomul5(X,X)
出力 [-71, 8, -2, -8, 4, 2, 6, 10]
XX_Y = octomul5(XX,Y)
出力 [-331, -3, -390, 105, -347, -555, -42, -468] ☆
XY = octomul5(X,Y)
出力 [-56, 35, -49, 16, 9, 51, 52, -15]
X_XY = octomul5(X,XY)
出力 [-331, -3, -390, 105, -347, -555, -42, -468] ☆
おおおっ!! ☆ を見比べると (XX)Y = X(XY) が成立している!!! やるじゃねぇか、八元数。

弱い結合法則 八元数 a, b, c について、通常の結合法則
  (ab)c = a(bc)
は、一般には不成立。ただし a, b, c の中に等しい値があるときは、これが成り立つ。つまり:
  (xx)y = x(xy)  ← a = b = x, c = y ①
  (xy)y = x(yy)  ← a = x, b = c = y ②
  (xy)x = x(yx)  ← a = c = x, b = y ③

①については、上記の通り数値実験成功! ②もやってみると:
XY = octomul5(X,Y); XY_Y = octomul5(XY,Y) YY = octomul5(Y,Y); X_YY = octomul5(X,YY)
どちらも [-509, -482, -121, 788, -292, 133, -207, -955] が返る。

③もやってみよう:
XY = octomul5(X,Y); XY_X = octomul5(XY,X) YX = octomul5(Y,X); X_YX = octomul5(X,YX)
どちらも [-331, -375, 404, 375, 141, 545, -190, -122] が返る。

*

今回は「妖精の鏡」の研究を始めなかったが、八元数について、ちょっとだけ親近感を持つことができた。「弱い結合法則」については、単なる一つの例の観察で、証明ではない。

八元数の和声学によると、和音集には(理論上)30 の系列があり、どの系列も16種の有効な符号設定を持つ。ある系列の和音集を一つでも構成できれば、同系列の計16種は自動的に決まる。系列の符号設定は理論上128種あり、もしその系列が本当に実現可能なら16種の有効設定があるのだから、「形式的に正しい和音集」をでたらめに入力しても、確率 8 分の 1 でラッキーヒットが起き、妖精の鏡を動作させることができる。つまりブルートフォース・アタック(総当たり攻撃)でも、簡単に「パスワード的な和音集」を見つけ「鏡をクラック」できるはずだ。とはいえ、強引に鏡をクラックするのは、いかにも野蛮。古典和音集(GrC)を基点に、平和に目的を達成したい。

(参考4) octomul5 と同内容で、項の順序をソートすると:

octomul4(X,Y) = {
 my(x0=X[1], x1=X[2], x2=X[3], x3=X[4], x4=X[5], x5=X[6], x6=X[7], x7=X[8]);
 my(y0=Y[1], y1=Y[2], y2=Y[3], y3=Y[4], y4=Y[5], y5=Y[6], y6=Y[7], y7=Y[8]);
 my(z0,z1,z2,z3, z4,z5,z6,z7);
 z0 = x0*y0 - x1*y1 - x2*y2 - x3*y3 - x4*y4 - x5*y5 - x6*y6 - x7*y7;
 z1 = x0*y1 + x1*y0 + x2*y3 - x3*y2 + x4*y5 - x5*y4 - x6*y7 + x7*y6;
 z2 = x0*y2 - x1*y3 + x2*y0 + x3*y1 + x4*y6 + x5*y7 - x6*y4 - x7*y5;
 z3 = x0*y3 + x1*y2 - x2*y1 + x3*y0 + x4*y7 - x5*y6 + x6*y5 - x7*y4;
 z4 = x0*y4 - x1*y5 - x2*y6 - x3*y7 + x4*y0 + x5*y1 + x6*y2 + x7*y3;
 z5 = x0*y5 + x1*y4 - x2*y7 + x3*y6 - x4*y1 + x5*y0 - x6*y3 + x7*y2;
 z6 = x0*y6 + x1*y7 + x2*y4 - x3*y5 - x4*y2 + x5*y3 + x6*y0 - x7*y1;
 z7 = x0*y7 - x1*y6 + x2*y5 + x3*y4 - x4*y3 - x5*y2 + x6*y1 + x7*y0;
 [z0,z1,z2,z3, z4,z5,z6,z7]; }

⁂

2023-11-30 妖精の鏡(その2) 黒記号と白記号

#数論 #FairyGlass #八元数

八元数 X = (x0, x1, … x7) と Y = (y0, y1, … y7) の積 Z = (z0, z1, … z7) に関して、Z の実部が
  z0 = x0y0 − x1y1 − x2y2 − x3y3 − x4y4 − x5y5 − x6y6 − x7y7  『
になることの意味を確かめた(§20)。今回は z1 以下の式の形の、全体的構造と仕組みを見渡したい。

*

22. z1 以下の項は、次の形式を持つ(§19):
  z1 = 【x0y1 + x1y0】 + 〖x2y3 − x3y2〗 + 〖x4y5 − x5y4〗 + 〖x7y6 − x6y7
  z2 = 【x0y2 + x2y0】 + 〖x3y1 − x1y3〗 + 〖x4y6 − x6y4〗 + 〖x5y7 − x7y5
  z3 = 【x0y3 + x3y0】 + 〖x1y2 − x2y1〗 + 〖x4y7 − x7y4〗 + 〖x6y5 − x5y6
etc.

ここでは、黒いかっこ【】と白いかっこ〖〗は、普通の丸かっこと同じ意味――各右辺を四つのブロックに色分け・整理しているだけで、計算結果には何の影響も与えない。もし…
  X = 1 = (1,0,0,0, 0,0,0,0)
  つまり x0 = 1, x1 = x2 = … = x7 = 0
…なら、積 Z = XY について、白かっこ内の各項は「0 に等しい x1 ~ x7 との掛け算」を含むので全部ゼロ。黒かっこ内の後半も同じ理由で消滅。つまり X = 1 なら:
  z1 = x0y1 = 1⋅y1 = y1
  z2 = x0y2 = 1⋅y2 = y2
  z3 = x0y3 = 1⋅y3 = y3 等々
一方『こ』から z0 = 1⋅y1 + 0⋅y2 + 0⋅y3 + … + 0⋅y7 = y0 なので:
  任意の八元数 Y について X = 1 なら XY = Z = (z0, z1, … z7) は
   Y = (y0, y1, … y7) に等しい。要するに 1⋅Y = Y

同様に、X を任意の八元数として、もし…
  Y = 1 = (1,0,0,0, 0,0,0,0)
  つまり y0 = 1, y1 = y2 = … = y7 = 0
…なら、積 Z = XY について、白かっこ内の各項は「0 に等しい y1 ~ y7 との掛け算」を含むので全部ゼロ。黒かっこ内の前半も同じ理由で消滅。こうなる:
  Y = 1 なら z1 = x1, z2 = x2, z3 = x3, …
一方『こ』から z0 = x1⋅1 + x2⋅0 + x3⋅0 + … + x7⋅0 = x0 なので:
  任意の八元数 X について Y = 1 なら XY = Z = (z0, z1, … z7) は
   X = (x0, x1, … x7) に等しい。要するに X⋅1 = X

「ある数 Y = (y0, y1, … y7) を 1 = (1,0,0,0, 0,0,0,0) 倍すれば、1 を左から掛けても右から掛けても、積はもともとの数 Y に等しい」というのは感覚的には当たり前のことに思えるが、これがうまくいく理由として、Y の各虚部(添え字 n = 1, 2, …, 7)に関連して、
  x0yn + ynx0  『
が積の公式の zn の値に含まれ(黒かっこ)、zn の計算において、それ以外の部分は消滅する(白かっこが添え字 0 を含まない)。『さ』を
  【0n】
と略すと、積の公式の z1 の値は【01】を含み、z2 の値は【02】を含み、一般に zn の値は【0n】を含む。他方、積の実部 z0 は『こ』の通り。

より一般的に xmyn + ynxm を【mn】と略し、これを黒記号と呼ぶことにすると、上記は黒記号で m = 0 の場合に当たる。

23. X = (x0, x1, … x7) と Y = (y0, y1, … y7) が、実部 0 の純虚数だとしよう。つまり、添え字 0 の変数の値はゼロ。さらに、X については x1 ~ x7 のどれか一つだけ(それを xa とする)が 1 でそれ以外は 0 とする。 Y については y1 ~ y7 のどれか一つだけ(それを yb とする)が 1 でそれ以外は 0 とする。すると:
  X = x0e0 + x1e1 + … + xaea + … + x7e7 = xaea
   = 0⋅e0 + … + 1⋅ea + … + 0⋅e7  ← 添え字 a 以外の項は全部ゼロ
  Y = y0e0 + y1e1 + … + ybeb + … + y7e7 = ybeb
   = 0⋅e0 + … + 1⋅eb + … + 0⋅e7  ← 添え字 b 以外の項は全部ゼロ
  XY = 1⋅ea⋅1⋅eb = eaeb

つまり虚数単位と虚数単位の積、いわゆる「八元数の九九」の計算になる。ここで e0 は実数の単位、つまり自然数の 1 に他ならない。上記の式では e7 の係数が 0 になっているが、これは表記の便宜上のこと。 1 ~ 7 番の添え字は対等の立場なので a = 7 や b = 7 にもなり得る(そのとき e7 の係数 x7 ないし y7 は = 1 となり、つまり X ないし Y は = e7 となる)。もっとも a = b の場合、eaeb = eaea = (ea)2 = −1 であることは確認済みなので、以下では a ≠ b の場合に話を限ろう。

相異なる二つの虚数単位の積について、積の実部 z0 はゼロ、z1 以降の黒かっこ内もゼロなので、積の公式を次のように簡略化できる:
  z1 = 〖x2y3 − x3y2〗 + 〖x4y5 − x5y4〗 + 〖x7y6 − x6y7
  z2 = 〖x3y1 − x1y3〗 + 〖x4y6 − x6y4〗 + 〖x5y7 − x7y5
  z3 = 〖x1y2 − x2y1〗 + 〖x4y7 − x7y4〗 + 〖x6y5 − x5y6
  z4 = 〖x5y1 − x1y5〗 + 〖x6y2 − x2y6〗 + 〖x7y3 − x3y7
  z5 = 〖x1y4 − x4y1〗 + 〖x7y2 − x2y7〗 + 〖x3y6 − x6y3
  z6 = 〖x2y4 − x4y2〗 + 〖x1y7 − x7y1〗 + 〖x5y3 − x3y5
  z7 = 〖x3y4 − x4y3〗 + 〖x6y1 − x1y6〗 + 〖x2y5 − x5y2

一つの白かっこ内には 2 個の項があり、白かっこは 3 × 7 = 21 個あるのだから、ここには計 42 項がある。一方 a は 1 ~ 7 のどれか(7種)で、b は 1 ~ 7 のうち a 以外のどれか(6種)なので、eaeb という積は 7 × 6 = 42 種類、考えられる。 42 という数がぴったり一致するのだから、直観的には a, b をどう選択しても、eaeb という項は上の 42 項の中にちょうど 1 回だけ出現するように思える。この結論は正しいし、実際に 42 パターンを一つ一つ確認することもできるだろうが、なぜそうなるのか? 積の公式は、そもそも Cayley–Dickson プロセスによって天下り的に導出された。結果の有効性は、いろいろな検算(特に積のノルムがノルムの積に等しいこと、言い換えれば八平方和の恒等式)によって検証可能だが、「結果が正しいのだからいいでしょう」では「天下りの罪」は消えない。

その点を保留して話を進めると、考える必要のある42種類の「九九」は、上記によって過不足なく記述される: 項 1⋅ea⋅1⋅eb = eaeb に対応する xaxb = 1⋅1 = 1 は、必ずどれか一つの白かっこ内に含まれる(そして、それ以外の全部の項はゼロ)。 xaxb が zn の式の三つの白かっこのどれかに含まれるとすると、問題の項が白かっこ内の前半か後半かに応じて、
  zn = xaxb ないし zn = −xaxb
となり、これは eaeb が en ないし −en に等しいことを意味する。例えば a = 4, b = 5 なら z1 の式が(そしてその式だけが)x4y5 を含むのだから:
  e1 = e4e5
これは和音《145》の基本形に当たる。その転回形 451, 514 から、それぞれ
  e4 = e5e1  e5 = e1e4
となるはずだが、これらはそれぞれ、上記 z4 の式が x5y1 を含むこと、z5 の式が x1y4 を含むことに対応。さらに、虚数単位の積の順序を入れ替えると符号が変わるので、例えば −e1 = e5e4 つまり
  e1 = −e5e4
  同様に e4 = −e1e5  e5 = −e4e1
これらの事実は、掛け算の順序を入れ替える前と同じ白かっこ内の、他方の項の意味と一致する。要するに「九九」が42種あるといっても、実際には順序の入れ替えは符号が変わるだけなので、21 個の白かっこに帰着し、しかもその 21 個の白かっこは、たった七つの和音に帰着する!

一見複雑な掛け算表・積の公式が、シンプルな七つの和音によってコントロールされている。これが「妖精の鏡」の基本。それを実装するため、白記号を次のように定義しよう:
  〖mn〗 = xmyn − xnym

すると一般の積の公式(古典)は、次のように簡略表記される:
  z0 = x0y0 − x1y1 − x2y2 − … − x7y7
  z1 = 【01】 + 〖23〗 + 〖45〗 + 〖76〗
  z2 = 【02】 + 〖31〗 + 〖46〗 + 〖57〗
  z3 = 【03】 + 〖12〗 + 〖47〗 + 〖65〗
  z4 = 【04】 + 〖51〗 + 〖62〗 + 〖73
  z5 = 【05】 + 〖14〗 + 〖72〗 + 〖36〗
  z6 = 【06】 + 〖24〗 + 〖17〗 + 〖53〗
  z7 = 【07】 + 〖34〗 + 〖61〗 + 〖25〗

⁂

2023-12-01 妖精の鏡(その3) ひそやか野原

#数論 #FairyGlass #八元数

八元数 X, Y の積 Z = XY の 8 成分は、最初の一つを除き…
  z5 = 【05】 + 〖14〗 + 〖72〗 + 〖36〗
…のように
  zn = 【0n】 + 〖ab〗 + 〖cd〗 + 〖ef〗
の形を持つ(ここで ab は10の位が a で1の位が b の 2 桁の数。cd, ef も同様)。これを
  Idlewild( n, ab, cd, ef )
という関数で実装するなら、八元数の積は大ざっぱにこの関数の 7 回の呼び出しになる。けれど ab, cd などは、いずれも七つの和音から派生する――和音の基本形または転回形のうち低音が n の三つについて、中音・高音を抜き出したもの。だから、さらに整理するなら、七つの和音 A, B, …, G を入力として、Idlewild の 7 回の呼び出しを自動化できるはずだ。これが…
  FairyGlass( A, B, C, D, E, F, G )
…であり、「九九」の設定に応じた掛け算を実行したり、積の公式や掛け算表を自動整形・出力したりするための便利なツールとなる。入力が七つで、一つ一つから三つの和音が生じるので、ちょっと詩的に「七色の光を反射して、一つの色につき小さな虹色のきらめきが 3 回ずつ起きる」とイメージし、比喩的に「妖精の鏡」と名付ける。

たとえ数学でも、すてきで分かりやすい名前を付けることは楽しいし、役に立つ。八元数の発見者 Graves は、八元数を「オクターブ」と呼んだ。ファンシーな名前が正式な数学用語として定着することもある――虚数を表す imaginary number(空想上の数)や、ある種の集合を表す ideal(理想)のように。

*

24. 汎用的な JavaScript で実装してもいいのだが、数論には PARI/GP という便利なスクリプトがあるので、それを使うことにする(言語仕様については、実例に即して説明)。

最初に、妖精の鏡を使わず、次の 8 要素を返す関数 octomulGrC をベタに実装すると…
  z0 = x0y0 − x1y1 − x2y2 − … − x7y7
  z1 = 【01】 + 〖23〗 + 〖45〗 + 〖76〗
  z2 = 【02】 + 〖31〗 + 〖46〗 + 〖57〗
  z3 = 【03】 + 〖12〗 + 〖47〗 + 〖65〗
  z4 = 【04】 + 〖51〗 + 〖62〗 + 〖73
  z5 = 【05】 + 〖14〗 + 〖72〗 + 〖36〗
  z6 = 【06】 + 〖24〗 + 〖17〗 + 〖53〗
  z7 = 【07】 + 〖34〗 + 〖61〗 + 〖25〗

octomulGrC() = {
 [ X[1]*Y[1] - X[2]*Y[2] - X[3]*Y[3] - X[4]*Y[4]
   - X[5]*Y[5] - X[6]*Y[6] - X[7]*Y[7] - X[8]*Y[8],
 Idlewild( 1, 23, 45, 76 ),
 Idlewild( 2, 31, 46, 57 ),
 Idlewild( 3, 12, 47, 65 ),
 Idlewild( 4, 51, 62, 73 ),
 Idlewild( 5, 14, 36, 72 ),
 Idlewild( 6, 17, 24, 53 ),
 Idlewild( 7, 25, 34, 61 ) ];
}

Idlewild( n, ab, cd, ef ) = {
 my( a = ab\10, b = ab%10 );
 my( c = cd\10, d = cd%10 );
 my( e = ef\10, f = ef%10 );
 Black(0,n) + White(a,b) + White(c,d) + White(e,f);
}

PARI の配列のインデックスは 1 から始まる。 X の最初の要素 x0X[1] だし次の要素 x1X[2]、等々。明示的に return を書かなくても、関数内で最後に評価された式が戻り値になる。 octomulGrC は、長さ 8 の配列(ベクトル)がベタに書いてあるだけの関数で、それが戻り値。最初の要素は、いくらなんでもベタ過ぎるので、簡潔にこう書いてもいい:
  X[1]*Y[1] - sum( u=2, 8, X[u]*Y[u] )
u は単なるループ変数(ループ内のローカル)。普通 i を使うものだが、虚数や四元数が関連する文脈で i を使うと混乱の原因になるので u としておく。

Idlewild(怠けた荒野)は、自分ではろくに何もせず下請けの BlackWhite を呼び出し、結果を足して返す。キーワード my は、ローカル変数を作る(Perl 風。正確に言うと local とは性質が違うのだが、my が普通の意味でのローカル変数に当たる)。 ab, cd などは、それぞれ一つ変数で、2 桁の整数を受け取る; \10%10 は、それぞれ10の位、1の位を取り出す。

実際の計算に必要な、黒記号と白記号の実装:

Black(m,n) = { m++; n++; X[m]*Y[n] + X[n]*Y[m]; }
White(m,n) = { m++; n++; X[m]*Y[n] - X[n]*Y[m]; }

われわれの添え字は 0 番から始まるが、PARI の配列のインデックスは 1 から始まるので、添え字に 1 を足す必要がある。++ がこの処理を行う。 X, Y は、どちらも八元数を表すグローバル変数で、長さ 8 の配列。こんなふうに安易にグローバル変数を使うのは良くないことだが、いちいち配列を受け渡しするのも面倒くさいので、自堕落に…。関数名も Idlewild(怠惰なワイルド)。とりあえず一通り実装が済んだので、テストしてみよう…。毎回 sum_of_8sq をタイプするのも面倒なので、テストツールを先に作っておこう:

sum_of_8sq(vec) = { sum( u=1, 8, vec[u]^2 ); }
test(X,Y,Z) = { if( sum_of_8sq(X) * sum_of_8sq(Y) == sum_of_8sq(Z), "OK!", "#BAD#" ); }

\\ test
X = [x0,x1,x2,x3, x4,x5,x6,x7];
Y = [y0,y1,y2,y3, y4,y5,y6,y7];
Z = octomulGrC();
test(X,Y,Z)

実行すると、めでたく "OK!" が返る。 PARI の if は構文が風変わり。
  if( something, sentence1, sentence2 )
…とした場合、まず something が評価される。それが true なら続いて sentence1 が評価され、false なら sentence2 が評価される。上記 test では、そのどちらかが最後に評価される文字列で、戻り値。セミコロン ; で終わる文では、戻り値は非表示になり、セミコロンで終わらない文では、戻り値がコンソールに表示される。test(X,Y,Z) にセミコロンが付いていないのは、戻り値を表示させたいから。

プログラマーの人は x0, x1 などが未初期可変数で、宣言すらされていないことに疑問を抱くかもしれない。もしもデフォルトで自動的に 0 に初期化されるなら、XY は全要素が 0 の配列になってしまい、たとえ octomulGrC の実装がでたらめでも Z もまた全要素 0 になり test を通ってしまう――大抵の言語では、こういう場合、不明な識別子 x0 というエラーが出るか、少なくとも初期化されていないという警告が出る。ところが PARI は、知らない識別子 x0 を与えられたとき、自動的に x0 という名前の多項式だと認識してくれる。 octomulGrC は、入力が数値なら具体的な八元数についての数値計算になるけれど、上のテストでは「多項式の配列」(実質的に八つの未知数)についての多項式演算が行われる。言い換えると、この場合のテストは、ある数値例についての検算(式が間違っていても偶然結果が正しくなる可能性もある)ではなく、多項式としての検算であり、要するに八平方の恒等式が検証される。

従って、この場合の Z は長さ 8 の配列で、各要素は多項式。配列の例えば 4 番目の要素…
  y3*x0 + (y2*x1 + (-y1*x2 + (y0*x3 + (y7*x4 + (-y6*x5 + (y5*x6 - y4*x7))))))
…は、§19 の次の行の右辺に当たる:
  z3 = x0y3 + x1y2 − x2y1 + x3y0 + x4y7 − x5y6 + x6y5 − x7y4

JavaScript でなく PARI を使う一つの理由は、この機能が便利だから。明示的に初期化されていない変数(特にグローバル変数)をこんなふうに使うのは、あまり良いことではないけれど、PARI/GP では言語仕様としてこれが許されている。

*

Idle は、エンジンの「アイドル状態」(アイドリング)の idle で「忙しくない」という意味。「アイドル歌手」の idol ではない。関数名の IdlewildFairyGlassRainbow は小説『赤毛のアン』(ANNE OF GREEN GABLES)の次のパラグラフにちなむ。

Diana and I have our playhouse there. We call it Idlewild. Isn’t that a poetical name?

The fairy glass is as lovely as a dream. Diana found it out in the woods behind their chicken house. It’s all full of rainbows—just little young rainbows that haven’t grown big yet—and Diana’s mother told her it was broken off a hanging lamp they once had. But it’s nicer to imagine the fairies lost it one night when they had a ball, so we call it the fairy glass.

ページの飾りの画像も「アンの小箱」の素材だし、ちょうどいいかと…。もっとも、想像力豊かなはずの Anne は、幾何学についてこう言っている。

“It’s perfectly awful stuff, Marilla,” she groaned. “I’m sure I’ll never be able to make head or tail of it. There is no scope for imagination in it at all.”

8次元の代数では掛け算のやり方が480通りあって、七つの和音虹のきらめきでできているというのに…。 4次元の立方体に辺が幾つあって、頂点が幾つあるか考えるだけでも a lot of scope for imagination である!

⁂

2023-12-02 妖精の鏡(その4) 虹の実装

#数論 #FairyGlass #八元数

前回は Idlewild を手動で 7 回呼び出した。和音集を入力として、この呼び出しを自動化する部分を実装する。虹の七色の一つ一つが FairyGlass の中でキラキラと、ワルツを踊る…

*

25. §23 で観察したように、Idlewild の呼び出しに必要な呪文 1, 23, 45, 76 や 2, 31, 46, 57 や 3, 12, 47, 65 などは、どれも七つの和音から派生する。

 Idlewild( 1, 23, 45, 76 ),
 Idlewild( 2, 31, 46, 57 ),
 Idlewild( 3, 12, 47, 65 ),
 ...

具体的に、一つの和音 pqr が与えられたとき(例: 123)、それをそのまま使うこともできるし、qrp と転回して使うこともできるし(例: 231)、rpq と転回して使うこともできる(例: 312)。一つの和音ごとに3種の使い方ができるので、七つの和音から成る和音集には、転回形も含めると、ちょうど21種の和音が所属している。

これら21種の和音の中には、低音が 1 のものが3種、低音が 2 のものが3種、低音が 3 のものが3種、低音が 4 のものが3種…等々、一つの低音ごとに、ちょうど3種の和音がある。特定の低音 n を持つ3種の和音の中音・高音
  Idlewild( n, ab, cd, ef )
の ab, cd, ef に他ならない。ここでは、数の大小と無関係に、左端にある数(百の位)を「低音」と呼んでいる。

〔例〕 古典和音集 GrC には、和音 123, 347, 365 が含まれる。123 の転回形の一つ 312 を含めると(その低音は 3 である)、低音が 3 の三つの和音の中音・高音は 12, 47, 65 であり、それが次の呼び出しの根拠となる:
  Idlewild( 3, 12, 47, 65 )

従って、七つの和音を入力として、転回形を含む21種の和音を生成し、7種の低音の一つ一つに対応する和音(それぞれ三つずつある)を考えればいい。和音を 3 桁の整数だと思うと、低音は百の位なので、21種の和音を小さい順にソートして、端から順に三つずつをグループにすれば、必要な七つのグループが得られる――「そんなに都合よく、百の位に 1 ~ 7 がどれも 3 回ずつ現れるのか?」という疑問が湧くかもしれないが、入力が有効な和音集なら、原理的にそうなる必要がある。その際、Idlewild が必要としているのは中音・高音だけなので、100 で割った余りを取り出せばいいだろう。例えば、低音が 3 の和音 312 について、100 で割った余り 12 が Idlewild( 3, ab, cd, ef ) の入力 ab, cd, ef の一つとなる。

デバッグ出力付きの実装例。

FairyGlass( A,B,C,D,E,F,G ) = {
 my( R = Rainbow([A,B,C,D,E,F,G]), Z = vector(8) );
print("R=",R); \\ #1

 Z[1] = X[1]*Y[1] - sum( u=2, 8, X[u]*Y[u] );
 for( n = 1, 7, Z[n+1]
  = Idlewild( n, R[n,1], R[n,2], R[n,3] ) );
 Z;
}

FairyGlass は七つの和音を受け取り、それを長さ 7 の配列として Rainbow に渡す。 Rainbow の戻り値 R は、例えば Idlewild( 5, ... ) の呼び出しのとき、次のように使える:
  Idlewild( 5, R[5,1], R[5,2], R[5,3] );
すなわち R[n,t] は、左側のインデックス n が 1 から 7 の範囲を動き、右側のインデックス t が 1 or 2 or 3 の値を取るような、2次元配列。PARI のロジックとしては 7 行 3 列の行列。

FairyGlass 自身の戻り値 Z は長さ 8 の配列。前回と同じように積 XY の最初の成分(実部 z0)を Z[1] に書き込む。for ループに入って、二つ目の成分(虚部 z1)を Z[2] に書き込み、以下順々に進めて、最後の成分(虚部 z7)を Z[8] に書き込んだらループを抜け、完成した Z を返す。PARI のループの構文は:
  for( counter = start, last, do_something() )

二重のバックスラッシュ \\ 以下は行コメント: #1R の中身をコンソールに出力する。この行は、動作確認・デバッグのためのもので、関数の機能とは無関係。最終的には、コメントアウトあるいは削除していい。

26. 肝心の「虹」を実装しよう。

Rainbow は、和音集(七つの和音から成る)を長さ 7 の配列 triads として受け取る。これは妖精の世界の関数なので、ユーザーを完全に信頼して、何のエラーチェックもしない(無効な和音集を渡されれば、意味不明の挙動になる)。

作業用の一時変数として、長さ 21 の配列 vec を確保。渡された七つの和音の一つ一つを順に変数 pqr に読み込んで、高音・中音・低音をそれぞれ p, q, r に取り出す。 vec に端から三つずつ、pqr そのものと、その二つの転回形を書き込んでいく。七つの和音についてこれを行うと、長さ 21 の配列が完成。#2 で結果をデバッグ出力。

Rainbow( triads ) = {
 my( vec = vector(21), pqr, p,q,r );
 for( u = 1, 7, pqr = triads[ u ];
  p = pqr\100;
  q = pqr\10%10;
  r = pqr%10;
  my( w = 3*(u-1) ); \\ 0,3,6,9..
  vec[ w+1 ] = pqr;
  vec[ w+2 ] = q*100 + r*10 + p; \\ qrp
  vec[ w+3 ] = r*100 + p*10 + q; \\ rpq
 );
print("vec=",vec); \\ #2

 vec = vecsort( vec );
print("vec=",vec); \\ #3

 matrix( 7, 3, u, v, vec[3*(u-1)+v] % 100 );
}

vecsort によって vec の中身を小さい順にソート。これによって、最初の三つは 1xx の形、次の三つは 2xx の形…となる。ソート結果を #3 でデバッグ出力。

戻り値の構文は少々複雑そうだが、7 行 3 列の「表」を作って、各行の三つの「升目」に vec の内容を端から三つずつ書き込んでいる。ただし低音は必要ないので、100 で割った余りを格納。u, v は形式変数(変数名は何でもいい)――行列の第 u 行・第 v 列が「第 5 変数を評価した値」で初期化される。

〔補足〕 u が 1, 2, 3, … の値を取るとき 3*(u-1) は 0, 3, 6, … なので vec[] のインデックスは v = 1, 2, 3 に応じて 1, 2, 3; 4, 5, 6; 7, 8, 9; … と増加。要するに vec の 21 個の成分が順々に読み出され、それぞれを 100 で割った余りが「表」に書き込まれる。

動作確認。上記の FairyGlassRainbow を読み込んだ後で、次のコードを実行。このバージョンの Idlewild は、呼び出されるごとに先頭の #4 において、何を渡されたかデバッグ出力する(それ以外は前回と同じ)。

Idlewild( n, ab, cd, ef ) = {
print("Idlewild: ", [n,ab,cd,ef]); \\ #4

 my( a = ab\10, b = ab%10 );
 my( c = cd\10, d = cd%10 );
 my( e = ef\10, f = ef%10 );
 Black(0,n) + White(a,b) + White(c,d) + White(e,f);
}

Black(m,n) = { m++; n++; X[m]*Y[n] + X[n]*Y[m]; }
White(m,n) = { m++; n++; X[m]*Y[n] - X[n]*Y[m]; }

sum_of_8sq(vec) = { sum( u=1, 8, vec[u]^2 ); }
test(X,Y,Z) = { if( sum_of_8sq(X) * sum_of_8sq(Y) == sum_of_8sq(Z), "OK!", "#BAD#" ); }

\\ test
X = [x0,x1,x2,x3, x4,x5,x6,x7];
Y = [y0,y1,y2,y3, y4,y5,y6,y7];
Z = FairyGlass( 123, 145, 246, 347, 176, 257, 365 );
test(X,Y,Z)

"OK!" が返る。デバッグ出力は次の通り。まず虹の初期化の途中で #2 が実行される:
vec=[123, 231, 312, 145, 451, 514, 246, 462, 624, 347, 473, 734, 176, 761, 617, 257, 572, 725, 365, 653, 536]
FairyGlass が受け取った七つの和音の一つ一つについて、渡された順番に、もともとの和音とその二つの転回形が、三つずつ配列に格納されているのが確認できる。これをソートした #3 は:
vec=[123, 145, 176, 231, 246, 257, 312, 347, 365, 451, 462, 473, 514, 536, 572, 617, 624, 653, 725, 734, 761]
単に小さい順にソートしただけだが、低音(百の位)が 1 のもの、2 のもの、3 のもの、4 のもの…がそれぞれ三つずつある(そうなることは、有効な和音集の必要条件。十分条件ではない)。次に #1 から、完成した虹の中身が報告される:
R=[23, 45, 76; 31, 46, 57; 12, 47, 65; 51, 62, 73; 14, 36, 72; 17, 24, 53; 25, 34, 61]
上の vec の各要素の下2桁だけを取り出し、三つずつグループにしたものに他ならない。虹が完成すると、三つずつをパラメーターとして Idlewild が 7 回呼び出され、#4 を通るごとにデバッグ出力が起きる。出力内容は R 自身からも明らかなように、次の通り:
Idlewild: [1, 23, 45, 76] Idlewild: [2, 31, 46, 57] Idlewild: [3, 12, 47, 65] Idlewild: [4, 51, 62, 73] Idlewild: [5, 14, 36, 72] Idlewild: [6, 17, 24, 53] Idlewild: [7, 25, 34, 61]

前回 §24 において手動で一つずつ呼び出したのと同じ内容が、自動実行されているのが分かる(低音つまり百の位が一致する数は、中音が小さい順にソートされているため、下の 3 行は、足し算の順序が前回と異なる。結果に違いはない):
  Idlewild( n, R[n,1], R[n,2], R[n,3] )
n が 1 から 7 までの範囲を動き、積 Z = XY の第 n 虚部 zn を計算する。 R は、七つの和音のワルツから生じる「虹のきらめき」。

なかなかすてきな FairyGlass を実装できた! ロジックも理路整然として、気分がいい。XY がグローバル変数なのが、少々ワイルド過ぎるけど…

有効な和音集は GrC だけではなく、別の有効な和音集を使っても、同様のことを実行できる。もっとも、でたらめに構成した和音集では、一般には有効な八元数にならない。FairyGlass を使うと、和音集が有効かどうか、直接的に検証できる。

理論上、八元数の掛け算には30の系列があることが分かっている(各系列は、符号の違いによる16種のバリエーションを持つ)。「理論上の30の系列が、全部、本当に実現可能か?」という技術的な疑問の解明については、完全に王手がかかった。でも、八元数の「九九」が 480 パターンあるのは確からしいとして、Cayley–Dickson プロセスでは、なぜ 480 の可能性の中の特定の一つが「天下り的」に選択されるのだろう…?

*

ロジックとは関係ないが、効率に関係する補足。本文では Rainbow の作業用配列 vec を単に汎用ベクトルとして確保した:
  vec = vector(21)
この行を次のようにすると、約10%の高速化が得られる。
  vec = vectorsmall(21)

PARI/GP の vectorsmall は(任意精度でない)整数型のベクトル(配列)――この型のベクトルは「CPU に応じた小さい整数(32ビットなら32ビットに収まる範囲)」だけを成分とすることができる。一方、汎用のベクトルは、多項式・複素数・文字列などあらゆるものを成分とすることができ、数値の範囲も任意精度。この柔軟さ・強力さは、小さい整数だけを扱う場合には、無駄なオーバーヘッドとなる。特に vecsort を使う場合、この小さい整数型を使えるかどうか検討してもいいだろう――多数(この場合 21 個)の要素をソートするのは、それなりにコストがかかるので、数文字余計にタイプするだけで10%速くなるなら、悪い話ではない。われわれの和音は 3 桁の整数なので、この型に具合よく収まる。

FairyGlass は 1 万回呼び出しても 1 秒もかからないような軽い処理なので、実用上せこい高速化は必要ないけど、vecsmall という型の存在は、知っていて損はない。妖精の鏡を乱用して、全数検索的なことをしたくなるかもしれないし…。もともと PARI/GP の内部で使われるプライベートな型だったらしく、そのためか知名度が低いけれど、現在ではユーザーが直接使えるように、インターフェースが提供されている。通常の(汎用)ベクトルとこの整数型ベクトルは VecVecsmall によって、相互に型変換できる。

⁂

2023-12-05 交代代数の「交代」とは a × a × a と a3 は同じか?

#数論 #FairyGlass #八元数 #抽象代数

(2 × 3) × 5 = 2 × (3 × 5) のような結合法則は、あまりに当たり前で、注目に値しないように思える。ところが八元数の世界では、この
  (ab)c = a(bc)
という無邪気な関係が、一般には成り立たない。八元数は、結合法則ではなく交代法則を満たすという。交代法則とは何者で、一体何が「交代」するというのだろう…?

a = b = c の場合を考えていくと、一種奇妙な疑問が生じる: a × a × a を a3 と書くことは、常に可能か?

「それが 3 乗の定義なんだから a × a × a と a3 は同じに決まってるじゃん。ばかは、くだらん疑問を抱くんだな…」と優等生の人は感じるかもしれないが、果たしてその感覚は本当に正しいか…?

前回の FairyGlass の実装を約40%高速化できたので、それもメモ。

*

27. 八元数は「弱い結合法則」を満たすことが知られている。表面的な現象としては a, b, c のうち 2 個が等しいときには (ab)c = a(bc) が成り立つ。論理的には、これを次の二つの法則に定式化できる。「一体何を言っているのか?」という違和感があるかもしれないが、定義の後ですぐ解説する。

交代性(交代法則)とは次のタイプの、限定的な結合法則 (ab)c = a(bc) を指す。
  左・交代(左側の 2 数が等しい場合) a = b = x, c = y とすると
    (xx)y = x(xy) 言い換えれば (x2)y = x(xy)
  右・交代(右側の 2 数が等しい場合) a = x, b = c = y とすると
    (xy)y = x(yy) 言い換えれば (xy)y = x(y2) 同じことだが x(y2) = (xy)y

この「法則」とやらは、感覚的には不可解かもしれない。まず、そもそもこんな当たり前の計算がなぜ「法則」なのか、何を言いたいのか訳が分からない…という疑問。実際、大抵の世界では――整数、実数、複素数、あるいは行列や四元数の世界でさえ――掛け算の結合法則というもっと一般的な性質が成り立つので、こんな限定的な性質に着目する必然性に乏しく、仰々しく「交代法則」などと名前を付けるのは変な感じがする。けれど八元数の世界では、結合法則は一般には不成立。その弱いバージョンの交代法則なら成立する。さらに進めて十六元数の世界になると、この交代法則さえ崩壊してしまう!

8次元や16次元のような高次元の世界では、交代法則はもはや「当たり前」ではなく、成立するかどうかが微妙な性質。最初はピンとこないけど、4次元のさらに向こうでは、好奇心を刺激する現象が起きているので、その性質について考えてみたい。

「なぜこんなことを考えるのか」という哲学的疑問(?)が解決したところで、内容の話として「交代という名前の意味が分からない」「名前はともかく、両端の二つが等しい場合はどうなるのか」という疑問が残る。「交代」という用語については順を追って記すが、交換法則 ab = ba とは意味が違う。「両端の二つが等しい場合」について: 実は上記の二つのこと(左右の交代法則)を仮定すると、両端の二つが等しい場合の(弱い)結合法則…
  (xy)x = x(yx)  『
…を証明できる。その準備として (a + b)2 の展開を考えてみたい――ただし、考えている世界では、分配法則は成り立つが、交換法則・結合法則は保証されていないとする。
  (a + b)2 = (a + b)(a + b)
後ろ側の a + b を X と置くと:
  (a + b)2 = (a + b)X = aX + bX  ← 分配法則
  = a(a + b) + b(a + b)  ← なぜなら X = a + b
  = a2 + ab + ba + b2  ← 上の式の2項にそれぞれ分配法則を適用
交換法則 ab = ba が保証されていないので、おなじみの a2 + 2ab + b2 の形にはできないけど、特に難解なことは生じていない。

今、左・交代法則 (x2)y = x(xy) において x = a + b, y = a と置くと:
  (a + b)2a = (a + b)((a + b)a)
前記の議論と分配法則から、上の等式は次のように変形可能:
  (a2 + ab + ba + b2)a = (a + b)(a2 + ba)
結合法則を使えないことに注意しつつ、両辺を慎重に展開すると:
  (a2)a + (ab)a + (ba)a + (b2)a = a(a2) + a(ba) + b(a2) + b(ba)  『

『す』の両辺それぞれの第1項 (a2)a と a(a2) は、左・交代法則により等しい(右・交代法則からも同じ結論に)。第3項の (ba)a と b(a2) は、右・交代法則により等しい。最後に第4項の (b2)a と b(ba) は、左・交代法則により等しい。第1・第3・第4項がそれぞれ等しいので、等式『す』が成り立つ以上、必然的にその第2項同士も等しくなければならない:
  (ab)a = a(ba)
これで「両端が等しい場合の(弱い)結合法則」が証明された: a, b をあらためて x, y と置けば『し』である。∎

† flexibility または flexible law と呼ばれる。以下では非公式に「回遊法則」と呼ぶことがある。

28. 前節の証明では、左・交代法則から出発したが、『す』の第2項同士が等しいことを言うために、第3項同士が等しいこと(右・交代法則)を利用した。右・交代法則から出発しても、全てが鏡像になるだけで『す』の段階で今度は左・交代法則が必要になる。すなわち、左右両方の交代法則があるなら回遊法則は自動的に出てくるが、左か右の片方の交代法則だけでは、回遊法則は自動的には保証されない。

〔注〕 この点だけ見ると、回遊法則は「成立条件の厳しい難しい性質」のように思えてしまうが、実際には(少なくとも Cayley–Dickson プロセスに関する限り)事情は逆で、むしろ交代法則の方が「成り立ちにくい特殊な性質」である。

『す』の両辺の第1項 (a2)a ないし a(a2) を a3 と書くことは許されるか? 交代法則が成り立つ世界では (aa)a = a(aa) なので、3 乗の計算は順序に依存せず、従って (a2)a と a(a2) を区別する必要はないので、どちらも a3 と書いて構わないであろう。一方、交代法則が成り立たない場合、aa = X とすると…
  (a2)a = Xa と a(a2) = aX が等しいことの保証には交換法則が必要
…であるから (a2)a と a(a2) が一致する保証はなく、この二つを一緒くたにして a3 と書くことは、許されないであろう。 (aa)a などを a3 と書けないのは奇妙に感じられるが「世の中には、まだまだ未知の領域がいっぱいある」ってことだ!

さいわい Cayley–Dickson 代数では、交代法則が壊れた後でも回遊法則が残るため axa について結合法則が保証され、特に x = a の場合の aaa について掛け算の順序は自由なので、順序の指定は必要なく a3 と書いていいらしい。『す』では、まだこの議論を済ませていなかったので a3 表記を控えた。

では a2 と aa は同じだろうか?

まさに hair-splitting というかパラノイアになりそうだが(笑)、3 乗に未知の領域があるなら 2 乗も疑うのは、健全な探究心。全ての石橋はたたきまくる…。けどまぁ、冷静に考えてみると、いくら交換法則が保証されなくたって x = y なら xy と yx は同一の積だから、順序の区別なんて必要ねぇな。その等しい x = y の値を a とすれば aa = a2 となる。

自乗は安全 a 自乗 aa はいつでも a2 と書いて問題ない。 3 乗以降は、そうとも言い切れないが(未知の不安要素)、八元数・十六元数などでは、その問題は生じないらしい…?

16次元・32次元…は、まだ確かめてないし、4 乗以降については大いに疑問があるが、今は話を八元数に戻す。

表記のルールとして、指数計算(べき)は、掛け算より優先順位が高いので、指数を使って自乗を表現する場合、次の例のように、かっこを省略できる。
  x(yy) = x(y2) = xy2
結合法則が保証されない世界では x(yy) のかっこは省略できないが、その場合でも x(y2) のかっこは省略可。ここまでは念のため、この種の自乗にもかっこを付けておいた。以下すっきりと、それを省くことにする。

今は八元数の掛け算を考えてるけど、八元数は足し算・引き算もできる。それは成分ごとの和・差で、成分は普通の実数なので、八元数の足し算は、実数の足し算と同じ法則を満たす(従って当然、交代法則も満たす)。特に不思議な現象は起きない。

29. (ab)c = a(bc) が一般には成り立たない――ということは、その左辺と右辺が必ずしも一致しないということ。一致しないというなら、どのくらい一致しないのか。左辺と右辺のずれ…
  (ab)c − a(bc)
…をここでは △(a, b, c) で表すことにする。

定義 △(a, b, c) = (ab)c − a(bc)
  名称: 結合(法則の)ゆがみ演算子、略して結合子 associator
  意味: 3要素 a, b, c の積 abc について、結合法則からのずれの度合い。結合法則が成り立つケースでは、このずれは 0 になる。

今 a, b, c を特定の八元数とする。直観的に abc の結合のゆがみと acb の結合のゆがみは――順序が違うだけで同じ 3 要素の結合なので――同じくらいだと予想される: bca, cab など、どう順序を変えても {a, b, c} の結合であるからには、同程度のゆがみが生じるのでは…?

この直観はおおむね正しい。何が起きるのか、実際の数値で試してみよう。この遊びは既に途中まで実装してある: §21octomul5 を読み込んでから、勝手に選んだ八元数と結合子を準備…

a = [1, 4, -1, -4,  2, 1, 3, 5];
b = [3, 1, 4, -1,  5, 9, 2, 6];
c = [1, 7, 3, 2, 0, 5, 0, 8];

associator(a,b,c) = octomul5( octomul5(a,b), c ) - octomul5( a, octomul5(b,c) );

ここで assoicator(a,b,c) を実行すると
  [0, -294, 586, 454, -216, -448, 1146, 204]
が返り、assoicator(a,c,b) を実行すると
  [0, 294, -586, -454, 216, 448, -1146, -204]
が返る。結合子の入力 a,b,c を1カ所置換して a,c,b にすると、結果の符号が反転する――ゆがみの各成分は同じ値、ただし符号が逆になる。適当にもう1カ所、今度は右端の 2 個を入れ替えて a,c,bc,a,b とし associator(c,a,b) を実行すると:
  [0, -294, 586, 454, -216, -448, 1146, 204]
両端を入れ替えるとどうなるか: associator(b,a,c)
  [0, 294, -586, -454, 216, 448, -1146, -204]

1カ所置換するごとに結果の符号が反転するらしい…。なかなか面白い!

数学ではプラスとマイナスが交互(一つおき)に現れることを「交代」と呼ぶことがある。例えば、次のような無限に続く足し算(引き算についてはマイナスの足し算と見なす)は「交代級数」とか「交代和」と呼ばれる:
  +1/21/4 + 1/81/16 + 1/321/64 + …

〔脱線〕 上記の無限和は、どんな値に収束するでしょうか? 第12項まで計算すると 1365/4096 = 0.333251953125。
第13項まで計算すると 2731/8192 = 0.3333740234375。 2進数に慣れてる人なら、級数を左端から2項ずつ見て、2進数の循環小数 b0.010101… になってることが分かるだろう。これは 1/3 を2進小数で表したもの(普通の筆算の割り算と同じ: 1 = b1 を 3 = b11 で割る場合、「b10 では商が b0 だが b100 では商が b1 で余り b1」。このかぎかっこ内が無限ループする――商が b1 か b0 かは b11 を引けるか引けないかで決まる)。偶数番目の項までの和は、この無限小数を途中で打ち切ったものなので 1/3 未満だが、奇数番目の項までの和だと過大な近似値が出る。

八元数が「交代こうたい代数だいすう」と呼ばれるのも、上記のように、符号が入れ替わる性質を指している(この「代数」は「代数学」という分野ではなく、八元数の「世界」を指す)

結合法則が成り立たず、そのゆがみ方(法則の乱れ)を調べると、符号が入れ替わる「交代的」性質がある――だから八元数の世界を「交代的」と表現する。それは、まぁ分からないでもない。「結合法則が成り立つような普通の代数」については、ゆがみがゼロなので ±0 という「自明な交代」と解釈すればいいだろう。

けれど、なぜ前記の x2y = x(xy) などが「交代法則」と呼ばれるのだろうか?

30. 交代法則を associator で表記すると:
  △(x, x, y) = 0 言い換えると x2y − x(xy) = 0
  △(x, y, y) = 0 言い換えると (xy)y − xy2 = 0
すなわち abc の左端の二つまたは右端の二つが等しいときは、結合法則が成り立ち、ゆがみがゼロになるのであった。

〔付記〕 上記のことは、八元数の世界におけるゆがみゼロの十分条件だが、必要条件ではない: a, b, c がどれも等しくない場合でも、例えばその中に実数(虚部が全部ゼロの八元数)が一つ以上含まれるなら、結合法則 (ab)c = a(bc) が成り立つ。

今、交代法則が成り立つ世界を考え、右・交代法則 (xy)y = xy2 で x = a, y = b + c と置くと:
  (a(b + c))(b + c) = a(b + c)2
§27 でやったのと同様に、慎重に展開:
  (ab + ac)(b + c) = a(b2 + bc + cb + c2)
  (ab)b + (ab)c + (ac)b + (ac)c = ab2 + a(bc) + a(cb) + ac2
両辺の第1項同士、第4項同士は、右・交代法則によって等しいので、上記の等式が成り立つからには、第2項・第3項の和が左辺と右辺で等しくなければならない:
  (ab)c + (ac)b = a(bc) + a(cb)
右辺の項を全部左辺に移項して、整理すると:
  (ab)c − a(bc) + (ac)b − a(cb) = 0
  つまり △(a, b, c) + △(a, c, b) = 0
これは △(a, b, c) = −△(a, c, b) を意味する。言い換えると:
  associator(a,b,c) と associator(a,c,b) は符号が反対(各成分の絶対値は同じ)

abc の右端の 2 個を入れ替えて acb としたとき、結合のゆがみ〔注〕の符号だけが入れ替わる――という「右・交代」現象は、このように「右・交代」法則によって証明される。同様に、「左・交代」法則から始めれば、「左・交代」現象が示される。結局、「このタイプの弱い結合法則」が成り立つ世界は交代代数であり、従って「このタイプの弱い結合法則」を交代法則(交代律)と呼ぶことは、一応筋が通っている。交代代数の「交代性」(結合子の値の符号の交代)を生み出す法則なので…

〔注〕 abc の結合のゆがみとは △(a, b, c) = (ab)c − a(bc) のこと。この値と acb の結合のゆがみ (ac)b − a(cb) は、絶対値が同じで、符号が反対。

両端の 2 個の入れ替えによっても交代が起きること――つまり abc と cba の関係――についての手っ取り早い説明は、この関係を次のように三つの置換の合成と捉えることだろう:
  abc (左交代) bac (右交代) bca (左交代) cba
奇数回、交代するので、符号が逆になる。あるいは同じことだが:
  abc (右交代) acb (左交代) cab (右交代) cba

別のアプローチとして、回遊法則に基づく直接証明も可能。

八元数の世界では、左・交代、右・交代、回遊法則の三つが、ほぼ対等の力を持っているようにも感じられる。

実際、一般論としても、上記の三つのうち二つを仮定すると、残りの一つも成り立つ。例えば、左・交代を前提とした『す』の式…
  a2a + (ab)a + (ba)a + b2a = aa2 + a(ba) + ba2 + b(ba)
…において、右・交代を仮定せず、回遊法則を仮定した場合、仮定により左辺と右辺の第1・第2・第4項が等しいので、第3項も等しくなければならない。これは次を意味する:
  左・交代 かつ 回遊 ⇒ 右・交代

ところが、十六元数以降では、左右の交代法則がどちらも失われるにも関わらず、回遊法則は保たれるという。すなわち、回遊法則の成立のためには、左右両方の交代法則の成立は十分であるけれど(八元数のケース)、必要ではない(十六元数以降)。交代法則が崩壊した後も、それと無関係に、回遊法則は「自力で成立」する…それは Cayley–Dickson 代数における根源的・普遍的な性質らしい。どこまで行っても壊れないという意味では「粘り強い」が、論理的には交代法則に含意されるので、交代法則(それは弱い結合法則である)よりさらに弱い。

微妙で幽玄な関係 結合法則 (ab)c = a(bc) が a = b の場合と b = c の場合の両方について必ず成り立つなら(その2種類の性質を交代法則と呼ぶ)、a = c の場合の結合法則(回遊法則)も必ず成り立つ。一方、2種類の交代法則がどちらも保証されていない場合でも、回遊法則が常に成り立つケースがあるらしい…。

十六元数では、これが起きるという。ヤマ勘の空想(適当な思い付き)だが、その世界では左・交代と右・交代が崩壊するものの、崩壊の仕方が左右で釣り合って、その結果、回遊法則は残るのか、あるいは…?

十六元数についての好奇心・憧れは募るけど、その荒野に進む前に、八元数の道場で、もうちょっと修行を――八元数の「480種類の九九」の構造を見通せるようになりたい。

〔参考文献〕  Ian R. Porteous: Topological Geometry (2nd ed.), Prop. 14.1
Guillermo Moreno: The zero divisors of the Cayley–Dickson algebras over the real numbers
https://arxiv.org/abs/q-alg/9710013

〔付記〕 alternative には「オルタナティブな、非主流派の、代替的な」といった「サブカル的」(?)な意味もある。八元数は、確かに「普通と違う」世界だが、alternative algebra は「普通と違う代数」というニュアンスではない。事実、結合法則が成り立つ普通の代数も alternative であり、他方において、ますます普通と違う十六元数は、もはや alternative ではない。「符号が交互に現れる」ということ自体は alternate か alternating と表現されるだろうが、八元数のような世界は、表面的に「符号が交互に現れる」というより「ある観点から見たとき、そういう性質を持つ」。交換法則・結合法則がそれぞれ commutative, associative なので、それらとマッチさせて -ative の形を使い、この性質を alternative としたのかもしれない。

*

31. 八元数の掛け算は、三つの数の組み合わせ(triad とか triple とか呼ばれる)を七つ使って定義される(われわれは triad を和音と呼ぶ――それは八元数の最初の発見者が八元数をオクターブと呼んだことへのオマージュでもある)。前回、七つの和音を入力として八元数の掛け算を実行する関数を PARI/GP で実装したが、その後、約40%の高速化ができた。コードの実物と要点を記す。

数学的な添え字は 0 番から始まるが、PARI の配列はインデックス 1 から始まる。そのため Black, White では呼び出しごとにインクリメントが必要になり、ややこしかった。この問題を避けるため、内部的には原則として PARI のインデックスだけを使うようにした。前バージョンと互換性がないので Bla, Whi と改名してある。入力された和音集の各音を 1 大きくするため、Rainbow2 の中で一度 111 を足し算。 Idlewild2 からのデバッグ出力では、確認のため 1 小さい値を報告させている。虹が初期化された直後のデバッグ出力では 1 大きい内部の数値が見える。

長さ 21 のベクトルをソートする手間を省き、最初から低音ごとに別の場所に入れるようにした。7種の配列の末尾に、新しい要素(中音・高音)を付け加えることで実現される(プログラミング用語の push)。別案として、長さ 3 の領域を確保し、次にどこに書き込めばいいのか管理する方法もある(後述)。ソートしないので、中音・高音の並び方は入力の順序に依存。中音・高音を 2 桁の整数として保持すると、後からまた桁に分解する手間が生じるので、桁に分解された状態で保持するようにした。

vec = concat(vec,[p,q]) のような push だと、配列末尾に 2 要素が追加される(concat はベクトルとベクトルを連結する)。 vec = concat(vec,[[p,q]]) のようにする必要がある(2次元ベクトルを成分とする1次元ベクトルを末尾に連結)。 Vecsmall を push するときは concat の第2引数は Vecsmall([p,q]) でも [Vecsmall([p,q])] でも同じになる。通常のベクトルでも行列でもない型を push すると1次元ベクトルの連結と見なされるため。この push のやり方は少々トリッキーで、必ずしも理想的とは言えないであろう。

Bla(n) = X[1]*Y[n] + X[n]*Y[1];
Whi(m,n) = X[m]*Y[n] - X[n]*Y[m];

Idlewild2( n, ab, cd, ef ) = {
my(f(v)=[v[1]-1,v[2]-1]); print("Idlewild2: ", [n-1,f(ab),f(cd),f(ef)]); \\#

 Bla(n) + Whi(ab[1],ab[2]) + Whi(cd[1],cd[2]) + Whi(ef[1],ef[2]);
}

FairyGlass2( A,B,C,D,E,F,G ) = {
 my( R = Rainbow2( Vecsmall([A,B,C,D,E,F,G]) ), Z = vector( 8 ) );
for(u=2,8,print("R",u,"=",R[u])); \\#

 Z[1] = X[1]*Y[1] - sum( u=2, 8, X[u]*Y[u] );
 for( n = 2, 8, Z[n] = Idlewild2( n, R[n][1], R[n][2], R[n][3] ) );
 Z;
}

Rainbow2( triads ) = {
 my( ret = vector( 8, dummy, [] ) );
 for( u = 1, 7,
  my( pqr = Vecsmall( digits( triads[u] + 111 ) ),
      p = pqr[1], q = pqr[2], r = pqr[3] );
  ret[p] = concat( ret[p], Vecsmall([q,r]) ); \\ (p)qr
  ret[q] = concat( ret[q], Vecsmall([r,p]) ); \\ (q)rp
  ret[r] = concat( ret[r], Vecsmall([p,q]) ); \\ (r)pq
 );
 ret; \\ Array of 3-element arrays of two 1-based indices
}

ソートがなくなったので Vecsmall の効用は減ったが、使えるところはこの型にした。

dummy は参照されないカウンター変数。長さ 8 の配列の各要素の初期値として、長さ 0 の配列を代入。配列の要素 1 は使わず 2, 3, … に Z[2], Z[3], … の計算に使うデータを格納することになる。和音の桁をばらすのを前回は算術演算で行ったが、PARI にはこの処理に使える専用の関数があるので、それを活用。速度的メリットはほとんどなく、むしろ遅いかもしれないが、可読性が向上。虹の戻り値は 8 × 3 × 2 の配列の配列の配列。

美学的には 8 × 3 の行列の各要素に、長さ 2 の Vecsmall を格納したい。けれど行ごとに違うタイミングで push は無理。そのアプローチの場合、次の例のようにインデックス管理が必要となる。

FairyGlass2a( A,B,C,D,E,F,G ) = {
 my( R = Rainbow2a( Vecsmall([A,B,C,D,E,F,G]) ), Z = vector( 8 ) );
printp(matsize(R),"R=",R); \\#

 Z[1] = X[1]*Y[1] - sum( u=2, 8, X[u]*Y[u] );
 for( n = 2, 8, Z[n] = Idlewild2( n, R[n,1], R[n,2], R[n,3] ) );
 Z;
}

Rainbow2a( triads ) = {
 my( ret = matrix(8,3), ind = vectorsmall(8) );
 for( u = 1, 7,
  my( pqr = Vecsmall( digits( triads[u] + 111 ) ),
      p = pqr[1], q = pqr[2], r = pqr[3] );

  \\ a++ means `++a` in C
  ret[p,ind[p]++] = Vecsmall([q,r]); \\ (p)qr
  ret[q,ind[q]++] = Vecsmall([r,p]); \\ (q)rp
  ret[r,ind[r]++] = Vecsmall([p,q]); \\ (r)pq
 );
 ret; \\ 8x3 Mat of two 1-based indices
}

入力が正常である限り、戻り値の「各行」は長さ 3 に固定されているのだから、感覚的にはこのアプローチの方が良い。注意点として、インデックスの配列を vector で確保すると、速度的ペナルティーがある; vectorsmall にしないと遅くなってしまう。PARI/GP では後置インクリメントしかなく、意味は通常の前置インクリメント。かなりの C プログラマーが、ここでうめくであろう…。

Idlewild2 は前記のものを共用できるが、R が再び行列になったので、呼び出し側での添え字の書き方が変わる。FairyGlass2FairyGlass2a に、明らかな速度差はない。

⁂

2023-12-10 (ab)c = a(bc) は証明可能か? 交代代数から見た世界

#数論 #FairyGlass #八元数 #抽象代数

底面が a × b の長方形で高さが c の直方体の体積は (ab)c だが、同じ直方体の b × c の側面を「底面」と再解釈し、「高さ」が a だと思えば、その直方体の体積は (bc)a となる。

交換法則 (bc)a = a(bc) を認めれば、このことから (ab)c = a(bc) と結論できそうだが…

この幾何学的説明を抽象代数的な「証明」と呼ぶのは、無理がある。事実、八元数の世界では (ab)c = a(bc) が保証されない。成り立つとは限らない事柄についての「証明」はナンセンス。正しい質問は「何を仮定すると (ab)c = a(bc) が成り立つか」。このメモでは、一つの十分条件を記す。

*

32. せっかく「交代代数」の概念・用語を導入したのだから、少しはそれを使ってみたい。当面の目的地「八元数の480種類の掛け算表」とは、あまり関係ないけど…

定理(交換法則は結合法則を含意) 交代代数の世界において、もし交換法則が成り立つなら、結合法則も成り立つ。結合法則が保証されないなら、交換法則は絶対に保証されない。

意外と強い主張に感じられるが、意外と簡単に証明される! 特に、八元数の世界で結合法則が成り立たないことは、数値例からも明らかなので、八元数が交代代数であることを認めるなら「八元数の世界では交換法則が保証されない」と結論される。もちろん証明するまでもなく、四元数の段階で既に ij = k なのに ji = −k なのだから、事実として「交換法則が壊れている」ことは明白。その事実を交代性から論理的に導けるところが、ほんのり面白い。

証明の前に「交代代数の世界」について(用語の問題)。数学の分野としての不可算名詞の algebra と、代数構造である一つ一つの an algebra を両方「代数」と呼ぶのは、日本語としては紛らわしい――という見解が存在するらしい。そういう背景もあってか、日本語では an algebra を「多元環」と意訳することがある。四元数・八元数などはいかにも多元なので、「多元」という部分はナイスなネーミングかもしれない。問題は「環」という表現。「環」といえば、定義の詳細はいろいろあるとしても「乗法が結合的」というのが一応、普通の考え方だろう。ところが、掛け算が結合法則を満たさない八元数は、その意味では「環」ではなく、「環」ではないものを「多元環」と呼ぶと、潜在的には混乱の原因になる。同様に an algebra を a ring の一種と定義した場合も、同様の不都合が生じる。内容とあまり関係ない用語の問題で時間を取られるのは不毛なので、うるさいことを言わず、この文脈での「algebra」=「代数」=「多元環」については「積が結合的でなくてもいい」としよう。

† 可換性を仮定するか否かにより環を「可換環と非可換環」に分類――という用語法も「結合性は仮定されている」という前提に立つものだろう。

では、その緩い意味での「代数」とは何か。大ざっぱに言えば、ベクトルの世界(八元数なら8次元の)。そのベクトルの成分は何か。八元数の場合、もちろん各成分は「実数」(抽象的な一般論としては他のものでもいいだろうが、ここでは実数のベクトルに話を限る)。ベクトルとベクトルの和の定義は明白だが、ベクトルとベクトルの積も、どうにかして定義されている必要がある(例=八元数の掛け算)。この積について、少し融通を利かせて「結合法則が成り立たなくてもいい」とするのである。それ以外の性質(単位元の存在など)については、普通と同じ。結合法則を別にすれば、四元数と同様の計算規則に従い、交換法則にも目をつぶれば、実数や複素数と同様の計算規則に従う。

ベクトルの世界であるからには、スカラー倍(この場合は実数倍)の概念が必要だろう。これについても、うるさいことを言わず、虚部(つまり第2成分以降)が全部ゼロのベクトルを実数と同一視することにする。
  〔例〕 八元数 (3,0,0,0, 0,0,0,0) つまり 3 + 0e1 + 0e2 + … + 0e7
  実数 3 を同一視。複素数 (3,0) つまり 3 + 0i を実数 3 と同一視するのと同様。

33. さて、上掲の定理を証明するため、交換法則のゆがみの度合いの尺度を次のように定義する。

交換子(commutator) ●(a, b) = ab − ba

交代代数の任意の3元 x, y, z について、交換子の定義から、次の三つの式が成り立つ:
  ●(xy, z) = (xy)z − z(xy)  ‥‥①
  −x●(y, z) = −x(yz − zy) = −x(yz) + x(zy)  ‥‥②
  −●(x, z)y = −(xz − zx)y = −(xz)y + (zx)y  ‥‥③

①②③の左辺同士の和・右辺同士の和は等しく、こう整理される:
  ●(xy, z) − x●(y, z) − ●(x, z)y = (xy)z − x(yz) + (zx)y − z(xy) + x(zy) − (xz)y
   = △(x, y, z) + △(z, x, y) − △(x, z, y)  『

交代代数という仮定から、『せ』の第2項は △(z, x, y) = −△(x, z, y) = +△(x, y, z) であり、『せ』の第3項は −△(x, z, y) = +△(x, y, z) である。従って:
  ●(xy, z) − x●(y, z) − ●(x, z)y = 3△(x, y, z)  『

もし交換法則のゆがみが恒等的にゼロであれば、『そ』の左辺は恒等的にゼロであり、従って右辺も恒等的にゼロであり、それは「任意の x, y, z について、結合法則のゆがみがゼロであること」を意味する。すなわち、交換法則が成り立つなら、結合法則も成り立つ。その対偶: 結合法則が保証されないなら、交換法則は保証されない。以上が証明したい定理であった。∎

〔参考文献〕  Ian R. Porteous: Topological Geometry (2nd ed.), Exercise 14.16

交代代数の世界の掛け算では 交換法則 ⇒ 結合法則

逆は必ずしも真ではない。例えば、四元数においては、結合法則は成り立つが、交換法則は保証されない。『そ』によれば、結合子の値が、交換子によって記述される。 octomul5 を使った数値例:

Pr = octomul5; \\ Product
Ar(a,b,c) = Pr(Pr(a,b), c) - Pr(a, Pr(b,c)); \\ Associator
Cr(a,b) = Pr(a,b) - Pr(b,a); \\ Commutator

x = [1, 4, -1, -4, 2, 1, 3, 5];
y = [3, 1, 4, -1, 5, 9, 2, 6];
z = [1, 7, 3, 2, 0, 5, 0, 8];

L = Cr(Pr(x,y), z) - Pr(x, Cr(y,z)) - Pr(Cr(x,z), y)
R = 3*Ar(x,y,z)

L, R は『そ』の左辺・右辺の例で、どちらも次の値:
[0, -882, 1758, 1362, -648, -1344, 3438, 612]

34. 両端の数を入れ替えたとき、結合子の符号が逆転することについて。 §30 では △(a, b, c) = −△(c, b, a) という性質を、3回の置換の合成として、間接証明した。

回遊法則(両端が等しい場合の弱い結合法則)…
  (xy)x = x(yx)
…からも、直接同じ結論を導ける。上の式で x = a + c, y = b と置くと:
  ((a + c)b)(a + c) = (a + c)(b(a + c))
  つまり (ab + cb)(a + c) = (a + c)(ba + bc)
左辺・右辺をそれぞれ展開:
  (ab)a + (cb)a + (ab)c + (cb)c = a(ba) + a(bc) + c(ba) + c(bc)
この式の左辺と右辺の第1項同士・第4項同士は、回遊法則によって等しいから、第2項と第3項の和は、両辺で一致:
  (cb)a + (ab)c = a(bc) + c(ba) 移項して整理すると
  (ab)c − a(bc) + (cb)a − c(ba) = 0 つまり △(a, b, c) + △(c, b, a) = 0

このことから △(a, b, c) = −△(c, b, a) となる。∎

この証明法は前回のそれと違い、交代法則に依存しない。従って、十六元数以降においては特に有用だろう。

*

交代代数の観点からすると「結合法則を証明」できる! 正確に言えば、結合法則の成立について、一つの十分条件が得られる。鍵となる『そ』が天下り的なのが遺憾だが、「交代代数の概念は、身近な事柄においても、それなりに役立つ」という感触が得られた。

⁂

2023-12-12 妖精の鏡(その5) 30系列の掛け算表

#数論 #FairyGlass #八元数

八元数の「九九」つまり掛け算表には、ちょうど 30 の系列がある。これは「座標軸の符号の設定だけの違い」について、区別しない場合のカウント。符号の設定も考慮するなら、30 系列の一つ一つに16種のバリエーションがあり、この 30 × 16 が八元数の「480種の九九」。どの掛け算表でも本質的構造は同じなのだから、いちいち具体的に考えるまでもないのだが、考えてみるのも面白いかと…

「変数名の入れ替え」という単純な発想からすれば、実際に 30 系列を構成できるのは間違いないだろう。このメモでは FairyGlass を使ったある種の全数検索によって、これを検証する。

*

35. §16 の考え方によると、八元数の掛け算表を規定する七つの和音のうちの、第一の和音つまり主和音 12p には五つの可能性があり、これによって 30 系列は五つの「属」に整理される。
  p = 3 主和音 123 Graves 属
  p = 4 主和音 124 Baez 属
  p = 5 主和音 125 SuperBaez 属
  p = 6 主和音 126 Dixon 属
  p = 7 主和音 127 SuperDixon 属

属名は便宜上の愛称だが、Graves 属は Graves & Cayley による古典和音集(GrC)そのもの(あるいはそれと同系列の和音集)を含む。 Baez 属は、ポピュラーな Baez の掛け算表を内包。 Dixon 属は、理論物理学者 Geoffrey M. Dixon の Division Algebras: Octonions, Quaternions, Complex Numbers and the Algebraic Design of Physics (1994) で使われている掛け算表を内包する。その概要については
  Octonion X-product orbits https://arxiv.org/abs/hep-th/9410202
にも記されている。 Baez 属、Dixon 属の主和音のソプラノを 1 音高く調律したものをそれぞれ SuperBaez, SuperDixon と呼ぶことにする。

これら五つの属の一つ一つについて、第二和音 1ℓq のソプラノには三つの選択肢(亜属)がある。ここで Graves 属の和音集では ℓ = 4 で、それ以外の和音集では ℓ = 3。ソプラノ q を最も低く設定した場合をイ調、最も高く設定した場合をハ調、その中間の場合をロ(ろ)調と呼ぼう。 q を選ぶと、第三和音の構成音 {1, m, n} は一意的に定まる。イ・ロ・ハの各調の第四和音 2ℓr のソプラノ r は = m or n だが m, n の一方は他方より大きいので r には二つの選択肢がある: m, n のうち小さい方を r とした場合を短調、そうでない場合を長調と呼ぶなら、各属には次の 6 系列の和音集がある:
  イ短調・イ長調 ロ短調・ロ長調 ハ短調・ハ長調
第四和音の選択 2ℓr に応じて、第五和音以下の構成音は、和声学の規則から自動的に定まる。 {m, n} のうち r として選ばれなかった方を s とすると:
  第五和音 {2, q, s}
  第六和音 {p, ℓ, s}
  第七和音 {p, q, r}

五つの属の一つ一つに六つの調性があるので、計 30 系列が生じる。系列ごとに 16 のバリエーションがあるので、各系列の代表を一つ選ぶには何らかの基準が必要。便宜上「第一・第二・第四・第五の四つの和音は、ねじれていない(=ソプラノがアルトより高い)」と仮定する。残った三つの和音(第三・第六・第七)は「ねじれ可」で、それぞれ「非ねじれ・ねじれ」の二つの選択肢があるので、潜在的に 23 = 8 種類の選択肢が生じる。実際には(全数検索によると)、8種の可能性のうち1種だけが、有効な和音集を与える。

「最初の四つの和音はねじれていない」と仮定して、後ろの三つの和音を「ねじれ可」にした方が素直だけど、それだと Graves 属の最初の系列が、古典和音集…
  123, 145, 176, 246, 257, 347, 365
…ではなく、次のようになる:
  123, 145, 167, 246, 275, 374, 365
これは古典和音集と同系列の Degen 第二和音集(DeB)であり、前者から見ると、後者では 7 を含む三つの和音がスワップされている。「Graves 属の最初の系列を Graves の古典和音集(GrC)によって代表させる」という趣旨から(言い換えると古典和音集では第三和音 176 がねじれているので)、ここでは第三和音を「ねじれ可」とし、代わりに第五和音を「非ねじれ固定」とする。

〔参考〕 スクリプトの実装では、配列の第3・第4・第5の位置に、それぞれ第四・第五・第三和音があり「第1~第4の位置の和音が非ねじれ固定(Four Natural Triads)、第5~第7の位置の和音がねじれ可」。

七つの和音のねじれ・非ねじれについて、トータルで 27 = 128 パターンの設定が潜在的に可能だが、実際に有効な符号設定は16種。従って 16/128 = 1/8 の割合で、有効な和音集が見つかるだろう。

36. 実際の検索結果の出力を抜粋。最初の系列(#1)は次の通り:

Triads species #1 (p=3, q=5, r=6): "Graves A-minor"
 Four Natural Triads: 123, 145, 246, 257
  Try:   167, 347, 356
  Found: 176, 347, 365 :: mask=[1, 0, 1]

前記 p, q, r が、可能な範囲で最小の設定となっている。愛称は Graves 属・イ短調だが、古典和音集 GrC に他ならない。「自然」な和音 123, 145, 246, 257 の四つは「非ねじれ」に固定されている。それ以外の三つは、自然な配置では 167, 347, 356 だが、有効な八元数の和音集となるためには、そのうち一つ目と三つ目がねじれる必要がある。 mask=[1, 0, 1] は「ねじれ可」の三つの和音のうち、ねじれ・非ねじれが実際にはどうなるか、フラグ 1 or 0 で表している。 Try は、自然な(ねじれていない)配置での「ねじれ可」和音の状態であり、一般に、そのままで有効な和音集とならない。ねじれ・非ねじれの組み合わせのうち、有効な和音集を成すものが見つかると Found として、その配置が報告される。

同じ属の残りの五つの和音集は次の通り。いずれも主和音 123 を持ち、e1e2 = e3 だが、積 e1e4 などの設定は系列によって異なる。

Triads species #2 (p=3, q=5, r=7): "Graves A-major"
 Four Natural Triads: 123, 145, 247, 256
  Try:   167, 346, 357
  Found: 167, 346, 375 :: mask=[0, 0, 1]

Triads species #3 (p=3, q=6, r=5): "Graves B-minor"
 Four Natural Triads: 123, 146, 245, 267
  Try:   157, 347, 356
  Found: 175, 347, 356 :: mask=[1, 0, 0]

Triads species #4 (p=3, q=6, r=7): "Graves B-major"
 Four Natural Triads: 123, 146, 247, 256
  Try:   157, 345, 367
  Found: 175, 354, 376 :: mask=[1, 1, 1]

Triads species #5 (p=3, q=7, r=5): "Graves C-minor"
 Four Natural Triads: 123, 147, 245, 267
  Try:   156, 346, 357
  Found: 156, 364, 357 :: mask=[0, 1, 0]

Triads species #6 (p=3, q=7, r=6): "Graves C-major"
 Four Natural Triads: 123, 147, 246, 257
  Try:   156, 345, 367
  Found: 165, 354, 367 :: mask=[1, 1, 0]

検索結果に「ねじれ」がある和音集の場合、符号設定の調整によって「ねじれ」の数が変わる可能性はあるが、ねじれゼロにすることはできない。例えば、#6 の 165 を強制的に非ねじれ配置 156 にするには、構成音 1 or 5 or 6 の符号を反転させる必要があるが、それをすると同じ音を含む全部の和音がスワップされる――つまり 165 のねじれを解消しようとすると、副作用で「非ねじれ固定」のはずの Four Natural Triads の一つ以上がねじれてしまう。

37. 主和音を 124 とする Baez 属には、次の特別な和音集が含まれる。

Triads species #11 (p=4, q=7, r=5): "Baez C-minor"
 Four Natural Triads: 124, 137, 235, 267
  Try:   156, 346, 457
  Found: 156, 346, 457 :: mask=[0, 0, 0]

この和音集は、ねじれがない。しかも、主和音から始めて各音を 1 ずつ上昇させていくことで(8 以上になったら 7 を引く)、全和音を構成できる:
  124 → 235 → 346 → 457 → 568 = 561 = 156 → 267 → 378 = 371 = 137

この掛け算表を採用すれば、八元数の九九を簡単に覚えられる: e1e2 = e4, e2e3 = e5 等々。覚えやすいのはいいが、古典の掛け算表とは(従って標準的な Cayley–Dickson プロセスとは)互換性がない。

この和音集の面白い特徴として、ある和音の各音を 2 倍したものも再び同じ和音集に含まれる(8 以上になったら 7 を引く)。例えば:
  124 → 248 = 241 = 124
  235 → 46(10) = 463 = 346
  346 → 68(12) = 615 = 156 等々

この美しい和音集は、Baez が選んだ掛け算表として知られる。

もう 1 系列、知名度は低いが、これと同様の和音集が存在し、主和音を 126 とする Dixon 属に含まれる:

Triads species #20 (p=6, q=4, r=7): "Dixon A-major"
 Four Natural Triads: 126, 134, 237, 245
  Try:   157, 356, 467
  Found: 157, 356, 467 :: mask=[0, 0, 0]

すなわち:
  126 → 237 → 348 = 341 = 134 → 245 → 356 → 467 → 578 = 571 = 157

*

和音集の形では「具体的な掛け算」がどういう姿になるのか、実感が湧きにくいかもしれない。総当たり検索で試行錯誤的に発見した和音集なので、例えば「古典和音集から見て、どういう変数変換でそうなるのか?」という理論的な見通しも悪い。それらの問題点(次回以降に検討したい)はともかく、ねじれのない二つの和音集の存在は興味深い。PARI/GP のスクリプトと出力の全体は次の通り。

20231213-script.txt

20231213-output.txt

FairyGlass3FairyGlass2a と実質同じだが、3 桁の和音七つの代わりに3次元ベクトル七つの配列を受け取る。全数検索では mask の最下位ビットを 0 として、ビット 0, 1, 2 が立っていれば、それぞれ第七・第六・第三和音がスワップされる(内部的には、配列の後ろから1・2・3番目の位置の和音)。

⁂

2023-12-14 四元数から八元数へ 微妙なギャップ

#数論 #FairyGlass #八元数 #四元数

8次元の世界に入門したときは、文字通り右も左も分からなかったが、遊び半分の探索の結果、少しは感覚がつかめてきた。八元数で遊び始めたのは、「四平方のごちゃごちゃを解きほぐす」からの脱線だった。

「四平方のごちゃごちゃ」は、実質的には既に自然解決してるけど、八元数の立場から振り返ると、ずいぶん危ない橋を渡ってたことに気付く。四元数のノルムの定理の証明では、のんきにこんな議論をした…

四元数の積は結合法則を満たすので:
  (PQ)(Q*P*) = P(QQ*)P* = P × norm(Q) × P*

八元数では (ab)c = a(bc) の保証がない。上記の式変形をそのまま八元数に適用しようとすれば、ギャップが生じる…。事実としては、四元数・八元数は、同様のノルムの性質を満たす(一方、十六元数だと駄目)。けれど八元数では、結合法則が保証されない。ということは――四元数については結合法則を使って上記のようにあっさり片付けたけど――、実は「結合法則を使わなくても、交代法則だけで同じ結論を導けるのではないか」。といっても、今のところ、どうすればそれができるのか、完全には見通せていない。

今回は先を急がず、既に分かっていることを整理して、このギャップを研究するための準備を進める。

*

38. 四元数を使えば「四平方の恒等式」をエレガントに証明できる。とはいえ、その要となる命題8
  (PQ)* = Q*P*
…については、場当たり的な直接計算で済ませてしまった。八元数の場合、掛け算の設定が480パターンもある。「どのパターンの掛け算表を選んでも、上の性質が成り立つこと」を一つ一つ直接計算で示すのは、実用的でない。

実数を成分とする同じ次元の二つのベクトル V, v があるとして、V のとある成分 S(大文字)に対応する v の成分を s(小文字)とし、V のとある成分 T に対応する v の成分を t としよう。
  V = (…, S, …, T, …)
  v = (…, s, …, t, …)

〔例1〕 V = (1, 2, 3, 4), v = (5, 6, 7, 8) について、もし S = 2, T = 3 なら s = 6, t = 7。

説明の便宜上 StTs の形の差、つまり「2成分の互い違いの引き算」をたすき引き算と呼ぶことにする。

〔例2〕 例1の場合 StTs = 2⋅7 − 3⋅6 = 14 − 18 = −4。

たすき引き算では、元となるベクトルの値が入れ替わると、結果の符号が逆になる。たすき引き算のもともとの結果 StTs から見ると、入れ替え後の結果 TsSt = −(StTs) は −1 倍だから。

〔例3〕 例1の二つのベクトルの名前を入れ替えて V = (5, 6, 7, 8), v = (1, 2, 3, 4) とする。例1に対応する値(第2成分と第3成分)は S = 6, T = 7, s = 2, t = 3 なので、たすき引き算をすると:
  StTs = 6⋅3 − 7⋅2 = 18 − 14 = +4

「元となる値が交換されると、たすき引き算の結果は符号があべこべ!」というこの事実こそ、四元数や八元数で積の交換法則が崩壊することの、大原因。なぜなら、それらの積の計算は、たすき引き算をたくさん含んでいる。四元数の例で言えば、標準的な積の定義は次の通り。
  V = (A, B, C, D) = A + Bi + Cj + Dk と
  v = (a, b, c, d) = a + bi + cj + dk の積は:
  Vv = (Aa − Bb − Cc − Dd, Ab + Ba + Cd − Dc, Ac + Ca + Db − Bd, Ad + Da + Bc − Cb)

〔注〕 スペース節約のため、適宜、四元数を「四つの成分のベクトル」として表記。その各成分は実数で、それぞれ四元数の「実部」「i の係数」「j の係数」「k の係数」に当たる。

Vv の積の順序を入れ替えて vV とすることは、上記において大文字と小文字が互いに入れ替わることに当たる。積の第1成分(つまり実部)は、この入れ替えによって何の被害も受けない。
  aA − bB − cC − dD は入れ替え前の Aa − Bb − Cc − Dd と等しい
  (なぜなら A, B, C, D, a, b, c, d は実数なので交換法則を満たす: aA = Aa 等々)

Vv ないし vV の第2成分以降(つまり虚部)は、ほんの少し複雑。上の順序で項を書いた場合、各成分の最初の2項はたすき足し算になっていて、交換による影響を受けない。
  第2成分のうち aB + bA は入れ替え前の Ab + Ba と等しい
  第3成分のうち aC + cA は入れ替え前の Ac + Ca と等しい
  第4成分のうち aD + dA は入れ替え前の Ad + Da と等しい
いずれも同じ計算を「左端から右端に向かって読むか」「右端から左端に向かって読むか」の違いに過ぎず、実数の和・差は交換法則に従うため、どちらの順序でも結果に変わりはない。他方、第2~第4成分の残りの部分は、たすき引き算なので、順序を入れ替えれば、一般には値が変わる(その部分の符号が逆になる)。その特別な場合として、もし A = a = 0 ならば――つまり Vv がどちらも実部ゼロの純虚数の四元数ならば――、上記の足し算の部分は 0 に等しいので消滅し、たすき引き算だけが残るから、次のようになる。

純虚数の四元数の積 P と Q が純虚数の四元数の場合、PQ と QP の関係は次の通り。実部は等しい。虚部は、絶対値が同じで符号が反対(従ってこの場合、虚部が 0 でない限り PQ ≠ QP である)。言い換えると、この条件においては PQ と QP は共役四元数。

〔例4〕 P = (0, 2, 3, 4) と Q = (0, 1, 7, 6) は、純虚数。次の二つの値は、虚部の符号が正反対:
  PQ = (−47, −10, −8, +11)
  QP = (−47, +10, +8, −11)
PQ の第2成分 = 3⋅6 − 4⋅7 = 18 − 28 = −10,
PQ の第3成分 = 4⋅1 − 2⋅6 = 4 − 12 = −8,
PQ の第4成分 = 2⋅7 − 3⋅1 = 14 − 3 = +11,
PQ の第1成分 = 0⋅0 − 2⋅1 − 3⋅7 − 4⋅6 = −2 − 21 − 24 = −47

P, Q が一般の(必ずしも純虚数ではない)四元数の場合、以上の観察によれば、次のようになる。 PQ と QP の実部は等しい(Aa − Bb − Cc − Dd である)。 PQ と QP の虚部は、たすき足し算による定数(Ab + Ba, Ac + Ca, Ad + Da)の部分を除外して考えるなら、純虚数の場合と同様に「絶対値が同じで符号が反対」。言い換えれば、共役四元数のペアとなる。

〔例5〕 四元数 P = (5, 2, 3, 4) と Q = (8, 1, 7, 6) の積:
  PQ = (−7, 11, 51, 73)
  QP = (−7, 31, 67, 51)
たすき足し算による定数 R = (0, 5⋅1 + 2⋅8, 5⋅7 + 3⋅8, 5⋅6 + 4⋅8) = (0, 21, 59, 62) を除去すると:
  PQ − R = (−7, −10, −8, +11)
  QP − R = (−7, +10, +8, −11)
例4とほとんど同じ、共役のペアが得られる。実部 −7 が例4のそれより 40 大きいのは Aa が 0⋅0 から 5⋅8 に増えたため。

39. 今までは PQ と QP の違いを考えてきたが、QP の代わりに Q*P* を考えたらどうなるか?

ここで Q*, P* はそれぞれ Q, P の共役四元数で、定義により、前者と後者では実部が等しく、虚部の符号が反対:
  Q = (a, b, c, d) ⇒ Q* = (a, −b, −c, −d)
  P = (A, B, C, D) ⇒ P* = (A, −B, −C, −D)
つまり Q, P をそれぞれ共役に置き換えると a, A は変化せず b, B, c, C, d, D は −1 倍されて、符号だけが入れ替わる。

その結果 Q*P* の実部は QP の実部(= PQ の実部)と同じ:
  aA − bB − cC − dD が aA − (−b)(−B) − (−c)(−C) − (−d)(−D) に変わるが
  どちらの値も等しい: なぜなら (−b)(−B) = bB, (−c)(−C) = cC 等々

Q*P* の虚部のうち、たすき引き算の部分(それは a, A を含まない)も、上と同様に、値が保たれる:
  cD − Dc が (−c)(−D) − (−D)(−c) に変わるが値は同じ
  dB − Bd が (−d)(−B) − (−B)(−d) に変わるが値は同じ 等々

一方 Q*P* の虚部のうち、たすき足し算の部分(それは a, A を含む)は、絶対値が同じで符号が反対になる:
  aB + bA が a(−B) + (−b)A = −aB − bA に変わる(符号が正反対)
  aC + cA が a(−C) + (−c)A = −aC − cA に変わる(符号が正反対) 等々

PQ と QP について虚部を比較すると、たすき足し算の定数部分を除外すれば、符号が正反対なのだった。ところが、今度は QP の代わりに Q*P* を考えると、たすき足し算の部分も符号が正反対になる。まとめると PQ と Q*P* の関係は、実部が等しく、虚部の符号だけが逆。言い換えれば:

四元数の積の共役 四元数の積 PQ から見ると Q*P* は共役四元数。つまり Q*P* = (PQ)* である。

この結論は、既に命題8として直接計算で得ているが、上記のように整理し直すと、そうなる理由が透き通る――虚部の振る舞いは「たすき足し算・たすき引き算」の性質に基づき、具体的な積の定義の詳細とは無関係: 仮に四元数の積の別定義を採用しても、あるいは四元数の代わりに八元数の積を考えても、同じ原理から(積の定義の詳細を具体的に検討するまでもなく)同じ結論が得られる。

40. 教科書には載っていない「裏・四元数」。教科書の ijk = −1 の代わりに ijk = +1 としても――具体的な積の値は異なるものの――抽象代数的には、同じ構造が得られる。リンク先「デラックス版」を見ると、実部とたすき足し算は同じで、たすき引き算に次の違いがある:
  表 Cd − Dc  裏 Dc − Cd
  表 Db − Bd  裏 Bd − Db
  表 Bc − Cb  裏 Cb − Bc
だがどれも StTs の形。S, T, s, t の符号を反転させても、裏なら裏を一貫して使う限り「たすき引き算」の結果は変わらない――例えば:
  表 Cd − Dc = (−C)(−d) − (−D)(−c)
  裏 Dc − Cd = (−D)(−c) − (−C)(−d)
QP においてそれぞれある値なら Q*P* においても全く同じ値になり、PQ から見ると、どちらも「絶対値が同じで符号だけが反対」。

さて、八元数 X = (x0, x1, …, x7), Y = (y0, y1, …, y7) の積の虚部の一つ一つの成分は、例えば次のような形を持つのであった:
  (x0y1 + x1y0) + (x2y3 − x3y2) + (x4y5 − x5y4) + (x7y6 − x6y7)
  = 【01】 + 〖23〗 + 〖45〗 + 〖76〗

〔補足〕 前節と同様に大文字・小文字を使えば、上の例はこうなる:
  (Ab + Ba) + (Cd − Dc) + (Ef − Fe) + (Hg − Gh)  注: この例では最後のかっこ内は Gh − Hg ではない

ここで黒かっこ 【0n】= x0yn + xny0 は、たすき足し算。白かっこ 〖mn〗= xmyn + xnym は、たすき引き算(m, n ≠ 0)。八元数の場合も、ある数 X の共役八元数は、実部が等しく、虚部の符号が反対。

八元数の共役 X = (x0, x1, x2, …, x7) = x0 + x1e1 + x2e2 + … + x7e7 なら:
  X* = (x0, −x1, −x2, …, −x7) = x0 − x1e1 − x2e2 − … − x7e7

だから前節と同様、XY と Y*X* の関係は、虚部の絶対値が同じで符号が逆になる。480パターンある掛け算規則のどれを採用しても、虚部・各成分が…
  【0n】 + 〖ab〗 + 〖cd〗 + 〖ef〗
  ここで n は 1 以上 7 以下の数(第1虚部では n = 1, 第2虚部では n = 2, 等々)
  a, b, c, d, e, f は 1 以上 7 以下の相異なる数でどれも n とは等しくない
…の形を持つことから(添え字 a, b, c, d, e, f の具体的な値は、和音集の選択によって決まる)、結論に変わりはない。他方、PQ の実部
  x0y0 + x1y1 + x2y2 + … + x7y7
に関しては、XY の積の順序を入れ替えて YX にしても
  y0x0 + y1x1 + y2x2 + … + y7x7
になるだけで、値は同じ。共役を使って Y*X* にしても X, Y の実部 x0, y0 に変化はなく、X, Y の虚部はどれも符号が反対になるので、Y*X* の実部は次の通り。 YX ないし XY の実部(上記)と等しい:
  y0x0 + (−y1)(−x1) + (−y2)(−x2) + … + (−y7)(−x7)

以上のことから、480種の掛け算の定義の仕方を一つ一つ調べるまでもなく、次のシンプルな結論に至る。

八元数の積の共役 八元数の積 XY から見ると Y*X* は共役八元数。つまり Y*X* = (XY)* である。

十六元数の積 XY についても、もし実部が x0y0 + x1y1 + x2y2 + … + x15y15 になり、虚部の各成分が、八元数の場合と同様に…
  【0n】 + 〖ab〗 + 〖cd〗 + …
  つまり入力の実部 x0, y0 を含む「たすき足し算」と、実部を含まない「たすき引き算」の組み合わせ
…の形になるなら、恐らく同様の結論になるだろう。三十二元数以降につても、同様の予想が成り立ちそうだ。

結局、Gayley–Dickson プロセスにおける複素数・四元数・八元数・十六元数…については、それぞれの世界で二つの要素 X, Y を選ぶとき、積 XY の共役は X, Y 個別の共役を逆順で掛け合わせたものに等しいと予想される:
  (XY)* = Y*X*
複素数については、掛け算の交換法則が成り立つので、積を逆順にしても(Y*X*)、しなくても(X*Y*)、値に変わりはないが、四元数以降では交換法則が保証されないので、積の順序を上記のように指定する必要がある。この予想については、四元数については既に確認済み。十六元数以降については、まだ積の公式すら確認していなので今は断定を避けるが、八元数については、八元数の積の公式の形から、確かにこの結論になるだろう。

勘違いということもあるので、念には念を入れて、数値例を調べておく。いつものように、八元数の積の実装 octomul5 を使い、適当に選んだ八元数を用意して…

Seki(a,b) = octomul5(a, b);
Kyoyaku(v) = [ v[1], -v[2], -v[3], -v[4],  -v[5], -v[6], -v[7], -v[8] ];

X = [3,1,4,-1, 5,9,2,6]; Y = [2,-2,3,6, 0,-6,7,9];

XY の共役 Kyoyaku( Seki(X,Y) ) と、X, Y それぞれの共役を逆順に掛けたもの Seki( Kyoyaku(Y), Kyoyaku(X) ) を求めると、どちらも次の値が返る:
  [-12, -17, -165, 3, -21, 27, -79, 53]

41. 今回の最後の話題として、ノルム、つまりある数 X の各成分の平方和が、XX* つまりその数自身とその数の共役の積に等しいことを確かめておこう。四元数については、このことは確認済み。実際、ベクトル Vv第1成分(実部)が等しく(A = +a)、第2成分以降(虚部)は絶対値が同じで符号が反対の場合(b = −B, c = −C 等々)、積 Vv を考えると、A, a を含むたすき足し算は、次のように 0 に等しい:
  Ab + Ba = A(−B) + B(A) = 0 なぜなら b = −B, a = +A
  Ac + Ca = A(−C) + C(A) = 0 なぜなら c = −C, a = +A 等々

一方、同じ条件において A, a を含まないたすき引き算も 0 に等しい。例えば…
  Cd − Dc = C(−D) − D(−C) = −CD + DC = 0 なぜなら d = −D, c = −C
  Db − Bd = D(−B) − B(−D) = −DB + BD = 0 なぜなら b = −B, d = −D 等々

他方 a = +A, b = −B, c = −C, … だから Vv の実部は、次のような平方和になる(成分の数だけ項がある。四元数なら D2 まで):
  Aa − Bb − Cc − … = AA + BB + CC + … = A2 + B2 + C2 + …

定義により、この vV の共役 V* なので、Vv = VV* が上記のような平方和になることは明らかだろう。逆に v から見れば V は自分の共役 v* なので、同じ値を Vv = v*v と書くこともできる。ところで Vv は、勝手に選んだ任意のベクトルであり、互いに共役にさえなっていれば、どっちをどっちと呼んでも大勢に影響ない。旧 Vv と呼び、旧 vV と呼べば、旧 VV*vv* = V*V となるが(なぜなら v = V*, V = v*)、結果に変わりはない:
  VV* = V*V = V の各成分の平方和
実際、たすき足し算の部分は、積の順序を入れ替えても Ab + Ba が aB + bA などとなるだけで、値は同じ。一方、たすき引き算の積の部分の順序入れ替えについても、次のように、この条件ではどちらにしても結果が 0 になる:
  cD − dC = c(−d) − d(−c) = −cd + dc = 0 なぜなら D = −d, C = −c 等々

数値例:

X = [3,1,4,-1, 5,9,2,6];

Seki( X, Kyoyaku(X) )Seki( Kyoyaku(X), X ) を求めると、どちらも次の値が返る:
  [173, 0, 0, 0, 0, 0, 0, 0]
この値は虚部が全部 0 なので、八元数といっても事実上、実数。実部 173 は、次の平方和に等しい:
  32 + 12 + 42 + (−1)2 + 52 + 92 + 22 + 62

複素数(2次元ベクトル)については、この性質をもっと直接的に確認できる。 X = A + Bi とすると:
  XX* = (A + Bi)(A − Bi) = A2 − (Bi)2 = A2 + B2 なぜなら i2 = −1
  X*X = (A − Bi)(A + Bi) = (A + (−Bi))(A − (−Bi)) = A2 − (−Bi)2 = 以下同じ

複素数・四元数・八元数などのノルム X が複素数・四元数・八元数などのとき、そのノルム(各成分の平方和)は XX* に等しい。 X*X とも等しい。各成分は実数なので、その平方はどれも 0 以上の実数であり、ノルムは 0 以上の実数。 X の全成分が 0 のとき(つまり X = 0 のとき)に限って X のノルムは 0 になり、それ以外の場合、ノルムは正。

*

ノルムの性質を利用すると、少なくとも複素数・四元数については、次のシンプルな計算が成り立つ:
  norm(PQ) = (PQ)(PQ)*  ← 上記性質を X = (PQ) に適用
  = (PQ)(Q*P*)  ← (PQ)* = Q*P* は前記の通り
  = P[(QQ*)P*]  ← ★結合法則!?
  = P[norm(Q) P*]  ← 上記性質から (QQ*) = norm(Q)
  = P[P* norm(Q)]  ← norm(Q) は実数なので交換法則に従う
  = (PP*) norm(Q)  ← norm(Q) は実数なので結合法則に従う
  = norm(P) norm(Q)  ← 上記性質から (PP*) = norm(P)

どの式変形も、ほとんど疑問の余地のない明白なものだが、ただ一つ、八元数では「★結合法則!?」の部分が、問題になる。八元数では結合法則が保証されていない。 a, b, c の中に等しい数があれば、八元数でも (ab)c = a(bc) が成立するものの、上記の式変形では、次のように四つの変数が絡み、一般には、四つのうちどの二つも等しくない:
  (PQ)(Q*P*) = P[(QQ*)P*]
これは (ab)(cd) = a[(bc)d] の形であり、この複雑な結合法則は、一般論としては、交代法則(それは弱い結合法則である)の範囲でどうにかなるものではない!

半面、「★結合法則!?」に含まれている4種の数は、共役の違いに目をつぶれば P, Q の2種類だけなので(そして共役というのは、虚部の符号以外は等しい数――つまり「似た構造の数」なので)、「a, b, c の中に等しい数があれば」の拡張として、うまく扱えるかもしれない…。事実、八元数ではこのノルムの法則が成り立つのだから、どこかに ★ のギャップを埋める道が隠れているはず。といっても、一見したところ、具体的にどう処理すればいいのか、明らかではない…

★ は三つの数の結合ではなく、四つの数の結合なので、比較的難易度が高い可能性がある。四つの数の弱い結合法則として Moufang 恒等式を利用できるかもしれない。

⁂

2023-12-17 幸運を呼ぶ8次元 花びら8枚のティアレ

#数論 #FairyGlass #八元数 #四元数

画像: ゴーギャン『Vaïraumati téi oa』画像は、タヒチ時代のゴーギャンの作品(部分)。青い布の模様は、タヒチの国花ティアレ(Tiare)ではないだろうか、しかも花びら 8 枚の…?

ティアレの花は、美や愛の象徴だという。ティアレの花弁は普通5~7枚だが、まれに8枚の花びらを持つことがあり、「四つ葉のクローバー」のように幸運を暗示するらしい。

(PQ) × (AB) と P × [(QA)B] という2種類の掛け算が、どっちでも等しいこと。例えば…
  (2 × 3) × (5 × 4) = 6 × 20 = 120  ← P = 2, Q = 3, A = 5, B = 4
  2 × [(3 × 5) × 4] = 2 × (15 × 4) = 120  ← 上と一致
…について、われわれは「当たり前」と感じ――というより正直、何も感じず――、これまで深く考えることもなかった。事実、整数や実数のような普通の数の世界では、掛け算の順序は自由なので (PQ)(AB) = P[(QA)B] は当たり前だし、四元数においても同じ性質が成立。

ところが八元数になって結合法則が崩壊すると (PQ)(AB) = P[(QA)B] は一般には成り立たない。結合法則が壊れてるんだから仕方ないのだが、それにもかかわらず A = Q*, B = P* のときには、この関係が成り立ってもらわないと困る(その訳については後述)。

予想1 八元数でも (PQ)(Q*P*) = P[(QQ*)P*]

結合法則が保証されない世界で、どうやってこれを証明できるのだろう…。しかも十六元数(以降)では、今度は、同じ関係が成り立ってしまっては困るのである!

予想2 十六元数・三十二元数などでは、予想1の等式が不成立。

八元数では、「結合法則が保証されない」にもかかわらず予想1が成り立つ。同じ「結合法則が保証されない世界」でも、十六元数以降では、同じことが駄目らしい(予想2)。こうしてみると 8 は特別なラッキーナンバーってことが感じられる。四つ葉のクローバーや、ティアレの 8 枚の花びらのように。

前回、この微妙なギャップに気付いて少し戸惑ったが、いろいろ考えた末、どうやら謎の仕組みが分かりかけてきた。

*

42. V, v を四元数・八元数などのベクトル表現とする。今 r を V などと同じ種類の数のうち、虚部が全部 0 のものとすると(つまり実質的には r は実数)、交換法則 rV = Vr が成立。なぜなら:
  V = (x0, x1, x2, …) とすると
  rV = (rx0, rx1, rx2, …)
  一方 Vr = (x0r, x1r, x2r, …)
ベクトルの成分 x0, x1, x2, … は実数なので、実数 r との積の間で交換法則が成り立つ:
  rx0 = x0r, rx1 = x1r 等々
従って rVVr は各成分が等しく rV = Vr となる。

さらに r, V, v は、結合法則 (rV)v = r(Vv) を満たす。四元数の例:
  V = (A, B, C, D) と v = (a, b, c, d) について
  Vv = (Aa − Bb − Cc − Dd, Ab + Ba + Cd − Dc,
   Ac + Ca + Db − Bd, Ad + Da + Bc − Cb)
r(Vv) はこの各成分を r 倍したものなので:
  r(Vv) = (rAa − rBb − rCc − rDd, rAb + rBa + rCd − rDc,
   rAc + rCa + rDb − rBd, rAd + rDa + rBc − rCb)
一方 (rV) と v の積は:
  (rV)v = ((rA)a − (rB)b − (rC)c − (rD)d, (rA)b + (rB)a + (rC)d − (rD)c,
   (rA)c + (rC)a + (rD)b − (rB)d, (rA)d + (rD)a + (rB)c − (rC)b)  『
この最後の数は、先に記した r(Vv) と全成分、等しい。

四元数の場合、仮に r が実数でなくても一般に結合法則が成り立つので、このような証明は本来必要ないけれど、r が実数ということから交換法則が成立するので:
  (rV)v = r(Vv)
  = (Vr)v = V(rv)
  = (Vv)r = V(vr)
このうち一つ目と二つ目が等しいことは、既に記した。三つ目は一つ目の丸かっこ内に前述の交換法則を適用、五つ目は二つ目の全体に交換法則を適用。四つ目・六つ目は『た』で V を r 倍する代わりに v を r 倍したものであり、A, B, C, D が r 倍される代わりに a, b, c, d が r 倍されるが、結果は各項・各成分とも『た』と等しい。要するに、Vv の掛け算の順序(どっちが左にあるか)さえ保っていれば、実数 r は先頭にあっても、末尾にあっても、はたまた Vv の中間にあっても構わず、そのいずれのケースについても、ベクトル(あるいはベクトルの積)と実数との掛け算の順序は、自由(つまり結合法則が成り立つ)。特に…

補題1(実数との間の結合法則) A, B, C, D の少なくとも二つが実数なら (AB)(CD) = A[(BC)D]

同様のことは、八元数 V = (x0, x1, x2, …, x7), v = (y0, y1, y2, …, y7) についても成り立つ。事実 Vv の実部
  x0y0 − x1y1 − x2y2 − … − x7y7
を r 倍したものは、(rV) と v の積の実部、すなわち次の値に等しい(これは V と (rv) の積にも等しい)。
  (rx0)y0 − (rx1)y1 − (rx2)y2 − … − (rx7)y7
一方、Vv の虚部のうち、たすき足し算
  x0yn + xny0
の部分は、もし V が r 倍されるなら、その各成分が r 倍され、x0 も xn も r 倍されるのだから、たすき足し算の結果は、全体として r 倍される。たすき引き算についても同様で、
  xmyn − xnym
において xm と xn が両方 r 倍されるとき、この引き算の結果は、全体として r 倍される。八元数の積の虚部は、たすき足し算とたすき引き算だけで構成されているのだから、以上のことから、虚部の各成分は r 倍される。

43. 共役とは、実部が同じで、虚部の符号だけが反対の数。 P をベクトルで表し実部を R、純虚数部分を H とすれば P = R + H だが、P の共役 P* は P* = R − H となる。

〔例6〕 四元数 P = (2, 3, 4, 5) = 2 + 3i + 4j + 5k について:
実部は R = (2, 0, 0, 0) = 2、純虚数部分は H = (0, 3, 4, 5) = 3i + 4j + 5k。そして P = R + H。
P の共役は P* = R − H = (2, 0, 0, 0) − (0, 3, 4, 5) = (2, −3, −4, −5) = 2 − 3i − 4j − 5k。

〔例7〕 八元数 P = (2, 3, 4, 5, 6, 7, 8, 9) について:
実部は R = (2, 0, 0, 0, 0, 0, 0, 0)、純虚数部分は H = (0, 3, 4, 5, 6, 7, 8, 9)。そして P = R + H。
P の共役は P* = R − H = (2, −3, −4, −5, −6, −7, −8, −9)。

同様に Q = r + h の実部を r、純虚数部分を h とすると Q* = r − h だから:
  (PQ)(Q*P*) = [(R + H)(r + h)][(r − h)(R − H)]
  = (Rr + Rh + Hr + Hh)(rR − rH − hR + hH)
展開すると 16 項が出る:
  = (Rr)(rR) − (Rr)(rH) − (Rr)(hR) + (Rr)(hH)  ‥‥①
  + (Rh)(rR) − (Rh)(rH) − (Rh)(hR) + (Rh)(hH)  ‥‥②
  + (Hr)(rR) − (Hr)(rH) − (Hr)(hR) + (Hr)(hH)  ‥‥③
  + (Hh)(rR) − (Hh)(rH) − (Hh)(hR) + (Hh)(hH)  ‥‥④

これら 16 項は、いずれも (Ab)(cD) の形を持つ: ただし A, D はそれぞれ R or H に等しく、b, c はそれぞれ r or h に等しい。この (Ab)(cD) の形の各項について、掛け算の順序を A[(bc)D] に変更したい。実数 R, r を掛ける順序は自由なので(前節・補題1参照)、この変更は ① ~ ③ のほとんどの項については、問題なく実行可能。ただし ② の最後の項 (Rh)(hH) については、次のようにスカラー(実数)を分離してから、h(hH) に左・交代法則を適用する:
  (Rh)(hH) = R × h(hH) = R × (hh)H
③ の最後の項については、単に実数 r の位置を移動すればいい:
  (Hr)(hH) = H(r × hH) = H[(rh)H]
④ の二つ目の項が −H[(hr)H] に等しいこと: 実数 r をいったん分離した後で、次のように回遊法則(両端が等しい場合の弱い結合法則)を使い、それから r を望ましい位置に戻せばいい:
  −(Hh)H × r = −H[hH] × r = −H[(hr)H]
あるいは、同じことだが、次のように r を移動してから (hr) を中央の因子として回遊法則を適用してもいい:
  −[H(hr)]H
④ の三つ目の項については、右・交代法則を利用できる:
  −(Hh)(hR) = −(Hh)h × R = −H[hh] × R = −H[(hh)R]

問題は一番最後の (Hh)(hH)。これが H[(hh)H] と等しいことを示すのは、比較的難しい。一つの方法として、次の関係(Moufang 恒等式と呼ばれるものの一種)を利用できる。

中間 Moufang 恒等式 交代代数の世界において任意の 3 元 x, a, b は (xa)(bx) = x[(ab)x] を満たす

詳細については次回記すが、この恒等式で x = H, a = b = h と置けば (Hh)(hH) = H[(hh)H] となる。

結局、全 16 項に対して (Ab)(cD) = A[(bc)D] の形の変形が成り立ち、A に当たる文字をくくり出すと、結果はこうなる:
  (PQ)(Q*P*) =
  R[(rr)R − (rr)H − (rh)R + (rh)H] + R[(hr)R − (hr)H − (hh)R + (hh)H]
  + H[(rr)R − (rr)H − (rh)R + (rh)H] + H[(hr)R − (hr)H − (hh)R + (hh)H]
角かっこ内の奇数番目の項・偶数番目の項をそれぞれ左・右に集めると:
  = R[(rr)R − (rh)R + (hr)R − (hh)R] + R[−(rr)H + (rh)H − (hr)H + (hh)H]
  + H[(rr)R − (rh)R + (hr)R − (hh)R] + H[−(rr)H + (rh)H − (hr)H + (hh)H]
  = R[(rr − rh + hr − hh)R] − R[(rr − rh + hr − hh)H]
  + H[(rr − rh + hr − hh)R] − H[(rr − rh + hr − hh)H]
ここで rr − rh + hr − hh = r(r − h) + h(r − h) = (r + h)(r − h) = QQ* という関係を使うと:
  (PQ)(Q*P*) = R[(QQ*)R] − R[(QQ*)H] + H[(QQ*)R] − H[(QQ*)H]
  = R[(QQ*)(R − H)] + H[(QQ*)(R − H)]
  = (R + H)[(QQ*)(R − H)] = P[(QQ*)P*]

八元数について、結合法則が成り立たないにもかかわらず、この等式(四元数のノルムに関する式と同様のもの)が成り立つ根拠は、上記のように、さまざまな「弱い結合法則」を利用できることらしい。16 項中の多くの項については、スカラー倍(実数倍)の問題なので、十六元数でも同様の変形ができるはず(?)――微妙で繊細な部分なので、実際に十六元数の世界を構成して試してみないことには、確信を持てないけど。幾つかの項については、交代法則や Moufang 恒等式が必要なので、十六元数では同じ変形ができないはず。

*

こうしてみると、八元数って美しい――「ノルムの乗法性が辛うじて保たれる」っていう、その際どいバランス感覚が、スリリング。一応これで合ってる(?)っぽいけど、まだ断定せず、もうちょい検討してみたい。間違ってたらごめんね。(続く)

⁂

2023-12-21 Moufang 恒等式 16次元は奇妙な荒野

#数論 #FairyGlass #八元数 #四元数 #十六元数

a × a のことを a2 と略す。 12 = 1, 22 = 4, 32 = 9, 42 = 16, 52 = 25, … のような整数を平方数という。

5 は二つの平方数の和で表される: 5 = 22 + 12。 73 も二つの平方数の和: 73 = 82 + 32。「二つの平方数の和で表される数」と「二つの平方数の和で表される数」の積は、再び「二つの平方数の和で表される数」になる。この例でいうと 5 × 73 = 365 がその性質を持つ。
  365 = 200 + 165 = (200 − 4) + (165 + 4) = 196 + 169 = 142 + 132
  あるいはまた 365 = 361 + 4 = 192 + 22

このすてきな性質は、次のように拡張可能。
  ・「四つの平方数の和で表される数」と「四つの平方数の和で表される数」の積は、再び「四つの平方数の和で表される数」
  ・「八つの平方数の和で表される数」と「八つの平方数の和で表される数」の積は、再び「八つの平方数の和で表される数」

4平方和のバージョンについては、別のもっと雄大な定理(任意の整数は4平方和で表される)との関連で既にあれこれ記した。で…同じ証明法が8平方和バージョンにも使えるか?というのは、自然な疑問なのだが…

前回「微妙だが成り立つ!」ということを証明しようとして、実部と虚部をバラバラにしてみた。バラバラにして出てくる 16 項のうち 15 項については確かにうまく扱えるが、最後の 1 項 (Hh)(hH) が問題。検討すると、その処理には Moufang 恒等式が必要なようだ。手順前後になってしまったが Moufang 恒等式を導入し、ギャップを埋めたい。

上記の流れだと…
  ・「16 個の平方数の和で表される数」と「16 個の平方数の和で表される数」の積は、再び「16 個の平方数の和で表される数」?
  ・「32 個の平方数の和で表される数」と「32 個の平方数の和で表される数」の積は、再び「32 個の平方数の和で表される数」?
…等々となりそうだが、実際には、ノルムの乗法性(この用語については後述)に関する限り、16 以上には進めない。「なぜ8次元は良くて16次元は駄目なのか?」というのは、直観的にはよく分からない現象だろう…。十六元数の積の公式を構成し一体何が壊れるのか直接的に調べてみたところ、どうやら八元数で問題になる上記の (Hh)(hH) は、十六元数のノルムの乗法性が失われる原因でもあるらしい。

*

44. ここまでの粗筋。四平方の恒等式――すなわち「4平方和」と「4平方和」の積は再び「4平方和」であるという性質――は、四元数のノルムの定理と実質同じ意味であり、この定理は次の恒等式に帰着される:
  (PQ)(PQ)* = (PQ)(Q*P*) = P[(QQ*)P*]  『
第一の等号については §39 参照。 P, Q が四元数の場合、結合法則が成り立つので(つまり因子の左右の位置関係を保つ限り、掛け算の順序は自由なので)、第二の等号は明白。八元数の場合、結合法則が保証されないので、第二の等号が成り立つかどうかが微妙なのであった。

〔解説〕 これは「積のノルムは、ノルムの積」という性質に他ならない。複素数の場合が最も分かりやすい: a と b を任意の実数として P = a + bi という複素数を考える。複素数 X のノルム norm(X) とは「実部の平方と虚部の平方の和」である、と定義しよう:
  norm(P) = a2 + b2
今、もう一つの複素数 Q = c + di があるとすると norm(Q) = c2 + d2 なので:
  norm(P) norm(Q) = (a2 + b2)(c2 + d2) ☆
一方、P と Q の積 PQ は:
  PQ = (a + bi)(c + di) = (ac − bd) + (ad + bc)i
従って:
  norm(PQ) = (ac − bd)2 + (ad + bc)2
  = (ac)2 − 2(abcd) + (bd)2 + (ad)2 + 2(abcd) + (bc)2 ←第2項・第5項は消滅
  = a2(c2 + d2) + b2(d2 + c2) = (a2 + b2)(c2 + d2)
これは ☆ と等しいので、次の結論に至る: 「P のノルム」と「Q のノルム」の積は、「PQ のノルム」に等しい。同様のことは P, Q が四元数の場合にも成り立つし、八元数の場合にも成り立つ。意外なことに(?)十六元数の場合には、もはや「ノルムの積は、積のノルム」という性質が成り立たない。これが「ノルムの乗法性が失われる」ということの意味。

四元数のノルムの乗法性については、証明が済んでいる。八元数のノルムが同じ性質を持つかどうか、確かめたい。

45. P, Q が八元数の場合にも『ち』が成り立つことの証明と、P, Q が十六元数の場合には『ち』が成り立たないことの証明は、ある意味、表裏一体。ここでは P, Q が八元数の場合を考える。


P = x0 + x1e1 + x2e2 + …
の実部は R = x0
純虚数部分は H = P − R
= x1e1 + x2e2 + …

複素数 x0 + x1i の「虚部」
x1 と違い「純虚数」は
e1 などの虚数単位を含む


P の実部を R として、P の純虚数部分 P − R を H とする: P = R + H。同様に Q を実部 r と純虚数 h に分離する: q = r + h。すると『ち』の核心部は、こうなる:
  [(R + H)(r + h)][(r − h)(R − H)] = P[(QQ*)P*]
しかもその証明は、次のたった一つの等式の証明に帰着される(§43):
  (Hh)(hH) = H[(hh)H]  『

『つ』はシンプルな式だが、意外と手ごわい。最も素朴は攻略法は、
  H = x1e1 + x2e2 + … + x7e7
  h = y1e1 + y2e2 + … + y7e7
と置いて『つ』に代入し、八元数の「九九」を使って直接代数計算を行うことだろう――原理的には実行可能だが、『つ』の両辺は四つの 7 項式の積なので 74 = 2401 個の項が発生する。もっと良いアイデアは: 交代代数の世界では Moufang 恒等式
  (xa)(bx) = x[(ab)x]
が成り立つ――という事実を証明すること。そうすれば『つ』は、その一例として、自然に解決する。別の観点として、抽象代数学には「交代代数の 2 元から生成された部分代数は結合的」という定理がある: この定理に照らすと H, h の 2 元だけを含む積は結合法則を満たし、従って『つ』は成立しなければなるまい。これは Moufang 恒等式より、もっと一般的で強力な理論。ただし、この定理の証明には通常 Moufang 恒等式が使われる。結局は Moufang 恒等式の証明が先決。

〔付記〕 八元数に話を限定するなら、「その任意の 2 元から生成される部分代数は結合的」ということを上記の一般論と無関係に(Moufang 恒等式を使わずに)証明可能。けれど Moufang 恒等式を証明する方が手っ取り早い。

46. Moufang 恒等式とは何か。 Moufang は、この分野について先駆的な研究をしたドイツの数学者の名前。本来の読み方は不明だが、ロシア語の文献では Муфанг(ムファング)となっている。便宜上 [ˈmuːˌfaŋ] と読むことにする。

八元数の世界では、結合法則 (ab)c = a(bc) が一般には保証されない。特別なケースとして a, b, c のうち二つ(以上)が等しいなら、結合法則が成り立つ。具体的には:
  a = b の場合 左・交代法則 x2y = x(xy)
  b = c の場合 右・交代法則 (xy)y = xy2
この二つを仮定すると a = c の場合の「両端が等しい場合の結合法則」も自然に導かれるのであった:
  a = c の場合 (xy)x = x(yx)

Moufang 恒等式は、この「両端うんぬん」の拡張版に当たる。「両端うんぬん」について、決まった名前がないと不便なので、これを非公式に「回遊法則」と呼ぶことにする。

回遊法則(flexibility)  (xy)x = x(yx)
弱い結合法則の一種。回遊法則が成り立つ場合、回文的な 3 因子の積 xyx については、先に左の二つを掛け算しても、先に右の二つを掛け算しても構わない。回遊法則が成り立つ世界においては (xy)x と x(yx) は同じ値なので、両者の区別は不要: どちらの場合でも、かっこを省いて xyx と書いてもいい(かっこを付けたければ自由に付けてもいい)。

回文的 → 左から読んでも、右から読んでも x, y, x という性質。重要なのは「三つの因子が回文的」=「両端の因子が同じ」ということであり、文字レベルで回文的である必要はない。例えば、回遊法則が成り立つ世界では、次の等式も成り立つ:
  [x(ab)]x = x[(ab)]x  左から読んでも右から読んでも x, (ab), x

交代法則が成り立つ世界(交代代数)においては、自動的に回遊法則も成り立つ。八元数の世界はその例。逆は必ずしも真ではない。例えば十六元数の世界では、回遊法則は成り立つが、交代法則はもはや成り立たない。

便宜上、次の用語も定義しておく。

4 因子の積 abcd は、もし結合法則が成り立つなら、いろいろな順序で掛け算できる。結合法則が必ずしも成り立たないとして、次の三つの順序に特別な名前を付ける:
  完全順方向 「a に右から b を掛け、その積に右から c を掛け、その結果に右から d を掛ける」という一番素直な順序 [(ab)c]d
  完全逆方向 「d に左から c を掛け、その積に左から b を掛け、その結果に左から a を掛ける」というあべこべな順序 a[b(cd)]
  前後二分割 呼んで字のごとく (ab)(cd)

交代法則が成り立つ世界では、次の三つの恒等式が成り立つ(証明は後述)。

左 Moufang 恒等式 任意の元 A に回文的な積 xyx を左から掛けた (xyx)A について、「完全順方向の積と完全逆方向の積が一致する」という主張である:
  [(xy)x]A = x[y(xA)]
  補足: 回遊法則によって (xy)x のかっこは省略可なので、この恒等式を (xyx)A = x[y(xA)] と書いてもいい。 y = 1 と置けば左・交代法則。

右 Moufang 恒等式 任意の元 A に回文的な積 xyx を右から掛けた A(xyx) について、「完全順方向の積と完全逆方向の積が一致する」という主張である:
  A[x(yx)] = [(Ax)y]x
  補足: 左辺が完全逆方向。回遊法則によって A(xyx) = [(Ax)y]x とも表現可能。 y = 1 と置けば右・交代法則。

要点 (xyx)A と A(xyx) は、どっちも「完全順方向=完全逆方向」

中間 Moufang 恒等式 回文的な積 xyx の真ん中の要素 y が 2 因子の積 ab に等しい場合、すなわち x(ab)x の形について、「前後二分割が許される」という主張である:
  x(ab)x = (xa)(bx)
この左辺については、回遊法則から [x(ab)]x と解釈しても x[(ab)x] と解釈しても構わない。二つの解釈を区別すると、Moufang 恒等式は合計4種。

この最後の恒等式が証明されれば、その特別な場合として、懸案である八元数の H[(hh)H] = (Hh)(hH) の証明も、完了する。

47. 「八元数などの交代代数で Moufang 恒等式が成り立つ」ことについて、初等的な証明(エレガントではない)を紹介。結合子を媒介として、
  △(x, A, B) = −△(x, B, A)
  △(A, B, x) = −△(B, A, x)
のような交代性を利用する。

右 Moufang 恒等式…
  A[x(yx)] = [(Ax)y]x  『
…の左辺と同一の項は、結合子
  △(A, x, yx) = (Ax)(yx) − A[x(yx)]
に含まれ、『て』の右辺と同一の項は、次の結合子に含まれる:
  △(Ax, y, x) = [(Ax)y]x − (Ax)(yx)
上の二つの式を辺々足し合わせると ±(Ax)(yx) は消滅:
  △(A, x, yx) + △(Ax, y, x) = [(Ax)y]x − A[x(yx)]  『

もし『て』が成り立つなら、その左辺を移項して 0 = [(Ax)y]x − A[x(yx)] なので『と』は = 0 になる。逆に『と』が = 0 なら『て』も成り立つ。よって『て』を証明する代わりに、『と』の左辺が = 0 であることを示せばいい:
  示すべきこと △(A, x, yx) + △(Ax, y, x) = 0  『

結合子の便利な点として、交代代数において、符号の調整だけで三つの数を自由に並び替えられる。
  △(A, x, yx) = −△(A, yx, x)
  △(Ax, y, x) = −△(y, Ax, x)
…と変形すると、『な』はこうなる:
  −△(A, yx, x) − △(y, Ax, x) = 0
マイナス符号は邪魔くさいので、両辺を −1 倍しておく:
  示すべきこと △(A, yx, x) + △(y, Ax, x) = 0  『

この形から、次のように (yx)x と (Ax)x に右・交代法則を適用できる:
  『に』左辺 = [A(yx)]x − A[(yx)x] + [y(Ax)]x − y[(Ax)x]
  = [A(yx)]x − A(yx2) + [y(Ax)]x − y(Ax2)  『

『ぬ』の第2項・第4項は、どちらも {−A, y, x2} の積であり、次のトリックによって、かっこの位置を変更できる。
  △(A, y, x2) = (Ay)x2 − A(yx2)
  −△(A, y, x2) = △(y, A, x2) = (yA)x2 − y(Ax2)
上と下を足すと:
  0 = (Ay)x2 − A(yx2) + (yA)x2 − y(Ax2)
  右辺第1項・第3項を移項して −(Ay)x2 − (yA)x2 = −A(yx2) − y(Ax2)
この関係を使って『ぬ』の第2項・第4項を書き換えると:
  [A(yx)]x − (Ay)x2 + [y(Ax)]x − (yA)x2
  = [A(yx) − (Ay)x + y(Ax) − (yA)x]x
  = −[(Ay)x − A(yx) + (yA)x − y(Ax)]x
  = −[△(A, y, x) + △(y, A, x)]x

結合子の交代性から、この最後の角かっこ内は 0。従って『ぬ』は = 0。つまり『に』は正しく、従って『な』も正しい。∎

かっこの位置を変更したおかげで、右側の x を一つくくり出すことができ、交代性による「ゆがみの打ち消し合い」に帰着させることができた。若干見通しの悪い議論だが、これはこれで面白い。この証明の全てを鏡像にすれば(一部符号も変わる)、左 Moufang 恒等式 [(xy)x]A = x[y(xA)] も同様に証明される:
  『と』に当たる式 △(xy, x, A) + △(x, y, xA) = [(xy)x]A − x[y(xA)]
  『な』に当たる式 △(xy, x, A) + △(x, y, xA) = 0
  『に』に当たる式 △(x, xy, A) + △(x, xA, y) = 0
  『ぬ』に当たる式 (x2y)A − x[(xy)A] + (x2A)y − x[(xA)y]

〔参考文献〕 Richard D. Schafer: An Introduction to Nonassociative Algebras (1966), Chap. 3.1
К. А. Жевлаков, et al.: Кольца, близкие к ассоциативным (1978), Chap. 2.3
https://archive.org/details/B-001-038-750-ALL/B-001-038-750-06/page/50/mode/1up

48. 最後に、中間 Moufang 恒等式。
  [△(x, a, b)]x = [(xa)b − x(ab)]x = [(xa)b]x − [x(ab)]x
  △(xa, b, x) = [(xa)b]x − (xa)(bx)
上から下を引くと:
  [△(x, a, b)]x − △(xa, b, x) = −[x(ab)]x + (xa)(bx)  『

『ね』の右辺が = 0 になれば、それは (xa)(bx) = [x(ab)]x を意味し、中間 Moufang 恒等式が証明される。そのためには『ね』の左辺が = 0 であることを言えばいい。ところが:
  △(x, a, b) = −△(x, b, a) = +△(b, x, a)
  −△(xa, b, x) = +△(b, xa, x)
従って:
  『ね』左辺 = [△(b, x, a)]x + △(b, xa, x) = [(bx)a − b(xa)]x + [b(xa)]x − b[(xa)x]
  = [(bx)a]x − [b(xa)]x + [b(xa)]x − b[x(ax)]
最後の式について。第4項には、回遊法則を適用した。第2・第3項は消滅する。第1項は bxax の完全順方向、第4項は、符号を無視すると同じ bxax の完全逆方向なので、右 Moufang 恒等式(前節で証明した)により両者は等しい。従って、第4項の符号を考慮すると『ね』左辺は = 0 である。∎

既に述べたように、回遊法則によって [x(ab)]x と x[(ab)x] は等しく、中間 Moufang 恒等式は、次のどちらの書き方でも同じ意味になる:
  (xa)(bx) = [x(ab)]x あるいは (xa)(bx) = x[(ab)x]
特に x = H, a = b = h と置くと (Hh)(hH) = H[(hh)H] となる。 §45 の『つ』が証明され、八元数のノルムの乗法性が確立したのである。

これまで「八元数のノルムは乗法的」という事実を天下り的に使っていたが、本当に乗法的なのか、理論面からは検討していなかった。「八元数のノルムは乗法的」という結論に一応到達できて一安心。四元数から八元数に進むとき結合法則は失われるけど、八元数の世界には、結合法則の残骸の「弱い結合法則」――すなわち交代法則――があり、その働きにより(微妙なバランスだが)ノルムの乗法性が維持される。十六元数の「さらに弱い結合法則」――すなわち回遊法則――では、もはや弱過ぎて、ノルムの乗法性は維持されない。

*

十六元数では交代性が失われるため、§43 の 16 項のうち、次の 3 項において、八元数までと同様の変形が保証されない:
  (Rh)(hH) = R[(hh)H] 不成立(左・交代法則が破れるため)★
  −(Hh)(hR) = −H[(hh)R] 不成立(右・交代法則が破れるため)★
  (Hh)(hH) = H[(hh)H] 不成立(中間 Moufang 恒等式が成り立たないため)

★印の二カ所の乱れは、絶対値が同じで符号が逆なので、トータルでは影響がなくなる。その意味では、交代法則の破れそのものは、ノルムの乗法性にとって致命傷ではないのかもしれない。けれど交代法則の破れと連携して Moufang 恒等式が崩れてしまい、最後の項 (Hh)(hH) の乱れによって、結局、十六元数ではノルムの乗法性が失われる。

⁂

2024-01-01 八元数はどうやって発見されたか? 歴史の仮説

#数論 #FairyGlass #八元数 #四元数

複素数を 2 個の実数のペアと見ることができる。例えば 1 + 2i を (1, 2) のように。1843年10月、アイルランドの Hamilton はこれを発展させ、今度は 2 個の複素数のペアを「新しい種類の数」と考えた。四元数の発見であった。
  (1 + 2i, 3 + 4i) = 1 + 2i + (3 + 4i)j = 1 + 2i + 3j + 4k
  ここで i, j, k は3種類の虚数単位で ij = k などの掛け算規則に従う

この話がどこに向かうかは、明らかだろう。だったら今度は 2 個の四元数のペアを八元数として、2 個の八元数のペアを十六元数として…と続けられるのでは。実際 Hamilton の友人 Graves は四元数の発見を知るとすぐそれを考え、同じ1843年の12月から翌1844年1月にかけて、八元数の構成に成功した。英国の Cayley も同時期に同じアイデアを考え、1845年に論文を公開。

二人の発見者 Graves と Cayley は「八元数を構成できる」という事実だけを報告していて、どうやってそれを発見したのか説明していない。現代の文献では「Cayley–Dickson プロセスによって、複素数→四元数→八元数→…という無限連鎖が生じる」と整理されている。けれどそれは後付けの理論。 Graves も Cayley も、その方法で八元数を構成したのではない。では、どうやって…?

ノルムの乗法性を基準に試行錯誤で発見したのは確かだろうけど、その試行錯誤をアルゴリズムとして明確化したい。背景には「八元数の導入において Cayley–Dickson プロセスを天下り的に使うのを避けたい」というモチベーションもある。

*

49. 八元数は七つの虚数単位 e1, e2, …, e7 を持ち、その掛け算規則(愛称「和音」)は、次の例のように「三つの数字を一定の順序で並べたもの」を使って表現可能(三つの数字は 1 ~ 7 なので「3桁の数」と言ってもいい):

〔例〕 145 つまり 1 → 4 → 5 → 1 → 4 → 5 → … その意味は
  e1e4 = e5 そして e4e5 = e1 そして e5e1 = e4
  掛ける順番を逆にすると符号が逆になる:
  e4e1 = −e5 そして e5e4 = −e1 そして e1e5 = −e4

もし「145」の代わりに規則「154」を採用すれば e1e5 = e4, e5e4 = e1 等々となり、符号の設定が逆になる。あるいは、もし掛け算の規則を e1e4 = e6 と設定するのなら「145」ではなく「146」。7種類の虚数単位の間の積なので 72 = 49 パターンの積が必要。 e1e4 というたった一つの積でも、符号を含めて ±e2, ±e3 等々のどれに等しいのか、選択肢は多い。49パターンの積を正しく定義することは、至難の業に思える。もっとも e1, e2, … はそれぞれ虚数単位なので、定義上、平方すれば −1: 自分自身との積(7 パターン)については悩む必要はなく、実際に設定が必要なのは 49 − 7 = 42 パターン。上の例のように、「3桁の数による規則」一つごとに 6 パターンの積が定義されるので、規則がちょうど七つあればいい(7 × 6 = 42)。けれど、どうやって七つ選べばいいのか…。

虚部が 0 の複素数は、事実上、実数と同じように振る舞う。例えば…
  (3 + 0i)(4 + 0i) = 3 × 4 = 12
後半が 0 の四元数は、複素数と同じように振る舞う。例えば…
  (1 + 2i + 0j + 0k)(3 + 4i + 0j + 0k) = (1 + 2i)(3 + 4i) = −5 + 10i

同様に「後半が 0 の八元数は、四元数と同じように振る舞う」というのは、自然な発想だろう。例えば…
  (1, 2, 3, 4, 0, 0, 0, 0)(5, 6, 7, 8, 0, 0, 0, 0) = (1 + 2i + 3j + 4k)(5 + 6i + 7j + 8k)
…は、四元数の i, j, k に関する積の規則から計算可能。単純に i = e1, j = e2, k = e3 と考えると、四元数の積の規則は「123」で表される。

さて、虚部が 0 の複素数の i 倍は、次のように実部が 0 の純虚数になる。
  (3 + 0i)(0 + i) = 3 × i = 3i = 0 + 3i 言い換えれば (3, 0)(0, 1) = (0, 3)
  一般に (a, 0)(0, 1) = (0, a)
後半が 0 の四元数の j 倍は、次のように「前半が 0 の四元数」になる。
  (2 + 3i + 0j + 0k)(0 + 0i + j + 0k) = (0 + 0i + 2j + 3k) なぜなら ij = k
  一般に (a, b, 0, 0)(0, 0, 1, 0) = (0, 0, a, b)

同様に「後半が 0 の八元数の e4 倍は、前半が 0 の八元数になる」というのは、自然な発想だろう。例えば…
  (1, 2, 3, 4, 0, 0, 0, 0)(0, 0, 0, 0, 1, 0, 0, 0) = (0, 0, 0, 0, 1, 2, 3, 4)
  つまり (1 + 2e1 + 3e2 + 4e3)e4 = e4 + 2e5 + 3e6 + 4e7

これが成り立つと仮定すると、必然的に e1e4 = e5, e2e4 = e6, e3e4 = e7 となり、そのことから三つの規則「145」「246」「347」が導かれる。

以上によって、「123」「145」「246」「347」の四つの規則が定まる。それだけでは、例えば e1 と e6 の積、e1 と e7 の積がまだ定義されていないが、e1 と e1 ~ e5 の間の積は、既に全て定義されている。掛け算表を完成させるためには、規則「167」または「176」を追加すればいい。もし前者が追加されるなら
  e1e6 = e7 e1e7 = −e6 等々
となり、もし後者が追加されるなら
  e1e7 = e6 e1e6 = −e7 等々
となる。

〔補足〕 2, 3, 4, 5 番の虚数単位は、既に「123」または「145」の形で e1 との積が定義されているので、2, 3, 4, 5 を重複使用して「162」「163」「172」「173」などの規則を追加してはいけない。例えば、もしも「173」を追加したなら、
  e1e7 = e3
となるが、既に「123」があるので、次の関係も成り立つ:
  e1e2 = e3
もしもこれらが両立するなら e1e7 = e1e2 となり(どちらも e3 に等しいので)、両辺を左から e1 で割ると e7 = e2 となってしまう。 e7 と e2 は別々の虚数単位のはずなので、これは不合理。理論上「この世界では、そもそも割り算ができない」と諦める選択肢もあるけど、掛け算の規則をうまく設定すれば不合理を解消できるので、割り算を諦める必要はない。

同様に e2 と e5 の積、e2 と e7 の積がまだ定義されていないので、規則「257」または「275」も追加する必要がある。最後に e3 と e5 の積、e3 と e6 の積を定義するため、規則「356」または「365」も追加する必要がある。「または」が合計三つあって、それぞれ「または」のどっちが正しいのかは、まだ分からない。

50. この考えだと、掛け算の規則は 123, 145, 246, 347 の四つに加えて 167 or 176; 257 or 275; 356 or 365 の三つ。最後の三つについては、合計 23 = 8 個の選択肢がある。その中に一つでも「正しい」選択肢があれば、都合がいい。何が「正しい」のか?というのは、理論的には不透明だが、Graves たちは次のように想定したに違いない。
  八元数 X = (x0, x1, …, x7) と 八元数 Y = (y0, y1, …, y7) の積を
  XY = Z = (z0, z1, …, z7) としたとき、下記の関係が成り立つはずだ:
  [(x0)2 + (x1)2 + … + (x7)2][(y0)2 + (y1)2 + … + (y7)2] = (z0)2 + (z1)2 + … + (z7)2  『

この前提の上で、どう掛け算規則を設定すると『の』が成り立つか、試行錯誤で決定したのだろう。具体的には次のようなプロセスになる。

最初に掛け算規則「167」を仮定し、さらに「257」「356」も仮定する。 §22 以下の省略記号を使うと:
  z0 = x0y0 − x1y1 − x2y2 − … − x7y7
  z1 = 【01】 + 〖23〗 + 〖45〗 + 〖67〗
  z2 = 【02】 + 〖31〗 + 〖46〗 + 〖57〗
  z3 = 【03】 + 〖12〗 + 〖47〗 + 〖56〗
  z4 = 【04】 + 〖51〗 + 〖62〗 + 〖73〗
  z5 = 【05】 + 〖14〗 + 〖72〗 + 〖63〗
  z6 = 【06】 + 〖24〗 + 〖71〗 + 〖35〗
  z7 = 【07】 + 〖34〗 + 〖16〗 + 〖25〗
もし「167」の代わりに「176」を採用すれば「ア」の三つの数字は反転し(76, 17, 61)、それらの項は絶対値が同じで符号が逆になる。例えば、次の二つの式の関係に当たる:
  〖67〗 = x6y7 − x7y6 と 〖76〗 = x7y6 − x6y7
「257」とイの各項、「356」とウの各項の関係も同様。

X と Y は、本来それぞれ 8 個の未知数(実数)を成分とするのだが、ここでは説明を具体的にするため、次の八元数を選択する:
  X = (0, 0, 1, 0, 2, 3, 4, 0) = e2 + 2e4 + 3e5 + 4e6
  つまり x2 = 1, x4 = 2, x5 = 3, x6 = 4 その他の成分は 0
  Y = (0, 0, 0, 1, 0, 2, 3, 4) = e3 + 2e5 + 3e6 + 4e7
  つまり y3 = 1, y5 = 2, y6 = 3, y7 = 4 その他の成分は 0
すると『の』の左辺は (12 + 22 + 32 + 42)(12 + 22 + 32 + 42) = 30 × 30 = 900 なので、『の』の右辺 Z の成分の平方和が 900 になれば「正しい」(あくまで簡易判定: 掛け算の定義が変でもたまたま「正しい」結果になる可能性もある)。実際に計算してみると、次の通り。 x0 = y0 = 0 なので、黒かっこは全て 0 で無いのと同じ。
  z0 = −3⋅2 − 4⋅3 = −18
  z1 = (1⋅1 − 0⋅0) + (2⋅2 − 3⋅0) + (4⋅4 − 0⋅3) = 1 + 4 + 16 = 21
  z2 = (0⋅0 − 0⋅1) + (2⋅3 − 4⋅0) + (3⋅4 − 0⋅2) = 6 + 12 = 18
  z3 = (0⋅0 − 1⋅0) + (2⋅4 − 0⋅0) + (3⋅3 − 4⋅2) = 8 + 1 = 9
  z4 = (3⋅0 − 0⋅2) + (4⋅0 − 1⋅3) + (0⋅1 − 0⋅4) = −3
  z5 = (0⋅0 − 2⋅0) + (0⋅0 − 1⋅4) + (4⋅1 − 0⋅3) = −4 + 4 = 0
  z6 = (1⋅0 − 2⋅0) + (0⋅0 − 0⋅4) + (0⋅2 − 3⋅1) = −3
  z7 = (0⋅0 − 2⋅1) + (0⋅3 − 4⋅0) + (1⋅2 − 3⋅0) = −2 + 2 = 0
  平方和 = 182 + 212 + 182 + 92 + 32 + 02 + 32 + 02 = 1188
これは 900 と等しくないので、「掛け算規則の設定が正しくない」と判定される。規則「356」を「365」に変更すると、ウの符号が変わり z3 = 8 − 1 = 7, z5 = −4 − 4 = −8, z6 = 3 になる。そのとき:
  平方和 = 182 + 212 + 182 + 72 + 32 + 82 + 32 + 02 = 1220 これも正しくない
次に規則「356」(ウの符号)を保ったまま「257」を「275」に変えると、イの符号が変わり z2 = 6 − 12 = −6, z5 = 4 + 4 = 8, z7 = −2 − 2 = −4:
  平方和 = 182 + 212 + 62 + 92 + 32 + 82 + 32 + 42 = 980 これも正しくない
最後にイ・ウの符号を両方変えると z2 = 6 − 12 = −6, z3 = 8 − 1 = 7, z5 = 4 − 4 = 0, z6 = 3, z7 = −2 − 2 = −4:
  平方和 = 182 + 212 + 62 + 72 + 32 + 02 + 32 + 42 = 884 これも正しくない

結局、アの「167」は正しい設定ではないようだ。代わりに「176」を使うと、アの符号が変わり:
  z0 = −18
  z1 = 1 + 4 − 16 = −11
  z2 = 6 + 12 = 18
  z3 = 8 + 1 = 9
  z4 = −3
  z5 = −4 + 4 = 0
  z6 = −3
  z7 = −2 + 2 = 0:
  平方和 = 182 + 112 + 182 + 92 + 32 + 02 + 32 + 02 = 868 これも正しくない
「356」を「365」にしてウの符号を変えると z3 = 8 − 1 = 7, z5 = −4 − 4 = −8, z6 = 3:
  平方和 = 182 + 112 + 182 + 72 + 32 + 82 + 32 + 02 = 900 これは正しい!
他の可能性も検証しよう。ウの符号を戻してイの符号を変えると z2 = 6 − 12 = −6, z5 = 4 + 4 = 8, z7 = −2 − 2 = −4:
  平方和 = 182 + 112 + 62 + 92 + 32 + 82 + 32 + 42 = 660 正しくない
イとウの両方の符号を変えると z2 = 6 − 12 = −6, z3 = 8 − 1 = 7, z5 = 4 − 4 = 0, z6 = 3, z7 = −2 − 2 = −4:
  平方和 = 182 + 112 + 62 + 72 + 32 + 02 + 32 + 42 = 564 これも正しくない

結論として、掛け算の規則として 123, 145, 246, 347 を選択するのは自然な流れで、その場合、試行錯誤によると、残りの三つは 176, 257, 365 でなければならない――これこそが Graves と Cayley による古典的八元数であり、後付けの理論がなくても、「確率8分の1で成功する試行錯誤」によって発見可能

*

176, 257, 365 の選択については、立方体の頂点を使った幾何学的解釈も可能だが、最初に発見されたときは、このような代数計算によって検証されたのだろう。デンマークの Degen がやったように 167, 257, 356 を使う定義も可能だが、その場合 246 は 264 に変わり、真ん中の虚数単位 e4 の役割が、複素数の i や四元数の j の役割の自然な拡張にならない。

⁂

2024-01-06 複々素数の不思議な割り算 乗除の奇妙な冒険

#数論 #FairyGlass #八元数 #四元数 #抽象代数

日常、われわれは □ × 4 = 12 の □ を求める問題と、4 × □ = 12 の □ を求める問題を同じ 12 ÷ 4 = 3 だと思っている。この感覚は実数や複素数の世界では正しいのだが、四元数・八元数では、その感覚が通用しない不思議な現象が起きてくる。例えば、四元数の掛け算では…
  ij = k しかし ji = −k 言い換えれば j(−i) = k
…という規則がある。結果として、次の二つの問題の答えが一致しない。
  □ × j = k の □ に当てはまる数は何か ⇒ 答え i
  j × □ = k の □ に当てはまる数は何か ⇒ 答え −i

もはやこの二つは「同じ k ÷ j という一つの割り算」ではなく、別の種類の計算なのだッ!

とはいえ、0 以外の任意の四元数 A, B が与えられたとき、xA = B を満たす x を求めることも Ax = B を満たす x を求めることも常に可能であり、その意味では、四元数の世界でも、割り算はできる。ただし前者(「何を A 倍すると B になりますか?」という割り算)と、後者(「A を何倍するとB になりますか?」という割り算)は、別の問題。この奇妙な現象の原因は xA = Ax の保証がないこと(交換法則の崩壊)。実際、上記のように ij ≠ ji である。同じ x に対して xA と Ax は一般には違う値なので、xA = B の解 x をそのまま使っても Ax = B になる保証はない。 Ax = B を満たす x を知りたければ、別の計算で別の値を求めることになる。

〔例〕 四元数の世界において xj = k の解 x = i と jx = k の解 x = −i が等しくないのは、上記の通り。

結合法則 (ab)c = a(bc) まで崩壊している八元数になると、事態はさらにスリリングに…

*

51. 多少はなじみのある複素数や四元数や八元数の世界を例に、交換法則・結合法則の有無が「割り算」に与える影響を少し観察してみる。

直観的に、例えば 3 で割るということは 1/3 を掛けること。つまり「割り算」とは「逆数を掛けること」。例えば
  「q = 2 + 3i で割り算する」
ということは、単に:
  逆数 q−1 を つまり 1/q を 掛け算すること
q の逆数とは、q に掛けると積が 1 になる数。では、与えられた複素数 q に何を掛けると実数 1 になるか。…複素数に共役複素数(実部が同じで虚部の符号が反対の数)を掛けると、ノルムという実数(実部と虚部の平方和)になることは分かっている。この例では:
  共役をアスタリスクで表すと q* = 2 − 3i
  norm(q) = qq* = (2 + 3i)(2 − 3i) = 22 − (3i)2 = 4 + 9 = 13
  (虚数の定義から i2 = −1, −i2 = +1)
つまり q に q* を掛けると(この場合)実数 13 になるのだから、それを 13 で割れば 1 が得られる:
  q × q* ÷ 13 = q × q*/13 = q × (2 − 3i)/13 = 1

q = 2 + 3i の逆数は q−1 = (2 − 3i)/13 であると判明。

〔検算〕 (2 + 3i)(2 − 3i)/13 = (4 + 9)/13 = 1 分子が平方和 22 + 32 で、分母も同じ平方和なのだから、商が 1 なのは当たり前

q = 2 + 3i で割るということは、その逆数 q−1 を掛けることなので、例えば 4 + 5i を q で割ると:
  (4 + 5i) ÷ (2 + 3i) = (4 + 5i) × (2 − 3i)/13
  = (8 − 12i + 10i + 15)/13 = (23 − 2i)/13

一般に、0 以外の複素数 q = x + yi で割り算するには、逆数 q−1 = q*/norm(q) を掛け算すればいい…。同じアイデアは四元数・八元数などでも、そのまま通用する。四元数
  q = A + Bi + Cj + Dk  ここで A, B, C, D は実数
…について:
  共役は q* = A − Bi − Cj − Dk  ← 実部は同じ・虚部の符号は全部反対
  ノルムは norm(q) = qq* = A2 + B2 + C2 + D2
「複素数のノルムが、実部・虚部のニ平方和になること」からの類推で、四元数のノルムが「実部と三つの虚部の四平方和になること」は、感覚的には「まぁそうかもね」と思える(同様に八元数のノルムは八平方和)。事実そうなることについては、(少し面倒だが単純な)機械的計算で確かめることも可能。そもそも複素数〔あるいは四元数〕のノルムとは何か――それは「絶対値の 2 乗」で、複素数を平面上の点〔あるいは四元数を4次元空間の点〕と見た場合の、原点からの距離の 2 乗に当たる

逆数の求め方 0 以外の複素数または四元数 q が与えられたとき:
  (qq*)/(qq*) = 1 だから q × q*/(qq*) = 1
つまり q の逆数 q−1 は q*/(qq*) = q*/norm(q)

このアプローチがうまくいくのは、分母 qq* = norm(q) が正の実数になるため。複素数や四元数での割り算(一見どこから手を付けていいのか分からない)が、実数で割って逆数を求めること(簡単!)と、その逆数での掛け算(少々面倒だけど機械的な単純計算)に帰着される。全ては
  (qq*) ÷ (qq*) = 1
という当たり前の式から派生する。

52. ここまではシンプルなのだが…。最初にチラッと触れたように「四元数での割り算」は、同じ割り算といっても 2 種類の別の計算に分かれる: 0 以外の四元数 q, p が与えられたとき、
  qx = p を満たす x を求めたいのか? それとも xq = p を満たす x を求めたいのか?
この二つは別の問題

具体例として、四元数 q = 1 + 2i + 3j で割ることを考える。

〔注〕 四元数は一般には A + Bi + Cj + Dk の形だが、項が多いと計算が面倒だし、説明のための例題は簡単な方がいいので k の係数 D が 0 のケースを考える。以下でも同様に、比較的計算しやすい例を選ぶようにする。

とりあえず q の逆数を求めると:
  q* = 1 − 2i − 3j
  norm(q) = (1 + 2i + 3j)(1 − 2i − 3j) = 12 + 22 + 32 = 14
  q−1 = (1 − 2i − 3j)/14

今、四元数 p = 14 + 70k が与えられたとして、p を q で割るには p に q−1 を掛ければいい――そこまでは複素数と同じ。けれど、掛けると言っても、左から掛ければいいのだろうか、右から掛ければいいのだろうか?
  qx = p つまり (1 + 2i + 3j)x = 14 + 70k
を満たす x を求めたいなら、両辺に q−1左から掛ければ:
  q−1⋅qx = q−1p
結合法則と逆数の性質から、左辺 = q−1q⋅x = 1⋅x = x なので:
  x = q−1p  ‥‥①
が求める解である!


四元数の掛け算
ij = k しかし ji = −k
jk = i しかし kj = −i
ki = j しかし ik = −j
i2 = j2 = k2 = −1


例題の場合、逆数を(左から)掛け算すると分母を約分できて…
  x = (1 − 2i − 3j)/14⋅(14 + 70k) = (1 − 2i − 3j)(1 + 5k)
  = 1 + 5k − 2i − 10ik − 3j − 15jk
  = 1 + 5k − 2i − 10(−j) − 3j − 15i
  = 1 − 17i + 7j + 5k  ← 第一の商

〔検算〕 qx = (1 + 2i + 3j)(1 − 17i + 7j + 5k)
  = 1 − 17i + 7j + 5k + 2i − 34(−1) + 14ij + 10ik + 3j − 51ji + 21(−1) + 15jk
  = 14 − 17i + 7j + 5k + 2i + 14k − 10j + 3j + 51k + 15i = 14 + 70k = p

しかし同じ q, p でも、
  xq = p つまり x(1 + 2i + 3j) = 14 + 70k
を満たす x を求めたいなら、両辺に q−1右から掛けて:
  xq⋅q−1 = pq−1
結合法則と逆数の性質から、左辺 = x⋅qq−1 = x⋅1 = x なので:
  x = pq−1  ‥‥②
が求める解。②が①と違うことに注目!

例題の場合:
  x = (14 + 70k)⋅(1 − 2i − 3j)/14 = (1 + 5k)(1 − 2i − 3j)
  = 1 − 2i − 3j + 5k − 10ki − 15kj
  = 1 − 2i − 3j + 5k − 10j − 15(−i)
  = 1 + 13i − 13j + 5k  ← 第二の商

これは第一の商と一致しないが、次のように、検算すると合ってる。「同じ p を同じ q で割った商が2種類あって、どっちも正しんだぜ!」ってゆーのは、日常の感覚からすると、不思議な話だ…

〔検算〕 xq = (1 + 13i − 13j + 5k)(1 + 2i + 3j)
  = 1 + 2i + 3j + 13i + 26(−1) + 39ij − 13j − 26ji − 39(−1) + 5k + 10ki + 15kj
  = 14 + 2i + 3j + 13i + 39k − 13j + 26k + 5k + 10j − 15i = 14 + 70k = p

割るという計算は、逆数を掛けること。そうすると、左から逆数を掛けることを左から割ると表現でき、右から逆数を掛けることを右から割ると表現できる。四元数や八元数には「左から割る割り算」「右から割る割り算」の 2 種類の割り算がある。よく「加減乗除の四則演算」というけど、四元数・八元数には加・減・乗・左除・右除の五則演算(?)が存在している!

〔補足〕 乗法の交換法則が保証されないのだから、左乗法と右乗法も別の演算と見るべきだろう。つまり六則計算。左除は左乗の逆算、右除は右乗の逆算というわけ。

53. 八元数の割り算では、さらに微妙な問題が生じる。
  q = a0 + a1e1 + a2e2 + … + a7e7
を 0 以外の八元数とする。四元数の場合から類推すると q で左〔あるいは右〕から割ることは、q の逆数 q−1 を左〔あるいは右〕から掛けること。
  q の共役 q* = a0 − a1e1 − a2e2 − … − a7e7
  q のノルム norm(q) = a02 + a12 + a22 + … + a72
…を使って q の逆数 q−1 は q*/norm(q) となりそう。

実際 m = norm(q) = qq* は、実数の八平方和なので(そして q ≠ 0 なので 8 個の実数の全部が 0 という可能性はないので)、正の実数
  m = qq*
の両辺を 1/m 倍すると:
  m(1/m) = qq*(1/m)
この左辺は 1 に等しく、右辺については、実数を掛ける順序・掛ける向きは自由なので(1/m正の実数の逆数なので実数)、こう変形できる:
  1 = q × ((1/m)⋅q*)
すなわち q に右から (1/m)⋅q* を掛けると 1 に等しい。だからこの (1/m)⋅q* という数は、少なくとも右から掛ける逆数。実は同じ数は、左から掛ける逆数でもある:
  ((1/m)⋅q*) × q = (1/m)(q*q) = (1/m)m = 1

〔補足〕 実数を掛ける順序は自由であることと、ノルムに関する性質 norm(q) = qq* = q*q を使用(§41)。

従って (1/m)⋅q* は q の逆数 q−1 であり、この数を左から q に掛けても、右から q に掛けても、積は 1:
  q−1q = qq−1 = 1

では、例えば p を左から q で割りたい場合(つまり qx = p の解 x を求めたい場合)、どうなるか。四元数の場合と同様、
  qx = p
の両辺に左から q−1 を掛けると:
  q−1⋅qx = q−1p
もしこの左辺が x に等しいなら x = q−1p となり解 x が求まる。けれど四元数の世界でそれが容易にできたのは、結合法則 ab⋅c = a⋅bc が保証されていたから。八元数の世界では、結合法則の保証がないので、
  (♪)  q−1⋅qx と q−1q⋅x = 1⋅x = x が等しいか?
というのは、自動的に Yes と言える問題ではない。上記 (♪) の答えが Yes か No かは、八元数の割り算の理論上の大問題だ…。

右バージョンも同様の問題を持つ。 xq = p の解 x を求めたい場合、右から q−1 を掛けると:
  xq⋅q−1 = pq−1
右辺は普通に計算可能だが、結合法則が保証されないため、左辺が x に等しいのかどうか、明らかではない。

54. この壁をどう乗り越えればいいのだろう。

0 以外の実数の集合 Q は、乗法について閉じている: 任意の a, b ∈ Q に対して積 c = ab が定まり、再び Q の元となる。「a も b も 0 でないのに ab = 0 になって Q からはみ出す」といった心配は不要(これは一見、常識的に当たり前のようだが、十六元数ではその常識が成り立たない

任意の a ∈ Q を選んで固定した場合、入力 x を左〔あるいは右〕から a 倍する関数 y = f(x) = ax 〔あるいは = xa〕が定義される。 a は逆数 a−1 を持つので、入力 y を左〔あるいは右〕から a−1 倍する関数 x = g(y) = a−1x 〔あるいは = xa−1〕も定義される。関数 f も関数 g も入出力において情報を1対1に保存するという性質――入力が違えば出力も違う――を持つ。例えば、入力が x で出力が 5x という関数は、異なる入力に対しては必ず異なる出力 y = 5x を返す。そのため y が分かれば、x = (1/5)y を逆算できる。それが「y を 5 で割る」という意味。

実数に限らず、0 以外の実数・複素数・四元数・八元数は、このような性質を持つ。

この現象そのものについて、今は厳密な検討をしない。単に「上記を事実と認めた場合、どうなるか?」を考えてみたい。

以下で考える世界 Q は「0 以外の八元数の世界」かもしれないし、それ以外の何らかの世界かもしれない。例えば…
  Q = {±1, ±e1, ±e2, …, ±e7}
…という16要素の集合かもしれない。いずれにしても Q 内では、掛け算とその逆算が自由にできるものとする。つまり:
  「x に y を掛けると何になるか?」に答えられる
  → 任意の 2 元 x, y ∈ Q に対し一定の積 xy = z ∈ Q が定まる
  「x に何を掛けると z なるか?」に答えられる
  → 任意の y, z ∈ Q に対し xy = z を満たす一定の元 x ∈ Q がある
  「何に y を掛けると z なるか?」に答えられる
  → 任意の x, z ∈ Q に対し xy = z を満たす一定の元 y ∈ Q がある

要するに…

公理1 xy = z という式のうち、どれか二つの変数の値が与えられると、残りの一つの値も確定する(各変数は Q の元)。「解がない」とか「解が複数ある」といった事態は起きない。

次の(当たり前の)事柄も、ここでは公理としておく。

公理2 1 ∈ Q という元が存在して、任意の a ∈ Q に対し 1⋅a = a かつ a⋅1 = a を満たす。

最後に、もしも任意の 3 元 a, b, c ∈ Q に対して、結合法則…
   ab⋅c = a⋅bc  (★)
…を仮定するなら、Q は「群」と呼ばれるなじみ深い構造になるのだが、ここでは八元数を視野に入れているので、結合法則は保証されない。代わりに、左 Moufang 恒等式(八元数の世界でも成り立つ)を仮定しておく。

公理3 (ab)a⋅c = a⋅b(ac)

結合法則(★)とちょっと似てるけど、少し複雑で変てこな式…。

用語は著者・言語によって異なるだろうが、公理1を満たす代数系はしばしば quasigroup と呼ばれ、それに加えて公理2も満たす代数系は loop と呼ばれる。特に、公理3を満たす loop は Moufang loop と呼ばれる――八元数の例で言えば、交代代数の 0 以外の元について、足し算という演算を無視し掛け算と逆数の部分だけを見ている。この構造は群にとても近いが、結合法則が保証されないので、普通の意味での群ではない。

55. 任意の q ∈ Q に対し、公理1により xq = 1 を満たす x ∈ Qちょうど一つ存在する(公理2により 1 という元も存在)。 q ごとに定まるこのような x をここでは q で表すと、仮定により:
  qq = 1  (☆)
同様に qx = 1 を満たす x が q ごとにちょうど一つ存在するので、それを q で表すと:
  qq = 1
今、任意の q について、逆数 q と逆数 q が等しいことを証明する。

〔注〕 八元数の場合、左右どちらから掛ける逆数も等しいことを既に確かめてあるが(§53)、これを公理論的に扱うと、副産物として、八元数の割り算の「理論上の壁」(§53)を克服できる。もしも結合法則があれば、証明はたやすい。(☆)の両辺を右から q 倍して:
  (qq)q = q 結合法則により q(qq) = q
この最後の丸かっこ内は 1 に等しい。ここでは結合法則を使えないので、代わりに公理3(Moufang 恒等式)を活用する。

命題1 任意の x, q ∈ Q に対して xq⋅q = x

証明 公理3で a = q, c = q と置くと:
  (qb)q⋅q = q⋅b(qq)
右辺の丸かっこ内は 1 なので、上の等式はこう簡約される。
  (qb)q⋅q = qb
qb = x と置くと命題1の式を得る。∎

〔補足〕 任意の x と言いながら、この証明では x は qb の形に限られ q は固定されている。しかし b は任意。公理1によれば、任意の x について x = qb を満たす b が存在するから、その b を選択することで結局、任意の x を選択できる。

命題2 任意の q ∈ Q に対し qq は等しい(その等しい値を q−1 とする)。

命題1の式で x = q と置くと:
  (qq)⋅q = q ゆえに q = q
なぜなら上の左辺の丸かっこ内は 1 に等しい。∎

〔付記〕 この証明は、前記(☆)の両辺を右から q 倍した形に似ているようだが、右辺に「左」逆数が現れる点が異なる。

命題3(inverse property) 任意の q, x ∈ Q に対し、次の二つの式が成り立つ:
  (ア) q−1⋅qx = x
  (イ) xq⋅q−1 = x

証明 命題2によれば、命題1は(イ)を意味する。

公理3 (ab)a⋅c = a⋅b(ac) で a = q−1, b = q と置くと:
  (q−1q)q−1⋅c = q−1⋅q(q−1c)
左辺の丸かっこ内は 1 なので:
  q−1c = q−1⋅q(q−1c)
q−1c = x と置くと(ア)を得る。∎

上述の公理系(Moufang loop)では結合法則 ab⋅c = a⋅bc は一般には成り立たないけれど、特例として、a または c が b の逆数の場合には、(ア)(イ)の形の結合法則が成り立つ: a = q−1 が b = q の逆数で c = x なら:
  (ア)から q−1⋅qx = x = 1⋅x = q−1q⋅x
あるいは c = q−1 が b = q の逆数で a = x なら:
  (イ)から xq⋅q−1 = x = x⋅1 = x⋅qq−1
これらによって、理論的問題 (♪) とその右バージョン(§53参照)は、肯定的に解決される: 八元数の世界でも、単に左〔あるいは右〕から逆数を掛けることで、左〔あるいは右〕からの割り算ができるッ!

もっとも「上述の公理系では」という条件がある。八元数の世界が本当に Moufang loop なのか?というのは別問題。「inverse property」には、まだ決まった日本語訳がないようだ。「逆元が限定的な結合法則を満たす」という性質なので「逆元結合性」あたりが妥当な線だろう(例: inverse property loop=「逆元結合ループ」)。

56. 命題3(inverse property)を利用すると、公理3(左 Moufang 恒等式)から、その鏡像の右 Moufang 恒等式、および中間 Moufang 恒等式を導ける(つまり「左」だけ仮定すれば、そこから「右」と「中間」は証明可能)。以下その手順を記す。

命題4(積の逆数) 任意の 2 元 a, b ∈ Q について (ab)−1 = b−1a−1

証明 (イ)から a = (ab)b−1
両辺に (ab)−1 を左から掛けて:
  (ab)−1a = (ab)−1⋅(ab)b−1
命題3(ア)によって〔q = (ab), x = b−1 と考えると〕、右辺の (ab)−1⋅(ab) は消滅:
  (ab)−1a = b−1
この両辺に a−1 を右から掛けて:
  (ab)−1a⋅a−1 = b−1a−1
命題3(イ)によって〔x = (ab)−1, q = a と考えると〕、左辺の a⋅a−1 は消滅:
  (ab)−1 = b−1a−1 ∎

命題5(逆数の逆数) 任意の x ∈ Q について (x−1)−1 = x

〔注〕 「逆数の逆数は元の数」という直観的に当たり前の性質(裏の裏は表)。

証明 逆数の定義から 1 = x−1x。この両辺に (x−1)−1 を左から掛けると:
  (x−1)−1⋅1 = (x−1)−1⋅x−1x
この左辺は (x−1)−1 に等しく、右辺は q = x−1 と置くと q−1⋅qx なので、命題3(ア)から x に等しい。つまり…
  (x−1)−1 = x
…となる。∎

命題5の系  任意の p, x ∈ Q に対し、次の二つの式が成り立つ:
  (ア) p⋅p−1x = x
  (イ) xp−1⋅p = x

証明 命題3(ア)(イ)で q = p−1 と置くと、命題5から q−1 = (p−1)−1 = p なので、上記(ア)(イ)を得る。∎

命題6(右 Moufang 恒等式) 任意の 3 元 a, b, c ∈ Q に対して:
  c⋅a(ba) = (ca)b⋅a

証明 任意の A, B, C ∈ Q に対し公理3から:
  (AB)A⋅C = A⋅B(AC)
両辺の逆数を取ると:
  [(AB)A⋅C]−1 = [A⋅B(AC)]−1
u = (AB)A, v = B(AC) と置いて、上の左辺・右辺にそれぞれ命題4を適用すると:
  (uC)−1 = (Av)−1 従って C−1u−1 = v−1A−1
  変数 u, v を元に戻して C−1[(AB)A]−1 = [B(AC)]−1A−1
同様に w = AB, x = AC と置いて命題4を適用すると:
  C−1⋅A−1(AB)−1 = (AC)−1B−1⋅A−1
  再び命題4から C−1⋅A−1(B−1A−1) = (C−1A−1)B−1⋅A−1
A−1, B−1, C−1 をそれぞれ a, b, c と書くと:
  c⋅a(ba) = (ca)b⋅a ☆☆

A, B, C と a = A−1, b = B−1, c = C−1 は、それぞれ互いに逆数。 A, B, C は任意なので、どんな a, b, c ∈ Q が与えられても、それぞれの逆数を A, B, C とすることができ、☆☆ は任意の a, b, c に対し有効。∎

† 与えられた任意の a = A−1 に対し a−1 = (A−1)−1 = A を選択できる(命題5参照)。 b, c についても同様。

命題7(回遊法則) 任意の a, b ∈ Q について ab⋅a = a⋅ba

証明 公理3 (ab)a⋅c = a⋅b(ac) で c = 1 と置くだけ。∎

命題8(中間 Moufang 恒等式) 任意の a, b, c ∈ Q について次の二つの式が成り立つ。
  a(bc)⋅a = ab⋅ca そして a⋅(bc)a = ab⋅ca

証明 命題5の系(ア)から c = a⋅a−1c。自明な等式 a⋅bc = a⋅bc の右辺の c に、これを代入:
  a⋅bc = a⋅b(a⋅a−1c)
この右辺は、回文的な積 aba と第 4 の因子 X = a−1c の完全逆方向の結合なので、公理3(左 Moufang)から:
  a⋅bc = a⋅b(aX) = (ab⋅a)X ただし X = a−1c
両辺を右から a 倍:
  a(bc)⋅a = (ab⋅a)X⋅a
この右辺は、因子 ab と回文的な積 aXa の完全順方向の結合なので、命題6(右 Moufang)から:
  a(bc)⋅a = ab⋅a(Xa) = ab⋅(aX)a
最後の等号は命題7(回遊法則)による。変数 X の定義と、命題5の系(ア)から aX = a⋅a−1c = c なので、これを上の式に代入して:
  a(bc)⋅a = ab⋅ca
命題8の第1式が得られた。第2式を得るには、第1式左辺に〔積 (bc) を一つの因子と見て〕回遊法則を適用すればいい。∎

「右 ⇒ 中間 Moufang」については既に §48 で結合子を使って証明済みだが、逆数を利用する上記の別証明には含蓄がある。証明を完成させる途中で、便利そうな補助命題もいろいろ得られた。「逆数を利用する」という手法そのものも、応用範囲が広そう。

〔参考文献〕 G. Bol: Gewebe und Gruppen (417ページ脚注5)
https://www.digizeitschriften.de/download/pdf/235181684_0114/log29.pdf

57. 交代代数の世界では、任意の x, y, A について、次の性質が成り立つ(§47)。
  (I) 左 Moufang 恒等式 [(xy)x]A = x[y(xA)] 略して (xy)x⋅A = x⋅y(xA)
  (II) 右 Moufang 恒等式 A[x(yx)] = [(Ax)y]x 略して A⋅x(yx) = (Ax)y⋅x
それを使って、次の性質も証明される(§48):
  (III) 中間 Moufang 恒等式 [A(xy)]A = (Ax)(yA) 略して A(xy)⋅A = Ax⋅yA
  (IV) 中間 Moufang 恒等式 A[(xy)A] = (Ax)(yA) 略して A⋅(xy)A = Ax⋅yA

〔補足〕 「略して」の表記では、「結合の優先度が高い場所をかっこ () でくくる」という通常の書き方に加え、「結合の優先度が低い場所を点 ⋅ で切り離す」というオプションを利用する。このオプションを併用すると、かっこの数が大幅に減って、式がすっきりする。略し方は、一般に複数存在する。例えば ((xy)x)A を (xy)x⋅A と略すこともできるし (xy⋅x)A と略すこともできる(どっちでも意味は同じ)。

§47 以下の証明は、次の性質に基づくものだった:
  ① 左・交代法則 (xx)y = x(xy) 略して x2y = x⋅xy
  ② 右・交代法則 x(yy) = (xy)y 略して xy2 = xy⋅y
  ③ 回遊法則 (xy)x = x(yx) 略して xy⋅x = x⋅yx

ただし①②③のうち、どれか二つを仮定すれば、自動的に残りの一つも成り立つ(§30)。特に、①②を仮定すれば③は自動的に出てくるので(§27)――そして③が成り立つ場合には (III) と (IV) は同値なので――、総括としては、①②を仮定すれば (I) (II) (III) (IV) が証明される。つまり、左と右の交代性は(3種類の)Moufang 恒等式を含意する。何か錯覚してるかもしれないけど、ここまでの観察からはそう思える…。

逆に (I) で y = 1 と置くと xx⋅A = x⋅xA となるが、これは①を意味する(A は任意の元なので、A をあらためて y と置くことができる)。一方 (I) で A = 1 と置くと xy⋅x = x⋅yx となって③が出る。①②③のうち、どれか二つを仮定すれば残りの一つも成り立つのだから、結局 (I) ⇒ ①③ ⇒ ①②③ となって、(I) を仮定するだけで、証明に必要な全部の前提が満たされ (I) ⇒ (II) (III) (IV) となる。これについては、前節でも検討した(命題6・命題8)。

〔注意〕 厳密に言うと、「1 と置くと…」という議論のためには「乗法単位元 1 の存在」を保証する必要がある(§54・公理2参照)。

同様に (II) で y = 1 と置くと②が出て、(II) で A = 1 と置くと③が出るので、(II) ⇒ ②③ ⇒ ①②③ となり、(II) だけを仮定しても、証明に必要な全部の前提が満たされ (II) ⇒ (I) (III) (IV) となる。要するに (I) あるいは (II) は、どちらか一つだけで (I) (II) (III) (IV) の全部を含意。

他方 (III) で x = 1 と置くと Ay⋅A = A⋅yA となるが、これは③と同じ意味。中間 Moufang 恒等式として (III) の代わりに (IV) を選択した場合も、y = 1 と置けば同じ結論になる。つまり (III) ⇒ ③、(IV) ⇒ ③ が成立し、どちらの中間 Moufang も回遊法則を含意する。 (III) あるいは (IV) からそれ以上の何かが言えるだろうか?

実は (III) または (IV) を仮定するだけでも (I) (II) (III) (IV) が成り立つ! (I) ⇔ (II) ⇔ (III) ⇔ (IV) の同値性は驚嘆すべき事実だ。今回は、そのうち (I) ⇔ (II) ⇒ (III) ⇔ (IV) について、交代子を介在させない直接的な証明を紹介した。 (I) ⇐ (II) は明示していないが、(I) ⇒ (II) と同様、両辺の逆数を考えるだけ(命題6参照)。(III) ⇔ (IV) は回遊法則から明らか。 (III) または (IV) を仮定して (I) または (II) を導くことができれば、3種類の Moufang 恒等式の同値性が確定する。近々探検したい。

⁂

2024-01-17 Moufang 恒等式の同値性 初等的証明

#数論 #FairyGlass #八元数 #抽象代数

Easy proof that the four Moufang identities are equivalent, without using the notion of autotopism (autotopy). L-Mouf ⇒ R-Mouf is simple (命題6, where 命題 means “proposition”); the converse will be similar. For L-Mouf ⇒ M-Mouf, see 命題8. A short, elementary proof of M-Mouf ⇒ R-Mouf follows. Although essentially the same as Bruck’s autotopism-based argument (rewritten without using autotopisms), this seems to be the first elementary proof available online that M-Mouf implies L- and R-Mouf. We wrote these notes in January, 2024, in such a way that anyone might follow every single step easily, even if knowing nothing about group theory or loop theory. It should be also noted that, contrary to what is said by some authors, L- or R-Bol alone is not equivalent to the Moufang identities, since it does not imply flexibility by itself.

四つの Moufang 恒等式のどれか一つが成り立てば、残りの三つも成り立つ。その証明では、従来 autotopism (autotopy) という概念が使われ、初学者には敷居が高かった。このメモでは「autotopism を使わない簡潔な証明」を記す。付録として autotopism の意味と、それを使った従来の証明法も紹介。

*

58. 前回、4種の Moufang 恒等式について、左 ⇒ 右(命題6)と、左 ⇒ 中間(命題8)を証明した。右 Moufang の両辺の逆数を考えれば、命題6と全く同様に左 Moufang が出るので、実質、
  左 ⇔ 右 ⇒ 中間
が証明済み。中間 Moufang を仮定して、左または右 Moufang を導けば、「四つの Moufang 恒等式の同値性」の証明が完了する。

命題9(中間 ⇒ 右 Moufang) 中間 Moufang 恒等式…
  a(bc)⋅a = ab⋅ca もしくは a⋅(bc)a = ab⋅ca
…の一方が成り立つなら他方も成り立ち、さらに右 Moufang 恒等式 c⋅a(ba) = (ca)b⋅a も成り立つ。

証明 命題9の第1式を仮定し b = 1 と置くと ac⋅a = a⋅ca を得る。第2式を仮定し c = 1 と置くと a⋅ba = ab⋅a を得る。つまり、どちらの場合も、回遊法則が成立。 bc を一つの文字と見て回遊法則を適用すると…
  a(bc)⋅a = a⋅(bc)a
…なので、第1式・第2式の左辺は等しい。右辺はもともと同じだから、二つの中間 Moufang 恒等式は同値。

便宜上、文字 b, c の代わりに x, y を使い、命題9の第2式をこう書くことにする:
  a[(xy)a] = ax⋅ya
その両辺を ax で左から割ると(つまり左から (ax)−1 倍すると):
  (ax)−1⋅a[(xy)a] = ya
右辺で命題3(ア)を使った。左辺で命題4を使うと:
  (x−1a−1)⋅a[(xy)a] = ya  『

『は』を簡潔にするため、こう置くことにする:
  x−1a−1 = c  『
  xy = b  『
『ひ』の両辺を右から a 倍し、命題5の系(イ)を使うと:
  x−1a−1⋅a = ca つまり x−1 = ca  ‥‥(*)
『ふ』の両辺を左から x−1 倍し、命題3(ア)を使うと:
  x−1⋅xy = x−1b つまり y = x−1b
そこに(*)を代入して:
  y = (ca)b  『
『ひ』『ふ』を『は』左辺に、『へ』を『は』右辺に代入して、
  c⋅a(ba) = (ca)b⋅a
を得る。∎

4種の Moufang 恒等式の同値性が確立した。

59. (付録) autotopism を使った伝統的証明: 以下で「写像」という語は、事実上「関数」と同じ意味。


(コメント)
同型写像とは??
入力を個々に変換して
「向こう」で演算を
やっても…
「こっち」で演算して
結果を変換しても…
どっちでも同じ!

…になる1対1対応


集合 G から集合 H への、1対1対応(※1)の写像 f は、もし次の性質を持つなら、isomorphism(同型写像)と呼ばれる(※2):
  任意の x, y ∈ G について f(x) oH f(y) = f(x oG y)  『
ここで oHoG は、それぞれ HG における演算。形式張らず、これを普通に積として書けば:
  f(x) f(y) = f(xy)
特に G = H の場合(つまり、ある集合からその集合自身への同型写像)を automorphism(自己同型写像)という。

(※1) G を定義域、H を値域として、前者と後者の全部の元が1対1。

(※2) 「同型」は「同形」とも表記。

〔補足〕 絶対値やノルムも上と同じ形の関係を満たすが、1対1対応していない(例: −2 の絶対値も +2 の絶対値も 2)。従って、同型写像ではない。

isomorphism と automorphism の概念は、さまざまな代数構造に適用される。以下では主に loop について考える―― loop とは「群に近いが、結合法則が保証されていない世界」(§54参照)。

式『ほ』では、同じ f という双射そうしゃ(=1対1対応)が 3 回使われている。一種の拡張として、これを次のように、G から H への三つの双射 U, V, W に置き換える:
  任意の x, y ∈ G について U(x) oH V(y) = W(x oG y)
この性質を持つ三重対 (U, V, W) を isotopy と呼び、特に G = H の場合の isotopy を autotopy または autotopism と呼ぶ。もし U = V = W なら同型写像ないし自己同型写像と同じことだが、一般には U = V = W とは限らない。

〔例〕 G を「0 を除く実数全体」の集合、あるいは「八元数の基底(=実数の単位 1 と七つの虚数単位)と、それらの −1 倍」から成る集合 {±1, ±e1, ±e2, … , ±e8} とし、掛け算という演算を考える(前者は群の例、後者は群ではない例; どちらも loop である)。 G から G への三つの写像
  U(p) = ap, V(p) = pa, W(p) = ap⋅a ここで a ∈ G は定数、p ∈ G は変数
を使うと、中間 Moufang 恒等式
  ax⋅ya = a(xy)⋅a
をこう表現できる:
  U(x) V(y) = W(xy)
従って (U, V, W) は autotopism。実際、U, V, W は双射。1対1対応であることは次の通り。 q = U(p) = ap において、a は定数なので、公理1から、任意の入力 p ∈ G に対し出力 q ∈ G がちょうど一つ定まり、逆に、任意の q ∈ G に対し、それが出力となるような入力 p ∈ G がちょうど一つ定まる。 V, W についても同様(W の任意の出力 q について、それに対応する ap の値が――そしてそれに対応する p の値が――ちょうど一つ定まる)。

isotopy と autotopism (autotopy) は、それぞれ isomorphism と automorphism と似ているが、一つではなく三つの写像を使って「同型写像風の変換」を表す。

あまり一般的な話題ではなく、日本語で正式には何と呼ばれるのか不明。物理学で isotope は「同位体」と訳されるので、それを流用するなら「同位変換」「自己同位変換」などと表現可能。単に「アイソトピー」「自己アイソトピー」などと呼んでもいいかもしれない。意訳すると「同型てい」(アイソトピー)、「準同型鼎」(ホモトピー)、等々。「鼎」は「三重対」の意味を伝えつつ topy の t を音写する。 topos(場所)の意味も残したければ「鼎座」でもいい。「座」は「射」と韻を踏む。

命題3(ア)(イ)両方の性質を持つ loop は inverse property loop 略して I.P. loop と呼ばれる。次が成り立つ。

補題(Bruck [3], Lemma 4A) G を I.P. loop とする。 G において (U, V, W) が autotopism なら (W, J ∘ V ∘ J, U) も autotopism で、(J ∘ U ∘ J, W, V) も autotopism である。ここで J(p) = p−1 は逆元を返す写像。小さな白丸 ∘ は次の例のように、関数の合成を表す(p ∈ G):
  (J ∘ V)(p) = J(V(p)) = (V(p))−1
  (J ∘ V ∘ J)(p) = J(V(J(p))) = (V(p−1))−1

〔注意〕 Bruck の原論文では、例えば関数 V(y) が逆さまに yV で表され、(J ∘ V)(y) = J(V(y)) の代わりに yVJ と記されている。どちらの記法でも、変数 y がまず関数 V の入力となり、その出力が関数 J の入力となる: yVJ のような表記の場合、合成関数が左から右の順序で適用される。このメモでは白丸表記を使い(便宜上、この記号を after と読むと分かりやすい)、合成関数は右から左に適用されるものとする。 (V(p))−1 は関数の値 V(p) の逆数; 逆関数 V−1(p) ではない。

証明 仮定により、任意の x, y ∈ G に対し:
  U(x) V(y) = W(xy)  『
両辺に右から (V(y))−1 = (J ∘ V)(y) を掛けると:
  U(x) = W(xy) (J ∘ V)(y)  『
X = xy, Y = y−1 と置くと:
  前者から x = Xy−1 = XY
  後者から y = Y−1 = J(Y)
これらを『み』に代入して:
  U(XY) = W(XY⋅Y−1) (J ∘ V)(J(Y))
  つまり W(X) (J ∘ V ∘ J)(Y) = U(XY)
この最後の式は f(x) g(y) = h(xy) の形式なので、定義により (W, J ∘ V ∘ J, U) は autotopism。

同様に、『ま』の両辺に左から (U(x))−1 = (J ∘ U)(x) を掛けると:
  V(y) = (J ∘ U)(x) W(xy)
X = x−1, Y = xy と置くと x = X−1 = J(X), y = x−1Y = XY。上の式に代入して:
  V(XY) = (J ∘ U)(J(X)) W(X−1⋅XY)
  つまり (J ∘ U ∘ J)(X) W(Y) = V(XY)
定義により (J ∘ U ∘ J, W, V) は autotopism。∎

今、この補題を使い、中間 Moufang ⇒ 右 Moufang を再証明する。

U(p) = ap, V(p) = pa, W(p) = ap⋅a として、中間 Moufang 恒等式 ax⋅ya = a(xy)⋅a を U(x) V(y) = W(xy) と書くと (U, V, W) は autotopism である(§59〔例〕参照)。補題により
  (J ∘ U ∘ J, W, V)
も autotopism であり、次が成り立つ:
  (J ∘ U ∘ J)(x) W(y) = V(xy)
  つまり (ax−1)−1 (ay⋅a) = xy⋅a
整理すると (xa−1)⋅(ay)a = xy⋅a。ここで x = ca, y = b と置くと:
  c⋅(ab)a = (ca)b⋅a 回遊法則から c⋅a(ba) = (ca)b⋅a
右 Moufang が得られた。∎

*

ドイツ人女性 Ruth Moufang は1934年(1935年出版)、非結合的な代数構造についての研究論文 [1] において、今でいう Moufang 恒等式などに着目。「Moufang 恒等式」「Moufang loop」といった用語は、この先駆的研究者の名にちなむ。当時のナチス政権(1933年台頭)が男性優位主義だったため、Moufang は才能があるのに、数学への貢献に適した地位に就けず、苦労したという。

オランダの Gerrit Bol は1936年(1937年出版)、上記論文に言及し、左 Moufang ⇒ 中間 Moufang を指摘した [2]。その逆は、米国の Richard Hubert Bruck [3] によって1944年(1946年出版)に証明された(§59): autotopism を使うと、補題の系として 3 行ほどで証明が完了し、エレガント。これに限らず autotopism は有用なツールと認められ、Moufang 恒等式の同値性の証明では autotopism を使うのが通例となっているようだ。けれど、この証明だけのために autotopism を導入するのは、大げさで回りくどい。 §58 では autotopism を経由する部分を直接具体的に書くことで、議論を簡単化した。

〔参考文献〕
[1] Ruth Moufang: Zur Struktur von Alternativkörpern
https://gdz.sub.uni-goettingen.de/download/pdf/PPN235181684_0110/LOG_0027.pdf
[2] G. Bol: Gewebe und Gruppen
https://gdz.sub.uni-goettingen.de/download/pdf/PPN235181684_0114/LOG_0029.pdf
[3] R. H. Bruck: Contributions to the theory of loops
https://www.ams.org/journals/tran/1946-060-00/S0002-9947-1946-0017288-3/S0002-9947-1946-0017288-3.pdf

⁂


<メールアドレス>