Skip to content

Instantly share code, notes, and snippets.

@rockneurotiko
Last active August 29, 2015 14:02
Show Gist options
  • Save rockneurotiko/e2490fd71be1de37015e to your computer and use it in GitHub Desktop.
Save rockneurotiko/e2490fd71be1de37015e to your computer and use it in GitHub Desktop.
Eratosthenes cribe in Scala and Python using tailrec
import scala.annotation.tailrec
object criba {
def basic_get_primes(n: Int): List[Int] = {
val primes = List.range(2, n+1)
var max = Math.sqrt(n).toInt
@tailrec
def tal_rec(now: Int, prim: List[Int]): List[Int] = {
if(now >= max) prim
else if(prim contains now)
tal_rec(now+1,prim.filter((x: Int) => {x%now != 0 || x==now}))
else tal_rec(now+1, prim)
}
tal_rec(2, primes)
}
def get_primes(n: Int): List[Int] = {
val primes = List.range(2, n+1)
var max = Math.sqrt(n).toInt
@tailrec
def tal_rec(now: Int, prim: List[Int]): List[Int] = {
val n = prim(now)
if(n >= max) prim
else tal_rec(now+1,prim.filter((x: Int) => {x%n != 0 || x==n}))
}
tal_rec(0, primes)
}
//Tests!
basic_get_primes(100)
get_primes(100)
assert(basic_get_primes(10) == List(2,3,5,7,9))
assert(get_primes(10) == List(2,3,5,7,9))
}
import time
def tail_rec(fun):
def tail(fun):
a = fun
while callable(a):
a = a()
return a
return (lambda x: tail(fun(x)))
def basic_get_primes_tlr(n):
primes = list(range(2,n))
max = int(n**(1/2))
def tal_rec(now, prim):
if now >= max:
return prim
if now in prim:
prim = list(filter(lambda x: x%now != 0 or x==now, prim))
return (lambda: tal_rec(now+1, prim))
return tal_rec(2, primes)
def get_primes_tlr(n):
primes = list(range(2,n))
max = int(n**(1/2))
def tal_rec(now, prim):
n=prim[now]
if n >= max:
return prim
return (lambda: tal_rec(now+1, list(filter(lambda x: x%n != 0 or x==n, prim))))
return tal_rec(0, primes)
def basic_get_primes(n):
primes = list(range(2,n))
max = int(n**(1/2))
def tal_rec(now, prim):
if now >= max:
return prim
if now in prim:
prim = list(filter(lambda x: x%now != 0 or x==now, prim))
return tal_rec(now+1, prim)
return tal_rec(2, primes)
def get_primes(n):
primes = list(range(2,n))
max = int(n**(1/2))
def tal_rec(now, prim):
n = prim[now]
if n >= max:
return prim
return tal_rec(now+1, list(filter(lambda x: x%n != 0 or x==n, prim)))
return tal_rec(0, primes)
if __name__ == '__main__':
f = time.time()
basic_get_primes(900000) #TailRec Optimized
f2 = time.time()
print("basic_get_primes: %f" % (f2 - f))
f = time.time()
get_primes(900000) #TailRec Optimized
f2 = time.time()
print("get_primes: %f" % (f2 - f))
f = time.time()
tail_rec(basic_get_primes_tlr)(900000) #TailRec Optimized
f2 = time.time()
print("basic_get_primes_tlr: %f" % (f2 - f))
f = time.time()
tail_rec(get_primes_tlr)(900000) #TailRec Optimized
f2 = time.time()
print("get_primes_tlr: %f" % (f2 - f))
#print(basic_get_primes(100)) #TailRec normal
#print(tail_rec(get_primes_tlr)(2000000)) #TailRec Optimized
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment