PARI/GPの紹介

誰得な投稿を1つ。数学計算用ライブラリ "PARI" とその言語 "GP" 、および、インタラクティブシェル "gp" のご紹介。

本家サイト : http://pari.math.u-bordeaux.fr/

## インストール

homebrewならこれだけ。

```
$ brew install pari
```

## 使いかた

`gp`コマンドでシェルが起動します。

```
$ gp
                                                          GP/PARI CALCULATOR Version 2.5.4 (released)
                                                       i386 running darwin (x86-64 kernel) 64-bit version
                                             compiled: Oct 29 2013, gcc-5.0 (clang-500.2.79) (based on LLVM 3.3svn)
                                                         (readline v6.2 enabled, extended help enabled)

                                                             Copyright (C) 2000-2013 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?12 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 500509
```

スタックの大きさや初期素数リストの大きさは `.gprc` で指定したり、コマンドラインでも指定できます。詳しくは `gp --help` をチェックしてください。

### 四則演算、演算子系

普通に計算してみます。
エンターを押すと自動的に計算してくれます。計算結果は `%n` として変数化されるので以降の計算で参照できます。

```
? 1 + 2
%1 = 3
? 1 - 2
%2 = -1
? 5 * 10
%3 = 50
? 3 / 10
%4 = 3/10
? %4 * 10
%5 = 3
```

さて、早速ですが除算（割り算）が分数になっていて、丸め誤差が発生していませんね。数学計算らしい機能です。

```
? 2^10
%6 = 1024
```

累乗です。

```
? 5!
%7 = 120
```

階乗です。

```
? 10 % 3
%9 = 1
```

剰余の計算です。

```
? exp(1)
%12 = 2.7182818284590452353602874713526624978
? Pi
%15 = 3.1415926535897932384626433832795028842
? 1 + I
%18 = 1 + I
? %18^2
%19 = 2*I
```

定数(exp(1), Pi)や虚数(I)なども標準で付いています。ということは…。

```
? exp(1)^(I * Pi)
%20 = -1.0000000000000000000000000000000000000 + 0.E-37*I
```

若干の丸め誤差が出てしまいますが、計算できますね。

### その他

このソフトは割と代数系の機能が多いです。

```
? x^2 + x + 1
%1 = x^2 + x + 1
```
多項式を定義してみたり。

```
? factor(x^2 - 1)
%2 =
[x - 1 1]

[x + 1 1]
```
多項式を因数分解してみたり。

```
? galoisinit(x^2 + 1)
%3 = [x^2 + 1, [5, 30, 931322574615478515625], [349392779948853795807, 581929794666624719818]~, [1, 1; 581929794666624719818, 349392779948853795807], 2, [Vecsmall([1, 2]), Vecsmall([2, 1])], [Vecsmall([2, 1])], Vecsmall([2])]
```
Galois群を計算したり。

まぁそんな感じです。もしオモシロイと思った人は使ってみてはいかがでしょう。
もちろん、普通の計算機にちょっとしたメモ機能がついてるものと思ってもいいと思います。

## おまけ

グラフも書けます。

```
? plot(X=-2,2,X^2+X-1)

        5 |''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''"
          |                                                             "|
          |                                                            " |
          |                                                           x  |
          |                                                          x   |
          |                                                         "    |
          |                                                        "     |
          |                                                       "      |
          |                                                     _"       |
          |                                                    _         |
          |                                                   x          |
          |                                                  x           |
          |                                                _"            |
          |                                               x              |
          "_                                            _"               |
          | "_                                         x                 |
          |   x_                                     x"                  |
          ,,,,,,x_,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,x",,,,,,,,,,,,,,,,,,,,,
          |       x_                            _x"                      |
          |         "x_                       _x                         |
          |            "x_                _x""                           |
-1.249433 |...............""xxx_______xx""...............................|
          -2                                                             2
? plot(X=-Pi, Pi, sin(X))

0.9996892 |'''''''''''''''''''''''''''''''''''''''''''_x""""x_'''''''''''|
          |                                         x"        x_         |
          |                                       _"            x        |
          |                                      x               "       |
          |                                     x                 "_     |
          |                                    x                    _    |
          |                                   "                      _   |
          |                                  "                        _  |
          |                                 "                          _ |
          |                                x                            _|
          _                               x                              _
          ```````````````````````````````x````````````````````````````````
          |"                            x                                |
          | "                          _                                 |
          |  "                        _                                  |
          |   "                      _                                   |
          |    "                    x                                    |
          |     "_                 x                                     |
          |       _               x                                      |
          |        x            _"                                       |
          |         "x        _x                                         |
-0.999689 |..........."x____x"...........................................|
          -3.141593                                               3.141593
```