diff --git a/src/mpz.rs b/src/mpz.rs index 6226744..96d2421 100644 --- a/src/mpz.rs +++ b/src/mpz.rs @@ -95,6 +95,7 @@ extern "C" { fn __gmpz_millerrabin(n: mpz_srcptr, reps: c_int) -> c_int; fn __gmpz_urandomb(rop: mpz_ptr, state: gmp_randstate_t, n: mp_bitcnt_t); fn __gmpz_urandomm(rop: mpz_ptr, state: gmp_randstate_t, n: mpz_srcptr); + fn __gmpz_perfect_square_p(op: mpz_srcptr) -> c_int; } pub struct Mpz { @@ -450,6 +451,12 @@ impl Mpz { pub fn is_zero(&self) -> bool { self.mpz._mp_size == 0 } + + pub fn is_square(&self) -> bool { + unsafe { + __gmpz_perfect_square_p(&self.mpz) != 0 + } + } } #[derive(Debug)] diff --git a/src/test.rs b/src/test.rs index 3af1382..2d06bbd 100644 --- a/src/test.rs +++ b/src/test.rs @@ -570,6 +570,15 @@ mod mpz { assert_eq!(five.sign(), Sign::Positive); assert_eq!(minus_five.sign(), Sign::Negative); } + + #[test] + fn test_is_square() { + let three: Mpz = From::::from(3); + let four: Mpz = From::::from(4); + + assert_eq!(three.is_square(), false); + assert_eq!(four.is_square(), true); + } } mod rand {