algorithmique (école d'ingénieur) · Chapitre 11 · Exercice de TD
Division euclidienne
Programmes justes : logique de Hoare et invariants · niveau 3 (difficile)
Énoncé
On veut le quotient et le reste de la division de par , sans utiliser / ni % sur .
- Écrire une fonction sur l'invariant , par soustractions successives. Complexité ?
- Accélérer : calculer d'abord avec puissance de et , puis travailler sur l'invariant : « » en divisant et par à chaque tour. Écrire la progression et la fonction. Complexité ?
- Comparer les nombres de tours pour et .
Corrigé
- Initialisation , . Progression : . Arrêt : , donc .
static int[] divisionSoustraction(int a, int b) { // a ≥ 0, b > 0
int q = 0, r = a; // a = q×b + r et r ≥ 0
while (r >= b) { // a = q×b + r et r ≥ b
q = q + 1; r = r - b; // a = q×b + r et r ≥ 0
} // a = q×b + r et 0 ≤ r < b
return new int[] {q, r};
}
La boucle fait tours : , exponentiel en le nombre de chiffres de .
- Une première boucle double jusqu'à ; alors est vrai. Progression : si , on divise et par ; on a alors , et , . Arrêt : , donc et .
static long[] divisionRapide(long a, long b) { // a ≥ 0, b > 0
long c = b, p = 1; // c = p × b
while (c <= a) { c = 2 * c; p = 2 * p; } // c = p × b > a
long q = 0, r = a; // J : a = q×b + r, 0 ≤ r < c, c = p×b
while (p != 1) { // J et p ≠ 1
c = c / 2; p = p / 2; // a = q×b + r et 0 ≤ r < 2c
if (r >= c) { r = r - c; q = q + p; } // J
} // a = q×b + r et 0 ≤ r < b
return new long[] {q, r};
}
Chaque boucle fait tours environ : . C'est l'algorithme de la division posée, en base .
- Pour et , le quotient est et le reste . La première fonction fait tours, la seconde ( doublements puis divisions par ).
100 % gratuit
La suite du chapitre est sur Adloun
- 12 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.