continued_fractions 1.8.3 → 1.8.5

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
  SHA256:
3
- metadata.gz: 3beec97175d427fec8bc5715efa6499a7c4e9705365b54ecac376b1a27c27636
4
- data.tar.gz: 286cdeda5f5581953ff39c193926d9a94d4693d0757f25e4c580655aa371b9f3
3
+ metadata.gz: f7aa696a6a061c921c1513ffeb7d17ce641a4936e89174e61accd3cf0615ca9f
4
+ data.tar.gz: 46d89b9a7a7242ec10bd5074858b443ea2b4e01101c6a1f005e512aceb4f880e
5
5
  SHA512:
6
- metadata.gz: ddbe0f9f64b4f7cce8bb461d8145b377e8256e130cb492b62039fa1e1cfd93b1fbbfde890b54512a962f887b9b3eb9bcfb8e60e9b7b90134505d65e6f02cbd7e
7
- data.tar.gz: 539fb7194853af5edc6bbcdd7b25af6ce7899fcf329d19c4c691f1ff675f0049ce73fba269b05457a6868983c29187454e25e35cae2e9aadc062c93e10c7b389
6
+ metadata.gz: 3388b0c412ace93cc15958c11afa99e4e08059e2be6f4726c37121c6eded00a725406218b14f8679ab252d6c565c5ccbdb4c9e276cef5c1bd8d6a26cc6edf8c5
7
+ data.tar.gz: fd8308ba053a0e2c09d146e720b5fd195b76fc78903236bb7335f6520e17551a4598905f6f667f35d046f41486e99969b599de16b96b0feb1a204945857f44b0
@@ -0,0 +1,12 @@
1
+ module ContinuedFractions
2
+ module Numeric
3
+ def to_cf(limit: ContinuedFraction::DEFAULT_LIMIT)
4
+ ContinuedFraction.new(self, limit)
5
+ end
6
+ alias :to_continued_fraction :to_cf
7
+ end
8
+ end
9
+
10
+ Float.include(ContinuedFractions::Numeric)
11
+ Integer.include(ContinuedFractions::Numeric)
12
+ Rational.include(ContinuedFractions::Numeric)
@@ -1,16 +1,20 @@
1
- # ContinuedFractions
1
+ require 'continued_fractions/include'
2
+
3
+ # ContinuedFraction
2
4
  #
3
5
  # Generates quotients and convergents for a given number
4
6
  #
5
7
  # Author:: Jose Hales-Garcia (mailto:jolohaga@me.com)
6
- # Copyright:: Copyright (c) 2021 Jose Hales-Garcia
8
+ # Copyright:: Copyright (c) 2022 Jose Hales-Garcia
7
9
  #
8
10
  #
9
11
  class ContinuedFraction
10
12
  include ::Comparable
11
13
 
12
14
  attr_accessor :number, :quotients, :limit
13
-
15
+
16
+ DEFAULT_LIMIT = 5
17
+
14
18
  # For a given number calculate its continued fraction quotients and convergents up to limit.
15
19
  #
16
20
  # The limit is 5 by default. Pass an integer in the second parameter to change it.
@@ -22,13 +26,12 @@ class ContinuedFraction
22
26
  # @convergents=[[0, 1], [1, 0], [3, 1], [22, 7], [333, 106],
23
27
  # [355, 113], [103993, 33102], [104348, 33215], [208341, 66317], [312689, 99532], [833719, 265381], [1146408, 364913]]>
24
28
  #
25
- def initialize(number,limit=5)
29
+ def initialize(number, limit=DEFAULT_LIMIT)
26
30
  @number = number
27
- @limit = limit
28
- @quotients = calculate_quotients
29
- @convergents = calculate_convergents
31
+ @ratioed_number = number.to_r
32
+ @quotients, @convergents, @limit = calculate_quotients_and_convergents(number, limit)
30
33
  end
31
-
34
+
32
35
  # Return nth convergent.
33
36
  #
34
37
  # Example:
@@ -40,7 +43,7 @@ class ContinuedFraction
40
43
  raise(IndexError, "Convergent index must be greater than zero.") unless nth > 0
41
44
  convergents[nth-1]
42
45
  end
43
-
46
+
44
47
  # Return array of convergents of the continued fraction instance up to the nth convergent as an array
45
48
  # comprising of numerators in [i,0] and denominators in [i,1].
46
49
  # If nth is nil, then return the entire list.
@@ -59,7 +62,7 @@ class ContinuedFraction
59
62
  nth ||= @convergents.length
60
63
  @convergents[0...nth]
61
64
  end
62
-
65
+
63
66
  # Return array of convergents of the continued fraction instance converted as Rationals.
64
67
  # If nth is nil, then return the entire list.
65
68
  #
@@ -77,25 +80,25 @@ class ContinuedFraction
77
80
  nth ||= convergents.length
78
81
  convergents[0...nth].map{|convergent| convergent_to_rational(convergent)}
79
82
  end
80
-
83
+
81
84
  def +(other)
82
85
  number_of(other) do |num,prec|
83
86
  evaluate("#{number} + #{num}",prec)
84
87
  end
85
88
  end
86
-
89
+
87
90
  def -(other)
88
91
  number_of(other) do |num,prec|
89
92
  evaluate("#{number} - #{num}",prec)
90
93
  end
91
94
  end
92
-
95
+
93
96
  def /(other)
94
97
  number_of(other) do |num,prec|
95
98
  evaluate("#{number} / #{num}",prec)
96
99
  end
97
100
  end
98
-
101
+
99
102
  def *(other)
100
103
  number_of(other) do |num,prec|
101
104
  evaluate("#{number} * #{num}",prec)
@@ -105,11 +108,11 @@ class ContinuedFraction
105
108
  def <=>(other)
106
109
  number <=> other.number
107
110
  end
108
-
111
+
109
112
  def convergent_to_rational(convergent) #:nodoc:
110
113
  Rational(convergent[0],convergent[1])
111
114
  end
112
-
115
+
113
116
  private
114
117
  def evaluate(exp, prec) #:nodoc:
115
118
  ContinuedFraction.new(eval(exp), prec)
@@ -129,40 +132,43 @@ class ContinuedFraction
129
132
  yield(num,prec)
130
133
  end
131
134
 
132
- def calculate_quotients #:nodoc:
133
- n = number
134
- Array.new(limit).tap do |qs|
135
- limit.times do |i|
136
- qs[i] = n.to_i
137
- break if ((divisor = n-qs[i]) == 0.0)
138
- n = 1.0/divisor
139
- end
140
- self.limit = qs.compact.length
141
- end.compact
142
- end
135
+ def calculate_quotients_and_convergents(x, limit)
136
+ _quotients = []
137
+ _convergents = []
143
138
 
144
- def calculate_convergents #:nodoc:
145
- nth = nil
146
- convergence_matrix(quotients.length+2,2,1).tap do |convs|
147
- nth ||= convs.length
148
- 2.upto(quotients.length+1) do |i|
149
- i_minus1,i_minus2 = i-1,i-2
150
- convs[i][0] = convs[i_minus1][0]*quotients[i_minus2]+convs[i_minus2][0]
151
- convs[i][1] = convs[i_minus1][1]*quotients[i_minus2]+convs[i_minus2][1]
152
- end
153
- end[2...nth+2]
154
- end
155
-
156
- def convergence_matrix(n,m,fill=nil) #:nodoc:
157
- Array.new(n).map!{Array.new(m,fill)}.tap do |conv_mat|
158
- conv_mat[0][0],conv_mat[1][1] = 0,0
139
+ # Initialize the initial values for p and q
140
+ p_minus_1, q_minus_1 = 0, 1
141
+ p_0, q_0 = 1, 0
142
+
143
+ n = x.to_i
144
+
145
+ # Loop for maximum specified terms or until the fractional part becomes zero
146
+ limit.times do
147
+ _quotients << n
148
+
149
+ # Calculate the new p and q
150
+ p_n = n * p_0 + p_minus_1
151
+ q_n = n * q_0 + q_minus_1
152
+
153
+ _convergents << [p_n, q_n]
154
+
155
+ # Recalculate the fractional part
156
+ x = 1.0 / (x - n)
157
+ break if x.infinite? || _convergents.include?([@ratioed_number.numerator, @ratioed_number.denominator])
158
+
159
+ # Update the old values
160
+ p_minus_1, q_minus_1 = p_0, q_0
161
+ p_0, q_0 = p_n, q_n
162
+ n = x.to_i
159
163
  end
164
+
165
+ return _quotients, _convergents, _quotients.length
160
166
  end
161
167
  end
162
168
 
163
169
  # @return [ContinuedFraction] new instance
164
170
  # @see ContinuedFraction#initialize
165
171
  #
166
- def ContinuedFraction(number,limit=5)
167
- ContinuedFraction.new(number,limit=5)
172
+ def ContinuedFraction(number,limit=ContinuedFraction::DEFAULT_LIMIT)
173
+ ContinuedFraction.new(number,limit)
168
174
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: continued_fractions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.3
4
+ version: 1.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jose Hales-Garcia
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-27 00:00:00.000000000 Z
11
+ date: 2023-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '11.1'
41
41
  description: Class for working with continued fractions
42
- email: jolohaga@me.com
42
+ email: jose@halesgarcia.com
43
43
  executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files:
@@ -50,13 +50,13 @@ files:
50
50
  - LICENSE
51
51
  - README.md
52
52
  - lib/continued_fractions.rb
53
- - lib/continued_fractions/version.rb
54
- homepage: http://jolohaga.github.io/continued_fractions
53
+ - lib/continued_fractions/include.rb
54
+ homepage: https://jolohaga.github.io/continued_fractions
55
55
  licenses:
56
56
  - MIT
57
57
  metadata:
58
58
  source_code_uri: https://github.com/jolohaga/continued_fractions
59
- post_install_message:
59
+ post_install_message:
60
60
  rdoc_options:
61
61
  - "--line-numbers"
62
62
  - "--title"
@@ -76,8 +76,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
76
  - !ruby/object:Gem::Version
77
77
  version: '1.2'
78
78
  requirements: []
79
- rubygems_version: 3.0.3
80
- signing_key:
79
+ rubygems_version: 3.4.19
80
+ signing_key:
81
81
  specification_version: 4
82
82
  summary: Generate continued fractions
83
83
  test_files: []
@@ -1,3 +0,0 @@
1
- module ContinuedFractions
2
- VERSION = "1.8.3"
3
- end