1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use crate::abstract_traits_2::{Monoid, Multiplicative};
pub trait Power<M: Monoid<S, T>, S = M, T = Multiplicative> {
fn pow(value: &S, exponent: usize) -> S {
if exponent == 0 {
return M::identity();
}
let mut y = Self::pow(value, exponent >> 1);
y = M::operate(&y, &y);
if exponent & 1 == 1 {
y = M::operate(&y, &value);
}
y
}
}
impl<M: Monoid<S, T>, S, T> Power<M, S, T> for M {}
// pub struct Mul;
// pub fn pow<T: abstract_traits::Monoid<Mul>>(x: &T, n: usize)
// -> T { if n == 0 {
// return T::identity();
// }
// let mut y = pow(x, n >> 1);
// y = T::operate(&y, &y);
// if n & 1 == 1 {
// y = T::operate(&y, &x);
// }
// y
// }
// pub struct Power<'a, T> {
// monoid: abstract_structs::Monoid<'a, T>,
// }
// impl<'a, T> Power<'a, T> {
// pub fn new(monoid: abstract_structs::Monoid<'a, T>) ->
// Self { Self { monoid }
// }
// pub fn r#do(&self, x: &T, n: usize) -> T {
// if n == 0 {
// return (self.monoid.identity)();
// }
// let mut y = self.r#do(x, n >> 1);
// y = (self.monoid.operate)(&y, &y);
// if n & 1 == 1 {
// y = (self.monoid.operate)(&y, &x);
// }
// y
// }
// }