見出し画像

暗算で素数判定(証明付き)



 おはようございます。リユルンと申します。

 さて、皆さんは時折 「この数、素数じゃないか」って疑いを持つことありますよね?(無いか、
まあこのnoteは素因数分解にでも利用して下さい)


 例えば、第7世代(7も素数)、
USUMの発売年の2017年、
2017という数字は素数なんですよね。

 また、発売日は11月17日、数字を横に並べた1117、これも素数です。

 種族値が全て素数(アーゴヨンのS121は除く)なウルトラビーストが登場した世代ならではの特色だと感じてます。


 目次的なもの

どこまで調べればいいの?

2の倍数か調べる方法

3の倍数か調べる方法

5の倍数か調べる方法

11の倍数か調べる方法

その他の倍数か調べる方法

おわりに


 どこまで調べればいいの?

 素数というのは、約数が1とその数自身の合計2つしか無い数です。

 そのため、約数があると仮定すると、
 素数判定したい数を素因数分解したときにa×b、という何かしらの式が出来上がりますよね。

 このaはb以下の数と仮定できます。
(bの方を小さいと仮定しても、交換法則により関係ありません)

 そうした時、bの部分までゴリ押しするよりも、aの部分までたどり着ければ、(1とその数以外の)約数を導き出せますよね。


 そして、そのaとbの差が最も少なく、aが最も大きい数になるのはのは、aとbが同じ数の時です。
 (例:121=11×11)

 つまり、その数が 何と何の2乗の間にあるのかが導き出せれば、どこまで確認すればいいのかが分かるのです

 例えば、2017は 50×50=2500、40×40=1600、45×45=2025…! と求めていけば、

 43×43<2017<45×45 なので、
(完璧に証明するためには)43までの素数で割れるか否かを計算するだけになります

 (44は元々素数ではなく、さすがに上の式から43×43<2017ということは分かるのでカットしてます)

 あ、45×45も充分苦しそうですが、暗算で出来ますよ。この記事の終わりにでも計算方法を載せようと思います


 2の倍数か調べる方法

 1の位が偶数か、以上。
さすがに、証明はしなくていいですよね…


 3の倍数か調べる方法

 それぞれの位の数字を足して3の倍数→3の倍数です
 例えば2017では2+0+1+7=10、
    1117では1+1+1+7=10なので、どちらも素数ではありません

 ―以下(ラフではありますが)証明―

 例えば 3桁の数字を式で表現してみると、

 100a+10b+cとなります

 100a=99a+a、10b=9b+bなので(これらを代入して)

 99a+a+9b+b+c
=99a+9b+a+b+cと変換でき、
9でくくると
 9(11a+b)+a+b+cとなります。

 9は3の倍数なので、[a+b+c]が3の倍数なら
式全体を3でくくれる→3の倍数であることが確定

 桁数が増えていっても、同じような式に出来ます。
 (試しに1000dとか追加してみると 分かりやすいでしょう)

 

 5の倍数か調べる方法

 1の位が5か0か、以上。
 これも さすがに証明しなくていいですよね…

 11の倍数か調べる方法

 [奇数行目の数字の和]と[偶数行目の数字の和]の差が0もしくは11の倍数→11の倍数です

 例えば2017だと(0+7)-(2+1)=7-3=4、
    1117だと(1+7)-(1+1)=8-2=6なので
どちらも11の倍数ではありません

 ―以下(ラフではありますが)証明―

 例えば 4桁の数字を式で表現してみると、

 1000a+100b+10c+d となります。

d以外を10でくくって
 10(100a+10b+c)+d とします

 次に、dより右の部分の係数を11にします。
そして それにより増えた分(100a+10b+c)を引いて均衡をとります。

 11(100a+10b+c)-(100a+10b+c)+d…① と します。後で使います


 そうして出てきた100a+10b+cは(実質符号が逆とはいえ)3桁の数字と表現できますよね。

 つまり これを利用して3桁の数字の場合まで証明できます。

 これも同じように、係数が11になるところを出した式にしていきます
 100a+10b+c
=10(10a+b)+c
=11(10a+b)-(10a+b)+c…②

 そうして出てきた10a+bは(実質符号が逆とはいえ)2桁の数字ですよね。
 つまり(以下略)

 ただ しここまで来ると10aを11a-aと表現するだけでよくなります。

 10a+b
=(11a-a)+b…③
=11a-a+b、
分かりやすく変換すると11a-(a-b)

 ここまでくれば、aとbの差が0もしくは11の倍数だと、式を全て11でくくれるようになるので 証明完了ですね

 そしてこの式を3桁や4桁の時に代入すると同じように証明できます。


 100a+10b+c (②より)
=11(10a+b)-(10a+b)+c (③より)
=11(10a+b)-(11a-a+b)+c
=11(10a+b)-11a+a-b+c…④

 同じく 11の係数がかかっていないところに着目すると、符号が互い違いになっていますよね。

 分かりやすく変換するとa+c-bになり、
奇数行目の和から偶数行目の和を引いています。

 そしてこれが 0もしくは11の倍数だと、式全体を11でくくれるようになるので証明完了です。


 もうお分かりかもしれませんが、4桁でも代入すると、
 1000a+100b+10c+d (①より)
=11(100a+10b+c)-(100a+10b+c)+d (④より)
=11(100a+10b+c)-(11(10a+b)-11a+a-b+c)+d

 (11でくくれる箇所が見つかるので)
=11(100a+10b+c)-(11(10a+b-a)+a-b+c)+d
=11(100a+10b+c)-11(9a+b)-a+b-c+d

 この式が出せ、同じく 係数が11の箇所以外は符号が互い違いになる箇所が現れたので、これで証明できましたね

 2桁→3桁、3桁→4桁になっても同じことが繰り返されたので、5桁、6桁、7桁…と増えていっても同じです


その他の倍数か調べる方法

 自然数nについて 特定の数(以下m)の倍数かどうかだけなら 楽に求める方法があります。

 自然数nの mで割ったときの余りが0(つまりmの倍数)なら、
 nからmの倍数を増減させても、
またmの倍数からnを増減させても 余りは0のままです。

 

以下(ラフではありますが)証明

 ここでは特定の数、mを ひとまず13と仮定します。(その他に数字が出てこないので もうこれでいいと思われます)

 すると自然数nは

 n=13x+d
   (↑紛らわしいけどエックスです)と表せます。そしてdが0の時のみ nは13の倍数です。

 13×7である数、91を引いてみるとします。

 すると式は13x+d-13×7、
dだけ放っておいて13でくくれますので
 13(x-7)+dとなり、d、つまり余りは変わりません

 91を足してみても、符号が入れ替わるだけなので同じく13の倍数であることに変わりはありません。

 逆に 91からnを引くパターンでも、
 13×7-(13x+d)
=13×7-13x-d
=13(7-x)-dとなり、
 dが0→元々の数が13の倍数なら、13の倍数であることに変わりません
 (dが0以外なら 余りは(0以外に)変わりえますが)

証明終了

 この仕組みを利用して、だんだん簡単な数に変化させていくのです

 ではこの仕組みを使って2017が7で割れるか判定してみましょう

 7×300の2100から2017を引くと83、
 7×14は84…あ、

 はい、7の倍数ではありません。

 1117も同じく、1117から(7×100の)700を引いて417、
 その417から(7×50の)350を引いて67、
 7×9は63…
 はい、7の倍数ではありません。

 ただ、この方法は23みたいに 特定の数が大きい時や、調べたい数が(ウルトラビーストの種族値みたいに)比較的小さい時は そのまま割り算した方が早い場合があります。


おわりに

 ここまでお付き合いいただき、ありがとうございました。


 11の倍数か調べる方法や その他の倍数か調べる方法は、実は私も調べて初めて知ったので 勉強になりました。

 (一応7の倍数かどうか調べる方法もあるのですが、↓
https://twitter.com/riyulun/status/1384083009335222272?s=19
「普通に7で割った方が早くない?」と感じたのでカットしました)

 面白かった方は 是非スキをお願いします。

 Twitter→ https://twitter.com/riyulun?s=09


 最後に 参考までに100までの素数と45 ×45 の際にした工夫を載せて 終わりとさせていただきます

 100までの素数

 2、3、5、7、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97

 45×45の工夫

 45は9×5なので、全体を45×9×5に出来ます

 9は10-1なので、
 45×9=45×(10-1)
=450-45=405と求められ、
 あとは5をかけて 405×5=2025です

いいなと思ったら応援しよう!