Project Euler 46

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


これも一致する値を探すが、探すだけなので同じコードを使えなかった。
一致しない最初の値を出すので、dropwhileを作った。


itertools.h
primes.h

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

using namespace itertools;

template<typename T, typename U>
bool is_coincident(T& gen1, U& gen2) {
    decltype(gen1.next())   v1;
    decltype(gen2.next())   v2;
    if(!gen1.exists_next() || !gen2.exists_next())
        return false;
    
    v1 = gen1.next();
    v2 = gen2.next();
    while(true) {
        if(v1 == v2) {
            return true;
        }
        else if(v1 < v2) {
            if(!gen1.exists_next())
                return false;
            v1 = gen1.next();
        }
        else {
            if(!gen2.exists_next())
                return false;
            v2 = gen2.next();
        }
    }
}

bool is_GoldBach(int n) {
    auto    g1 = primes::genPrimes();
    int     upper = int(sqrt((double)n / 2));
    auto    c = range<>(upper, -1, -1);
    auto    g2 = map([n] (int m) { return n - 2 * m * m; }, c);
    bool    b = is_coincident(g1, g2);
    return b;
}

int main() {
    int n = head(dropwhile(is_GoldBach, count<>(9, 2)));
    std::cout << n << std::endl;
}