Project Euler 27

http://projecteuler.net/index.php?section=problems&id=27


単純に必要な分素数判定する。素数判定をするのに素数で割っていく。その素数を出すためのクラスを作った。少しずつエラトステネスのふるいをしていく。


itertools.h
primes.h

#include <iostream>
#include "primes.h"

using namespace std;
using namespace itertools;

int prime_length(int a, int b) {
    return length(takewhile([&] (int n)
                    { return primes::is_prime(n * (n + a) + b); },
                    itertools::count<>()));
}

tuple<int,int> longer(tuple<int,int> x, tuple<int,int> y) {
    return snd(x) >= snd(y) ? x : y;
}

int main() {
    const int   N = 1000;
    cout << fst(reduce1(longer, map([] (tuple<int,int> x)
                        { return make_tuple(fst(x) * snd(x),
                        prime_length(fst(x), snd(x))); },
                product(range<>(-N + 1, N))))) << endl;