以前、第2回プログラマのための勉強会 というところで「時計の世界の整数論」という発表をしました。
「時計の世界の整数論」は, が素数のときの 上での整数論についてまとめたものです。その中で以下の定理がありました。
図は, として におけるべき乗をすべて列挙した表ですが, において, の間に のすべての数が巡回されていることが分かります。
このような元 のことを「原始根」と呼びます。素数 においては以下の「原始根定理」が成り立つことが知られています。
原始根定理:
が素数のとき, においては,少なくとも1つの原始根が存在する.
における原始根は, の4つですね。
ところで,上の発表を作っているときは,原始根 は,特に法則なくたまたま現れるのだと考えていました。原始根は少なくとも1つはあることが分かるけれど,実際に計算してみないと,その個数も分からないのであると。
私のお気に入りである以下の整数論のブログ記事を読んでいたときに,実は原始根にはパターンがあるのだと気づきました。正確に言うと,この記事にはちゃんと書いてあったのですが私が理解しきれていませんでした。
biteki-math.hatenablog.com
自分の中で改めて考えてみたら,モヤモヤとしていた整数論の知識がスッキリ整理されて感動しましたので,その感動を伝えたいと思ってこの記事を書き始めました。
しばし,お付き合いください。
前提
この記事は,「時計の世界の整数論」の発表内容を前提に書いています。以下のようにスライドと動画がまとめられていますので,まだ見ていない方は(「原始根定理」が登場するまであたりを)ぜひ見てから読んでみてください。
mod p の元を原始根で表す
まず,原始根定理を仮定することからはじめましょう。
における原始根を とおくと, のすべての元のうち, 以外のものは以下のように原始根のべき乗で表せることが分かります。
ただし,以上はすべて における同値類を表していて,その数そのものではありません。
ここで, 以降の数が,上に含まれていないことに注意してください。フェルマーの小定理より,
が成り立ち,以降は同じ数が繰り返し現れるためです。
少し用語を整理しておきましょう。
を整数としたとき, における同値類を剰余類と呼び,その集合を と表記します。また のうち, と互いに素である剰余類を既約剰余類といい,その集合を と書きます。 が素数のとき, には を除く より小さいすべての元に対応した剰余類が入ります。
また, は乗法について群をなすことが知られています。したがって,これを 既約剰余類群ともいいます。一方, は加法について群をなします。このことを加味して,加法群 のように呼んだりします。
さて, における原始根 のべき乗の集合は,既約剰余類群 を表していることがわかります。
以上から, は,原始根 によって生成される 巡回群 なので,このように書いてもいいでしょう。
ほかの原始根
さて,ここで は1つめの原始根だったわけですが,ほかにも原始根が存在してもよいわけですよね。それを確認してみましょう。
たとえば, としたとき,
となりますが,以下のように を原始根とすることも出来そうです。
フェルマーの小定理から,べき乗は で一周することを考慮すると,
と表せて,たしかに指数がすべて巡回していることが確認できました。
同様に,原始根を としたときも,以下のように巡回できます。
結局のところ,指数 を何度も足し合わせていったときに のすべての数を回るのであれば, が原始根になっていることがわかりますね。この記事では,このように の定数倍 (ただし )が の元をすべて回ることを「完全巡回」と呼ぶことにしましょう。
このように 「 が で原始根であること」は「その指数 が で完全巡回すること」に対応していることがわかります。
群の同型
もっと一般的なケースについて考えてみましょう。すなわち, の元と,それらを原始根のべき乗で表したときの指数との関係を考えます。
まずは, の原始根を1つ選んで とし,これを使った写像 を考えます。
の場合の状況を図に表すとこんな具合です。
この写像は,以下の2つの性質を満たします。
1. 既約剰余類 の元 と1つ位数の小さい剰余類 の元 を一対一対応させる写像になっています。(全単射)
2. さらに,写像 には に対して以下の等式を満たします。
この式は,積を和に変換している等式になっていることに気づくでしょう。 は乗法に関して群を成し, は加法に関して群を成しますので,写像 は群の演算を保存している,とみることもできます。
以上の2点を満たす写像 を 群同型写像 と言い,群同型写像によって結ばれる2つの群 , は 群同型 であると言います。このことは,以下のように簡潔に表現されます。
以上により, , は同型な群であることがわかったので,今度は について考えていきましょう。
完全巡回の条件
先の議論により,指数 が において完全巡回するときに限り, が の原始根となるのでした。次は, において完全巡回する元の条件を考えましょう。
時間時計において から始まって数 を加え続けることを考えてみましょう。みなさん経験則で知っているように思いますが と が互いに素であるときに限り,すべての数を通ります。
たとえば のとき, ですから, と互いに素な数は です。したがって, 時間時計においては,次の図のように が完全巡回することになります。
このことは,ユークリッドの互除法によって示せます。
と が互いに素であれば,ユークリッドの互除法により, となるような が存在します。したがって において であるから, を最大 回加えれば, 時間時計のすべての数を1度ずつ巡回しますね。逆に, と が互いに素でなければ, を満たす は存在しませんから, をいくら加えても に辿りつくことはありません。
一方で, と互いに素な剰余類の集合は ですから, のとき は を完全巡回する,と言い換えてもいいでしょう。
話を原始根に戻すと,その元 を指数として を作ると,これが の原始根になります。これで,原始根の見つけ方がわかりましたね。
図にするとこんな感じです。
の元の数は ですから,原始根の数が 個であることもわかりました。
これですっきり解決です!
結論
- が素数のとき, においては,少なくとも1つの原始根が存在する。
- を における原始根とし, であるとき, もまた の原始根である。
- 原始根の数は, に等しい。
これを使うと,1つの原始根をみつけることで,すべての原始根を列挙することが可能です。
最後に,具体例をいくつか計算して終わりましょう。
の場合
原始根の個数は です。
とすると, より, は原始根の1つです。
の元は であるから,対応する が原始根となります。すなわち で考えると の4つが原始根です。
の場合
原始根の個数は です。
とすると, より, は原始根の1つです。
の元は であるから,対応する が原始根となります。すなわち で考えると の4つが原始根です。
の場合
原始根の個数は です。
とすると, より, は原始根の1つです。
( は では,原始根にはなりません。)
の元は であるから,対応する が原始根となります。すなわち で考えると の8つが原始根です。
ぜひみなさんも自分で確かめてみてくださいね。
それでは今日はこの辺で。
おまけ:原始根を求める Ruby スクリプト
実行結果:
$ ruby primitive_root.rb p = 11 phi(p-1) = 4 r = 2 primetive roots: [2, 6, 7, 8] p = 13 phi(p-1) = 4 r = 2 primetive roots: [2, 6, 7, 11] p = 17 phi(p-1) = 8 r = 3 primetive roots: [3, 5, 6, 7, 10, 11, 12, 14]