open_integer 0.4.0.pre.46 → 0.4.0.pre.48

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.
Files changed (3) hide show
  1. checksums.yaml +8 -8
  2. data/lib/open_integer.rb +55 -5
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NzcxM2RkMWZkNzA5YmNhZGVhNDI2ZDI5ZmZjOWY1YTc4OTY5YTVkOA==
4
+ ZWY1OWIzZWFlN2QwMjBlNDZmY2EyMGFmNjQwODE4N2JjYjYwZTg3OQ==
5
5
  data.tar.gz: !binary |-
6
- ZTI5NTBhMzJiYWU3ODZhNDY1NzQwOTlhYmVhYjkzMTYyYzVhNmYwNw==
6
+ NmQ4MWU4MThjNzg3NGVmZjViNDFlOWJlOTBhM2E5OWU3MGUwMWQzZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZjM1MGRlMzAwOTc4N2U0ZGQyMzY1NWU3Njg4YmNmZTY0ZGUxN2ExYzg0YWEw
10
- MWZiN2IwY2Y3YjFmZTc4NTA2NDgxYzc2N2EzYTU2MTViMGY0MmMwMGRkZGUx
11
- YTBkM2RmYTYzNDBhNzkwMzljZTUzMmNjMjc2MGI1MDEwMTBhN2M=
9
+ YWY1NTI4NzEyNzk5NzdiNjE3NjgwN2RjYzg4NDdmYjdlMWM4NWMzODI1ZDg0
10
+ NGYwZjdmYWI0ZjA3ZjdjNDQ4MzFkOWRjYjJmYjQ3ODFmYTdjODZmMzA3YzFl
11
+ NjMwMzI1YjNmZTFhYzEyZmRmZTA3ZTFkNWRhNzlhY2UzZGM2NTA=
12
12
  data.tar.gz: !binary |-
13
- YzBmMDZlYmNhN2Q1MDNhZDdhZDE4ZDk5ZmE4NDg4MGM4NzY4ODBjMWNlN2Fh
14
- MTk4YzA1YzdhNmQ0MmE3YjQ4YzEwN2E4MDk5YjMwMWJlMmU0ZmEzNTQwNmI5
15
- Njc2MDNiMDE5NmNiZWU5MDVlNWFjNjc3MWZjMzA4MjQ0OTVhN2M=
13
+ M2NjNjEyYTZjODVlMDNiM2UwZjJhMzE4NDMyN2EyMjllZTdiMzkwYmU0ZTA5
14
+ ZDBiMDI3YzliZjA1YjljYTJkMDk3ZTkwZTk0MGQ1NDNmYmRhYTJmNWNiMWZk
15
+ NzIwYjE3NzEzMDJmYTExMzlkY2E2NWNjYWIyNDFkZWY0ZTZlNDU=
data/lib/open_integer.rb CHANGED
@@ -13,18 +13,30 @@ module OpenInteger
13
13
  end
14
14
 
15
15
  # Public: Determines if the receiver and other are an amicable pair. Numbers a
16
- # and b are amicable if the sum of the factors of a equals b, the sum of the
17
- # factors of b equals a, and a is not equal to b.
16
+ # and b are amicable if the sum of the divisors of a equals b, the sum of the
17
+ # divisors of b equals a, and a is not equal to b.
18
18
  #
19
19
  # other - The value which may be amicable with the receiver.
20
20
  #
21
21
  # Returns true iff the receiver is amicable with other.
22
22
  def amicable_with?(other)
23
- factors.reduce(:+) == other &&
24
- other.factors.reduce(:+) == self &&
23
+ divisors.reduce(:+) == other &&
24
+ other.divisors.reduce(:+) == self &&
25
25
  self != other
26
26
  end
27
27
 
28
+ # Public: Determines if the receiver is amicable with any of the arguments.
29
+ #
30
+ # others - One or more values to test for amicability with the receiver.
31
+ #
32
+ # Returns true iff the receiver is amicable with any of the others.
33
+ def amicable_with_any?(*others)
34
+ others.each do |other|
35
+ return true if amicable_with? other
36
+ end
37
+ false
38
+ end
39
+
28
40
  # Public: An implementation of n choose k using factorials. This
29
41
  # implementation works for all n >= k >= 0
30
42
  #
@@ -154,6 +166,44 @@ module OpenInteger
154
166
  end
155
167
  end
156
168
 
169
+ # Public: Returns the nth Fibonacci number where n is the receiver.
170
+ #
171
+ # Examples
172
+ #
173
+ # 1.fibonacci
174
+ # # => 1
175
+ #
176
+ # 2.fibonacci
177
+ # # => 1
178
+ #
179
+ # 3.fibonacci
180
+ # # => 2
181
+ #
182
+ # 3.fibonacci + 1.fibonacci
183
+ # # => 3
184
+ #
185
+ # Returns the nth Fibonacci number where n is the receiver.
186
+ # Raises a RuntimeError if called on any Integer less than 1.
187
+ def fibonacci
188
+ return 0 if self <= 0
189
+ fibonacci_fast_double(self - 1)[1]
190
+ end
191
+
192
+ # Internal: This is the fast-doubling Fibonacci algorithm helper which is
193
+ # meant to be used by the publicly exposed fibonacci method.
194
+ #
195
+ # Returns a two-member array of the form [F(n), F(n+1)]
196
+ def fibonacci_fast_double(n)
197
+ return [0, 1] if n <= 0
198
+ ab = fibonacci_fast_double(n / 2)
199
+ a = ab[0]
200
+ b = ab[1]
201
+ c = a * (2 * b - a)
202
+ d = b * b + a * a
203
+ return [c, d] if n.even?
204
+ [d, c + d]
205
+ end
206
+
157
207
  # Public: Finds the lowest prime factor of the receiver.
158
208
  #
159
209
  # Returns the lowest prime factor of the receiver or nil if the receiver has
@@ -223,7 +273,7 @@ module OpenInteger
223
273
  (a * a) + (b * b) == (c * c)
224
274
  end
225
275
 
226
- private :choose_factorial
276
+ private :choose_factorial, :fibonacci_fast_double
227
277
  end
228
278
 
229
279
  # Public: Mixing OpenInteger extensions into Integer.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open_integer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0.pre.46
4
+ version: 0.4.0.pre.48
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Conner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-08 00:00:00.000000000 Z
11
+ date: 2015-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simplecov