Вы могли бы сначала проверить , что медленно. Например, ваш основной расчет очень, очень медленный. Для каждого числа n
вы пытаетесь разделить n
на каждое число от 5 до sqrt(n)
, пропуская кратные числа 2 и 3. Не только вы не пропускаете числа, которые, как вы уже знаете, не являются простыми числами, но даже если вы исправить это, сложность этого алгоритма намного хуже , чем традиционное сито Эратосфена. Смотрите одну реализацию Scala для Sieve здесь .
Это не означает, что остальная часть вашего кода также не является оптимальной, но я оставлю это для других.
EDIT
Действительно, индексированный доступ к Stream
ужасен. Вот перезапись, которая работает с Stream
, вместо преобразования всего в Array
. Также обратите внимание на замечание перед первым if
о возможной ошибке в вашем коде.
@tailrec def decomposeToPrimeNumbersInternal(number: Int, primes: Stream[Int],
factors: List[Int] = List.empty[Int]): List[Int] = {
val primeNumber = primes.head
// Comparing primeNumberIndex with sqrtOfNumber didn't make any sense
if (primeNumber > sqrtOfNumber)
factors
else if (number % primeNumber == 0)
decomposeToPrimeNumbersInternal(number / primeNumber, primes, factors :+ primeNumber)
else
decomposeToPrimeNumbersInternal(number, primes.tail, factors)
}