Em Cairo, um dos conceitos centrais que você vai encontrar é o tipo felt252, também conhecido como elemento de corpo.
Esse tipo representa inteiros dentro de um intervalo específico definido por um número primo grande $P$.
Neste exercício, você vai trabalhar exclusivamente com o tipo felt252, que é uma parte essencial da programação em Cairo.
O tipo felt252 em Cairo é um tipo escalar usado para representar inteiros de 0 até $P - 1$, onde $P$ é um número primo grande, atualmente definido como $( 2^{251} + 17 \cdot 2^{192} + 1 )$.
Esse tipo garante que todas as operações aritméticas sejam realizadas módulo $P$, o que o torna diferente dos tipos de inteiro padrão que você pode encontrar em outras linguagens de programação.
Cairo oferece suporte a operações aritméticas básicas com valores felt252:
+): soma dois valores felt252.
Se o resultado ultrapassar $P$, ele é reduzido módulo $P$.-): subtrai um valor felt252 de outro.
Se o resultado for negativo, ele é ajustado para permanecer no intervalo somando um múltiplo de $P$.*): multiplica dois valores felt252, com o resultado calculado módulo $P$./): divide um valor felt252 por outro, garantindo que o resultado satisfaça a equação $( \frac{x}{y} \cdot y = x \mod P)$.Neste exercício, você vai ajudar um criptógrafo a administrar e verificar um sistema de comunicação seguro.
O sistema depende bastante de elementos de corpo, especificamente do tipo felt252 em Cairo, para garantir que todas as operações aritméticas permaneçam dentro de um intervalo definido.
Duas mensagens criptografadas, cada uma representada por um felt252, precisam ser somadas para criar uma mensagem combinada.
No entanto, por causa da criptografia, qualquer resultado que ultrapasse o valor máximo $P - 1$ precisa dar a volta usando o módulo $P$.
Implemente uma função que recebe dois valores felt252 e retorna a soma deles, garantindo que o resultado permaneça dentro do intervalo válido:
add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789
Observação: O valor de retorno deve ser um
felt252.
Às vezes, mensagens precisam ser subtraídas para recuperar os dados originais.
Se o resultado da subtração for negativo, o sistema ajusta o resultado automaticamente somando $P$ para trazê-lo de volta ao intervalo de um valor felt252 válido.
Implemente uma função que recebe dois valores felt252 e retorna a diferença deles, garantindo que o resultado permaneça dentro do intervalo válido:
subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949
Observação: O valor de retorno deve ser um
felt252.
Para assegurar a integridade dos dados criptografados, o sistema criptográfico costuma multiplicar duas mensagens (felt252) para garantir que o produto delas permaneça dentro de um intervalo válido.
O resultado precisa ser calculado com o módulo $P$ para garantir que permaneça dentro do intervalo válido.
Implemente uma função que recebe dois valores felt252 e retorna o produto deles, garantindo que o resultado permaneça dentro do intervalo válido:
multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789
Observação: O valor de retorno deve ser um
felt252.
Crie sua conta no Exercism para aprender e dominar Cairo com 25 conceitos68 exercícios e mentoria humana de verdade, tudo de graça.