Stream Sieve

package Mathematics

object StreamSieve {

  private val allPrimes: LazyList[Int] = 2 #:: LazyList.from(3).filter { c =>
    val primesUpToSqrt = allPrimes.takeWhile(p => p <= math.sqrt(c.toDouble))
    !primesUpToSqrt.exists(p => c % p == 0)
  }

  /** Method to use the allPrimes stream to take the first n prime numbers Using streams is both an easy and
    * efficient way to generate fibonacci numbers (streams are memoized) Using streams as opposed to the classic
    * sieve ensures that we stay following functional principles and not change states
    */
  def getPrimeNumbers(n: Int): Seq[Int] = allPrimes.take(n)
}