Project Euler 10

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.
10以下の素数の和は2 + 3 + 5 + 7 = 17である。
200万以下の全ての素数の和を計算しなさい。

Mathematica

A = 0;
For[i = 1, i < 2000000, i++,
 A += If[PrimeQ[i], i, 0]
 ]
A

まだC言語的な書き方から抜け出せませんねぇ・・・

これは短く書いている方がたくさんいました。

Total@Select[Range@2000000, PrimeQ]
Total[Select[Table[i, {i, 2000000}], PrimeQ]]

*1

C/C++

#pragma comment(lib,"mpir.lib")
#include <iostream>
#include <cmath>
#include <mpir.h>
#include <deque>

using namespace std;

int main(){
	const int MAX = 2000000;
	deque<bool> p;

	for(int i=0 ; i<MAX+1 ; i++){
		p.push_back(true);
	}
	p[0] = false;
	p[1] = false;

	double myEnd = sqrt(double(MAX));
	for(int i=2 ; i < myEnd ; i++){
		for(int j=2 ; i*j<=MAX ; j++){
			p[i*j] = false;
		}
	}

	mpz_t n;
	mpz_init_set_str(n,"0",10);

	for(int i=1 ; i<=MAX ; i++) if(p[i]) mpz_add_ui(n, n, i);
        mpz_out_str(stdout , 10, n);

	return 0;
}

mpir(多倍長演算ライブラリ)についてはProject Euler 3の記事をご参照ください。
最初はbool型の200万の大きさの配列を宣言しようとしていたのですが、あえなくStack Overflow。
奇数だけ入れるという条件でもできたと思うのですが、vectorをまず試してみました。
ですがvectorは基本的に使うなということらしいので、dequeに辿りつきました。
dequeとvectorは似ているっぽいのですが、vectorだけが特殊で、計算効率を犠牲にしてメモリ効率を上げている。さらにイテレータなどがうまく機能しないことがあって危険、ということらしいです。
実際に上記のコードは30秒ほどで結果を出してくれますが、dequeをvectorに変えてやってみたところ3分以上かかりました。

*1:Select[list,crit]: crit[ei]がTrueとなるlist のすべての要素[ei] を取り出す。