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