Մոդուլո գործողություն, թվաբանության մեջ վերադարձնում է բաժանման արդյունքում ստացված մնացորդը՝ նշանով, կամ առանց նշանի։
Տրված են երկու դրական թվեր՝ 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
Լեյջենն ասել է․
Կաղապար:Քաղվածք
Այնուամենայնիվ կոտորակային մասը կտրելով բաժանումը բավարարում է այս նույնությանը .[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: Լրացյալով մոդուլոյի աշխատանքը կապված է դեպի ներքև կլորացման ֆունկցիայի հետ հետևյալ կերպ.
Լրացյալով մոդուլոն Կաղապար: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, բազմապատկման աղյուսակների անիմացիոն ցուցադրում (բացատրված է ֆրանսերենով)