SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2017.08<<123456789101112131415161718192021222324252627282930>>2017.10
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

しばらく更新が滞ってしまった。最近は結構忙しい。

小ネタだが、C# で素数を列挙するメソッドを書いてみた。
とりあえず、すぐ思いつくのが以下。
IEnumerable<long> Primes() {
yield return 2;
var Primes = new List<long>();
for ( long Test = 3 ; ; Test += 2 ) {
if ( Primes.TakeWhile( x => x * x <= Test ).All( p => Test % p != 0 ) ) {
yield return Test;
Primes.Add( Test );
}
}
}



その実行テスト用のコード。
long NumberToExamine = 10000000;

var sw = new Stopwatch();
IEnumerable<long> primes;

sw.Start();
primes = Primes().TakeWhile( p => p <= NumberToExamine );
Console.WriteLine( "{0} - {1} {2}", primes.First(), primes.Last(), primes.Count() );
sw.Stop();
Console.WriteLine( "{0}", sw.Elapsed );



実行結果は以下。約23秒。

2 - 9999991 664579
00:00:22.8737086




もうちょっと早くならないか、と思い、ネットを検索していろいろと参考にさせてもらいつつ、作成したのが以下。
IEnumerable<long> Primes() {
yield return 2;
var Composites = new Dictionary<long, long>();
for ( long Test = 3 ; ; Test += 2 ) {
if ( !Composites.ContainsKey( Test ) ) {
yield return Test;
Composites.Add( Test * Test, Test );
} else {
var p = Composites[Test];
var n = Test;
Composites.Remove( Test );
do {
n += 2 * p;
} while ( Composites.ContainsKey( n ) );
Composites.Add( n, p );
}
}
}



それの実行結果が以下。約1.7秒とめちゃ早くなった。

2 - 9999991 664579
00:00:01.6808544



ま、参考まで。

テーマ:プログラミング - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。