Function algebraic_equation_over_finite_prime_field::sqrt_over_mod_p [−][src]
pub fn sqrt_over_mod_p<T>(a: T, p: &T) -> Option<T> where
T: Sized + Clone + Eq + Zero + One + for<'x> DivAssign<&'x T> + for<'x> RemAssign<&'x T> + From<u8> + SampleUniform,
for<'x> &'x T: Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T> + Rem<Output = T>,
Expand description
Solve: $x^2 ≡ a \pmod p
$
Requires: a is non-negative integer. p is prime.
If equation has at least one root, this function returns Some(x)
. x
is a root.
If equation has no root, this function returns None
.
use algebraic_equation_over_finite_prime_field::sqrt_over_mod_p;
// two roots
let x = sqrt_over_mod_p::<i32>(5, &11).unwrap();
assert!(x == 4 || x == 7);
let x = sqrt_over_mod_p::<i32>(2, &7).unwrap();
assert!(x == 3 || x == 4);
let x = sqrt_over_mod_p::<i32>(3, &13).unwrap();
assert!(x == 4 || x == 9);
let x = sqrt_over_mod_p::<i32>(8, &17).unwrap();
assert!(x == 5 || x == 12);
// one root
assert_eq!(sqrt_over_mod_p::<i32>(0, &3), Some(0));
// no root
assert_eq!(sqrt_over_mod_p::<i32>(2, &3), None);