$$\newcommand{A}[0]{\mathbb{A}}
\newcommand{abs}[1]{\left \lvert #1 \right \rvert}
\newcommand{acts}[0]{\curvearrowright}
\newcommand{Alt}[0]{Alt}
\newcommand{aut}[0]{Aut}
\newcommand{B}[0]{\mathbb{B}}
\newcommand{bfsubsection}[1]{\subsection*{\textbf{#1}}}
\newcommand{bmat}[1]{\begin{bmatrix}#1\end{bmatrix}}
\newcommand{C}[0]{\mathbb{C}}
\newcommand{card}[1]{\left|#1\right|}
\newcommand{ceil}[1]{\left\lceil#1\right\rceil}
\newcommand{ch}[0]{ch}
\newcommand{cl}[0]{Cl}
\newcommand{codim}[0]{codim}
\newcommand{coker}[0]{Coker}
\newcommand{Cx}[0]{\mathbb{C}^{\times}}
\newcommand{defiff}[0]{\mathrel{\overset{\text{def}}{\iff}}}
\newcommand{diag}[0]{diag}
\newcommand{diff}[2]{\frac{d#1}{d#2}}
\newcommand{dint}[0]{\displaystyle\int}
\newcommand{dprod}[0]{\displaystyle\prod}
\newcommand{dsum}[0]{\displaystyle\sum}
\newcommand{End}[0]{End}
\newcommand{F}[0]{\mathbb{F}}
\newcommand{floor}[1]{\left\lfloor#1\right\rfloor}
\newcommand{gal}[0]{\mathrm{Gal}}
\newcommand{GL}[0]{\mathrm{GL}}
\newcommand{gl}[0]{\operatorname{GL}}
\newcommand{H}[0]{\mathbb{H}}
\newcommand{Hom}[0]{Hom}
\newcommand{I}[0]{\sqrt{-1}}
\newcommand{id}[0]{id}
\newcommand{im}[0]{\operatorname{Im}}
\newcommand{ind}[0]{ind}
\newcommand{inprod}[2]{\langle #1 , #2 \rangle}
\newcommand{inv}[1]{#1^{-1}}
\newcommand{iu}[0]{\sqrt{-1}}
\newcommand{K}[0]{\mathbb{K}}
\newcommand{ker}[0]{\operatorname{Ker}}
\newcommand{leftmapsto}[0]{\leftarrow\!\shortmid}
\newcommand{M}[0]{\mathbb{M}}
\newcommand{Map}[0]{Map}
\newcommand{mapdisplay}[1]{\begin{array}{r@{\,\,}c@{\,\,}c@{\,\,}c}#1\colon&\longrightarrow\\ &\rotatebox{90}{$\in$}&&\rotatebox{90}{$\in$}\\ &\longmapsto \end{array}}
\newcommand{mc}[0]{\mathcal}
\newcommand{mf}[1]{\mathfrak{#1}}
\newcommand{Mp}[0]{Mp}
\newcommand{N}[0]{\mathbb{N}}
\newcommand{norm}[1]{\left \lVert #1 \right \rVert}
\newcommand{O}[0]{\mathcal{O}}
\newcommand{ord}[0]{ord}
\newcommand{ord}[0]{\mathrm{ord}}
\newcommand{P}[0]{\mathbb{P}}
\newcommand{pdiff}[2]{\frac{\partial #1}{\partial #2}}
\newcommand{pf}[0]{pf}
\newcommand{PGL}[0]{\mathrm{PGL}}
\newcommand{pmat}[1]{\begin{pmatrix}#1\end{pmatrix}}
\newcommand{PSL}[0]{\mathrm{PSL}}
\newcommand{Q}[0]{\mathbb{Q}}
\newcommand{R}[0]{\mathbb{R}}
\newcommand{rank}[0]{rank}
\newcommand{re}[0]{\operatorname{Re}}
\newcommand{relmiddle}[1]{\mathrel{}\middle#1\mathrel{}}
\newcommand{res}[0]{res}
\newcommand{Res}[0]{Res}
\newcommand{restrict}[2]{\left. #1 \right|_{#2}}
\newcommand{rk}[0]{rk}
\newcommand{set}[2]{\left\{ #1 \mathrel{} \middle| \mathrel{} #2 \right\}}
\newcommand{sgn}[0]{sgn}
\newcommand{single}[0]{\{ 0 \}}
\newcommand{SL}[0]{\mathrm{SL}}
\newcommand{sl}[0]{\operatorname{SL}}
\newcommand{smat}[1]{\bigl(\begin{smallmatrix}#1\end{smallmatrix}\bigr)}
\newcommand{SO}[0]{SO}
\newcommand{Sp}[0]{Sp}
\newcommand{spec}[0]{Spec}
\newcommand{spl}[0]{Spl}
\newcommand{stab}[0]{Stab}
\newcommand{supp}[0]{supp}
\newcommand{Supp}[0]{Supp}
\newcommand{Sym}[0]{Sym}
\newcommand{T}[0]{\mathbb{T}}
\newcommand{textblue}[1]{\textcolor{blue}{\textbf{#1}}}
\newcommand{tr}[0]{tr}
\newcommand{Tr}[0]{Tr}
\newcommand{transpose}[1]{\, {\vphantom{#1}}^t\!{#1}}
\newcommand{vmat}[1]{\begin{vmatrix}#1\end{vmatrix}}
\newcommand{vol}[0]{vol}
\newcommand{Z}[0]{\mathbb{Z}}
$$
SageMathとは?
SageMathは主に整数論と代数幾何に強い,高度な純粋数学の計算を担ってくれる素晴らしい計算機です.狭義の代数学(群,環,体,線型代数,ホモロジー代数etc)はもちろん標準的な代数トポロジーや微分幾何の計算をすることも出来ます.現在では多くの論文でその活躍を目にすることが出来ます.
特徴として既存の他のソフト(Pari/GP, GAP, Singularなど)を統一してPythonの記法で使えることが挙げられます.
以下のurlからブラウザ上で使えます:
https://sagecell.sagemath.org/
ユーザーマニュアルは以下から見れます.
https://doc.sagemath.org/html/en/reference/index.html
SageMathの圧倒的利点
何と言っても出力結果が見やすい!!!.これがまず筆者が感じた第一のメリットです.
整数論で有名な計算ソフトにPari/GPがあります.例えば素イデアル分解に対してこれらの入出力の様子を比較してみましょう.
二次体$\Q(\sqrt{-47})$においてイデアル$I=(13+\sqrt{-47})$を素イデアル分解せよ.
入力
? bnf=bnfinit(x^2+47)
? idealfactor(bnf,13+x)
入力は比較的わかりやすいですね(bnfはbig number fieldの略です).では出力はどうでしょうか?
出力
[[2,[-1,1]~,1,1,[0,-12;1,-1]],2;[2,[2,1]~,1,1,[1,-12;1,0]],1;[3,[2,2]~,1,1,[0,12;-1,1]],3]
これを見て求めたい素イデアル分解がなんなのかパッと見ででわかるでしょうか?私はわかりません.
(これの読み方についてはこちらの知恵袋のやり取り
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11189888121
をご覧ください.読み取りに苦戦している様子が伺えます.
また,そもそもイデアルの入力から苦戦している様子もありました
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10190035725
.素イデアル分解をした結果を掛け算して元のイデアルに戻るかという単純な確認作業をするのにここまで苦労していては大変ストレスでしょう.)
次にSageMathで同じ計算をしてみましょう
入力
x = polygen(ZZ)
K.<a> = NumberField(x^2+47,'a')
I = K.ideal(13+a)
factor(I)
出力は
(Fractional ideal (2, 1/2*a - 1/2)) * (Fractional ideal (2, 1/2*a + 1/2))^2 * (Fractional ideal (3, 1/2*a + 1/2))^3
自然言語で解説してくれています!!!なんとわかりやすいのでしょう.Fractional ideal (2, 1/2*a - 1/2)というのはつまり$2$と$1/2*a - 1/2$で生成される($K=\Q(\sqrt{-47})$の)分数イデアルということですね.
Latexのコードで出力することもやってくれます!.「latex(出力したいもの)」と打つだけです!
例えば直前の例だと
x = polygen(ZZ)
K.<a> = NumberField(x^2+47,'a')
I = K.ideal(13+a)
F=factor(I)
latex(F)
と打つと
(\left(2, \frac{1}{2} a - \frac{1}{2}\right)) \cdot (\left(2, \frac{1}{2} a + \frac{1}{2}\right))^{2} \cdot (\left(3, \frac{1}{2} a + \frac{1}{2}\right))^{3}
と出力してくれます.これをそのままコピペしてドルで囲むと
$(\left(2, \frac{1}{2} a - \frac{1}{2}\right)) \cdot (\left(2, \frac{1}{2} a + \frac{1}{2}\right))^{2} \cdot (\left(3, \frac{1}{2} a + \frac{1}{2}\right))^{3}$
となります.
Python記法なのでChatGPTに色々聞ける
これは中々強いです.コードを書かせることはもちろん,一般的なPythonで扱える範疇の質問ならきっと満足行く回答が得られるでしょう.
例えば上の素イデアル分解の例において二番目の素因子だけを取り出すコードを聞いてみたのが次です:
https://chat.openai.com/share/2ad09cbb-6704-41f6-8ebd-768d2b75e504
factor(I)の後ろに[1]をつけろと言っていますね.
factor(I)の出力結果はリストと呼ばれる型なのでそれの$i$番目の要素を取り出すには[i-1]などとつけてあげればよいということです.これはPythonの一般論なのでプログラミングに強い方にとっては当たり前のことと思いますがコンピュータに強いとは全く限らない一般数学徒にはこのような基礎的なことをじゃんじゃん聞けるというのはとてもありがたいのではないでしょうか.
質問フォーラムの存在
ChatGPTに聞いても解決しないときもあると思います。そういうときに助かるのがSageMath専用の質問サイト
AskSage
です。アカウント登録すればすぐ使えるようになります。筆者も何回かお世話になっています。そもそもGoogle検索する段階でこのサイト名を入れて一緒に検索するというのも良い手です。
コードの管理
これはSageMathに限らない話になりますがお役立ち情報のつもりで書きます.一度書いたコードは名前をつけて保存していつでも引き出せるようにしておくと便利です.
現時点での私のおすすめはGoogle Keepというメモ帳アプリを使うことです.
理由はGoogleアカウントでログインさえすればどんなデバイスからでも閲覧・編集ができるからです.なのでデバイスの不具合でデータが消えるなんて事故は基本的には起こらないのが強みです.
筆者が管理している様子を参考までにお見せします:
picture
一言
抽象数学に立ち向かう強力な武器として是非SageMathの使用を検討してみてください!