@@ -75,6 +75,8 @@ immutable Poly{T}
75
75
end
76
76
77
77
Poly (n:: Number , var:: SymbolLike = :x ) = Poly ([n], var)
78
+ @compat (:: Type{Poly{T}} ){T,S}(x:: Vector{S} , var:: SymbolLike = :x ) =
79
+ Poly (convert (Vector{T}, x), var)
78
80
79
81
# create a Poly object from its roots
80
82
"""
@@ -107,8 +109,9 @@ include("show.jl") # display polynomials.
107
109
108
110
convert {T} (:: Type{Poly{T}} , p:: Poly{T} ) = p
109
111
convert {T} (:: Type{Poly{T}} , p:: Poly ) = Poly (convert (Vector{T}, p. a), p. var)
110
- convert {T, S<:Number} (:: Type{Poly{T}} , x:: S ) = Poly (promote_type (T, S)[x])
111
- convert {T, S<:Number,n} (:: Type{Poly{T}} , x:: Array{S,n} ) = map (el-> convert (Poly{promote_type (T,S)},el),x)
112
+ convert {T, S<:Number} (:: Type{Poly{T}} , x:: S , var:: SymbolLike = :x ) = Poly (promote_type (T, S)[x], var)
113
+ convert {T, S<:Number} (:: Type{Poly{T}} , x:: Vector{S} , var:: SymbolLike = :x ) = (R = promote_type (T,S); Poly (convert (Vector{R},x), var))
114
+ convert {T, S<:Number,n} (:: Type{Poly{T}} , x:: Array{S,n} , var:: SymbolLike = :x ) = map (el-> convert (Poly{promote_type (T,S)},el,var),x)
112
115
promote_rule {T, S} (:: Type{Poly{T}} , :: Type{Poly{S}} ) = Poly{promote_type (T, S)}
113
116
promote_rule {T, S<:Number} (:: Type{Poly{T}} , :: Type{S} ) = Poly{promote_type (T, S)}
114
117
eltype {T} (:: Poly{T} ) = T
@@ -298,15 +301,20 @@ function *{T,S}(p1::Poly{T}, p2::Poly{S})
298
301
Poly (a,p1. var)
299
302
end
300
303
301
- # # older . operators
302
- if VERSION < v " 0.6.0-dev "
304
+ # # older . operators, hack to avoid warning on v0.6
305
+ dot_operators = quote
303
306
@compat Base.:.+ {T<: Number }(c:: T , p:: Poly ) = + (p, c)
304
307
@compat Base.:.+ {T<: Number }(p:: Poly , c:: T ) = + (p, c)
305
308
@compat Base.:.- {T<: Number }(p:: Poly , c:: T ) = + (p, - c)
306
309
@compat Base.:.- {T<: Number }(c:: T , p:: Poly ) = + (p, - c)
307
310
@compat Base.:.* {T<: Number ,S}(c:: T , p:: Poly{S} ) = Poly (c * p. a, p. var)
308
311
@compat Base.:.* {T<: Number ,S}(p:: Poly{S} , c:: T ) = Poly (p. a * c, p. var)
309
312
end
313
+ VERSION < v " 0.6.0-dev" && eval (dot_operators)
314
+
315
+
316
+ # are any values NaN
317
+ hasnan (p:: Poly ) = reduce (| , (@compat isnan .(p. a)))
310
318
311
319
function divrem {T, S} (num:: Poly{T} , den:: Poly{S} )
312
320
if num. var != den. var
@@ -373,6 +381,7 @@ p(4) # 57 = 1 + 2*4 + 3*4^2
373
381
"""
374
382
function polyval {T,S} (p:: Poly{T} , x:: S )
375
383
R = promote_type (T,S)
384
+
376
385
lenp = length (p)
377
386
if lenp == 0
378
387
return zero (R) * x
@@ -407,20 +416,20 @@ polyint{T}(p::Poly{T}) = polyint(p, 0)
407
416
408
417
# if we have coefficients that have `NaN` representation
409
418
function polyint {T<:Union{Real,Complex},S<:Number} (p:: Poly{T} , k:: S )
410
- any ( map (isnan,p . a) ) && return Poly (promote_type (T,S)[NaN ])
411
- _polyint (p, k)
419
+ hasnan (p ) && return Poly (promote_type (T,S)[NaN ])
420
+ _polyint (p, k)
412
421
end
413
422
414
423
# if we have initial condition that can represent `NaN`
415
424
function polyint {T,S<:Union{Real,Complex}} (p:: Poly{T} , k:: S )
416
- isnan (k) && return Poly (promote_type (T,S)[NaN ])
417
- _polyint (p, k)
425
+ isnan (k) && return Poly (promote_type (T,S)[NaN ])
426
+ _polyint (p, k)
418
427
end
419
428
420
429
# if we have both coefficients and initial condition that can take `NaN`
421
430
function polyint {T<:Union{Real,Complex},S<:Union{Real,Complex}} (p:: Poly{T} , k:: S )
422
- ( any ( map (isnan,p . a)) || isnan (k) ) && return Poly (promote_type (T,S)[NaN ])
423
- _polyint (p, k)
431
+ hasnan (p) || isnan (k) && return Poly (promote_type (T,S)[NaN ])
432
+ _polyint (p, k)
424
433
end
425
434
426
435
# otherwise, catch all
@@ -450,12 +459,12 @@ polyder(Poly([1, 3, -1])) # Poly(3 - 2x)
450
459
"""
451
460
# if we have coefficients that can represent `NaN`s
452
461
function polyder {T<:Union{Real,Complex}} (p:: Poly{T} , order:: Int = 1 )
453
- n = length (p)
454
- order < 0 && error (" Order of derivative must be non-negative" )
455
- order == 0 && return p
456
- any ( map (isnan,p . a)) && return Poly (T[NaN ], p. var)
457
- n <= order && return Poly (T[], p. var)
458
- _polyder (p, order)
462
+ n = length (p)
463
+ order < 0 && error (" Order of derivative must be non-negative" )
464
+ order == 0 && return p
465
+ hasnan (p) && return Poly (T[NaN ], p. var)
466
+ n <= order && return Poly (T[], p. var)
467
+ _polyder (p, order)
459
468
end
460
469
461
470
# otherwise
@@ -520,7 +529,7 @@ function roots{T}(p::Poly{T})
520
529
companion = diagm (ones (R, n- 1 ), - 1 )
521
530
an = p[end - num_trailing_zeros]
522
531
companion[1 ,:] = - p[(end - num_trailing_zeros- 1 ): - 1 : num_leading_zeros] / an
523
-
532
+
524
533
D = eigvals (companion)
525
534
r = zeros (eltype (D),length (p)- num_trailing_zeros- 1 )
526
535
r[1 : n] = D
@@ -541,7 +550,7 @@ gcd(poly([1,1,2]), poly([1,2,3])) # returns (x-1)*(x-2)
541
550
```
542
551
"""
543
552
function gcd {T, S} (a:: Poly{T} , b:: Poly{S} )
544
- if all ( map ( abs, b. a).<= 2 * eps (S))
553
+ if reduce ( & , ( @compat abs .( b. a)) .<= 2 * eps (S))
545
554
return a
546
555
else
547
556
s, r = divrem (a, b)
0 commit comments