Modulo (működés)
Az informatikában a modulo működés , vagy a MOD művelet , egy művelet, amely társult két természetes egész szám a fennmaradó az euklideszi részlege az első a második, a fennmaradó részlege egy a N ( n ≠ 0) jelöli egy mod n ( a % n egyes számítógépes nyelveken). Így 9 mod 4 = 1, mert 9 = 2 × 4 + 1 és 0 ≤ 1 <4, 9 mod 3 = 0,… A művelet kiterjeszthető relatív egész számokra, vagy akár valós számokra is, de akkor a programozási nyelvek eltérhetnek egymástól, különösen, ha a mod n már nem feltétlenül pozitív vagy nulla.
A matematikában a modulo kifejezés használata akkor is különbözik, ha összekapcsolódik: nem jelöl műveletet, hanem beavatkozik az egészekre (és általánosabban más kongruenciákra) vonatkozó kongruencia- reláció jellemzésére ; a társított mod kulcsszót leggyakrabban csak ennek az egybevágásnak a jelölésére használják, bár egy olyan munka, mint a Beton Matematika , a bináris művelet jelölésére is használja.
A modulo függvény három meghatározása
A gyakorlatban az x mod y kiszámítható más függvények segítségével. Így megjegyezve:
x=⌊x⌋+{x}{\ displaystyle x = \ lfloor x \ rfloor + \ {x \}}, Azzal az alsó
egész rész , és a tört része,
⌊x⌋{\ displaystyle \ lfloor x \ rfloor}{x}{\ displaystyle \ {x \}}nekünk van :
Nak nekmodnem=Nak nek-(⌊Nak nek/nem⌋×nem){\ displaystyle a {\ bmod {n}} = a - (\ lfloor a / n \ rfloor \ -szer n)}.
Például 9 mod 4 = 9 - ⌊9 / 4⌋ × 4 = 9 - 2 × 4 = 1.
A különbségek a használt változók típusától függően jelennek meg, amelyek az általános típust tartalmazzák a közös megvalósításokban. De a fő különbség a hányados egész részének értelmezésében rejlik, az osztalék vagy az osztó előjelétől függően, ha ezek negatívak lehetnek:
Az egész rész használata (matematikai meghatározás)
E(z)(szintén megjegyezve ) a legnagyobb egész szám, amely kisebb vagy egyenlő z-vel .
⌊z⌋{\ displaystyle \ lfloor z \ rfloor}Ezután a mod operátor visszaad egy modulót, amely mindig 0 (benne van) és osztó y (kizárt) között van, és amelynek ugyanaz a jele, mint az y osztónak :
x mod y=x - y×E(xy){\ displaystyle x \ {\ bmod {\}} y = x \ - \ y \ szor E {\ kezdete {pmatrix} {\ frac {x} {y}} \ end {pmatrix}}}Osztalék |
Osztó |
Hányados |
Marad
|
---|
117. |
17. |
6. |
15
|
–117 |
17. |
–7 |
2
|
–117 |
–17 |
6. |
–15
|
117. |
–17 |
–7 |
–2
|
12.7 |
3.5 |
3 |
2.2
|
Ez a meghatározás kielégíti a modulo aritmetika törvényeit , plusz: x mod - y = - ((- - x ) mod y ). Alkalmas ciklikus számításokra (például naptár). A visszatérő moduláris érték mindig az osztó előjele (az osztó pozitív a legtöbb ciklikus számításban, ideértve a naptári számításokat is).
A 'decimális csonkolás' funkció használata (közelítés programozása)
x % y = x - y * iPart(x / y)
Például :
Osztalék |
Osztó |
Hányados |
Marad
|
---|
117. |
17. |
6. |
15
|
–117 |
17. |
–6 |
–15
|
–117 |
–17 |
6. |
–15
|
117. |
–17 |
–6 |
15
|
A modulo ugyanazzal a jellel rendelkezik, mint a bal operandus.
Ez a meghatározás igazolja a törvényt: x mod - y = x mod y . Törvényt sért ( x + n ) mod n = x mod n .
Összehasonlítás táblázatos formában
a Modulo operátorok összehasonlítása
|
def. matematikai |
csonka |
funct. euklideszi
|
---|
Osztalék |
Osztó |
Hányados |
Marad |
Hányados |
Marad |
|
Marad
|
---|
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
|
Viselkedés nem egész operandusokkal
Mindhárom definíciók lehetővé teszik x és y , hogy a negatív egész számok , vagy racionális számok (vagy valós számok a matematika, bár a számítógépes rendszerek számolás csak tudja, hogyan kell a munkát egy részhalmaza racionális számok korlátai miatt precizitás).
Ugyanakkor C, C ++, PHP és sok nyelven az operátor modvagy %csak egész típusú típusokon működik. A nyelvtől függően a numerikus típusokat néha implicit módon egész számokká alakítják ( kényszerítéssel ).
A programozási nyelvek viselkedése
A következő nyelvek a matematikai definíciót használják (1.)
-
Perl : $a % $negész számokra van meghatározva; a valós operandusokat kényszerítéssel 0 felé csonkoljuk ;
-
Visual Basic : a Mod nvalós és egész számokon definiált, és egész számot ad vissza, ha mindkét operandus egész szám;
-
Pascal (ISO 7185): a mod ncsak egész operandusokat fogad el, és nszigorúan pozitívnak kell lenniük;
-
Excel : MOD(a;n)valós számokon dolgozik;
-
Python nyelv : A GYIK ezt a választ a következő példával magyarázza:
- Ha egy óra szerint 10 óra van, mit mondott 200 órával azelőtt? -190 % 12 == 2Hasznos; -190 % 12 == -10egy harapásra kész hiba. "
A következő nyelvek a (2.) definíciót használják
-
A szabad Pascal és Delphi csak egész operandusokat enged meg, és a nyelv meghatározása meghatározza: "Az eredmény jele a bal operandus jele";
-
C , C ++ : a % negész operandusok kérése;
-
Java : a % nvalós operandusokat engedélyez;
-
Javascript : a % nvalós operandusokat engedélyez;
-
PHP : $a % $negész számokra van definiálva, és eredményt ad vissza ugyanazzal a jellel, mint $a ;
-
Scilab : modulo(a, n)valós számokat fogad el.
0 modulo értéke („nulla” érték)
A legtöbb nyelvben a modulo művelet nem eredményez eredményt, ha az osztó nulla, és nulla számtani kivétellel való osztás jön létre.
Egyenértékűség
A Modulo műveletek ugyanúgy csökkenthetők vagy bővíthetők, mint más matematikai műveletek.
- Identitás:
- (Nak nekmodnem)modnem=Nak nekmodnem{\ displaystyle (a \, {\ bmod {\,}} n) \, {\ bmod {\,}} n = a \, {\ bmod {\,}} n}
-
nemxmodnem=0{\ displaystyle n ^ {x} \, {\ bmod {\,}} n = 0}minden szigorúan pozitív egész számra .x{\ displaystyle x}
- Ha egy prímszám , amely nem osztója a , majd szerint a kis Fermat-tétel .nem{\ displaystyle n}b{\ displaystyle b}Nak nekbnem-1modnem=Nak nekmodnem{\ displaystyle ab ^ {n-1} \, {\ bmod {\,}} n = a \, {\ bmod {\,}} n}
- Fordított:
- ((-Nak nekmodnem)+(Nak nekmodnem))modnem=0{\ displaystyle ((-a \, {\ bmod {\,}} n) + (a \, {\ bmod {\,}} n)) \, {\ bmod {\,}} n = 0}
-
b-1modnem{\ displaystyle b ^ {- 1} \, {\ bmod {\,}} n}a moduláris inverz , amely úgy van beállítva, ha, és csak akkor, ha , és olyan relatív prím , ami az esetben, ha a bal oldali rész meghatározása: .b{\ displaystyle b}nem{\ displaystyle n}((b-1modnem)(bmodnem))modnem=1{\ displaystyle ((b ^ {- 1} \, {\ bmod {\,}} n) \, (b \, {\ bmod {\,}} n)) \, {\ bmod {\,}} n = 1}
- Forgalmazhatóság:
- (Nak nek+b)modnem=((Nak nekmodnem)+(bmodnem))modnem{\ displaystyle (a + b) \, {\ bmod {\,}} n = ((a \, {\ bmod {\,}} n) + (b \, {\ bmod {\,}} n) ) \, {\ bmod {\,}} n}
- Nak nekbmodnem=((Nak nekmodnem)(bmodnem))modnem{\ displaystyle ab \, {\ bmod {\,}} n = ((a \, {\ bmod {\,}} n) \, (b \, {\ bmod {\,}} n)) \, {\ bmod {\,}} n}
- Honnan : Nak nek2modnem=(Nak nekmodnem)2modnem{\ displaystyle a ^ {2} \, {\ bmod {\,}} n = (a \, {\ bmod {\,}} n) ^ {2} \, {\ bmod {\,}} n}
- Osztás (definíció) :, amikor a bal operandus meg van határozva. Nincs másként meghatározva.Nak nekbmodnem=((Nak nekmodnem)(b-1modnem))modnem{\ displaystyle {\ frac {a} {b}} \, {\ bmod {\,}} n = ((a \, {\ bmod {\,}} n) (b ^ {- 1} \, { \ bmod {\,}} n)) \, {\ bmod {\,}} n}
- Fordított szorzás: ((Nak nekbmodnem)(b-1modnem))modnem=Nak nekmodnem{\ displaystyle ((ab \, {\ bmod {\,}} n) \, (b ^ {- 1} \, {\ bmod {\,}} n)) \, {\ bmod {\,}} n = a \, {\ bmod {\,}} n}
Alkalmazások
A modulo művelet lehetővé teszi az indexek körkörös eltolását. Valóban, ha figyelembe vesszük az egymással szomszédos egész számok sorrendjét 1-től n-ig , u = (1, 2, 3,…, n - 1, n ), akkor p rangok szerint tudunk váltani :
u ' i = (( u i + p - 1) mod n ) + 1.
Például a sorrendet kettővel eltolni (1, 2, 3, 4, 5):
u ' i = (( u i + 1) mod 5) + 1;
nekünk van:
-
u ' 1 = ((1 + 1) mod 5) + 1 = 3
-
u ' 2 = ((2 + 1) mod 5) + 1 = 4
- ...
-
u ' 4 = ((4 + 1) mod 5) + 1 = 1
és ezért u ' = (3, 4, 5, 1, 2).
Megjegyzések és hivatkozások
-
Ronald Graham, Donald Knuth és Oren Patashnik ( ford. Alain Denise), Konkrét matematika: A számítástechnika alapjai , Párizs, Vuibert ,2003, 2 nd ed. , xiv + 688 o. ( ISBN 978-2-7117-4824-2 )o. 88–89.
-
Raymond T. Boute , „ A div és mod függvények euklideszi meghatározása ”, ACM Transactions on Programming Languages and Systems , ACM Press (New York, NY, USA), vol. 1, n o 21992. április, P. 127–144 ( DOI 10.1145 / 128861.128862 , online olvasás )o. 128-129.
-
Graham, Knuth és Patashnik 2003 , p. 89. o., És a határjegyzet p. 88.
-
Graham, Knuth és Patashnik 2003 , p. 88–89, a bináris művelethez, 143. o. Az egybevágáshoz. A szerzők csak a modulo kifejezést használják a kongruencia relációra, de a bináris műveletet „mod” -nak hívják.
-
"Miért tér vissza a -22 // 10 értéke -3?"
-
(in) Michael Van Canneyt, " Útmutató a Free Pascal változat 2.6.0 " ,2011. december.
-
Mivel az ISO C99. Az ISO C90 szabványban negatív operandus esetén az eredmény előjelét a megvalósítás határozta meg.
<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">