prime-numbers 0.0.1
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.
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +24 -0
- data/LICENSE +22 -0
- data/README.md +50 -0
- data/Rakefile +2 -0
- data/lib/prime-numbers.rb +32 -0
- data/lib/prime-numbers/algorithms/algorithm.rb +15 -0
- data/lib/prime-numbers/algorithms/one_liner.rb +15 -0
- data/lib/prime-numbers/algorithms/sieve_of_eratosthenes.rb +36 -0
- data/lib/prime-numbers/errors/range_boundary_exception.rb +2 -0
- data/lib/prime-numbers/version.rb +3 -0
- data/prime-numbers.gemspec +19 -0
- data/spec/prime-numbers/algorithms/one_liner_spec.rb +28 -0
- data/spec/prime-numbers/algorithms/sieve_of_eratosthenes_spec.rb +28 -0
- data/spec/prime-numbers/errors/range_boundary_exception_spec.rb +12 -0
- data/spec/prime-numbers_spec.rb +56 -0
- data/spec/spec_helper.rb +4 -0
- metadata +85 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
prime-numbers (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.3)
|
10
|
+
rspec (2.10.0)
|
11
|
+
rspec-core (~> 2.10.0)
|
12
|
+
rspec-expectations (~> 2.10.0)
|
13
|
+
rspec-mocks (~> 2.10.0)
|
14
|
+
rspec-core (2.10.1)
|
15
|
+
rspec-expectations (2.10.0)
|
16
|
+
diff-lcs (~> 1.1.3)
|
17
|
+
rspec-mocks (2.10.1)
|
18
|
+
|
19
|
+
PLATFORMS
|
20
|
+
ruby
|
21
|
+
|
22
|
+
DEPENDENCIES
|
23
|
+
prime-numbers!
|
24
|
+
rspec
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Andrei Ursan
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# PrimeNumbers
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'prime-numbers'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install prime-numbers
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
require 'prime-numbers'
|
22
|
+
|
23
|
+
# initialize a generator object with a strategy, let's say the "one liner", which uses
|
24
|
+
# this algorithm to find the prime numbers:
|
25
|
+
# ('1' * number) !~ /^1?$|^(11+?)\1+$/
|
26
|
+
primes_generator = PrimeNumbers::Generator.new(:one_liner)
|
27
|
+
|
28
|
+
# or for a more performant strategy use
|
29
|
+
primes_generator = PrimeNumbers::Generator.new(:sieve_of_eratosthenes)
|
30
|
+
|
31
|
+
#then you can check for a specific prime number
|
32
|
+
prime_generator.is_prime? 947
|
33
|
+
=> true
|
34
|
+
|
35
|
+
# or for prime numbers within a range
|
36
|
+
prime_generate.generate 3500, 3540
|
37
|
+
=> [3511, 3517, 3527, 3529, 3533, 3539]
|
38
|
+
|
39
|
+
# inverse ranges are supported
|
40
|
+
prime_generate.generate 3540, 3500
|
41
|
+
=> [3511, 3517, 3527, 3529, 3533, 3539]
|
42
|
+
|
43
|
+
|
44
|
+
## Contributing
|
45
|
+
|
46
|
+
1. Fork it
|
47
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
48
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
49
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
50
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "prime-numbers/version"
|
2
|
+
require "prime-numbers/algorithms/algorithm"
|
3
|
+
require "prime-numbers/errors/range_boundary_exception"
|
4
|
+
|
5
|
+
module PrimeNumbers
|
6
|
+
class Generator
|
7
|
+
def initialize algorithm_strategy
|
8
|
+
@algorithm = Algorithm.with_strategy(algorithm_strategy)
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate a, b
|
12
|
+
a,b = range_sanitizer(a,b)[0], range_sanitizer(a,b)[1]
|
13
|
+
@algorithm.generate(a,b)
|
14
|
+
end
|
15
|
+
|
16
|
+
def is_prime? number
|
17
|
+
@algorithm.is_prime? number
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def range_sanitizer a,b
|
22
|
+
if a <= 0 || a.class == Float
|
23
|
+
raise RangeBoundaryException, "#{a} is an invalid range boundary, please provide a positive integer instead!"
|
24
|
+
elsif b <= 0 || b.class == Float
|
25
|
+
raise RangeBoundaryException, "#{b} is an invalid range boundary, please provide a positive integer instead!"
|
26
|
+
end
|
27
|
+
|
28
|
+
a,b = b,a if a > b
|
29
|
+
[a,b]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path('../one_liner', __FILE__)
|
2
|
+
require File.expand_path('../sieve_of_eratosthenes', __FILE__)
|
3
|
+
|
4
|
+
module PrimeNumbers
|
5
|
+
class Algorithm
|
6
|
+
ALGORITHMS = {
|
7
|
+
one_liner: AlgorithmOneLiner,
|
8
|
+
sieve_of_eratosthenes: AlgorithmSieveOfEratosthenes
|
9
|
+
}
|
10
|
+
|
11
|
+
def self.with_strategy strategy
|
12
|
+
ALGORITHMS[strategy].new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PrimeNumbers
|
2
|
+
class AlgorithmOneLiner
|
3
|
+
def generate a, b
|
4
|
+
primenumbers = []
|
5
|
+
(a..b).each do |number|
|
6
|
+
primenumbers << number if self.is_prime? number
|
7
|
+
end
|
8
|
+
primenumbers
|
9
|
+
end
|
10
|
+
|
11
|
+
def is_prime? number
|
12
|
+
number < 2 ? false : ('1' * number) !~ /^1?$|^(11+?)\1+$/
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PrimeNumbers
|
2
|
+
class AlgorithmSieveOfEratosthenes
|
3
|
+
def generate lower_bound, upper_bound
|
4
|
+
sqrt_upper = (Math.sqrt upper_bound).round
|
5
|
+
numbers = Array.new(upper_bound) {|e| e = false}
|
6
|
+
primes = []
|
7
|
+
|
8
|
+
(2 .. sqrt_upper).each do |m|
|
9
|
+
if !numbers[m]
|
10
|
+
|
11
|
+
if m >= lower_bound
|
12
|
+
primes << m
|
13
|
+
end
|
14
|
+
|
15
|
+
k = m * m
|
16
|
+
while k <= upper_bound
|
17
|
+
numbers[k] = true
|
18
|
+
k += m
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
(sqrt_upper+1 .. upper_bound).each do |n|
|
25
|
+
if !numbers[n] && n >= lower_bound
|
26
|
+
primes << n
|
27
|
+
end
|
28
|
+
end
|
29
|
+
primes
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_prime? number
|
33
|
+
number < 2 ? false : !generate(number,number).empty?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/prime-numbers/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Andrei Ursan"]
|
6
|
+
gem.email = ["hello@andreiursan.com"]
|
7
|
+
gem.description = %q{Prime Numbers Generator}
|
8
|
+
gem.summary = %q{Simply tells if a number is prime or generates al prime numbers from a provided range}
|
9
|
+
gem.homepage = "https://github.com/andreiursan/prime-numbers"
|
10
|
+
|
11
|
+
gem.add_development_dependency "rspec"
|
12
|
+
|
13
|
+
gem.files = `git ls-files`.split($\)
|
14
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
15
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
16
|
+
gem.name = "prime-numbers"
|
17
|
+
gem.require_paths = ["lib"]
|
18
|
+
gem.version = PrimeNumbers::VERSION
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PrimeNumbers::AlgorithmOneLiner do
|
4
|
+
|
5
|
+
|
6
|
+
before(:all) do
|
7
|
+
@algorithm = PrimeNumbers::AlgorithmOneLiner.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return true for prime numbers" do
|
11
|
+
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
|
12
|
+
41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
|
13
|
+
83, 89, 97, 101, 7901, 7907, 7919].each do |number|
|
14
|
+
@algorithm.is_prime?(number).should be_true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return false for non-prime numbers" do
|
19
|
+
[832, 1, -23, 0, 63, 888812, 15].each do |number|
|
20
|
+
@algorithm.is_prime?(number).should be_false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return prime numbers in an interval" do
|
25
|
+
@algorithm.generate(7900, 8000).should eq([7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993])
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PrimeNumbers::AlgorithmSieveOfEratosthenes do
|
4
|
+
|
5
|
+
|
6
|
+
before(:all) do
|
7
|
+
@algorithm = PrimeNumbers::AlgorithmSieveOfEratosthenes.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return true for prime numbers" do
|
11
|
+
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
|
12
|
+
41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
|
13
|
+
83, 89, 97, 101, 7901, 7907, 7919].each do |number|
|
14
|
+
@algorithm.is_prime?(number).should be_true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return false for non-prime numbers" do
|
19
|
+
[832, 1, -23, 0, 63, 888812, 15].each do |number|
|
20
|
+
@algorithm.is_prime?(number).should be_false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should retunr prime numbers in an interval" do
|
25
|
+
@algorithm.generate(7900, 8000).should eq([7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993])
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RangeBoundaryException do
|
4
|
+
|
5
|
+
it "should raise a RangeBoundaryException" do
|
6
|
+
begin
|
7
|
+
raise RangeBoundaryException
|
8
|
+
rescue RangeBoundaryException => error
|
9
|
+
error.class.should == RangeBoundaryException
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PrimeNumbers::PrimeNumberGenerator do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@prime_generator = PrimeNumbers::Generator.new(:one_liner)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should respond to message generate" do
|
10
|
+
@prime_generator.should respond_to(:generate)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should respond to message is_prime?" do
|
14
|
+
@prime_generator.should respond_to(:is_prime?)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return all prime numbers between 1 and 13" do
|
18
|
+
@prime_generator.generate(1, 13).should eq([2, 3, 5, 7, 11, 13])
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should handle reverse ranges (20,1) == (1,20)" do
|
22
|
+
begin
|
23
|
+
@prime_generator.generate(20, 1).should eq([2, 3, 5, 7, 11, 13, 17, 19])
|
24
|
+
raise RangeBoundaryException
|
25
|
+
rescue RangeBoundaryException => error
|
26
|
+
error.class.should == RangeBoundaryException
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should raise an error on negtive range boundaries" do
|
31
|
+
begin
|
32
|
+
@prime_generator.generate(20, -2)
|
33
|
+
rescue RangeBoundaryException => error
|
34
|
+
error.should_not eq(nil)
|
35
|
+
error.message.should eq("-2 is an invalid range boundary, please provide a positive integer instead!")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should raise an error on float numbers range boundaries" do
|
40
|
+
begin
|
41
|
+
@prime_generator.generate(20.5, 2)
|
42
|
+
rescue RangeBoundaryException => error
|
43
|
+
error.should_not eq(nil)
|
44
|
+
error.message.should eq("20.5 is an invalid range boundary, please provide a positive integer instead!")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return true for a prime number (17)" do
|
49
|
+
@prime_generator.is_prime?(17).should be_true
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return false if a number isn't prime (18)" do
|
53
|
+
@prime_generator.is_prime?(18).should be_false
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: prime-numbers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrei Ursan
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Prime Numbers Generator
|
31
|
+
email:
|
32
|
+
- hello@andreiursan.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- Gemfile
|
39
|
+
- Gemfile.lock
|
40
|
+
- LICENSE
|
41
|
+
- README.md
|
42
|
+
- Rakefile
|
43
|
+
- lib/prime-numbers.rb
|
44
|
+
- lib/prime-numbers/algorithms/algorithm.rb
|
45
|
+
- lib/prime-numbers/algorithms/one_liner.rb
|
46
|
+
- lib/prime-numbers/algorithms/sieve_of_eratosthenes.rb
|
47
|
+
- lib/prime-numbers/errors/range_boundary_exception.rb
|
48
|
+
- lib/prime-numbers/version.rb
|
49
|
+
- prime-numbers.gemspec
|
50
|
+
- spec/prime-numbers/algorithms/one_liner_spec.rb
|
51
|
+
- spec/prime-numbers/algorithms/sieve_of_eratosthenes_spec.rb
|
52
|
+
- spec/prime-numbers/errors/range_boundary_exception_spec.rb
|
53
|
+
- spec/prime-numbers_spec.rb
|
54
|
+
- spec/spec_helper.rb
|
55
|
+
homepage: https://github.com/andreiursan/prime-numbers
|
56
|
+
licenses: []
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 1.8.24
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: Simply tells if a number is prime or generates al prime numbers from a provided
|
79
|
+
range
|
80
|
+
test_files:
|
81
|
+
- spec/prime-numbers/algorithms/one_liner_spec.rb
|
82
|
+
- spec/prime-numbers/algorithms/sieve_of_eratosthenes_spec.rb
|
83
|
+
- spec/prime-numbers/errors/range_boundary_exception_spec.rb
|
84
|
+
- spec/prime-numbers_spec.rb
|
85
|
+
- spec/spec_helper.rb
|