מודולו הוא מה שנשאר אחרי חלוקה. המחשבון מחזיר את המודולו המתמטי, את המנה, את השארית כפי שאופרטור % מחזיר בשפות תכנות, ושורת בדיקה שמאמתת את הזהות.
הערכים נפרדים בכוונה: בקלט שלילי המודולו המתמטי והשארית של % אינם זהים, וזה מקור נפוץ לבאגים.
מודולו, מנה ושארית
בחלוקה של a ב-b מתקבלים מנה (כמה פעמים b נכנס ב-a) ושארית. הזהות שתמיד מתקיימת היא a = q × b + mod.
במספרים חיוביים הכול פשוט: 17 חלקי 5 נותן מנה 3 ושארית 2, ואכן 3×5+2 = 17.
במספרים שליליים נפתח פער בין שתי מסורות. המחשבון מציג את המודולו המתמטי, שמתקבל מחלוקה כלפי מטה: הסימן שלו נגזר מהמחלק, ולכן במחלק חיובי התוצאה תמיד בטווח שבין 0 ל-b.
לעומתו, האופרטור % ב-JavaScript, ב-C וב-Java מחזיר שארית שסימנה נגזר מהמחולק. עבור −7 ו-3 המודולו המתמטי הוא 2, ואילו % מחזיר −1. Python, לעומתן, מחזיר 2 — כלומר תואם למודולו המתמטי.
שני הערכים נכונים, כל אחד בהגדרתו, ולכן המחשבון מציג את שניהם. ההבדל ביניהם הוא בדיוק b, ולכן אפשר לתקן בין המסורות בביטוי ((a % b) + b) % b.
דוגמאות — כולל קלט שלילי
- 17 ו-5: מודולו 2, מנה 3, בדיקה 3×5+2 = 17
- −7 ו-3: מודולו 2, מנה −3, בדיקה −3×3+2 = −7
- באותו קלט, האופרטור
%ב-JavaScript מחזיר −1 - 7 ו-−3: מודולו −2 — סימן המחלק
- 10 ו-2: מודולו 0 — חלוקה ללא שארית
אותו קלט, שתי תשובות לפי השפה
| a, b | מודולו מתמטי | % ב-JS / C / Java | % ב-Python |
|---|---|---|---|
| 17, 5 | 2 | 2 | 2 |
| −7, 3 | 2 | −1 | 2 |
| 7, −3 | −2 | 1 | −2 |
| −7, −3 | −1 | −1 | −1 |
במספרים חיוביים כל השפות מסכימות, ולכן הפער עובר בשקט עד שמגיע קלט שלילי. בקוד שמסתמך על מודולו — אינדקס מחזורי, בדיקת זוגיות, פיזור ערכים לדליים — זה באג שמופיע רק לפעמים.
הפתרון הנפוץ ב-JavaScript הוא ((a % b) + b) % b, שמחזיר תמיד תוצאה לא שלילית במחלק חיובי.
איפה מודולו שימושי
- זוגיות. מספר זוגי אם a mod 2 שווה 0.
- מחזוריות. יום בשבוע, שעה ביום, או מעבר מחזורי במערך: אינדקס mod אורך המערך.
- ספרת ביקורת. תעודת זהות ישראלית, ISBN וכרטיסי אשראי מאומתים בחישוב מודולו.
- חלוקה לדליים. בטבלאות גיבוב, מודולו מפזר מפתחות בין תאים.
- קריפטוגרפיה. RSA ואלגוריתמים נוספים בנויים כולם על אריתמטיקה מודולרית.
כלל חלוקה שימושי שנשען על מודולו: מספר מתחלק ב-3 אם סכום ספרותיו מתחלק ב-3, וב-9 אם סכום ספרותיו מתחלק ב-9. לחישוב מחלק משותף יש באתר מחשבון מחלק משותף גדול.
שאלות נפוצות
מה זה מודולו?
השארית שנותרת אחרי חלוקה. 17 מודולו 5 שווה 2, מפני ש-5 נכנס ב-17 שלוש פעמים ונשאר 2.
מה המודולו של מספר שלילי?
במודולו המתמטי, שהמחשבון מציג, −7 מודולו 3 שווה 2 — התוצאה תמיד לא שלילית כשהמחלק חיובי. האופרטור % ב-JavaScript מחזיר שם −1.
למה שפות תכנות נותנות תשובות שונות?
מפני שהן נבדלות בכיוון עיגול החלוקה. JavaScript, C ו-Java קוטעות אל האפס והשארית נושאת את סימן המחולק. Python מעגלת כלפי מטה והתוצאה נושאת את סימן המחלק.
איך מקבלים מודולו לא שלילי ב-JavaScript?
בביטוי ((a % b) + b) % b. הוא מחזיר תמיד תוצאה בטווח שבין 0 ל-b כשהמחלק חיובי.
מה המשמעות של שורת הבדיקה?
היא מאמתת את הזהות a = q × b + mod. אם היא לא מסתדרת, המנה והשארית אינם עקביים זה עם זה.