Modulo (opération)

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Modulo (informatique))
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir Modulo.

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, a \mod n = a - \lfloor a/n \rfloor n. 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.

Trois définitions de la fonction modulo[modifier | modifier le code]

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.[modifier | modifier le code]

E(z) (noté en mathématiques \lfloor z \rfloor  ) 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 \times E\begin{pmatrix}\frac{x}{y}\end{pmatrix}
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).

En utilisant la fonction de troncature de la partie décimale[modifier | modifier le code]

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.

La fonction Euclidienne[modifier | modifier le code]

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 | modifier le code]

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++, 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 | modifier le code]

Les langages suivants utilisent la définition mathématique (1.)

  • Perl  : $a % $n est défini sur les entiers; les operandes réels sont tronqués vers 0 par coercion.
  • Visual Basic : a Mod n est 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 n n'admet que des opérandes entiers, et n doit être strictement positif.
  • Excel : MOD(a;n) fonctionne sur les nombres réels. La version française: s'appelle Reste(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]
  • PHP  : $a % $n est défini sur les entiers et retournera un résultat ayant le même signe que $a.

Les langages suivants utilisent la définition (2.)

  • Free Pascal 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"
  • C, C++: a % n demande des opérandes entiers.
  • Java: a % n permet des opérandes réels.

Valeur d’un modulo 0[modifier | modifier le code]

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.

Notes et références[modifier | modifier le code]