The reason that I want the second one (with references) is to avoid a bunch of call to clone. I tried to add a where clause to my trait, but I have lifetime problem with the references.
You need to declare a lifetime, like you would on a function declaration with explicit lifetimes. Inside of where clauses, this is done with the for keyword:
where for<'a> &'a Self: Mul<&'a Self, Output = Self>
No; the compiler is currently capable of “elaborating” trait bounds of the “supertrait” form Self: Mul... but not anything without plain Self on the left side, like &Self: Mul....