流れる空の中で数学を。

とある数学好きの「手作りすうがく」と「気ままな雑記」。

【素数判定】自然数の分解に基づく素数判定遊び【Python】

事始め

上記のひさぴょんさんの素数判定法が面白かったので、インスピレーションが湧いた。

397の素数判定式

397は一つの都合のいい素数の和差積であらわすことができないことが考えられているそうだ。ツイート内の引RT内の文献参照のこと。

そこで、2つの素数の和差積で表すことにして、実際成功した。

インスピレーションを受けて

今回の手法のポイントは2つの和か差の数に分けて、各数が多くの素数の積になっていて、なおかつそれら2数が互いに素であるということである。つまり、ツイートにまとめたように、

のように見積もれることになる。

 

実装

乱数で素数判定の式を2つに分けて、素因数の種類はなるべく大きくなるように更新すると、以下のようなプログラムになる。

github.com

2~10までの素数判定および素因数の種類数を既知として、10~1000までの素数判定を行った結果が次のものである。

gistf734d8d9838e28e061a878ce13489e0c

 

合成数素数の判定成功率は約47%で、素数だけで判定成功確率を見ると約55%となっている。また、素因数の種類の推測値も同時にプロットされている。図では、値が1のところが正しく判定できている。

今回のケースは、1~1000までに素数は、168個あり、その内90個の判定に成功している。

1~1万までの数を対象に素数判定しても、合成数素数の判定成功率は約49%で、素数だけで判定成功確率を見ると約56%となり、数の大きさの増加に対してある程度安定性があることがわかった。

このケースは、1~1万までに素数は、1229個あり、その内680個の判定に成功している。

f:id:FoxQ:20210919071818p:plain

素数判定結果

f:id:FoxQ:20210919071951p:plain

素因数の種類数の推測

まとめ

今回の推論モデルは、素因数の種類を確率的に見積もることで、そこから素数判定を行うものだった。成功確率は安定して55%付近となっており、素数の個数が減ってきても判定にはさほど影響を及ぼさないことが分かった。