rubysl-mathn 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 467e937606c8e419d779633cb724dd5327bfeeff
4
+ data.tar.gz: 1bcc431f67bb1a5581d5574aa816a7a58eea7971
5
+ SHA512:
6
+ metadata.gz: d3d2f5ab89cab030c46699a7500a816980b5742b6148bb50c63c74cd4cf9bff608e4f520dcd416dd0a1f285251325ece2b646e81675d34447099b29e41ff2d22
7
+ data.tar.gz: 7f4f2d6254a66cdb96c398e8800f11d7da0440680ce5dce5591874cf27d9edef8be03a73182696e0464c9082cb9a3575298b4d62dc86189ecab6715146391f9f
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem update --system
4
+ - gem --version
5
+ - gem install rubysl-bundler
6
+ script: bundle exec mspec spec
7
+ rvm:
8
+ - rbx-nightly-18mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rubysl-mathn.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2013, Brian Shirai
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ 3. Neither the name of the library nor the names of its contributors may be
13
+ used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT,
20
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,29 @@
1
+ # Rubysl::Mathn
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rubysl-mathn'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rubysl-mathn
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ require "rubysl/mathn"
@@ -0,0 +1,2 @@
1
+ require "rubysl/mathn/mathn"
2
+ require "rubysl/mathn/version"
@@ -0,0 +1,313 @@
1
+ #
2
+ # mathn.rb -
3
+ # $Release Version: 0.5 $
4
+ # $Revision: 1.1.1.1.4.1 $
5
+ # $Date: 1998/01/16 12:36:05 $
6
+ # by Keiju ISHITSUKA(SHL Japan Inc.)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ require "complex.rb"
14
+ require "rational.rb"
15
+ require "matrix.rb"
16
+
17
+ class Integer
18
+
19
+ def gcd2(int)
20
+ a = self.abs
21
+ b = int.abs
22
+ a, b = b, a if a < b
23
+
24
+ pd_a = a.prime_division
25
+ pd_b = b.prime_division
26
+
27
+ gcd = 1
28
+ for pair in pd_a
29
+ as = pd_b.assoc(pair[0])
30
+ if as
31
+ gcd *= as[0] ** [as[1], pair[1]].min
32
+ end
33
+ end
34
+ return gcd
35
+ end
36
+
37
+ def Integer.from_prime_division(pd)
38
+ value = 1
39
+ for prime, index in pd
40
+ value *= prime**index
41
+ end
42
+ value
43
+ end
44
+
45
+ def prime_division
46
+ raise ZeroDivisionError if self == 0
47
+ ps = Prime.new
48
+ value = self
49
+ if value < 0
50
+ value = -value
51
+ pv = [[-1, 1]]
52
+ else
53
+ pv = []
54
+ end
55
+ for prime in ps
56
+ count = 0
57
+ while (value1, mod = value.divmod(prime)
58
+ mod) == 0
59
+ value = value1
60
+ count += 1
61
+ end
62
+ if count != 0
63
+ pv.push [prime, count]
64
+ end
65
+ break if prime * prime >= value
66
+ end
67
+ if value > 1
68
+ pv.push [value, 1]
69
+ end
70
+ return pv
71
+ end
72
+ end
73
+
74
+ class Prime
75
+ include Enumerable
76
+
77
+ def initialize
78
+ @seed = 1
79
+ @primes = []
80
+ @counts = []
81
+ end
82
+
83
+ def succ
84
+ i = -1
85
+ size = @primes.size
86
+ while i < size
87
+ if i == -1
88
+ @seed += 1
89
+ i += 1
90
+ else
91
+ while @seed > @counts[i]
92
+ @counts[i] += @primes[i]
93
+ end
94
+ if @seed != @counts[i]
95
+ i += 1
96
+ else
97
+ i = -1
98
+ end
99
+ end
100
+ end
101
+ @primes.push @seed
102
+ @counts.push @seed + @seed
103
+ return @seed
104
+ end
105
+ alias next succ
106
+
107
+ def each
108
+ loop do
109
+ yield succ
110
+ end
111
+ end
112
+ end
113
+
114
+ class Fixnum
115
+ alias / quo
116
+ end
117
+
118
+ class Bignum
119
+ alias / quo
120
+ end
121
+
122
+ class Rational
123
+ Unify = true
124
+
125
+ def inspect
126
+ format "%s/%s", numerator.inspect, denominator.inspect
127
+ end
128
+
129
+ alias power! **
130
+
131
+ def ** (other)
132
+ if other.kind_of?(Rational)
133
+ other2 = other
134
+ if self < 0
135
+ return Complex.new!(self, 0) ** other
136
+ elsif other == 0
137
+ return Rational(1,1)
138
+ elsif self == 0
139
+ return Rational(0,1)
140
+ elsif self == 1
141
+ return Rational(1,1)
142
+ end
143
+
144
+ npd = numerator.prime_division
145
+ dpd = denominator.prime_division
146
+ if other < 0
147
+ other = -other
148
+ npd, dpd = dpd, npd
149
+ end
150
+
151
+ for elm in npd
152
+ elm[1] = elm[1] * other
153
+ if !elm[1].kind_of?(Integer) and elm[1].denominator != 1
154
+ return Float(self) ** other2
155
+ end
156
+ elm[1] = elm[1].to_i
157
+ end
158
+
159
+ for elm in dpd
160
+ elm[1] = elm[1] * other
161
+ if !elm[1].kind_of?(Integer) and elm[1].denominator != 1
162
+ return Float(self) ** other2
163
+ end
164
+ elm[1] = elm[1].to_i
165
+ end
166
+
167
+ num = Integer.from_prime_division(npd)
168
+ den = Integer.from_prime_division(dpd)
169
+
170
+ Rational(num,den)
171
+
172
+ elsif other.kind_of?(Integer)
173
+ if other > 0
174
+ num = numerator ** other
175
+ den = denominator ** other
176
+ elsif other < 0
177
+ num = denominator ** -other
178
+ den = numerator ** -other
179
+ elsif other == 0
180
+ num = 1
181
+ den = 1
182
+ end
183
+ Rational.new!(num, den)
184
+ elsif other.kind_of?(Float)
185
+ Float(self) ** other
186
+ else
187
+ x , y = other.coerce(self)
188
+ x ** y
189
+ end
190
+ end
191
+
192
+ def power2(other)
193
+ if other.kind_of?(Rational)
194
+ if self < 0
195
+ return Complex(self, 0) ** other
196
+ elsif other == 0
197
+ return Rational(1,1)
198
+ elsif self == 0
199
+ return Rational(0,1)
200
+ elsif self == 1
201
+ return Rational(1,1)
202
+ end
203
+
204
+ dem = nil
205
+ x = self.denominator.to_f.to_i
206
+ neard = self.denominator.to_f ** (1.0/other.denominator.to_f)
207
+ loop do
208
+ if (neard**other.denominator == self.denominator)
209
+ dem = neaed
210
+ break
211
+ end
212
+ end
213
+ nearn = self.numerator.to_f ** (1.0/other.denominator.to_f)
214
+ Rational(num,den)
215
+
216
+ elsif other.kind_of?(Integer)
217
+ if other > 0
218
+ num = numerator ** other
219
+ den = denominator ** other
220
+ elsif other < 0
221
+ num = denominator ** -other
222
+ den = numerator ** -other
223
+ elsif other == 0
224
+ num = 1
225
+ den = 1
226
+ end
227
+ Rational.new!(num, den)
228
+ elsif other.kind_of?(Float)
229
+ Float(self) ** other
230
+ else
231
+ x , y = other.coerce(self)
232
+ x ** y
233
+ end
234
+ end
235
+ end
236
+
237
+ module Math
238
+ def sqrt(a)
239
+ if a.kind_of?(Complex)
240
+ abs = sqrt(a.real*a.real + a.image*a.image)
241
+ # if not abs.kind_of?(Rational)
242
+ # return a**Rational(1,2)
243
+ # end
244
+ x = sqrt((a.real + abs)/Rational(2))
245
+ y = sqrt((-a.real + abs)/Rational(2))
246
+ # if !(x.kind_of?(Rational) and y.kind_of?(Rational))
247
+ # return a**Rational(1,2)
248
+ # end
249
+ if a.image >= 0
250
+ Complex(x, y)
251
+ else
252
+ Complex(x, -y)
253
+ end
254
+ elsif a >= 0
255
+ rsqrt(a)
256
+ else
257
+ Complex(0,rsqrt(-a))
258
+ end
259
+ end
260
+
261
+ def rsqrt(a)
262
+ if a.kind_of?(Float)
263
+ sqrt!(a)
264
+ elsif a.kind_of?(Rational)
265
+ rsqrt(a.numerator)/rsqrt(a.denominator)
266
+ else
267
+ src = a
268
+ max = 2 ** 32
269
+ byte_a = [src & 0xffffffff]
270
+ # ruby's bug
271
+ while (src >= max) and (src >>= 32)
272
+ byte_a.unshift src & 0xffffffff
273
+ end
274
+
275
+ answer = 0
276
+ main = 0
277
+ side = 0
278
+ for elm in byte_a
279
+ main = (main << 32) + elm
280
+ side <<= 16
281
+ if answer != 0
282
+ if main * 4 < side * side
283
+ applo = main.div(side)
284
+ else
285
+ applo = ((sqrt!(side * side + 4 * main) - side)/2.0).to_i + 1
286
+ end
287
+ else
288
+ applo = sqrt!(main).to_i + 1
289
+ end
290
+
291
+ while (x = (side + applo) * applo) > main
292
+ applo -= 1
293
+ end
294
+ main -= x
295
+ answer = (answer << 16) + applo
296
+ side += applo * 2
297
+ end
298
+ if main == 0
299
+ answer
300
+ else
301
+ sqrt!(a)
302
+ end
303
+ end
304
+ end
305
+
306
+ module_function :sqrt
307
+ module_function :rsqrt
308
+ end
309
+
310
+ class Complex
311
+ Unify = true
312
+ end
313
+
@@ -0,0 +1,5 @@
1
+ module RubySL
2
+ module Mathn
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ require './lib/rubysl/mathn/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "rubysl-mathn"
6
+ spec.version = RubySL::Mathn::VERSION
7
+ spec.authors = ["Brian Shirai"]
8
+ spec.email = ["brixen@gmail.com"]
9
+ spec.description = %q{Ruby standard library mathn.}
10
+ spec.summary = %q{Ruby standard library mathn.}
11
+ spec.homepage = "https://github.com/rubysl/rubysl-mathn"
12
+ spec.license = "BSD"
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.3"
20
+ spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_development_dependency "mspec", "~> 1.5"
22
+ spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
23
+ end
@@ -0,0 +1,19 @@
1
+ require 'mathn'
2
+
3
+ describe "Bignum#**" do
4
+ before(:each) do
5
+ @bignum = bignum_value(47)
6
+ end
7
+
8
+ it "returns self raised to other (positive) power" do
9
+ (@bignum ** 4).should == 7237005577332262361485077344629993318496048279512298547155833600056910050625
10
+ (@bignum ** 1.2).should be_close(57262152889751597425762.57804, TOLERANCE)
11
+ end
12
+
13
+ ruby_version_is '1.9' do
14
+ it "returns a complex number when negative and raised to a fractional power" do
15
+ ((-@bignum) ** (1/3)).should be_close(Complex(1048576,1816186.907597341), TOLERANCE)
16
+ ((-@bignum) ** (1.0/3)).should be_close(Complex(1048576,1816186.907597341), TOLERANCE)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ require 'mathn'
2
+
3
+ ruby_version_is '1.9' do
4
+ describe "Kernel#Complex" do
5
+ it "returns an Integer if imaginary part is 0" do
6
+ Complex(42,0).should == 42
7
+ Complex(42,0).should be_kind_of(Fixnum)
8
+ Complex(bignum_value,0).should == bignum_value
9
+ Complex(bignum_value,0).should be_kind_of(Bignum)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ require 'mathn'
2
+
3
+ describe "Fixnum#**" do
4
+ it "returns self raised to other (positive) power" do
5
+ (2 ** 4).should == 16
6
+ (2 ** 1.2).should be_close(2.2973967, TOLERANCE)
7
+ end
8
+
9
+ ruby_version_is '1.9' do
10
+ it "returns a complex number when negative and raised to a fractional power" do
11
+ ((-8) ** (1/3)).should be_close(Complex(1, 1.73205), TOLERANCE)
12
+ ((-8) ** (1.0/3)).should be_close(Complex(1, 1.73205), TOLERANCE)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'mathn'
2
+
3
+ describe "Float#**" do
4
+ it "returns self raised to other (positive) power" do
5
+ (2.0 ** 4).should == 16.0
6
+ (2.0 ** 1.2).should be_close(2.2973967, TOLERANCE)
7
+ end
8
+
9
+ ruby_version_is '1.9' do
10
+ it "returns a complex number when negative and raised to a fractional power" do
11
+ ((-8.0) ** (1/3)).should be_close(Complex(1, 1.73205), TOLERANCE)
12
+ ((-8.0) ** (1.0/3)).should be_close(Complex(1, 1.73205), TOLERANCE)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require 'mathn'
2
+
3
+ describe "Integer::from_prime_division" do
4
+ it "Reverse a prime factorization of an integer" do
5
+ Integer.from_prime_division([[2, 1], [3, 2], [7, 1]]).should == 126
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ require 'mathn'
2
+
3
+ ruby_version_is ''...'1.9' do
4
+ describe "Integer#gcd2" do
5
+ it "Returns the greatest common divisor of the two numbers" do
6
+ 15.gcd2(5).should == 5
7
+ 15.gcd2(-6).should == 3
8
+ -23.gcd2(19).should == 1
9
+ -10.gcd2(-2).should == 2
10
+ end
11
+
12
+ it "raises a ZeroDivisionError when is called on zero" do
13
+ lambda { 0.gcd2(2) }.should raise_error(ZeroDivisionError)
14
+ lambda { 2.gcd2(0) }.should raise_error(ZeroDivisionError)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ require 'mathn'
2
+
3
+ describe "Integer#prime_division" do
4
+ it "Performs a prime factorization of a positive integer" do
5
+ 100.prime_division.should == [[2, 2], [5, 2]]
6
+ end
7
+
8
+ # Proper handling of negative integers has been added to MRI trunk
9
+ # in revision 24091. Prior to that, all versions of MRI returned nonsense.
10
+ ruby_bug "trunk@24091", "1.9.1" do
11
+ it "Performs a prime factorization of a negative integer" do
12
+ -26.prime_division.should == [[-1, 1], [2, 1], [13, 1]]
13
+ end
14
+ end
15
+
16
+ it "raises a ZeroDivisionError when is called on zero" do
17
+ lambda { 0.prime_division }.should raise_error(ZeroDivisionError)
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ class IncludesMath
2
+ include Math
3
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path('../shared/rsqrt', __FILE__)
2
+
3
+ describe "Math#rsqrt" do
4
+ it_behaves_like :mathn_math_rsqrt, :_, IncludesMath.new
5
+
6
+ it "is a private instance method" do
7
+ IncludesMath.should have_private_instance_method(:rsqrt)
8
+ end
9
+ end
10
+
11
+ describe "Math.rsqrt" do
12
+ it_behaves_like :mathn_math_rsqrt, :_, Math
13
+ end
@@ -0,0 +1,31 @@
1
+ require 'mathn'
2
+ require File.expand_path('../../fixtures/classes', __FILE__)
3
+
4
+ describe :mathn_math_rsqrt, :shared => true do
5
+ it "returns the square root for Rational numbers" do
6
+ @object.send(:rsqrt, Rational(9, 25)).should == Rational(3, 5)
7
+ @object.send(:rsqrt, 16/64).should == Rational(1, 2)
8
+ end
9
+
10
+ it "returns the square root for positive numbers" do
11
+ @object.send(:rsqrt, 1).should == 1
12
+ @object.send(:rsqrt, 4.0).should == 2.0
13
+ @object.send(:rsqrt, 12.34).should == Math.sqrt!(12.34)
14
+ end
15
+
16
+ ruby_version_is ""..."1.9" do
17
+ it "raises an Errno::EDOM if the argument is a negative number" do
18
+ lambda { @object.send(:rsqrt, -1) }.should raise_error(Errno::EDOM)
19
+ lambda { @object.send(:rsqrt, -4.0) }.should raise_error(Errno::EDOM)
20
+ lambda { @object.send(:rsqrt, -16/64) }.should raise_error(Errno::EDOM)
21
+ end
22
+ end
23
+
24
+ ruby_version_is "1.9" do
25
+ it "raises an Math::DomainError if the argument is a negative number" do
26
+ lambda { @object.send(:rsqrt, -1) }.should raise_error(Math::DomainError)
27
+ lambda { @object.send(:rsqrt, -4.0) }.should raise_error(Math::DomainError)
28
+ lambda { @object.send(:rsqrt, -16/64) }.should raise_error(Math::DomainError)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ require 'mathn'
2
+ require File.expand_path('../../fixtures/classes', __FILE__)
3
+
4
+ describe :mathn_math_sqrt, :shared => true do
5
+ it "returns the square root for Rational numbers" do
6
+ @object.send(:sqrt, Rational(9, 25)).should == Rational(3, 5)
7
+ @object.send(:sqrt, 16/64).should == Rational(1, 2)
8
+ end
9
+
10
+ it "returns the square root for Complex numbers" do
11
+ @object.send(:sqrt, Complex(1, 0)).should == 1
12
+ end
13
+
14
+ it "returns the square root for positive numbers" do
15
+ @object.send(:sqrt, 1).should == 1
16
+ @object.send(:sqrt, 4.0).should == 2.0
17
+ @object.send(:sqrt, 12.34).should == Math.sqrt!(12.34)
18
+ end
19
+
20
+ it "returns the square root for negative numbers" do
21
+ @object.send(:sqrt, -9).should == Complex(0, 3)
22
+ @object.send(:sqrt, -5.29).should == Complex(0, 2.3)
23
+ @object.send(:sqrt, -16/64).should == Complex(0, 1/2)
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path('../shared/sqrt', __FILE__)
2
+
3
+ describe "Math#rsqrt" do
4
+ it_behaves_like :mathn_math_sqrt, :_, IncludesMath.new
5
+
6
+ it "is a private instance method" do
7
+ IncludesMath.should have_private_instance_method(:sqrt)
8
+ end
9
+ end
10
+
11
+ describe "Math.rsqrt" do
12
+ it_behaves_like :mathn_math_sqrt, :_, Math
13
+ end
@@ -0,0 +1,28 @@
1
+ require'mathn'
2
+
3
+ describe "Prime#each" do
4
+ it "enumerates the elements" do
5
+ primes = Prime.new
6
+ result = []
7
+
8
+ primes.each { |p|
9
+ result << p
10
+ break if p > 10
11
+ }
12
+
13
+ result.should == [2, 3, 5, 7, 11]
14
+ end
15
+
16
+ it "don't rewind the generator, each loop start at the current value" do
17
+ primes = Prime.new
18
+ primes.next
19
+ result = []
20
+
21
+ primes.each { |p|
22
+ result << p
23
+ break if p > 10
24
+ }
25
+
26
+ result.should == [3, 5, 7, 11]
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ require 'mathn'
2
+
3
+ describe "Prime.new" do
4
+ it "returns a new Prime number" do
5
+ Prime.new.should be_kind_of(Prime)
6
+ end
7
+
8
+ it "raises a TypeError when is called with some arguments" do
9
+ lambda { Prime.new(1) }.should raise_error(ArgumentError)
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ require 'mathn'
2
+
3
+ describe "Prime#next" do
4
+ it "returns the element at the current position and moves forward" do
5
+ p = Prime.new
6
+ p.next.should == 2
7
+ p.next.should == 3
8
+ p.next.next.should == 6
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ require 'mathn'
2
+
3
+ ruby_version_is '1.9' do
4
+ describe "Kernel#Rational" do
5
+ it "returns an Integer if denominator divides numerator evenly" do
6
+ Rational(42,6).should == 7
7
+ Rational(42,6).should be_kind_of(Fixnum)
8
+ Rational(bignum_value,1).should == bignum_value
9
+ Rational(bignum_value,1).should be_kind_of(Bignum)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,70 @@
1
+ require 'mathn'
2
+
3
+ ruby_version_is ''...'1.9' do
4
+ describe "Rational#** when passed [Rational]" do
5
+ it "returns Rational.new!(1, 1) when the passed argument is 0" do
6
+ (Rational.new!(3, 4) ** Rational.new!(0, 3)).should == Rational.new!(1,1)
7
+ (Rational.new!(-3, 4) ** Rational.new!(0, 3)).should == Rational.new!(1,1)
8
+ (Rational.new!(3, -4) ** Rational.new!(0, 3)).should == Rational.new!(1,1)
9
+ (Rational.new!(3, 4) ** Rational.new!(0, -3)).should == Rational.new!(1,1)
10
+ end
11
+
12
+ it "returns Rational.new!(1, 1) when self is 1" do
13
+ (Rational.new!(1,1) ** Rational.new!(2, 3)).should == Rational.new!(1,1)
14
+ (Rational.new!(1,1) ** Rational.new!(-2, 3)).should == Rational.new!(1,1)
15
+ (Rational.new!(1,1) ** Rational.new!(2, -3)).should == Rational.new!(1,1)
16
+ (Rational.new!(1,1) ** Rational.new!(-2, -3)).should == Rational.new!(1,1)
17
+ end
18
+
19
+ it "returns Rational.new!(0, 1) when self is 0" do
20
+ (Rational.new!(0,1) ** Rational.new!(2, 3)).should == Rational.new!(0,1)
21
+ (Rational.new!(0,1) ** Rational.new!(-2, 3)).should == Rational.new!(0,1)
22
+ (Rational.new!(0,1) ** Rational.new!(2, -3)).should == Rational.new!(0,1)
23
+ (Rational.new!(0,1) ** Rational.new!(-2, -3)).should == Rational.new!(0,1)
24
+ end
25
+
26
+ it "returns a Complex number when self is negative" do
27
+ (Rational.new!(-1,2) ** Rational.new!(2, 3)).should be_close(Complex(-0.314980262473718, 0.545561817985861), TOLERANCE)
28
+ (Rational.new!(-1,2) ** Rational.new!(-2, 3)).should be_close(Complex(-0.793700525984099, -1.3747296369986), TOLERANCE)
29
+ (Rational.new!(-1,2) ** Rational.new!(2, -3)).should be_close(Complex(-0.793700525984099, -1.3747296369986), TOLERANCE)
30
+ end
31
+ end
32
+
33
+ describe "Rational#** when passed [Integer]" do
34
+ it "returns the Rational value of self raised to the passed argument" do
35
+ (Rational.new!(3, 4) ** 4).should == Rational.new!(81, 256)
36
+ (Rational.new!(3, 4) ** -4).should == Rational.new!(256, 81)
37
+ (Rational.new!(-3, 4) ** -4).should == Rational.new!(256, 81)
38
+ (Rational.new!(3, -4) ** -4).should == Rational.new!(256, 81)
39
+ end
40
+
41
+ it "returns Rational.new!(1, 1) when the passed argument is 0" do
42
+ (Rational.new!(3, 4) ** 0).should == Rational.new!(1, 1)
43
+ (Rational.new!(-3, 4) ** 0).should == Rational.new!(1, 1)
44
+ (Rational.new!(3, -4) ** 0).should == Rational.new!(1, 1)
45
+
46
+ (Rational.new!(bignum_value, 4) ** 0).should == Rational.new!(1, 1)
47
+ (Rational.new!(3, -bignum_value) ** 0).should == Rational.new!(1, 1)
48
+ end
49
+ end
50
+
51
+ describe "Rational#** when passed [Float]" do
52
+ it "returns self converted to Float and raised to the passed argument" do
53
+ (Rational.new!(3, 1) ** 3.0).should == 27.0
54
+ (Rational.new!(3, 1) ** 1.5).should be_close(5.19615242270663, TOLERANCE)
55
+ (Rational.new!(3, 1) ** -1.5).should be_close(0.192450089729875, TOLERANCE)
56
+ end
57
+
58
+ it "returns 1.0 when the passed argument is 0" do
59
+ (Rational.new!(3, 4) ** 0.0).should == 1.0
60
+ (Rational.new!(-3, 4) ** 0.0).should == 1.0
61
+ (Rational.new!(-3, 4) ** 0.0).should == 1.0
62
+ end
63
+
64
+ it "returns NaN if self is negative and the passed argument is not 0" do
65
+ (Rational.new!(-3, 2) ** 1.5).nan?.should be_true
66
+ (Rational.new!(3, -2) ** 1.5).nan?.should be_true
67
+ (Rational.new!(3, -2) ** -1.5).nan?.should be_true
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,23 @@
1
+ require 'mathn'
2
+
3
+ describe "Rational#inspect" do
4
+ ruby_version_is ''...'1.9' do
5
+ it "returns a string representation of self" do
6
+ Rational.new!(3, 4).inspect.should == "3/4"
7
+ Rational.new!(-5, 8).inspect.should == "-5/8"
8
+ Rational.new!(-1, -2).inspect.should == "1/2"
9
+ Rational.new!(0, 2).inspect.should == "0/2"
10
+ Rational.new!(bignum_value, 1).inspect.should == "#{bignum_value}/1"
11
+ end
12
+ end
13
+
14
+ ruby_version_is '1.9' do
15
+ it "returns a string representation of self" do
16
+ Rational(3, 4).inspect.should == "(3/4)"
17
+ Rational(-5, 8).inspect.should == "(-5/8)"
18
+ Rational(-1, -2).inspect.should == "(1/2)"
19
+ Rational(0, 2).inspect.should == "0"
20
+ Rational(bignum_value, 1).inspect.should == "#{bignum_value}"
21
+ end
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubysl-mathn
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brian Shirai
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-16 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.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
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: mspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubysl-prettyprint
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ description: Ruby standard library mathn.
70
+ email:
71
+ - brixen@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .travis.yml
78
+ - Gemfile
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - lib/mathn.rb
83
+ - lib/rubysl/mathn.rb
84
+ - lib/rubysl/mathn/mathn.rb
85
+ - lib/rubysl/mathn/version.rb
86
+ - rubysl-mathn.gemspec
87
+ - spec/bignum/exponent_spec.rb
88
+ - spec/complex/Complex_spec.rb
89
+ - spec/fixnum/exponent_spec.rb
90
+ - spec/float/exponent_spec.rb
91
+ - spec/integer/from_prime_division_spec.rb
92
+ - spec/integer/gcd2_spec.rb
93
+ - spec/integer/prime_division_spec.rb
94
+ - spec/math/fixtures/classes.rb
95
+ - spec/math/rsqrt_spec.rb
96
+ - spec/math/shared/rsqrt.rb
97
+ - spec/math/shared/sqrt.rb
98
+ - spec/math/sqrt_spec.rb
99
+ - spec/prime/each_spec.rb
100
+ - spec/prime/new_spec.rb
101
+ - spec/prime/next_spec.rb
102
+ - spec/rational/Rational_spec.rb
103
+ - spec/rational/exponent_spec.rb
104
+ - spec/rational/inspect_spec.rb
105
+ homepage: https://github.com/rubysl/rubysl-mathn
106
+ licenses:
107
+ - BSD
108
+ metadata: {}
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubyforge_project:
125
+ rubygems_version: 2.0.3
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: Ruby standard library mathn.
129
+ test_files:
130
+ - spec/bignum/exponent_spec.rb
131
+ - spec/complex/Complex_spec.rb
132
+ - spec/fixnum/exponent_spec.rb
133
+ - spec/float/exponent_spec.rb
134
+ - spec/integer/from_prime_division_spec.rb
135
+ - spec/integer/gcd2_spec.rb
136
+ - spec/integer/prime_division_spec.rb
137
+ - spec/math/fixtures/classes.rb
138
+ - spec/math/rsqrt_spec.rb
139
+ - spec/math/shared/rsqrt.rb
140
+ - spec/math/shared/sqrt.rb
141
+ - spec/math/sqrt_spec.rb
142
+ - spec/prime/each_spec.rb
143
+ - spec/prime/new_spec.rb
144
+ - spec/prime/next_spec.rb
145
+ - spec/rational/Rational_spec.rb
146
+ - spec/rational/exponent_spec.rb
147
+ - spec/rational/inspect_spec.rb
148
+ has_rdoc: