Eratosthenes of Cyrene was a Greek mathematician, who discovered an amazing algorithm to find prime numbers.

This article performs this algorithm in Scala.

**Step 1** : Creating an Int Stream

`def` `numberStream(n` `:` `Int)` `:` ` ` `Stream[Int] ` `=` `Stream.from(n) ` ` ` `println(numberStream(` `10` `)) ` |

*chevron_right*

*filter_none*

Output of above step is **Stream(10, ?).**

**Step 2 :** Sieve of Eratosthenes function

`// Defining Sieve of Eratosthenes ` `def` `sieve` `_` `of` `_` `Eratosthenes(stream` `:` `Stream[Int])` `:` ` ` `Stream[Int] ` `=` `stream.head ` `#::` `sieve` `_` `of` `_` `Eratosthenes( ` ` ` `(stream.tail) ` ` ` `filter (x ` `=>` `x ` `%` `stream.head !` `=` `0` `) ` ` ` `) ` ` ` `println(sieve` `_` `of` `_` `Eratosthenes(numberStream(` `10` `))) ` |

*chevron_right*

*filter_none*

Output of above step is **Stream(10, ?)**.

**Step 3 : **Extracting “N” number of primes

`val` `no` `_` `of` `_` `primes ` `=` `sieve` `_` `of` `_` `Eratosthenes(numberStream(` `2` `)) ` ` ` `// Selecting number of primes ` `println(no` `_` `of` `_` `primes) ` `(no` `_` `of` `_` `primes take ` `7` `) foreach { ` ` ` `println(` `_` `) ` ` ` `} ` |

*chevron_right*

*filter_none*

Output of above step is **Stream(2, ?)
2
3
5
7
11
13
17**.

**Below is the complete program**

`def` `numberStream(n` `:` `Int)` `:` ` ` `Stream[Int] ` `=` `Stream.from(n) ` ` ` `println(numberStream(` `10` `)) ` ` ` `// Defining Sieve of Eratosthenes ` `def` `sieve` `_` `of` `_` `Eratosthenes(stream` `:` `Stream[Int])` `:` ` ` `Stream[Int] ` `=` `stream.head ` `#::` `sieve` `_` `of` `_` `Eratosthenes( ` ` ` `(stream.tail) ` ` ` `filter (x ` `=>` `x ` `%` `stream.head!` `=` `0` `) ` ` ` `) ` ` ` `println(sieve` `_` `of` `_` `Eratosthenes(numberStream(` `10` `))) ` ` ` ` ` `val` `no` `_` `of` `_` `primes ` `=` `sieve` `_` `of` `_` `Eratosthenes(numberStream(` `2` `)) ` ` ` `// Selecting number of primes ` `println(no` `_` `of` `_` `primes) ` `(no` `_` `of` `_` `primes take ` `7` `) foreach { ` ` ` `println(` `_` `) ` ` ` `} ` |

*chevron_right*

*filter_none*

**Output:**

Stream(10, ?) Stream(10, ?) Stream(2, ?) 2 3 5 7 11 13 17

**Insights from the code**

- Using
**stream.form(), a stream is created which is generating successive numbers. And this number starts off from the argument.** - A number stream is given to the
**“sieve_of_Eratosthenes”**method. This method by filtering out the elements, lazily generates the successive elements.

**Below is the complete working code with explanation: **

**Working:** *abc()* method inserts the debug statement in the **filter()** method. If an element is not evenly divisible by the head, the stream treats it as a good element. The code prints it and return true. Otherwise the filtered out sequence is printed and finally the stream is returned.

Some modification is done in **sieve_of_Eratosthenes** method so as to use the stream creation – **abc()** method. Elements are taken out from the recursive stream and is printed.

`object` `Sieve ` `extends` `App { ` ` ` `def` `abc(s` `:` `Stream[Int], head` `:` `Int) ` `=` `{ ` ` ` `val` `r ` `=` `s filter { ` ` ` `x ` `=>` `{ ` ` ` `if` `(x ` `%` `head !` `=` `0` `) { ` ` ` `println() ` ` ` `println(s` `"${x} is not evenly divisible by ${head}"` `) ` ` ` ` ` `true` ` ` `} ` ` ` `else` `{ ` ` ` `println() ` ` ` `println(s` `"${x} is evenly divisible by ${head}. So Discard ${x}"` `) ` ` ` `false` ` ` `} ` ` ` `} ` ` ` `} ` ` ` `r ` ` ` `} ` ` ` `def` `numberStream(g` `:` `Int)` `:` `Stream[Int] ` `=` `Stream.from(g) ` ` ` ` ` `def` `sieve` `_` `of` `_` `Eratosthenes(stream` `:` `Stream[Int])` `:` ` ` `Stream[Int] ` `=` `stream.head ` `#::` `sieve` `_` `of` `_` `Eratosthenes( ` ` ` `abc(stream.tail, stream.head)) ` ` ` ` ` `val` `no` `_` `of` `_` `primes ` `=` `sieve` `_` `of` `_` `Eratosthenes(numberStream(` `2` `)) ` ` ` `(no` `_` `of` `_` `primes take ` `7` `) foreach { ` ` ` `println(` `_` `) ` ` ` `} ` `} ` |

*chevron_right*

*filter_none*

**Output :**

2 3 is not evenly divisible by 2 3 4 is evenly divisible by 2. So Discard 4 5 is not evenly divisible by 2 5 is not evenly divisible by 3 5 6 is evenly divisible by 2. So Discard 6 7 is not evenly divisible by 2 7 is not evenly divisible by 3 7 is not evenly divisible by 5 7 8 is evenly divisible by 2. So Discard 8 9 is not evenly divisible by 2 9 is evenly divisible by 3. So Discard 9 10 is evenly divisible by 2. So Discard 10 11 is not evenly divisible by 2 11 is not evenly divisible by 3 11 is not evenly divisible by 5 11 is not evenly divisible by 7 11 12 is evenly divisible by 2. So Discard 12 13 is not evenly divisible by 2 13 is not evenly divisible by 3 13 is not evenly divisible by 5 13 is not evenly divisible by 7 13 is not evenly divisible by 11 13 14 is evenly divisible by 2. So Discard 14 15 is not evenly divisible by 2 15 is evenly divisible by 3. So Discard 15 16 is evenly divisible by 2. So Discard 16 17 is not evenly divisible by 2 17 is not evenly divisible by 3 17 is not evenly divisible by 5 17 is not evenly divisible by 7 17 is not evenly divisible by 11 17 is not evenly divisible by 13 17

## Recommended Posts:

- Scala Tutorial – Learn Scala with Step By Step Guide
- Scala short <(x: Short): Boolean
- Scala short <(x: Char): Boolean
- Scala Extractors
- Scala | Partially Applied functions
- Scala String indexOf(String str) method with example
- Scala String contentEquals() method with example
- Scala Keywords
- Scala Int /(x: Int) method with example
- Scala Int /(x: Short) method with example
- Program to print Java Set of characters in Scala
- Scala Map size() method with example
- Scala SortedMap addString() method with a start, a separator and an end with example
- Scala Iterator addString() method with example
- Scala String substring(int beginIndex, int endIndex) method with example
- Scala | Functions Call-by-Name
- Program to convert Java list to an iterator in Scala
- Scala Set &() method with example
- Scala | Type Inference
- Program to convert Java set of Shorts to an Indexed Sequence in Scala

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.