LoginSignup
3
1

More than 1 year has passed since last update.

DockerでSageMathを使ってみた

Last updated at Posted at 2021-06-20

コンテナを起動する

イメージをプルします。

docker pull sagemath/sagemath

DockerHub による SageMath イメージの公式ドキュメントはこちらです。

コンテナを起動します。-it はコンテナ内でインタラクティブな bash シェルを作成するオプションです。

docker run -it sagemath/sagemath:latest /bin/bash

オプションの詳細に関する DockerHub 公式ドキュメントはこちらです。

このコマンドの実行後、以下のように sage ユーザーでコンテナに入ることができます。

sage@a5eac0d438c4:~$

sage コマンドで SageMath を起動します。

sage@a5eac0d438c4:~$ sage
----------------------------------------------------------------------
| SageMath version 9.1, Release Date: 2020-05-20                     |
| Using Python 3.7.3. Type "help()" for help.                        |
----------------------------------------------------------------------

例)$\mathbb{Q}$ 上の多項式環

sage: R.<x> = PolynomialRing(QQ)
sage: R
Univariate Polynomial Ring in x over Rational Field
sage: f = x^2 - 1
sage: f.factor()
(x - 1) * (x + 1)

exit で対話モードを終了します。

sage: exit

ファイルの入出力

ファイルを作成するために vim コマンドをインストールします。

sage@a5eac0d438c4:~$ sudo apt-get update
sage@a5eac0d438c4:~$ sudo apt-get install vim

自分のプログラムコードを保存するディレクトリを作成し、sample.sage というファイルを作成します。

sage@a5eac0d438c4:~$ mkdir mysrc
sage@a5eac0d438c4:~$ cd mysrc/
sage@a5eac0d438c4:~/mysrc$ vim sample.sage

10までの素数を output.txt ファイルに出力するプログラムを作成します。

sample.sage
file = open('output.txt', 'w')
for i in range(10):
    if is_prime(i):
        file.write(f'{i}は素数です。\n')
file.close()

sage コマンドで sagemath を起動します。

sage@a5eac0d438c4:~/mysrc$ sage

実行するには以下のように load(ファイル名) を実行します。

sage: load('sample.sage')

実行が完了したら一旦 sage を終了します。

sage: exit

output.txt ファイルを確認します。

sage@a5eac0d438c4:~/mysrc$ cat output.txt
2は素数です。
3は素数です。
5は素数です。
7は素数です。

なお、sage を起動してからでもディレクトリ移動などのコマンドは実行できます。

sage: cd mysrc/
/home/sage/mysrc
sage: pwd
'/home/sage/mysrc'
sage: ls
sample_M23.sage

sage でコマンドを実行する

以下のコマンドで、sage コマンドで対話形式に入る前にコマンドを実行できます。

sage -c "load('sample.sage')"

もしくは次のように実行します。

sage sample.sage

Permission denied というエラーが発生する場合は、sudo を使用します。

sudo sage sample.sage

文字列の多項式から定義した環の多項式に変換する

例えばファイルから読み込んだ多項式の型は文字列です。これをそのまま因数分解することはできません。実行してみます。

sage: f = 'x^2 - 1'
sage: f
'x^2 - 1'
sage: f.factor()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-12862fc134be> in <module>()
----> 1 f.factor()

AttributeError: 'str' object has no attribute 'factor'

次のようにキャストすることで因数分解が可能です。

sage: R.<x> = PolynomialRing(QQ)
sage: cast_f = R(f)
sage: cast_f.factor()
(x - 1) * (x + 1)

docker run で sage ファイルを実行する

カレントディレクトリに docker_test というディレクトリを作成し、その直下に Dockerfile を作成します。

mkdir docker_test
cd docker_test
vi Dockerfile

以下の Dockerfile を作成します。Dockerfile の CMD で、コンテナ起動時にコマンドを実行できます。

Dockerfile
FROM sagemath/sagemath

COPY ./src /mysrc

CMD sage -c "load('/src/sample.sage')"

docker_test/src には、ファイル sample.sage を格納しておきます。

sample.sage
import datetime

file = open('/src/output.txt', 'w')
for i in range(10):
    if is_prime(i):
        file.write(f'{i}は素数です。\n')

file.write(str(datetime.datetime.now()) + '\n')
file.close()

以下のようなディレクトリ構成になります。

docker_test
    |--- Dockerfile
    |--- src
          |--- sample.sage

ビルドを実行します。

docker build -t my_sage .

実行結果を書き出したファイル output.txt をローカルに保持するために、以下のように -v オプションを付与して実行します。これはデータ・ボリュームとしてホスト上のディレクトリをマウントするコマンドです。

docker run -v /home/ec2-user/docker_test/src:/src my_sage

実行後、docker_test/src/output.txt には以下のような出力があります。

2は素数です。
3は素数です。
5は素数です。
7は素数です。
2021-09-14 12:54:08.261853

ライブラリのインストール

SageMath は Python を使用しているため、必要なライブラリのインストールは pip3 コマンドを用いることができます。Dockerfile でライブラリのインストールを行う際に注意することを記載します。

Dockerfile では以下のように RUN コマンドによるライブラリのインストールが可能です。

Dockerfile
RUN pip3 install boto3

しかし、Docker ビルド時に以下のようなエラーが発生します。

/bin/sh: 1: pip3: not found

これは pip3 のパスが見つからないためです。以下のように絶対パスで pip3 コマンドを実行すれば、正常にライブラリのインストールが行われます。

Dockerfile
RUN /home/sage/sage/local/var/lib/sage/venv-python3.10.5/bin/pip3 install boto3

絶対パスを見つけるには以下の手順を実行します。

1. コンテナを起動する

docker run -it sagemath/sagemath:latest /bin/bash

2. which コマンドで pip3 コマンドの絶対パスを確認する

sage@d4ef529b4505:~$ which pip3
/home/sage/sage/local/var/lib/sage/venv-python3.10.5/bin/pip3

最後に

こちらにサンプルを置きました。

参考記事

プログラミング
https://doc.sagemath.org/html/ja/tutorial/programming.html

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1