数字削除後もまだ素数である最大素数を見つける


19

時が経つにつれて/math/33094/deleting-any-digit-yields-a-prime-is-there-a-name-for-this、次の質問を尋ねています。数字のいずれかを削除した後に素数のままである素数はいくつありますか?例えば719、あなたが得るような素数7119あり、そして79。この質問は未解決ですが、コーディングの難題となると思いました。

仕事。 数字のいずれかを削除した後でも素数のままであることがわかる最大の素数を指定します。それを見つけるコードも提供する必要があります。

スコア。与える素数の値。

自由であれば、任意のプログラミング言語とライブラリを使用できます。

物事を始めるため99444901133に、リンクされたページで与えられる最大のものです。

制限時間。回答で与えられたよりも大きい最初の正解の1週間後に与えられた最大の正解を受け入れ99444901133ます。

これまでのスコア。

Python(primo)

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

J(randomra)(この回答は、2013年2月21日に1週間のタイマーを開始しました。)

222223333333

9901444133(1つの9の削除)は素数(7 x 1414492019)ではありません。ただし、前の例は正しかったです。
プリモ

@primoありがとう、修正。それは私の奇妙なタイプミスでした。
motl7

1
最大のものがある場合 -分析が示すように、私はあなたがそれを見つけたと思うとき、あなたはどのように証拠について行くことができるのだろうかと思います。
ニブラー

1
他の拠点はどうですか?ベース2では、11(2r1011)、ベース3(3r102)でも11、ベース4で262151(4r1000000013)、ベース5で17(5r32)、ベース7で37(7r52)、47を超えるものは見つかりませんでしたベース9(9r52)。
aka.nice

回答:


17

274桁

4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111

これを見つけるには約20時間のCPU時間を要し、プライムごとに約2分かかりました。対照的に、84桁のソリューションは約3分で見つけることができます。

84桁

444444444444444444444444444444444444444444444444441111111113333333333333333333333333

77777777999999999999999777777777(32桁)
66666666666666622222222222222333(32桁)
647777777777777777777777777(27桁)
44444441333333333333(20桁)
999996677777777777(18桁)
167777777777777(15桁)

素数性を確認する場合は、このツールをお勧めします。D。AlpernのECMアプレット

また、repdigitアプローチを使用します。これは、大きな値を見つける可能性が最も高いアプローチのようです。次のスクリプトは、アルゴリズムの倍数になり最も数字または切断上スキップ2、3、5、現在11 C / oをPeterTaylor(彼の寄与は約50%の効率を増加します)。

from my_math import is_prime

sets = [
 (set('147'), set('0147369'), set('1379')),
 (set('369'), set('147'), set('1379')),
 (set('369'), set('0369'), set('17')),
 (set('258'), set('0258369'), set('39')),
 (set('369'), set('258'), set('39'))]

div2or5 = set('024568')

for n in range(3, 100):
 for sa, sb, sc in sets:
  for a in sa:
   for b in sb-set([a]):
    bm1 = int(b in div2or5)
    for c in sc-set([b]):
     if int(a+b+c)%11 == 0: continue
     for na in xrange(1, n-1, 1+(n&1)):
      eb = n - na
      for nb in xrange(1, eb-bm1, 1+(~eb&1)):
       nc = eb - nb
       if not is_prime(long(a*(na-1) + b*nb + c*nc)):
        continue
       if not is_prime(long(a*na + b*(nb-1) + c*nc)):
        continue
       if not is_prime(long(a*na + b*nb + c*(nc-1))):
        continue
       if not is_prime(long(a*na + b*nb + c*nc)):
        continue
       print a*na + b*nb + c*nc

my_math.pyここで見つけることができます:http://codepad.org/KtXsydxK
また、あなたも使用することができますgmpy.is_prime:機能GMPYプロジェクト

プロファイリングの結果としてのいくつかの小さな速度の改善。4つの候補の最長ための素数のチェックは、最後に移動されているxrange置き換えrange、およびlong置き換えint型キャストを。int評価された式の結果がの場合、不要なオーバーヘッドがあるようlongです。


割り切れるルール

LET Nは、フォームのpostitive整数であり、A ... AB ... BC ... C、、B及びCは数字を繰り返します。

2と5に
よる-25による可分性を避けるため、cは集合[ 0、2、4、5、6、8]に含まれない場合があります。さらに、bがこのセットのメンバーである場合、cの長さは2以上である場合があります。

3
- N = 1(mod 3)の場合、N[ 1、4、7 ]を含めることはできません。これらのいずれかを削除すると3の倍数になります。N = 2(mod 3)および[ 2、5、8]についても同様です。この実装では、これを少し弱めた形式を使用します。N[1、4、7]のいずれかが含まれる場合、[ 2、5、8 ]のいずれも含まれない場合があります。さらに、N[ 0、3、6、9]のみで構成されない場合があります。これは主に同等のステートメントですが、たとえばabcなどのいくつかの些細なケースを考慮に入れていますそれぞれ3回の倍数で繰り返されます。

11
- PeterTaylorが指摘しているように、Naabbcc ... xxyyzzの形式である場合、つまり、偶数回繰り返される数字のみで構成されている場合、11a0b0c ... x0y0zで割り切れます。この観察により、検索スペースの半分が削除されます。場合Nが奇数の長さであり、その後の長さ、B及びCは、全て(75%サーチスペースの削減)も奇数でなければならず、場合Nは偶数長さであり、その後のいずれかのみ、B又はCが偶数であってもよいです長さ(25%の検索スペース削減)。 - 推測
次の場合、ABCは、の倍数である11、例えば407、その後のすべての奇数繰り返し、B及びCはまた、の倍数であろう11。これは、11ルールによる上記の分割可能性の範囲外です。実際、明示的に許可されているのは、奇数の繰り返しのみです。この証拠はありませんが、体系的なテストでは反例を見つけることができませんでした。比較:4440777774444400077744444440000077777777777を、など誰もが、この推測を証明または反証して自由に感じることがあります。その後、aditsuはこれが正しいことを実証しました。


その他の形態

randomraが追求し
ていた形式の2組の繰り返し数字a ... ab ... bは、はるかにまれなようです。10 1700未満のソリューションは7つしかなく、そのうち最大のものは長さが12桁です。

4桁の繰り返し数字
この形式の数字a ... ab ... bc ... cd ... dは、私が探していた数字よりも密に分布しているように見えます。3組の繰り返し数字を使用する32のソリューションと比較して、10 100未満の69のソリューションがあります。間のもの10 1110 100は、以下の通りです。

190000007777
700000011119
955666663333
47444444441111
66666622222399
280000000033333
1111333333334999
1111333333377779
1199999999900111
3355555666999999
2222233333000099
55555922222222233333
444444440004449999999
3366666633333333377777
3333333333999888883333
4441111113333333333311111
2222222293333333333333999999
999999999339999999977777777777
22222226666666222222222299999999
333333333333333333339944444444444999999999
559999999999933333333333339999999999999999
3333333333333333333111111111111666666666611111
11111111333330000000000000111111111111111111111
777777777770000000000000000000033333339999999999999999999999999
3333333333333333333333333333333333333333333333336666666977777777777777
666666666666666666611111113333337777777777777777777777777777777777777777
3333333333333333333888889999999999999999999999999999999999999999999999999933333333

なぜそうなるべきかについて、単純な発見的議論があります。デジタルの長さごとに、予想される解の数が最大になる反復セットの数(つまり、3反復セット、または4反復セットなど)があります。比率として考えられる追加の可能な解決策の数が、チェックされる追加の数が素数である確率を上回る場合に、遷移が発生します。チェックする可能性の指数的な性質と素数分布の対数的な性質を考えると、これは比較的迅速に起こります。

たとえば、300桁のソリューションを見つけたい場合、4組の繰り返される数字をチェックすると、3組よりもはるかに多くのソリューションが生成され、5組のソリューションはまだ可能性が高くなります。ただし、自由に使えるコンピューティング能力では、4セットで100桁をはるかに超えるソリューションを見つけることは、5または6はもちろんのこと、私の能力の範囲外です。


3
この形式の解では、d^x e^y f^z11による可分性を回避するために、少なくとも2つのシーケンス長が奇数である必要があります。11のis_prime倍数を迅速に拒否するかどうかはわかりません。
ピーターテイラー

私の目の前にgmpソースはありませんが、小さな素数の試行分割から始まる可能性が非常に高いです。それでも、(na&1)+(nb&1)+(nc&1) > 1十分に単純なので、より高速になります。ちょっと待ってください、これは完全なブランチを短縮できます!場合naでもあり、かつnb + nc奇数である、の後、1 [nb, nc]絶対必要は必ずしもさえも、あなたはすぐ隣にスキップすることができますna
primo

gmpy.is_prime()を使用している場合は注意してください。特定のポイントを超えると確率的であるため、を返すことを確認する必要があります21これはおそらく素数にすぎないことを意味します
ニブラー

4
11による割り算の直接かつ正確なテストは、すべての数字を偶数の位置に追加し、奇数の位置のすべての数字を減算し(またはその逆)、結果が11の倍数であるかどうかを確認することです直接推定)、2 +同一の数字のすべてのシーケンスを0または1桁に減らすことができます(シーケンスの長さ%2を取得)。したがって、44444440000077777777777777は407に減少します。4 + 7-0 = 11。444444444444444444444444444444444444444444444444441111111113333333333333333333333333は13に減少します
。– aditsu

1
「堅牢」!=証明済み。違いは一部にとっては重要ではなく、他にとっては重要です。MathematicaのPrimeQはBPSWバリアントであり、ベース3の追加のMRであるため、もちろん数ミリ秒しかかかりません。Pari / GPは、5年前のコンピューターで約3秒でAPR-CLを使用して274桁の数字を証明し、シングルコアのオープンソースECPPは約2秒かかります。Javaの場合は時間がかかりますが、大したことではありません。私はこれをPerlで翻訳し、4つすべてでBPSWを実行し、4つすべてで安価なテストに合格した場合にのみ証明しました。
DanaJ 14

5

222223333333(12桁)

ここでは、100桁までのaa..aabb..bb形式のみを検索しました。他のヒットのみが23 37 53 73 113 311です。

Jコード(クリーンアップ)(ごめん、説明なし):

a=.>,{,~<>:i.100
b=.>,{,~<i.10
num=.".@(1&":)@#~
p=.(*/"1@:((1&p:)@num) (]-"1(0,=@i.@#)))"1 1
]res=./:~~.,b (p#num)"1 1/ a

最大1560桁(およびカウント)のこの形式を徹底的に検索すると、この12桁のソリューションよりも大きなものは見つかりません。
プリモ

2

編集:誰かが既に私がここでやったよりも深い分析を行った。

解決策ではなく、n桁の解決策の数の概算です。

推定ソリューション数

Jコードの生成

   ops=: 'title ','Estimated number of solutions by digits',';xcaption ','digits',';ycaption ','log10 #'
   ops plot 10^.((%^.)%(2&(%~)@^.@(%&10))^(10&^.))(10&^(2+i.100))

ありがとう。y軸は少しわかりにくいです。およそ86桁の推定ソリューション数として10 ^ -100を本当に意味しますか?
motl7

はい。ソリューションの数が限られている場合、それは信じられます。既存のデータに基づいてますが、数字を繰り返すと数字が1桁少ない相関関係が生じるため、この推定は少しずれています。
-randomra

1
誰かがすでに私よりも深い分析をしました。
randomra

y軸は、解であるx桁の数字の割合ですか?それは、ソリューションの数を10 ^(#digits)で割ったものですか?
4、11

1

Javascript(ブルートフォース)

より高い数はまだ見つかりません

http://jsfiddle.net/79FDr/4/

bigintライブラリがない場合、javascriptはintegersに制限されます<= 2^53

Javascriptであるため、UIの更新のために実行スレッドをリリースしないとブラウザは文句を言います。その結果、UIのアルゴリズムの進行状況を追跡することにしました。

function isPrime(n){
    return n==2||(n>1&&n%2!=0&&(function(){
        for(var i=3,max=Math.sqrt(n);i<=max;i+=2)if(n%i==0)return false;
        return true;
    })());
};

var o=$("#o"), m=Math.pow(2,53),S=$("#s");

(function loop(n){
    var s = n.toString(),t,p=true,i=l=s.length,h={};
    if(isPrime(n)){
        while(--i){
            t=s.substring(0,i-1) + s.substring(i,l); // cut out a digit
            if(!h[t]){   // keep a hash of numbers tested so we don't end up testing 
                h[t]=1;  // the same number multiple times
                if(!isPrime(+t)){p=false;break;}
            }
        }
        if(p)
            o.append($("<span>"+n+"</span>"));
    }
    S.text(n);
    if(n+2 < m)setTimeout(function(){
        loop(n+2);
    },1);
})(99444901133);

@Schmiddty jsには大きなintライブラリがありますが、このブルートフォースメソッドは運命のようです。
motl7

1
@ motl7同意し、一晩中実行し続けたが、答えは見つからなかった。
Shmiddty

1

問題の分析へのリンクが掲載されましたが、いくつかの点が欠けていると思いました。1桁以上の同じ数字のkシーケンスで構成されるm桁の数字を見てみましょう。数字をグループ{0、3、6、9}、{1、4、7}、および{2、5、8}に分割する場合、ソリューションには2番目と3番目のグループの数字を含めることができないことが示されました、これらのグループのいずれかの3n + 2桁を含める必要があります。kシーケンスの少なくとも2つは、奇数桁でなければなりません。数字{1、4、7}のうち、1と7のみが最下位桁になります。{2、5、8}のいずれも最下位桁にできません。したがって、最下位桁には4つ(1、3、7、9)または2つ(3、9)の選択肢があり、

候補者は何人いますか?少なくとも1桁のkシーケンスに分割されたm桁があります。これらのシーケンスの長さを選択する方法は(k-1)以上(m-k + 1)あり、約(m-1.5k + 2)^(k-1)/(k-1)!です。最下位桁には2つまたは4つの選択肢があり、合計で6つです。他の数字には6つの選択肢がありますが、最上位の数字には36/7の選択肢があります。合計は(6/7)* 6 ^ kです。シーケンスの長さが偶数か奇数かを選択する2 ^ kの方法があります。これらのk + 1は、奇数または1つだけが奇数であるため除外されます。選択肢の数に(1-(k + 1)/ 2 ^ k)を掛けます。これは、k = 2の場合1/4、k = 3の場合1/2、k = 4の場合11/16などです。セットの数字{1、4、7}または{2、5、8}は3n + 2でなければならないため、選択肢の数は3で除算されます。

これらすべての数を掛けると、候補の数は

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (6/7) * 6^k * (1 - (k + 1) / 2^k) / 3

または

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (2/7) * 6^k * (1 - (k + 1) / 2^k)

候補自体と、数字を削除して作成されるk個の数字はすべて素数でなければなりません。Nの周りのランダムな整数が素数である確率は約1 / ln Nです。ランダムなm桁の数の確率は約1 /(m ln 10)です。ただし、ここの数字はランダムではありません。それらはすべて、2、3、または5で割り切れないように選択されています。30の連続する整数のうち8は、2、3、または5で割り切れません。したがって、素数である確率は(30/8)/ (m ln 10)または約1.6286 / m。

予想されるソリューションの数は約

(m - 1.5k + 2)^(k - 1) / (k - 1)! * (2/7) * 6^k * (1 - (k + 1) / 2^k) * (1.6286 / m)^(k + 1)

または約mの場合

(1 - (1.5k - 2) / m)^(k - 1) / (k - 1)! * 0.465 * 9.772^k * (1 - (k + 1) / 2^k) / m^2

k = 2、3、4、...の場合、次のようになります。

k = 2: 11.1 * (1 - 1/m) / m^2
k = 3: 108 * (1 - 2.5/m)^2 / m^2 
k = 4: 486 * (1 - 4/m)^3 / m^2


k = 10: 10,065 * (1 - 13/m)^9 / m^2

k = 10以降、数値は再び小さくなります。


5
PPCGへようこそ!これは優れた分析です。ただし、質問に対する正当な回答となる回答を探します。言い換えれば、コード。残念ながら、これにより、コメントのみの投稿のために構造内のスペースが不足し、投稿コメントに委ねられます。しかし、このような徹底的な努力が私たちのスラッシュパイルに委ねられるのを嫌いますので、あなたがあなたの投稿にチャレンジ要件を満たすために設計されたコンピュータプログラムを追加した場合、それは維持される可能性が高いことを示唆したいと思います周り。
ジョナサンヴァンマトレ

1
また、私は強くあなたが私たちの姉妹サイトをチェックアウトをお勧めします:math.stackexchange.commathoverflow.net
ジョナサン・ヴァンMatre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.