Maxima で綴る数学の旅

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

2次形式の素因数分解、2次形式で表される素数

f:id:jurupapa:20060122151926j:plain

 

円分多項式について考えたことを2次形式でもやってみます。

数論入門 (現代数学への入門)

数論入門 (現代数学への入門)

の第6章「2次体の整数論」を参考にしています。

もっとも簡単な2次形式は \( x^2+y^2 \) 。この式でx, yに自然数の値をいろいろと代入してみます。

ちょっと気をつけたいのは、\( x^2+y^2 \) は必ずxとyの公約数(より詳細には公約数の2乗)で割り切れることです。このため \( x^2+y^2 \) の素因数分解にはxとyの公約数が出てきてしまいます。このようなつまらないケースを避けるために、xとyが互いに素(最大公約数が1)の場合に限定してみます。

以下のようにプログラムに組み立ててみました。

(%i1) expfactor(exp,maxN):=block([factors_only],factors_only:true,

                apply(append,makelist(makelist([m,i],i,1,maxN),m,1,maxN)),

                map(lambda([xy],block([x,y],

                       if gcd(xy[1],xy[2])>1 then 1 else ev(exp,x:xy[1],y:xy[2]))),%%),

                map(lambda([n],ifactors(n)),%%),

                apply(append,%%),

                sort(unique(%%)));

 

makelist()を2重に使うことで[[1,1],[1,2],...,[1,maxN],[2,1],[2,2],...,[2,maxN],,,[maxN,maxN]]のような数字のペアのリストを生成します。 

すべてのペアについて、ペアの数字が互いに素の場合にexpを評価します。

結果をifactors()を使って素因数分解します。この時factors_onlyがtrueに設定されているので、指数は無視されます。

素因数のリストをすべて連結し、重複を取り、ソートします。

 

以上のプログラムで \( x, y \leq 20 \) の範囲で(x,y)=1の場合の \( x^2+y^2 \) を計算し、そこに現れる素因数をすべて集めてみます。

(%i2) x^2+y^2;

$$ \tag{%o2} y^2+x^2 $$

(%i3) expfactor(%,20);

$$ \tag{%o3} \left[ 2 , 5 , 13 , 17 , 29 , 37 , 41 , 53 , 61 , 73 , 89 , 97 , 101 , 109 , 113 , 137 , \\ 149 , 157 , 173 , 181 , 193 , 197 , 229 , 233 , 241 , 257 , 269 , 277 , 281 , 293 , \\ 313 , 317 , 337 , 349 , 353 , 373 , 389 , 397 , 401 , 409 , 421 , 433 , 449 , 461 , \\ 521 , 557 , 569 , 613 , 617 , 761 \right]  $$

規則性がわかりますか?すべての素因数が2あるいは4n+1の形になっています。これは次の計算で簡単にわかります。

(%i4) map(lambda([p],mod(p,4)),%);

$$ \tag{%o4} \left[ 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , \\ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , \\ 1 , 1 , 1 , 1 , 1 , 1 , 1 \right]  $$

\( x^2+y^2 \) の素因数分解がその数自身になる場合があります。つまり \( x^2+y^2 \) が素数になる場合です。このとき上記からこの素数は必ず2あるいは4n+1型であることが分かります。