eratostene_sieve 0.0.2.alpha → 0.0.3.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +16 -5
- data/lib/eratostene_sieve/version.rb +1 -1
- data/lib/eratostene_sieve.rb +23 -8
- data/spec/eratostene_sieve_spec.rb +37 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0968ea56db9e0e5e32a726c2faf90326d9c780d9
|
4
|
+
data.tar.gz: bab8a48045c05cb77de647297d3b84f67ba8aee6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5d7e505f928f970759e7671617e2bbd3e4689b57ebc2df879e3e2f638a58c9ee78372f29e425d67e30301b4df5131a2bfe01ae25bfa96ef8b76ab13977eed0b
|
7
|
+
data.tar.gz: ee3e9b34b08b2e9f8e0ac4ceb7edb8e27a46ec08534ae7b8f0641835937a10c68ddb5d95822fd67f997b04e354291f2fb3cd2acb8274782f41c4c5231542d323
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -4,10 +4,17 @@ This gem provides you a set of minimal utility functions to manage prime numbers
|
|
4
4
|
|
5
5
|
## Changelog
|
6
6
|
|
7
|
-
- **
|
7
|
+
- **0.0.3**:
|
8
|
+
|
9
|
+
- Renames .prime_serie into .enumerator.
|
10
|
+
- Adds .serie class method.
|
11
|
+
|
12
|
+
- **0.0.2**: Fix .prime_serie.
|
13
|
+
|
14
|
+
- **0.0.1**: initial release. It provides just these class functions:
|
8
15
|
|
9
16
|
- `nth_prime(n)` : retun the nth prime number.
|
10
|
-
- `
|
17
|
+
- `enumerator` : return an enumerator over the prime serie.
|
11
18
|
|
12
19
|
## Installation
|
13
20
|
|
@@ -34,11 +41,15 @@ Or install it yourself as:
|
|
34
41
|
# nth_prime(n) example
|
35
42
|
EratosterneSieve.nth_prime(10) # => 29
|
36
43
|
|
37
|
-
#
|
38
|
-
enumerator = EratosteneSieve.
|
44
|
+
# enumerator example
|
45
|
+
enumerator = EratosteneSieve.enumerator
|
39
46
|
serie = []
|
40
47
|
(0..9).each { |i| serie << enumerator.next }
|
41
|
-
puts serie # => [
|
48
|
+
puts serie # => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
49
|
+
|
50
|
+
# serie example
|
51
|
+
serie = EratosteneSieve.serie(:from => 1, :up_to => 10)
|
52
|
+
puts serie # => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
42
53
|
|
43
54
|
## Contributing
|
44
55
|
|
data/lib/eratostene_sieve.rb
CHANGED
@@ -3,13 +3,13 @@ require 'eratostene_sieve/railtie' if defined? Rails
|
|
3
3
|
|
4
4
|
# Utility to get:
|
5
5
|
# - nth_prime(n): the nth prime number.
|
6
|
-
# -
|
6
|
+
# - enumerator: an enumerator on prime number serie.
|
7
7
|
module EratosteneSieve
|
8
8
|
Inf = 1.0 / 0.0
|
9
9
|
|
10
10
|
def self.nth_prime(index)
|
11
|
-
return first_primes[index] if index
|
12
|
-
counter = first_primes.size
|
11
|
+
return first_primes[index - 1] if index <= first_primes.size
|
12
|
+
counter = first_primes.size
|
13
13
|
((first_primes.last + 2)..Inf).step(2) do |candidate|
|
14
14
|
(2..((candidate**0.5).to_i)).each do |m|
|
15
15
|
break if candidate % m == 0
|
@@ -19,11 +19,11 @@ module EratosteneSieve
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def self.
|
22
|
+
def self.enumerator
|
23
23
|
Enumerator.new do |y|
|
24
|
-
a =
|
25
|
-
b =
|
26
|
-
index =
|
24
|
+
a = 2
|
25
|
+
b = 3
|
26
|
+
index = 3
|
27
27
|
loop do
|
28
28
|
y << a
|
29
29
|
a, b = b, nth_prime(index)
|
@@ -32,9 +32,24 @@ module EratosteneSieve
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
def self.serie(options = {})
|
36
|
+
from = options[:from] || 1
|
37
|
+
up_to = options[:up_to] || 10
|
38
|
+
fail "from option must be an integer, given #{from}." unless from.is_a?(Integer)
|
39
|
+
fail "up_to option must be an integer, given #{up_to}." unless up_to.is_a?(Integer)
|
40
|
+
fail "from option must be > 0, given #{from}." if from < 1
|
41
|
+
serie = []
|
42
|
+
enumerator = EratosteneSieve.enumerator
|
43
|
+
lowest_index = from < up_to ? from : up_to
|
44
|
+
(lowest_index - 1).times { enumerator.next }
|
45
|
+
((from - up_to).abs + 1).times { serie << enumerator.next }
|
46
|
+
serie.reverse! if from > up_to
|
47
|
+
serie
|
48
|
+
end
|
49
|
+
|
35
50
|
private
|
36
51
|
|
37
52
|
def self.first_primes
|
38
|
-
@first_primes ||= [
|
53
|
+
@first_primes ||= [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
|
39
54
|
end
|
40
55
|
end
|
@@ -16,12 +16,46 @@ describe EratosteneSieve do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
describe '.
|
19
|
+
describe '.enumerator' do
|
20
20
|
it 'should return ' do
|
21
|
-
enumerator = EratosteneSieve.
|
21
|
+
enumerator = EratosteneSieve.enumerator
|
22
22
|
serie = []
|
23
23
|
(0..9).each { |i| serie << enumerator.next }
|
24
|
-
serie.should == [
|
24
|
+
serie.should == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '.serie' do
|
29
|
+
it 'should return the first 10 primes if no argument is given' do
|
30
|
+
serie = EratosteneSieve.serie
|
31
|
+
serie.should == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should return the serie of primes from x to y if :from => x, :up_to => y options are given' do
|
35
|
+
serie = EratosteneSieve.serie(:from => 5, :up_to => 10)
|
36
|
+
serie.should == [11, 13, 17, 19, 23, 29]
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should fail if :from is not an Integer' do
|
40
|
+
lambda{
|
41
|
+
EratosteneSieve.serie(:from => 'a', :up_to => 10)
|
42
|
+
}.should raise_error
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should fail if :up_to is not an Integer' do
|
46
|
+
lambda{
|
47
|
+
EratosteneSieve.serie(:from => 1, :up_to => :error)
|
48
|
+
}.should raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should fail if :from < 1' do
|
52
|
+
lambda{
|
53
|
+
EratosteneSieve.serie(:from => 0, :up_to => 10)
|
54
|
+
}.should raise_error
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should give a reversed array of the serie if :from > :up_to' do
|
58
|
+
EratosteneSieve.serie(:from => 10, :up_to => 1).should == EratosteneSieve.serie(:from => 1, :up_to => 10).reverse
|
25
59
|
end
|
26
60
|
end
|
27
61
|
end
|