円分多項式について考えたことを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型であることが分かります。