From dd9eaefbd22083857654cd41af04d686b88a87e8 Mon Sep 17 00:00:00 2001 From: EdouardParis <mail@edouard.paris> Date: Wed, 1 Jun 2016 15:08:14 +0200 Subject: [PATCH] Question_13.cpp --- src/Makefile | 5 ++- src/question_13.cpp | 74 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/question_13.cpp diff --git a/src/Makefile b/src/Makefile index 75887c5..96ab7f5 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 0000000..aa4de48 --- /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; +} -- GitLab