トップページ⇒tech
20コメント5KB

素数一覧を書き出すプログラム

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/10/25(火) 21:41:53
素数一覧が欲しくなったから今からプログラム作る。
アルゴリズムはエラトステネスの篩でいいよね。
っつーかそれ以外に素数一覧求めるいい方法知らないだけ。
000212005/10/25(火) 21:43:13
書き出すフォーマットはカンマ区切りがいいよね、多分。

int primes[] = {
#include "prime.dat"
}

ってできて何かと便利だろうし。
000312005/10/25(火) 21:49:00
ファイルを開きっぱなしで素数が見つかったら逐次書き出すのと、
見つかった素数を一旦配列に格納しておいてからまとめてファイルに書き出すのとどっちが早い?
000412005/10/25(火) 21:51:38
今更だけど言語はC++でコンパイラはVC2005使います。
0005デフォルトの名無しさん2005/10/25(火) 21:52:25
>>1
死ねば?
0006デフォルトの名無しさん2005/10/25(火) 21:52:51
>>3
その二つの方法の選択によって生じる速度差は、
アルゴリズムの改良/選定によって生じる速度差の1%には到達しないであろう
000712005/10/25(火) 22:06:25
素数を求めるのに要した時間を計ろうとしたら
ファイル書き出しは別にやった方がいいか。
でも余計にメモリ食うな。
000812005/10/26(水) 00:28:45
テンプレート関数って宣言と定義を別ファイルに分けるとリンクがうまく行かないんだね……
なんで??
000912005/10/26(水) 01:01:00
よく考えたらテンプレート関数だけコンパイルする事態って有りえないな。
テンプレート関数の定義は宣言といっしょにしちゃうか。
0010デフォルトの名無しさん2005/10/26(水) 01:01:02
ぜひ素数判定ロジックを教えて欲しい
もちろん100桁程度なら瞬殺するんだろうし、革命だな
0011デフォルトの名無しさん2005/10/26(水) 02:27:44
>>1はブッチ神父
0012デフォルトの名無しさん2005/10/26(水) 02:56:40
>>1
数学の公式集に出ている。それを使ったプログラムが
ベクターにいくつかあるぞ。
ちなみにエラトステネスはかなり遅いアルゴリズムだぞ。
001312005/10/26(水) 03:14:56
よくわかんね。
とりあえずいったん配列に格納することにした。
001412005/10/26(水) 03:15:28
もう既存のプログラムを使用することにして面倒なのでやめます。
0015デフォルトの名無しさん2005/10/26(水) 15:57:42
判明している素数のリスト
奇数がそれ以下の素数で割れないならリストに追加
001612005/10/26(水) 18:32:45
>>13-14
誰?
まあいいや。騙られた所で困るわけじゃない。

>>12
目的は2からNまでの素数列挙なので、
いちいち素数判定するよりは
エラトステネスの篩+小手先高速化で行くのが良さそうな。

とりあえず2と3が素数で4が非素数であることを自明として、
6N±1についてだけ対象とすればいいですかね。
計算が簡単なのは奇数全部を対象とすることですが。
001712005/10/26(水) 18:36:34
それとも確率的な手法で早いのがあるんだろうか…
2^32までの一覧を生成するとして素数がだいたい2億個になるから
誤判定率は最低でも1/2億でないと困りますよね。
んー
001812005/10/26(水) 18:41:05
やっぱり確率的手法は誤判定が嫌だから使わない方向で行きます。
0019デフォルトの名無しさん2005/10/26(水) 22:12:44
program SieveOfEratosthenes
 implicit none
 integer :: i, j, nmax
 logical, allocatable, dimension(:) :: lprm
 
 read *, nmax
 allocate(lprm(2:nmax))
 lprm(2:nmax) = .true.
 do i = 2, int(sqrt(real(nmax)))
  if (lprm(i) == .false.) cycle
  forall (j=i*2:nmax:i) lprm(j) = .false.
 end do
 do i = 2, nmax
  if (lprm(i) == .true.) print *, i
 end do
 deallocate(lprm)
end program SieveOfEratosthenes
0020デフォルトの名無しさん2005/10/27(木) 11:44:48
>>16
6N+1、6N+5(まぁ>16と同じことだが)で処理するなら奇数全部に比べて難しくないと思うが。
#-1は面倒でない?
■ このスレッドは過去ログ倉庫に格納されています