Skip to content
Extraits de code Groupes Projets
Valider dd9eaefb rédigé par EdouardParis's avatar EdouardParis
Parcourir les fichiers

Question_13.cpp

parent d910c082
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
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
......
/*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;
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter