Cairo में आपको जिन मुख्य कॉन्सेप्ट से मिलना होगा, उनमें एक है felt252 टाइप, जिसे फील्ड एलिमेंट भी कहा जाता है।
यह टाइप एक बड़ी अभाज्य संख्या $P$ से तय की गई एक निश्चित सीमा के भीतर पूर्णांकों को दर्शाता है।
इस अभ्यास में आप पूरी तरह felt252 टाइप के साथ ही काम करेंगे, जो Cairo प्रोग्रामिंग का एक ज़रूरी हिस्सा है।
Cairo में felt252 एक स्केलर टाइप है, जिसका उपयोग 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)$।इस अभ्यास में आप एक क्रिप्टोग्राफर की मदद करेंगे, जो एक सुरक्षित संचार सिस्टम को संभालता और जाँचता है।
यह सिस्टम मुख्य रूप से फील्ड एलिमेंट पर निर्भर करता है, खास तौर पर Cairo के felt252 टाइप पर। इसका उद्देश्य यह सुनिश्चित करना है कि सभी अंकगणितीय क्रियाएँ एक तय सीमा के अंदर ही रहें।
दो एन्क्रिप्टेड संदेशों को जोड़कर एक संयुक्त संदेश बनाना है। हर संदेश felt252 के रूप में दिया गया है।
लेकिन एन्क्रिप्शन की वजह से, जो नतीजा अधिकतम वैल्यू $P - 1$ से आगे चला जाए, उसे modulo $P$ की मदद से मोड़कर वापस लाना पड़ता है।
एक फंक्शन बनाइए जो दो felt252 वैल्यू लेता है और उनका जोड़ लौटाता है, और यह पक्का करता है कि नतीजा वैध सीमा के अंदर ही रहे:
add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789
ध्यान दें: रिटर्न वैल्यू एक
felt252होनी चाहिए।
कभी-कभी मूल डेटा निकालने के लिए संदेशों को घटाना पड़ता है।
अगर घटाने का नतीजा ऋणात्मक आता है, तो सिस्टम उसमें $P$ जोड़कर उसे अपने आप ठीक कर देता है, ताकि वह फिर से एक वैध felt252 वैल्यू की सीमा में आ जाए।
एक फंक्शन बनाइए जो दो felt252 वैल्यू लेता है और उनका अंतर लौटाता है, और यह पक्का करता है कि नतीजा वैध सीमा के अंदर ही रहे:
subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949
ध्यान दें: रिटर्न वैल्यू एक
felt252होनी चाहिए।
एन्क्रिप्टेड डेटा की अखंडता बनाए रखने के लिए क्रिप्टोग्राफिक सिस्टम अक्सर दो संदेशों (felt252) का गुणा करता है, ताकि उनका गुणनफल एक वैध सीमा के अंदर रहे।
नतीजे की गणना modulo $P$ से करनी होती है, ताकि वह वैध सीमा में ही रहे।
एक फंक्शन बनाइए जो दो felt252 वैल्यू लेता है और उनका गुणनफल लौटाता है, और यह पक्का करता है कि नतीजा वैध सीमा के अंदर ही रहे:
multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789
ध्यान दें: रिटर्न वैल्यू एक
felt252होनी चाहिए।
Exercism पर साइन अप कीजिए और Cairo को 25 कॉन्सेप्ट68 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।