r_math_plus 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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +77 -0
- data/Rakefile +2 -0
- data/lib/r_math_plus/version.rb +3 -0
- data/lib/r_math_plus.rb +94 -0
- data/r_math_plus.gemspec +24 -0
- data/spec/r_math_plus_spec.rb +74 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/tasks/rspec.rake +3 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3a7bdad3ee832e67e60f81b058983001b616a6c9
|
4
|
+
data.tar.gz: 4c7b07dc511d2281bd3abe4109b86b570533d4e1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 91ee88368dd92c311b6beec7ebc9036dc76b711b229f8296c2c6d1b9ede210cf5d55767566787b49a5a550c0a1020437d381f95bac6cd851bac2b02d9c01ef21
|
7
|
+
data.tar.gz: 16150e3d61bdaa74a17cab523972d4bb67e29aa6dc0f0507afb8d75088e7dc78e566929a005b827089225a3c4b435864eb5d4b5305db68db7edd10b911bebaab
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 otamm
|
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,77 @@
|
|
1
|
+
# Rmathplus
|
2
|
+
|
3
|
+
A gem designed due to my personal online puzzle solving habits; some of them may be a part
|
4
|
+
of Ruby's kernel already, the purpose of the gem is to unite some methods in a single place with easy
|
5
|
+
access to them. RMathPlus is a collection of methods that appear kinda often in puzzles, and also some
|
6
|
+
that do not show up that often but can clearly be reused. Designed with computational efficiency in mind,
|
7
|
+
some of the methods are interdependent and therefore it is a good idea to always load the whole gem instead
|
8
|
+
of requiring specific methods.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'r_math_plus'
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install rmathplus
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
The '.is_prime?' method is the base of all of the other methods and also available by itself.
|
28
|
+
Simple pass a number as a parameter and it will return a boolean value:
|
29
|
+
```ruby
|
30
|
+
RMathPlus.is_prime?(3) # => true
|
31
|
+
RMathPlus.is_prime?(4) # => false
|
32
|
+
```
|
33
|
+
The method also accepts an optional second parameter, an array containing prime numbers;
|
34
|
+
usage of the second parameter works best in an incrementing fashion (see this repo's lib/r_math_plus.rb '#prime_array' method for an example.)
|
35
|
+
Ex:
|
36
|
+
```ruby
|
37
|
+
RMathPlus.is_prime?(5,[2,3]) # => true, faster execution
|
38
|
+
RMathPlus.is_prime?(8,[2,3,5,7]) # => false, faster execution
|
39
|
+
```
|
40
|
+
|
41
|
+
The '.prime_array' method takes an integer as a parameter and returns an array with the primes lesser than or equal to the number:
|
42
|
+
```ruby
|
43
|
+
RMathPlus.prime_array(10) # => [2,3,5,7]
|
44
|
+
```
|
45
|
+
|
46
|
+
'.prime_factors' returns an array of the prime factors of a given number n. If n is a prime, it will return n.
|
47
|
+
Ex:
|
48
|
+
```ruby
|
49
|
+
RMathPlus.prime_factors(10) # => [2,5]
|
50
|
+
RMathPlus.prime_factors(8) # => [2,2,2]
|
51
|
+
```
|
52
|
+
|
53
|
+
Second optional parameter used in order to improve speed if the method will run through an array of
|
54
|
+
integers; its input should be the array returned by the '.prime_array' method with the array of numbers' biggest int as parameter.
|
55
|
+
Ex:
|
56
|
+
```ruby
|
57
|
+
biggest_number_prime_array = RMathPlus.prime_array(10)
|
58
|
+
prime_factors = []
|
59
|
+
[2,4,6,7,9,10].each do |n|
|
60
|
+
prime_factors.push(RMathPlus.prime_factors(n,biggest_number_prime_array)) # will execute faster iterating through a single array, otherwise it would make a prime array for each of the numbers
|
61
|
+
end
|
62
|
+
# => prime_factors == [[2],[2,2],[2,3],[7],[3,3],[2,5]]
|
63
|
+
```
|
64
|
+
|
65
|
+
'.lcm' is used to calculate the least common multiple of a given array of numbers. Dependent on the method above, the code on lib/r_math_plus.rb which defines
|
66
|
+
this method illustrates well an example of the use of the optional second parameter to the '.prime_factors' method above.
|
67
|
+
```ruby
|
68
|
+
RMathPlus.lcm([2,4,8]) # => 8
|
69
|
+
RMathPlus.lcm([3,6,8]) # => 24
|
70
|
+
```
|
71
|
+
## Contributing
|
72
|
+
|
73
|
+
1. Fork it ( https://github.com/[my-github-username]/rmathplus/fork )
|
74
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
75
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
76
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
77
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/lib/r_math_plus.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require "r_math_plus/version"
|
2
|
+
|
3
|
+
module RMathPlus
|
4
|
+
|
5
|
+
def self.is_prime?(n,prime_array=false) # number to be checked as first parameter, optional second parameter to be used with the 'prime_array' method.
|
6
|
+
if n < 2
|
7
|
+
return false
|
8
|
+
elsif n == 2
|
9
|
+
return true
|
10
|
+
else
|
11
|
+
if prime_array
|
12
|
+
for i in (2..(n/2)+1) #it makes no sense to divide by numbers which would result in a result less than 2 (the smallest prime); the '+1' in the end is due to the default 'round down' in integer division in Ruby.
|
13
|
+
prime_array.each { |prime| return false if (n % prime) == 0 }
|
14
|
+
end
|
15
|
+
else
|
16
|
+
for i in (2..(n/2)+1)
|
17
|
+
if (n % i) == 0
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
return true
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.prime_array(n) #returns an array with all primes less than number n.
|
27
|
+
if n < 2
|
28
|
+
return []
|
29
|
+
else
|
30
|
+
prime_array = []
|
31
|
+
for i in (2..n)
|
32
|
+
prime_array.push(i) if RMathPlus.is_prime?(i,prime_array) # the own prime_array built so far is passed as an argument in order to improve processing speed.
|
33
|
+
end
|
34
|
+
end
|
35
|
+
return prime_array
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.prime_factors(number, biggest_number_prime_array=false) #returns the prime factors of a given number. if n is prime, returns n. second parameter to improve speed if method would be utilized in a range of numbers.
|
39
|
+
factors = []
|
40
|
+
if biggest_number_prime_array
|
41
|
+
primes = biggest_number_prime_array
|
42
|
+
else
|
43
|
+
primes = RMathPlus.prime_array(number)
|
44
|
+
end
|
45
|
+
|
46
|
+
while true
|
47
|
+
signal = factors.size #signalizes when to break the loop.
|
48
|
+
primes.each do |prime|
|
49
|
+
if (number % prime) == 0
|
50
|
+
factors.push(prime)
|
51
|
+
number = number / prime
|
52
|
+
break
|
53
|
+
end
|
54
|
+
end
|
55
|
+
if signal == factors.size
|
56
|
+
factors.push(number)
|
57
|
+
break
|
58
|
+
end
|
59
|
+
end
|
60
|
+
factors = factors.sort
|
61
|
+
return factors - [1] #...because 1 is not a prime.
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.lcm(nums) #method that returns the least common multiple between a given array of numbers.
|
65
|
+
nums = nums.uniq.sort
|
66
|
+
primes = RMathPlus.prime_array(nums[-1]) #biggest number in the whole array.
|
67
|
+
factorized_nums = [] #holds the prime factors for each value in nums array.
|
68
|
+
nums.each { |n| factorized_nums.push(RMathPlus.prime_factors(n,primes)) }
|
69
|
+
|
70
|
+
unique_lcm_factors = [] #individual prime factors of lcm
|
71
|
+
lcm_factors = {} #prime factors of lcm
|
72
|
+
for factors in factorized_nums
|
73
|
+
for factor in factors.uniq
|
74
|
+
if lcm_factors.include?(factor)
|
75
|
+
lcm_factors[factor] = factors.count(factor) if factors.count(factor) > lcm_factors[factor]
|
76
|
+
else
|
77
|
+
lcm_factors[factor] = factors.count(factor)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
lcm = 1
|
83
|
+
lcm_factors.each { |factor,max_quantity| lcm *= factor ** max_quantity }
|
84
|
+
return lcm
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
odds = []
|
90
|
+
for i in (1..99)
|
91
|
+
odds.push(i) if (i % 2) == 1
|
92
|
+
end
|
93
|
+
|
94
|
+
puts RMathPlus.lcm(odds)
|
data/r_math_plus.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'r_math_plus/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "r_math_plus"
|
8
|
+
spec.version = RMathPlus::VERSION
|
9
|
+
spec.authors = ["Otávio Monteagudo"]
|
10
|
+
spec.email = ["oivatom@gmail.com"]
|
11
|
+
spec.summary = %q{ Math operations to use in puzzles. }
|
12
|
+
spec.description = %q{ Some extra math ops to the standard library which include prime number operations and the least common multiple of an array of numbers. }
|
13
|
+
spec.homepage = "https://github.com/otamm/RMathPlus"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.0.0"
|
24
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe RMathPlus do
|
5
|
+
|
6
|
+
describe ".is_prime?" do
|
7
|
+
|
8
|
+
it "returns true when a number is prime" do
|
9
|
+
(RMathPlus.is_prime?(3)).should == true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns false when a number is not prime" do
|
13
|
+
(RMathPlus.is_prime?(4)).should == false
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns true when a big prime number is passed as param" do
|
17
|
+
(RMathPlus.is_prime?(104729)).should == true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "executes faster when an array is passed as second parameter" do
|
21
|
+
begin1 = Time.now
|
22
|
+
(RMathPlus.is_prime?(50,[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]))
|
23
|
+
finish1 = Time.now
|
24
|
+
|
25
|
+
begin2 = Time.now
|
26
|
+
(RMathPlus.is_prime?(50))
|
27
|
+
finish2 = Time.now
|
28
|
+
((finish1 - begin1) > (finish2 - begin2)).should == true
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe ".prime_array" do
|
34
|
+
|
35
|
+
it "returns an array with all the primes lesser than or equal to its parameter" do
|
36
|
+
expect(RMathPlus.prime_array(7)).to eq [2,3,5,7]
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns an empty array if input < 2" do
|
40
|
+
expect(RMathPlus.prime_array(0)).to eq []
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
describe ".prime_factors" do
|
46
|
+
|
47
|
+
it "returns repeated prime factors of a given number" do
|
48
|
+
expect(RMathPlus.prime_factors(8)).to eq [2,2,2]
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns its input if the input is a prime" do
|
52
|
+
expect(RMathPlus.prime_factors(11)).to eq [11]
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ".lcm" do
|
58
|
+
|
59
|
+
it "returns the least common multiple of an array of numbers" do
|
60
|
+
expect(RMathPlus.lcm([2,4,8])).to eq 8
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns the least common multiple of a big array of numbers" do
|
64
|
+
odds = []
|
65
|
+
for i in (1..99)
|
66
|
+
odds.push(i) if (i % 2) == 1
|
67
|
+
end
|
68
|
+
|
69
|
+
expect(RMathPlus.lcm(odds)).to eq 1089380862964257455695840764614254743075
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'r_math_plus'
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: r_math_plus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Otávio Monteagudo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.0
|
55
|
+
description: " Some extra math ops to the standard library which include prime number
|
56
|
+
operations and the least common multiple of an array of numbers. "
|
57
|
+
email:
|
58
|
+
- oivatom@gmail.com
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- lib/r_math_plus.rb
|
69
|
+
- lib/r_math_plus/version.rb
|
70
|
+
- r_math_plus.gemspec
|
71
|
+
- spec/r_math_plus_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
- spec/tasks/rspec.rake
|
74
|
+
homepage: https://github.com/otamm/RMathPlus
|
75
|
+
licenses:
|
76
|
+
- MIT
|
77
|
+
metadata: {}
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 2.2.2
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: Math operations to use in puzzles.
|
98
|
+
test_files:
|
99
|
+
- spec/r_math_plus_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
- spec/tasks/rspec.rake
|