@@ -255,29 +255,68 @@ end
255
255
\ (A:: Legendre , B:: Jacobi ) = Jacobi (A)\ B
256
256
\ (A:: Legendre , B:: Weighted{<:Any,<:Jacobi} ) = Jacobi (A)\ B
257
257
258
- function \ (A:: Jacobi , B:: Jacobi )
259
- T = promote_type (eltype (A), eltype (B))
260
- a,b = B. a,B. b
261
- if A. a ≈ a && A. b ≈ b
262
- Eye {T} (∞)
263
- elseif isone (- a- b) && A. a == a && A. b == b+ 1
264
- Bidiagonal (Vcat (1 , ((2 : ∞) .+ (a+ b)) ./ ((3 : 2 : ∞) .+ (a+ b))), ((1 : ∞) .+ a) ./ ((3 : 2 : ∞) .+ (a+ b)), :U )
265
- elseif isone (- a- b) && A. a == a+ 1 && A. b == b
258
+ function _jacobi_convert_a (a, b) # Jacobi(a+1, b) \ Jacobi(a, b)
259
+ if isone (- a- b)
266
260
Bidiagonal (Vcat (1 , ((2 : ∞) .+ (a+ b)) ./ ((3 : 2 : ∞) .+ (a+ b))), - ((1 : ∞) .+ b) ./ ((3 : 2 : ∞) .+ (a+ b)), :U )
267
- elseif A. a == a && A. b == b+ 1
268
- Bidiagonal (((1 : ∞) .+ (a+ b)). / ((1 : 2 : ∞) .+ (a+ b)), ((1 : ∞) .+ a). / ((3 : 2 : ∞) .+ (a+ b)), :U )
269
- elseif A. a == a+ 1 && A. b == b
261
+ else
270
262
Bidiagonal (((1 : ∞) .+ (a+ b)). / ((1 : 2 : ∞) .+ (a+ b)), - ((1 : ∞) .+ b). / ((3 : 2 : ∞) .+ (a+ b)), :U )
271
- elseif A. a ≥ a+ 1
272
- J = Jacobi (a+ 1 ,b)
273
- (A \ J) * (J \ B)
274
- elseif A. b ≥ b+ 1
275
- J = Jacobi (a,b+ 1 )
276
- (A \ J) * (J \ B)
277
- elseif isinteger (A. a- a) && isinteger (A. b- b)
278
- inv (B \ A)
263
+ end
264
+ end
265
+ function _jacobi_convert_b (a, b) # Jacobi(a, b+1) \ Jacobi(a, b)
266
+ if isone (- a- b)
267
+ Bidiagonal (Vcat (1 , ((2 : ∞) .+ (a+ b)) ./ ((3 : 2 : ∞) .+ (a+ b))), ((1 : ∞) .+ a) ./ ((3 : 2 : ∞) .+ (a+ b)), :U )
268
+ else
269
+ Bidiagonal (((1 : ∞) .+ (a+ b)). / ((1 : 2 : ∞) .+ (a+ b)), ((1 : ∞) .+ a). / ((3 : 2 : ∞) .+ (a+ b)), :U )
270
+ end
271
+ end
272
+
273
+ # TODO : implement ApplyArray(*, A) in LazyArrays.jl, then these can be simplified
274
+ # the type specification is also because LazyArrays.jl is slow otherwise
275
+ # getindex and print could be very slow. This needs to be fixed by LazyArrays.jl
276
+ function _jacobi_convert_a (a, b, k, T) # Jacobi(a+k, b) \ Jacobi(a, b)
277
+ if iszero (k)
278
+ Eye {T} (∞)
279
+ elseif isone (k)
280
+ _jacobi_convert_a (a, b)
281
+ else
282
+ list = tuple ([_jacobi_convert_a (a+ j, b) for j in k- 1 : - 1 : 0 ]. .. )
283
+ ApplyArray {T,2,typeof(*),typeof(list)} (* , list)
284
+ end
285
+ end
286
+ function _jacobi_convert_b (a, b, k, T) # Jacobi(a, b+k) \ Jacobi(a, b)
287
+ if iszero (k)
288
+ Eye {T} (∞)
289
+ elseif isone (k)
290
+ _jacobi_convert_b (a, b)
279
291
else
280
- error (" not implemented for $A and $B " )
292
+ list = tuple ([_jacobi_convert_b (a, b+ j) for j in k- 1 : - 1 : 0 ]. .. )
293
+ ApplyArray {T,2,typeof(*),typeof(list)} (* , list)
294
+ end
295
+ end
296
+
297
+ function \ (A:: Jacobi , B:: Jacobi )
298
+ T = promote_type (eltype (A), eltype (B))
299
+ aa, ab = A. a, A. b
300
+ ba, bb = B. a, B. b
301
+ ka = Integer (aa- ba)
302
+ kb = Integer (ab- bb)
303
+ if ka >= 0
304
+ C1 = _jacobi_convert_a (ba, ab, ka, T)
305
+ if kb >= 0
306
+ C2 = _jacobi_convert_b (ba, bb, kb, T)
307
+ else
308
+ C2 = inv (_jacobi_convert_b (ba, ab, - kb, T))
309
+ end
310
+ if iszero (ka)
311
+ C2
312
+ elseif iszero (kb)
313
+ C1
314
+ else
315
+ list = (C1, C2)
316
+ ApplyArray {T,2,typeof(*),typeof(list)} (* , list)
317
+ end
318
+ else
319
+ inv (B \ A)
281
320
end
282
321
end
283
322
0 commit comments