fn operate_with_self<T: IsUnsignedInteger>(&self, mut exponent: T) -> Self {
        let mut result = Self::neutral_element();
        let mut base = self.clone();

        while exponent != T::from(0) {
            if exponent & T::from(1) == T::from(1) {
                result = Self::operate_with(&result, &base);
            }
            exponent >>= 1;
            base = Self::operate_with(&base, &base);
        }
        result
    }
Applies the group operation `times` times with itself
The operation can be addition or multiplication depending on
the notation of the particular group.
crates/math/src/cyclic_group.rs