Մոդուլո գործողություն

testwiki-ից
23:36, 9 մարտի 2024 տարբերակ, imported>ԱշոտՏՆՂ
(տարբ) ←Նախորդ տարբերակ | Ընթացիկ տարբերակ (տարբ) | Հաջորդ տարբերակ→ (տարբ)
Jump to navigation Jump to search

Մոդուլո գործողություն, թվաբանության մեջ վերադարձնում է բաժանման արդյունքում ստացված մնացորդը՝ նշանով, կամ առանց նշանի։

Տրված են երկու դրական թվեր՝ 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-ը բավարարում են հետևյալ պայմաններին.

Կաղապար:NumBlk

Այնուամենայնիվ, սա դեռևս թողնում է նշանի անորոշություն, եթե մնացորդը զրոյական չէ. տեղի է ունենում մնացորդի համար երկու հնարավոր ընտրություն, մեկը բացասական, մյուսը դրական, և երկու հնարավոր ընտրություն գործակիցի համար։ Թվերի տեսության մեջ միշտ ընտրվում է դրական մնացորդը, իսկ հաշվարկում ծրագրավորման լեզուները ընտրում են՝ կախված լեզվից և a-ի կամ n-ի նշաններից։ Ստանդարտ Pascal-ը և ALGOL 68-ը, օրինակ, տալիս են դրական մնացորդ (կամ 0) նույնիսկ բացասական բաժանարարների համար, իսկ որոշ ծրագրավորման լեզուներ, ինչպիսին է C90-ը, թողնում են այն իմպլեմենտացիային, երբ n-ից կամ a-ից որևէ մեկը բացասական՝ a mod 0-ն որոշված չէ համակարգերի մեծ մասում, թեև ոմանք այն սահմանում են որպես a՝ Կաղապար:Bulleted list

Լեյջենն ասել է․ Կաղապար:Քաղվածք

Այնուամենայնիվ կոտորակային մասը կտրելով բաժանումը բավարարում է այս նույնությանը (a)/b=(a/b)=a/(b).[2]

Նշանը

Որոշ հաշվիչներ ունեն mod() ֆունկցիայի կոճակ, և շատ ծրագրավորման լեզուներ ունեն նմանատիպ ֆունկցիա, որն արտահայտվում է հիմնականում, որպես mod(a, n)։ Ոմանք որպես նշան օգտագործում են «%», «mod» կամ «Mod» նշանները՝ որպես մոդուլ կամ մնացորդային օպերատոր, օրինակ՝ % n կամ mod n:

Ֆունկցիան չունեցող միջավայրերը կարող են օգտագործել վերը նշված երեք սահմանումներից որևէ մեկը։

Տարածված սխալներ

Երբ մոդուլային գործողության արդյունքն ունի բաժանելիի նշանը (կոտորակային մասը կտրելով բաժանման սահմանում), դա կարող է հանգեցնել սխալների։

Օրինակ, ստուգելու համար, թե արդյոք ամբողջ թիվը կենտ է, կարելի է հակված լինել ստուգելու, թե արդյոք այդ թիվը 2-ի բաժանելիս մնացորդը հավասար է 1-ի։

bool is_odd(int n) {
    return n % 2 == 1;
}

Այն լեզուներում, որտեղ մնացորդը ունի բաժանելիի նշանը, այս ալգորիթմը կտա սխալ պատասխան, որովհետև, երբ n-ը բաժանելին է և կենտ է, Կաղապար:Math 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)

Օրինակներ։

Կաղապար:Code
Կաղապար:Code
Կաղապար:Code

Սարքերում և ծրագրերում, որոնք ավելի արդյունավետ են իրականացնում բիթային գործողությունները, քան մոդուլոն, այս այլընտրանքային ձևերը կարող են արագացնել հաշվարկները[3]։

Կոմպիլյատորների օպտիմիզացիաները կարող են ճանաչել Կաղապար:Code գործողությունը, որտեղ հաստատունը երկուսի աստիճան է և ավտոմատ կերպով իրականացնել դրանք որպես Կաղապար:Code՝ թույլ տալով ծրագրավորողին գրել ավելի հստակ կոդ՝ առանց կատարողականությունը վատացնելու։ Այս պարզ օպտիմիզացիան հնարավոր չէ այն լեզուների համար, որոնցում մոդուլային գործողության արդյունքն ունի բաժանելիի նշան (ներառյալ C), բացառությամբ այն դեպքերի, երբ բաժանելին առանց նշանկի ամբողջ թիվ չէ։ Դա պայմանավորված է նրանով, որ եթե բաժանելին բացասական է, մոդուլը բացասական կլինի, մինչդեռ Կաղապար:Code արտահայտությունը միշտ դրական կլինի։ Այս լեզուների համար համարժեքը x % 2n == x < 0? x | ~(2n - 1): x & (2n - 1) -ն է,որը օգտագործում է բիթային OR, NOT և AND գործողությունները։

Հատկություններ

Որոշ մոդուլո գործողություններ կարող են ֆակտորիզացվել և վերլուծվել, ինչպես այլ մաթեմատիկական գործողությունները։ Սա կարող է օգտակար լինել գաղտնագրության ապացույցների մեջ, օրինակ օգտագործվում է Դիֆֆի-Հելլմանի բանալու փոխանակման մեջ։ Այս հատկություններից որոշները պահանջում են, որ Կաղապար:Math-ն և Կաղապար:Math-ը լինեն ամբողջ թվեր․

Ծրագրավորման լեզուներում

Մոդուլո գործողությունը տարբեր ծրագրավորման լեզուներում
Լեզու Գործողություն Ամբողջ թիվ Խառը թիվ Սահմանում
ABAP Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Էվկլիդյան
ActionScript Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Ada Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով[4]
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[4]
ALGOL 68 Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյան
AMPL Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
APL |Կաղապար:Efn Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
AppleScript Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
AutoLISP Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
AWK Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
bash Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
BASIC Կաղապար:Code Կաղապար:Yes Կաղապար:No Որոշված չէ
bc Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
CԿաղապար:BreakC++ Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելովԿաղապար:Efn
Կաղապար:Code (C)Կաղապար:BreakԿաղապար:Code (C++) Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով[5]
Կաղապար:Code (C)Կաղապար:BreakԿաղապար:Code (C++) Կաղապար:No Կաղապար:Yes Կլորացումով
C# Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կլորացումով[6]
Clarion Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Clean Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Clojure Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով[7]
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[8]
COBOL Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումովԿաղապար:Efn
CoffeeScript Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով[9]
ColdFusion Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Common Lisp Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Crystal Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
D Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով[10]
Dart Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Էվկլիդյան[11]
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով[12]
Eiffel Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Elixir Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[13]
Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով[14]
Elm Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով[15]
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[16]
Erlang Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով
Euphoria Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
F# Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կլորացումով[6]
Factor Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
FileMaker Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Forth Կաղապար:Code Կաղապար:Yes Կաղապար:No Implementation defined
Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Fortran Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Frink Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
GLSL Կաղապար:Code Կաղապար:Yes Կաղապար:No Որոշված չէ[17]
Կաղապար:Code Կաղապար:No Կաղապար:Yes Դեպի ներքև կլորացումով[18]
GameMaker Studio (GML) Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
GDScript (Godot) Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Դեպի ներքև կլորացումով
Go Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[19]
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով[20]
Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյան[21]
Groovy Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Haskell Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով[22]
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[22]
Կաղապար:Code (GHC) Կաղապար:No Կաղապար:Yes Դեպի ներքև կլորացումով
Haxe Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
HLSL Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Որոշված չէ[23]
J |Կաղապար:Efn Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Java Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
JavaScriptԿաղապար:BreakTypeScript Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Julia Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով[24]
Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով[25]
Kotlin Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով[26]
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով[27]
ksh Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով
LabVIEW Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
LibreOffice Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Logo Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Lua 5 Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Lua 4 Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Liberty BASIC Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Mathcad Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Maple Կաղապար:Code (by default), Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյան
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կլորացումով
Mathematica Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
MATLAB Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Maxima Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Maya Embedded Language Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Microsoft Excel Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Minitab Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Modula-2 Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
MUMPS Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Netwide Assembler (NASM, NASMX) Կաղապար:Code, Կաղապար:Code (unsigned) Կաղապար:Yes Կաղապար:No Կաղապար:N/A
Կաղապար:Code (signed) Կաղապար:Yes Կաղապար:No Implementation-defined[28]
Nim Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Oberon Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով-likeԿաղապար:Efn
Objective-C Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով (same as C99)
Object Pascal, Delphi Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
OCaml Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[29]
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով[30]
Occam Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Pascal (ISO-7185 and -10206) Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյանի նմանԿաղապար:Efn
Programming Code Advanced (PCA) Կաղապար:Code Կաղապար:Yes Կաղապար:No Որոշված չէ
Perl Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումովԿաղապար:Efn
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով
Phix Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
PHP Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[31]
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով[32]
PIC BASIC Pro Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
PL/I Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով (ANSI PL/I)
PowerShell Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Programming Code (PRC) Կաղապար:Code Կաղապար:Yes Կաղապար:No Որոշված չէ
Progress Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Prolog (ISO 1995) Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
PureBasic Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
PureScript Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյան[33]
Pure Data Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով (same as C)
Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Python Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով
Q# Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[34]
R Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով[35]
Racket Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Raku Կաղապար:Code Կաղապար:No Կաղապար:Yes Դեպի ներքև կլորացումով
RealBasic Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Reason Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Rexx Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
RPG Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Ruby Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Rust Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Էվկլիդյան[36]
SAS Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Scala Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Scheme Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Scheme R6RS Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյան[37]
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կլորացումով[37]
Կաղապար:Code Կաղապար:No Կաղապար:Yes Էվկլիդյան
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կլորացումով
Scratch Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Seed7 Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
SenseTalk Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Կաղապար:Code (POSIX) (includes bash, mksh, &c.) Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով (same as C)[38]
Smalltalk Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Snap! Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Spin Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Solidity Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
SQL (SQL:1999) Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
SQL (SQL:2011) Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Standard ML Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով
Stata Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյան
Swift Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[39]
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կլորացումով[40]
Կաղապար:Code Կաղապար:No Կաղապար:Yes Կոտորակային մասը կտրելով[41]
Tcl Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
tcsh Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Torque Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Turing Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Verilog (2001) Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
VHDL Կաղապար:Code Կաղապար:Yes Կաղապար:No Դեպի ներքև կլորացումով
Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
VimL Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
Visual Basic Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
WebAssembly Կաղապար:Code, Կաղապար:Code (unsigned) Կաղապար:Yes Կաղապար:No Կաղապար:N/A[42]
Կաղապար:Code, Կաղապար:Code (signed) Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով[43]
x86 assembly Կաղապար:Code Կաղապար:Yes Կաղապար:No Կոտորակային մասը կտրելով
XBase++ Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով
Կաղապար:Code Կաղապար:Yes Կաղապար:Yes Դեպի ներքև կլորացումով
Zig Կաղապար:Code,

Կաղապար:Code, Կաղապար:Code

Կաղապար:Yes Կաղապար:Yes Կոտորակային մասը կտրելով[44]
Z3 theorem prover Կաղապար:Code, Կաղապար:Code Կաղապար:Yes Կաղապար:No Էվկլիդյան

Շատ համակարգչային համակարգեր ապահովում են Կաղապար:Code ֆունկցիոնալություն, որը վերադարձնում է քանորդը և մնացորդը միաժամանակ։ Օրինակները ներառում են x86 ճարտարապետության Կաղապար:Code հրահանգը, C ծրագրավորման լեզվի Կաղապար:Code ֆունկցիան և PythonԿաղապար:Code ֆունկցիան։

Ընդհանրացումներ

Մոդուլոն լրացյալով

Երբեմն օգտակար է, որ մոդուլոյի արդյունքը ընկած լինի ոչ թե 0-ի և n-1-ի, այլ d-ի և d + n-1-ի միջև։ Այդ դեպքում d-ն կոչվում է լրացյալ։ Թվում է, թե այս գործողության համար ստանդարտ նշում չկա, ուստի եկեք պայմանականորեն օգտագործենք Կաղապար:Math-ը։ Այսպիսով, մենք ունենք հետևյալ սահմանումը. Կաղապար:Math, երբ d ≤ x ≤ d + n − 1 և x mod n = a mod n: Ակնհայտ է, որ սովորական մոդոյի գործողությունը համապատասխանում է զրո լրացյալին. Կաղապար:Math: Լրացյալով մոդուլոյի աշխատանքը կապված է դեպի ներքև կլորացման ֆունկցիայի հետ հետևյալ կերպ.

amoddn=anadn.

Լրացյալով մոդուլոն Կաղապար:Math իմպլեմենտացված է Mathematica լեզվում, որպես Կաղապար:Code .[45]

Մոդուլո գործողության իմպլեմենտացիան, օգտագործելով կոտորակային մասը կտրելով բաժանում

Չնայած Կնութի Դեպի ներքև կլորացումով բաժանման և Էվկլիդյան բաժանման մաթեմատիկական գեղեցությանը, ծրագրավորման լեզուներում ընդհանուր առմամբ շատ ավելի տարածված է բաժանման վրա հիմնված մոդուլ գտնելը։ Լեյջենը տրամադրում է հետևյալ ալգորիթմները կոտորակային մասը կտրելով ամբողջ թվի բաժանումը հաշվարկելու համար[46].

/* 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};
}

Երկու դեպքում էլ մնացորդը կարող է հաշվարկվել քանորդից անկախ, բայց ոչ հակառակը։

Ծանոթագրություններ

Կաղապար:Ծանցանկ

Նշումներ

Կաղապար:Նցանկ

Արտաքին հղումներ

  • Modulorama, բազմապատկման աղյուսակների անիմացիոն ցուցադրում (բացատրված է ֆրանսերենով)