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