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;
+}