Loading [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js

4n+1の素数を平方の和にする(その2)

相当前にエントリに書いた4n+1の素数を平方の和にするアルゴリズムですがガウス整数を使ったもっとスマートな解法を紹介します。

まず前回同様 p4n+1の素数として A^2 + 1 = 0 (\mod p) なるAを求めます。

A^2 + 1 = k p です。

左辺はガウス整数を使うとさらに因数分解できて (A + i)(A - i) = k p となります。

ここでガウス整数は通常の整数と同様、素因数分解等素数の性質があることを踏まえて等式を見てみます。

pはあきらかにA+iおよびA-iを割きりません。ということはpはガウス整数の世界ではさらなる素数に分解できることを意味します。すなわち最大公約数(A+i, p)は1ではなく、x+iyの形をしたガウス整数となります。

(A+i, p) = x + iy ならば共役の関係から (A-i, p) = x - iyがまた成立します。 一方(x + iy)(x - iy)を考えるとこれは有理整数x^2+y^2となりこれはpを割り切らないといけませんが、 pは素数ですから結局これはpに等しくp = x^2 + y^2となります。

つまりpA+iの最大公約数を求めればそこから解は自動的に求まることになります。

最大公約数はガウス整数の世界でもユークリッドの互除法で簡単に求めることができます。

例として、素数p=120710677を二つの和にしてみます

46505545^2 + 1^2 = 17916938 \times 120710677

ですから最初は46505545+i120710677の最大公約数を求めればよいことになります。

A_0 = 46505545+i\\ B_0 = 120710677 とします。

ノルムを比較すると|A_0| < |B_0|A_0 = 3 * |B_0| + ... ですから最初の計算では A_1 = A_0, B_1 = B_0 - 3A_0とすればよいことがわかります。 実際計算してみると A_1 = 46505545+i\\ B_1 = -18805958-3i となります。以下同様にして計算していくと

\begin{align} A_2&=&8893629-5i, B_2&=&-18805958-3i\\ A_3&=&8893629-5i, B_3&=&-1018700-13i\\ A_4&=&-274671-122i, B_4&=&-1018700-13i\\ A_5&=&-274671-122i, B_5&=&79984+475i\\ A_6&=&-34719+1303i, B_6&=&79984+475i\\ A_7&=&-34719+1303i, B_7&=&10546+3081i \end{align} ここでB_7が求める答えになります。実際 10546^2+3081^2 = 120710677 です

注意

ユークリッドの互除法ではノルムの大きいほうをノルムの小さいほうで割ってその余りに置き換えるという手順を踏むのですが、それは以下のようにして求めます。

a+ibc+idで割る場合は \frac{a+ib}{c+id} = \frac{(a+ib)(c-id)}{c^2+d^2} = \frac{ac+bd}{c^2+d^2} + \frac{bc-ad}{c^2+d^2}i ここで、有理数 \frac{ac+bd}{c^2+d^2}, \frac{bc-ad}{c^2+d^2} に最も近い整数をn, mとすれば (a+ib) = (n+im)(c+id) + (r+is) と書いたときに、r+isのノルムはc+idより小さくなります。よってr+isを余りとみなして計算を進めていくことができます。

別の考察

この例では(A+i, p)を考えましたが、(A+i, k)を考えても同様に計算をすることができることがわかります。

この場合最大公約数を求めなくても以下のように計算をすることができます。

a^2 + b^2 = 0 (\mod k) であることを考えると a' = a(\mod k), b' = b(\mod k)とおけば a'^2 + b'^2 = 0 (\mod k) もまた成立します。つまりa'^2 + b'^2kを割りきります。つまり \frac{(a+ib)(a-ib)}{(a'+ib')(a'-ib')} = \frac{k}{a'^2 + b'^2}p = k'p が成立します。右辺は整数ですから左辺は共役なガウス整数の積にならなければなりません。 よって \frac{a+ib}{a'+ib'}または\frac{a+ib}{a'-ib'} のどちらかがガウス整数になります。ここで \begin{align} -k/2 &<& a' &<& k/2\\ -k/2 &<& b' &<& k/2 \end{align} なるように a', b'を選べば kより小さい k'が見つかることになります。 この手順を繰替えせば kより始めていつかは1になるので求める解を見付けることができます。

これが前回解説したアルゴリズムと同じものになります。

さらりと流した部分の補足

有理整数がガウス整数の積で表わされる必要条件は共役の因子を含むことである。

ガウス整数をそれぞれ a+ibc+idとする。c\ne 0, d\ne 0, (a,b)=1, (c,d)=1と仮定して問題ない。 なぜならもし(a,b)=k > 1ならばa' = a/k, b' = b/kとして k(a' + ib')(c+id)を考えればよいからである。 (a+ib)(c+id) = (ac-bd) + i(ad+bc) が有理整数なのだからad+bc=0すなわち ad=-bcが成立する。 よって、abと互いに素だからcdを割り切りかつdcを割きらなければならないが、 これは c=dまたはc=-dを意味する。c=dとすればa=-bでありc=-dとすれば a=bである。 いずれにしても共役の因子を含まなくてはならない。

有理整数が共役の数の積で表わされているのなら、その数はガウス整数でなければならない。

a/bおよびc/dを考える。(a,b)=1, (c,d)=1と仮定して問題ない (\frac{a}{b}+i\frac{c}{d})(\frac{a}{b}-i\frac{c}{d}) = \frac{a^2c^2}{b^2d^2} から b^2d^2 = 1 これはb=\pm 1, d=\pm 1を意味する。

Posted by issei

カテゴリ : 数学