わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

3つの数のかけ算を,無向グラフできれいに表示したい

 『東大の先生! 文系の私に超わかりやすく算数を教えてください!』のp.109には,交換法則の説明と,等式が書かれています.
 等式は,2つの文字の間では「A×B=B×A」,3つの文字の間では「(A×B)×C=C×(B×A)〔ここで改行〕=C×(A×B)」です.
 3つの異なる文字(または数)のかけ算は,(A×B)×CとA×(B×C)を異なる式と考えると,全部で12個あります.「異なる式」と書きましたが,それらは乗法の交換法則と結合法則により,等号で結ばれます.
 12個の式のあいだで,交換法則・結合法則が適用できる式を結んで有向グラフを描くことは,2016年に実施していました.

それから,少し修正して,Graphvizの入力となるDOTファイルを生成してみました.変換プログラムとDOTファイルは非公開とします.因数の数が3で,(ab)cの式を起点としたとき,交換法則・結合法則を適用して得られる式の関係は以下のようになります.

 しかし12個の式が,きれいに配置されていません.これについて,dotコマンドで試行錯誤してみると,-Kcircoというオプションによる"circular layout"*1が分かりやすい表示に見えました.
 2016年のときは「(ab)c」を起点としていましたが,冒頭の本の「(A×B)×C」に対応しますし,これを他の(3つの文字の)かけ算の式と区別する必要はありません.dotファイル(ABC.dot)は次のようになりました.

graph abc {
  node [fontsize="25pt"];

  AB_C [label="(A×B)×C"];
  BA_C [label="(B×A)×C"];
  C_BA [label="C×(B×A)"];
  C_AB [label="C×(A×B)"];

  BC_A [label="(B×C)×A"];
  CB_A [label="(C×B)×A"];
  A_CB [label="A×(C×B)"];
  A_BC [label="A×(B×C)"];

  CA_B [label="(C×A)×B"];
  AC_B [label="(A×C)×B"];
  B_AC [label="B×(A×C)"];
  B_CA [label="B×(C×A)"];

  AB_C -- BA_C [color = blue];
  C_BA -- C_AB [color = blue];
  AB_C -- C_AB [color = blue];
  BA_C -- C_BA [color = blue];

  BC_A -- CB_A [color = blue];
  A_CB -- A_BC [color = blue];
  BC_A -- A_BC [color = blue];
  CB_A -- A_CB [color = blue];

  CA_B -- AC_B [color = blue];
  B_AC -- B_CA [color = blue];
  CA_B -- B_CA [color = blue];
  AC_B -- B_AC [color = blue];

  AB_C -- A_BC [color = red];
  BC_A -- B_CA [color = red];
  CA_B -- C_AB [color = red];

  CB_A -- C_BA [color = red];
  BA_C -- B_AC [color = red];
  AC_B -- A_CB [color = red];
}

 dotコマンドが利用可能な環境で,dot -Kcirco -Tsvg ABC.dot > ABC.svgを実行し,ABC.svgをブラウザで見ると…

 美しい表示ではありません.上記のABC.dotの各ノードやエッジの行を入れ替えても,表示は変わりません.今日はここまで.