في Cairo، أحد المفاهيم الأساسية التي ستصادفها هو النوع felt252، المعروف أيضًا باسم عنصر حقل.
يمثل هذا النوع أعدادًا صحيحة ضمن نطاق محدد يحدده عدد أولي كبير $P$.
في هذا التمرين، ستتعامل حصرًا مع النوع felt252، وهو جزء أساسي من البرمجة بلغة Cairo.
النوع felt252 في Cairo هو نوع قياسي يُستخدم لتمثيل أعداد صحيحة من 0 حتى $P - 1$، حيث $P$ عدد أولي كبير قيمته الحالية $( 2^{251} + 17 \cdot 2^{192} + 1 )$.
يضمن هذا النوع أن تُجرى جميع العمليات الحسابية باحتساب باقي القسمة على $P$، مما يجعله مختلفًا عن أنواع الأعداد الصحيحة المعتادة التي قد تصادفها في لغات برمجة أخرى.
يوفر Cairo دعمًا للعمليات الحسابية الأساسية على قيم felt252:
+): يجمع قيمتَي felt252.
إذا تجاوزت النتيجة $P$، فيُختزل باحتساب باقي القسمة على $P$.-): يطرح قيمة felt252 من أخرى.
إذا كانت النتيجة سالبة، فيُعدَّل ليبقى ضمن النطاق بإضافة مضاعف من $P$.*): يضرب قيمتَي felt252، وتُحسب النتيجة باحتساب باقي القسمة على $P$./): يقسم قيمة felt252 على أخرى، بما يضمن أن النتيجة تحقق المعادلة $( \frac{x}{y} \cdot y = x \mod P)$.في هذا التمرين، ستساعد عالم تعمية في إدارة نظام اتصالات آمن والتحقق منه.
يعتمد هذا النظام بشكل كبير على عناصر الحقل، وتحديدًا النوع felt252 في Cairo، لضمان بقاء جميع العمليات الحسابية ضمن نطاق محدد.
هناك رسالتان مشفرتان، كل منهما ممثلة بنوع felt252، ويجب جمعهما معًا لتكوين رسالة مدمجة.
ولكن بسبب التشفير، فإن أي نتيجة تتجاوز القيمة العظمى $P - 1$ يجب أن تُلفّ باستخدام باقي القسمة على $P$.
نفّذ دالة تأخذ قيمتين من النوع felt252 وتُرجع مجموعهما، مع ضمان بقاء النتيجة ضمن النطاق الصالح:
add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789
ملاحظة: يجب أن تكون القيمة المُرجَعة من النوع
felt252.
أحيانًا، يجب طرح الرسائل لاستعادة البيانات الأصلية.
وإذا كانت نتيجة الطرح سالبة، يعدّل النظام النتيجة تلقائيًا بإضافة $P$ إليها لإعادتها إلى نطاق قيمة felt252 صالحة.
نفّذ دالة تأخذ قيمتين من النوع felt252 وتُرجع الفرق بينهما، مع ضمان بقاء النتيجة ضمن النطاق الصالح:
subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949
ملاحظة: يجب أن تكون القيمة المُرجَعة من النوع
felt252.
لضمان سلامة البيانات المشفرة، غالبًا ما يضرب النظام التعموي رسالتين (felt252) لضمان بقاء حاصل ضربهما ضمن نطاق صالح.
ويجب حساب النتيجة باستخدام باقي القسمة على $P$ لضمان بقائها ضمن النطاق الصالح.
نفّذ دالة تأخذ قيمتين من النوع felt252 وتُرجع حاصل ضربهما، مع ضمان بقاء النتيجة ضمن النطاق الصالح:
multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789
ملاحظة: يجب أن تكون القيمة المُرجَعة من النوع
felt252.
سجّل في Exercism لتتعلّم وتتقن Cairo عبر 25 مفهومًا68 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.