diff --git a/src/question_3.cpp b/src/question_3.cpp index 67e524fe2d5557f313cf177e630732f816f62cb9..6131d428b32801e48a9c8b07ebc11ec266cf9341 100644 --- a/src/question_3.cpp +++ b/src/question_3.cpp @@ -5,27 +5,24 @@ #include <iostream> #include <cstdlib> -#include <ctime> #include <gmpxx.h> #include <cassert> -time_t algo_sqrt(mpz_class const& a, mpz_class & res) +void algo_sqrt(mpz_class const& a, mpz_class & res) { mpz_class r1 = a; - mpz_class r2 = a; - - struct timespec t0, t1; + mpz_class r2 = a - 1; - clock_gettime( CLOCK_REALTIME, &t0); - while (r2 < r1) { - r2 = (r1 + (a / r1))/2; + while (r2 < r1 && r2 != 0) { r1 = r2; + r2 = (r1 + (a / r1))/2; + } + + if ((a - r2*r2) < 0) { + res = r2 - 1; + } else { + res = r2; } - res = r1; - clock_gettime( CLOCK_REALTIME, &t1); - - time_t t_res = 1000.*(t1.tv_sec-t0.tv_sec) + (t1.tv_nsec-t0.tv_nsec)/1000000.; - return t_res; }; int main(int argc, char** argv) { @@ -34,10 +31,9 @@ int main(int argc, char** argv) { mpz_class a(n); mpz_class res; - time_t t; - t = algo_sqrt(a, res); + algo_sqrt(a, res); - std::cout << res << "\t" << t << std::endl; + std::cout << res << std::endl; return 0; } diff --git a/src/question_5.cpp b/src/question_5.cpp new file mode 100644 index 0000000000000000000000000000000000000000..22309a1c7b8d6f9c4b426e76b178946db4b14718 --- /dev/null +++ b/src/question_5.cpp @@ -0,0 +1,51 @@ +/*Projet Edouard Paris 2016 - Arithmetique entière + * + * Question 3 + * */ + +#include <iostream> +#include <cstdlib> +#include <ctime> +#include <gmpxx.h> +#include <cassert> + +time_t algo_sqrt(mpz_class const& a, mpz_class & res) +{ + + struct timespec t0, t1; + + clock_gettime( CLOCK_REALTIME, &t0); + + mpz_class r1 = a; + mpz_class r2 = a - 1; + + while (r2 < r1 && r2 != 0) { + r1 = r2; + r2 = (r1 + (a / r1))/2; + } + + if ((a - r2*r2) < 0) { + res = r2 - 1; + } else { + res = r2; + } + + clock_gettime( CLOCK_REALTIME, &t1); + + time_t t_res = 1000.*(t1.tv_sec-t0.tv_sec) + (t1.tv_nsec-t0.tv_nsec)/1000000.; + return t_res; +}; + +int main(int argc, char** argv) { + assert(argc == 2); + long n = strtol(argv[1], NULL, 10); + + mpz_class a(n); + mpz_class res; + time_t t; + + t = algo_sqrt(a, res); + + std::cout << res << "\t" << t << std::endl; + return 0; +}