public static M Sum <M>(this IAdditiveMonoid <M> g, IEnumerable <M> source) { var sum = g.Zero(); foreach (var value in source) { sum = g.Add(sum, value); } return(sum); }
//For this definition one should usually assume that IAdditiveMonoid<M> is abelian public static M ScalarMult <M>(this IAdditiveMonoid <M> g, int n, M a) { if (n < 0) { throw new ArgumentException($"n={n} < 0!"); } var res = g.Zero(); for (var i = 0; i < n; i++) { res = g.Add(res, a); } return(res); }