long-decimal 0.00.06 → 0.00.07

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README +15 -6
  2. data/VERSION +1 -1
  3. data/lib/longdecimal.rb +225 -80
  4. data/test/testlongdecimal.rb +107 -19
  5. metadata +2 -2
data/README CHANGED
@@ -6,13 +6,21 @@ load "longdecimal.rb"
6
6
  to your ruby-file. Please read the code to get an idea how to use this.
7
7
 
8
8
  To test on Linux/Unix:
9
- put longdecimal.rb and testlongdecimal.rb into the same directory,
10
- do
11
- chmod +x testlongdecimal.rb
12
- and run it
13
- ./testlongdecimal.rb
9
+ go into a directory long-decimal, put longdecimal.rb into a
10
+ sub-directory lib and testlongdecimal.rb into a sub-directory test.
11
+ This is the directory structure you get when unpacking the tar.gz
12
+ archive. Then:
14
13
 
15
- Licence
14
+ chmod +x test/testlongdecimal.rb
15
+
16
+ and run it:
17
+
18
+ ./test/testlongdecimal.rb
19
+
20
+ You should not get any error nor any failure. The tests will take a
21
+ minute or so, depending on the CPU-speed of your machine.
22
+
23
+ License
16
24
  -------
17
25
 
18
26
  Ruby's license or LGPL
@@ -31,3 +39,4 @@ Author
31
39
 
32
40
  Karl Brodowsky
33
41
  http://www.velofahren.de/cgi-bin/mailform.cgi
42
+ (no direct mail address because I do not like spam)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.00.06
1
+ 0.00.07
data/lib/longdecimal.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  #
2
2
  # longdecimal.rb -- Arbitrary precision decimals with fixed decimal point
3
3
  #
4
- # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/longdecimal.rb,v 1.2 2006/02/25 20:05:53 bk1 Exp $
5
- # CVS-Label: $Name: PRE_ALPHA_0_06 $
4
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/longdecimal.rb,v 1.3 2006/02/28 09:57:10 bk1 Exp $
5
+ # CVS-Label: $Name: PRE_ALPHA_0_07 $
6
6
  # Author: $Author: bk1 $ (Karl Brodowsky)
7
7
  #
8
8
  require "complex"
@@ -11,33 +11,190 @@ require "rational"
11
11
  # require "bigdecimal/math"
12
12
 
13
13
  #
14
- # add a functionality to find gcd with a high power of some number
15
- # probably Integer is not the right place for this stuff, because it
16
- # is quite special and should go to some kind of Math-like class in the
17
- # future.
14
+ # helper functions to support LongDecimal and LongDecimalQuot
15
+ # functions for LongDecimal that do not go as methods of LongDecimal
18
16
  #
19
- class Integer
17
+ module LongMath
20
18
 
21
19
  MAX_FLOATABLE = Float::MAX.to_i
22
20
  MIN_FLOATABLE = Float::MIN.to_i
23
21
 
24
22
  #
25
- # find the gcd of self with b^n0 where n0 is a sufficiently high
26
- # exponent such that gcd(self, b^m) = gcd(self, b^n)
23
+ # helper method: checks if word_len is of reasonable for splitting a
24
+ # number into parts
25
+ #
26
+ def LongMath.check_word_len(word_len)
27
+ raise TypeError, "word_len must be a positive number <= 1024" unless (word_len.kind_of? Fixnum) && word_len > 0 && word_len <= 1024
28
+ word_len
29
+ end
30
+
31
+ # private :check_word_len
32
+
33
+ #
34
+ # split number x into parts of word_len bits each
35
+ # such that the concatenation of these parts as bit patterns is x
36
+ #
37
+ def LongMath.split_to_words(x, word_len = 32)
38
+ check_word_len(word_len)
39
+ raise TypeError, "x must be Integer" unless x.kind_of? Integer
40
+ m = x.abs
41
+ s = (x <=> 0)
42
+ bit_pattern = (1 << word_len) - 1
43
+ words = []
44
+ while (m != 0 || words.length == 0) do
45
+ w = m & bit_pattern
46
+ m = m >> word_len
47
+ words.unshift(w)
48
+ end
49
+ if (s < 0) then
50
+ words[0] = -words[0]
51
+ end
52
+ words
53
+ end
54
+
55
+ #
56
+ # concatenate numbers given in words as bit patterns
57
+ #
58
+ def LongMath.merge_from_words(words, word_len = 32)
59
+ check_word_len(word_len)
60
+ raise TypeError, "words must be array of length > 0" unless (words.kind_of? Array) && words.length > 0
61
+ y = 0
62
+ s = (words[0] <=> 0)
63
+ if (s < 0) then
64
+ words[0] = -words[0]
65
+ end
66
+ words.each do |w|
67
+ y = y << word_len
68
+ y += w
69
+ end
70
+ if (s < 0) then
71
+ y = -y
72
+ end
73
+ y
74
+ end
75
+
76
+ #
77
+ # calculate the square root of an integer using bitwise algorithm
78
+ #
79
+ def LongMath.sqrtb(x)
80
+ a = sqrtb_with_remainder(x)
81
+ a[0]
82
+ end
83
+
84
+ def LongMath.sqrtb_with_remainder(x)
85
+ raise TypeError, "x must be integer" unless x.kind_of? Integer
86
+
87
+ s = (x <=> 0)
88
+ if (s == 0) then
89
+ return [0, 0]
90
+ elsif (s < 0)
91
+ a = sqrtb_with_remainder(-x)
92
+ return [ Complex(0, a[0]), a[1]]
93
+ end
94
+
95
+ xwords = split_to_words(x, 2)
96
+ xi = xwords[0] - 1
97
+ yi = 1
98
+
99
+ 1.upto(xwords.length-1) do |i|
100
+ xi = (xi << 2) + xwords[i]
101
+ d0 = (yi << 2) + 1
102
+ r = xi - d0
103
+ b = 0
104
+ if (r >= 0) then
105
+ b = 1
106
+ xi = r
107
+ end
108
+ yi = (yi << 1) + b
109
+ end
110
+ return [yi, xi]
111
+ end
112
+
113
+ #
114
+ # calculate the square root of an integer using larger chunks of the number
115
+ #
116
+ def LongMath.sqrtw(x, n = 16)
117
+ a = sqrtw_with_remainder(x, n)
118
+ a[0]
119
+ end
120
+
121
+ def LongMath.sqrtw_with_remainder(x, n = 16)
122
+ raise TypeError, "x must be integer" unless x.kind_of? Integer
123
+ raise TypeError, "n must be an integer" unless (n.kind_of? Integer)
124
+ n2 = n<<1
125
+ n1 = n+1
126
+ check_word_len(n2)
127
+
128
+ s = (x <=> 0)
129
+ if (s == 0) then
130
+ return [0, 0]
131
+ elsif (s < 0)
132
+ a = sqrtw_with_remainder(-x)
133
+ return [ Complex(0, a[0]), a[1]]
134
+ end
135
+
136
+ xwords = split_to_words(x, n2)
137
+ if (xwords.length == 1) then
138
+ return sqrtb_with_remainder(xwords[0])
139
+ end
140
+
141
+ # puts(xwords.inspect + "\n")
142
+ xi = (xwords[0] << n2) + xwords[1]
143
+ a = sqrtb_with_remainder(xi)
144
+ yi = a[0]
145
+ if (xwords.length <= 2) then
146
+ return a
147
+ end
148
+
149
+ xi -= yi*yi
150
+ 2.upto(xwords.length-1) do |i|
151
+ xi = (xi << n2) + xwords[i]
152
+ d0 = (yi << n1)
153
+ q = (xi / d0).to_i
154
+ q0 = q
155
+ j = 0
156
+ was_negative = false
157
+ while (true) do
158
+ d = d0 + q
159
+ r = xi - (q * d)
160
+ break if (0 <= r && (r < d || was_negative))
161
+ # puts("i=#{i} j=#{j} q=#{q} d0=#{d0} d=#{d} r=#{r} yi=#{yi} xi=#{xi}\n")
162
+ if (r < 0) then
163
+ was_negative = true
164
+ q = q-1
165
+ else
166
+ q = q+1
167
+ end
168
+ j += 1
169
+ if (j > 10) then
170
+ puts("i=#{i} j=#{j} q=#{q} q0=#{q0} d0=#{d0} d=#{d} r=#{r} yi=#{yi} xi=#{xi}\n")
171
+ break
172
+ end
173
+ end
174
+ xi = r
175
+ yi = (yi << n) + q
176
+ end
177
+ return [ yi, xi ]
178
+ end
179
+
180
+ #
181
+ # find the gcd of x with b^n0 where n0 is a sufficiently high
182
+ # exponent such that gcd(x, b^m) = gcd(x, b^n)
27
183
  # for all m, n > n0
28
184
  #
29
- def gcd_with_high_power(b)
30
- raise ZeroDivisionError, "gcd_with_high_power of zero with \"#{b.inspect}\" would be infinity" if self.zero?
185
+ def LongMath.gcd_with_high_power(x, b)
186
+ raise TypeError, "gcd_with_high_power can only be calculated for integers, but x=#{x.inspect} is no integer." unless x.kind_of? Integer
187
+ raise ZeroDivisionError, "gcd_with_high_power of zero with \"#{b.inspect}\" would be infinity" if x.zero?
31
188
  raise TypeError, "gcd_with_high_power can only be calculated for integers \"#{b.inspect}\" is no integer" unless b.kind_of? Integer
32
189
  raise ZeroDivisionError, "gcd_with_high_power with b < 2 is not defined. b=\"#{b.inspect}\"" if b < 2
33
- s = self.abs
190
+ s = x.abs
34
191
  exponent = 1
35
192
  b = b.abs
36
193
  if (b < s && s < MAX_FLOATABLE)
37
194
  exponent = (Math.log(s) / Math.log(b)).ceil
38
195
  end
39
- power = b**exponent
40
- result = 1
196
+ power = b**exponent
197
+ result = 1
41
198
  begin
42
199
  f = s.gcd(power)
43
200
  s /= f
@@ -51,45 +208,40 @@ class Integer
51
208
  # self. Only works for prime numbers
52
209
  # works even for numbers that exceed the range of Float
53
210
  #
54
- def multiplicity_of_factor(prime_number)
55
- power = gcd_with_high_power(prime_number)
56
- if (power.abs < MAX_FLOATABLE) then
57
- result = (Math.log(power) / Math.log(prime_number)).round
58
- else
59
- e = (Math.log(MAX_FLOATABLE) / Math.log(prime_number)).floor
60
- result = 0
61
- partial = prime_number ** e
62
- while (power > partial) do
63
- power /= partial
64
- result += e
211
+ def LongMath.multiplicity_of_factor(x, prime_number)
212
+
213
+ if (x.kind_of? Rational) || (x.kind_of? LongDecimalQuot) then
214
+ m1 = multiplicity_of_factor(x.numerator, prime_number)
215
+ m2 = multiplicity_of_factor(x.denominator, prime_number)
216
+ return m1 - m2
217
+
218
+ elsif (x.kind_of? LongDecimal)
219
+ m1 = x.numerator.multiplicity_of_factor(prime_number)
220
+ if (prime_number == 2 || prime_number == 5) then
221
+ return m1 - x.scale
222
+ else
223
+ return m1
65
224
  end
66
- result += (Math.log(power) / Math.log(prime_number)).round
67
- # result = (BigMath.log(BigDecimal(power.to_s + ".0", power.size)) / BigMath.log(BigDecimal(prime_number.to_s + ".0", prime_number.size))).round
68
- # raise TypeError, "numbers are too big p=#{prime_number} power=#{power}"
69
- end
70
- result
71
- end
72
- end
73
225
 
74
- #
75
- # add some functionality to Rational.
76
- # probably Rational is not the right place for this stuff, because it
77
- # is quite special and should go to some kind of Math-like class in the
78
- # future.
79
- #
80
- class Rational
226
+ elsif (x.kind_of? Integer)
81
227
 
82
- #
83
- # find the exponent of the highest power of b that divides
84
- # self. Count negative, if it divides the denominator
85
- # Only works for prime numbers
86
- # @todo: needs some improvements, in order to work well for numbers
87
- # that exceed the range of Float
88
- #
89
- def multiplicity_of_factor(prime_number)
90
- m1 = numerator.multiplicity_of_factor(prime_number)
91
- m2 = denominator.multiplicity_of_factor(prime_number)
92
- m1 - m2
228
+ power = gcd_with_high_power(x, prime_number)
229
+ if (power.abs < MAX_FLOATABLE) then
230
+ result = (Math.log(power) / Math.log(prime_number)).round
231
+ else
232
+ e = (Math.log(MAX_FLOATABLE) / Math.log(prime_number)).floor
233
+ result = 0
234
+ partial = prime_number ** e
235
+ while (power > partial) do
236
+ power /= partial
237
+ result += e
238
+ end
239
+ result += (Math.log(power) / Math.log(prime_number)).round
240
+ end
241
+ return result
242
+ else
243
+ raise TypeError, "type of x is not supported #{x.class} #{x.inpect}"
244
+ end
93
245
  end
94
246
 
95
247
  end
@@ -134,7 +286,7 @@ end
134
286
  # digits and the other one the position of the decimal point.
135
287
  #
136
288
  class LongDecimal < Numeric
137
- @RCS_ID='-$Id: longdecimal.rb,v 1.2 2006/02/25 20:05:53 bk1 Exp $-'
289
+ @RCS_ID='-$Id: longdecimal.rb,v 1.3 2006/02/28 09:57:10 bk1 Exp $-'
138
290
 
139
291
  include LongDecimalRoundingMode
140
292
 
@@ -242,8 +394,8 @@ class LongDecimal < Numeric
242
394
  # we need to come up with a better rule here.
243
395
  # if denominator is any product of powers of 2 and 5, we do not need to round
244
396
  denom = x.denominator
245
- mul_2 = denom.multiplicity_of_factor(2)
246
- mul_5 = denom.multiplicity_of_factor(5)
397
+ mul_2 = LongMath.multiplicity_of_factor(denom, 2)
398
+ mul_5 = LongMath.multiplicity_of_factor(denom, 5)
247
399
  iscale = [mul_2, mul_5].max
248
400
  scale += iscale
249
401
  denom /= 2 ** mul_2
@@ -640,7 +792,7 @@ class LongDecimal < Numeric
640
792
  end
641
793
  if (q.kind_of? LongDecimal) || (q.kind_of? LongDecimalQuot) then
642
794
  if (new_scale.nil?) then
643
- new_scale = q.scale
795
+ new_scale = q.scale
644
796
  end
645
797
  q.round_to_scale(new_scale, rounding_mode)
646
798
  else
@@ -694,20 +846,6 @@ class LongDecimal < Numeric
694
846
  return q, self - other * q
695
847
  end
696
848
 
697
- #
698
- # find the exponent of the highest power of prime number p that divides
699
- # self. Only works for prime numbers
700
- # works even for numbers that exceed the range of Float
701
- #
702
- def multiplicity_of_factor(prime_number)
703
- m1 = numerator.multiplicity_of_factor(prime_number)
704
- if (prime_number == 2 || prime_number == 5) then
705
- m1 - scale
706
- else
707
- m1
708
- end
709
- end
710
-
711
849
  def %(other)
712
850
  q, r = divmod other
713
851
  r
@@ -837,12 +975,29 @@ class LongDecimal < Numeric
837
975
  protected :move_point_left_int, :move_point_right_int
838
976
 
839
977
  #
840
- # calculate the sqare of self
978
+ # calculate the square of self
841
979
  #
842
980
  def square
843
981
  self * self
844
982
  end
845
983
 
984
+ def sqrt(new_scale, rounding_mode)
985
+ raise TypeError, "new_scale #{new_scale.inspect} must be integer" unless new_scale.kind_of? Integer
986
+ raise TypeError, "new_scale #{new_scale.inspect} must be >= 0" unless new_scale >= 0
987
+ raise TypeError, "mode #{mode.inspect} must be legal rounding mode" unless rounding_mode.kind_of? RoundingModeClass
988
+
989
+ new_scale1 = new_scale + 1
990
+ old_scale = (new_scale1 << 1)
991
+ x = round_to_scale(old_scale, rounding_mode)
992
+ root, rem = LongMath.sqrtb_with_remainder(x.int_val)
993
+ if (rem > 0 && (rounding_mode == ROUND_HALF_EVEN || rounding_mode == ROUND_HALF_DOWN)) then
994
+ rounding_mode = ROUND_HALF_UP
995
+ end
996
+ y = LongDecimal(root, new_scale1)
997
+ y.round_to_scale(new_scale, rounding_mode)
998
+ end
999
+
1000
+
846
1001
  #
847
1002
  # calculate the multiplicative inverse
848
1003
  #
@@ -940,7 +1095,6 @@ class LongDecimal < Numeric
940
1095
  sprintf("LongDecimal(%s, %s)", int_val.inspect, scale.inspect)
941
1096
  end
942
1097
 
943
-
944
1098
  end
945
1099
 
946
1100
  #
@@ -950,7 +1104,7 @@ end
950
1104
  #
951
1105
  class LongDecimalQuot < Numeric
952
1106
 
953
- @RCS_ID='-$Id: longdecimal.rb,v 1.2 2006/02/25 20:05:53 bk1 Exp $-'
1107
+ @RCS_ID='-$Id: longdecimal.rb,v 1.3 2006/02/28 09:57:10 bk1 Exp $-'
954
1108
 
955
1109
  include LongDecimalRoundingMode
956
1110
 
@@ -1115,15 +1269,6 @@ class LongDecimalQuot < Numeric
1115
1269
  # end
1116
1270
  # end
1117
1271
 
1118
- #
1119
- # find the exponent of the highest power of prime number p that divides
1120
- # self. Only works for prime numbers
1121
- # works even for numbers that exceed the range of Float
1122
- #
1123
- def multiplicity_of_factor(prime_number)
1124
- rat.multiplicity_of_factor(prime_number)
1125
- end
1126
-
1127
1272
  def square
1128
1273
  self * self
1129
1274
  end
@@ -2,8 +2,8 @@
2
2
  #
3
3
  # testlongdecimal.rb -- runit test for longdecimal.rb
4
4
  #
5
- # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdecimal.rb,v 1.2 2006/02/25 19:52:11 bk1 Exp $
6
- # CVS-Label: $Name: PRE_ALPHA_0_06 $
5
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdecimal.rb,v 1.3 2006/02/28 09:57:10 bk1 Exp $
6
+ # CVS-Label: $Name: PRE_ALPHA_0_07 $
7
7
  # Author: $Author: bk1 $ (Karl Brodowsky)
8
8
  #
9
9
 
@@ -15,38 +15,126 @@ load "lib/longdecimal.rb"
15
15
 
16
16
  class TestLongDecimal_class < RUNIT::TestCase
17
17
 
18
- @RCS_ID='-$Id: testlongdecimal.rb,v 1.2 2006/02/25 19:52:11 bk1 Exp $-'
18
+ @RCS_ID='-$Id: testlongdecimal.rb,v 1.3 2006/02/28 09:57:10 bk1 Exp $-'
19
+
20
+ def check_sqrtb(x, s)
21
+ y = LongMath.sqrtb(x)
22
+ z = y * y
23
+ zz = (y+1)*(y+1)
24
+ assert(0 <= y, "sqrt must be >= 0" + s)
25
+ assert(z <= x && x < zz, "y=#{y}=sqrt(#{x}) and x in [#{z}, #{zz})" + s)
26
+ y
27
+ end
28
+
29
+ def _test_sqrtb
30
+ assert_equal(Complex(0,1), LongMath.sqrtb(-1), "sqrt(-1)=i")
31
+ 1024.times do |x|
32
+ check_sqrtb(x, " loop x=#{x}")
33
+ end
34
+ 512.times do |i|
35
+ x1 = i*i
36
+ y = check_sqrtb(x1, " i*i i=#{i}")
37
+ assert_equal(i, y, "i=#{i} y=#{y}")
38
+ if (i > 0) then
39
+ x2 = x1 + 1
40
+ y = check_sqrtb(x2, " i*i+1 i=#{i}")
41
+ assert_equal(i, y, "i=#{i} y=#{y}")
42
+ x0 = x1 - 1
43
+ y = check_sqrtb(x0, " i*i-1 i=#{i}")
44
+ assert_equal(i-1, y, "i=#{i} y=#{y}")
45
+ end
46
+
47
+ x1 = 1 << i
48
+ y = check_sqrtb(x1, " 2**i i=#{i}")
49
+ if (i[0] == 0)
50
+ assert_equal(1 << (i>>1), y, "2^(i/2) i=#{i} y=#{y}")
51
+ end
52
+ if (i > 0) then
53
+ check_sqrtb(x1-1, " 2**i-1 i=#{i}")
54
+ check_sqrtb(x1+1, " 2**i+1 i=#{i}")
55
+ end
56
+
57
+ x1 = 3 << i
58
+ check_sqrtb(x1, " 3*2**i i=#{i}")
59
+ check_sqrtb(x1-1, " 3*2**i-1 i=#{i}")
60
+ check_sqrtb(x1+1, " 3*2**i+1 i=#{i}")
61
+ end
62
+ end
63
+
64
+ def check_sqrtw(x, s)
65
+ y = LongMath.sqrtw(x)
66
+ z = y * y
67
+ zz = (y+1)*(y+1)
68
+ assert(0 <= y, "sqrt must be >= 0" + s)
69
+ assert(z <= x && x < zz, "y=#{y}=sqrt(#{x}) and x in [#{z}, #{zz})" + s)
70
+ y
71
+ end
72
+
73
+ def test_sqrtw
74
+ assert_equal(Complex(0,1), LongMath.sqrtw(-1), "sqrt(-1)=i")
75
+ 1024.times do |x|
76
+ check_sqrtw(x, " loop x=#{x}")
77
+ end
78
+ 1024.times do |i|
79
+ x1 = i*i
80
+ y = check_sqrtw(x1, " i*i i=#{i}")
81
+ assert_equal(i, y, "i=#{i} y=#{y}")
82
+ if (i > 0) then
83
+ x2 = x1 + 1
84
+ y = check_sqrtw(x2, " i*i+1 i=#{i}")
85
+ assert_equal(i, y, "i=#{i} y=#{y}")
86
+ x0 = x1 - 1
87
+ y = check_sqrtw(x0, " i*i-1 i=#{i}")
88
+ assert_equal(i-1, y, "i=#{i} y=#{y}")
89
+ end
90
+
91
+ x1 = 1 << i
92
+ y = check_sqrtw(x1, " 2**i i=#{i}")
93
+ if (i[0] == 0)
94
+ assert_equal(1 << (i>>1), y, "2^(i/2) i=#{i} y=#{y}")
95
+ end
96
+ if (i > 0) then
97
+ check_sqrtw(x1-1, " 2**i-1 i=#{i}")
98
+ check_sqrtw(x1+1, " 2**i+1 i=#{i}")
99
+ end
100
+
101
+ x1 = 3 << i
102
+ check_sqrtw(x1, " 3*2**i i=#{i}")
103
+ check_sqrtw(x1-1, " 3*2**i-1 i=#{i}")
104
+ check_sqrtw(x1+1, " 3*2**i+1 i=#{i}")
105
+ end
106
+ end
19
107
 
20
108
  def test_gcd_with_high_power
21
109
  n = 224
22
- assert_equal(32, n.gcd_with_high_power(2), "2-part of 224 is 32")
23
- assert_equal(7, n.gcd_with_high_power(7), "7-part of 224 is 7")
24
- assert_equal(1, n.gcd_with_high_power(3), "3-part of 224 is 1")
110
+ assert_equal(32, LongMath.gcd_with_high_power(n, 2), "2-part of 224 is 32")
111
+ assert_equal(7, LongMath.gcd_with_high_power(n, 7), "7-part of 224 is 7")
112
+ assert_equal(1, LongMath.gcd_with_high_power(n, 3), "3-part of 224 is 1")
25
113
  end
26
114
 
27
115
  def test_multiplicity_of_factor
28
116
  n = 224
29
- assert_equal(5, n.multiplicity_of_factor(2), "ny_2(224) is 5")
30
- assert_equal(1, n.multiplicity_of_factor(7), "ny_7(224) is 1")
31
- assert_equal(0, n.multiplicity_of_factor(3), "ny_3(224) is 0")
117
+ assert_equal(5, LongMath.multiplicity_of_factor(n, 2), "ny_2(224) is 5")
118
+ assert_equal(1, LongMath.multiplicity_of_factor(n, 7), "ny_7(224) is 1")
119
+ assert_equal(0, LongMath.multiplicity_of_factor(n, 3), "ny_3(224) is 0")
32
120
  end
33
121
 
34
122
  def test_rat_multiplicity_of_factor
35
123
  n = Rational(224, 225)
36
- assert_equal(5, n.multiplicity_of_factor(2), "ny_2(n) is 5")
37
- assert_equal(1, n.multiplicity_of_factor(7), "ny_7(n) is 1")
38
- assert_equal(-2, n.multiplicity_of_factor(3), "ny_3(n) is -2")
39
- assert_equal(-2, n.multiplicity_of_factor(5), "ny_5(n) is -2")
40
- assert_equal(0, n.multiplicity_of_factor(11), "ny_11(n) is 0")
124
+ assert_equal(5, LongMath.multiplicity_of_factor(n, 2), "ny_2(n) is 5")
125
+ assert_equal(1, LongMath.multiplicity_of_factor(n, 7), "ny_7(n) is 1")
126
+ assert_equal(-2, LongMath.multiplicity_of_factor(n, 3), "ny_3(n) is -2")
127
+ assert_equal(-2, LongMath.multiplicity_of_factor(n, 5), "ny_5(n) is -2")
128
+ assert_equal(0, LongMath.multiplicity_of_factor(n, 11), "ny_11(n) is 0")
41
129
  end
42
130
 
43
131
  def test_rat_long_multiplicity_of_factor
44
132
  n = Rational(224*(10**600+1), 225*(5**800))
45
- assert_equal(5, n.multiplicity_of_factor(2), "ny_2(n) is 5")
46
- assert_equal(1, n.multiplicity_of_factor(7), "ny_7(n) is 1")
47
- assert_equal(-2, n.multiplicity_of_factor(3), "ny_3(n) is -2")
48
- assert_equal(-802, n.multiplicity_of_factor(5), "ny_5(n) is -2")
49
- assert_equal(0, n.multiplicity_of_factor(11), "ny_11(n) is 0")
133
+ assert_equal(5, LongMath.multiplicity_of_factor(n, 2), "ny_2(n) is 5")
134
+ assert_equal(1, LongMath.multiplicity_of_factor(n, 7), "ny_7(n) is 1")
135
+ assert_equal(-2, LongMath.multiplicity_of_factor(n, 3), "ny_3(n) is -2")
136
+ assert_equal(-802, LongMath.multiplicity_of_factor(n, 5), "ny_5(n) is -2")
137
+ assert_equal(0, LongMath.multiplicity_of_factor(n, 11), "ny_11(n) is 0")
50
138
  end
51
139
 
52
140
  def test_int_init
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: long-decimal
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.00.06
7
- date: 2006-02-25 00:00:00 +01:00
6
+ version: 0.00.07
7
+ date: 2006-02-28 00:00:00 +01:00
8
8
  summary: LongDecimal for numbers with fixed point
9
9
  require_paths:
10
10
  - lib