流れる空の中で数学を。

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

【素数判定】分解に基づく素数判定の劇的改良(99.58%)【Python】

前回の反省点

前回の記事では、判定成功率55%程度とあまりぱっとしなかった。

 

sky-time-math.hatenablog.jp

 

そこで、少し悩んだ結果、明らかに2,3,5,7などで割れるのは合成数だという情報を使っていなかったことに気づいた。また、プログラムのフローに問題があったので修正した。

修正版

github.com

gist388a80711e815a542ee7cb6bd9525809

1~1万までの自然数に対して試した結果、なんと判定成功率99.58%となった。素数だけの判定成功率は脅威の100%だった。なお、乱数による分割は書く自然数に対して、100回ずつ行っている。

f:id:FoxQ:20210919084320p:plain

自然数の素因数の種類数

追記

2,3,5,7の倍数をサンプルから除いた場合の素数判定成功率も調べた。

gist1610dbf28d8e1fe3b3016b3561d329d4

2,3,5,7の倍数をサンプルから除いた場合の判定成功率は約99%で、素数を正しく素数と判定できる確率は100%であった。

 

【素数判定】自然数の分解に基づく素数判定遊び【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%付近となっており、素数の個数が減ってきても判定にはさほど影響を及ぼさないことが分かった。

 

【Python】Pythonが認識またはダウンロードされないエラー【anaconda3】

問題

Pythonの新しいバージョンを使いたかったので、pythonとanacondaを全て一度アンインストールし、もう一度インストールしようとしたらつまづいた。使用したインストーラーは、Anaconda3-2021.05-Windows-x84_64.exeです。

解決

github.com

このサイトを参考に、

conda install -c conda-forge opencv

を実行後、(一応PATHも通した)、

conda install jupyter

conda activate

としたらver3.8.11までは使えるようになった。後は、condaプロンプトをデフォルトにしました。

 

ver3.9.0以降はエラーが出てアップデートできなかったので、anaconda3のバージョンの問題かと思ってconda自体をアップデートしたがこれもダメ。ひとまず、ver3.8.11が使えるようになったので、我慢していますが、解決策知っている人がいたら教えてください。

よろしくお願いします。

 

【阪神】優勝する確率【サンプル千回なら……】

仮定

各チームが現状の勝率を維持し続けたとする。

各チームごとに、乱数で残りの勝敗を単純に計算していく。

 

プログラム

gist269d52e760cfc5fc1cb9bb2fb884aab8

 

結論

阪神が優勝する確率は1000回シリーズをやるならば約89%を超えていてほぼほぼ確定だが、実はまだまだ油断はならない。100回シリーズをやる程度ならば、阪神とヤクルトがまだ拮抗しており、ジャイアンツが1位をかすめとる可能性も十分残っている。実際に起こるのはたった一回だけの勝負なので、確率が意味を持つようになるにはまだまだ阪神に頑張ってもらわないといけない。

今年こそ阪神に優勝を!!

【Kindle】因数分解の技法【因数分解】

因数分解本2冊目だしました。

Kindleで「因数分解の技法」という本を出しました。今度は発展的な内容を短めに。同人誌といった感じです。

なので、お値段は特別価格の99円です。

発展的な内容だけを扱い、高校生や受験生向けです。

3次以上の整数係数多項式への因数分解の仕方を解説しています。

 

 

【Kindle】因数分解と素因数分解【素因数分解】

Amazon.co.jp: Yoshiki Ueoka:作品一覧、著者略歴

数学関連の絶版本・品切れ本をコチラから購入できます!

新しい本を出版しました!!因数分解素因数分解です。

 

対象読者は中学生1年生以上です。

九九の表をじっくりと観察することで、素数がなんなのか自然とわかるように解説しました。その後は、素数素因数分解についてじっくり解説し、mod算まで解説しています。

本の最後には、RSA暗号について解説しています。

学校で習う数学や算数が世の中の役に立っていることを味わっていただきたいです。

【Python】N進数の和と積の表

N進数の和と積の表

九九から連想してN進数の和と積の表を作りたくなったので、作ってみた。

プログラム

github.com

0始まりなのは仕様です。Nの値を書き変えることでN進数にできます。デフォルトは16です。

gistee8bf0eeaad050831be763a3c1e26e14