Skip to content

Commit 26a6aee

Browse files
committed
Merge pull request #24 from pwl/master
polyval now accepts any argument, fixed minor issues with variable names
2 parents 57f1458 + be9dcda commit 26a6aee

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

src/Polynomials.jl

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export Pade, padeval
88

99
import Base: length, endof, getindex, setindex!, copy, zero, one, convert
1010
import Base: show, print, *, /, //, -, +, ==, divrem, rem, eltype
11+
import Base: promote_rule
1112

1213
eps{T}(::Type{T}) = zero(T)
1314
eps{F<:FloatingPoint}(x::Type{F}) = Base.eps(F)
@@ -24,14 +25,16 @@ end
2425
Poly{T<:Number}(a::Vector{T}, var::Union(String,Symbol,Char)=:x) = Poly{T}(a, var)
2526

2627
convert{T}(::Type{Poly{T}}, p::Poly) = Poly(convert(Vector{T}, p.a), p.var)
28+
convert{T, S<:Number}(::Type{Poly{T}}, x::S) = Poly(promote_type(T, S)[x])
29+
convert{T, S<:Number,n}(::Type{Poly{T}}, x::Array{S,n}) = map(el->convert(Poly{promote_type(T,S)},el),x)
2730
promote_rule{T, S}(::Type{Poly{T}}, ::Type{Poly{S}}) = Poly{promote_type(T, S)}
2831
eltype{T}(::Poly{T}) = T
2932

3033
length(p::Poly) = length(p.a)
3134
endof(p::Poly) = length(p) - 1
3235

3336
getindex{T}(p::Poly{T}, i) = (i+1 > length(p.a) ? zero(T) : p.a[i+1])
34-
function setindex!(p::Poly, v, i)
37+
function setindex!(p::Poly, v, i)
3538
n = length(p.a)
3639
if n < i+1
3740
resize!(p.a,i+1)
@@ -43,9 +46,9 @@ end
4346

4447
copy(p::Poly) = Poly(copy(p.a), p.var)
4548

46-
zero{T}(p::Poly{T}) = zero(Poly{T})
49+
zero{T}(p::Poly{T}) = Poly([zero(T)], p.var)
4750
zero{T}(::Type{Poly{T}}) = Poly(T[])
48-
one{T}(p::Poly{T}) = one(Poly{T})
51+
one{T}(p::Poly{T}) = Poly([one(T)], p.var)
4952
one{T}(::Type{Poly{T}}) = Poly([one(T)])
5053

5154
function show(io::IO, p::Poly)
@@ -91,10 +94,10 @@ function printterm{T<:Complex}(io::IO,p::Poly{T},j,first)
9194
end
9295

9396
# We show a negative sign either for any complex number with negative
94-
# real part (and then negate the immaginary part) of for complex
97+
# real part (and then negate the immaginary part) of for complex
9598
# numbers that are pure imaginary with negative imaginary part
9699

97-
neg = ((abs_repj > 2*eps(T)) && real(pj) < 0) ||
100+
neg = ((abs_repj > 2*eps(T)) && real(pj) < 0) ||
98101
((abs_impj > 2*eps(T)) && imag(pj) < 0)
99102

100103
if first
@@ -130,16 +133,16 @@ function print{T}(io::IO, p::Poly{T})
130133
printed_anything || print(io,zero(T))
131134
end
132135

133-
*{T<:Number,S}(c::T, p::Poly{S}) = Poly(c * p.a)
134-
*{T<:Number,S}(p::Poly{S}, c::T) = Poly(p.a * c)
135-
/(p::Poly, c::Number) = Poly(p.a / c)
136-
-(p::Poly) = Poly(-p.a)
136+
*{T<:Number,S}(c::T, p::Poly{S}) = Poly(c * p.a, p.var)
137+
*{T<:Number,S}(p::Poly{S}, c::T) = Poly(p.a * c, p.var)
138+
/(p::Poly, c::Number) = Poly(p.a / c, p.var)
139+
-(p::Poly) = Poly(-p.a, p.var)
137140

138141
-(p::Poly, c::Number) = +(p, -c)
139142
+(c::Number, p::Poly) = +(p, c)
140143
function +(p::Poly, c::Number)
141144
if length(p) < 1
142-
return Poly([c,])
145+
return Poly([c,], p.var)
143146
else
144147
p2 = copy(p)
145148
p2.a[1] += c;
@@ -148,7 +151,7 @@ function +(p::Poly, c::Number)
148151
end
149152
function -{T}(c::Number, p::Poly{T})
150153
if length(p) < 1
151-
return Poly(T[c,])
154+
return Poly(T[c,], p.var)
152155
else
153156
p2 = -p;
154157
p2.a[1] += c;
@@ -160,13 +163,13 @@ function +{T,S}(p1::Poly{T}, p2::Poly{S})
160163
if p1.var != p2.var
161164
error("Polynomials must have same variable")
162165
end
163-
Poly([p1[i] + p2[i] for i = 0:max(length(p1),length(p2))])
166+
Poly([p1[i] + p2[i] for i = 0:max(length(p1),length(p2))], p1.var)
164167
end
165168
function -{T,S}(p1::Poly{T}, p2::Poly{S})
166169
if p1.var != p2.var
167170
error("Polynomials must have same variable")
168171
end
169-
Poly([p1[i] - p2[i] for i = 0:max(length(p1),length(p2))])
172+
Poly([p1[i] - p2[i] for i = 0:max(length(p1),length(p2))], p1.var)
170173
end
171174

172175

@@ -177,7 +180,7 @@ function *{T,S}(p1::Poly{T}, p2::Poly{S})
177180
R = promote_type(T,S)
178181
n = degree(p1)
179182
m = degree(p2)
180-
a = Poly(zeros(R,m+n+1))
183+
a = Poly(zeros(R,m+n+1), p1.var)
181184
for i = 0:n
182185
for j = 0:m
183186
a[i+j] += p1[i] * p2[j]
@@ -233,22 +236,22 @@ function ==(p1::Poly, p2::Poly)
233236
else
234237
for i = 1:max(length(p1),length(p2))
235238
if p1[i] != p2[i]
236-
return false
239+
return false
237240
end
238241
end
239242
return true
240243
end
241244
end
242245

243-
function polyval{T}(p::Poly{T}, x::Number)
244-
R = promote_type(T, typeof(x))
246+
function polyval{T,S}(p::Poly{T}, x::S)
247+
R = promote_type(T,S)
245248
lenp = length(p)
246249
if lenp == 0
247250
return zero(R)
248251
else
249252
y = convert(R, p[end])
250253
for i = (endof(p)-1):-1:0
251-
y = p[i] + x.*y
254+
y = p[i] + x*y
252255
end
253256
return y
254257
end

0 commit comments

Comments
 (0)