• ベストアンサー

双子の素数

3~1000の範囲で双子の素数をすべて求めるプログラムの作り方を教えて下さい。友人には「『エラトステネスのふるい』を使え」と言われたのですが、「エラトステネスのふるい」とは一体何なのでしょうか?それも教えて頂きたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • betagamma
  • ベストアンサー率34% (195/558)
回答No.5

色々間違ってました。正しくは、 int main(void){ int i,j; int isprime[1000]; //最初はすべての数が素数だと思う for(i=0;i<=1000;i++){ isprime[i]=1; } //誤動作しないようにする。 isprime[0]=isprime[1]=0; //2からはじめる for(i=2;i<=1000;i++){ if(isprime[i]==1){ for(j=2*i;j<=1000;j+=i){ isprime[j]=0; } } } //双子素数をプリントする for(i=2;i<=1000;i++){ if(isprime[i-2]==1 && isprime[i]==1){ print("(%d,%d)",i-2,i); } } } で、結果は、 (3,5)(5,7)(11,13)(17,19)(29,31)(41,43)(59,61)(71,73)(101,103)(107,109)(137,139)(149,151)(179,181)(191,193)(197,199)(227,229)(239,241)(269,271)(281,283)(311,313) (347,349)(419,421)(431,433)(461,463)(521,523)(569,571)(599,601)(617,619)(641,643)(659,661)(809,811)(821,823)(827,829)(857,859)(881,883) でした。

candlize
質問者

お礼

お礼がとても遅れてしまい、本当に申し訳ありません。 プログラムリストを載せて頂いた上訂正までして頂いて、本当にありがとうございました。 遅ればせながら、良回答にさせていただきます。

その他の回答 (5)

回答No.6

No.5のプログラムですが、 int isprime[1000]; なので、forでiが1000までまわしちゃうとisprime[1000]にアクセスしてしまうのでまずいのでは?isprimeは[0]から[999]までしかないですよね。 int isprime[1001]; にしましょう。

candlize
質問者

お礼

お礼がとても遅れてしまい、本当に申し訳ありません。 良いアドバイスをありがとうございました。

  • betagamma
  • ベストアンサー率34% (195/558)
回答No.4

エラトステネスのふるいについては、 http://www.hokuriku.ne.jp/fukiyo/math-obe/eratosu.htm に書いてあります。プログラムでかくなら、1000個の配列を作って、 #include <stdio.h> int main(void){ int isprime[1000]; //最初はすべての数が素数だと思う for(i=0;i<=1000;i++){ isprime[i]=1; } //誤動作しないようにする。 isprime[0]=isprime[1]=0; //2からはじめる for(i=2;i<=1000;i++){ if(isprime[i]==1){ for(j=i;j<=1000;j+=i){ isprime[j]=0; } } } //双子素数をプリントする for(i=2;i<=1000;i++){ if(isprime[i-2]==1 && isprime[i]==1){ print("(%d,%d)",i-2,i); } } } で行くと思います。未チェックですが。

candlize
質問者

お礼

ありがとうございました!!!エラトステネスのふるいについてよく分かりました。本当に感謝しています。 わざわざプログラムリストまで載せて下さって、本当にありがとうございました。

回答No.3

双子の素数は、3と5、41と43みたいに差が2の組(奇数だけ考えたら隣あってる組)ですね。普通に「エラトステネスのふるい」で素数を求めてから双子チェックしたらいいのでは。

candlize
質問者

お礼

ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

双子の素数ってナンですか? 17、71 見たいなものを言うのでしょうか?

candlize
質問者

補足

No.3の方が回答して下さった通り、ある自然数pとp+2がともに素数であるもののことです。

  • ceita
  • ベストアンサー率24% (304/1218)
回答No.1
candlize
質問者

お礼

素早い回答ありがとうございます。 素数を見つける方法の一つだったんですね。 ありがとうございました。

関連するQ&A

  • 素数を判定するいろんな方法は?

    素数を判定する方法はエラトステネスのふるいの他に何かあるのでしょうか。100までは大抵の本に載っていますが、大きな数はふるいにかけても、膨大な手間がかかりそうです。

  • 素数をみつける方法を教えて下さい

    早速ですが、素数を少しでも楽に見つけ出す方法が知りたいです。 私はエラトステネスの篩「自然数NがNの平乗根を超えない最大の整数以下の全ての素数で割り切れなければ、Nは素数である」 は知っています。他にも素数を少しでも楽に見つけ出す方法を教えてください。

  • 双子素数の無限性について

    以下のような証明を作ってみました。 この問題が数学史上未解決の難問であることは知っているので、必ず どこかが間違っているのでしょうが、自分で作っておいてなんですけど、 どこが間違っているのかすら理解できませんでした。(馬鹿) 誰かどこかが間違っているか、なるべくわかりやすく指摘してもらえない でしょうか? 証明 ある3*10^n乗という数について考える。 双子素数は有限で、この素数以降には双子素数は存在しないものと 仮定する。 数直線上の3*10^n乗の点を0とすると、これ以降の素数の出現は、 +1,+7,+11,+13,+17……のように今までの素数と、1を足した場所で、 素数となる可能性のある点が出現する。 これのうち双子素数となる可能性のある点は、全てどちらかがそれ以 前に登場した2,3,5を除く二つ以上の素数の積でなければならない。 どちらも素数であるとすると、双子素数が存在しないという前提に反する からである。 双子素数のうち一つにつき、その点が何らかの素数の積であるために は、それぞれ異なる素数が二つずつ必要になる。 また、これは3*10^n乗以前に存在した素数でなければならず、2,3,5の 倍数でもない。 そして、一つとして同じ素数を使ったペアは存在しない。 例えば、 3*10^n乗+11がa*bという素数の積であったとき、 3*10^n乗+17がaの積もしくはbの積であることは絶対にない。 こうして6*10^n乗未満の範囲で、3*10^n乗の一つ以前まで全ての素数 を足していくと、双子素数の点を否定するために使う素数は、 あらわれるかもしれない双子素数の総数*2となる。 ではここで双子素数の点を否定するために使える素数の組み合わせに ついて考えてみる。 (1) まず、この範囲内のいずれか一点を否定するには、6*10^n乗までの数に 収まる必要がある。 それよりも一つ上の素数と組み合わせると6*10^n乗を上回ってしまう限界 値をpとする。 この上に存在する素数は全て、このpの範囲内の数との組み合わせでしか 6*10^n乗までの範囲内の素数の積になることはできない。 つまり、この限界値pまでの素数の2倍以上の組み合わせはありえない。 (実際に最小と最大同士を組み合わせていくと一定以上に大きい数にしか ならないので、組み合わせることのできる組数は必ずこれより小さくなる) 母数を2倍した場合、pの1,6倍付近が次の限界値p2となり、やはりそこ までの素数の数*2が組み合わせの最大値である。 (2) いかなる素数を組み合わせても6*10^n乗を上回ってしまう組み合わせ しかなくなり、それがまだ双子素数としてあらわれる可能性のある点の 総数を超えていなければ、必ず双子素数の数は増加する。 言い換えると、 限界値pまでの素数の個数<双子素数としてあらわれる可能性のある点の総数 であると、双子素数は必ず増加する。 (3) これが3*10^n乗で、 限界値pxまでの素数の個数>双子素数としてあらわれる可能性のある点の総数 であった場合、双子素数は増加するとも、増加しないともいえない。 双子素数が有限であることを前提にすると、3*10^n乗以降の双子素数として あらわれる可能性のある点は、全てどちらか一方が素数でないことは確かで ある。 では6*10^n乗以降の場合はどうか? 3*10^n乗の範囲で、a*bで否定された素数を2倍すれば絶対に偶数、つまり 2の倍数になる。 つまり、次の範囲では絶対に同じ組み合わせを使うことができないので、増え た限界値px2の範囲内で、新たに異なる組み合わせを見つけてくる必要がある。 ・11*7 11*89のように一方が同じ組み合わせは使える可能性はある。 そして、同じように、 12*10^n乗 24*10^n乗 と無限に繰り返す。 母数を2倍しても限界値px2までの素数の個数は当然に増加しない。 px2はpの1,6倍程度の位置に存在するからである。 (n<2nの間にならば、最低でも1の素数が含まれているが、この場合組み合わせ として使える素数が増えることも確実ではない) 途中で登場した組み合わせは全て2の倍数になっていくので、同じ組み合わせは 二度と使えない。 従って使える組み合わせは、必ず一定数減り続ける。 そのため、これを無限に繰り返せば、いつか限界値pxまでの素数の組み合わせ では絶対に否定できない点があらわれるはずである。 そこは必ず双子素数となる。 以上により、3*10^n乗以降でも、双子素数は必ず増加する。 これは双子素数が有限であるという前提と矛盾する。 よって、双子素数は無限である。

  • 中1です。500以上1000以下の素数を3つ探し、

    中1です。500以上1000以下の素数を3つ探し、 それが素数であることを示してください。 それで、エラトステネスのふるいという方法を 教えてもらったのですが、 よくわからなかったので、 どなたかわかりやすく教えてください。 あと、まだルートを習っていないのでルートを使った式は わかりません・・・。 宜しくお願いします。

  • 双子素数についてのことです

    双子素数がむげんにあるということの証明は これで充分じゃないでしょうか? nは2以上の自然数 (1~n 番目の素数をかけていった積)+1 は素数 (1~n 番目の素数をかけていった積)-1 は素数 (1~n 番目の素数をかけていった積)±1 は双子素数 素数は無限個あるので双子素数も無限個あることになる これでいいのではないでしょうか?

  • C言語 エラトステネスのふるい ポインタ

    C言語のプログラミングなのですがどなたか教えて頂けませんか。(説明も) エラトステネスのふるいを用いて,10000 までの自然数に素数がいくつあるかを表示するプログラムを作れ。 ただし , 配列は用いず, ポインタを用いること メモリの確保には malloを使うこと よろしくお願いいたします。

  • ○個ずつ改行

    C言語を学び始めた初心者です。 エラトステネスのふるいをつかって素数を2から997まで表示するところまで理解できました。 しかし、すべて並べて表示したり、1ずつ改行して表示したりすることはできるのですが、 たとえば10個ずつ改行したいと思った場合どのように変数を設定しループを組み立てればうまくいくでしょうか? よろしくお願いします

  • 双子素数の問題は誰が言い始めたか?

    最近、双子素数予想解決につながるかもしれない結果が出されたそうですが http://www.asahi.com/tech_science/update/0521/TKY201305210004.html 「双子素数は無限にあるか?」という問題は誰が最初に言い出したのでしょうか? 古代ギリシャから~というフレーズはちょっと信じられません。 できればソース付でお願いいたします。

  • エラトステネスのふるい(素数)についての疑問

    今、家にある中学の参考書を読みながら、中学数学を勉強しているものです。その中の素数についての一番最初の問題で、 次のうちから、素数を選べ。 1 6 13 25 51 79 87 91 という問題があり、その解法の一つでエラトステネスのふるいというもの(2から順に自然数を書き、2を残して2の倍数を消し、3を残して3の倍数を消し、5を残して5の倍数を消す、以下同様にして求める…という方法)があるのですが、上の問題でずっとエラトステネスのふるいを使いながら合成数を消していくと、11の倍数を消すところで、「13、79は11で割り切れず、13÷11、79÷11ともに商が11より小さくなるから素数である。」と参考書にあり、そこでふるいをかける作業は終わっています。 この参考書(特に、"13÷11、79÷11ともに商が11より小さくなるから素数である。"というところ)のこの部分と、ずっとにらめっこをしてきたのですが、何故「13÷11、79÷11ともに商が11より小さくなるから素数である」と言い切れるのか、分かりませんでした…。 少なくとも13は、次に11の倍数となる数である11×2=22の間に13が存在しないから素数、と言い切れる感じはするのですが、79だと、たとえ11で割り切れなくても、13、17で割り切れるかもしれない…(もちろん実際そんなことはないのですが)、と、感覚的にそう思ってしまいます。そして、「13÷11、79÷11ともに商が11より小さくなるから素数である」を言いかえれば、「商が11より大きくなる場合は、素数でない可能性がある(121以降の数であれば、たとえ今の時点で11で割り切れなくても、素数でないかもしれない)」というのも、よく分かりません…。 そんなこんなで、このふるいが11で終わっている理由が分からないのです。 馬鹿みたいな問題かもしれないのですが、頭が堅くて、分からなくて困っているので、良かったら教えていただければ嬉しいです…。

  • 菅野正人の素数生成方法は、多項式時間計算量?

    菅野が下の動画に示した素数生成メカニズムを形式化した、菅野著『数字パズル SeeK 10』などに於ける、エラトステネスの篩のアルゴリズムは、多項式時間内で素数を生成可能ですか。: https://www.youtube.com/watch?v=7u9NdEAOQaY

専門家に質問してみよう