PARI/GPについての情報
富山大学理工学研究部
木村 巌<iwao at sci.u-toyama.ac.jp>
最終更新日:2015年11月12日(更新箇所)
PARI/GPとは
PARI/GPは、整数論への応用を念頭に置いて開発されているC言語用のlibrary Pariと、その機能を用いて対話的に数値計算が行えるgpという処理系からなります. 開発は主に、以下のCopyright noticeにある人達に依りますが、機能の追加、改良を広く受け入れています.
Copyright (C) 1989-1998 by C. Batut, K. Belabas, D. Bernardi, H. Cohen and M. Olivier.
入手先など詳細はPARI/GPのホームページをご覧下さい.
PARI libraryは、C言語のプログラムにlinkして用いることを想定して作成されています.他方、gpは、PARI libraryの機能を対話的に用いる為に作成されており、GNU readline libraryなどと組み合わせて、あるいはemacsから呼び出して、快適に用いることが出来ます.また、gpは簡単なscript言語のinterpreterでもあり、speedを追求しなければgp scriptのみで十分仕事になります.たとえば、マチンの公式(arctanの加法定理とTaylor展開とを組み合わせるもの)で円周率を計算するには、gpで以下のようなプログラムを書くことになります.
mypi(iter = 100)=
{
my(a, b, x, y);
x = 1/5; y = 1/239;
a = 4 * sum(k = 0, iter, ((-1)^k / (2*k + 1)) * x^(2*k + 1));
b = sum(k = 0, iter, ((-1)^k / (2*k + 1)) * y^(2*k + 1));
4 * (a - b) + .0
}
別の,より効率の良いRamanujanによる公式をGPのスクリプトにしたものがこちらに(pi.gp)
/*
* Basing on Ramanujan's formula, this program compute
* pi. a(n) -> 1/pi as n -> oo.
*/
{
print("a(n) gives an approx. of 1/pi. Please note that, before compute a(n),
the real precision should be 4^n or greater.");
print("For example, if you want to compute a(8), then");
print("? \\p65536");
print("? 1/a(8)");
print("This may take a second.");
}
y(n) = {
/*
* y(0) = sqrt(2)-1,
* y(n+1) = (1-(1-y(n)^4)^(1/4))/(1+(1-y(n)^4)^(1/4)), n>=1.
*/
my(yn = 0, ynq = 0, ynqm = 0);
if(n==0, return(sqrt(2) - 1),
yn=y(n-1);
ynq = yn^4;
ynqm = (1-ynq)^(1/4);
return((1-ynqm)/(1+ynqm)));
}
a(n) = {
/*
* a(0) = 6-4sqrt(2),
* a(n+1) = (1+y(n+1))^4 * a(n) - 2^(2n+3) * y(n+1)*(1+y(n+1)+y(n+1)^2), n>=1.
*/
my(yn = 0, ynp1 = 0, ynp1sq = 0, ynp1quart = 0);
if(n == 0, return(6-4*sqrt(2)),
yn=y(n);
ynp1 = yn + 1;
ynp1quart = ynp1^4;
return(ynp1quart*a(n-1) - (2^(2*n+1))*yn*(1+yn+yn^2)));
}
さらに、同様の計算をするプログラムを、CでPARI libraryを使って書いたもの、別バージョンです。PARI-libraryを使っているので、多倍長計算になっています。勿論、PARI-gpには、組み込みのPiという定数が用意されています.
PARI/GPで出来ること
PARIの関数群は、用途に応じて次のように分類されています.
- Standard monadic or dyadic OPERATORS
- CONVERSIONS and similar elementary functions
- TRANSCENDENTAL functions(超越関数の数値的な計算)
- NUMBER THEORETICAL functions(数論に関する関数)
- Functions related to ELLIPTIC CURVES(楕円曲線に関する関数)
- Functions related to general NUMBER FIELDS(一般の代数体に関する関数)
- POLYNOMIALS and power series(多項式、巾級数に関する関数)
- Vectors, matrices, LINEAR ALGEBRA and sets(ベクトル、線形代数に関する関数)
- SUMS, products, integrals and similar functions(和、積、積分など)
- GRAPHIC functions(グラフィック・プロッティングに関する関数)
PARI/GPの最近の動向
現在のpari-gp最新版は、(ダウンロードページへのリンク)version 2.7.5です('2015/11/12現在).PARI developpers MLのlogなども参照してください.
pari開発者のミーティングAtelier Pari/gp 2015が2015年1月に開催されたそうです.
Microsort Windows版のバイナリ(インストーラ付)もあります.ダウンロードして実行するだけで、インストール作業が開始します.64bit版のWindowsを使っている方は,64bit版のバイナリを強くお勧めします(ファイル名がPari64となっているもの.高速です).下記インストールについて,を参照.
インストールについて
Microsoft Windows
Windows Vista (Home Premium)へpari-gpをインストールする過程を,スクリーンショット込で解説した文書を作成しました(2007/8/23).
FreeBSD/Linuxなど各種Unix互換環境
開発版である2.8系列も随時進行中.git repositoryから最新版をcheck outし、自分でコンパイルする方法は,pari/gp本家のページに解説あり:
- git(分散バージョン管理システム)を用意する.FreeBSD/Linuxなどでは然るべきバイナリパッケージがあるので、それを導入しておく.Microsoft Windows上でも、バイナリがあるので導入しておく(git for Windows).
- ktermなどの仮想端末で、bashやtcshなどのshellを立ち上げておく
- pari/gpのソースツリーを展開したいディレクトリに行って、
git clone http://pari.math.u-bordeaux.fr/git/pari.git
- pariというディレクトリができているのでそのディレクトリへ移動し
./Configure
なお、Configure時のオプションについては、./Configure --help参照.最近のバージョンでは、低レベルの多倍長演算エンジンとして、GMPがデフォルトになっています.
- GMPを多倍長演算に使う場合は、使用するパソコンに最適になるようコンパイルしたものを使うのがお薦め.バイナリパッケージから導入したものだとパフォーマンスが上がらないことがあります.また、MPIRのGMP互換APIもお薦めです(特に64bitマシンで).
- make gp
- rootになって、make install
その他メモ
リンク
日本語で読めるpari-gpに関する情報として(順不同・網羅的ではありません):
メモ
「pari-gpで初等数論」というメモを公開します.OOo writerで書いた原稿はこちら.
pari-gpの2.4系列はgpのパーサが全面的に書き換えられ、極めて高速になっています(2007/7/5記).但し、CVSの最新版には、最新版のbugが潜んでいる可能性があるので注意.
- 北陸数論セミナーでの2007/7/5の講演のスライドをリンク.3次巡回体の類数計算など、簡単なプログラム例(2007/7/5記)
- 北陸数論セミナーでの2006/7/14の講演のスライドをリンク.
- gpにGDBM(GNU dbm)へのインターフェースを追加する、pari-gdbmパッケージ(tar.gzファイル)を公開します.インストール・使用方法などは同梱のREADMEファイルをご覧下さい(2002/3/15記).NEW!
- 2.1.x, 2.2.x系列いずれにも、ellap()にバグがある可能性があります.大きなpにたいして、ellap(e,p)の値が不正になるというものです(Hasseの定理に反する).安定版だと2.1.3, 開発版なら最新のソースをCVSからチェックアウトしてコンパイルし直すことをお勧めします(2002/02/25記)
- PariSiteはMicrosoft Windows上で動作する、gp用のGUIです.
- 福田先生(@日大生産工)のTCが、version 4からPari libraryの関数を呼び出せるようになりました.
- Computer Aided Number Theory --Introduction to Pari--(gzipped PostScript),PDF版. 仙台数論小セミナー・小研究集会(於東北大学大学院情報科学研究科、平成12年11月30日〜12月1日)の報告集原稿.C言語でPariライブラリを用いたプログラミングの簡単な解説です.
- Bill Allombert氏が、gpのスクリプトをCに変換するgp2cトランスレータを公開されました.PariのソースをCVSで取得している方は、ソースツリーで、
cvs -z 3 checkout gp2c
を実行してください.gp2cというディレクトリができます.そのディレクトリに移動して、./cvsinit
を実行すると、configureスクリプトができるので./configure && make
で動くものができるはずです(autoconf, automake, m4, lex, yacc, perlが必要です).使い方はREADMEに書いてあります.あるいは、PariのFTPサイトからtar ballを取得することも出来ます.上記のマチンの公式でπを計算するスクリプトは、こんな風に変換されます.GCのコードも生成するようにすると(オプションに-gをつける)、こうなります.
- 「Pari Internal」(Dviファイル)、平成12年10月13日、第2回「数論アルゴリズムとその応用」シンポジウム@中央大学、のOHPシートです.同gzipped PS, 同PDF. Pari libraryを使ったCでのprogramingについての概説です.
- 二次体の類数を計算する関数qfbclassno()にバグが報告されています.bnfclassunit()を使うwork aroundがあります.(qfbclassno(-174660)ではなく、bnfclassunit(x^2+174660)を計算する).
- '99/09/25公開の2.0.17.betaから、CVSでの取得が可能になりました.随時PARIの最新版を参照できるようになります.
- いくつかの環境でmake testの時間を計測してみました。ご参考までにどうぞ。
- 2.0.15.betaをgcc以外のcompilerで作ろうとすると、
% diff -u src/basemath/galconj.c.orig src/basemath/galconj.c
--- src/basemath/galconj.c.orig Sat May 22 23:15:13 1999
+++ src/basemath/galconj.c Sun May 23 01:09:58 1999
@@ -1313,7 +1313,7 @@
GEN
a4galoisgen(GEN T,struct test_data *td)
{
- int ltop=avma,av,av2;
+ long ltop=avma,av,av2;
int i,j,k;
int n;
int N,hop=0;
@@ -1326,14 +1326,17 @@
res=cgetg(4,t_VEC);
ry=cgetg(3,t_VEC);
res[1]=(long)ry;
- (long)pft=ry[1]=lgetg(n+1,t_VECSMALL);
+ ry[1]=lgetg(n+1,t_VECSMALL);
+ pft=(GEN) ry[1];
ry[2]=(long)stoi(2);
ry=cgetg(3,t_VEC);
- (long)pfu=ry[1]=lgetg(n+1,t_VECSMALL);
+ ry[1]=lgetg(n+1,t_VECSMALL);
+ pfu=(GEN)ry[1];
ry[2]=(long)stoi(2);
res[2]=(long)ry;
ry=cgetg(3,t_VEC);
- (long)pfv=ry[1]=lgetg(n+1,t_VECSMALL);
+ ry[1]=lgetg(n+1,t_VECSMALL);
+ pfv=(GEN)ry[1];
ry[2]=(long)stoi(3);
res[3]=(long)ry;
av=avma;
|
という修正が必要かも知れません。
- FreeBSDには、pari-2.0.13.alphaのPortsがあります.
- 2.0.12のConfigureがasの認識後に黙ってしまう場合は、
amaki: {204} diff -u ./Configure.orig ./Configure
--- ./Configure.orig Mon Nov 9 21:22:35 1998
+++ ./Configure Mon Nov 9 21:23:22 1998
@@ -649,7 +649,7 @@
case "$AS" in ?:/*|/*) echo ..."as is $AS";;
*) echo ..."I could not find as." ;; esac
fi
-if ($AS --version 2>&1 | grep GNU > /dev/null); then
+if (echo | $AS --version 2>&1 | grep GNU > /dev/null); then
echo "...Hum, this looks like GNU as"
gnuas=yes
case "$osname-$asmarch" in
|
で直ると思います.
- PARI-GPをFreeBSD 2.1.5-Rにインストールした時のメモです.現在ではPorts/Packagesを使う方が早いです.
- 同じくPARI-GPをSunOS 4.1.2へインストールした時のメモです.
Math::Pariの動向
Ilya Zakharevichさんが公開しておられる、PARI-GPをPerlから使うためのmoduleは Math-Pari-2.001302.tar.gzが最新版です.PARI-GP 2.0.13.alphaに対応しています.
- 2.001302を、Digital Unix V3.2Dでmakeしようとしていますが、うまく行きません.使っているPerlが、Perl5.00502をsfio付きで作ったものなのですが、sfioとの食い合わせが良くないようです.現在調査中('99/2/20).譲歩をお持ちの方がいらしたら、御教授下さい.
- FreeBSD 2.2.5では、sourceをPARIのsource treeの中に展開した後、INSTALLの通りにpatch
を当て、
yourhost% perl Makefile.PL
yourhost% make
|
で動くものができます.しかしmake test
がうまく行きません.
- PARI-GPをPerlから使う為のmoduleがあります.PARIの1.34.xを使いたい場合はこちらを使う事になります.Math-Pari-0.94.tar.gzです.FreeBSD 2.2.xでは、sourceを展開した後、
yourhost% perl Makefile.PL
yourhost% make 'CCFLAGS+=-DNOEXP2 -D__NetBSD__' 'LDLOADLIBS= -lcompat -lm' 'EXT
RALIBS= -lcompat -lm'
|
とすると、ある程度動くものができます.
木村のtop pageに戻る
<iwao@sci.toyama-uac.jp >
$Id: pari-gp.html,v 1.35 2015/11/12 06:56:58 iwao Exp iwao $