En informatique, l'opération modulo, ou opération mod, ., est une opération binaire qui associe, à deux entiers naturels, le reste de la division euclidienne du premier par le second, supposé non nul. Le reste de la division de par () est noté (ou dans certains langages informatiques). Ainsi 9 mod 4 = 1, car 9 = 2×4 + 1 et 0 ≤ 1 < 4. De même 9 mod 3 = 0. L'opération peut être étendue aux entiers relatifs, voire aux nombres réels, p. 128-129., mais alors les langages de programmation peuvent diverger, en particulier n'est plus forcément positif ou nul, et note marginale p. 88..
En mathématiques, l'usage du terme modulo est différent même s'il est lié : il ne désigne pas une opération mais intervient pour caractériser une relation de congruence sur les entiers (et plus généralement pour d'autres congruences) ; le mot clef mod associé n'est le plus souvent utilisé que pour noter cette congruence, même si un ouvrage comme Concrete Mathematics l'utilise également pour désigner l'opération binaire, pour l'opération binaire, pour la congruence. Les auteurs n'utilisent le terme modulo que pour la relation de congruence, mais nomment « mod » l'opération binaire..
Différentes définitions de la fonction modulo L'opération mod associe à deux entiers naturels et le reste de la division euclidienne de par , qui est l'unique entier naturel vérifiant : pour un certain entier naturel ; .
Par exemple : car 12 = 10 × 1 + 2 et 0 ≤ 2 < 10 c'est-à-dire que 2 est le reste de la division euclidienne de 12 par 10.
Usage En mathématique l'opération mod est couramment utilisé pour définir des relations de congruence sur les entiers. C'est-à-dire des relations de comparaison circulaire typique, par exemple, des calculs calendaires.
En informatique, elle est classiquement utilisé dans le même esprit.
Exemple simple vignette|Les opérations sur les horloges sont modulo 12. C'est un cas d'usage classique de l'opération modulo appliqué aux entiers naturels, en mathématique comme en informatique. Un exemple classique utilisé en mathématique et également représentatif de son usage en informatique, est le calcul sur une horloge.
En effet, sur une horloge, l'addition des heures est circulaire : s'il est 9h et que je rajoute 4h alors il est 13h, mais, sur une horloge qui repasse à 0 après le passage à 12, alors il est noté 1h.
On dit que les opérations sur l'horloge sont alors « modulo 12 ».
1 et 13 sont alors dits « congrus modulo 12 », ou encore :
1 ≡ 13 (mod 12).
En considérant le modulo comme une opération, comme c'est le cas en informatique, on écrirait :
Heure_finale = ( Heure_initiale + x ) mod 12
De manière générale, en informatique, l'opération modulo est utilisée pour toute opération circulaire similaire (calcul calendaire, certains parcours de tableau etc.)
Exemple avec des décalages circulaires L'opération modulo permet d'effectuer un décalage circulaire d'indices. En effet, si l'on considère la suite des entiers contigus de 1 à n, u = (1, 2, 3…, n − 1, n), alors on peut décaler de p rangs avec : ui = ((ui + p − 1) mod n) + 1. Par exemple, pour décaler de deux la suite (1, 2, 3, 4, 5) : ui = ((ui + 1) mod 5) + 1 ; on a bien : u1 = ((1 + 1) mod 5) + 1 = 3 u2 = ((2 + 1) mod 5) + 1 = 4 … u4 = ((4 + 1) mod 5) + 1 = 1 et donc u = (3, 4, 5, 1, 2).
Divergence des définitions dans les cas autres que celui des entiers naturels vignette|253x253px|Représentations graphiques des fonctions «reste» (en vert ) et «quotient» (en rouge) dans la division euclidienne par un entier n, à gauche pour un entier n positif et à droite pour un entier n négatif.Le reste de la division euclidienne reste positif dans tous les cas. L'analogie avec la définition du reste de la division euclidienne est brisée une fois qu'on étend l'opération mod aux entiers négatifs ou aux réels.Son comportement diffère alors en fonction des langages de programmation et ne respecte en général plus la définition mathématique du reste de la division euclidienne.
En effet, le reste de la division euclidienne reste positif dans tous les cas (voir schéma ci-contre), contrairement à de nombreuses autres définitions utilisées en informatique (voir sections ci-après). Cependant, dans tous les cas :
est congru modulo à , ce qui signifie que "" est un multiple entier de : est l'un des représentants de la classe d'équivalence de modulo .
On décrit ci-dessous quelques-unes des définitions courantes dans les langages informatiques.
Les différentes définitions en informatique
Définition utilisant la partie entière (inférieure)
vignette|253x253px|Évolution du quotient et du reste (résultat du modulo) en fonction des éléments a et b et du signe du diviseur dans le cas où on utilise la définition utilisant la partie entière. Soit la notation définissant le plus grand entier inférieur ou égal à .
Alors on peut poser une définition de l'opération mod par :
L'opérateur mod renvoie alors un nombre toujours compris entre 0 (inclus) et le diviseur (exclu) et qui a le même signe que le diviseur n. Ce qui le distingue du reste de la division euclidienne puisque le résultat peut alors être négatif quand le quotient est négatif.
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 modulaire, plus : . Elle convient pour les calculs cycliques. La valeur modulaire renvoyée est toujours du signe du diviseur (le diviseur étant positif dans la plupart des calculs cycliques).
Définition utilisant la troncature de la partie décimale vignette|253x253px|Évolution du quotient et du reste (résultat du modulo) en fonction des éléments a et b et du signe du diviseur dans le cas où on utilise la définition utilisant la troncature. Si est la troncature entière de , la définition est donnée par :
L'opérateur mod renvoie alors :
un nombre positif ou nul strictement inférieur à pour positif. un nombre négatif ou nul strictement supérieur à pour négatif.
Exemple :
Dividende Diviseur Quotient Reste 117 17 6 15 −117 17 −6 −15 −117 −17 6 −15 117 −17 −6 15
Le résultat a le même signe que l'opérande gauche.
Cette définition vérifie la loi: . Elle viole la loi .
Définition utilisant l'arrondi vignette|254x254px|Évolution du quotient et du reste (résultat du modulo) en fonction des éléments a et b et du signe du diviseur dans le cas où on utilise la définition utilisant l'arrondi. Si est l'arrondi entier de , la définition est donnée par :
,
vérifiant, pour : .
Cette définition est notamment utilisée dans le langage LISP.
Une définition proche, utilisant l'encadrement est donnée par exemple par la fonction de Maple (modulo symétrique).
Définition utilisant la partie entière supérieure vignette|253x253px|Évolution du quotient et du reste (résultat du modulo) en fonction des éléments a et b et du signe du diviseur dans le cas où on utilise la définition utilisant l'arrondi. Soit la notation définissant le plus petit entier supérieur ou égal à .
Alors on peut poser une définition de l'opération mod par :
,
vérifiant cette fois pour : .
Le comportement est proche de celui de la partie entière inférieure.
Ce comportement est également trouvé en LISP.
Comparaison sous forme de tableau
+ comparaison des opérateurs Modulo partie entière troncature fonct. euclidienne Dividende Diviseur Quotient Reste Quotient Reste Quotient Reste 117 17 6 15 6 15 6 15 −117 17 −7 2 −6 −15 -7 2 −117 −17 6 −15 6 −15 7 2 117 −17 −7 −2 −6 15 -6 15 12,7 3,5 3 2,2
Comportement avec des opérandes non entiers
D'un point de vue strictement mathématique, il n'existe pas d'équivalent strict au modulo dans l'espace des réels. Il peut exister des équivalences partielles mais certaines opérations ne sont alors plus valables.
Toutefois, du strict point de vue des définitions utilisées dans les langages informatiques, les deux définitions informatiques précédentes du modulo restent valide et permettent donc à x et y d'être 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, par analogie avec la fonction mathématique, en C, C++, PHP et de nombreux langages, l'opérateur mod ou % n'opère que sur les types entiers. A contrario : dans certains cas l'opérateur modulo est étendu aux réels. Attention, parce que suivant le langage, les types numériques sont parfois convertis implicitement en entiers (par coercition) ce qui peut donner l'impression que l'opérateur est étendu aux réels quand ce n'est pas le cas.
Comportement des langages de programmation