@@ -6,7 +6,7 @@ module Polynomials
6
6
using Compat
7
7
8
8
export Poly, polyval, polyint, polyder, poly, roots
9
- export Pade, padeval
9
+ export Pade, padeval, degree
10
10
11
11
import Base: length, endof, getindex, setindex!, copy, zero, one, convert
12
12
import Base: show, print, * , / , // , - , + , == , divrem, rem, eltype
@@ -23,7 +23,14 @@ immutable Poly{T<:Number}
23
23
a:: Vector{T}
24
24
var:: Symbol
25
25
function Poly (a:: Vector{T} , var)
26
- new (a, symbol (var))
26
+ # if a == [] we replace it with a = [0]
27
+ if length (a) == 0
28
+ return new (zeros (T,1 ), symbol (var))
29
+ else
30
+ # determine the last nonzero element and truncate a accordingly
31
+ a_last = max (1 ,findlast ( p-> (abs (p) > 2 * eps (T)), a))
32
+ new (a[1 : a_last], symbol (var))
33
+ end
27
34
end
28
35
end
29
36
@@ -36,6 +43,7 @@ promote_rule{T, S}(::Type{Poly{T}}, ::Type{Poly{S}}) = Poly{promote_type(T, S)}
36
43
eltype {T} (:: Poly{T} ) = T
37
44
38
45
length (p:: Poly ) = length (p. a)
46
+ degree (p:: Poly ) = length (p)- 1
39
47
endof (p:: Poly ) = length (p) - 1
40
48
41
49
getindex {T} (p:: Poly{T} , i) = (i+ 1 > length (p. a) ? zero (T) : p. a[i+ 1 ])
@@ -183,53 +191,48 @@ function *{T,S}(p1::Poly{T}, p2::Poly{S})
183
191
error (" Polynomials must have same variable" )
184
192
end
185
193
R = promote_type (T,S)
186
- n = degree (p1)
187
- m = degree (p2)
188
- a = Poly (zeros (R,m+ n+ 1 ), p1. var)
194
+ n = length (p1)- 1
195
+ m = length (p2)- 1
196
+ a = zeros (R,m+ n+ 1 )
197
+
189
198
for i = 0 : n
190
199
for j = 0 : m
191
- a[i+ j] += p1[i] * p2[j]
192
- end
193
- end
194
- a
195
- end
196
-
197
- function degree {T} (p:: Poly{T} )
198
- for i = length (p): - 1 : 0
199
- if abs (p[i]) > 2 * eps (T)
200
- return i
200
+ a[i+ j+ 1 ] += p1[i] * p2[j]
201
201
end
202
202
end
203
- return 0
203
+ Poly (a,p1 . var)
204
204
end
205
205
206
206
function divrem {T, S} (num:: Poly{T} , den:: Poly{S} )
207
207
if num. var != den. var
208
208
error (" Polynomials must have same variable" )
209
209
end
210
- m = degree (den)
210
+ m = length (den)- 1
211
211
if m == 0 && den[0 ] == 0
212
212
throw (DivideError ())
213
213
end
214
214
R = typeof (one (T)/ one (S))
215
- n = degree (num)
215
+ n = length (num)- 1
216
216
deg = n- m+ 1
217
217
if deg <= 0
218
218
return convert (Poly{R}, zero (num)), convert (Poly{R}, num)
219
219
end
220
- # We will still modify q,r, but already wrap it in a
221
- # polynomial, so the indexing below is more natural
222
- pQ = Poly ( zeros (R, deg), num. var )
223
- pR = Poly ( zeros (R, n + 1 ), num. var)
224
- pR . a[:] = num. a[1 : ( n+ 1 ) ]
220
+
221
+ aQ = zeros (R, deg)
222
+ # aR = deepcopy( num.a )
223
+ @show num. a
224
+ aR = R[ num. a[i] for i = 1 : n+ 1 ]
225
225
for i = n: - 1 : m
226
- quot = pR[i ] / den[m]
227
- pQ [i- m] = quot
226
+ quot = aR[i + 1 ] / den[m]
227
+ aQ [i- m+ 1 ] = quot
228
228
for j = 0 : m
229
229
elem = den[j]* quot
230
- pR [i- (m- j)] -= elem
230
+ aR [i- (m- j)+ 1 ] -= elem
231
231
end
232
232
end
233
+ pQ = Poly (aQ, num. var)
234
+ pR = Poly (aR, num. var)
235
+
233
236
return pQ, pR
234
237
end
235
238
/ (num:: Poly , den:: Poly ) = divrem (num, den)[1 ]
@@ -239,12 +242,7 @@ function ==(p1::Poly, p2::Poly)
239
242
if p1. var != p2. var
240
243
return false
241
244
else
242
- for i = 1 : max (length (p1),length (p2))
243
- if p1[i] != p2[i]
244
- return false
245
- end
246
- end
247
- return true
245
+ return p1. a == p2. a
248
246
end
249
247
end
250
248
@@ -273,11 +271,10 @@ function polyint{T}(p::Poly{T}, k::Number=0)
273
271
R = typeof (one (T)/ 1 )
274
272
a2 = Array (R, n+ 1 )
275
273
a2[1 ] = k
276
- p2 = Poly (a2, p. var)
277
274
for i = 1 : n
278
- p2[i ] = p[i- 1 ] / i
275
+ a2[i + 1 ] = p[i- 1 ] / i
279
276
end
280
- p2
277
+ return Poly (a2, p . var)
281
278
end
282
279
283
280
function polyder {T} (p:: Poly{T} , order:: Int = 1 )
@@ -289,11 +286,11 @@ function polyder{T}(p::Poly{T}, order::Int=1)
289
286
elseif order == 0
290
287
return p
291
288
else
292
- p2 = Poly ( Array (T, n- order), p . var )
289
+ a2 = Array (T, n- order)
293
290
for i = order: n- 1
294
- p2 [i- order] = p[i] * prod ((i- order+ 1 ): i)
291
+ a2 [i- order+ 1 ] = p[i] * prod ((i- order+ 1 ): i)
295
292
end
296
- return p2
293
+ return Poly (a2, p . var)
297
294
end
298
295
end
299
296
0 commit comments