Մոդուլո գործողություն
Մոդուլո գործողություն, թվաբանության մեջ վերադարձնում է բաժանման արդյունքում ստացված մնացորդը՝ նշանով, կամ առանց նշանի։
Տրված են երկու դրական թվեր՝ a և n: a մոդուլո n-ը (համակարգչային գիտության մեջ՝ a mod n) Էվկլիդյան բաժանման մնացորդն է՝ a-ն n-ի բաժանելիս, որտեղ a-ն բաժանելին է, իսկ n-ը՝ բաժանարարը[1]։
Օրինակ, 5 mod 2 արտահայտության արժեքը 1 է, քանի որ 5-ը բաժանված է 2-ի, ունի քանորդ՝ 2, իսկ մնացորդը՝ 1, մինչդեռ «9 mod 3» արտահայտության արժեքը 0 է, քանի որ 9-ը բաժանված է 3-ի, ունի քանորդ՝ 3 և մնացորդ՝ 0 (3-ը 3-ի բազմապատկելուց հետո,երբ պատասխանը հանում ենք 9-ից, ստացվում է 0)։
Սովորաբար այս գործողությունը կատարվում է այնպիսի a-ով և n-ով, որ երկուսն էլ լինեն ամբողջ թվեր, սակայն շատ հաշվողական համակարգեր այժմ թույլ են տալիս a-ի և n-ի այլ տեսակներ։ n-ի ամբողջ թվային մոդուլային գործողության արժեքների միջակայքը 0-ից n-1-ն է ներառյալ (mod 1-ը միշտ 0 է, mod 0-ն որոշված չէ, ինչը կարող է հանգեցնել զրոյով բաժանման սխալի որոշ ծրագրավորման լեզուներում)։
Երբ a-ից կամ n-ից մեկը բացասական է, սահմանումը խախտվում է, և ծրագրավորման լեզուները տարբերվում են նրանով, թե ինչպես են սահմանում համակարգչի տված պատասխանը այդ իրավիճակում։
Սահմանման տարբերակներ
խմբագրելՄաթեմատիկայում մոդուլո գործողության արդյունքը համարժեքության դաս է (ինչպես օրինակ mod 5 գործողության համար դաս 0 = {0, 5, 10, 15, …}, դաս1 = {1, 6, 11, 16, …} և այլն), և դասի ցանկացած անդամ կարող է ընտրվել որպես դասի ներկայացնող անդամ։ Այնուամենայնիվ, սովորաբար, որպես ներկայացնող ընտրվում է նվազագույն ոչ բացասական ամբողջ թիվը, որը պատկանում է այդ դասին։ Այնուամենայնիվ, հնարավոր են այլ սահմանումներ։
Համակարգիչներն ու հաշվիչներն ունեն թվեր պահելու և ներկայացնելու տարբեր եղանակներ, հետևաբար, մոդուլային գործողության նրանց սահմանումը կախված է ծրագրավորման լեզվից կամ համակարգչի սարքախմբից։
Գրեթե բոլոր հաշվողական համակարգերում q գործակիցը և a-ն բաժանած n-ի մնացորդ r-ը բավարարում են հետևյալ պայմաններին.
Այնուամենայնիվ, սա դեռևս թողնում է նշանի անորոշություն, եթե մնացորդը զրոյական չէ. տեղի է ունենում մնացորդի համար երկու հնարավոր ընտրություն, մեկը բացասական, մյուսը դրական, և երկու հնարավոր ընտրություն գործակիցի համար։ Թվերի տեսության մեջ միշտ ընտրվում է դրական մնացորդը, իսկ հաշվարկում ծրագրավորման լեզուները ընտրում են՝ կախված լեզվից և a-ի կամ n-ի նշաններից։ Ստանդարտ Pascal-ը և ALGOL 68-ը, օրինակ, տալիս են դրական մնացորդ (կամ 0) նույնիսկ բացասական բաժանարարների համար, իսկ որոշ ծրագրավորման լեզուներ, ինչպիսին է C90-ը, թողնում են այն իմպլեմենտացիային, երբ n-ից կամ a-ից որևէ մեկը բացասական՝ a mod 0-ն որոշված չէ համակարգերի մեծ մասում, թեև ոմանք այն սահմանում են որպես a՝
-
Շատ իմպլեմենտացիաներ օգտագործում են կոտորակային մասը կտրելով բաժանում (truncated division), որի համար որպես մնացորդ սահմանվում է․
- ,
որտեղ []-ը ամբողջ մաս ֆունկցիան է։ Հավասարումից հետևում է, որ մնացորդը ունի նույն նշանը, ինչ բաժանելին․
-
Դոնալդ Կնութը[2] դեպի ներքև կլորացումով բաժանման կողմնակիցն էր, որի համար քանորդը սահմանվում է․
- ,
որտեղ ⌊⌋-ը դեպի ներքև կլորացման ֆունկցիան է(rounding down). Հավասարումից հետևում է, որ մնացորդը ունի նույն նշանը, ինչ բաժանելին․
-
Ռայմոնդ Բոութը[3] Էվկլիդյան բաժանման կողմնակիցն էր, որի համաար քանորդը սահմանվում է․
- ,
որտեղ sgn-ը sgn ֆունկցիան է, ⌊⌋-ը դեպի ներքև կլորացման ֆունկցիան է, և ⌈⌉-ը դեպի վեր կլորացման ֆունկցիան է։Հետևաբար, հավասարումից հետևում է, որ մնացորդը ոչ բացասական է․
-
Common Lisp-ը և IEEE 754-ը օգտագործում են կլորացումով բաժանում, որի համար քանորդը սահմանվում է․
որտեղ round-ը կլորացման ֆունկցիան է։ Հետևաբար, մնացորդը ընկած է -ի և -ի միջակայքում, և նշանը համապասախանում է 0-ից աջ կամ ձախ գտնվելուն այդ միջակայքում ․
-
Common Lisp-ը նաև օգտագործում է դեպի վեր կլոորացումով բաժանում, որի համար քանորդը սահմանված է․
- ,
որտեղ ⌈⌉-ը դեպի վեր կլորացման ֆունկցիան է։ Հետևաբար, հավասարումից հետևում է, որ մնացորդը ունի բաժանարարի հակառակ նշանը․
Լեյջենն ասել է․
Բուտը պնդում է, որ էվկլիդեսյան բաժանումը գերազանցում է մյուսներին օրինաչափության և օգտակար մաթեմատիկական հատկությունների առումով, թեև դեպի ներքև կլորացումով բաժանումը, որի կողմնակիցն է Կնուտը, նույնպես լավ սահմանում է։ Չնայած դրա լայն տարածմանը, կոտորակային մասը կտրելով բաժանումը զիջում է մյուս սահմանումներին։ - Division and Modulus for Computer Scientists[4]
|
Այնուամենայնիվ կոտորակային մասը կտրելով բաժանումը բավարարում է այս նույնությանը .[5]
Նշանը
խմբագրելՈրոշ հաշվիչներ ունեն mod() ֆունկցիայի կոճակ, և շատ ծրագրավորման լեզուներ ունեն նմանատիպ ֆունկցիա, որն արտահայտվում է հիմնականում, որպես mod(a, n)։ Ոմանք որպես նշան օգտագործում են «%», «mod» կամ «Mod» նշանները՝ որպես մոդուլ կամ մնացորդային օպերատոր, օրինակ՝ % n կամ mod n:
Ֆունկցիան չունեցող միջավայրերը կարող են օգտագործել վերը նշված երեք սահմանումներից որևէ մեկը։
Տարածված սխալներ
խմբագրելԵրբ մոդուլային գործողության արդյունքն ունի բաժանելիի նշանը (կոտորակային մասը կտրելով բաժանման սահմանում), դա կարող է հանգեցնել սխալների։
Օրինակ, ստուգելու համար, թե արդյոք ամբողջ թիվը կենտ է, կարելի է հակված լինել ստուգելու, թե արդյոք այդ թիվը 2-ի բաժանելիս մնացորդը հավասար է 1-ի։
bool is_odd(int n) {
return n % 2 == 1;
}
Այն լեզուներում, որտեղ մնացորդը ունի բաժանելիի նշանը, այս ալգորիթմը կտա սխալ պատասխան, որովհետև, երբ n-ը բաժանելին է և կենտ է, n mod 2 -ը կվերադարձնի −1 և վերևի ֆունկցիան կվերադարձնի false։
Այս խնդիրի լուծման համար ալգորթիմի ճիշտ ալտերնատիվն է ստուգելը, որ մնացորդը 0 չէ (քանի որ, զույգ թվերը 2-ի բաժանելիս մնացորդը 0 է անկախ նշանից)։
bool is_odd(int n) {
return n % 2 != 0;
}
Մեկ ուրիշ տարբերակ է ստուգելը, որ մնացորդը կամ 1 է, կամ -1։
bool is_odd(int n) {
return n % 2 == 1 || n % 2 == -1;
}
Ավելի պարզ ալտերնատիվ է վերաբերվելը n% 2-ի արդյունքին, որպես բուլյան արժեք, որտեղ ցանկացած ոչ զրոյական պատասխան վերադարձնում է true:
bool is_odd(int n) {
return n % 2;
}
Կատարողականության խնդիրներ
խմբագրելՄոդուլային գործողությունները կարող են իրականացվել այնպես, որ ամեն անգամ հաշվարկվը կատարվի մնացորդով բաժանումով։ Հատուկ դեպքերի համար, որոշ սարքավորումների վրա, կան ավելի արագացված տարբերակներ։ Օրինակ, 2-ի աստիճանների մնացորդը կարող է հաշվվել որպես բիթային AND գործողություն (ենթադրելով, որ x-ը դրական ամբողջ թիվ է կամ օգտագործել բոլոր սահմանումները բացի կոտորակային մասը կտրելով բաժանման սահմանումից)։
x % 2n == x & (2n - 1)
Օրինակներ։
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
Սարքերում և ծրագրերում, որոնք ավելի արդյունավետ են իրականացնում բիթային գործողությունները, քան մոդուլոն, այս այլընտրանքային ձևերը կարող են արագացնել հաշվարկները[6]։
Կոմպիլյատորների օպտիմիզացիաները կարող են ճանաչել
գործողությունը, որտեղ հաստատունը երկուսի աստիճան է և ավտոմատ կերպով իրականացնել դրանք որպես արտահայտություն % հաստատուն
՝ թույլ տալով ծրագրավորողին գրել ավելի հստակ կոդ՝ առանց կատարողականությունը վատացնելու։ Այս պարզ օպտիմիզացիան հնարավոր չէ այն լեզուների համար, որոնցում մոդուլային գործողության արդյունքն ունի բաժանելիի նշան (ներառյալ C), բացառությամբ այն դեպքերի, երբ բաժանելին առանց նշանկի ամբողջ թիվ չէ։ Դա պայմանավորված է նրանով, որ եթե բաժանելին բացասական է, մոդուլը բացասական կլինի, մինչդեռ արտահայտություն & (հաստատուն-1)
արտահայտությունը միշտ դրական կլինի։ Այս լեզուների համար համարժեքը & (հաստատուն-1)
x % 2n == x < 0? x | ~(2n - 1): x & (2n - 1)
-ն է,որը օգտագործում է բիթային OR, NOT և AND գործողությունները։
Հատկություններ
խմբագրելՈրոշ մոդուլո գործողություններ կարող են ֆակտորիզացվել և վերլուծվել, ինչպես այլ մաթեմատիկական գործողությունները։ Սա կարող է օգտակար լինել գաղտնագրության ապացույցների մեջ, օրինակ օգտագործվում է Դիֆֆի-Հելլմանի բանալու փոխանակման մեջ։ Այս հատկություններից որոշները պահանջում են, որ a-ն և n-ը լինեն ամբողջ թվեր․
- Նույնականություն․
- (a mod n) mod n = a mod n.
- nx mod n = 0 x-ի բոլոր դրական արժեքների համար.
- Եթե p-ն պարզ թիվ է, որը b-ի բաժանարար չէ, then abp−1 mod p = a mod p, ըստ Ֆերմայի փոքր թեորեմի.
- Հակադարձ․
- [(−a mod n) + (a mod n)] mod n = 0:
- b−1 mod n նշանակում է մոդուլային բազմապատկվող հակադարձ, որը սահմանվում է, այն և միայն այն դեպքում, երբ b-ն և n-ը համեմատաբար պարզ են, որը տեղի ունի, երբ ձախ կողմը սահմանված է։ [(b−1 mod n)(b mod n)] mod n = 1:
- Բաշխական․
- (a + b) mod n = [(a mod n) + (b mod n)] mod n.
- ab mod n = [(a mod n)(b mod n)] mod n.
- Բաժանում (սահմանում)․ ab mod n = [(a mod n)(b−1 mod n)] mod n, երբ աջ մասը լավ սահմանված է (երբ b-ն և n-ը փոխադարձաբար պարզ են)։
- Հակադարձ բազմապատկում․ [(ab mod n)(b−1 mod n)] mod n = a mod n.
Ծրագրավորման լեզուներում
խմբագրելԼեզու | Գործողություն | Ամբողջ թիվ | Խառը թիվ | Սահմանում |
---|---|---|---|---|
ABAP |
|
Այո | Այո | Էվկլիդյան |
ActionScript |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Ada |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[7] |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[7] | |
ALGOL 68 | ,
|
Այո | Ոչ | Էվկլիդյան |
AMPL |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
APL | | [Ն 1]
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
AppleScript |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
AutoLISP |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
AWK |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
bash |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
BASIC |
|
Այո | Ոչ | Որոշված չէ |
bc |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
C C++ |
,
|
Այո | Ոչ | Կոտորակային մասը կտրելով[Ն 2] |
(C) (C++)
|
Ոչ | Այո | Կոտորակային մասը կտրելով[10] | |
(C) (C++)
|
Ոչ | Այո | Կլորացումով | |
C# |
|
Այո | Այո | Կոտորակային մասը կտրելով |
|
Ոչ | Այո | Կլորացումով[11] | |
Clarion |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Clean |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Clojure |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[12] |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[13] | |
COBOL |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[Ն 3] |
CoffeeScript |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[14] | |
ColdFusion | ,
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Common Lisp |
|
Այո | Այո | Դեպի ներքև կլորացումով |
|
Այո | Այո | Կոտորակային մասը կտրելով | |
Crystal | ,
|
Այո | Այո | Դեպի ներքև կլորացումով |
|
Այո | Այո | Կոտորակային մասը կտրելով | |
D |
|
Այո | Այո | Կոտորակային մասը կտրելով[15] |
Dart |
|
Այո | Այո | Էվկլիդյան[16] |
|
Այո | Այո | Կոտորակային մասը կտրելով[17] | |
Eiffel |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Elixir |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[18] |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[19] | |
Elm |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[20] |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[21] | |
Erlang |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
|
Ոչ | Այո | Կոտորակային մասը կտրելով | |
Euphoria |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
F# |
|
Այո | Այո | Կոտորակային մասը կտրելով |
|
Ոչ | Այո | Կլորացումով[11] | |
Factor |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
FileMaker |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Forth |
|
Այո | Ոչ | Implementation defined |
|
Այո | Ոչ | Դեպի ներքև կլորացումով | |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
Fortran |
|
Այո | Այո | Կոտորակային մասը կտրելով |
|
Այո | Այո | Դեպի ներքև կլորացումով | |
Frink |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
GLSL |
|
Այո | Ոչ | Որոշված չէ[22] |
|
Ոչ | Այո | Դեպի ներքև կլորացումով[23] | |
GameMaker Studio (GML) | ,
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
GDScript (Godot) |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
|
Ոչ | Այո | Կոտորակային մասը կտրելով | |
|
Այո | Ոչ | Դեպի ներքև կլորացումով | |
|
Ոչ | Այո | Դեպի ներքև կլորացումով | |
Go |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[24] |
|
Ոչ | Այո | Կոտորակային մասը կտրելով[25] | |
|
Այո | Ոչ | Էվկլիդյան[26] | |
Groovy |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Haskell |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[27] |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[27] | |
(GHC)
|
Ոչ | Այո | Դեպի ներքև կլորացումով | |
Haxe |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
HLSL |
|
Այո | Այո | Որոշված չէ[28] |
J | | [Ն 1]
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Java |
|
Այո | Այո | Կոտորակային մասը կտրելով |
|
Այո | Ոչ | Դեպի ներքև կլորացումով | |
JavaScript TypeScript |
|
Այո | Այո | Կոտորակային մասը կտրելով |
Julia |
|
Այո | Այո | Դեպի ներքև կլորացումով[29] |
,
|
Այո | Այո | Կոտորակային մասը կտրելով[30] | |
Kotlin | ,
|
Այո | Այո | Կոտորակային մասը կտրելով[31] |
|
Այո | Այո | Դեպի ներքև կլորացումով[32] | |
ksh |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
|
Ոչ | Այո | Կոտորակային մասը կտրելով | |
LabVIEW |
|
Այո | Այո | Կոտորակային մասը կտրելով |
LibreOffice |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Logo |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
Lua 5 |
|
Այո | Այո | Դեպի ներքև կլորացումով |
Lua 4 |
|
Այո | Այո | Կոտորակային մասը կտրելով |
Liberty BASIC |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Mathcad |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Maple | (by default),
|
Այո | Ոչ | Էվկլիդյան |
|
Այո | Ոչ | Կլորացումով | |
|
Այո | Այո | Կլորացումով | |
Mathematica |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
MATLAB |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
Maxima |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
Maya Embedded Language |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Microsoft Excel |
|
Այո | Այո | Դեպի ներքև կլորացումով |
Minitab |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Modula-2 |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
MUMPS |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Netwide Assembler (NASM, NASMX) | , (unsigned)
|
Այո | Ոչ | Չկա տվյալ |
(signed)
|
Այո | Ոչ | Implementation-defined[33] | |
Nim |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Oberon |
|
Այո | Ոչ | Դեպի ներքև կլորացումով-like[Ն 4] |
Objective-C |
|
Այո | Ոչ | Կոտորակային մասը կտրելով (same as C99) |
Object Pascal, Delphi |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
OCaml |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[34] |
|
Ոչ | Այո | Կոտորակային մասը կտրելով[35] | |
Occam |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Pascal (ISO-7185 and -10206) |
|
Այո | Ոչ | Էվկլիդյանի նման[Ն 5] |
Programming Code Advanced (PCA) |
|
Այո | Ոչ | Որոշված չէ |
Perl |
|
Այո | Ոչ | Դեպի ներքև կլորացումով[Ն 6] |
|
Ոչ | Այո | Կոտորակային մասը կտրելով | |
Phix |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
PHP |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[37] |
|
Ոչ | Այո | Կոտորակային մասը կտրելով[38] | |
PIC BASIC Pro |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
PL/I |
|
Այո | Ոչ | Դեպի ներքև կլորացումով (ANSI PL/I) |
PowerShell |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Programming Code (PRC) |
|
Այո | Ոչ | Որոշված չէ |
Progress |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Prolog (ISO 1995) |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
PureBasic | ,
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
PureScript |
|
Այո | Ոչ | Էվկլիդյան[39] |
Pure Data |
|
Այո | Ոչ | Կոտորակային մասը կտրելով (same as C) |
|
Այո | Ոչ | Դեպի ներքև կլորացումով | |
Python |
|
Այո | Այո | Դեպի ներքև կլորացումով |
|
Ոչ | Այո | Կոտորակային մասը կտրելով | |
Q# |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[40] |
R |
|
Այո | Այո | Դեպի ներքև կլորացումով[41] |
Racket |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
Raku |
|
Ոչ | Այո | Դեպի ներքև կլորացումով |
RealBasic |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Reason |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Rexx |
|
Այո | Այո | Կոտորակային մասը կտրելով |
RPG |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Ruby | ,
|
Այո | Այո | Դեպի ներքև կլորացումով |
|
Այո | Այո | Կոտորակային մասը կտրելով | |
Rust |
|
Այո | Այո | Կոտորակային մասը կտրելով |
|
Այո | Այո | Էվկլիդյան[42] | |
SAS |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Scala |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Scheme |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
Scheme R6RS |
|
Այո | Ոչ | Էվկլիդյան[43] |
|
Այո | Ոչ | Կլորացումով[43] | |
|
Ոչ | Այո | Էվկլիդյան | |
|
Ոչ | Այո | Կլորացումով | |
Scratch |
|
Այո | Այո | Դեպի ներքև կլորացումով |
Seed7 |
|
Այո | Այո | Դեպի ներքև կլորացումով |
|
Այո | Այո | Կոտորակային մասը կտրելով | |
SenseTalk |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
(POSIX) (includes bash, mksh, &c.)
|
|
Այո | Ոչ | Կոտորակային մասը կտրելով (same as C)[44] |
Smalltalk |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
Snap! |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Spin |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Solidity |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
SQL (SQL:1999) |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
SQL (SQL:2011) |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Standard ML |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
|
Ոչ | Այո | Կոտորակային մասը կտրելով | |
Stata |
|
Այո | Ոչ | Էվկլիդյան |
Swift |
|
Այո | Ոչ | Կոտորակային մասը կտրելով[45] |
|
Ոչ | Այո | Կլորացումով[46] | |
|
Ոչ | Այո | Կոտորակային մասը կտրելով[47] | |
Tcl |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
tcsh |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Torque |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Turing |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
Verilog (2001) |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
VHDL |
|
Այո | Ոչ | Դեպի ներքև կլորացումով |
|
Այո | Ոչ | Կոտորակային մասը կտրելով | |
VimL |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
Visual Basic |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
WebAssembly | , (unsigned)
|
Այո | Ոչ | Չկա տվյալ[48] |
, (signed)
|
Այո | Ոչ | Կոտորակային մասը կտրելով[49] | |
x86 assembly |
|
Այո | Ոչ | Կոտորակային մասը կտրելով |
XBase++ |
|
Այո | Այո | Կոտորակային մասը կտրելով |
|
Այո | Այո | Դեպի ներքև կլորացումով | |
Zig | ,
|
Այո | Այո | Կոտորակային մասը կտրելով[50] |
Z3 theorem prover | ,
|
Այո | Ոչ | Էվկլիդյան |
Շատ համակարգչային համակարգեր ապահովում են
ֆունկցիոնալություն, որը վերադարձնում է քանորդը և մնացորդը միաժամանակ։ Օրինակները ներառում են x86 ճարտարապետության divmod
հրահանգը, C ծրագրավորման լեզվի IDIV
ֆունկցիան և Python-ի div()
ֆունկցիան։
divmod()
Ընդհանրացումներ
խմբագրելՄոդուլոն լրացյալով
խմբագրելԵրբեմն օգտակար է, որ մոդուլոյի արդյունքը ընկած լինի ոչ թե 0-ի և n-1-ի, այլ d-ի և d + n-1-ի միջև։ Այդ դեպքում d-ն կոչվում է լրացյալ։ Թվում է, թե այս գործողության համար ստանդարտ նշում չկա, ուստի եկեք պայմանականորեն օգտագործենք a modd n-ը։ Այսպիսով, մենք ունենք հետևյալ սահմանումը. x mod n = a mod n, երբ d ≤ x ≤ d + n − 1 և x mod n = a mod n: Ակնհայտ է, որ սովորական մոդոյի գործողությունը համապատասխանում է զրո լրացյալին. a mod n = a mod0 n: Լրացյալով մոդուլոյի աշխատանքը կապված է դեպի ներքև կլորացման ֆունկցիայի հետ հետևյալ կերպ.
Լրացյալով մոդուլոն a modd n իմպլեմենտացված է Mathematica լեզվում, որպես
.[51]
Mod[a, n, d]
Մոդուլո գործողության իմպլեմենտացիան, օգտագործելով կոտորակային մասը կտրելով բաժանում
խմբագրելՉնայած Կնութի Դեպի ներքև կլորացումով բաժանման և Էվկլիդյան բաժանման մաթեմատիկական գեղեցությանը, ծրագրավորման լեզուներում ընդհանուր առմամբ շատ ավելի տարածված է բաժանման վրա հիմնված մոդուլ գտնելը։ Լեյջենը տրամադրում է հետևյալ ալգորիթմները կոտորակային մասը կտրելով ամբողջ թվի բաժանումը հաշվարկելու համար[4].
/* Euclidean and Floored divmod, in the style of C's ldiv() */
typedef struct {
/* This structure is part of the C stdlib.h, but is reproduced here for clarity */
long int quot;
long int rem;
} ldiv_t;
/* Euclidean division */
inline ldiv_t ldivE(long numer, long denom) {
/* The C99 and C++11 languages define both of these as truncating. */
long q = numer / denom;
long r = numer % denom;
if (r < 0) {
if (denom > 0) {
q = q - 1;
r = r + denom;
} else {
q = q + 1;
r = r - denom;
}
}
return (ldiv_t){.quot = q, .rem = r};
}
/* Floored division */
inline ldiv_t ldivF(long numer, long denom) {
long q = numer / denom;
long r = numer % denom;
if ((r > 0 && denom < 0) || (r < 0 && denom > 0)) {
q = q - 1;
r = r + denom;
}
return (ldiv_t){.quot = q, .rem = r};
}
Երկու դեպքում էլ մնացորդը կարող է հաշվարկվել քանորդից անկախ, բայց ոչ հակառակը։
Ծանոթագրություններ
խմբագրել- ↑ Weisstein, Eric W. «Congruence». mathworld.wolfram.com (անգլերեն). Վերցված է 2020 թ․ օգոստոսի 27-ին.
- ↑ Knuth, Donald. E. (1972). The Art of Computer Programming. Addison-Wesley.
- ↑ Boute, Raymond T. (1992 թ․ ապրիլ). «The Euclidean definition of the functions div and mod». ACM Transactions on Programming Languages and Systems. ACM Press (New York, NY, USA). 14 (2): 127–144. doi:10.1145/128861.128862. hdl:1854/LU-314490. S2CID 8321674.
- ↑ 4,0 4,1 Leijen, Daan (2001 թ․ դեկտեմբերի 3). «Division and Modulus for Computer Scientists» (Document).
{{cite document}}
: Cite document requires|publisher=
(օգնություն); Unknown parameter|access-date=
ignored (օգնություն); Unknown parameter|url=
ignored (օգնություն) - ↑ Peterson, Doctor (2001 թ․ հուլիսի 5). «Mod Function and Negative Numbers». Math Forum - Ask Dr. Math. Արխիվացված է օրիգինալից 2019 թ․ հոկտեմբերի 22-ին. Վերցված է 2019 թ․ հոկտեմբերի 22-ին.
- ↑ Horvath, Adam (2012 թ․ հուլիսի 5). «Faster division and modulo operation - the power of two».
- ↑ 7,0 7,1 «ISO/IEC 8652:2012 - Information technology — Programming languages — Ada». ISO, IEC. 2012. sec. 4.5.5 Multiplying Operators.
{{cite journal}}
: Cite journal requires|journal=
(օգնություն) - ↑ «C99 specification (ISO/IEC 9899:TC2)» (PDF). 2005 թ․ մայիսի 6. sec. 6.5.5 Multiplicative operators. Վերցված է 2018 թ․ օգոստոսի 16-ին.
- ↑ «ISO/IEC 14882:2003: Programming languages – C++». International Organization for Standardization (ISO), International Electrotechnical Commission (IEC). 2003. sec. 5.6.4. «the binary % operator yields the remainder from the division of the first expression by the second. .... If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined»
{{cite journal}}
: Cite journal requires|journal=
(օգնություն) - ↑ «ISO/IEC 9899:1990: Programming languages – C». ISO, IEC. 1990. sec. 7.5.6.4. «The fmod function returns the value x - i * y, for some integer i such that, if y is nonzero, the result has the same sign as x and magnitude less than the magnitude of y.»
{{cite journal}}
: Cite journal requires|journal=
(օգնություն) - ↑ 11,0 11,1 dotnet-bot. «Math.IEEERemainder(Double, Double) Method (System)». learn.microsoft.com (ամերիկյան անգլերեն). Վերցված է 2022 թ․ հոկտեմբերի 4-ին.
- ↑ «clojure.core - Clojure v1.10.3 API documentation». clojure.github.io. Վերցված է 2022 թ․ մարտի 16-ին.
- ↑ «clojure.core - Clojure v1.10.3 API documentation». clojure.github.io. Վերցված է 2022 թ․ մարտի 16-ին.
- ↑ CoffeeScript operators
- ↑ «Expressions - D Programming Language». dlang.org. Վերցված է 2021 թ․ հունիսի 1-ին.
- ↑ «operator % method - num class - dart:core library - Dart API». api.dart.dev. Վերցված է 2021 թ․ հունիսի 1-ին.
- ↑ «remainder method - num class - dart:core library - Dart API». api.dart.dev. Վերցված է 2021 թ․ հունիսի 1-ին.
- ↑ «Kernel — Elixir v1.11.3». hexdocs.pm. Վերցված է 2021 թ․ հունվարի 28-ին.
- ↑ «Integer — Elixir v1.11.3». hexdocs.pm. Վերցված է 2021 թ․ հունվարի 28-ին.
- ↑ «Basics - core 1.0.5». package.elm-lang.org. Վերցված է 2022 թ․ մարտի 16-ին.
- ↑ «Basics - core 1.0.5». package.elm-lang.org. Վերցված է 2022 թ․ մարտի 16-ին.
- ↑ «GLSL Language Specification, Version 4.50.7» (PDF). section 5.9 Expressions. «If both operands are non-negative, then the remainder is non-negative. Results are undefined if one or both operands are negative.»
- ↑ «GLSL Language Specification, Version 4.50.7» (PDF). section 8.3 Common Functions.
- ↑ «The Go Programming Language Specification - The Go Programming Language». go.dev. Վերցված է 2022 թ․ փետրվարի 28-ին.
- ↑ «math package - math - pkg.go.dev». pkg.go.dev. Վերցված է 2022 թ․ փետրվարի 28-ին.
- ↑ «big package - math/big - pkg.go.dev». pkg.go.dev. Վերցված է 2022 թ․ փետրվարի 28-ին.
- ↑ 27,0 27,1 «6 Predefined Types and Classes». www.haskell.org. Վերցված է 2022 թ․ մայիսի 22-ին.
- ↑ «Operators». Microsoft. Վերցված է 2021 թ․ հուլիսի 19-ին. «The % operator is defined only in cases where either both sides are positive or both sides are negative. Unlike C, it also operates on floating-point data types, as well as integers.»
- ↑ «Mathematics · The Julia Language». docs.julialang.org. Վերցված է 2021 թ․ նոյեմբերի 20-ին.
- ↑ «Mathematics · The Julia Language». docs.julialang.org. Վերցված է 2021 թ․ նոյեմբերի 20-ին.
- ↑ «rem - Kotlin Programming Language». Kotlin (անգլերեն). Վերցված է 2021 թ․ մայիսի 5-ին.
- ↑ «mod - Kotlin Programming Language». Kotlin (անգլերեն). Վերցված է 2021 թ․ մայիսի 5-ին.
- ↑ «Chapter 3: The NASM Language». NASM - The Netwide Assembler version 2.15.05.
- ↑ «OCaml library : Stdlib». ocaml.org. Վերցված է 2022 թ․ փետրվարի 19-ին.
- ↑ «OCaml library : Stdlib». ocaml.org. Վերցված է 2022 թ․ փետրվարի 19-ին.
- ↑ Perl documentation
- ↑ «PHP: Arithmetic Operators - Manual». www.php.net. Վերցված է 2021 թ․ նոյեմբերի 20-ին.
- ↑ «PHP: fmod - Manual». www.php.net. Վերցված է 2021 թ․ նոյեմբերի 20-ին.
- ↑ «EuclideanRing».
- ↑ QuantumWriter. «Expressions». docs.microsoft.com (ամերիկյան անգլերեն). Վերցված է 2018 թ․ հուլիսի 11-ին.
- ↑ «R: Arithmetic Operators». search.r-project.org. Վերցված է 2022 թ․ դեկտեմբերի 24-ին.
- ↑ «F32 - Rust».
- ↑ 43,0 43,1 «r6rs.org». Արխիվացված է օրիգինալից 2018 թ․ մարտի 15-ին. Վերցված է 2023 թ․ օգոստոսի 22-ին.
- ↑ «Shell Command Language». pubs.opengroup.org. Վերցված է 2021 թ․ փետրվարի 5-ին.
- ↑ «Apple Developer Documentation». developer.apple.com. Վերցված է 2021 թ․ նոյեմբերի 20-ին.
- ↑ «Apple Developer Documentation». developer.apple.com. Վերցված է 2021 թ․ նոյեմբերի 20-ին.
- ↑ «Apple Developer Documentation». developer.apple.com. Վերցված է 2021 թ․ նոյեմբերի 20-ին.
- ↑ «Numerics — WebAssembly 1.1 (Draft 2022-03-02)». webassembly.github.io. Վերցված է 2022 թ․ մարտի 16-ին.
- ↑ «Numerics — WebAssembly 1.1 (Draft 2022-03-02)». webassembly.github.io. Վերցված է 2022 թ․ մարտի 16-ին.
- ↑ «Zig Documentation». Zig Programming Language. Վերցված է 2022 թ․ դեկտեմբերի 18-ին.
- ↑ «Mod». Wolfram Language & System Documentation Center. Wolfram Research. 2020. Վերցված է 2020 թ․ ապրիլի 8-ին.
Նշումներ
խմբագրել- ↑ 1,0 1,1 Argument order reverses, i.e.,
α|ω
computes , the remainder when dividing
byω
.α
- ↑ C99 and C++11 define the behavior of
to be truncated.[8] The standards before then leave the behavior implementation-defined.[9]%
- ↑ As implemented in ACUCOBOL, Micro Focus COBOL, and possible others.
- ↑ Divisor must be positive, otherwise undefined.
- ↑ As discussed by Boute, ISO Pascal's definitions of
anddiv
do not obey the Division Identity of D = d · (D / d) + D % d, and are thus fundamentally broken.mod
- ↑ Perl usually uses arithmetic modulo operator that is machine-independent. For examples and exceptions, see the Perl documentation on multiplicative operators.[36]
Արտաքին հղումներ
խմբագրել- Modulorama, բազմապատկման աղյուսակների անիմացիոն ցուցադրում (բացատրված է ֆրանսերենով)