13

数値実験 de PARI/GP

674
0

PARI/GP

PARI/GP とは,数論特化の計算機代数アプリケーションで,完全無料です.ど素人ながら,今回はこの PARI/GP を用いて数値実験をしてみたいと思います.自分は級数と積分しか知らないので,初等数論などを嗜まれる御方は直ちにブラウザバックなさることが強く推奨されると思います.

始め方:青字の裏のリンク先で "GP in your browser" をクリック
マニュアル:"documentation" をクリックすると User's Guide をPDF形式でダウンロードするページになる

細々とした操作方法や関数の記法などは最後に「コマンドまとめ」で自分なりにまとめているので,もしエラー出て進まない時などに読んでいただければと思います.

lindep 関数

数値実験にあたり,lindep 関数さんに活躍してもらおうと思います.このlindep 関数,簡単に言うと「和が0になる係数の組を返す」です.しかしながら,あくまで観測できる数値の範囲でというもので,許容観測範囲の外で誤差が生じている可能性も考慮する必要があり,「厳密にこれが成り立つ」とは言えないと思います.たぶん.
実際のコマンドは,r 個の数値 i1,i2,..,ir に対して "lindep([i1,i2,...,ir])" と入力すると,設定した精度のもとで係数の組 "[o1,o2,...,or]" が出力されます.小さい係数が返ってくれば,(これは成り立ちそうだ…),なん十桁もの係数が返ってくれば,(これは成り立たなそうだ…)という感覚です.

具体例 1 級数

級数(とくに無限級数)の数値実験をします.使用する関数は sumalt 関数です.

sumalt 関数:sumalt(n=a,f(n)) でn=af(n)を表します.

次の等式があります.ソースは無いです.

ζ(2)=53n=0(1)n(2n+1)2(2nn)2(3n+1n)(6n+13n)n=1(1)n1(2n)2(2nn)2(3nn)(6n3n)

これを数値で見ていきます.実際のコマンドを以下に示します.

      ? \p300
   realprecision = 308 significant digits (300 digits displayed)
? B(x,y)=x!/((x-y)!*y!)
%2 = (x,y)->x!/((x-y)!*y!)
? A=sumalt(n=1,(-1)^(n-1)/(2*n)^2*B(2*n,n)^2/(B(3*n,n)*B(6*n,3*n)))
%3 = 0.0165069937265260166676913437968416377675540126881728385374890903187901826225326669644032884891609429020281857824156775146802567001136858734676123528440741379439409947492965160087696240702377038183569546337224613912692692996316598411617397400149051841712195780928871324056100093586452554123651029121737
? B=sumalt(n=0,(-1)^n/(2*n+1)^2*B(2*n,n)^2/(B(3*n+1,n)*B(6*n+1,3*n)))
%4 = 0.996864636344851471884063906265720096191902348336982765763828391813278591815440124478819313465351788923619502846851720916585388832271216196841629179504964248865404582470235472662412378565426655169101108057167693328728218731683449778223221785390968936560901088107291484274347892942190460874086172183199
? lindep([zeta(2),A,B])
%5 = [-3, -3, 5]~
    

"?" が付いている行が入力(実際の入力は "?" より後ろ部分)で,"%数字" が出力です.
だいたいの流れは

1.精度の設定

2.関数 B(x,y) の定義B(x,y)=x!(xy)!y!

3.数 A の定義A=n=1(1)n1(2n)2(2nn)2(3nn)(6n3n)

4.数 B の定義B=n=0(1)n(2n+1)2(2nn)2(3n+1n)(6n+13n)

5.ζ(2)ABの和が0になる係数の出力

です.結果をみると,

3ζ(2)3A+5B=0

を示唆していることになります.
また,少し乱暴な主張ですが,こういう式はたいてい weight を1上げても成り立つのでそれも数値で見てしまいます.

      ? \p300
   realprecision = 308 significant digits (300 digits displayed)
? B(x,y)=x!/((x-y)!*y!)
%2 = (x,y)->x!/((x-y)!*y!)
? C=sumalt(n=1,(-1)^(n-1)/(2*n)^3*B(2*n,n)^2/(B(3*n,n)*B(6*n,3*n)))
%3 = 0.00829319533331464343025861754414363981361156213223294552475033315238564646326796460009190579067969346408578036836708702147502921058709882869816135554142615132391631560916655672716392607297744976003823399042811643637263159348554128414055681993736245647846645744959400137647769392005565737941547789307612
? D=sumalt(n=0,(-1)^n/(2*n+1)^3*B(2*n,n)^2/(B(3*n+1,n)*B(6*n+1,3*n)))
%4 = 0.998949687521890356689695595411493779032951389573004752985309518400736622667504920288682592744219483967137371373261570508251653595365369735247610245826108084103646047254744536690271670910876261949955225261244047263841702619642748448019746397608975227830524045108286251241030379165637783808808994820359
? lindep([zeta(3),C,D])
%5 = [-5, 2, 6]~
    

ということで

ζ(3)=65n=0(1)n(2n+1)3(2nn)2(3n+1n)(6n+13n)+25n=1(1)n1(2n)3(2nn)2(3nn)(6n3n)

が示唆されます.

具体例 2 積分

単なる定積分では,intnum 関数を用います.

intnum 関数:intnum(x=a,b,f(x)) でabf(x)dxを表します.

第一種完全楕円積分K(x)に関する式を調べてみました.

      ? \p300
   realprecision = 308 significant digits (300 digits displayed)
? A(n)=intnum(x=0,1,x^n*ellK(sqrt(1-x^2))^3)
%2 = (n)->intnum(x=0,1,x^n*ellK(sqrt(1-x^2))^3)
? lindep([Pi^4,A(0),A(2)])
%3 = [-1, 8, -40]~
    

ということで,

π48=01(15x2)K(x)3dx

が示唆されます.

コマンドまとめ

出力

"Shift + Enter" で出力します.

精度

"\p200" で200桁の精度で計算します.数字を上げるほど精度が上がりますが,同時に処理速度は落ちます.

定義

数値を文字でおく場合は,そのまま "文字=・・・" と入力すればよいです.変数をもつ関数の場合は "f(x,y,...)=・・・"とすればよいです.f 以外の文字も使えますが,I(大文字のアイ)は使えません.

乗算

乗算する場合は必ず "" を挟みます.でないとエラーが生じます.

代入

変数に数値を代入する場合は頭に "x=a;y=b;..." のように入力します.

特殊関数

三角関数:sin(x), asin(x), sinh(x), asinh(x) など
リーマンゼータ関数:zeta(x)
多重ゼータ関数:zetamult([a1,a2,...,ar])   インデックスの向きは右から左です.
ガンマ関数:gamma(x)
第一種完全楕円積分:ellK(x)
超幾何級数:hypergeom([a1,a2,...,ap], [b1,b2,...,bq], x)
第一種ルジャンドル多項式:pollegendre(n,x)

数学定数他

無限大:-oo, +oo (小文字のオーが二つ)
虚数単位:I(大文字のアイ)
円周率:Pi
オイラーの定数:Euler
カタランの定数:Catalan

級数

sumalt(n=a,f(n)) で,n=af(n)

sum(n=a,b,f(n),0.) で,n=abf(n)   f(n) の後ろに ",0." を付けます.

積分

intnum(x=a,b,f(x)) で,abf(x)dx

出力結果の利用

"%数字" で出力された数値は,そのラベル "%数字" で使うことができます.

投稿日:2023117
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. PARI/GP
  2. lindep 関数
  3. 具体例 1 級数
  4. 具体例 2 積分
  5. コマンドまとめ
  6. 出力
  7. 精度
  8. 定義
  9. 乗算
  10. 代入
  11. 特殊関数
  12. 数学定数他
  13. 級数
  14. 積分
  15. 出力結果の利用