Skip to content

Commit 86f9069

Browse files
author
Ary Borenszweig
committed
Add implementation in Crystal
1 parent db8ef30 commit 86f9069

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

crystal/sieve.cr

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
class Natural
2+
@cnt = 1
3+
4+
def next
5+
@cnt += 1
6+
end
7+
end
8+
9+
class Filter
10+
getter number
11+
property! next : Filter
12+
property! last : Filter
13+
14+
def initialize(@number : Int32)
15+
@last = self
16+
end
17+
18+
def accept_and_add(n)
19+
filter = self
20+
upto = Math.sqrt(n)
21+
loop do
22+
if n.divisible_by?(filter.number)
23+
return false
24+
end
25+
if filter.number > upto
26+
new_filter = Filter.new(n)
27+
last.next = new_filter
28+
@last = new_filter
29+
return true
30+
end
31+
filter = filter.next
32+
end
33+
end
34+
end
35+
36+
class Primes
37+
@natural = Natural.new
38+
39+
def next
40+
loop do
41+
n = @natural.next
42+
filter = @filter
43+
unless filter
44+
@filter = Filter.new(n)
45+
return n
46+
end
47+
if filter.accept_and_add(n)
48+
return n
49+
end
50+
end
51+
end
52+
53+
def compute
54+
start = Time.now
55+
cnt = 0
56+
prnt_cnt = 97
57+
res = 0
58+
loop do
59+
res = self.next
60+
cnt += 1
61+
62+
if cnt.divisible_by?(prnt_cnt)
63+
took = Time.now - start
64+
puts "Computed #{cnt} primes in #{took.milliseconds} ms. Last one is #{res}"
65+
prnt_cnt *= 2
66+
end
67+
break if cnt >= 100000
68+
end
69+
res
70+
end
71+
end
72+
73+
loop do
74+
p = Primes.new
75+
time = Time.now
76+
p.compute
77+
took = Time.now - time
78+
puts "Hundred thousand primes computed in #{took.milliseconds}ms"
79+
end

0 commit comments

Comments
 (0)