• ベストアンサー

ゴールドバッハの予想のプログラム

学校の課題で1000まで『ゴールドバッハの予想』を表示させないと行けないのですが全くわかりません… フローチャートだけでもわかる方おられませんか? ぜひ教えてください!!

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

  • ベストアンサー
回答No.2

1.素数の一覧表を作る   1)1000個の整数の配列を作る   2)0で初期化   3)2番目、4番目……と2の倍数毎に '1' をセットする     これで、偶数にマークを付けることができた。   4)3番目、6番目……と3の倍数毎に、'1' をセットする     これで、3の倍数にマークを付けることができた。   5)以下、4の倍数、5の倍数~32の倍数までマークを付ける   以上で、マークのついてないものが、素数 2.和を求める数をnとする。   1)n未満で素数であることがわかっている数字をひとつ選び出す     1.で求めた素数リストを使う   2)その数字をaとする   3)n-a が素数かどうか調べる     ・n-aが素数なら、n=a+(n-a)に分解できた。     ・n-aが素数でないなら、次のaを選び直す No.1 の回答にあるのと同じ流れですが。 それと、素数リストを作るあたりは、「なぜ32までなのか」がポイントです。さらに、かなり無駄な処理が混ざっています。

その他の回答 (2)

回答No.3

No.2 訂正です。 1.素数の一覧表を作る   1)1000個の整数の配列を作る   2)0で初期化   3)4番目、6番目……と2の倍数毎に '1' をセットする     (2番目=2は素数なので、ここにはマークを付けない)     これで、偶数にマークを付けることができた。   4)6番目、9番目……と3の倍数毎に、'1' をセットする     (3番目=3は素数なので、ここにはマークを付けない)     これで、3の倍数にマークを付けることができた。   5)以下、4の倍数、5の倍数~32の倍数までマークを付ける ですね。

回答No.1

#include <vector> #include <iostream> //思いっきり非効率だけどこんな感じかなあ。 //最初配列でやろうと思ったけど,自動的に要素数が増えないから管理が面倒そうだった。 // 比較的慣れているC#やVB.NETでやらなかったのはGeneric Listにprimitive type持たせたときのboxingの痛い思い出があるから。 //フローチャートかけないのでソースコードを勉強して読み解いてくれということで。 //言語の指定がなかったのでC++のつもり。コンパイラは //Thread model: win32 gcc version 3.4.5 (mingw special) std::vector<int> getPrimeNumbers(int n){ std::vector<int> v; bool isprime; v.push_back(2); int i; int j; for (i = 3; i <= n; i++){ isprime = true; for (j = 2; j <= i - 1 ;j++){ if ( i % j == 0){ isprime = false; } } if (isprime == true){ v.push_back(i); } } return v; } int main(){ for (int n = 6; n <= 1000; n = n + 2){ std::vector<int> v = getPrimeNumbers(n); bool found = false; for (std::vector<int>::iterator Iter = v.begin(); Iter != v.end(); Iter++){ for (std::vector<int>::iterator Iter2 = v.begin(); ((Iter2 != v.end()) && (found == false)); Iter2++){ if ( (*Iter2) == ( n - (*Iter))){ found = true; std::cout << n << " = " << (*Iter) << " + " << (*Iter2) << std::endl; } } } if (found == false){ std::cout << n << " = " << "failed" << std::endl; } } }

inokimax
質問者

お礼

回答ありがとうございます!! プログラムの言語はFORTRANでした。 この回答への補足に書いていたので、遅くなって済みません…

inokimax
質問者

補足

プログラムの言語はFORTRANです!! 遅くなって済みません…

関連するQ&A

  • FORTRANプログラム

    学校の課題で1000まで『ゴールドバッハの予想』を表示させないと行けないのですが全くわかりません… フローチャートだけでもわかる方おられませんか? ぜひ教えてください!! 補足:前回も同じ内容で質問しましたが、どのプログラムでするか書くの忘れていました。FORTRANプログラムです。よろしくお願いします!!

  • ゴールドバッハの予想 関連

    ゴールドバッハの予想 関連質問 「2p以上の偶数は、p以上の二つの素数の和で表せるか?」 p=2,3 はゴールドバッハの予想 と同じことだと思います。 p=7 は16=3+13=5+11 となり、表せません。 p=5の場合、60ぐらいまで調べましたが、反例が見つかりませんでした。 満たさなくなる最少の偶数を知りませんか?

  • ゴールドバッハ予想のような問題

    ゴールドバッハ予想は、二つの素数の和で全ての偶数を表せるかという問題ですが、二つの素数の和で全ての奇数を表すことができることは証明できるのでしょうか?

  • ゴールドバッハ予想について

    中学2年生です。 中2なりにゴールドバッハ予想について考えてみました。 「4以上の全ての偶数は、二つの素数の和で表すことができる」 とありますが、至極普通のことでは無いのですか? 素数の中で2だけは偶数で、それ以外は全て奇数です。 それを前提とすると普通に解けませんか? 2のみを例外として式を作ると 2m+1+2n+1=2(m+n)+2 例を挙げるとmに1を、nに2を代入してみると、 3+5=8 となります。 8は4以上の偶数ですよね。 そして先程例外としていた2の式を作ると 2+2=4 普通に4。 当たり前のことなんじゃないですか?

  • ゴールドバッハの予想? 素人に難しさを教えてください。

    「2より大きい偶数は2つの奇数で表せる」というのがゴールドバッハの予想ですが、 単純に考えて、素数は奇数の一部ということで、 奇数+奇数=偶数 ↓ 素数+素数=偶数 と、こんな簡単に証明できないのでしょうか? 私は数学が苦手です。 数学者の気持ち(考えているレベル)が知りたいのですが、 上の証明が数学的にダメな点をご指摘ください。 数学の専門家にお聞きしたいです。

  • ゴールドバッハの予想に関する質問

    ゴールドバッハの予想に関する質問です. ゴールドバッハの予想: 2n = p + q,  n ≧ 3,  p,q は奇素数です. ● 問1: 奇素数 p,q を p ≦ q として,奇素数 q を,ある値 Q( q = Q )で固定します. この時,2n = p + Q,  p ≦ Q を満たす式の「個数」を計算する計算式は知られていますか? 知られているとすれば,どの様な計算式で「個数」が与えられますか? ● 問2: 2n = p + q の p,q を p ≦ q として,かつ,p < P,  q < P とします. P は,p,q より大きい或る奇素数とします.いま,奇素数 P を或る値に固定した時, P より小さい,すべての奇素数で構成される 2n = p + q の式の全「個数」を計算する計算式は知られていますか? 問1,問2 の一つでも,ご存じの方,教えて下さい.よろしくおねがいします.

  • リーマン、ゴールドバッハ予想を証明した場合、どうやって確認したらよいで

    リーマン、ゴールドバッハ予想を証明した場合、どうやって確認したらよいでしょうか。掲示板に載せると、権利は掲示板の管理者のものになると聞いたので、何か良い方法を教えて頂けないでしょうか。

  • 逆ゴールドバッハ予想

    仰々しいタイトルをつけてしまいましたが、次の予想を立てました 【逆的なゴールドバッハ予想】 13以上の奇素数は、2つの合成数の和で表すことができる。 また、この2つの数は互いに素である。 13=4+9,29=14+15,59=27+32 この予想は、たぶん合っていると思うのですが… 簡単に証明できる気がするのですが、行き詰まってしまいました。どなたか証明または否定証明できるでしょうか ●1つのヒント すべての奇数2k+1は、2つの連なる数の和k+(k+1)で表すことができる。 したがって、 奇素数=(k-m)+(k+m+1) の形で表すことができる。 このとき、右辺の2項のうち一方は偶数だから、もう一方の数が奇素数である必要はない ということを証明できればよいのですが… ちなみに、参考として2つの数a,kが互いに素(a,k)=1であるとき、(a,a+k)=1となります。

  • ゴールドバッハの予想についてのプログラムなんですが・・・

     ゴールドバッハの予想(4以上の任意の偶数は,2つの素数の和で表せる)を表すJavaプログラムです。 ---------------------------------------------------------------- public class Gold { static int prime(int number){ int count=0; for(int i=1; i<=number; i+=2){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; //System.out.println("4=2+2"); for(n=6; n<100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ //System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } ---------------------------------------------------------------- 『for(int i=1; i<=number; i++){ のループ、number まで回しているのが無駄である。素数判定は 2 以上、√number 以下の整数で割り切れれば素数でないのでループの上限は√number で良い。number まで回す必要はなく、i で割り切れた時点で prime=1 として 飛び出せばよい。ループを回り終わっても割り切れていなければ prime=2 で出る。』というコメントを、上に書いたプログラムを変更して表すにはどうしたら良いのですか?? 誰か教えて下さい(*_*) お願いします★

    • ベストアンサー
    • Java
  • ゴールドバッハの予想について・・・

     ゴールドバッハの予想(4以上の任意の偶数は,2つの素数の和で表せる)を表すJavaプログラムを作りたいのですが、できるだけ計算経過時間を短縮したいんです。  下のプログラムを改善して、計算経過時間が速くなるようにして下さい。  どういう理由で改善したのかも付け加えてくれると嬉しいです。 -------------------------------------------------------------------------------------------------------------------------------- public class Gold { static int prime(int number){ int count=0; for(int i=1; i<=number; i++){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; for(n=4; n<100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } --------------------------------------------------------------------------------------------------------------------------------

    • ベストアンサー
    • Java