diff --git a/src/Makefile b/src/Makefile
index 75887c5a180fb83431bd5a501e6e7d7dc32ba4c6..96ab7f534954e7904a60c2f4ae63e4329c424915 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,4 +1,4 @@
-all: question_3 question_5 question_9 question_11
+all: question_3 question_5 question_9 question_11 question_13
 
 question_3:  question_3.cpp 
 		g++ -o ./bin/question_3 question_3.cpp -Wall -Wextra -lgmp -lgmpxx
@@ -12,6 +12,9 @@ question_9:  question_9.cpp
 question_11:  question_11.cpp 
 		g++ -o ./bin/question_11 question_11.cpp -Wall -Wextra -lgmp -lgmpxx
 
+question_13:  question_13.cpp 
+		g++ -o ./bin/question_13 question_13.cpp -Wall -Wextra -lgmp -lgmpxx
+
 test:
 	./test.sh
 
diff --git a/src/question_13.cpp b/src/question_13.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..aa4de486207d65f44528a497458b0522f6c250f5
--- /dev/null
+++ b/src/question_13.cpp
@@ -0,0 +1,74 @@
+/*Projet Edouard Paris 2016 - Arithmetique entière
+ *
+ * Question 13 
+ * */
+
+#include <iostream>
+#include <cstdlib>
+#include <gmpxx.h>
+#include <cassert>
+
+void algo_k_root(mpz_class const& a, long const k, mpz_class & res) 
+{
+  mpz_class r1 = a + 1; 
+  mpz_class r2 = a; 
+  mpz_class r3 = a; 
+  
+  while (r2 < r1 && r2 != 0) {
+    r1 = r2; 
+    mpz_pow_ui(r3.get_mpz_t(), r1.get_mpz_t(), (k-1));
+    r2 = (r1*(k - 1) + (a / r3))/k;
+  }
+  
+  mpz_pow_ui(r3.get_mpz_t(), r2.get_mpz_t(), k);
+
+  if ((a - r3) != 0) {
+    res = 0;
+  } else {
+    res = r2;
+  }
+};
+
+long fact_perf_pow(mpz_class const& a, mpz_class * res)
+{
+  long l;
+  long k = 0;
+  long n = 1;
+  mpz_class b(0);
+  mpz_class p(2);
+
+  while (b == 0 && p < a) {
+    n = n+1;
+    algo_k_root(a, n, b);
+    p = p*2;
+  }
+
+  if (b == 0) {
+    *res = a; 
+  } 
+  else {
+     l = fact_perf_pow(b, res); 
+     k = n + l;
+  }
+
+  return k;
+};
+
+int main(int argc, char** argv) {
+  long k;
+
+  assert(argc == 2);
+  long n = strtol(argv[1], NULL, 10);
+
+  mpz_class a(n);
+  mpz_class res(0);
+
+  k = fact_perf_pow(a, &res);
+
+  if (a == res) {
+    k = 1; 
+  } 
+  
+  std::cout << res << "\t" << k << std::endl;
+  return 0;
+}