eratostene_sieve 0.0.2.alpha → 0.0.3.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|