Э-э, прежде чем вы начнете думать о параллельных реализациях, я бы предложил немного оптимизировать алгоритм.Помимо 2 каждое простое число нечетное, поэтому сделайте 2 специальным случаем, а затем начните с 3 с вашего цикла и увеличьте коэффициент на 2. Затем вместо вычисления числа / фактора каждый конец цикла (что также делает оптимизацию для JIT более сложной, я думаю) просто вычислите Sqrt (N) один раз - ведь мы знаем, что у каждого числа может быть только один простой множитель> sqrt (N);)
Если бы вы сделали это, я бы изменил сигнатуру вашего метода так, чтобыВы не всегда начинаете с 3 и работаете до Sqrt (N), но задаете начальный и конечный диапазоны.Простейшим решением было бы разделить диапазон от 3-Sqrt (N) на K частей, где K - количество доступных ядер (так как это не очень сбалансировано, использование меньших частей может дать вам лучшую балансировку нагрузки) и бросить это впалач службы.Затем вам нужно просто собрать все результаты и создать один список из всех меньших списков.
Просто отметьте, что этот простой подход больше работает для BigIntegers, поскольку вы всегда вычисляете значения по начальному числу, а сложность каждого алгоритма деления где-то зависит от размера в битах - вы также можете решить это, если, например, используете меньшее заданиеразмеры и синхронизация между ними.
PS: обратите внимание, что ваш алгоритм разделения диапазона по-прежнему должен правильно обрабатывать случаи 2 и sqrt (n).
PPS: И я надеюсь, что вы знаете, чтоэта проблема в NP, и вы делаете это только для того, чтобы немного узнать о параллелизме.