Resíduos quadráticos módulo um número primo

Rust Medium math

Tarefa «Resíduos quadráticos módulo um número primo»

Dado um número primo p (p > 2) e um número inteiro a (0 ≤ a < p). É necessário determinar se a é um resíduo quadrático módulo p, ou seja, se existe um inteiro x tal que x^2 ≡ a (mod p). Se a for um resíduo quadrático, imprima qualquer x (0 ≤ x < p). Caso contrário, imprima -1. Use o símbolo de Legendre e o algoritmo de Tonelli-Shanks ou busca exaustiva considerando as restrições.

Formato de Entrada

A primeira linha contém dois números inteiros: p (primo, 3 ≤ p ≤ 10^9) e a (0 ≤ a < p).

Formato de Saída

Imprima um número inteiro: x (0 ≤ x < p) tal que x^2 ≡ a (mod p), ou -1 se não houver solução.

Exemplos

Exemplo 1

ENTRADA
7 2
SAÍDA
4

Exemplo 2

ENTRADA
7 apple banana apple cherry banana apple date
SAÍDA
-1

Exemplo 3

ENTRADA
7 3
SAÍDA
-1

Exemplo 4

ENTRADA
4 aa a aaa a
SAÍDA
-1

Exemplo 5

ENTRADA
13 4
SAÍDA
11
main.rs