まだ生成AIでトロピカル演算が得意なのが無いが、意味は分かった。
なるほどね、確かに幾何的に解くんだな。イメージできた。
ひょっとするとClaudeは直接に解いてくれちゃうかもしれないが。
どうするか、ゲーム理論の時みたいにMathematicaのコードを書いてもらおうかな。
P10の例1.2.4
意味はこうだ。
頑張ったが、どの生成AIでもトロピカル幾何学を用いて直接には解いてくれなかった。でも、解説のおかげで問題のイメージは掴めた。
これは意図に反して初等的に解いてるけど意味は分かりやすい。
これはつまり、今まではPythonの特殊なパッケージ(PuLPとか)を入れないと解けなかった問題が、そのままdefで定義したルーチンだけで動く事になる。実際、現場のPCだとpipが通じなくてかなり面倒な事があって…
Mathematicaで解くのも少し癖が有る。
12x1^5x2^7 で x1^5x2^7 の係数が 12 なので
答えは12
(*トロピカル演算の定義*)tropicalPlus[x_, y_] := Min[x, y]
tropicalTimes[x_, y_] := x + y
(*初期多項式の定義*)
p = 2 x[1]^4 + 5 x[1]^3 x[2] + 11 x[1]^2 x[2]^2 + 7 x[1] x[2]^3 +
3 x[2]^4
(*多項式からリスト形式への変換関数*)
toTermList[poly_] := CoefficientRules[poly, {x[1], x[2]}]
(*リスト形式から多項式への変換関数*)
toPoly[rules_] :=
Sum[rules[[i, 2]] x[1]^(rules[[i, 1, 1]]) x[
2]^(rules[[i, 1, 2]]), {i, Length[rules]}]
(*トロピカル乗算の実装*)
tropicalProduct[p1_, p2_] :=
Module[{terms1 = toTermList[p1], terms2 = toTermList[p2],
result},(*全ての項の組み合わせに対してトロピカル乗算を適用*)
result =
Flatten[Table[{terms1[[i, 1]] + terms2[[j, 1]],
tropicalTimes[terms1[[i, 2]], terms2[[j, 2]]]}, {i,
Length[terms1]}, {j, Length[terms2]}], 1];
(*同じ指数を持つ項をグループ化して最小値を取る*)
result = GroupBy[result, First -> Last, Min];
(*結果を多項式形式に変換*)toPoly[Normal[result]]]
(*p\[CircleTimes]p の計算*)
p2 = tropicalProduct[p, p]
(*p\[CircleTimes]p\[CircleTimes]p の計算*)
p3 = tropicalProduct[p, p2]
(*結果の表示*)
Print["p\[CircleTimes]p\[CircleTimes]p の結果:"];
Print[p3]