Pari-GP による数論的不変量の計算 木村巌(富山大学理学部) 目次 1 Pari-gp とは? 1.1 Pari-gp についてよく受ける質問 . . . . . . . . . . . . . . . 2 gp の基本概念 2.1 gp 入門 . . . . . . . . . . . . . . . . . . . 2.1.1 gp の起動と終了 . . . . . . . . . 2.1.2 簡単な計算 . . . . . . . . . . . . 2.1.3 組み込み関数の呼び出し . . . . . 2.1.4 ヘルプ機能 . . . . . . . . . . . . 2.2 2 次体の計算のデモ . . . . . . . . . . . . 2.2.1 qfbclassno() . . . . . . . . . . 2.2.2 qfbclassno() のデモ . . . . . . 2.2.3 quadclassunit() . . . . . . . . 2.2.4 quadclassunit() のデモ . . . . 2.3 一般の代数体 . . . . . . . . . . . . . . . 2.3.1 bnfinit() . . . . . . . . . . . . 2.3.2 bnfinit() の引数 tech について 2.3.3 bnfcertify() . . . . . . . . . . 2.4 gp の文法 . . . . . . . . . . . . . . . . . 2.4.1 複数の文 . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 4 5 5 6 7 8 9 9 10 10 10 10 11 12 12 13 13 2.4.2 2.4.3 2.4.4 2.4.5 3 if 文 . . . . 繰返し構文 関数定義 . . 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . その他の話題 3.1 Pari-gp のコンパイル . . . . . . . . . . . . 3.2 初期設定ファイル . . . . . . . . . . . . . . 3.3 C 言語と Pari ライブラリによる開発 . . . 3.4 GP2C —GP から C へのトランスレータ— 3.4.1 GP2C のインストール . . . . . . . 3.4.2 GP2C の使い方 . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 14 15 . . . . . . 16 16 17 18 18 18 19 Pari-gp とは? Pari-gp[4] は、数論の計算に特化した、free の数値計算パッケージであ る.他の計算ソフトと比較すると、GNU Octave1 は数値計算全般をター ゲットとしている点で、また、Mathematica や Maple は商品であり、数 式処理系であるという点で、対照的である. Pari-gp は、対話的に計算を行なうためのインタプリタ処理系 gp と、計 算のコア部分を提供する Pari ライブラリ(C 言語のライブラリ)とで構 成されている.gp が理解するスクリプト言語を GP と呼ぶ. 開発は、当初 H. Cohen によって開始され、現在は K. Belabas らが引 き継いでいる.Pari-gp は現在、GNU GPL というライセンスにより提供 されている free software である.最新版のソースコードも、CVS によっ て提供されている. サポートされている実行環境としては、各種 Unix(ならびに Linux や FreeBSD, Apple Mac OS X のような Unix 互換環境)、Microsoft Windows 上の cygwin 環境が挙げられる. 1 http://www.octave.org/ 2 FreeBSD や Linux などでは、コンパイル済みのバイナリパッケージが 提供されているため、それを使って導入するのが一番手間が少ない.また、 Microsoft Windows 上では、インストーラ附属のバイナリパッケージが開 発陣から提供されているので、それを使うのが簡単である.ソースコード から、自分でコンパイルするのも、(Microsoft Windows 上の cygwin 環 境も含めて)多くの環境でまったく簡単にできる.§3.1 を参照の事. 1.1 Pari-gp についてよく受ける質問 Pari-gp について良く受ける、一般的な事項についての一問一答を列挙 しよう. ……は計算できるか? 場合による: • 組み込み関数を呼び出すだけでできる • 組み込み関数をいくつか組み合わせるとできる • 既知のアルゴリズムを実装するとできる • アルゴリズムを考案し、それを実装するとできる ……はどのくらいの範囲まで計算できるか? マシンの性能、メモリ容量 などによる • gp を起動した時、割り当てるメモリサイズ(デフォルトでは 4MB) • 同じく、起動した時に計算する素数のリスト(デフォルトでは 500,000 まで).デフォルトの値の変更の仕方については、§3.2 を参照の事 • 使えるデータ(既存の数表など)を使えるか • 待ち時間(忍耐力) C 言語で書いたほうが、gp で書くよりも速いのか? これも場合による. 3 • 組み込み関数をいくつか呼び出す程度では、大差ない • ループを回す場合、gp の for() などは非常に遅い • C でプログラムを書いた場合、動くようになるまでの時間が掛 かる • gp2C トランスレータがある(gp のスクリプトを C に変換して くれる §3.4 参照) 数学的な概念/量を、どのように計算機に載せているのか? マニュアルに 記載あり:有限 Abel 群……Smith Normal Form, 自由 Abel 群…… Hermite Normal Form, 指標、イデアル、イデール等々). ∼はどうやって計算しているのか? 組み込み関数に実装されているアル ゴリズムは、ほとんどが H. Cohen の二冊の本 [2], [3] に解説されて いる(はず). ∼の計算結果は正しいのか?何を仮定して正しいのか? 状況による: • 無条件に正しい • GRH を仮定して正しい • GRH よりも強い Heuristic を仮定して正しい いずれにしても、Pari-gp のマニュアルの記述を注意深く確認する 必要がある(§2.2.3, §2.3.2 参照). 2 gp の基本概念 gp で簡単な計算をするための基礎知識を述べる.とりあえず起動して みたい読者は §2.1.1 へ進まれたい. 組み込み型:次の組み込み型が用意されている.それぞれの型を識別す るために、型を表す文字列が定義されている.例えば、有理整数は t INT など: 4 有理整数(t INT)、有理整数環の剰余環の元(t INTMOD)、有理数 (t FRAC)、実数(t REAL)、複素数(t COMPLEX)、p 進数(t PADIC)、 (多変数、係数も任意な)多項式(t POL)、形式巾級数(t SER)、…… ただし、多変数の多項式に関する因数分解などは十分には実装されてい ない.Pari-gp は、あくまで数値計算パッケージであると思った方が良い. 組み込みのデータ型:(縦・横)ベクトル、行列. ベクトル(t VEC)は要素としてベクトルを含む事ができる.C 言語の ポインタや構造体、多くのスクリプト言語に含まれる連想配列(hash)に 相当するものはないので、GP で複雑なデータ構造を構築する事はかなり 難しい.多くの場合、ベクトルのベクトルの……といった表現で代用して いる.行列は t MAT である. exact な型とそうでない型: exact な型:有理整数、有理整数の剰余環の元、有理数、それらを係数と する多項式・有理式……. これらは基本的に無限多倍長である(最近のバージョン Pari-gp は、多 倍長計算に GMP2 を使うこともできる) それ以外: 「精度」の概念がある.実数、p 進数、巾級数など. 実数のデフォルトの 10 進での桁数は、26. 巾級数のデフォルトの精度 は 16 項まで(任意に変更できる). 2.1 2.1.1 gp 入門 gp の起動と終了 Unix 互換環境を使っているなら、shell のコマンドラインから gp を起 動する.起動時のメッセージは、使用している Pari-gp のバージョンや、 初期設定ファイル(§3.2 で触れる)の内容により異同がある: iwao@jeff:~/DocMath/HokurikuNTWS-2004Dec {537}$ gp Reading GPRC: /home/iwao/.gprc ...Done. GP/PARI CALCULATOR Version 2.2.10 (development CHANGES-1.1159) i386 running freebsd (ix86/GMP-4.1.4 kernel) 32-bit version compiled: Apr 18 2005, gcc-3.4.2 [FreeBSD] 20040728 (readline v4.3 enabled, extended help available) 2 GNU Multiple Precision Arithmetic Library, http://www.swox.com/gmp/ 5 Copyright (C) 2000-2005 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 = 10000000, primelimit = 1000000 ? コピーライト表示の直前の行に、“readline v4.3 enabled” の表示が見え る.この表示があれば、端末での行編集機能が組み込まれている.また、” extended help available” とあるが、この表示があれば、組み込み関数の リファレンスマニュアルを、dvi ファイルのプレビューアーで表示する機 能が組み込まれている(後述). 以下、?が gp のプロンプトとする.終了は、\q である. parisize = 4000000, primelimit = 500000 ? \q Goodbye! 2.1.2 簡単な計算 整数は多倍長計算が行なわれ、有理数の四則は有理数の範囲で行なわれ る.有理数を実数に丸める場合は、0.0 を加える事が一番簡単である. ? 2^100 %2 = 1267650600228229401496703205376 ? 1/2 + 1/3 %3 = 5/6 ? %+ 0.0 %4 = 0.8333333333333333333333333333 %で直前の計算結果を引用できる. 先に述べたように、データ型としてはベクトル位しか用意されていな い.各成分の型が異なっていても良く、成分としてベクトルを含む事も許 される.入力としては、 6 横ベクトル: [1,2,3] 縦ベクトル: [1,2,3]~ 行列: [1,2,3;4,5,6;7,8,9] のようになる.最後の行列は、 ³1 2 3´ 456 789 である. 変数には型はない.例えば、同じ変数に、ある時はスカラーを、別の時 にはベクトルを代入することもできる: ? a = 1; ? a = [1, 2, 3]; ? a[1] 1 多項式は、例えば x2 + 2x + 1 を ? x^2+2*x+1 %5 = x^2 + 2*x + 1 のように入力する. 2.1.3 組み込み関数の呼び出し 多項式ならびに整数の因子分解は factor() である: ? factor(%) %6 = [x + 1 2] x2 + 2x + 1 = (x + 1)2 の右辺が、上記のように返される. gp の関数の引数の個数は、見かけ上、可変である.正確には、必須の 引数と、オプションとしての引数があり、後者を指定しない場合は入力を 省略できる(この場合、デフォルトの値が暗黙の内に指定される). 7 例えば上記の factor() は、二つの引数 x, flag をとる.前者は分解し たい値、後者は、x が有理数または有理整数の場合、因数の最大値を指定 する. ? factor(2^15+1,10) %5 = [3 2] [3641 1] ? factor(2^15+1) %6 = [3 2] [11 1] [331 1] 最初の計算では、10 以下の因数のみを探索した. 2.1.4 ヘルプ機能 gp のプロンプトに対して?だけ入力すると、gp の組み込み関数を用途 別に大別した一覧が表示される: ? ? Help topics: for a list of relevant subtopics, type ?n for n in 0: user-defined identifiers (variable, alias, function) 1: Standard monadic or dyadic OPERATORS 2: CONVERSIONS and similar elementary functions 3: TRANSCENDENTAL functions 4: NUMBER THEORETICAL functions 5: Functions related to ELLIPTIC CURVES 6: Functions related to general NUMBER FIELDS 7: POLYNOMIALS and power series 8: Vectors, matrices, LINEAR ALGEBRA and sets 9: SUMS, products, integrals and similar functions 10: GRAPHIC functions 11: PROGRAMMING under GP 12: The PARI community (以下略) gp のプロンプトに、例えば?4 のように入力すると、上記の 4 番目の項 目”NUMBER THEORETICAL functions” の一覧が表示される: ? ?4 addprimes binomial core bestappr chinese coredisc bezout content dirdiv bezoutres contfrac direuler bigomega contfracpnqn dirmul 8 divisors factorff fibonacci isprime (以下略) eulerphi factorial gcd ispseudoprime factor factorint hilbert issquare factorback factormod isfundamental issquarefree factorcantor ffinit ispower kronecker 関数名の前に?をつけると、その関数のマニュアルを端末で見る事がで きる: ? ?factor factor(x,{lim}): factorization of x. lim is optional and can be set whenever x is of (possibly recursive) rational type. If lim is set return partial factorization, using primes up to lim (up to primelimit if lim=0) 更に、関数名の前に??をつけると、その関数名のリファレンスマニュア ルが、TEX で処理され、dvi file のプレビューアーが起動して表示される. この機能は、Pari-gp のコンパイル時に有効化された時に限り使用できる. 起動時のメッセージに、”extended help avairable” とあれば、この機能が 組み込まれている. 自分の行ないたい計算が、gp の組み込み関数として実現されているか 否かは、このようにして検索していく事で探す事ができる. 2.2 2 次体の計算のデモ 2 次体の類数、単数基準などの計算には、quad 一族、qfb 一族を使う. √ quaddisc(x). . . . . . Q( x) の判別式を返す. 2.2.1 qfbclassno() √ qfbclassno(x). . . . . . Q( x) の判別式を返す(Shanks のアルゴリズ ム).負の判別式については、類群の exponent が小さい場合、誤った 結果を返す事があるので注意が必要である. 9 2.2.2 qfbclassno() のデモ ? qfbclassno (-3299) %10 = 27 qfbclassno (-3299,1) %11 = 27 2.2.3 ……Euler 積を使う quadclassunit() √ quadclassunit(x). . . . . . Q( x) のイデアル類群(Buchmann-McCarthy の sub exponential アルゴリズムにより、Abel 群としての構造と、二次形 式の形での生成元)と、判別式が正の時は単数基準を返す. quadclassunit(x,,tech) のように、3 つめのパラメータを指定する事 ができる.tech は 2 つの正の実数を要素とするベクトル [c,d] で、計算 時間と、計算に必要なメモリの送料に影響を及ぼす.計算速度を重視する なら d=b とする.GRH のもとで厳密な結果を得たい場合は、d=6 とする. b としては、0.1 から 2.0 の範囲が妥当である. 2.2.4 quadclassunit() のデモ ? quadclassunit(-10^25-3) time = 10,810 ms. %20 = [491852207132, [245926103566, 2], [Qfb(7, 1, 357142857142857142857143), Qfb(13, 13, 192307692307692307692311)], 1] 結果は順に、 [類数, 類群の巡回群の直和としての表示, 各巡回成分の生成元(二次形式 として), 単数基準]. 2.3 一般の代数体 一般の代数体の計算には nf 一族、bnf 一族を使う(big number field). 10 2.3.1 bnfinit() bnfinit() は、引数として有理数係数の 1 変数多項式をとり、その多項 式の最小分解体に関するさまざまなデータ(整数底、類群、単数、単数基 準その他)を、Buchmann の sub exponential algorithm[2, Chap. 6.5] で 計算する. bnfinit() の必須の引数は 1 つで、体を定義する有理数係数の多項式 を指定する.例えば、x4 + 24x2 + 585x + 1791 = 0 が定義する代数体 K を考えよう. ? T = x^4 + 24*x^2 + 585*x + 1791; ? bnf = bnfinit(T); bnfinit() の返す結果は、多くの場合数十行以上に及ぶ巨大なベクトル なので、行末の; で端末への表示を抑制している. 変数 bnf に格納された結果から、必要な情報を得るためには、いわゆ る”member function” を用いる.C 言語の構造体のメンバーを参照する のと同様の字面で、ピリオドから始まるメンバー関数を適用する.上記 の例で、多項式 T の分解体 bnf の類群を参照するには、bnf.clgp(class group の略)とする: ? bnf.clgp %69 [4, [4], [[7, 4, 5, 6; 0, 1, 0, 0; 0, 0, 1, 0; 0, 0, 0, 1]]] この他、整数底、判別式、単数、単数基準などを得るためのメンバー関数 が用意されている.これらの一覧は、?. で表示される: ? ?. Member functions, followed by relevant objects a1-a6, b2-b8, c4-c6 : coeff. of the curve. area : area bnf : big number field clgp : class group (以下略) 11 ell ell bnf, bnr bnf, bnr 2.3.2 bnfinit() の引数 tech について bnfinit() には、必須ではない引数 flag と tech がある.flag は、0 から 3 までの自然数であり、bnfinit() が計算する不変量の種類と精度を 指定する.例えば flag=1 ならば、単数を厳密に計算する(かわりに、計 算時間とメモリ量が増大する).flag=2 ならば、単数を計算しない.詳 細はマニュアルを参照の事. 一方、tech は、3 成分の実数からなるベクトルで、計算速度と計算に 必要なメモリ量に関係するのみならず、結果の正確さをコントロールする 量である.tech=[c,c2,nrpid] とする. • c2=c のとき、最も短時間で結果を返す.GRH よりも強い仮定の元 での結果 • c2=12 のとき、GRH の元で正しい結果を返す c の適切な値は 0.1 ∼ 2.0 で、デフォルトの値(tech を指定しない場合) は c=c2=0.3 である. nrpid は、類群の構造を決めるための素イデアルの間の関係式の計算を コントロールする量である.詳細はマニュアルを参照の事. 2.3.3 bnfcertify() この関数は、bnfinit() の計算結果が、GRH を仮定せずに正しいか否 かを判定する.bnfinit() の結果を引数として取り、それが無条件に正し い(GRH を仮定せずに正しい)とき、1 を返す.そうでない場合、何ら かのエラーメッセージを表示するか、無限ループに突入する. §2.3.2 での bnf を検証してみよう: ? bnfcertify(bnf) %14 = 1 よって、結果は無条件に正しい事が確かめられた. 12 2.4 gp の文法 基本的な文法を組み合わせるだけで、できることがぐっと増える. 2.4.1 複数の文 gp の入力をセミコロン; で括ることで、同時に複数の文を実行できる. 2.4.2 if 文 ■条件分岐:if() if(判定条件, 真の場合に実行する部分, 偽の場合に実行する部分) gp の構文は少し独特で、例えば C 言語で if(cond){body;} と書くと ころを、上記のように、関数呼び出しのように(関数呼び出しについては 下記 2.4.4 参照)記述する.しかし、判定条件の部分が真ならば、 「偽の場 合に実行する部分」は評価されない.同様に、判定条件が偽ならば、「真 の場合に実行する部分」は評価されない. 例: ? if(1, 1, 1/0) %1 = 1 ? if(1, 1/0, 1) *** division by zero 関数呼び出しの場合は、呼び出し前に全ての引数が評価されるので、if() が関数ならば、先の例でも零除算例外が起きるはずである. 2.4.3 繰返し構文 ■くりかえし:for() for(変数の初期化, 上限, 実行する文) 13 例: ? for(d=1,100,if(isfundamental(d), h=qfbclassno(d); if(Mod(h,3)==Mod(0,3),print(d, ", ", h)))) ■総和関数:sum() sum(X=a,b,expr,x=0) 変数 X を含む式 expr を、X = a から X = b ま で評価し、x に足した値を返す. 例: ? sum(n=1,100,1/n^2)+.0 %2 = 1.634983900184892865077169498 P 2 この例では、 100 、0.0 を足 n=1 1/n を計算し(この時点では結果は有理数) 2 す事で実数に変換している.π /6 = 1.644934066848226436472415167... sum() は他にいくつかバリエーションがある.交代和を計算する sumalt(), 自然数の約数に渡る和を計算する sumdiv() など. 2.4.4 関数定義 ■関数定義の仕方: funcname(arg1, arg2, ...) = { local(v1, v2, ...); 関数の実体 } GP では、変数は基本的に大域変数である.一度値を割り当てられた変 数は、プログラムの全体で可視となる. local() は関数の本体の中でのみ使える特殊な関数で、その中に宣言さ れている変数を、関数に局所化する働きを持つ.上記の例だと、local() 宣言によって、v1, v2 は、関数 funcname() 内に局所化される.関数 funcname() の外に同じ名前の変数 v1, v2 があったとしても、それとは 無関係となる. 定義した関数を呼び出すには、引数とともに関数名を書けば良い. 14 2.4.5 例 H(3, N ) = L(1 − 3, χD ) × simple factor を計算する(−N = Df 2 ).正 確な定義は以下の通り:自然数 r と N ∈ Z に対して、(−1)r N = Df 2 , D は二次体の判別式、とする.この時、Cohen [1] が定義した一般化類数 H(r, N ) は、 ζ(1 − r) (N = 0), ³ ´ P H(r, N ) = L(1 − r, χD ) d|f µ(d)χD (d)dr−1 σ2r−1 fd (N ≡ 0, 1(mod 4)), 0 otherwise, ここで、ζ(s) は Riemann ゼータ関数で、負の整数点での値は Bernoulli 数 で与えられる.基本判別式 D に対して χD (·) は Legendre 記号、L(s, χD ) は χD に関する Dirichlet L 関数.負の整数点での値は、一般化 Bernoulli 数で与えられる.µ(·) は Möbius 関数、σk (·) は約数の k 乗和. ここでは、上の定義から直接計算するのではなく、Cohen(同論文)に よる −1 X s2 (N − s2 ) H(3, N ) = 126 s を使う.ただし、s2 (0) = 1/2, ¶ X µ³ n ´2 2 − 2d χ−4 (d), s2 (n) = d (n > 0). d|n 関数 s2 (n) を GP で書くと、以下のようになる.χd (a) が kronecker(d,a) となる: s2(n) = { if (n < 0, error("in s2(), arguments < 0")); if (n > 0, sumdiv(n, d, ((n/d)^2 - 2*d^2)*kronecker(-4,d)), 1/2) } 15 error() は、ユーザ定義のエラーを発生させる.プログラムの実行をその 時点で中断し、引数の文字列を表示する. 関数 H(3, N ) を、上の s2(n) を使って書くと、以下の h3(N) のように なる: h3(N) = { local(s); s = s2(N) + 2 * sum(s=1, sqrt(N), s2(N-s^2)); (-1/126)*s } 3 その他の話題 3.1 Pari-gp のコンパイル Unix 互換環境では、Pari-gp をソースコードからコンパイルすること も簡単である.自前でコンパイルすると、CPU に応じた最適化が可能で あったり、多倍長計算ライブラリを GMP にしたり、グラフィックライブ ラリに Qt や GNUplot を使うように指定できたり、といった利点がある. コンパイルの手続きを簡単に述べる.Pari-gp のソースコード一式を、 [4] に記載の web page から手に入れる.展開すると、Configure という スクリプトが同梱されているので、それを実行すると、環境に合わせて ソースコード一式を整えてくれるので、make 一発である.root になって、 make install すると、データファイルやマニュアル類も含めて、然るべき 場所にインストールされる(下記の/some/where というのは、Pari-gp の ソースが展開されているディレクトリ). $ $ $ # ./Configure make all && make bench su cd /some/where/; make install 16 開発中の最新版を入手する事もできる.まず、コンパイルしようとし ている環境に、CVS(というバージョン管理システム3 )がインストール されている事を確認する.インストールされていなければ、バイナリパッ ケージなどから適宜導入しておく. 開発版の Pari-gp のソースを展開したいディレクトリへ移動する.shell のコマンドラインから、次のように入力: $ cvs -d :pserver:[email protected]:/home/cvs login パスワードを聞かれるが、単にリターンキーを押すのみで良い. $ cvs -z3 -d :pserver:[email protected]:/home/cvs co pari 現在のディレクトリに pari というディレクトリが作成され、そこに開発中 の最新版の Pari-gp のソースコードが展開される.コンパイルの仕方は、 上述のとおり.ただし、最新版には、最新版のバグが含まれる事があるの で、注意が必要である. 3.2 初期設定ファイル .gprc というファイルを、自分のホームディレクトリに用意しておくと、 gp の起動時に自動的に読み込まれる.Pari-gp のソースファイルを展開す ると、misc/gprc.dft というファイルがあるので、これを /.gprc へコ ピーし、必要に応じて編集する.起動時に割り当てる pari stack の大きさ や、あらかじめ計算しておく素数の上限などの設定の他、よく使う自前の 関数定義などを書いておくと、手間が省ける. 行頭に連続する 2 つのバックスラッシュがあると、その行の最後までが コメントとなり、gp はその行を無視する.以下の例では、起動時に割り 当てる pari stack のサイズを 10M bytes に、素数のリストを 106 まで計 算し、各計算毎に消費した時間を表示するように設定する: 3 http://www.cvshome.org/ 17 \\ Stack size : 10^7 Bytes. parisize = 10M \\ Biggest precomputed prime (= prevprime(10^6)) primelimit = 1M \\ Set timer on timer = 1 3.3 C 言語と Pari ライブラリによる開発 「仙台数論小セミナー 2000 および仙台数論小研究集会 2000 報告集」、 2001 年 2 月発行、所収の筆者の記事「Computer Aided Number Theory —Introduction to Pari—」をご参照頂きたい. 3.4 GP2C —GP から C へのトランスレータ— GP2C は、ボルドー大の Bill Allombert 氏が開発を進めている、GP か ら C 言語へのトランスレータである.出力された C 言語のプログラムを、 ダイナミックリンクライブラリーにコンパイルし、gp にダイナミックリ ンクして使う. 3.4.1 GP2C のインストール GP2C は、今のところ Pari-gp に同梱されていない.gp2c のソースコー ド一式を http://pari.math.u-bordeaux.fr/pub/pari/GP2C/ から取得するか、CVS で最新のソースツリーをチェックアウトするかし て、自分でビルドするしかない.後者からコンパイルするには、autoconf, automake, などの開発ツールが必要である. 18 まず、Pari-gp のソースツリーが展開してあるディレクトリに移動する (ソースが展開されていなければ、展開しておく.できれば CVS により取 得した最新版がよい.§3.1 参照). 次に、gp2c のソースコードを展開する.上記の URL からソースコード を取得した場合は、それを展開する.CVS で最新版を取得する場合は、 $ cvs -d :pserver:[email protected]:/home/cvs login (パスワードを聞かれるが、単にリターンキーを押すのみで良い). $ cvs -z3 -d :pserver:[email protected]:/home/cvs co gp2c とすると、現在いるディレクトリの下に、gp2c というディレクトリが作成 され、その下に gp2c のソースコード一式が展開される.そこへ移動して (下記の/some/where は、gp2c のソースコード一式が展開してあるディレ クトリ)、 $ $ $ # # ./cvsinit ./configure && make su cd /some/where make install のようにして、gp2c をインストールする. 3.4.2 GP2C の使い方 gp2c は、引数として与えられた GP のプログラムファイルを、C のプ ログラムファイルへと変換し、標準出力へ吐き出すので、標準出力をリダ イレクトしてファイルに保存する.ここでは、sample.gp という GP のプ ログラムファイルがあるとする.この例は、2 から upto の範囲で d を動 √ かし、Q( −d) の類数が 3 で割り切れるものの個数 c を出力するものであ る.プログラムの中の:int という接尾子は、変数が整数型であることを 明示するもので、gp は現在のところ、無視する(upto:int と upto は同 19 じ変数とみなされる).しかし、gp2c はこの指定を理解し、変数の間の四 則や比較などの際に、より効率の良い関数を適用するコードを出力する. $ cat sample.gp f(upto:int) = { local(c:int, d:int, h); c = 0; for(d=2,upto, if(isfundamental(-d), h=qfbclassno(-d);\ if(Mod(h,3)==Mod(0,3), c++))); c } $ gp2c -g sample.gp > sample.gp.c 上記で gp2c に与えられているオプション-g は、メモリ管理の為のコード も出力するよう指示するものである. sample.gp.c の冒頭に、 /*-*- compile-command: "/usr/bin/gcc -c -o sample.gp.o -O3 -DGCC_INLINE -Wall -fno-strict-aliasing -fomit-frame-pointer -I/usr/local/include sample.gp.c && /usr/bin/gcc -o sample.gp.so -shared -O3 -DGCC_INLINE -Wall -fno-strict-aliasing -fomit-frame-pointer -Wl,-shared sample.gp.o -lc -lm -L/usr/local/lib -lgmp -L/usr/local/lib -lpari"; -*-*/ のように、sample.gp.cc をコンパイルする為のコマンドの指示(これは 当然コンパイルする環境によって異なる)があるので、その通りに入力し て、ダイナミックリンクライブラリを得る: $ /usr/bin/gcc -c -o sample.gp.o -O3 \ -DGCC_INLINE -Wall -fno-strict-aliasing -fomit-frame-pointer \ -I/usr/local/include sample.gp.c && /usr/bin/gcc -o sample.gp.so \ -shared -O3 -DGCC_INLINE -Wall -fno-strict-aliasing \ 20 -fomit-frame-pointer -Wl,-shared sample.gp.o -lc -lm -L/usr/local/lib \ -lgmp -L/usr/local/lib -lpari $ ls sample.gp.so sample.gp.so* この sample.gp.so を、gp に動的にリンクすれば、上記の関数 f() が使 えるようになる.そのための install() 関数(これは、gp にダイナミッ クリンクライブラリから関数を導入する gp の組み込み関数である)への 引数も、sample.gp.c の冒頭にかいてある: /* GP;install("f","G","f","./sample.gp.so"); GP;install("init_sample","v","init_sample","./sample.gp.so"); */ gp を起動して、このとおりに入力すれば良い: ? install("f","G","f","./sample.gp.so"); ? install("init_sample","v","init_sample","./sample.gp.so"); ? f f: installed function 上記のように、f() の説明を求めると、installed function と表示され れば、無事に使えるようになっている. gp2c により C 言語に変換して効率が良くなるのは、例えば、何重かに 渡るループを含むようなプログラムである.gp の処理系では、残念なが らこう言った処理が十分に洗練されていない. gp2c には、その他いくつかの機能があるが、それについては同梱のド キュメントに譲る. おわりに 北陸数論研究集会にお力添えを賜わりました皆様に御礼申し上げます. 報告集の編集に手間取り、出版が遅れてしまいました事をこの場をお借り 21 してお詫び申し上げます. 参考文献 [1] Henri Cohen, Sums involving the values at negative integers of Lfunctions of quadratic characters, Math. Ann. 217 (1975), no. 3, 271–285. MR 52 #3080 [2] , A course in computational algebraic number theory, Springer-Verlag, Berlin, 1993. MR 94i:11105 [3] , Advanced topics in computational number theory, SpringerVerlag, New York, 2000. MR 1 728 313 [4] The PARI Group, Bordeaux, PARI/GP, Version 2.2, 2004, available from http://pari.math.u-bordeaux.fr/. 〒 930-8555 富山市五福 4548 富山大学理学部 木村巌 [email protected] 22
© Copyright 2024 Paperzz