חילוק מודולרי

חילוק מודולרי הוא פעולת חילוק המתבצעת בין מספרים שלמים בחשבון מודולרי. הפעולה מוגדרת היטב אם ורק אם המחלק זר למודולוס. בהינתן שני מספרים שלמים a , b {\displaystyle a,b} ומודולוס m {\displaystyle m} , כאשר b , m {\displaystyle b,m} זרים, תוצאת החילוק המודולרי של a {\displaystyle a} ב- b {\displaystyle b} היא מספר c {\displaystyle c} המקיים b c ≡ a ( mod m ) {\displaystyle bc\equiv a\!\!\!{\pmod {m}}} . לדוגמה, 2 / 3 ≡ 6 ( mod 8 ) {\displaystyle 2/3\equiv 6\!\!\!{\pmod {8}}} משום ש- 6 ⋅ 3 = 18 ≡ 2 ( mod 8 ) {\displaystyle 6\cdot 3=18\equiv 2\!\!\!{\pmod {8}}} . משמעותו של הביטוי a / b ( mod m ) {\displaystyle a/b\!\!\!{\pmod {m}}} היא "המספר היחיד c {\displaystyle c} הפותר את המשוואה b c ≡ a ( mod m ) {\displaystyle bc\equiv a\!\!\!{\pmod {m}}} ". מספר כזה קיים, כאמור, רק כאשר b , m {\displaystyle b,m} זרים. עם זאת, ייתכן שלמשוואה b c ≡ a ( mod m ) {\displaystyle bc\equiv a\!\!\!{\pmod {m}}} יהיו פתרונות גם כאשר b , m {\displaystyle b,m} אינם זרים. למשוואה יש פתרונות אם ורק אם המחלק המשותף המקסימלי של b , m {\displaystyle b,m} מחלק את a {\displaystyle a} ; ובמקרה כזה, תוצאת החילוק מוגדרת היטב מודולו m gcd { b , m } {\displaystyle {\frac {m}{\gcd\{b,m\}}}} (אבל לא מודולו m {\displaystyle m} ). באופן כללי, אם c ≡ a / b ( mod m ) {\displaystyle c\equiv a/b\!\!\!{\pmod {m}}} אז לכל מספר שלם k {\displaystyle k} מתקיים כי c + k ⋅ m gcd { b , m } ≡ a / b ( mod m ) {\displaystyle c+k\cdot {\frac {m}{\gcd\{b,m\}}}\equiv a/b\!\!\!{\pmod {m}}} . ניתן לחשב חילוק מודולרי על ידי חישוב הופכי כפלי מודולרי של המחלק b {\displaystyle b} , אם הוא קיים. בפרט, אם b − 1 {\displaystyle b^{-1}} הוא ההופכי הכפלי המודולרי של b {\displaystyle b} מודולו m {\displaystyle m} , אזי על-פי ההגדרה: b − 1 ⋅ b ≡ 1 ( mod m ) a ⋅ b − 1 ⋅ b ≡ a ( mod m ) {\displaystyle {\begin{aligned}b^{-1}\cdot b\equiv 1\!\!\!{\pmod {m}}\\a\cdot b^{-1}\cdot b\equiv a\!\!\!{\pmod {m}}\end{aligned}}} ומכאן אפשר לחשב את c {\displaystyle c} (תוצאת החילוק של a {\displaystyle a} ב- b {\displaystyle b} ): c ≡ a ⋅ b − 1 ( mod m ) {\displaystyle c\equiv a\cdot b^{-1}\!\!\!{\pmod {m}}} אולם, ישנם מקרים שבהם ההופכי הכפלי המודולרי אינו קיים – כאשר ל- b , m {\displaystyle b,m} ישנו מחלק משותף גדול מ-1 (ראו הופכי כפלי מודולרי), ועדיין ניתן לבצע חילוק. לפיכך טוב יותר לבצע חילוק ישירות בעזרת אלגוריתם אוקלידס המורחב. אלגוריתם זה מוצא את הממג"ב של שני מספרים נתונים (במקרה זה: b , m {\displaystyle b,m} ), ובנוסף לכך מחשב שני מספרים x , y {\displaystyle x,y} המקיימים את המשוואה: b x + m y = gcd { b , m } {\displaystyle bx+my=\gcd\{b,m\}} כאמור בסעיף הקודם, ניתן לבצע את החילוק אם ורק אם a {\displaystyle a} הוא כפולה שלמה של gcd { b , m } {\displaystyle \gcd\{b,m\}} , כלומר כאשר קיים מספר שלם q {\displaystyle q} המקיים: a = q ⋅ gcd { b , m } {\displaystyle a=q\cdot \gcd\{b,m\}} במקרה זה ניתן להכפיל את המשוואה הקודמת ב- q {\displaystyle q} ולקבל: b q x + m q y = q ⋅ gcd { b , m } = a {\displaystyle bqx+mqy=q\cdot \gcd\{b,m\}=a} מכאן, על-פי הגדרת החשבון המודולרי: b q x ≡ a ( mod m ) {\displaystyle bqx\equiv a\!\!\!{\pmod {m}}} ומכאן ש- q x {\displaystyle qx} הוא תוצאת החילוק. לפניכם מימוש מעשי של האלגוריתם בשפת ++C: /** * Euclid's extended algorithm: * Given a,b, Find gcd,x,y that solve the equation: * ax + by = gcd(a,b) * @see http://en.wikipedia.org/wiki/Modular_multiplicative_inverse#Computation */ void xgcd (int a, int b, int& gcd, int& x, int& y) { x=0, y=1; int u=1, v=0, m, n, q, r; gcd = b; while (a!=0) { q=gcd/a; r=gcd%a; m=x-u*q; n=y-v*q; gcd=a; a=r; x=u; y=v; u=m; v=n; } } /** * Modular division: * @return integer z such that: z * B mod m == A. * If there is more than one (i.e. when gcd(B,m)>1) - returns the smallest such integer */ int divide (int A, int B, int m) { assert (0 <= A && A<m); assert (0 <= B && B<m); int gcd, x, y; xgcd (B, m, gcd, x, y); // x B + y m = gcd(B,m) if (A%gcd == 0) { int q = A / gcd; // x q B + y q m = m gcd = A return ((x + m)*q) % (m/gcd); // Return the smallest result possible } else { throw "no quotient"; } } הופכי כפלי מודולרי חשבון מודולרי חילוק יסודות של תורת המספרים החישובית, רוברט קמפבל, אוניברסיטת UMBC מרילנד. מסתמך על מימוש בשפת פייתון בדף en:Modular multiplicative inverse.