polynomial 0.7.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,469 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ require 'complex'
4
+ require 'bigdecimal'
5
+ require 'polynomial/multivariate'
6
+
7
+ MVP = Multivariate
8
+
9
+ class TestPoly < Test::Unit::TestCase
10
+
11
+ @@epsilon = 1e-7
12
+
13
+ def setup
14
+ @one = MVP::Unity
15
+ @zero = MVP::Zero
16
+ end
17
+
18
+ def test_incorrect_initialization
19
+ assert_raise(ArgumentError) { MVP.new }
20
+ assert_raise(ArgumentError) { MVP.new [] }
21
+ assert_raise(ArgumentError) { MVP.new [1], [2] }
22
+ assert_raise(ArgumentError) { MVP.new [1,2], [3,4] }
23
+ assert_raise(ArgumentError) { MVP.new [1,2,3], [4,5] }
24
+ assert_raise(TypeError) { MVP.new :oops }
25
+ assert_raise(TypeError) { MVP.new ['foo'] }
26
+ end
27
+
28
+ def test_initialization
29
+ assert_equal(MVP.new([1,0,0]), MVP.new([1,0,0],[0,0,3]))
30
+ end
31
+
32
+ def test_equal
33
+ assert_equal(MVP.new([1,0,0]), MVP.new([1,0,0]))
34
+ assert_not_equal(MVP.new([1,0,0]), MVP.new([1,1,0]))
35
+ assert_not_equal(MVP.new([1,0,0]), MVP.new([1,0,1]))
36
+ end
37
+
38
+ def test_degree
39
+ q = MVP.new([1,0,0],[1,0,3])
40
+ assert_equal(0, q.degree(0))
41
+ assert_equal(0, q.degree(1))
42
+ assert_equal(3, q.degree(2))
43
+ assert_raise(RangeError) { q.degree(42) }
44
+ end
45
+
46
+ CoefficientsVariablesValues = {
47
+ [[1,0,0]] => {
48
+ [0,0] => 1, [0,1] => 1, [1,0] => 1, [1,1] => 1, [1,-1] => 1, [-1,-1] => 1,
49
+ },
50
+ [[1,0,0],[1,1,0],[1,0,1]] => {
51
+ [0,0] => 1, [0,1] => 2, [1,0] => 2, [1,1] => 3, [1,-1] => 1,
52
+ [-1,-1] => -1, [0,-1] => 0,
53
+ },
54
+ [[2,2,0],[3,0,3]] => {
55
+ [0,0] => 0, [0,1] => 3, [1,0] => 2, [1,1] => 5, [1,-1] => -1,
56
+ [-1,-1] => -1, [0,-1] => -3, [-1,0] => 2, [2,0] => 8, [0,2] => 24,
57
+ [3,0] => 18, [0,3] => 81,
58
+ },
59
+ }
60
+ def test_substitute
61
+ CoefficientsVariablesValues.each_pair do |coefs_ary, var_val|
62
+ q = MVP.new(*coefs_ary)
63
+ var_val.each_pair do |var, val|
64
+ error_msg = "coefs_ary=#{coefs_ary.inspect}\nvar=#{var.inspect}\nval=#{val}"
65
+ assert_equal val, q.substitute(*var), error_msg
66
+ end
67
+ end
68
+ end
69
+
70
+ def test_multiplication
71
+ a = MVP.new([2,0,0])
72
+ b = MVP.new([1,1,0])
73
+ c = MVP.new([2,1,0])
74
+ assert_equal c, a*b
75
+ d = MVP.new([2,2,0])
76
+ assert_equal d, b*c
77
+ e = MVP.new([3,0,3])
78
+ f = MVP.new([6,2,3])
79
+ assert_equal f, d*e
80
+ a = MVP.new([2,0,0], [3,5,0], [7,0,11])
81
+ aa = MVP.new([4, 0, 0], [9, 10, 0], [49, 0, 22], [28, 0, 11], [42, 5, 11], [12, 5, 0])
82
+ assert_equal aa, a*a
83
+ end
84
+
85
+ def test_unity_and_zero
86
+ assert_equal @one, @one*@one
87
+ assert_not_equal @zero, @one
88
+ assert_equal @zero, @one*@zero
89
+ q = MVP.new([2,0,0], [3,5,0], [7,0,11])
90
+ assert_equal q, @one*q
91
+ assert_equal @zero, q*@zero
92
+ end
93
+
94
+ def test_power
95
+ assert_equal @one, @zero**0
96
+ assert_equal @zero, @zero**1
97
+ assert_equal @zero, @zero**2
98
+ q = MVP.new([2,0,0], [3,5,0], [7,0,11])
99
+ assert_equal @one, q**0
100
+ assert_equal q*q, q**2
101
+ assert_equal q*q*q, q**3
102
+ assert_raise(RangeError) { q**(-1) }
103
+ assert_raise(TypeError) { q**(2.3) }
104
+ end
105
+
106
+ =begin
107
+ def test_new_from_coefficients
108
+ assert_nothing_raised { Poly.new 0 }
109
+ assert_nothing_raised { Poly.new [0] }
110
+ assert_nothing_raised { Poly.new [1,2] }
111
+ assert_nothing_raised { Poly.new [1, 2.2] }
112
+ assert_nothing_raised { Poly.new [1, Complex(0,1)] }
113
+ assert_nothing_raised { Poly.new [1, BigDecimal('1e-2')] }
114
+ assert_nothing_raised { Poly.new 1,2 }
115
+ assert_equal Poly.new(1,2), Poly.new([1,2])
116
+ assert_equal Poly.new(1), Poly.new(1,0)
117
+ assert_equal Poly.new(1), Poly.new([1,0,0])
118
+ assert_equal Poly.new(1,2,3), Poly[1,2,3]
119
+ end
120
+
121
+ def test_new_from_block
122
+ assert_equal Poly.new(0,1,2), Poly.new(2) {|n| n }
123
+ assert_equal Poly.new(1,2,3), Poly.new(2) {|n| n+1 }
124
+ assert_equal Poly.new(0,1,4,9), Poly.new(3) {|n| n**2 }
125
+ assert_equal Poly.new(3.2), Poly.new(3.2) {|n| n**2 }
126
+ end
127
+
128
+ def test_new_from_power_coefficients_hash
129
+ assert_equal Poly[0,2], Poly.new({1=>2})
130
+ assert_equal Poly[0,0,3], Poly.new({2=>3})
131
+ assert_equal Poly[0,2,3], Poly[1=>2, 2=>3]
132
+ end
133
+
134
+ def test_new_from_valid_strings
135
+ assert_equal Poly[0], Poly['0']
136
+ assert_equal Poly[1], Poly[' 1 ']
137
+ assert_equal Poly[-1], Poly['-1']
138
+ assert_equal Poly[-1.3], Poly['-1.3']
139
+ assert_equal Poly[0,1], Poly['x']
140
+ assert_equal Poly[0,1], Poly['+x']
141
+ assert_equal Poly[0,1], Poly['+1x', {:multiplication_symbol=>''}]
142
+ assert_equal Poly[1,1], Poly['1+x']
143
+ assert_equal Poly[1,1], Poly['1+1x', {:multiplication_symbol=>''}]
144
+ assert_equal Poly[0,0,3], Poly['3*x**2']
145
+ assert_equal Poly[0,0,1], Poly['x**2']
146
+ assert_equal Poly[3,0,1], Poly['3+x**2']
147
+ assert_equal Poly[3,0,1], Poly['3+x^2', {:power_symbol=>'^'}]
148
+ assert_equal Poly[3,2], Poly['3+2*x']
149
+ assert_equal Poly[2,1], Poly['2+y', {:variable_name=>'y'}]
150
+ assert_equal Poly['4*x**2+2'], Poly[2,0,4]
151
+ assert_equal Poly[' 4*x**2 + 2 '], Poly[2,0,4]
152
+ assert_equal Poly[1,0,-7], Poly.from_string("1 - 7*x**2")
153
+ assert_equal Poly[3,4.1,5], Poly.from_string("3 + 4.1x + 5x^2", :multiplication_symbol=>'', :power_symbol=>'^')
154
+ assert_equal Poly[0,-3], Poly.from_string("-3*y", :variable_name=>'y')
155
+ assert_equal Poly[1e-2], Poly.from_string('1e-2')
156
+ assert_equal Poly[0,1e-2], Poly.from_string('1e-2*x')
157
+ assert_equal Poly[BigDecimal('1.1')], Poly.from_string(BigDecimal('1.1').to_s)
158
+ end
159
+
160
+ def test_from_invalid_strings_misc
161
+ assert_raise(ArgumentError) { Poly[''] }
162
+ assert_raise(ArgumentError) { Poly['1..'] }
163
+ assert_raise(ArgumentError) { Poly['1..1'] }
164
+ assert_raise(ArgumentError) { Poly['+'] }
165
+ assert_raise(ArgumentError) { Poly['++1'] }
166
+ assert_raise(ArgumentError) { Poly['-+1'] }
167
+ assert_raise(ArgumentError) { Poly['--1'] }
168
+ assert_raise(ArgumentError) { Poly['1-'] }
169
+ assert_raise(ArgumentError) { Poly['1.2-'] }
170
+ assert_raise(ArgumentError) { Poly['xx'] }
171
+ assert_raise(ArgumentError) { Poly['xx**2'] }
172
+ assert_raise(ArgumentError) { Poly['x*x'] }
173
+ assert_raise(ArgumentError) { Poly['x**x'] }
174
+ assert_raise(ArgumentError) { Poly['2**3'] }
175
+ assert_raise(ArgumentError) { Poly['x**3*4'] }
176
+ assert_raise(ArgumentError) { Poly['e2'] }
177
+ assert_raise(ArgumentError) { Poly['1e--2'] }
178
+ assert_raise(ArgumentError) { Poly['1ee2'] }
179
+ end
180
+
181
+ def test_from_invalid_strings_incomplete
182
+ assert_raise(ArgumentError) { Poly['1+'] }
183
+ assert_raise(ArgumentError) { Poly['1.2+'] }
184
+ assert_raise(ArgumentError) { Poly['1*'] }
185
+ assert_raise(ArgumentError) { Poly['1.2*'] }
186
+ assert_raise(ArgumentError) { Poly['2*x**'] }
187
+ end
188
+
189
+ def test_from_invalid_strings_symbol_omission
190
+ assert_raise(ArgumentError) { Poly['1x'] }
191
+ assert_raise(ArgumentError) { Poly['1.2x'] }
192
+ assert_raise(ArgumentError) { Poly['2*x3'] }
193
+ end
194
+
195
+ def test_from_invalid_strings_spaces
196
+ assert_raise(ArgumentError) { Poly['1 * x'] }
197
+ assert_raise(ArgumentError) { Poly['1 *x'] }
198
+ assert_raise(ArgumentError) { Poly['1* x'] }
199
+ assert_raise(ArgumentError) { Poly['1*x ** 2'] }
200
+ assert_raise(ArgumentError) { Poly['1*x **2'] }
201
+ assert_raise(ArgumentError) { Poly['1*x** 2'] }
202
+ end
203
+
204
+ def test_from_string_repeated
205
+ assert_equal Poly['1+2'], Poly[3]
206
+ assert_equal Poly['x+3*x'], Poly[0,4]
207
+ assert_equal Poly['1+x+x**2+2*x**2'], Poly[1,1,3]
208
+ end
209
+
210
+ def test_substitute
211
+ poly = Poly[0]
212
+ pairs = [[0,0], [1,0], [-1,0], [2,0], [0.33, 0]]
213
+ assert_in_out_pairs(poly, pairs)
214
+
215
+ poly = Poly[0, 1]
216
+ pairs = [[0,0], [1,1], [-1,-1], [2,2], [0.33, 0.33]]
217
+ assert_in_out_pairs(poly, pairs)
218
+
219
+ poly = Poly[0, 0, 1]
220
+ pairs = [[0,0], [1,1], [-1,1], [2,4], [0.33, 0.33**2]]
221
+ assert_in_out_pairs(poly, pairs)
222
+
223
+ poly = Poly[1, 1]
224
+ pairs = [[0,1], [1,2], [-1,0], [2,3], [0.33, 1.33]]
225
+ assert_in_out_pairs(poly, pairs)
226
+
227
+ poly = Poly[1, -1]
228
+ pairs = [[0,1], [1,0], [-1,2], [2,-1], [0.33, 1-0.33]]
229
+ assert_in_out_pairs(poly, pairs)
230
+
231
+ poly = Poly[Complex(0,1), 1]
232
+ pairs = [[0,Complex(0,1)], [1,Complex(1,1)], [-1,Complex(-1,1)], [2,Complex(2,1)], [0.33, Complex(0.33,1)]]
233
+ assert_in_out_pairs(poly, pairs)
234
+
235
+ poly = Poly[BigDecimal('0'), BigDecimal('1.11')]
236
+ pairs = [[0,BigDecimal('0')], [1,BigDecimal('1.11')], [-1,BigDecimal('-1.11')], [2,BigDecimal('2.22')], [BigDecimal('0.33'), BigDecimal('0.3663')]]
237
+ assert_in_out_pairs(poly, pairs)
238
+ end
239
+
240
+ def test_degree
241
+ assert_equal 0, Poly[0].degree
242
+ assert_equal 0, Poly[1].degree
243
+ assert_equal 1, Poly[1,2].degree
244
+ assert_equal 1, Poly[0,-1].degree
245
+ assert_equal 2, Poly[1,0,1].degree
246
+ end
247
+
248
+ def test_multiplication
249
+ assert_equal Poly[0], Poly[1] * 0
250
+ assert_equal Poly[0], 0 * Poly[1]
251
+ assert_equal Poly[1], Poly[1] * 1
252
+ assert_equal Poly[1], 1 * Poly[1]
253
+ assert_equal Poly[2], Poly[1] * 2
254
+ assert_equal Poly[2], Poly[1] * Poly[2]
255
+ assert_equal Poly[2,4,6], Poly[1,2,3] * 2
256
+ assert_equal Poly[2,4,6], 2 * Poly[1,2,3]
257
+ assert_equal Poly[0,0,1,2], Poly[0,1,2] * Poly[0,1]
258
+ end
259
+
260
+ def test_division_by_numeric
261
+ assert_equal Poly[0], Poly[0] / 1
262
+ assert_equal Poly[1], Poly[1] / 1
263
+ assert_equal Poly[0.5], Poly[1] / 2
264
+ assert_equal Poly[0.5], Poly[1] / 2.0
265
+ assert_equal Poly[1,2,3], Poly[2,4,6] / 2
266
+ end
267
+
268
+ def test_divmod
269
+ assert_equal [Poly[3], Poly[-8,-4]], Poly[1,2,3].divmod(Poly[3,2,1])
270
+ assert_equal [Poly[0], Poly[1,2]], Poly[1,2].divmod(Poly[1,2,3])
271
+ assert_equal [Poly[-27,-9,1], Poly[-123]], Poly[-42,0,-12,1].divmod(Poly[-3,1])
272
+ assert_equal [Poly[4,6], Poly[2]], Poly[2,4,6].divmod(Poly[0,1])
273
+ assert_equal [Poly[1,2,3], 0], Poly[2,4,6].divmod(2)
274
+ assert_raise(ArgumentError) { Poly[1,2,3].divmod(:foo) }
275
+ assert_raise(ArgumentError) { Poly[1,2,3].divmod(nil) }
276
+ end
277
+
278
+ def test_division_by_polynomial
279
+ assert_equal Poly[2], Poly[2,4,6] / Poly[1,2,3]
280
+ assert_equal Poly[0.5], Poly[1,2,3] / Poly[2,4,6]
281
+ assert_equal Poly[3], Poly[1,2,3] / Poly[3,2,1]
282
+ assert_equal Poly[1,2,3], Poly[2,4,6] / Poly[2]
283
+ end
284
+
285
+ @@quomod_data = [
286
+ [Poly[1,2,3], Poly[3,2,1], Poly[3], Poly[-8,-4]],
287
+ [Poly[1,2], Poly[1,2,3], Poly[0], Poly[1,2]],
288
+ [Poly[-42,0,-12,1], Poly[-3,1], Poly[-27,-9,1], Poly[-123]],
289
+ [Poly[1,3.quo(2)], 2, Poly[1.quo(2), 3.quo(4)], 0],
290
+ [Poly[2,4,6], Poly[0,3], Poly[4.quo(3),6.quo(3)], Poly[2]],
291
+ [Poly[1,3.quo(2)], Poly[2], Poly[1.quo(2), 3.quo(4)], 0],
292
+ [Poly[2,4,6], 2, Poly[1,2,3], 0],
293
+ ]
294
+ def test_quomod
295
+ @@quomod_data.each do |dividend, divisor, quotient, rest|
296
+ assert_equal [quotient, rest], dividend.quomod(divisor)
297
+ end
298
+ assert_raise(ArgumentError) { Poly[1,2,3].quomod(:foo) }
299
+ assert_raise(ArgumentError) { Poly[1,2,3].quomod(nil) }
300
+ end
301
+
302
+ def test_quo_by_numeric
303
+ assert_equal Poly[1.quo(2), 3.quo(4)], Poly[1,3.quo(2)].quo(2)
304
+ assert_equal Poly[1/2.0, 3.quo(2)/2.0], Poly[1,3.quo(2)].quo(2.0)
305
+ end
306
+
307
+ def test_quo_by_polynomial
308
+ assert_equal Poly[4.quo(3),6.quo(3)], Poly[2,4,6].quo(Poly[0,3])
309
+ assert_equal Poly[1.quo(2), 3.quo(4)], Poly[1,3.quo(2)].quo(2)
310
+ end
311
+
312
+ def test_remainder
313
+ @@quomod_data.each do |dividend, divisor, quotient, rest|
314
+ assert_equal rest, dividend % divisor
315
+ end
316
+ end
317
+
318
+ @@power_data = [
319
+ [Poly[1], 0, Poly[1]],
320
+ [Poly[1], 1, Poly[1]],
321
+ [Poly[1], 2, Poly[1]],
322
+ [Poly[0,1], 1, Poly[0,1]],
323
+ [Poly[0,1], 2, Poly[0,0,1]],
324
+ [Poly[3,4], 2, Poly[9,24,16]],
325
+ ]
326
+ def test_power
327
+ @@power_data.each do |polynomial, power, result|
328
+ assert_equal result, polynomial**power
329
+ end
330
+ assert_raise(ArgumentError) { Poly[1,2,3]**(-1) }
331
+ assert_raise(NoMethodError) { Poly[1,2,3]**(1.1) }
332
+ # Exceptions raised in Ruby 1.8 and 1.9 are different for the following
333
+ assert_raise(ArgumentError, NoMethodError) { Poly[1,2,3]**(:foo) }
334
+ end
335
+
336
+ def test_addition
337
+ assert_equal Poly[1], Poly[1] + 0
338
+ assert_equal Poly[2], Poly[1] + 1
339
+ assert_equal Poly[1,1], Poly[1] + Poly[0,1]
340
+ assert_equal Poly[2,3,4], Poly[2] + Poly[0,3,4]
341
+ end
342
+
343
+ def test_subtraction
344
+ assert_equal Poly[1], Poly[1] - 0
345
+ assert_equal Poly[0], Poly[1] - 1
346
+ assert_equal Poly[1,-1], Poly[1] - Poly[0,1]
347
+ assert_equal Poly[2,-3,-4], Poly[2] - Poly[0,3,4]
348
+ end
349
+
350
+ def test_to_s
351
+ assert_equal "0", Poly[0].to_s
352
+ assert_equal "1", Poly[1].to_s
353
+ assert_equal "x", Poly[0,1].to_s
354
+ assert_equal "1 + x", Poly[1,Complex(1,0)].to_s
355
+ assert_equal "0 + x", Poly[0,1].to_s(:verbose=>true)
356
+ assert_equal "1 - 2*x + 3*x**2", Poly[1,-2,3].to_s
357
+ assert_equal "3*x**2 - 2*x + 1", Poly[1,-2,3].to_s(:decreasing=>true)
358
+ assert_equal "1 + 0*x + 3*x**2", Poly[1,0,3].to_s(:verbose=>true)
359
+ assert_equal "-1 - 3*x^2", Poly[-1,0,-3].to_s(:power_symbol=>'^')
360
+ assert_equal "-1*y - 3*y**2", Poly[0,-1,-3].to_s(:variable_name=>'y')
361
+ assert_equal "0+x", Poly[0,1].to_s(:verbose=>true, :spaced=>false)
362
+ assert_equal "1-2*x+3*x**2", Poly[1,-2,3].to_s(:spaced=>false)
363
+ assert_equal "1+0*x+3*x**2", Poly[1,0,3].to_s(:verbose=>true, :spaced=>false)
364
+ assert_equal "-1-3*x^2", Poly[-1,0,-3].to_s(:power_symbol=>'^', :spaced=>false)
365
+
366
+ # Complex#to_s results in Ruby 1.8 and 1.9 are different
367
+ assert ["1 + (0 + 1i)*x", "1 + 1i*x"].include?(Poly[1,Complex(0,1)].to_s)
368
+
369
+ assert_equal "1 + (1 + 1i)*x", Poly[1,Complex(1,1)].to_s
370
+ assert_equal "1 + x", Poly[1,Complex(1,0)].to_s
371
+ assert_equal "-3.33694235763727e-05", Poly[-3.33694235763727e-05].to_s
372
+ assert_equal "1 + 3.33694235763727e-05*x", Poly[1,3.33694235763727e-05].to_s
373
+ assert_equal "1 + (2/3)*x", Poly[1,2.quo(3)].to_s
374
+ assert_equal "(-1/2) + (3/2)*x**2", Poly[-1.quo(2), 0, 3.quo(2)].to_s
375
+ end
376
+
377
+ def test_to_i
378
+ assert_raise(ArgumentError) { Poly[1,2].to_i }
379
+ assert_equal 0, Poly[0].to_i
380
+ assert_equal 3, Poly[3].to_i
381
+ assert_equal(-2, Poly[-2].to_i)
382
+ assert_equal 3, Poly[3.3].to_i
383
+ end
384
+
385
+ def test_to_f
386
+ assert_raise(ArgumentError) { Poly[1,2].to_f }
387
+ assert_equal 0.0, Poly[0].to_f
388
+ assert_equal 3.1, Poly[3.1].to_f
389
+ assert_equal(-2.2, Poly[-2.2].to_f)
390
+ end
391
+
392
+ def test_integral
393
+ assert_equal Poly[0], Poly[0].integral
394
+ assert_equal Poly[0,1], Poly[1].integral
395
+ assert_equal Poly[0,1], Poly[1].integral
396
+ assert_equal Poly[0,1,1/2.0], Poly[1,1].integral
397
+ assert_equal Poly[0,1,1/2.0,1/3.0], Poly[1,1,1].integral
398
+ end
399
+
400
+ def test_derivative
401
+ assert_equal Poly[0], Poly[0].derivative
402
+ assert_equal Poly[0], Poly[1].derivative
403
+ assert_equal Poly[0], Poly[2].derivative
404
+ assert_equal Poly[1], Poly[0,1].derivative
405
+ assert_equal Poly[1,2], Poly[1,1,1].derivative
406
+ end
407
+
408
+ def test_derivatives
409
+ z = Poly[0]
410
+ assert_equal [z], z.derivatives
411
+ assert_equal [Poly[1], z], Poly[0,1].derivatives
412
+ assert_equal [Poly[2], z], Poly[1,2].derivatives
413
+ assert_equal [Poly[4,10], Poly[10], z], Poly[3,4,5].derivatives
414
+ assert_equal [Poly[2,6,12], Poly[6,24], Poly[24], z], Poly[1,2,3,4].derivatives
415
+ end
416
+
417
+ def test_integral_derivative_cascading
418
+ coefs = Array.new(16) { rand }
419
+ assert Poly[coefs].equal_in_delta Poly[coefs].integral.derivative, @@epsilon
420
+ assert Poly[0, *coefs[1..-1]].equal_in_delta Poly[coefs].derivative.integral, @@epsilon
421
+ end
422
+
423
+ def test_equal_in_delta
424
+ assert Poly[0].equal_in_delta(Poly[@@epsilon], @@epsilon)
425
+ assert Poly[1].equal_in_delta(Poly[1-@@epsilon], @@epsilon)
426
+ assert Poly[-@@epsilon,@@epsilon].equal_in_delta(Poly[@@epsilon, -@@epsilon], 2*@@epsilon)
427
+ end
428
+
429
+ def test_derivative_integral
430
+ [ [0], [1], [0, 42], [1,11], [3,4,5] ].each do |coefs|
431
+ poly = Poly.new(coefs)
432
+ assert poly.equal_in_delta(poly.integral.derivative, @@epsilon)
433
+ end
434
+ 1.upto(10) do |n|
435
+ poly = Poly.new( Array.new(n) {|m| 2*m + rand } )
436
+ assert poly.equal_in_delta(poly.integral.derivative, @@epsilon)
437
+ end
438
+ end
439
+
440
+ def test_compare
441
+ a = Poly[2]
442
+ b = Poly[2,1]
443
+ c = Poly[2,2]
444
+ d = Poly[2,1,2]
445
+ assert_equal [a,b,c,d], [d,b,c,a].sort
446
+ assert_equal 0, Poly[0]
447
+ assert_equal Poly[1], 1
448
+ assert_equal Poly[0.5], 0.5
449
+ assert_equal 0.5, Poly[0.5]
450
+ assert_not_equal 1, Poly[1,2]
451
+ assert_raise(TypeError) { Poly[1] <=> 'foo' }
452
+ end
453
+
454
+ def test_coerce
455
+ assert_equal [Poly[2],Poly[1]], Poly[1].coerce(2)
456
+ assert_equal [Poly[2],Poly[1]], Poly[1].coerce(Poly[2])
457
+ assert_raise(TypeError) { Poly[1].coerce('foo') }
458
+ end
459
+
460
+ # HELPER FUNCTIONS
461
+
462
+ def assert_in_out_pairs(polynomial, input_output_pairs, delta=@@epsilon)
463
+ input_output_pairs.each do |x, y|
464
+ assert_equal y, polynomial.substitute(x)
465
+ end
466
+ end
467
+ =end
468
+
469
+ end