File tree Expand file tree Collapse file tree 1 file changed +79
-0
lines changed Expand file tree Collapse file tree 1 file changed +79
-0
lines changed Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments