Спасибо за ответы!Я кэшировал факториалы с помощью простого цикла for
и получил хорошие результаты для другого вычисления:
1 thread = 17ms
2 threads = 10ms
4 threads = 7ms
Однако мне нужно нарисовать диаграмму, аналогичную приведенной ниже, и это будет возможно только в том случае, если яиспользовать потоки для вычисления факториала.

Я проверил этот алгоритм n!
:
public BigDecimal calculate(int number) {
if (number == 0 || number == 1) {
return BigDecimal.ONE;
}
List<Callable<BigDecimal>> callables = new ArrayList<>();
int step = number / processors;
for (int i = 2; i <= number; i += step + 1) {
callables.add(new FactorialPartCalculator(i, i + step >= number ? number : i + step));
}
List<Future<BigDecimal>> futures = executor.invokeAll(callables);
BigDecimal result = BigDecimal.ONE;
for (Future<BigDecimal> future : futures) {
result = result.multiply(future.get());
}
return result;
}
public class FactorialPartCalculator implements Callable<BigDecimal> {
@Override
public BigDecimal call() throws Exception {
BigDecimal factorialPart = BigDecimal.ONE;
for (int i = start; i <= end; i++) {
factorialPart = factorialPart.multiply(BigDecimal.valueOf(i));
}
return factorialPart;
}
Я получил ускорение в 6,4 разас 6 нитками для 20000!
.Поэтому мне нужно кэшировать факториалы и включить процесс кэширования в общее время.Программа будет протестирована на 32 процессорах, и я должен получить как можно большее ускорение
Поэтому мой вопрос заключается в том, как изменить алгоритм, описанный выше, для хранения всех факториалов в массиве?Мне нужны только нечетные факториалы, если это может помочь.