Modulo (käyttö)

In Computer Science , The modulo-operaation , tai mod toiminta , on binaarinen laskutoimitus, joka assosioituu kaksi luonnollista kokonaislukua loput on jakoyhtälö ensimmäisen toisen, loput jako mukaan n ( n ≠ 0) on merkitty mod n ( a  % n joillakin tietokonekielillä). Siten 9 mod 4 = 1, koska 9 = 2 × 4 + 1 ja 0 ≤ 1 <4, 9 mod 3 = 0, ... Operaatio voidaan laajentaa suhteellisiin kokonaislukuihin tai jopa reaalilukuihin, Mutta sitten ohjelmointikieliä voi poiketa, erityisesti mod n ei ole enää välttämättä positiivinen tai nolla.

Vuonna matematiikan käyttö termi modulo on erilainen, vaikka se liittyy: se ei nimetä operaation mutta ensimmäisten toimenpiteiden luonnehtimaan kongruenssi suhde on kokonaislukuja (ja yleisemmin muiden congruences); siihen liittyvää mod- avainsanaa käytetään useimmiten vain tämän yhtäläisyyden merkitsemiseen, vaikka konkreettisen matematiikan kaltainen työ käyttää sitä myös binaaritoiminnon merkitsemiseen.

Kolme modulo-funktion määritelmää

Käytännössä x mod y voidaan laskea käyttämällä muita toimintoja. Täten toteaa:

, Jossa alempi koko osa ja murto-osa,

meillä on :

.

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

Erot näkyvät käytettyjen muuttujien tyyppien mukaan, jotka sisältävät kokonaislukutyypin tavallisissa toteutuksissa. Mutta suurin ero on osamäärän kokonaisluvun tulkinnassa riippuen osingon merkistä tai jakajan merkistä, kun nämä voivat olla negatiivisia:

Lukuosan käyttö (matemaattinen määritelmä)

E(z)(huomattu myös ) on suurin kokonaisluku, joka on pienempi tai yhtä suuri kuin z .

Mod-operaattori palauttaa sitten moduulin aina 0: n (sisältyy) ja jakajan y (poissuljettu) väliin ja jolla on sama merkki kuin jakajalla y  :

Osinko Jakaja Osamäärä Pysyä
117 17 6 15
–117 17 –7 2
–117 –17 6 –15
117 –17 –7 –2
12.7 3.5 3 2.2

Tämän määritelmän täyttää lakien moduloaritmetiikkaa lisäksi: X mod - y = - ((- x ) mod y ). Se soveltuu syklisiin laskelmiin (esimerkiksi kalenteri). Palautettu modulaarinen arvo on aina jakajan merkki (jakaja on positiivinen useimmissa syklisissä laskelmissa, mukaan lukien kalenterilaskelmat).

'Desimaaliosan katkaisu' -toiminnon käyttäminen (likiarvon ohjelmointi)

x % y = x - y * iPart(x / y) Esimerkiksi :
Osinko Jakaja Osamäärä Pysyä
117 17 6 15
–117 17 –6 –15
–117 –17 6 –15
117 –17 –6 15

Modulolla on sama merkki kuin vasemmalla operandilla.

Tämä määritelmä varmistaa lain: x mod - y = x mod y . Se rikkoo lakia ( x + n ) mod n = x mod n .

Vertailu taulukkomuodossa

Modulo-operaattoreiden vertailu
def. matemaattinen katkaisu funktio. euklidinen
Osinko Jakaja Osamäärä Pysyä Osamäärä Pysyä Pysyä
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


Käyttäytyminen ei-kokonaislukuisten operandien kanssa

Kaikki kolme määritelmää sallivat x: n ja y : n olla negatiivisia kokonaislukuja tai rationaalilukuja (tai reaalilukuja matematiikassa, vaikka atk-numeeriset laskentajärjestelmät tietävätkin, kuinka työskennellä rationaalilukujen osajoukolla rajoitusten tarkkuuden vuoksi).

Operaattori modtai operaattori C tai C ++, PHP ja monilla kielillä %toimii kuitenkin vain kokonaislukutyypeillä. Kielestä riippuen numeeriset tyypit muunnetaan toisinaan implisiittisesti kokonaislukuiksi ( pakottamalla ).

Ohjelmointikielien käyttäytyminen

Seuraavat kielet käyttävät matemaattista määritelmää (1.)

"Jos kello sanoo kello 10, mitä se sanoi 200 tuntia ennen?" -190 % 12 == 2On hyödyllinen; -190 % 12 == -10on vika valmis puremaan. "

Seuraavat kielet käyttävät määritelmää (2.)

Moduulin arvo 0 (arvo 'nolla')

Useimmilla kielillä modulo- operaatio ei tuota tulosta, jos jakaja on nolla, ja jako nollalla aritmeettinen poikkeus syntyy.

Vastaavuus

Modulotoimintoja voidaan pienentää tai laajentaa samalla tavalla kuin muita matemaattisia operaatioita.

Sovellukset

Modulotoiminto mahdollistaa indeksien pyöreän siirron. Todellakin, jos tarkastellaan vierekkäisten kokonaislukujen järjestystä 1: stä n: ään , u = (1, 2, 3,…, n - 1, n ), voimme siirtyä p- riveillä:

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

Esimerkiksi sekvenssin siirtäminen kahdella (1, 2, 3, 4, 5):

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

meillä on:

ja siksi u ' = (3, 4, 5, 1, 2).

Huomautuksia ja viitteitä

  1. Ronald Graham, Donald Knuth ja Oren Patashnik ( käännös  Alain Denise) , Betonimatematiikka : Tietotekniikan perusteet , Pariisi, Vuibert ,2003, 2 nd  ed. , xiv + 688  Sivumäärä ( ISBN  978-2-7117-4824-2 ), s. 88-89.
  2. Raymond T. Boute , "  Funktioiden div ja mod euklidinen määritelmä  ", ACM Transactions on Programming Languages ​​and Systems , ACM Press (New York, NY, USA), voi.  1, n o  2Huhtikuu 1992, s.  127–144 ( DOI  10.1145 / 128861.128862 , lue verkossa ), s. 128 - 129.
  3. Graham, Knuth ja Patashnik 2003 , s.  89 ja reunanumero s. 88.
  4. Graham, Knuth ja Patashnik 2003 , s.  88–89, binääritoimintoa varten, s. 143 kongruenssia varten. Kirjoittajat käyttävät vain termiä modulo kongruenssisuhteeseen, mutta kutsuvat binääritoimintoa "mod".
  5. "Miksi -22 // 10 palauttaa -3?"
  6. (in) Michaël Van Canneyt, "  Viiteoppaan Free Pascal versio 2.6.0  " ,joulukuu 2011.
  7. Koska ISO C99. ISO C90 -standardissa negatiivisen operandin tapauksessa tuloksen merkki määritettiin toteutuksen avulla.
<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">