Skip to content

Commit 799c42c

Browse files
committed
Add element-wise operation support (closes #51)
Added .* .- .+ support between numbers and Polys. Added promotion rule between Numbers and Polys. Added unit tests.
1 parent 2ce7b4a commit 799c42c

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

src/Polynomials.jl

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export Pade, padeval
1212
export truncate!
1313

1414
import Base: length, endof, getindex, setindex!, copy, zero, one, convert, norm, gcd
15-
import Base: show, print, *, /, //, -, +, ==, divrem, div, rem, eltype
15+
import Base: show, print, *, /, //, -, +, ==, divrem, div, rem, eltype, .*, .-, .+
1616
import Base: promote_rule, truncate, chop
1717
if VERSION >= v"0.4"
1818
import Base.call
@@ -111,6 +111,7 @@ convert{T}(::Type{Poly{T}}, p::Poly) = Poly(convert(Vector{T}, p.a), p.var)
111111
convert{T, S<:Number}(::Type{Poly{T}}, x::S) = Poly(promote_type(T, S)[x])
112112
convert{T, S<:Number,n}(::Type{Poly{T}}, x::Array{S,n}) = map(el->convert(Poly{promote_type(T,S)},el),x)
113113
promote_rule{T, S}(::Type{Poly{T}}, ::Type{Poly{S}}) = Poly{promote_type(T, S)}
114+
promote_rule{T, S<:Number}(::Type{Poly{T}}, ::Type{S}) = Poly{promote_type(T, S)}
114115
eltype{T}(::Poly{T}) = T
115116

116117
"""
@@ -212,11 +213,17 @@ one{T}(::Type{Poly{T}}) = Poly([one(T)])
212213
## Overload arithmetic operators for polynomial operations between polynomials and scalars
213214
*{T<:Number,S}(c::T, p::Poly{S}) = Poly(c * p.a, p.var)
214215
*{T<:Number,S}(p::Poly{S}, c::T) = Poly(p.a * c, p.var)
216+
.*{T<:Number,S}(c::T, p::Poly{S}) = Poly(c * p.a, p.var)
217+
.*{T<:Number,S}(p::Poly{S}, c::T) = Poly(p.a * c, p.var)
215218
/(p::Poly, c::Number) = Poly(p.a / c, p.var)
216219
-(p::Poly) = Poly(-p.a, p.var)
217-
-(p::Poly, c::Number) = +(p, -c)
218-
+(c::Number, p::Poly) = +(p, c)
219-
function +(p::Poly, c::Number)
220+
-{T<:Number}(p::Poly, c::T) = +(p, -c)
221+
.-{T<:Number}(p::Poly, c::T) = +(p, -c)
222+
.-{T<:Number}(c::T, p::Poly) = +(p, -c)
223+
+{T<:Number}(c::T, p::Poly) = +(p, c)
224+
.+{T<:Number}(c::T, p::Poly) = +(p, c)
225+
.+{T<:Number}(p::Poly, c::T) = +(p, c)
226+
function +{T<:Number}(p::Poly, c::T)
220227
if length(p) < 1
221228
return Poly([c,], p.var)
222229
else
@@ -225,7 +232,7 @@ function +(p::Poly, c::Number)
225232
return p2;
226233
end
227234
end
228-
function -{T}(c::Number, p::Poly{T})
235+
function -{T<:Number}(c::T, p::Poly)
229236
if length(p) < 1
230237
return Poly(T[c,], p.var)
231238
else

test/runtests.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,17 @@ psum = p1 + p2 - p3
153153
@test truncate(Poly([2,1]),reltol=1/2,abstol=0) == Poly([2])
154154
@test truncate(Poly([2,1]),reltol=1,abstol=0) == Poly([0])
155155
@test truncate(Poly([2,1]),reltol=0,abstol=1) == Poly([2])
156+
157+
## elementwise operations
158+
println("Test for element-wise operations")
159+
p1 = Poly([1, 2])
160+
p2 = Poly([3, 1.])
161+
p = [p1, p2]
162+
q = [3, p1]
163+
@test isa(q,Vector{Poly{Int64}})
164+
psum = p+3
165+
pprod = p*3
166+
pmin = p-3
167+
@test isa(psum, Vector{Poly{Float64}})
168+
@test isa(pprod,Vector{Poly{Float64}})
169+
@test isa(pmin, Vector{Poly{Float64}})

0 commit comments

Comments
 (0)