• ベストアンサー

素数を探すプログラム…。

今作っているプログラムで素数を使用したいのですが、素数を探すプログラムが分からなくて困っています。 どなたか初心者の私にも分かるプログラムを教えていただけませんか? (VB自体には素数を探す関数とか持っていないのでしょうか…?) お願いします。 (P.S)本当は出来るだけ多く探したいのですが確か無限にあるんですよね…。

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

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

とても大きな数字について、素数であるかどうかを判定するのは、効率のよい方法はなかったと思います。現在でもときどき、 「「2の63乗-1」が素数であることが確認された」 などのような素数に関することがニュースになることがあるぐらいです。 (上の値は適当に書いた値なので、本当に素数かどうかは知りません。) ある程度小さい数字が素数かどうか判定する場合は、その数の平方根程度までの奇数で割り切れるかどうかを順にすべて調べていくのが単純でいいでしょう。 (ルーチン1) ある大きさ以下の数が素数であるかどうかを調べ、リストとして出力するのなら、チェックリストを作っておき、ある数の倍数であったら、チェックしていき、最後にチェックされていない数を出力するのがいいでしょう。 (ルーチン2) 上記の実際のコードはたとえば次にようになります。 (別回答とします。)

ryuji0202
質問者

お礼

本当に丁寧な回答ありがとうございました!! C言語はよく知っていますのでかなり参考になりました。 素数というものは難しいものなんですね…。 2つのルーチンしっかり理解します!!

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

(1)VBには、素数を出す関数はありません。 (2)エラトステネス(注)、「エラトステネスのふるい」でWEB上で検索してください。沢山素数関連の著述が出てきます。 (3)いくつぐらいの素数がいるのですか。1000までの数のうちの素数は下記にのっています。 (3)素数は無限にあります。証明は高校教科書に載っていて、背理法の応用で有名です。 しかしnを指定して、F(n)が必ず素数になる、初等的な関数F()は見つかっていないようです。発見したら 歴史に名が残る? (4)エラトステネスの篩のアルゴリズムをプログラム化することは難しくないが、数が大きくなると計算時間が無視できなくなります。 (ベンチマークテストにも使われたくらい計算負荷大) それで充分な数の素数を本で調べ、メモ帳ででも打ちこんで、保存しファイル化し、プログラムの始めにファイルを読んでメモリーに読みこむのがいいのではないでしょうか。 (エラトステネスの篩のプログラム-C言語) http://www.kashi.info.waseda.ac.jp/~kashi/lec1999/pro/rep4/g99p0266-1.txt (エラトステネスの篩のプログラム-旧Basic)   http://www.geocities.com/Tokyo/Flats/9390/basic_3.html#basic37 (注)1.紀元前3世紀のギリシア人地理学者エラトステネスの地球の大きさに関する著述も出てきますが、それは捨ててください。 2。「SIEVE」はふるいの意味。

ryuji0202
質問者

お礼

回答ありがとうございました!! エラトステネスのふるいなんて考え方があったんですね…、参考にします!

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.4

回答No.2のルーチン2のコードは以下のようになります。 (VBは知らないのでC(のようなもの)で書かせていただきますが、アルゴリズムは分かると思います。 ) (回答No3.では上記の部分がわけわかんない文章になってしまってます。ごめんなさい。) void sosuu2(){  MAX=10000;/*MAX未満の素数を調べる。*/  int list[MAX];  /*全ての数は素数の候補*/  for(i=0;i<MAX;i++)list[i]=0;  j=2;/*2の倍数は素数ではない。*/  for(i=j;i<MAX;i+=j)list[i]=1;  /*3以上の奇数の倍数は素数ではない。ただし、チェックしている数j自身は素数かもしれない。*/  for(j=3;j<MAX;j+=2){   for(i=2*j;i<MAX;i+=j) list[i]=1;  }  /*素数の出力:2以上でチェックから漏れているものは素数*/  for(i=2;i<MAX;i++){   if(list[i]==0)printf("%d wa sosuu.\n",i);  } }

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.3

回答No.2のルーチン1のコードは、VBは知らないのでC(のようなもの)で書かせていただきますが、アルゴリズムは分かると思います。 int sosuu(int n){  /*n が素数だったら1を、素数でなかったら、最小の因数を返す*/  /*エラーなら-1を返す。*/  int i, max;    if(n<1) return -1;  if( mod(n,2) == 0) return 2;/*2で割り切れる?*/  max=sqrt(n);  for(i=3;i<=max;i++){   if( mod(n,i) == 0) return i;/*iで割り切れる?*/  }  return 1; }

noname#12673
noname#12673
回答No.1

候補の数字を一つ用意して、それが素数の定義に当てはまっているか判定すればよいのではないでしょうか? 1からnまでの中で素数はどれか、という場合は1からnまでの数字を総当りする。なんでもいいから、とにかく素数を使いたいなら、乱数で整数を1個発生させて、それが素数か判定し、素数でなかったらもう1個発生させる・・・というふうにやってみては? 何桁の素数を見つけたい・・・っていう条件あります?

ryuji0202
質問者

お礼

さっそくの回答ありがとうございました! 何桁の素数を見つけたいというのはないんです…。 とりあえずどんなものでもいいから数多く知りたかったんです。 考え方参考にしたいと思います!!

関連するQ&A

  • 16進数から10進数へ

     16進数から10進数への関数を教えてください。 VBでです。 HEXという関数は10から16ですよね。

  • VBAで2進数を返すプログラムのつくりかた、教えてください!

    10進数を引数としたとき、戻り値で2進数を返すプログラム(関数)を作りたいと考えています。イメージとしては、商を2で次々に割っていき、あまりを逆から並べるのかなーと思ったのですが、実際にプログラムを書くとなると、手が止まってしまいます(泣)。どなたか、すぐにでも教えてくださーい!

  • 1)4で割って3余る素数が無限にあることを示せ.

    1)4で割って3余る素数が無限にあることを示せ. 2)オイラー関数φ(n)について,以下を証明せよ. (1) pが素数のときφ(p^r )=p^r-p^(r-1). (2) mとnが互いに素ならばφ(mn)=φ(m)φ(n). (3) 自然数nに対し,φ(n)=n?_(p|n) (1-1/p) (積はnを割る素数をわたる).

  • VBプログラムのコーディング数のチェックツール

    VBで開発したプログラムのコーディング数をチェックできるツールなどご存知でしたら教えてください。フリーソフトでお願いします。 VBのコーディング数ってあんまり意味ないですよね。プログラムの規模を測りたいということなのですが、これまでは、画面数・帳票数・難易度という表現で行ってきましたし。どうしてもコーディング数がいいらしいので・・・

  • 与えられた正整数が素数なら1を、素数でないなら0を返すプログラム

    与えられた正整数が素数なら1を、素数でないなら0を返す関数isprime()を作り、それを用いて1000以下の素数すべてをprime.txtという名前のファイルに出力するプログラムを作らなくてはなりません>< 学校の課題で与えられたのですが全然わかりません><よかったらわかる方教えていただけないでしょうか?

  • 素数 反例

    素数が無限であることの証明について。 http://homepage2.nifty.com/mathfin/hairihou/hairihou03.htm 素数が無限個でないことがある。すなわち,素数が有限個であることがあると仮定し、                                           (反例の存在を仮定)  その個数をn個とする。すべての素数を小さい方から順に          P1,P2,P3 ,・・・・・・,Pn      とおける。ここで,           P = P1×P2×P3×・・・・・・×Pn + 1    により,自然数Pをつくると,    Pは, P1,P2,P3 ,・・・・・・,Pn のいずれで割っても1余る。      よって,Pは1と自分自身以外に約数を持たないから素数である。    これはPnよりも大きい素数が存在することを意味しており,矛盾が生ずる。    よって,素数が有限個であることはない(反例は存在しない)     ゆえに,素数は無限に存在する --------------------------------------------- P=2 × 3 × 5 × 7 × 11 × 13 + 1 = 59 × 509 という反例がありますが、 上記の証明は間違いということですか?

  • スタティックプログラム

    VB歴3ヵ月の初心者です。 VS 2003で.netプログラムを始めました。 安全性を高めるために、VB6.0におとしました。 それでもプログラムのインストール時に、DLL、OCXがインストールされてしまうため、スタティックプログラムを作成したいと考えています。 VB6.0もしくはVS2003で作成したプログラムをスタティックに変換することは出来ないでしょうか?不可能である場合にスタティックプログラムを作るにはどのような手法をとれば良いのでしょうか? ご教示お願いします

  • Nikonのプログラムシフトについて

    デジ一眼初心者です。 NIKONのD80を使用していますが、PモードのプログラムシフトとA・Sモードとの違いが分かりません。 Pモードで、プログラムシフトすると、シャッタースピードが速くなったり遅くなったりし、それに合わせて、絞り値も変わりますが、その方法でシャッタースピードを変化させた場合と、もともとSモードを選択してシャッタースピードを変えた場合と、何が一番異なるのでしょうか? プログラムシフトを使っていると、AやSにして撮るメリットが分かりません。 どうかお教え願います。

  • 最大公約数を求めるプログラム

    学校の課題で明日の朝まで提出なのですが、わからないので教えてください。 二つの整数の最大公約数を求める再帰関数を定義し、最大公約数を表示するプログラムなのですが、その再帰関数が作れないのです。 どなたか教えていただけないでしょうか。モデルを書いていただけると助かります。

  • プログラム間のデータ引き渡し

    VBで作成した複数のプログラムを次々に渡り、その間発生した計算値を 使用したいのですが… 一つのプログラムで発生したデータは、テキストファイルとして保存され 次のプログラムに処理を移してそのデータを使用する、といった操作をしたいのです Shell関数やCommand関数を使用すればできるのでしょうか? アドバイスお願いします

専門家に質問してみよう