在 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值中减去另一个felt252值。
如果结果为负数,就通过加上 $P$ 的倍数来调整,使其保持在范围内。*):将两个felt252值相乘,结果对 $P$ 求模。/):用一个felt252值除以另一个felt252值,确保结果满足等式 $( \frac{x}{y} \cdot y = x \mod P)$。在这一练习中,你将协助一位密码学家管理和验证一套安全通信系统。
该系统高度依赖域元素,具体来说是 Cairo 里的felt252类型,以确保所有算术运算都保持在规定的范围内。
两条加密消息各自用一个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。