Modulo (opération)
|
|
Cet article ne cite pas suffisamment ses sources (juin 2009).
Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ». (Modifier l'article)
|
En mathématiques et en programmation informatique, on désigne par modulo l’opération de calcul du reste de la division euclidienne.
On écrira a mod n pour représenter le reste de la division de a par n. Un modulo équivaut donc à la différence entre "a" et la multiplication de la valeur tronquée du quotient de "a" par "n". En symboles,
. Par exemple, 9 mod 4 = 9 - (2 * 4) = 1.
Toutefois les langages de programmation divergent souvent de cette définition quand le diviseur "n" ou le dividende "a" est négatif, à cause de l'ambiguïté sur le mot "valeur tronquée" dans la définition informelle.
Sommaire |
Trois définitions de la fonction modulo [modifier]
Dans la pratique x mod y peut être calculé en utilisant d'autres fonctions. Des différences apparaissent suivant les types des variables utilisées, lesquels contiennent le type entier dans les implémentations courantes. Mais la principale différence réside dans l'interprétation de la partie entière du quotient, en fonction du signe du dividende ou celui du diviseur quand ceux-ci peuvent être négatifs:
- Utiliser la fonction partie entière
E.
E(z)(noté en mathématiques) est le plus grand entier inférieur ou égal à z.
mod retourne alors un modulo toujours compris entre 0 (inclus) et le diviseur y (exclu) et qui a le même signe que le diviseur y :
-
- x mod y =
x - y * E(x / y).
- x mod y =
-
- Par exemple :
| Dividende | Diviseur | Quotient | Reste |
|---|---|---|---|
| 117 | 17 | 6 | 15 |
| -117 | 17 | -7 | 2 |
| -117 | -17 | 6 | -15 |
| 117 | -17 | -7 | -2 |
| 12.7 | 3.5 | 3 | 2.2 |
Cette définition vérifie les lois de l'arithmétique modulo, plus: x mod −y = −((−x) mod y). Elle convient pour les calculs cycliques (par exemple calendaires). La valeur modulaire retournée est toujours du signe du diviseur (le diviseur étant positif dans la plupart des calculs cycliques dont les calculs calendaires).
2. En utilisant la fonction de troncature de la partie décimale :
-
x % y = x - y * iPart(x / y)
-
- Par exemple :
| Dividende | Diviseur | Quotient | Reste |
|---|---|---|---|
| 117 | 17 | 6 | 15 |
| -117 | 17 | -6 | -15 |
| -117 | -17 | 6 | -15 |
| 117 | -17 | -6 | 15 |
Le modulo a le même signe que l'opérande gauche.
Cette définition vérifie la loi: x mod −y = x mod y. Elle viole la loi (x+n) mod n = x mod n de l'arithmétique modulaire.
3. La fonction dite Euclidienne renvoie toujours un résultat positif ou nul, et plus petit que la valeur absolue du diviseur, par définition.
Comportement avec des opérandes non entiers [modifier]
Les trois définitions permettent à x et y d’être des entiers négatifs, ou des nombres rationnels (ou réels en mathématiques, bien que les systèmes informatiques de calcul numérique ne sachent travailler que sur un sous-ensemble des nombres rationnels, du fait de limites de précision).
Cependant en C, C++, Java, PHP et de nombreux langages, l’opérateur mod n’opère que sur les types entiers. Suivant le langage, les types numériques sont parfois convertis implicitement en entiers (par coercion).
Utilisation des deux définitions [modifier]
Les langages suivants utilisent la définition mathématique (1.)
- Perl :
$a % $nest défini sur les entiers; les operandes réels sont tronqués vers 0 par coercion. - Visual Basic :
a Mod nest défini sur les réels et sur les entiers, et revoie un entier si les deux operandes sont entiers. - Pascal (ISO 718) :
a mod nn'admet que des opérandes entiers, etndoit être strictement positif. - Excel :
MOD(a;n)fonctionne sur les nombres réels. La version française: s'appelleReste(a,n). - langage Python: : La FAQ explique ce choix par l'exemple suivant : « si une horloge indique 10 heures, qu'indiquait-elle 200 heures avant ? -190 % 12 == 2 est utile ; -190 % 12 == -10 est un bug prêt à mordre. » [1]
Les langages suivants utilisent la définition (2.)
- Freepascal et Delphi n'autorisent que des opérandes entiers, et la définition du langage [2] précise:
"Le signe du résultat est le signe de l'opérande gauche"
Valeur d’un modulo 0 [modifier]
Dans la plupart des langages, l’opération modulo ne génère aucun résultat si le diviseur est nul, et une exception arithmétique de division par zéro est alors générée.
) est le plus grand entier inférieur ou égal à z.