/***************************************
	Auteur : Pierre Aubert
	Mail : pierre.aubert@lapp.in2p3.fr
	Licence : CeCILL-C
****************************************/
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

//Some doc at : https://en.cppreference.com/w/cpp/header/execution
#include <execution>
int main(int argc, char** argv){
	size_t nbElement(100000000);
	std::vector<float> tabX(nbElement), tabY(nbElement);
	std::vector<size_t> tabIndex(nbElement);
	std::iota(tabIndex.begin(), tabIndex.end(), 0lu);
	std::transform(std::execution::par_unseq, std::begin(tabIndex), std::end(tabIndex), std::begin(tabX),
			[](size_t i){ return i*19lu%11; });
	std::transform(std::execution::par_unseq, std::begin(tabIndex), std::end(tabIndex), std::begin(tabY),
			[](size_t i){ return i*27lu%19; });
	float res = std::transform_reduce(std::execution::par_unseq, std::begin(tabX), std::end(tabX), std::begin(tabY),
			0.0f, std::plus{},
			[](float xi, float yi){ return xi * yi; });
	std::cout << "res = " << res << std::endl;
	return 0;
}


