91 という数は、見た目が素数っぽくてつい間違えてしまうという
素数と間違えやすいので、たとえば素数を使ったカードゲーム*1においては、間違えて悔しい思いをした方もいるかもしれません。
「いやな数」と思われがちな 91 ですが、tsujimotterとしてはどんな数でも好きになってもらいたい。
そんな風に考えていたかどうかはさておき・・・
もしかしたら 91 が素数判定で活躍するかもしれない というアイデアを得ましたのでご紹介します。
「7の倍数」と「13の倍数」の判定が課題
そもそも「素数判定」ってみなさんどのようにしていますか?
基本的には判定したい数を小さい順に並べられた素数 で割っていって、割り切れなければ素数とわかるわけですね。
2の倍数と5の倍数は下1桁目ですぐに判定できますし、3の倍数や11の倍数もよい判定法があります。
もし まで倍数判定できれば:
- より小さい数はすべて素数判定できたことになります
- 5桁の数はほぼ半分の確率で素数であることがわかります*2。
したがって、「7の倍数の判定」と「13の倍数の判定」ができることが重要な課題となります。
91 をどう使うか
ところで、91を素因数分解すると
となりますね。ちょうど と を素因数に持ちます。
この事実を使って,「7の倍数の判定」と「13の倍数の判定」を「同時に」行うのです!
使うのは、ユークリッドの互除法 です。
ユークリッドの互除法
ユークリッドの互除法とは、2つの数の共通の約数(公約数)を求める効率的なアルゴリズムです。
6と4の最大公約数は2ですね。このことを記号で以下のように書きます。
これぐらいの桁の最大公約数であれば、暗算で簡単に計算できると思うのですが、桁数が大きくなると大変ですね。こんなときにユークリッドの互除法を使います。
ユークリッドの互除法では、「引き算」を使って最大公約数を求める数の桁数を減らしていきます。
の最大公約数 においては、一般的に以下のような式が成り立ちます。
としておきます。すなわち、一方の数で他方を引いた数の最大公約数は、元の最大公約数に一致するのです。
たとえば、 を計算してみましょう。なんでか知りませんが、よく出てくる例なのです。
次に、 から を引いていきます。引けるだけ引いていいので、 を引きます。
さらに から を引いていくと、ちょうど となって消えますね。したがって、 と の最大公約数は となるわけです。
引き算を繰り返しても最大公約数は変わらないので、
が得られました。
以上がユークリッドの互除法と呼ばれるアルゴリズムです。
91 を使った「7の倍数」「13の倍数」同時判定法
準備が整ったので、本記事の倍数判定法をご紹介します。
ユークリッド互除法を使って、倍数判定したい数 と 91 との最大公約数をとります。最大公約数のパターンとしては、 か か か のいずれかになります。
と の最大公約数 | は「の倍数」か? | は「の倍数」か? |
---|---|---|
NO | NO | |
YES | NO | |
NO | YES | |
YES | YES |
そう、ユークリッドの互除法を使うだけで、「7の倍数」と「13の倍数」の判定を同時に行うことができるのです。
すごくないですか?
実際に計算してみる前に、ユークリッドの互除法のコツを一つ紹介します。今回の互除法では、使う計算は の引き算だけですが、この引き算を効率的に暗算する方法です。
暗算が得意な人は感覚でやっていると思うのですが、 を引くときは、
という計算をすれば簡単になります。もっとやるなら、
をしてあげればよいでしょう。
それでは、具体例を用いて実際に計算をしてみましょう。
例:4123
そこで、ユークリッドの互除法を使って、 の倍数か の倍数か考えてみましょう。
から を引くために、 を引いてから を足して を引きます。
次に、 から を引きます。このとき、 を引くとマイナスになってしまってやりづらいですね。ここは、一旦先に を足してから と を引くといいでしょう。
さて、これで が を下回りました。二桁なので素因数分解は簡単ですね。
なので は の倍数です。
したがって、元々の の最大公約数が 、つまり は の倍数であることがわかりました。
簡単でしょう?
ちなみにこんな風に素因数分解されます。
例:4121
から を引くために、 を引いてから を足して を引きます。
を引くために、 を足してから と を引きます。
以上より、 は明らかに の倍数ですから、 が の倍数であることがわかりました。
ちなみに、 と は素数です*3。ぜひ同じように計算してみてください。
まとめ
今日はユークリッドの互除法と を用いて、「 の倍数の判定」と「 の倍数の判定」を同時に行う方法についてご紹介しました。
この方法の最大のポイントは、引き算をした結果を「 の倍数の判定」と「 の倍数の判定」の両方に活用できるという点です。普通に素数判定をすると、 の倍数の判定に使った計算は、ほかの素数の判定には利用できませんね。複数の素数を素因数に持つ のような数を用いるとこんなこともできるのです。
もう一つのポイントは、引き算だけで 91 より小さい数に押さえ込めるという点です。二桁の数が 7 の倍数(13の倍数)かどうか判定することは、我々には容易ですね!
(しかも紛らわしい 91 を判定する必要がない)
最後に、こういう身近な話題から数学の一般的なお話ができるのは楽しいですね。ユークリッドの互除法が使えるというのは個人的に驚きで、素数判定の話題を通してユークリッドの互除法が解説できたのは非常に嬉しかったです。
それでは今日はこの辺で。
*1:たとえば、「素数大富豪」という素晴らしいトランプゲームがあります。 integers.hatenablog.com
*2:参考:13までの素数判定に関する根拠 30030=2*3*5*7*11*13なので、素数計数関数とオイラー関数による値 この
(π(90090)-π(30030))/(φ(90090)-φ(30030))=5480/11520
は、30030から90090までで「13以下の素数で割れないもののうち素数であるものの割合」です
5480/11520≒47.6%
は、5桁の自然数についての同様の式の値
(π(10^5)-π(10^4))/(φ(10^5)-φ(10^4))
に近いはずなので、
"5桁でも13まで確かめれば2つに1つくらい素数"
と言えますね #素数大富豪
*3:4127 と 4129 は、素数大富豪なら "4" "Q(12)" "7" or "9" で出すことができるので、ぜひ覚えましょう。