use crate::gaussian_rational::GaussianRational;
use malachite_base::num::arithmetic::traits::{Reciprocal, SquareAssign};
use malachite_base::num::basic::traits::One;
use malachite_base::num::logic::traits::{BitAccess, SignificantBits};
pub fn gaussian_rational_pow_binary(x: &GaussianRational, exp: u64) -> GaussianRational {
let mut power = GaussianRational::ONE;
for i in (0..exp.significant_bits()).rev() {
power.square_assign();
if exp.get_bit(i) {
power *= x;
}
}
power
}
pub fn gaussian_rational_pow_naive(x: &GaussianRational, exp: i64) -> GaussianRational {
let base = if exp < 0 { x.reciprocal() } else { x.clone() };
let mut power = GaussianRational::ONE;
for _ in 0..exp.unsigned_abs() {
power *= &base;
}
power
}