Modulo (drift)

Inden for datalogi er modulo-operationen , eller mod operation , er en binær operation, som associerer med to naturlige heltal den resten af den euklidiske division af den første af den anden, den resterende del af opdelingen af en af n ( n er ≠ 0) betegnes en mod n ( a  % n på nogle computersprog). Således er 9 mod 4 = 1, fordi 9 = 2 × 4 + 1 og 0 ≤ 1 <4, 9 mod 3 = 0, ... Operationen kan udvides til relative heltal eller endda til reelle tal, men så kan programmeringssprogene afvige, især er et mod n ikke længere nødvendigvis positivt eller nul.

I matematik er brugen af ​​udtrykket modulo forskellig, selvom det er forbundet: det betegner ikke en operation, men griber ind for at karakterisere en kongruensrelation på heltal (og mere generelt for andre kongruenser); det tilknyttede mod- nøgleord bruges oftest kun til at betegne denne kongruens, selvom et værk som Concrete Mathematics også bruger det til at betegne den binære operation.

Tre definitioner af modulo-funktionen

I praksis kan x mod y beregnes ved hjælp af andre funktioner. Således bemærker:

, med den nederste hele del og den brøkdel,

vi har :

.

For eksempel 9 mod 4 = 9 - ⌊9 / 4⌋ × 4 = 9 - 2 × 4 = 1.

Forskelle vises afhængigt af de anvendte variabler, som indeholder heltalstypen i almindelige implementeringer. Men den største forskel ligger i fortolkningen af ​​kvotientens heltal afhængigt af tegnet på udbyttet eller deleren, når disse kan være negative:

Brug af heltal (matematisk definition)

E(z)(også bemærket ) er det største heltal mindre end eller lig med z .

Modoperatoren returnerer derefter en modulo altid mellem 0 (inkluderet) og divisoren y (ekskluderet), og som har det samme tegn som divisoren y  :

Udbytte Opdeler Kvotient Bliv
117 17 6 15
–117 17 –7 2
–117 –17 6 –15
117 –17 –7 –2
12.7 3.5 3 2.2

Denne definition opfylder lovene for modulo-aritmetik plus: x mod - y = - ((- - x ) mod y ). Det er velegnet til cykliske beregninger (for eksempel kalender). Den returnerede modulværdi er altid tegnet på divisoren (divisoren er positiv i de fleste cykliske beregninger, inklusive kalenderberegninger).

Brug af funktionen 'decimal del trunkering' (programmering tilnærmelse)

x % y = x - y * iPart(x / y) For eksempel :
Udbytte Opdeler Kvotient Bliv
117 17 6 15
–117 17 –6 –15
–117 –17 6 –15
117 –17 –6 15

Modulen har samme tegn som den venstre operand.

Denne definition verificerer loven: x mod - y = x mod y . Det overtræder loven ( x + n ) mod n = x mod n .

Sammenligning i tabelform

sammenligning af Modulo-operatører
def. matematisk trunkering funk. euklidisk
Udbytte Opdeler Kvotient Bliv Kvotient Bliv Bliv
117 17 6 15 6 15   15
–117 17 –7 2 –6 –15 ?
–117 –17 6 –15 6 –15 15
117 –17 –7 –2 –6 15 ?
12.7 3.5 3 2.2


Adfærd med ikke-heltal operander

Alle tre definitioner tillader, at x og y er negative heltal eller rationelle tal (eller reelle tal i matematik, selvom computerens numeriske beregningssystemer kun ved, hvordan man arbejder på en delmængde af rationelle tal på grund af begrænsningspræcision).

Men i C, C ++, PHP og mange sprog fungerer operatøren modeller %kun på heltalstyper. Afhængigt af sproget konverteres numeriske typer undertiden implicit til heltal (ved tvang ).

Opførsel af programmeringssprog

Følgende sprog bruger den matematiske definition (1.)

"Hvis et ur siger klokken 10, hvad sagde det 200 timer før?" -190 % 12 == 2Er nyttigt; -190 % 12 == -10er en fejl klar til at bide. "

Følgende sprog bruger definition (2.)

Værdi af en modulo 0 (værdi 'nul')

På de fleste sprog genererer modulo- operationen intet resultat, hvis divisoren er nul, og der genereres en opdeling med nul aritmetisk undtagelse.

Ækvivalens

Modulo-operationer kan reduceres eller udvides på samme måde som andre matematiske operationer.

Ansøgninger

Moduloperationen gør det muligt at udføre et cirkulært skift af indekser. Faktisk, hvis vi betragter rækkefølgen af ​​sammenhængende heltal fra 1 til n , u = (1, 2, 3, ..., n - 1, n ), så kan vi skifte med p rækker med:

u ' i = (( u i + p - 1) mod n ) + 1.

For eksempel at skifte sekvensen med to (1, 2, 3, 4, 5):

u ' i = (( u i + 1) mod 5) + 1;

vi har:

og derfor er u ' = (3, 4, 5, 1, 2).

Noter og referencer

  1. Ronald Graham, Donald Knuth og Oren Patashnik ( overs.  Alain Denise), Concrete Mathematics: Foundations for Computer Science , Paris, Vuibert ,2003, 2 nd  ed. , xiv + 688  s. ( ISBN  978-2-7117-4824-2 ), s. 88-89.
  2. Raymond T. Boute , "  Den euklidiske definition af funktionerne div og mod  ", ACM-transaktioner på programmeringssprog og -systemer , ACM Press (New York, NY, USA), bind.  1, nr .  2April 1992, s.  127–144 ( DOI  10.1145 / 128861.128862 , læs online ), s. 128-129.
  3. Graham, Knuth og Patashnik 2003 , s.  89 og randnote s. 88.
  4. Graham, Knuth og Patashnik 2003 , s.  88-89, for den binære operation, s.143 for kongruensen. Forfatterne bruger kun udtrykket modulo for kongruensrelationen, men kalder den binære operation "mod".
  5. "Hvorfor returnerer -22 // 10 -3?"
  6. (in) Michaël Van Canneyt, "  Referencevejledning til gratis Pascal version 2.6.0  " ,december 2011.
  7. Siden ISO C99. I ISO C90, i tilfælde af en negativ operand, blev tegnet på resultatet defineret af implementeringen.
<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">