Modulo (opération)

De testwiki
Aller à la navigation Aller à la recherche

Modèle:Homon Modèle:À sourcer

En informatique, l'opération modulo[1]Modèle:,[2], ou opération mod[3], est une opération binaire qui associe, à deux entiers naturels, le reste de la division euclidienne du premier par le second. Le reste de la division de a par n (n ≠ 0) est noté a mod n (ou a % n 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[4], mais alors les langages de programmation peuvent diverger, en particulier a mod n n'est plus forcément positif ou nul[5].

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[6].

Différentes définitions de la fonction modulo

L'opération mod associe à deux entiers naturels Modèle:Mvar et Modèle:Math le reste de la division euclidienne de Modèle:Mvar par Modèle:Mvar, qui est l'unique entier Modèle:Mvar vérifiant :

Par exemple :

Modèle:Math 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 le modulo 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, le modulo est classiquement utilisé dans le même esprit.

Exemple simple

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 dit « 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 :

uModèle:'i = ((ui + p − 1) mod n) + 1.

Par exemple, pour décaler de deux la suite (1, 2, 3, 4, 5) :

uModèle:'i = ((ui + 1) mod 5) + 1 ;

on a bien :

et donc uModèle:' = (3, 4, 5, 1, 2).

Divergence des définitions dans les cas autres que les entiers naturels

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 l'étend aux entiers négatifs ou aux réels. Le comportement du modulo 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 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).

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)

Modèle:Article connexe

É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 x définissant le plus grand entier inférieur ou égal à x.

Alors on peut poser une définition du modulo tel que :

amodn=aan×n

L'opérateur mod retourne alors un modulo toujours compris entre 0 (inclus) et le diviseur n (exclu) et qui a le même signe que le diviseur n. Ce qui le distingue du reste de la division euclidienne puisque le modulo 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 modulo, plus : x mod −y = −((−x) mod y). Elle convient pour les calculs cycliques. La valeur modulaire retourné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

É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.

[x] est la troncature entière de x.

amodn=a[an]×n

L'opérateur mod retourne alors :

  • un modulo positif inférieur à |n| pour a positif.
  • un modulo négatif supérieur à |n| pour a négatif.

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.

Définition utilisant l'arrondi

É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.

On peut également utiliser l'arrondi en définissant le quotient tel que :

q=arrondi(ab)

Où « arrondi » est la fonction arrondi.

Le reste, résultat du modulo, est alors défini par :

r=an×arrondi(ab)

Cette définition est notamment utilisée dans le langage LISP.

Définition utilisant la partie entière supérieure

É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 x définissant le plus petit entier supérieur ou égal à x.

Alors on peut poser une définition du quotient ainsi :

q=an

Et la définition du modulo tel que :

amodn=aan×n

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

Modèle:...

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

Tableau récapitulatif des différents opérateurs et de leur définition en fonction du langage informatique
Langage Opérateur Prend en charge les entiers ? Prise en charge nombres flottants ? Définition utilisée
ABAP Modèle:Code Modèle:Yes Modèle:Yes Euclidienne
ActionScript Modèle:Code Modèle:Yes Modèle:No Troncature
Ada (langage) Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)[7]
Modèle:Code Modèle:Yes Modèle:No Troncature[7]
ALGOL 68 Modèle:Code, Modèle:Code Modèle:Yes Modèle:No Euclidienne
AMPL Modèle:Code Modèle:Yes Modèle:No Troncature
APL |Modèle:Efn Modèle:Yes Modèle:Yes Partie entière (inférieure)
AppleScript Modèle:Code Modèle:Yes Modèle:No Troncature
AutoLISP de AutoCAD Modèle:Code Modèle:Yes Modèle:No Troncature
AWK Modèle:Code Modèle:Yes Modèle:No Troncature
bash Modèle:Code Modèle:Yes Modèle:No Troncature
BASIC Modèle:Code Modèle:Yes Modèle:No Dépend de l'implémentation
bc (voir bc (Unix)) Modèle:Code Modèle:Yes Modèle:No Troncature
C[8]Modèle:BreakC++ Modèle:Code, Modèle:Code Modèle:Yes Modèle:No TroncatureModèle:Efn
Modèle:Code (C)Modèle:BreakModèle:Code (C++) Modèle:No Modèle:Yes Troncature[9]
Modèle:Code (C)Modèle:BreakModèle:Code (C++) Modèle:No Modèle:Yes Arrondi
C# Modèle:Code Modèle:Yes Modèle:Yes Troncature
Modèle:Code Modèle:No Modèle:Yes Arrondi[10]
Clarion (langage) Modèle:Code Modèle:Yes Modèle:No Troncature
Modèle:Lien Modèle:Code Modèle:Yes Modèle:No Troncature
Clojure Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)[11]
Modèle:Code Modèle:Yes Modèle:No Troncature[12]
COBOL Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)[13]
Modèle:Code Modèle:Yes Modèle:Yes Troncature[13]
CoffeeScript Modèle:Code Modèle:Yes Modèle:No Troncature
Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)[14]
ColdFusion Modèle:Code, Modèle:Code Modèle:Yes Modèle:No Troncature
Common Intermediate Language Modèle:Code (signed) Modèle:Yes Modèle:Yes Troncature[15]
Modèle:Code (unsigned) Modèle:Yes Modèle:No Modèle:N/A
Common Lisp Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:Yes Troncature
Crystal (langage de programmation) Modèle:Code, Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:Yes Troncature
D (langage) Modèle:Code Modèle:Yes Modèle:Yes Troncature[16]
Dart (langage) Modèle:Code Modèle:Yes Modèle:Yes Euclidienne[17]
Modèle:Code Modèle:Yes Modèle:Yes Troncature[18]
Eiffel (langage) Modèle:Code Modèle:Yes Modèle:No Troncature
Elixir (langage) Modèle:Code Modèle:Yes Modèle:No Troncature[19]
Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)[20]
Elm (langage) Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)[21]
Modèle:Code Modèle:Yes Modèle:No Troncature[22]
Erlang (langage) Modèle:Code Modèle:Yes Modèle:No Troncature
Modèle:Code Modèle:No Modèle:Yes Troncature (identique au C)[23]
Euphoria (langage) Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
F# Modèle:Code Modèle:Yes Modèle:Yes Troncature
Modèle:Code Modèle:No Modèle:Yes Arrondi[10]
Factor Modèle:Code Modèle:Yes Modèle:No Troncature
FileMaker Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Forth (langage) Modèle:Code Modèle:Yes Modèle:No Dépend de l'implémentation
Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Fortran Modèle:Code Modèle:Yes Modèle:Yes Troncature
Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Modèle:Lien Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
(Modèle:Lien) (standard ANSI) Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)[24]
Modèle:Code Modèle:Yes Modèle:Yes Troncature[25]
GLSL Modèle:Code Modèle:Yes Modèle:No Non défini[26]
Modèle:Code Modèle:No Modèle:Yes Partie entière (inférieure)[27]
GameMaker Studio (GML) Modèle:Code, Modèle:Code Modèle:Yes Modèle:No Troncature
GDScript (Godot) Modèle:Code Modèle:Yes Modèle:No Troncature
Modèle:Code Modèle:No Modèle:Yes Troncature
Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:No Modèle:Yes Partie entière (inférieure)
Go (langage) Modèle:Code Modèle:Yes Modèle:No Troncature[28]
Modèle:Code Modèle:No Modèle:Yes Troncature[29]
Modèle:Code Modèle:Yes Modèle:No Euclidienne[30]
Groovy (langage) Modèle:Code Modèle:Yes Modèle:No Troncature
Haskell Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)[31]
Modèle:Code Modèle:Yes Modèle:No Troncature[31]
Modèle:Code (GHC) Modèle:No Modèle:Yes Partie entière (inférieure)
Haxe Modèle:Code Modèle:Yes Modèle:No Troncature
HLSL Modèle:Code Modèle:Yes Modèle:Yes Non défini[32]
J (langage) |Modèle:Efn Modèle:Yes Modèle:No Partie entière (inférieure)
Java (langage) Modèle:Code Modèle:Yes Modèle:Yes Troncature
Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
JavaScriptModèle:BreakTypeScript Modèle:Code Modèle:Yes Modèle:Yes Troncature
Julia (langage) Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)[33]
Modèle:Code, Modèle:Code Modèle:Yes Modèle:Yes Troncature[34]
Kotlin (langage) Modèle:Code, Modèle:Code Modèle:Yes Modèle:Yes Troncature[35]
Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)[36]
ksh Modèle:Code Modèle:Yes Modèle:No Troncature (identique à POSIX sh)
Modèle:Code Modèle:No Modèle:Yes Troncature
LabVIEW Modèle:Code Modèle:Yes Modèle:Yes Troncature
LibreOffice Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Logo (langage) Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Lua (langage) 5 Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Lua (langage) 4 Modèle:Code Modèle:Yes Modèle:Yes Troncature
(Modèle:Lien) Modèle:Code Modèle:Yes Modèle:No Troncature
Mathcad Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Maple Modèle:Code (by default), Modèle:Code Modèle:Yes Modèle:No Euclidienne
Modèle:Code Modèle:Yes Modèle:No Arrondie
Modèle:Code Modèle:Yes Modèle:Yes Arrondie
Mathematica Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
MATLAB Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Maxima (logiciel) Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Maya Embedded Language Modèle:Code Modèle:Yes Modèle:No Troncature
Microsoft Excel Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Minitab Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modula-2 Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
MUMPS Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Netwide Assembler (NASM, NASMX) Modèle:Code, Modèle:Code (unsigned) Modèle:Yes Modèle:No Modèle:N/A
Modèle:Code (signed) Modèle:Yes Modèle:No Dépends de l'implémentation[37]
Nim (langage) Modèle:Code Modèle:Yes Modèle:No Troncature
Oberon (langage) Modèle:Code Modèle:Yes Modèle:No Proche de Partie entière (inférieure)Modèle:Efn
Objective-C Modèle:Code Modèle:Yes Modèle:No Troncature (identique à C99)
Object Pascal, Delphi (langage) Modèle:Code Modèle:Yes Modèle:No Troncature
OCaml Modèle:Code Modèle:Yes Modèle:No Troncature[38]
Modèle:Code Modèle:No Modèle:Yes Troncature[39]
Occam (langage) Modèle:Code Modèle:Yes Modèle:No Troncature
Pascal (langage) (ISO-7185 and -10206) Modèle:Code Modèle:Yes Modèle:No Proche de l'EuclidienneModèle:Efn
Perl (langage) Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)Modèle:Efn
Modèle:Code Modèle:No Modèle:Yes Troncature
Phix Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
PHP Modèle:Code Modèle:Yes Modèle:No Troncature[40]
Modèle:Code Modèle:No Modèle:Yes Troncature[41]
PIC BASIC Pro Modèle:Code Modèle:Yes Modèle:No Troncature
PL/I Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure) (ANSI PL/I)
PowerShell Modèle:Code Modèle:Yes Modèle:No Troncature
Programming Code (PRC) Modèle:Code Modèle:Yes Modèle:No Undefined
Progress (Progress Software) Modèle:Code Modèle:Yes Modèle:No Troncature
Prolog (ISO 1995) Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
PureBasic Modèle:Code, Modèle:Code Modèle:Yes Modèle:No Troncature
PureScript Modèle:Code Modèle:Yes Modèle:No Euclidean[42]
Pure Data Modèle:Code Modèle:Yes Modèle:No Troncature (same as C)
Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Python Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Modèle:Code Modèle:No Modèle:Yes Troncature
Q# Modèle:Code Modèle:Yes Modèle:No Troncature[43]
R (langage) Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)[44]
Racket Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Raku Modèle:Code Modèle:No Modèle:Yes Partie entière (inférieure)
RealBasic Modèle:Code Modèle:Yes Modèle:No Troncature
Reason Modèle:Code Modèle:Yes Modèle:No Troncature
Rexx Modèle:Code Modèle:Yes Modèle:Yes Troncature
RPG Modèle:Code Modèle:Yes Modèle:No Troncature
Ruby Modèle:Code, Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:Yes Troncature
Rust Modèle:Code Modèle:Yes Modèle:Yes Troncature
Modèle:Code Modèle:Yes Modèle:Yes Euclidienne[45]
SAS Modèle:Code Modèle:Yes Modèle:No Troncature
Scala Modèle:Code Modèle:Yes Modèle:Yes Troncature
Scheme Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Scheme R6RS Modèle:Code Modèle:Yes Modèle:No Euclidienne[46]
Modèle:Code Modèle:Yes Modèle:No Arrondie[46]
Modèle:Code Modèle:No Modèle:Yes Euclidienne
Modèle:Code Modèle:No Modèle:Yes Arrondie
Scratch Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Modèle:Lien Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:Yes Troncature
Modèle:Lien Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
[[POSIX shell|Modèle:Code (POSIX)]] (includes bash, mksh, &c.) Modèle:Code Modèle:Yes Modèle:No Troncature (same as C)[47]
Smalltalk Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Snap! Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Lien Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Solidity Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
SQL (SQL:1999) Modèle:Code Modèle:Yes Modèle:No Troncature
SQL (SQL:2011) Modèle:Code Modèle:Yes Modèle:No Troncature
Standard ML Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
Modèle:Code Modèle:No Modèle:Yes Troncature
Stata Modèle:Code Modèle:Yes Modèle:No Euclidienne
Swift Modèle:Code Modèle:Yes Modèle:No Troncature[48]
Modèle:Code Modèle:No Modèle:Yes Arrondie[49]
Modèle:Code Modèle:No Modèle:Yes Troncature[50]
Tcl Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:No Modèle:Yes Troncature (as C)
tcsh Modèle:Code Modèle:Yes Modèle:No Troncature
Torque Modèle:Code Modèle:Yes Modèle:No Troncature
Modèle:Lien Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Verilog (2001) Modèle:Code Modèle:Yes Modèle:No Troncature
VHDL Modèle:Code Modèle:Yes Modèle:No Partie entière (inférieure)
Modèle:Code Modèle:Yes Modèle:No Troncature
VimL Modèle:Code Modèle:Yes Modèle:No Troncature
Visual Basic Modèle:Code Modèle:Yes Modèle:No Troncature
WebAssembly Modèle:Code, Modèle:Code (unsigned) Modèle:Yes Modèle:No Modèle:N/A[51]
Modèle:Code, Modèle:Code (signed) Modèle:Yes Modèle:No Troncature[51]
Modèle:Lien Modèle:Code Modèle:Yes Modèle:No Troncature
Modèle:Lien Modèle:Code Modèle:Yes Modèle:Yes Troncature
Modèle:Code Modèle:Yes Modèle:Yes Partie entière (inférieure)
Zig Modèle:Code,

Modèle:Code, Modèle:Code

Modèle:Yes Modèle:Yes Troncature[52]
Modèle:Lien Modèle:Code, Modèle:Code Modèle:Yes Modèle:No Euclidienne

Quelques détails concernant certains langages suivants la définition utilisant la partie entière inférieure

  • Perl : $a % $n est défini sur les entiers ; les opérandes réels sont tronqués vers 0 par coercition ;
  • Visual Basic : a Mod n est défini sur les réels et sur les entiers, et renvoie un entier si les deux opérandes sont entiers ;
  • Pascal (ISO 7185) : 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 ;
  • Python : La FAQ explique ce choix par l'exemple suivant :

Modèle:Citation bloc

Quelques détails concernant certains langages suivants la définition utilisant la troncature

  • Free Pascal et Delphi n'autorisent que des opérandes entiers, et la définition du langage[53] précise : « Le signe du résultat est le signe de l'opérande gauche » ;
  • C[8], C++ : a % n demande des opérandes entiers ;
  • PHP : $a % $n est défini sur les entiers et retournera un résultat ayant le même signe que $a ;
  • Scilab : modulo(a, n) accepte des réels.

Si l'on souhaite utiliser le modulo dans sa définition partie entière inférieure pour l'un de ces langages on peut utiliser l'expression :

   (a % n + n) % n

Valeur d'un modulo 0 (valeur 'zéro')

Dans la plupart des langages, l'opération modulo ne donne aucun résultat si le diviseur est nul, mais lance une exception arithmétique de division par zéro.

Équivalence

Les opérations sur les modulos peuvent être réduites ou étendues de la même manière que les autres opérations mathématiques.

  • Identité:
  • Inverse:
    • ((amodn)+(amodn))modn=0
    • b1modn est l'inverse modulaire, qui est défini si et seulement si b et n sont premiers entre eux, ce qui est le cas quand la partie gauche est définie: ((b1modn)(bmodn))modn=1.
  • Distributivité:
    • (a+b)modn=((amodn)+(bmodn))modn
    • abmodn=((amodn)(bmodn))modn
    • D’où : a2modn=(amodn)2modn
  • Division (définition): abmodn=((amodn)(b1modn))modn, quand l'opérande de gauche est défini. Non définie sinon.
  • Multiplication inverse: ((abmodn)(b1modn))modn=amodn

Notes et références

Notes

Références

Modèle:Références

Modèle:Portail

  1. Modèle:Lien web
  2. Modèle:Ouvrage
  3. Modèle:Ouvrage, Modèle:P..
  4. Modèle:Article, p. 128-129.
  5. Modèle:Harvsp, et note marginale p. 88.
  6. Modèle:Harvsp, pour l'opération binaire, Modèle:P. pour la congruence. Les auteurs n'utilisent le terme modulo que pour la relation de congruence, mais nomment « mod » l'opération binaire.
  7. 7,0 et 7,1 Modèle:Article
  8. 8,0 et 8,1 Depuis ISO C99. En ISO C90, en cas d'opérande négatif, le signe du résultat était défini par l'implémentation.
  9. Modèle:Article
  10. 10,0 et 10,1 Modèle:Lien web
  11. Modèle:Lien web
  12. Modèle:Lien web
  13. 13,0 et 13,1 Modèle:Ouvrage
  14. CoffeeScript operators
  15. Modèle:Ouvrage
  16. Modèle:Lien web
  17. Modèle:Lien web
  18. Modèle:Lien web
  19. Modèle:Lien web
  20. Modèle:Lien web
  21. Modèle:Lien web
  22. Modèle:Lien web
  23. Modèle:Lien web
  24. Modèle:Ouvrage
  25. Modèle:Ouvrage
  26. Modèle:Lien web
  27. Modèle:Lien web
  28. Modèle:Lien web
  29. Modèle:Lien web
  30. Modèle:Lien web
  31. 31,0 et 31,1 Modèle:Lien web
  32. Modèle:Lien web
  33. Modèle:Lien web
  34. Modèle:Lien web
  35. Modèle:Lien web
  36. Modèle:Lien web
  37. Modèle:Lien web
  38. Modèle:Lien web
  39. Modèle:Lien web
  40. Modèle:Lien web
  41. Modèle:Lien web
  42. Modèle:Lien web
  43. Modèle:Lien web
  44. Modèle:Lien web
  45. Modèle:Lien web
  46. 46,0 et 46,1 r6rs.org
  47. Modèle:Lien web
  48. Modèle:Lien web
  49. Modèle:Lien web
  50. Modèle:Lien web
  51. 51,0 et 51,1 Modèle:Lien web
  52. Modèle:Lien web
  53. Modèle:Lien web.