発見者:Peria氏
発見日:2016年2月22日
最大素数大富豪素数:
使用カード枚数:53枚
桁数:71桁
公開ソースコード:Check if the largest prime number in Prime-Daifugo can have 71 digits? · GitHub
追試コード (by tsujimotter氏):https://gist.github.com/junpeitsuji/db6fa47878c39c0429e9
どうでもよいですが、もも素数ですね!
概要
素数大富豪については日前に書いた
integers.hatenablog.com
を参照してください。
素数大富豪素数とは素数大富豪で出すことが可能な素数のことを言います(tsujimotter)。
「最大の素数大富豪素数は何か?」という問題は1年半ほどの間解答がありませんでした。
今回Peria氏によって報告された素数は素数大富豪において次のような状況で出すことができます。
まず、
・プレイヤー人数は2人
・片方が手札が1枚になるまで場にカードを出した後、半永久的にパスし続ける。
・もう一人のプレイヤーが山札のカードを全て引く
なる状況によって手札のカードの枚数を53枚にすることができることに注意します。そうして、今回の候補数は実際に53枚のカードを利用して作ることができます(残るカードはA一枚)。桁の大きい方から考えると次のように並びます:
・(4枚)
・(4枚)
・(4枚)
・(4枚)
・(4枚)
・(4枚)
・(4枚)
・(4枚)
・(4枚)
・ジョーカー(2枚)
・(4枚)
・(3枚)
・(1枚)
・(1枚)
・(3枚)
・(1枚)
・(2枚)
最大であることの証明
Peria氏が発見した数(とおく)は
仮定(P):最大素数大富豪素数はジョーカー二枚が両方ともKであり、他のプレイヤーの手札に残っている一枚がAのときに実現する。
という仮定に基づく最大の素数大富豪素数です。ただし、コードにmpz_probab_prime_pという関数を用いているため、厳密には"おそらく素数"ということしか判定できません。すなわち、以下の議論で得られる結果は厳密には「より大きい数は素数大富豪素数にはなり得ず、が素数であることが確定すればが確かに最大素数大富豪素数を与える」です。しかしながら、が素数であるかを別個に確認すればよく、は実際に素数であることが確認できます(「素因数分解」の項を参照してください)。
なお、最初のコードには若干のミスがあることがPeria氏によって指摘され、それを修正した上でPeria氏およびtsujimotter氏によって追試されました。
追試の結果、Peria氏の発見した数に誤りのないことが確認されました。従って、あとは仮定(P)の正当性およびが素数であることを証明すれば最大素数大富豪素数問題は解決ですが、前半は以下のように証明できます:
記号
を「枚のカードを用いて出来る桁の素数大富豪素数全体」とする。
(が素数と仮定しているので、)
自然数に対して、で「の上桁」を表す。
に対して、そのカードの表す数をで表す。
ジョーカーを二枚(, とする)用いて出す素数大富豪素数に対して、でジョーカー二枚をそれぞれ何のカードの代わりとして用いているかを表す()。 一般にははに対して一意には定まらず、の一つの出し方に対して組が一意に定まることに注意。
に対して、を手札に持つプレイヤーとは異なるもう一人のプレイヤーの手札にあるカード(それは一枚である)をと表す。
仮定(P)が成立し、その結果であることの証明
という条件でを出すことを考える。このとき、
である。がジョーカー二枚を使わない場合にならない。従って、を出すには必ずジョーカーを二枚用いる必要があり、が成り立つ。また、に対して
であることに注意すれば、に対して
が成り立つ。よって、であることが従う。これから、である。もし、が二桁の数ならば、の桁数が桁未満となって矛盾する(桁を実現するためには絶対値が二桁のカードを全て用いる必要がある)。これでが示された。あとは必ずであることを示せばよい。これは
であることから、 or と仮定すると
となるため、となっての定義に矛盾する。すなわち、の出し方は必ずを満たし、Peria氏の計算(およびtsujimotter氏による追試)によってが確定する。 Q.E.D.
素因数分解
あとはが素数であることを確定させればOKです。次のWeb上で使える楕円曲線法を用いた素因数分解アプリがおすすめです。
www.alpertron.com.ar
これは確率論的判定法だけでなく、厳密な素因数分解まで最終的には与えてくれます。桁数が大きすぎると当然時間がかかることになりますが、桁の数であっても、それが実際に素数であるならば、2秒もかからずに素数であると確定します。そうして、今考えているが素数であることも一瞬で確定します。
以上をもって、Peria氏が発見した
ポイント
Peria氏による発見のポイントは"全ての素数大富豪素数を探索しようとはしない"という点です。仮定(P)を仮定することによって圧倒的に探索すべき数の範囲が狭まります。また、仮定(P)を満たす数もたくさんあるのですが、候補数を大きい順に素数判定にかけていくため、比較的大きい数が素数であればサーチはすぐに終わることになります。つまり、理論的には上手くいかない可能性がある部分が二か所あるのですが(仮定(P)を満たす素数が一切なかったり、あったとしてもサーチのかなり後の方に出現するかもしれない)、結果論として、短いコードで一瞬で見つかるところに"はいた"のです。もちろん、素数定理等を用いた理論的考察によって、予めこの方法が高確率で上手くいくことを保証できたかもしれませんが、そんなことをするよりも先に手を(コンピュータを)動かして、うまくいかなそうであればそれはそのとき考えるというスタンスでよいと思います。実際には上手くいったので、この部分の考察は不要です。がいい形で発見されたことによって、仮定(P)の正当性は容易に証明されました。もし、がもっともっと小さい数であれば、(がでない場合を考慮する必要などが生じて)仮定(P)の証明がより難しくなったり、不成立の可能性すらありました。見つかってしまえば、ご本人の言葉を借りれば「やってることは競技系プログラムだと普通のこと」ということです。興味をもつ人が圧倒的に少なかったために発見までに一年以上かかりましたが、とりあえず発見されて嬉しい限りです。
解決者ご本人様による記事:
今後の課題としてはPeria氏の記事にも書かれている通り、「最大素数大富豪合成数」のサーチです。こちらは合成数出しのルールから、(直観では)素数の場合に比べて難易度がはるかに高い気がします。また、一人で遊べる「素数大富豪アプリ」の開発が待たれます*1(恐らくAIを作る部分が一番面倒)。
*1:その後アプリが開発されています: integers.hatenablog.com