@@ -71,7 +71,6 @@ function fromroots(P::Type{<:ChebyshevT}, roots::AbstractVector{T}; var::SymbolL
71
71
p = tmp
72
72
n = m
73
73
end
74
- # return truncate!(reduce(*, p))
75
74
return truncate! (p[1 ])
76
75
end
77
76
@@ -149,29 +148,28 @@ function Base.:*(p1::ChebyshevT{T}, p2::ChebyshevT{S}) where {T,S}
149
148
end
150
149
151
150
# #
152
- # function Base.divrem(num::ChebyshevT{T}, den::ChebyshevT{S}) where {T,S}
153
- # num.var != den.var && error("Polynomials must have same variable")
154
- # n = length(num) - 1
155
- # m = length(den) - 1
156
- # if m == 0 && den[0] ≈ 0 throw(DivideError()) end
157
- # R = typeof(one(T) / one(S))
158
- # P = ChebyshevT{R}
159
- # deg = n - m + 1
160
- # if deg ≤ 0
161
- # return zero(P), convert(P, num)
162
- # end
163
- # q_coeff = zeros(R, deg)
164
- # r_coeff = R.(num[0:n])
165
- # @inbounds for i in n:-1:m
166
- # q = r_coeff[i + 1] / den[m]
167
- # q_coeff[i - m + 1] = q
168
- # @inbounds for j in 0:m
169
- # elem = den[j] * q
170
- # r_coeff[i - m + j + 1] -= elem
171
- # end
172
- # end
173
- # return P(q_coeff, num.var), P(r_coeff, num.var)
174
- # end
151
+ function Base. divrem (num:: ChebyshevT{T} , den:: ChebyshevT{S} ) where {T,S}
152
+ num. var != den. var && error (" Polynomials must have same variable" )
153
+ n = length (num) - 1
154
+ m = length (den) - 1
155
+
156
+ R = typeof (one (T) / one (S))
157
+ P = ChebyshevT{R}
158
+
159
+ if n < m
160
+ return zero (P), convert (P, num)
161
+ elseif m == 0
162
+ den[0 ] ≈ 0 && throw (DivideError ())
163
+ return num ./ den[end ], zero (P)
164
+ end
165
+
166
+ znum = _c_to_z (num. coeffs)
167
+ zden = _c_to_z (den. coeffs)
168
+ quo, rem = _z_division (znum, zden)
169
+ q_coeff = _z_to_c (quo)
170
+ r_coeff = _z_to_c (rem)
171
+ return P (q_coeff, num. var), P (r_coeff, num. var)
172
+ end
175
173
# ##
176
174
# function Base.gcd(a::ChebyshevT{T}, b::ChebyshevT{S}) where {T,S}
177
175
# U = typeof(one(T) / one(S))
@@ -213,3 +211,39 @@ function _z_to_c(z::AbstractVector{T}) where {T}
213
211
cs[2 : n] *= 2
214
212
return cs
215
213
end
214
+
215
+ function _z_division (z1:: AbstractVector{T} , z2:: AbstractVector{S} ) where {T,S}
216
+ R = eltype (one (T) / one (S))
217
+ length (z1)
218
+ length (z2)
219
+ if length (z2) == 1
220
+ z1 ./= z2
221
+ return z1, zero (R)
222
+ elseif length (z1) < length (z2)
223
+ return zero (R), R .(z1)
224
+ end
225
+ dlen = length (z1) - length (z2)
226
+ scl = z2[1 ]
227
+ z2 ./= scl
228
+ quo = Vector {R} (undef, dlen + 1 )
229
+ i = 1
230
+ j = dlen + 1
231
+ while i < j
232
+ r = z1[i]
233
+ quo[i] = z1[i]
234
+ quo[end - i + 1 ] = r
235
+ tmp = r .* z2
236
+ z1[i: i + length (z2) - 1 ] .- = tmp
237
+ z1[j: j + length (z2) - 1 ] .- = tmp
238
+ i += 1
239
+ j -= 1
240
+ end
241
+
242
+ r = z1[i]
243
+ quo[i] = r
244
+ tmp = r * z2
245
+ z1[i: i + length (z2) - 1 ] .- = tmp
246
+ quo ./= scl
247
+ rem = z1[i + 1 : i - 2 + length (z2)]
248
+ return quo, rem
249
+ end
0 commit comments