Adloun

algorithmique (école d'ingénieur) · Chapitre 12 · Exercice de TD

Racine -ème entière

Recherche séquentielle, dichotomique, arrière · niveau 2

Énoncé

Généraliser la fonction racine du cours au calcul de pour un entier et un entier . Le calcul de peut dépasser la capacité d'un long : écrire une fonction qui décide si sans jamais dépasser . Tester avec égal à Long.MAX_VALUE et .

Corrigé

On garde l'invariant du cours, . Comme , la racine est inférieure à : on part de et .

Pour tester sans dépassement, on multiplie par tant que (division entière) : si , alors , et il est inutile de continuer.


static boolean puissanceInfEgal(long m, int k, long a) { // m >= 1
    long p = 1;
    // I(i) : p = m^i et p <= a
    for (int i = 0; i < k; i++) {
        if (p > a / m) return false;  // p*m > a : donc m^k > a
        p = p * m;
    }
    return true;
}

static long racineK(long a, int k) {
    long g = 0, d = Math.min(a, 3_037_000_499L) + 1;
    // I(g,d) : g^k <= a < d^k
    while (d - g > 1) {
        long m = g + (d - g) / 2;     // g < m < d, donc m >= 1
        if (puissanceInfEgal(m, k, a)) g = m; else d = m;
    }
    return g;                         // g^k <= a < (g+1)^k
}

racineK(1000,3)=10 racineK(999,3)=9 racineK(2^62,2)=2147483648 racineK(Long.MAX,5)=6208 racineK(1,7)=1

On vérifie . Une première version qui calculait directement retournait une valeur fausse pour Long.MAX_VALUE : le produit débordait et devenait négatif. La complexité est .

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →