
استعد ، ستجد مقالًا متحذلقًا للغاية ، والذي قد يوفر لك مقابلة أو يوفر بضع ساعات أثناء اصطياد خلل في الإنتاج!
أنا أعمل بنشاط في الموسم الثاني
من دليل المنتحل وأكتب عن تشفير RSA لـ SSH ، والذي من الواضح أنه الجزء الأكثر تنزيلًا من التعليمات البرمجية في تاريخ تكنولوجيا المعلومات.
أود أن أفهم هذه القصة بشكل كامل. من اخترع هذا الرمز وكيف يعمل ولماذا يعمل وما
إذا كان سيعمل في المستقبل . الآن اكتشفت
قصة مثيرة للاهتمام لعنة . أنا لست مصابا بالسرطان وأرى الآخرين يمتصون حرفيا في هذا المجال. لكني مهتم بها أيضًا ، نظرًا لوجود المنك الصغير في كل مكان ، ومثل العقعق
ينجذب إلى أشياء لامعة في المنك العميق . أنا أيضًا جيد جدًا في الاستعارات.
على أي حال: تعلمت الأسبوع الماضي شيئًا غريبًا وأريد المشاركة: اتضح أن
التعديل والباقي من التقسيم ليسا نفس الشيء . من المضحك حقًا أن بعض القراء يقفزون من مقاعدهم ويصرخون على هذه الكلمات: "لكن هذا بالضبط ما حاولت أن أخبرك به أنت والجميع!"
استدعاء الرجال من طائفة "وزارة الدفاع ليست الباقية"! هذا لك.
ما هو التعديل؟
كان علي أن أدرس هذا ، وكذلك آخر مرة ظهر فيها مثل هذا الموضوع. هذه واحدة من تلك الأشياء التي
تعرفها ولكنك لا تتذكرها. عند استخدام mod ، قم بقسمة رقم على آخر وأخذ الباقي. لذا:
5 mod 2 ستكون 1 ، لأن 5/2 = 2 مع الباقي من 1.
يعني مصطلح mod عملية
modulo ، مع الوحدة 2 في هذه الحالة. تستخدم معظم لغات البرمجة
%
للإشارة إلى مثل هذه العملية:
5 % 2 = 1
.
هذا هو المكان الذي ندخل فيه المنطقة الرمادية الغريبة.
رياضيات القرص
أتذكر كيف علمت هذا في المدرسة ، ثم نسيت. هناك نوع من الرياضيات يسمى "الحساب المعياري" الذي يتعامل مع الهياكل الدورية. أسهل طريقة لتخيل هذا هو الاتصال الهاتفي بدورة 12. بالنسبة للرياضي ، فإن الاتصال الهاتفي هو
mod 12
. إذا كنت ترغب في فهم ما إذا كان من الممكن تقسيم 253 ساعة بالتساوي إلى أيام ، فيمكنك تطبيق العملية
253 mod 24
،
وستكون النتيجة 13 ، لذا فإن الإجابة هي لا! لا يمكننا الإجابة بنعم إلا إذا كانت النتيجة 0.
سؤال آخر يمكنك طرحه هو: "إذا غادرت في الساعة 6 مساءً ، فما هو الوقت الذي سيصل عند الوصول في 16 ساعة؟" سيكون هذا
6 + 16 mod 12
، أي 10.
يحب المبرمجون
mod
، لأنه عند استخدامه مع أعداد كبيرة حقًا ، يمكنك إنشاء شيء يعرف باسم "الوظائف أحادية الاتجاه". هذه وظائف خاصة تجعل من السهل حساب شيء ما في اتجاه واحد ، ولكن ليس في الاتجاه المعاكس.
إذا أخبرتك أن 9 هي نتيجة التربيع ، يمكنك بسهولة تحديد ما كان الإدخال 3. قبل أن ترى العملية بأكملها من البداية إلى النهاية. إذا قلت أن 9 هي نتيجة
mod 29
، فسيكون من الصعب فهم ماهية المدخلات.
يحب المبرمجون هذه الفكرة لأنه يمكنهم استخدام القسمة المتبقية مع الأعدادات العملاقة لإنشاء مفاتيح التشفير. هذه قصة مختلفة تمامًا: إذا كنت تريد أن تقرأ عنها ، يمكنك شراء كتاب أو ، أفضل من ذلك ،
دعم جهودي لكتابته .
ومع ذلك ، فإننا لن نحيد عن الموضوع.
بقايا وحساب الطلب
الآن دعونا نصل إلى النقطة: modulo والبقية البسيطة هي نفسها عندما تكون الأرقام موجبة ، ولكنها تختلف في حالة الأرقام السالبة.
خذ بعين الاعتبار المهمة التالية:
const x = 19 % 12; console.log(x);
ما هي قيمة
x
؟ قسّم الأرقام واحصل على 7 كباقي 12. هذه هي الإجابة الصحيحة. ماذا عن هذا:
const y = 19 % -12; console.log(y);
باستخدام الرياضيات العادية ، يمكننا ضرب -12 في -1 ، مما يعطي 12 ، ولا يزال لدينا 7 ، لذا فإن إجابتنا هي 7 مرة أخرى.
توافق جافا سكريبت مع هذا:

يوافق C # أيضًا:

توافق Google على العبارة الأولى ، لكنها لا توافق على العبارة الثانية:

يوافق روبي مع Google:
باسم ديكسترا ، ما الذي يحدث هنا؟قبل ساعات
للإجابة على السؤال ، عليك أن تفهم الفرق بين
الباقي والموديل .
يجمع المبرمجون بين هذه العمليات ، لكن لا يجب أن يفعلوا ذلك ، لأنهم يعطون نفس النتيجة فقط إذا كانت المقسوم (في حالتنا 12) إيجابية. يمكنك بسهولة إرسال الخلل إلى الإنتاج إذا كان المقسوم سالبًا.
لكن لماذا يوجد فرق؟ خذ بعين الاعتبار الحاجز الإيجابي
19 mod 12
على مدار الساعة:

النتيجة النهائية 7. نحن نعرف ذلك ويمكننا إثباته رياضيا. ولكن ماذا عن
19 mod -12
؟
هنا تحتاج إلى استخدام ساعات أخرى :

الوحدة هي -12 ، ولا يمكننا تجاهلها أو تغييرها عن طريق الضرب في -1 ، لأن الحساب المعياري لا يعمل بهذه الطريقة. الطريقة الوحيدة لحساب النتيجة بشكل صحيح هي إعادة ترتيب العلامات على الساعة بحيث ننتقل من -12 أو ندير الساعة عكس اتجاه عقارب الساعة ، مما يعطي نفس النتيجة.
لماذا لا تبدأ العلامات بـ -1 ، والانتقال إلى -2 ، وما إلى ذلك؟
لأنه في هذه الحالة ، سنعود ونخفض النتيجة باستمرار حتى نصل إلى -12 ، وفي هذه اللحظة سنقوم بقفزة +12 ، ولا يعمل modulo بهذه الطريقة.
هذا شيء مشهور
قبل أن تتصل بي بالجنون وتبدأ في البحث في موضوع ما:
هذه حقيقة معروفة . في الواقع ، ذهب MDN (شبكة مطوري Mozilla) إلى حد استدعاء
%
العملية المتبقية ، وليس modulo:
يُرجع عامل الباقي ما تبقى من قسمة معامل على آخر. إنه يقبل دائمًا علامة الأرباح .
إليك ما يقوله Eric Lippert ، أحد آلهة C # ،
حول modulo في C # :
ومع ذلك ، هذا ليس على الإطلاق ما يفعله عامل٪ بالفعل في C #. عامل٪ ليس عامل معامل أساسي ، بل هو عامل الباقي.
ماذا عن لغتك؟
اذن ماذا؟
أستطيع أن أفهم ما إذا كنت قد قرأت هذا الآن ، وتخدش رأسك الآن وتتساءل عما إذا كان الأمر يستحق القلق. أعتقد أنه يكلف لسببين:
- يمكنني أن أتخيل كيف سيفاجئني هذا السؤال في مقابلة.
- يمكنني أن أتخيل كيف يدخل هذا المنتج في الإنتاج ، وسيكتشف المطورون لعدة ساعات لماذا لا تعمل الرياضيات.
هذه أيضًا حقيقة ممتعة في حالة حضور صديقك المبرمج المتحذلق.