SageMathの再インストールにてこずった話

この記事は [RICORA Advent Calendar](https://adventar.org/calendars/7447) 2022の7日目の記事です。

## 動機

1. CTFで最近SageMathによるCryptoのWriteUpが増えている
1. 約1年前にSageMath(Windowsバイナリ版)をダウンロードしていた
1. 最近うまく動かない
1. 再インストールしよう!
1. **SageMathのWindowsサポートが終了していた**
1. Virtualbox上のKali Linuxに再ダウンロードするか…

## SageMath(sage)とは
> "Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, and MATLAB"
> Copyright (C) 2005-2022 The Sage Development Team

複雑な数学的計算をいろいろできるソフト。

参考:[Sage Quick Reference(日本語訳)](http://fe.math.kobe-u.ac.jp/MathLibre-2011-doc/sage-refcard/quickref-numtheory/ja/quickref-nt.pdf)

## 問題
**SageMathのリファレンス少なくないか？**
インストール方法を探してもみんな公式のreadmeに飛ばしやがる。英語ザコ＆gitサボってた私にはわからん…ということで、手探りでインストールを進めていく。
環境:Kali GNU/Linux 2022.04


## 実践
1.前提条件を整える。まず、最小の条件である、
- gcc,g++
- clang
- **gfortran**
- **perl**
- make
- m4
- ar
- ranlib
- tar
- python(3)
を含む、
```
sudo apt-get install  bc binutils bzip2 ca-certificates cliquer cmake curl ecl eclib-tools fflas-ffpack flintqs g++ gcc gengetopt gfan gfortran glpk-utils gmp-ecm lcalc libatomic-ops-dev libboost-dev libbraiding-dev libbrial-dev libbrial-groebner-dev libbz2-dev libcdd-dev libcdd-tools libcliquer-dev libcurl4-openssl-dev libec-dev libecm-dev libffi-dev libflint-arb-dev libflint-dev libfplll-dev libfreetype6-dev libgc-dev libgd-dev libgf2x-dev libgiac-dev libgivaro-dev libglpk-dev libgmp-dev libgsl-dev libhomfly-dev libiml-dev liblfunction-dev liblinbox-dev liblrcalc-dev liblzma-dev libm4ri-dev libm4rie-dev libmpc-dev libmpfi-dev libmpfr-dev libncurses5-dev libntl-dev libopenblas-dev libpari-dev libpcre3-dev libplanarity-dev libppl-dev libprimesieve-dev libpython3-dev libqhull-dev libreadline-dev librw-dev libsingular4-dev libsqlite3-dev libssl-dev libsuitesparse-dev libsymmetrica2-dev libz-dev libzmq3-dev libzn-poly-dev m4 make nauty ninja-build openssl palp pari-doc pari-elldata pari-galdata pari-galpol pari-gp2c pari-seadata patch perl pkg-config planarity ppl-dev python3 python3-distutils python3-venv r-base-dev r-cran-lattice singular singular-doc sqlite3 sympow tachyon tar tox xcas xz-utils
```
を実行する。
また、開発用途で
```
sudo apt-get install  autoconf automake git gpgconf libtool openssh openssh-client pkg-config
```
、さらにオマケとして
```
sudo apt-get install  default-jdk dvipng ffmpeg imagemagick latexmk libavdevice-dev pandoc tex-gyre texlive-fonts-recommended texlive-lang-cyrillic texlive-lang-english texlive-lang-european texlive-lang-french texlive-lang-german texlive-lang-italian texlive-lang-japanese texlive-lang-polish texlive-lang-portuguese texlive-lang-spanish texlive-latex-extra texlive-xetex
```
を実行する。

2.sageをインストールするディレクトリで、
```
git clone https://github.com/sagemath/sage.git
```
。sageのコンパイル前のソースファイルがダウンロードされる。

3.実行ディレクトリ直下にディレクトリ`sage`ができるので、`cd sage`して
```
make configure
```

4.3.の終了後、
```
./configure
```
を実行。その後
```
./config.status --recheck && ./config.status
```

5.recheckが終わったら、
```
make
```
を実行する。これで、ソースファイルから先ほどダウンロードしたg++等によるコンパイルが始まる。
***注意!***:コンパイル後のファイルは10GB弱ほどになります。容量もさることながら、何より***コンパイル時間がめっちゃ長い***です(私の場合は***5時間***でした)。

6.sageディレクトリで
```
./sage
```
を実行し、
```
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 9.8.beta4, Release Date: 2022-11-21               │
│ Using Python 3.10.8. Type "help()" for help.                       │
└────────────────────────────────────────────────────────────────────┘
sage: 
```
などとなったら目標達成。

## 終わりに
gitさえ知っていれば多分できるんだろうが、私は死にかけたので書き残すことにした。なお、`.sage`を拡張子とするsageのプログラムファイルは`./sage "example.sage"`という形で実行するのではなく、sageシェル内で
```
sage: load("example.sage")
```
という形で実行する。[Sage チュートリアル(日本語版)](https://doc.sagemath.org/pdf/ja/tutorial/tutorial-jp.pdf)等を参考に、ぜひSageMathを使いこなしてほしい。

あとはSageMathのVScode拡張さえあればなあ…