Maxima で綴る数学の旅

紙と鉛筆の代わりに、数式処理システムMaxima / Macsyma を使って、数学を楽しみましょう

-数学- p進数入門 有理数のp進絶対値の定義と計算, padicsパッケージ

 

p進数、p進附値、p進絶対値、p進L関数、、、など数論の世界には実数とは違ったp進の世界があり、その数の理論を使って数学の様々な定理が証明されている、と書物には書いてあります。

そうは言っても、Maximaにはp進数を扱えるようなパッケージはないし、普通の複素数や実数の世界ならMaximaで試せることは色々ある、、、と信じ、あまりそちらの世界には足を踏み入れませんでした。

ところが、今年の8月に、メキシコの大学のJosé Antonio Vallejo先生が、p進数をMaximaで扱えるパッケージpadicsをアナウンスしました。

CISSPの試験準備に忙しく、なかなかさわれなかったのですが、最近ようやくp進数について勉強を始め、padicsパッケージを使い始めてみました。これからしばらく、p進数とVallejo先生のpadicsパッケージ入門の記事を書いていきます。「数学ガール」的に言えばMaximaを使いながら「まずp進数とお友達になろう」という話です。

 

p進数の勉強方法にはいくつかの方法があるようですが、あまり悩まず、p進絶対値(p-adic norm)やp進距離(p-adic distance)から入門することにしました。ですので当面「無限桁の整数」のような話は出てきません。

 

ちなみにpadicsパッケージを使うための準備ですが、パッケージとは言っても実質padics.macという1つのファイルを読み込めば使えます。上記のGithubレポジトリからダウンロードして、file_search_maxima変数に登録されているパスのどこかに配置するか、フルパスを指定してloadすれば使えます。

 

以下準備です。 パッケージを読み込みます。またpadic_norm()関数の名詞形を美しく表示できるようにtexput()を設定します。

(%i1) load("padics")$
(%i2) texput(nounify(padic_norm),
lambda([arglist],block([f1,f2],[f1,f2]:args(arglist),
concat("\\left| ", tex1(f1), " \\right|_{",tex1(f2),"}"))))$

 

ちなみにまずp進絶対値の定義から。pを与えられた素数とすると、0ではない任意の有理数xは、aを整数、r, sをpを素因数に含まない整数として、
(%i3) x=p^a*r/s;
$$ \tag{%o3} x=\frac{p^{a}\,r}{s} $$

のように一意に分解することができます(xの符号はrに含め、sは正としましょう)。すると、xのp進絶対値は上記pとaを用いて定義できます。
(%i4) 'padic_norm(x,p)=p^(-a);
$$ \tag{%o4} \left| x \right|_{p}=\frac{1}{p^{a}} $$

をxのp進絶対値と呼びます。

後述の参考文献にもありますが、a(p進附値と呼ばれています)は有理数xがどれくらい(何回)素数pで割り切れるのかの度合いを表します。p進絶対値は、割り切りの度合いが高いほど、絶対値が小さくなるように定義が作られています。

では実際に適当にpとxを決めてxのp進絶対値を計算してみましょう。padicsパッケージの中のpadic_norm(x,p)という関数を使えばこの計算をしてくれます。

22を例に取り、まず2進絶対値を計算します。

(%i5) 'padic_norm(22,2)=padic_norm(22,2);
$$ \tag{%o5} \left| 22 \right|_{2}=\frac{1}{2} $$

確かに22は2で1度だけ割り切れるので、\(\frac{1}{2^1}\)が答えです。

次は22の11進絶対値を計算します。
(%i6) 'padic_norm(22,11)=padic_norm(22,11);
$$ \tag{%o6} \left| 22 \right|_{11}=\frac{1}{11} $$

22は11で一度だけ割り切れることから\(\frac{1}{11^1}\)となりました。

一方、22の13進絶対値は、
(%i7) 'padic_norm(22,13)=padic_norm(22,13);
$$ \tag{%o7} \left| 22 \right|_{13}=1 $$

22は13で割り切れない、つまり0回割り切れることから\(\frac{1}{13^0}=1\)が答えとなります。

今度は242を例に取ります。\(242=2\, 11^2\)であることから以下の計算が正しいことがわかります。
(%i8) 'padic_norm(242,2)=padic_norm(242,2);
$$ \tag{%o8} \left| 242 \right|_{2}=\frac{1}{2} $$
(%i9) 'padic_norm(242,11)=padic_norm(242,11);
$$ \tag{%o9} \left| 242 \right|_{11}=\frac{1}{121} $$

 

まとめ:有理数に対してp進絶対値の定義を知り、pで割り切れる度合いが大きくなるほど、p進絶対値は小さくなることがわかりました。padicsパッケージのpadic_norm(x,p)を使って実際にxのp進絶対値を計算してみました。

 

の第2章「p進数」の最初の数ページを参考にしました。