continued_fractions 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e21b768abb130daf08c605cec1fbee721b24cff1
4
- data.tar.gz: cff6e442d4ce41205cca55fa9157b289eba65a04
3
+ metadata.gz: f0122ca9d3d5652ed7b6ae7d91e569d50b7ef1bd
4
+ data.tar.gz: 1e83d11105ddcb0d59076526a87e994bcaef4341
5
5
  SHA512:
6
- metadata.gz: d6c311ab38c8c5a670ed0da1bc7a70631b098c5a15322d5412c97a27f9b4b39e36b1e6111a3be6d6b4e588e88f4db4caf1324e205342d5bf801e75346acdaf75
7
- data.tar.gz: bc70d86423da28fe8e112dee2a91d54d2d572ab36cced3b62a9bc4b7e950b1bf2c559001bb48e2e5bb11ac3e901806176e6285c9599bd66e0c93d02275af86f8
6
+ metadata.gz: a99457b5cb78d9b4dbc55bd2301b546ecf08e21c359eece3683abfbf2d3d2cf91294c5ab9afb94615ceb62757587a138fdb02194dde442da25ca0dbd7e6b082f
7
+ data.tar.gz: ea78b244bbee7ac1def880af96b5fc9fa786df525da0419e50c1d4d8c98c7f036311d99ad96be698c9f1459ec77f2acf984552552237dc620dad156c0c59b936
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('continued_fractions', '1.4.0') do |config|
5
+ Echoe.new('continued_fractions', '1.5.0') do |config|
6
6
  config.summary = 'Generate continued fractions'
7
7
  config.description = 'Class for working with continued fractions'
8
8
 
@@ -1,9 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: continued_fractions 1.4.0 ruby lib
2
+ # stub: continued_fractions 1.5.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "continued_fractions"
6
- s.version = "1.4.0"
6
+ s.version = "1.5.0"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib"]
@@ -1,58 +1,11 @@
1
1
  # ContinuedFractions
2
2
  #
3
- # Generates quotients and convergents for a given number.
4
- #
5
- # Requires Ruby 1.9+
3
+ # Generates quotients and convergents for a given number
6
4
  #
7
5
  # Author:: Jose Hales-Garcia (mailto:jolohaga@me.com)
8
- # Copyright:: Copyright (c) 2010 Jose Hales-Garcia
6
+ # Copyright:: Copyright (c) 2015 Jose Hales-Garcia
9
7
  #
10
8
  #
11
- module ContinuedFractions
12
- class << self
13
- def convergence_matrix(n,m,fill=nil) #:nodoc:
14
- conv_mat = Array.new(n).map!{Array.new(m,fill)}
15
- conv_mat[0][0],conv_mat[1][1] = 0,0
16
- conv_mat
17
- end
18
-
19
- # Given an array of quotients return the array of convergents up to the nth convergent.
20
- # If nth is nil, return the entire list.
21
- #
22
- # Example:
23
- # ContinuedFractions.convergents([3,7,15,1])
24
- # => [[3, 1], [22, 7], [333, 106], [355, 113]]
25
- #
26
- # Or:
27
- # ContinuedFractions.convergents([3,7,15,1], 3)
28
- # => [[3, 1], [22, 7], [333, 106]]
29
- #
30
- def convergents(quotients,nth=nil)
31
- convs = ContinuedFractions.convergence_matrix(quotients.length+2,2,1)
32
- nth ||= convs.length
33
- 2.upto(quotients.length+1) do |i|
34
- i_minus1,i_minus2 = i-1,i-2
35
- convs[i][0] = convs[i_minus1][0]*quotients[i_minus2]+convs[i_minus2][0]
36
- convs[i][1] = convs[i_minus1][1]*quotients[i_minus2]+convs[i_minus2][1]
37
- end
38
- convs[2...nth+2]
39
- end
40
-
41
- # Convert the convergents array to Rationals
42
- #
43
- def convergents_array_to_rationals(convergents,nth=nil) #:nodoc:
44
- nth ||= convergents.length
45
- convergents[0...nth].map{|convergent| convergent_to_rational(convergent)}
46
- end
47
-
48
- # Convert a convergent element to a Rational
49
- #
50
- def convergent_to_rational(convergent) #:nodoc:
51
- Rational(convergent[0],convergent[1])
52
- end
53
- end
54
- end
55
-
56
9
  class ContinuedFraction
57
10
  attr_accessor :number, :quotients, :limit
58
11
  attr_writer :convergents
@@ -102,7 +55,8 @@ class ContinuedFraction
102
55
  # => [[3,1], [22,7], [333,106]]
103
56
  #
104
57
  def convergents(nth=nil)
105
- _convergents(nth)
58
+ nth ||= @convergents.length
59
+ @convergents[0...nth]
106
60
  end
107
61
 
108
62
  # Return array of convergents of the continued fraction instance converted as Rationals.
@@ -119,61 +73,61 @@ class ContinuedFraction
119
73
  # => [(3/1), (22/7), (333/106)]
120
74
  #
121
75
  def convergents_as_rationals(nth=nil)
122
- ContinuedFractions.convergents_array_to_rationals(convergents,nth)
76
+ nth ||= convergents.length
77
+ convergents[0...nth].map{|convergent| convergent_to_rational(convergent)}
123
78
  end
124
79
 
125
80
  def +(other)
126
- _number_of(other) do |num,prec|
127
- _evaluate("#{@number} + #{num}",prec)
81
+ number_of(other) do |num,prec|
82
+ evaluate("#{@number} + #{num}",prec)
128
83
  end
129
84
  end
130
85
 
131
86
  def -(other)
132
- _number_of(other) do |num,prec|
133
- _evaluate("#{@number} - #{num}",prec)
87
+ number_of(other) do |num,prec|
88
+ evaluate("#{@number} - #{num}",prec)
134
89
  end
135
90
  end
136
91
 
137
92
  def /(other)
138
- _number_of(other) do |num,prec|
139
- _evaluate("#{@number} / #{num}",prec)
93
+ number_of(other) do |num,prec|
94
+ evaluate("#{@number} / #{num}",prec)
140
95
  end
141
96
  end
142
97
 
143
98
  def *(other)
144
- _number_of(other) do |num,prec|
145
- _evaluate("#{@number} * #{num}",prec)
99
+ number_of(other) do |num,prec|
100
+ evaluate("#{@number} * #{num}",prec)
146
101
  end
147
102
  end
148
-
103
+
104
+ def convergent_to_rational(convergent) #:nodoc:
105
+ Rational(convergent[0],convergent[1])
106
+ end
107
+
149
108
  private
150
- def _evaluate(e,p) #:nodoc:
151
- ContinuedFraction.new(eval(e), p)
109
+ def evaluate(exp, prec) #:nodoc:
110
+ ContinuedFraction.new(eval(exp), prec)
152
111
  end
153
112
 
154
- def _number_of(n) #:nodoc:
113
+ def number_of(n) #:nodoc:
155
114
  num = nil
156
115
  prec = nil
157
116
  case n.class.name
158
117
  when "Fixnum","Integer"
159
118
  num = n
160
- prec = @limit
119
+ prec = limit
161
120
  when "ContinuedFraction"
162
121
  num = n.number
163
- prec = [n.limit,@limit].max
122
+ prec = [n.limit,limit].max
164
123
  end
165
124
  yield(num,prec)
166
125
  end
167
-
168
- def _convergents(nth=nil) #:nodoc:
169
- nth ||= @convergents.length
170
- @convergents[0...nth]
171
- end
172
126
 
173
127
  def calculate_quotients #:nodoc:
174
- qs = Array.new(@limit)
128
+ qs = Array.new(limit)
175
129
  n = @number
176
- @limit.times do |i|
130
+ limit.times do |i|
177
131
  qs[i] = n.to_i
178
132
  n = 1.0/(n-qs[i])
179
133
  end
@@ -181,6 +135,19 @@ class ContinuedFraction
181
135
  end
182
136
 
183
137
  def calculate_convergents #:nodoc:
184
- ContinuedFractions.convergents(quotients)
138
+ convs = convergence_matrix(quotients.length+2,2,1)
139
+ nth ||= convs.length
140
+ 2.upto(quotients.length+1) do |i|
141
+ i_minus1,i_minus2 = i-1,i-2
142
+ convs[i][0] = convs[i_minus1][0]*quotients[i_minus2]+convs[i_minus2][0]
143
+ convs[i][1] = convs[i_minus1][1]*quotients[i_minus2]+convs[i_minus2][1]
144
+ end
145
+ convs[2...nth+2]
146
+ end
147
+
148
+ def convergence_matrix(n,m,fill=nil) #:nodoc:
149
+ conv_mat = Array.new(n).map!{Array.new(m,fill)}
150
+ conv_mat[0][0],conv_mat[1][1] = 0,0
151
+ conv_mat
185
152
  end
186
153
  end
@@ -8,7 +8,7 @@ describe ContinuedFraction do
8
8
  # First 10 convergents of PI are...
9
9
  convs = ['3/1', '22/7', '333/106', '355/113', '103993/33102', '104348/33215', '208341/66317', '312689/99532', '833719/265381', '1146408/364913'].map{|c| Rational(c)}
10
10
  cf = described_class.new(Math::PI,10)
11
- expect((ContinuedFractions.convergents_array_to_rationals(cf.convergents) - convs)).to be_empty
11
+ expect((cf.convergents_as_rationals - convs)).to be_empty
12
12
  end
13
13
 
14
14
  it "should return array for convergents method" do
@@ -21,14 +21,14 @@ describe ContinuedFraction do
21
21
 
22
22
  it "should contain convergents approaching the number" do
23
23
  0.upto(cf.convergents.length-2) do |i|
24
- convergent_rational_i_plus1, convergent_rational_i = ContinuedFractions.convergent_to_rational(cf.convergents[i+1]), ContinuedFractions.convergent_to_rational(cf.convergents[i])
24
+ convergent_rational_i_plus1, convergent_rational_i = cf.convergent_to_rational(cf.convergents[i+1]), cf.convergent_to_rational(cf.convergents[i])
25
25
  expect(((convergent_rational_i_plus1 - cf.number).abs <= (convergent_rational_i - cf.number).abs)).to be true
26
26
  end
27
27
  end
28
28
 
29
29
  it "should contain convergents which are expressed in lowest terms" do
30
30
  1.upto(cf.convergents.length-1) do |i|
31
- convergent_rational_i, convergent_rational_i_plus1 = ContinuedFractions.convergent_to_rational(cf.convergent(i)), ContinuedFractions.convergent_to_rational(cf.convergent(i+1))
31
+ convergent_rational_i, convergent_rational_i_plus1 = cf.convergent_to_rational(cf.convergent(i)), cf.convergent_to_rational(cf.convergent(i+1))
32
32
  expect((convergent_rational_i.numerator*convergent_rational_i_plus1.denominator - convergent_rational_i_plus1.numerator*convergent_rational_i.denominator)).to eq (-1)**(i)
33
33
  end
34
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: continued_fractions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jose Hales-Garcia