在 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型別,以確保所有算術運算都維持在定義好的範圍內。
2 則加密訊息,各自以felt252表示,需要相加成一則合併的訊息。
不過因為加密的關係,任何超過最大值$P - 1$的結果,都必須以取模$P$的方式繞回。
實作一個函式,接受 2 個felt252值並回傳它們的總和,同時確保結果維持在有效範圍內:
add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789
注意: 回傳值應該是
felt252。
有時候,訊息需要相減才能取回原始資料。
如果相減的結果是負數,系統會自動加上$P$來調整結果,讓它回到有效felt252值的範圍內。
實作一個函式,接受 2 個felt252值並回傳它們的差,同時確保結果維持在有效範圍內:
subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949
注意: 回傳值應該是
felt252。
為了確保加密資料的完整性,這套密碼系統經常會將 2 則訊息(felt252)相乘,以確保它們的乘積維持在有效範圍內。
結果必須以取模$P$的方式計算,才能確保它維持在有效範圍內。
實作一個函式,接受 2 個felt252值並回傳它們的乘積,同時確保結果維持在有效範圍內:
multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789
注意: 回傳值應該是
felt252。