This program generates 25 polynomials of increasing degree randomly using a Mersenne twister, solves them via Horner’s rule and records runtime.
/////////////////////////////////////////////////////////////////////////////// #include <iostream> #include <vector> #include <random> #include <iomanip> #include <chrono> /////////////////////////////////////////////////////////////////////////////// std::vector<int> randIntGen(int count); float randRealGen(void); void polyPrint(float x, std::vector<int> polyVals); void hornersRuleTime(float x, int n, std::vector<int> polyVals); /////////////////////////////////////////////////////////////////////////////// int main(void) { std::vector<int> polyVals; float x; for(int i = 1; i <= 25; i++) // iterate through 25 cases { x = randRealGen(); // generate random real number polyVals = randIntGen(i); // Generate random polyvals std::cout << std::setprecision(2) << "\nCase " << i << ": " << "x = " << x << ", "; for(auto it = polyVals.begin(); it != polyVals.end(); it++) { std::cout << "a" << std::distance(polyVals.begin(), it) << " = " << (*(it)); if((it+1) != polyVals.end()) // if it is not the last printed { std::cout << ", "; // delimit with comma } } polyPrint(x, polyVals); hornersRuleTime(x, polyVals.size(), polyVals); // pass this case std::cout << std::endl; } return 0; } /////////////////////////////////////////////////////////////////////////////// std::vector<int> randIntGen(int count) { std::vector<int> intArr; std::random_device rd; std::mt19937 engine(rd()); std::normal_distribution<> dist(50, 50); int intBuff; for(int i = 0; i < count; i++) { intBuff = (round(dist(engine))); while((intBuff < 1) || (intBuff > 99)) // while out of range { intBuff = (round(dist(engine))); // redo } intArr.push_back(intBuff); // push onto the array } return intArr; } /////////////////////////////////////////////////////////////////////////////// float randRealGen(void) { float realBuff; std::random_device rd; std::mt19937 engine(rd()); std::normal_distribution dist(0, 20.00); realBuff = dist(engine); while((realBuff > 20.00) || (realBuff < -20.00)) // While not in range { realBuff = dist(engine); // redo until it is } return realBuff; } /////////////////////////////////////////////////////////////////////////////// void polyPrint(float x, std::vector<int> polyVals) { std::cout << "\n\tPolynomial: "; for(int i = (polyVals.size() - 1); i >= 0; i--) { std::cout << std::to_string(polyVals[i]) + "("; std::cout << std::setprecision(2) << x << ")**" + std::to_string(i); if((i-1) >= 0) // if there is another { std::cout << " + "; // put a + to separate } } } /////////////////////////////////////////////////////////////////////////////// void hornersRuleTime(float x, int n, std::vector<int> polyVals) { std::chrono::system_clock::time_point start = // initialize start time std::chrono::system_clock::now(); std::chrono::system_clock::time_point end; // declare end time variable double result = polyVals[n]; // Set "seed" value for(int i = (n-1); i >= 0; i--) { result = result * x + double(polyVals[i]); } end = std::chrono::system_clock::now(); // Set end time /* Cast duration to nanoseconds, and output - sorry, it is a long line! */ std::cout << "\n\tCPU Time: " << std::chrono::duration_cast (end - start).count() << " nanoseconds"; return; } ///////////////////////////////////////////////////////////////////////////////