カニンガムチェーンのカウント


14

素数は常に人々を魅了してきました。2300年前、ユークリッドは彼の「要素」に書いた

素数とは、単位だけで測定されるものです。

つまり、素数は1(またはそれ自体で)割り切れるだけです。

人々は常に素数間の関係を探しており、(「面白い」のような)かなり奇妙なものを思いついてきました。

たとえば、Sophie Germainプライムは、プライムp2*p+1もあるプライムです。

安全素数は素数であるpそのため(p-1)/2正確ソフィー・ジェルマン素数の下位条件である、また、素数です。

これらは、この課題で私たちが探しているものに関連しています。

A カニンガムチェーンタイプの私は最後のものを除くすべての要素がある素数のシリーズです、ソフィー・ジェルマン素数と、最初のものを除くすべての要素がある安全素数。このチェーンの要素の数は、その長さと呼ばれます。

これは、プライムから始めてp計算することを意味しますq=2*p+1qが素数である場合、長さ2のタイプIの Cunnighamチェーンがあります。次に2*q+1、次の生成された数が合成されるまでテストなどを行います。

タイプIIのカニンガムチェーンは、ほぼ同じ原理に従って構築されますが、唯一の違い2*p-1は各段階で確認することです。

Cunninghamチェーンの長さは1です。つまり、2 * p + 1も2 * p-1も素数ではありません。これらには興味がありません

カニンガムチェーンの例

2長さ5のタイプIのチェーンを開始します。

2, 5, 11, 23, 47

次に構築される数95は、素数ではありません。
これはまた、以下のことを教えてくれる51123および47タイプのいずれかのチェーンを開始していない私を、それが要素に先行する必要があるため、。

2また、長さ3のタイプIIのチェーンを開始します。

2, 3, 5

次はで9、これは素数ではありません。

11タイプIIを試してみましょう(以前にタイプIから除外しました)。
さて、21次は、素数ではないので、この「チェーン」の長さは1になりますが、このチャレンジではカウントしません。

チャレンジ

n入力として数値を指定すると、少なくとも長さ2タイプIまたはIIn番目のカニンガムチェーンの開始番号を書き込み/返すプログラムまたは関数を記述し、その後にスペース、それに続くチェーンのタイプ(IまたはII)、その後にコロン、その後にそのタイプのチェーンの長さが続きます。プライムが両方のタイプのチェーン(タイプI およびタイプII)を開始する場合、タイプI のチェーンが最初にカウントされます。

例: 2 I:5

nこれは、以前に開始された任意のタイプのチェーンの一部である可能性があることに留意してください。その場合、そのタイプのチェーンの開始番号と見なされるべきではありません。

これがどのように始まるのか見てみましょう

から始め2ます。これは最初の素数であるため、を含む下位の素数で始まるチェーンがないことを確認できます2
タイプIのチェーン内の次の数は次のようになります2*2+1 == 55素数なので、少なくとも長さ2のチェーンが既にあります。
これを最初のチェーンとしてカウントします。タイプIIはどうですか?次の番号はになります2*2-1 == 33素数なので、タイプIIに対して少なくとも長さ2のチェーンも。
これを2番目のチェーンとしてカウントします。そして、これで終わりです2

次の素数は3です。ここで、低プライムが開始されたのがチェーン内にあるかどうかを確認する必要があります。
タイプIを確認します(3-1)/2 == 11は素数ではないので、3はタイプIのチェーンの開始点になる可能性があり
ます。それを確認しましょう。次は3*2+1 == 77素数なので、少なくとも長さ2のタイプIのチェーンがあります。これを3番目のチェーンとしてカウントします。
次に3、低プライムが開始したタイプIIチェーンに表示されるかどうかを確認します。 (3+1)/2 == 22素数であるため、タイプIIのチェーンの開始番号として3を考慮することはできません。そのため3、このチェーン内の次の数字が次の場合でも、これはカウントされません。5、素数です。(もちろん、私たちはすでにそれを知っていたので、これらのチェックを行う方法を独自の方法について考えることができますし、当然考えるべきです。)

そして、私たちはのためにチェックし5711我々は少なくとも長さ2のn番目のカニンガムチェーンを見つけるまでのカウント、上のようにして。

次に(または、少し前に;))、見つかったチェーンの完全な長さを特定し、前述の形式で結果を出力する必要があります。

ちなみに、私のテストでは2、長さがを超える両方のタイプのチェーンを開始する以外の素数は見つかりませんでした1

入出力の例

入力

1

出力

2 I:5


入力

10

出力

79 II:3


入力

99

出力

2129 I:2


入力1..20の出力

2 I:5
2 II:3
3 I:2
7 II:2
19 II:3
29 I:2
31 II:2
41 I:3
53 I:2
79 II:3
89 I:6
97 II:2
113 I:2
131 I:2
139 II:2
173 I:2
191 I:2
199 II:2
211 II:2
229 II:2

最初の5000の出力のリストは、ここにあります

これはコードゴルフです。出力では任意の空白を使用できますが、例に示すように、タイプと数字は単一のスペースとコロンで区切る必要があります。抜け穴を使用することは許可されていません。特にWebから結果を取得すること許可されていません

幸運を :)


3
砂場に言及するのを忘れ:それがあることを証明するのは簡単です2し、3唯一の素数ありp、両方のために2p-12p+1素数なので、2唯一の素数で開始し、両方のタイプの非自明なカニンガムチェーンが。
ピーターテイラー

はい。ご協力ありがとうございます:)
-Cabbie407

3
(回答からのコメントを変換しました。)二重鎖の長さが1を超える以外の素数はありません。これ、消去による証明です。2
pbeentje

もう一度詳細にご指摘いただきありがとうございます。あなたはただそれを発言したかったのですか、それとも私はこのために何らかの形で挑戦を変えるべきだと思いますか?
Cabbie407

発言のみ。私はそれがどんな場合でもチャレンジを変えるとは思わず、ゴルフに役立つ可能性があるだけです。一方のチェーンが見つかった場合、もう一方のチェーンをチェックする必要はありません。
pbeentje

回答:


2

Javascript、236208バイト

28バイト保存:

p=(n,i=n)=>n%--i?p(n,i):i==1;f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:`+eval(`for(j=1;p(k=2*k+l);j++);j`))}

保存されている9つのバイトpを持つ関数:関数が置き換えられましたでステートメントの直接機能。p=(n,i=n)=>n%--i?p(n,i):i==1
teval(...)f


以前のソリューション:

p=n=>{for(i=n;n%--i&&i;);return 1==i};t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j};f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

例: f(6)

出力: 29 I:2

説明
3つの関数を使用しています

1 pnが素数かどうかを知るには: p=n=>{for(i=n;n%--i&&i;);return 1==i}

2 t:1または-1になるmパラメーターに応じて、タイプIまたはIIのnで始まるカニンガムチェーンの長さを知るには: t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j}

3 f:チェーン(forループ)をカウントし、結果を表示します

f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

forループ:各番号に対してCunninghamチェーン(必要に応じてI、II)が有効な場合

  • 数は素数です
  • 前任者は素数ではない
  • 後継者は素数
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.