A Cairo nyelvben az egyik alapvető fogalom, amellyel találkozni fogsz, a felt252 típus, más néven testelem.
Ez a típus egy nagy $P$ prímszám által meghatározott tartományba eső egészeket reprezentál.
Ebben a feladatban kizárólag a felt252 típussal fogsz dolgozni, amely a Cairo programozás lényeges eleme.
A Cairo nyelvben a felt252 egy skalártípus, amellyel 0-tól $P - 1$-ig terjedő egészeket reprezentálunk, ahol $P$ egy nagy prímszám, amelynek jelenlegi értéke $( 2^{251} + 17 \cdot 2^{192} + 1 )$.
Ez a típus biztosítja, hogy minden aritmetikai művelet modulo $P$ történjen, ami megkülönbözteti a más programozási nyelvekben megszokott szabványos egésztípusoktól.
A Cairo támogatja a felt252 értékeken végzett alapvető aritmetikai műveleteket:
+): Két felt252 értéket ad össze.
Ha az eredmény meghaladja $P$ értékét, akkor modulo $P$ csökken.-): Kivon egy felt252 értéket egy másikból.
Ha az eredmény negatív, akkor $P$ egy többszörösének hozzáadásával a tartományon belülre igazítja.*): Összeszoroz két felt252 értéket, az eredményt pedig modulo $P$ számítja ki./): Eloszt egy felt252 értéket egy másikkal, ügyelve arra, hogy az eredmény kielégítse a $( \frac{x}{y} \cdot y = x \mod P)$ egyenletet.Ebben a feladatban egy kriptográfusnak segítesz egy biztonságos kommunikációs rendszer kezelésében és ellenőrzésében.
A rendszer nagy mértékben támaszkodik mezőelemekre, pontosabban a Cairo felt252 típusára, hogy minden aritmetikai művelet egy meghatározott tartományon belül maradjon.
Két titkosított üzenetet, amelyek mindegyike felt252-ként van ábrázolva, össze kell adni, hogy egyesített üzenetet kapjunk.
A titkosítás miatt azonban minden olyan eredményt, amely meghaladja a maximális $P - 1$ értéket, a modulo $P$ művelettel kell a megengedett tartományba visszahozni.
Készíts egy függvényt, amely két felt252 értéket kap, és visszaadja az összegüket, biztosítva, hogy az eredmény az érvényes tartományon belül maradjon:
add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789
Megjegyzés: A visszatérési érték
felt252típusú legyen.
Néha az üzeneteket ki kell vonni egymásból, hogy visszanyerjük az eredeti adatokat.
Ha a kivonás eredménye negatív, a rendszer automatikusan hozzáad $P$-t az eredményhez, hogy visszahozza egy érvényes felt252 érték tartományába.
Készíts egy függvényt, amely két felt252 értéket kap, és visszaadja a különbségüket, biztosítva, hogy az eredmény az érvényes tartományon belül maradjon:
subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949
Megjegyzés: A visszatérési érték
felt252típusú legyen.
A titkosított adatok sértetlenségének biztosítása érdekében a kriptográfiai rendszer gyakran összeszoroz két üzenetet (felt252), hogy a szorzatuk érvényes tartományon belül maradjon.
Az eredményt modulo $P$ szerint kell kiszámítani, hogy az érvényes tartományon belül maradjon.
Készíts egy függvényt, amely két felt252 értéket kap, és visszaadja a szorzatukat, biztosítva, hogy az eredmény az érvényes tartományon belül maradjon:
multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789
Megjegyzés: A visszatérési érték
felt252típusú legyen.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Cairo nyelvet 25 fogalom68 feladat segítségével, valódi emberi mentorálással, mindez ingyen.