PARI/GP

PARI/GPは計算機代数アプリケーションであり、数論に関する様々な演算を行うために開発された。バージョン2.1.0からはフリーソフトウェアとしてGNU General Public Licenseにしたがって米フリーソフトウェア財団から公開、配布されている。PARI/GPはマルチプラットフォームであり、多くのプラットフォームで実行することができる。
開発の経緯.
PARI/GPはもともと1985年に仏ボルドー大学 Laboratoire A2X のアンリ・コーエン()のチームで開発され、現在は同大学のカリム・ベラバス()が多くのボランティア開発者とともに管理、開発している。コーエンと仏ボルドー第一大学のフランソワ・ドレス()が高度な代数計算を行うために開発したISABELLEというプログラムが元になっている。
概要.
PARI/GPは再帰的な数式処理を高速に行うことのできるプログラムのパッケージである。当初は数論の研究者の利用を想定して開発された。演算が高速である、数学者になじみの深いデータ型を直接操作できる、数論における演算を行うための優れたモジュールを備えている、と言う特徴がある。
PARI/GPは標準で、以下の二つのプログラムを備えている。
またgp2cと呼ばれるプログラムもパッケージに含まれている。これは GP 言語で書かれたスクリプトをC言語に変換するプログラムである。これにより、gp でスクリプトを実行するよりも3〜4倍高速に実行することができるようになる。しかし現時点では GP 言語のすべてをサポートしてはいない。
PARI/GPは任意の精度で多倍長演算を行うことができる。百万桁、64bitの計算機なら10億桁の精度を扱うことができる。また素因数分解、楕円曲線、各種の代数演算を行うことができる。行列、多項式、冪級数、代数的数の演算ができ、特殊関数も多数実装されている。
PARI/GPは独自のプロット機能を備えている。また多項式の操作や積分などにおいて記号計算を行うこともできるが、その機能はたとえばMathematicaのような計算機代数プログラムに比べるとまだ限定的である。
PARI/GPのコンパイル時にGMP (GNU Multiple Precision Arithmetic Library) を使うと、より高速に演算を行うことができる。
PARI/GPの名前の由来.
PARIという名前は、開発が始まった当時に開発者たちがPascalで実装したライブラリ"Pascal ARIthmetic" (早期にC言語に移行したが)に、また"pari de Pascal" (パスカルの賭け). に由来している。
"gp" の最初のバージョンは Great Programmable Calculator、GPC と呼ばれていた。なにかの理由で C がとれて今の名前になった。
実行例.
"gp" の実行例をいくつか以下に示す。
 ? \p 212
 realprecision = 221 significant digits (212 digits displayed)
 ? 148.7^0.3721
 time = 0 ms.
 %1 = 6.4315686761687428232463963595991663095614617461851330959022336592679249
 83664424375749173149713566544671777981026987042189396584904780584382369995989
 2470992868949783084618518182456887849078305105083627437215091767
 ? 123456! + 0.
 time = 1,656 ms.
 %2 = 2.6040699049291378729513930560926568818273270409503019584610185579952057
 37967683415793560716617127908735520017061666000857261271456698589373086528293
 4317244121152865814030204645985573419251305342231135573491050756 E574964
 ? sin(x)
 time = 0 ms.
 %3 = x - 1/6*x^3 + 1/120*x^5 - 1/5040*x^7 + 1/362880*x^9 - 1/39916800*x^11
 + 1/6227020800*x^13 - 1/1307674368000*x^15 + O(x^17)
 ? for(z=25,30, print (factor(2^z-1)))
 [31, 1; 601, 1; 1801, 1]
 [3, 1; 2731, 1; 8191, 1]
 [7, 1; 73, 1; 262657, 1]
 [3, 1; 5, 1; 29, 1; 43, 1; 113, 1; 127, 1]
 [233, 1; 1103, 1; 2089, 1]
 [3, 2; 7, 1; 11, 1; 31, 1; 151, 1; 331, 1]
 time = 5 ms.
 ? e = ellinit([0,0,1,-7,6]); ellidentify(e)
 time = 28 ms.
 %4 = "5077a1", [0, 0, 1, -7, 6], [[-2, 3], [-1, 3], [0, 2]]], [1, 0, 0, 0
 /* A famous rank 3 elliptic curve of conductor 5077. */
 ? K = bnfinit(x^2 + 23); K.cyc
 time = 1ms.
 %5 = [3]
 /* This number field has class number 3. */