Comment #0 by bearophile_hugs — 2013-05-03T16:41:41Z
I suggest to add a product() function to Phobos, similar to sum().
This benchnarking code shows an algorithm better than the naive one when it's used on bigints:
import std.stdio, std.bigint, std.algorithm, std.random;
T product1(T)(T[] seq) {
typeof(return) result = 1;
foreach (s; seq)
result *= s;
return result;
}
T product2(T)(T[] seq) { // faster
if (seq.length < 50) {
typeof(return) result = 1;
foreach (s; seq)
result *= s;
return result;
} else {
immutable mid = seq.length / 2;
return product2(seq[0 .. mid]) * product2(seq[mid .. $]);
}
}
void main() {
BigInt[2 ^^ 16] items;
foreach (i, ref b; items)
b = i + 1;
items[].randomShuffle;
//auto r = items.product1;
auto r = items.product2;
//r.writeln;
}
What about T == InputRange?
Comment #1 by robert.schadek — 2024-12-01T16:17:27Z