Skip to content

Instantly share code, notes, and snippets.

@nobeh
Created February 5, 2012 14:53
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save nobeh/1745950 to your computer and use it in GitHub Desktop.
Prime sieves with Scala Actors
import scala.actors.Actor
case class sieve(n: Int)
case class finish(n: Int)
class Sieve(val p: Int) extends Actor {
var next: Sieve = null
def _sieve(n: Int) = {
if (isPrime(n)) {
if (next != null) {
next ! sieve(n)
} else {
next = new Sieve(n)
next.start
//println(n + " is prime")
}
}
}
private def isPrime(n: Int): Boolean = {
val d = n / p
val r = n - d * p
if (r != 0) true else false
}
def act = {
loop {
react {
case sieve(n: Int) => _sieve(n)
case finish(n: Int) => {
if (next != null) {
next ! finish(n)
} else {
val time = System.currentTimeMillis - Main.start
println(n + "," + time)
// System.exit(0)
}
}
}
}
}
}
object Generator {
def generate(n: Int): Unit = {
val p2 = new Sieve(2)
p2.start
for (i <- 3 to n) {
p2 ! sieve(i)
}
p2 ! finish(n)
}
}
object Main {
var start = System.currentTimeMillis
def main(args: Array[String]): Unit = {
for (i <- 1 to 10) {
start = System.currentTimeMillis
Generator.generate(i * 20000)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment