Skip to content

Commit 8846b3b

Browse files
general weniger recurrence insensitive to algorithmic parameter γ
1 parent 265c891 commit 8846b3b

File tree

1 file changed

+67
-36
lines changed

1 file changed

+67
-36
lines changed

src/weniger.jl

Lines changed: 67 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -196,13 +196,13 @@ function pFqweniger(α::NTuple{p, Any}, β::NTuple{q, Any}, z; kwds...) where {p
196196
T2 = isempty(β) ? Any : mapreduce(typeof, promote_type, β)
197197
pFqweniger(T1.(α), T2.(β), z; kwds...)
198198
end
199-
function pFqweniger::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMAX) where {p, q, T1, T2, T3}
200-
T = promote_type(eltype(α), eltype(β), T3)
199+
function pFqweniger::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMAX, γ::T4 = 3//2) where {p, q, T1, T2, T3, T4}
200+
T = promote_type(eltype(α), eltype(β), T3, T4)
201201
absα = abs.(T.(α))
202202
if norm(z) < eps(real(T)) || norm(prod(α)) < eps(real(T)(prod(absα)))
203203
return one(T)
204204
end
205-
γ = T(3)/2
205+
γ = T(γ)
206206
ζ = inv(z)
207207
r = max(p+1, q+1)
208208
N = zeros(T, r+3)
@@ -211,22 +211,22 @@ function pFqweniger(α::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMA
211211
N[r+3] = prod(β)*ζ/prod(α)/-1)
212212
D[r+3] = prod(β)*ζ/prod(α)/-1)
213213
R[r+3] = N[r+3]/D[r+3]
214-
err = abs)
214+
err = real(T)(1)
215215
@inbounds for j in 1:p
216216
err *= absα[j]+1
217217
end
218218
= zeros(T, r+2)
219-
t = γ
219+
t = T(1)
220220
@inbounds for j in 1:p
221221
t *= α[j]+1
222222
end
223-
P̂[1] = t/pochhammer-r-1, r+2)
223+
P̂[1] = t
224224
Q = zeros(T, r+1)
225225
t = T(2)
226226
@inbounds for j in 1:q
227227
t *= β[j]+1
228228
end
229-
Q[1] = t/pochhammer-r-1, r+1)
229+
Q[1] = t
230230
k = 0
231231
@inbounds while k r || (k < kmax && errcheck(R[r+2], R[r+3], 8eps(real(T))))
232232
for j in 1:r+2
@@ -245,7 +245,7 @@ function pFqweniger(α::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMA
245245
t2 *= β[i]+j+1
246246
end
247247
t2 *= j+2
248-
t1 += binomial(k, j)*(-one(T))^(k-j)*pochhammer(j+γ, k-r-1)*t2
248+
t1 += binomial(k, j)*(-one(T))^(k-j)*t2
249249
end
250250
end
251251
t2 = zero(T)
@@ -271,38 +271,69 @@ function pFqweniger(α::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMA
271271
N[r+3] /= P̂[1]
272272
D[r+3] /= P̂[1]
273273
k += 1
274-
err = abs(γ)+k
274+
err = real(T)(1)
275275
for j in 1:p
276276
err *= absα[j]+k+1
277277
end
278-
t2 = γ+k
279-
for j in 1:p
280-
t2 *= α[j]+k+1
281-
end
282-
t2 /= pochhammer+2k-r-1, r+2)
283-
t1 = k*((γ+2k)*t2 -+2k-1-r-2)*P̂[1])
284-
for j in 2:r+1
285-
s = ((k-j+1)*((γ+2k-j+1)*t1-(r-j+3)*k*P̂[j-1]) -+2k-j-r-2)*k*P̂[j])/j
286-
P̂[j-1] = t2
287-
t2 = t1
288-
t1 = s
289-
end
290-
P̂[r+1] = t2
291-
P̂[r+2] = t1
292-
t2 = T(k+2)
293-
for j in 1:q
294-
t2 *= β[j]+k+1
295-
end
296-
t2 /= pochhammer+2k-r-1, r+1)
297-
t1 = k*((γ+2k-1)*t2 -+2k-1-r-2)*Q[1])
298-
for j in 2:r
299-
s = ((k-j+1)*((γ+2k-j)*t1-(r-j+2)*k*Q[j-1]) -+2k-j-r-2)*k*Q[j])/j
300-
Q[j-1] = t2
301-
t2 = t1
302-
t1 = s
278+
if k r+1
279+
t2 = T(1)
280+
for j in 1:p
281+
t2 *= α[j]+k+1
282+
end
283+
t2 /= pochhammer+k+1, k)
284+
t1 = k*((γ+2k)*t2 - P̂[1])
285+
for j in 2:r+1
286+
s = ((k-j+1)*((γ+2k-j+1)*t1+k*P̂[j-1]) - k*P̂[j])/j
287+
P̂[j-1] = t2
288+
t2 = t1
289+
t1 = s
290+
end
291+
P̂[r+1] = t2
292+
P̂[r+2] = t1
293+
t2 = T(k+2)
294+
for j in 1:q
295+
t2 *= β[j]+k+1
296+
end
297+
t2 /= pochhammer+k, k)
298+
t1 = k*((γ+2k-1)*t2 - Q[1])
299+
for j in 2:r
300+
s = ((k-j+1)*((γ+2k-j)*t1+k*Q[j-1]) - k*Q[j])/j
301+
Q[j-1] = t2
302+
t2 = t1
303+
t1 = s
304+
end
305+
Q[r] = t2
306+
Q[r+1] = t1
307+
else
308+
t2 = γ+k
309+
for j in 1:p
310+
t2 *= α[j]+k+1
311+
end
312+
t2 /= pochhammer+2k-r-1, r+2)
313+
t1 = k*((γ+2k)*t2 -+2k-1-r-2)*P̂[1])
314+
for j in 2:r+1
315+
s = ((k-j+1)*((γ+2k-j+1)*t1-(r-j+3)*k*P̂[j-1]) -+2k-j-r-2)*k*P̂[j])/j
316+
P̂[j-1] = t2
317+
t2 = t1
318+
t1 = s
319+
end
320+
P̂[r+1] = t2
321+
P̂[r+2] = t1
322+
t2 = T(k+2)
323+
for j in 1:q
324+
t2 *= β[j]+k+1
325+
end
326+
t2 /= pochhammer+2k-r-1, r+1)
327+
t1 = k*((γ+2k-1)*t2 -+2k-1-r-2)*Q[1])
328+
for j in 2:r
329+
s = ((k-j+1)*((γ+2k-j)*t1-(r-j+2)*k*Q[j-1]) -+2k-j-r-2)*k*Q[j])/j
330+
Q[j-1] = t2
331+
t2 = t1
332+
t1 = s
333+
end
334+
Q[r] = t2
335+
Q[r+1] = t1
303336
end
304-
Q[r] = t2
305-
Q[r+1] = t1
306337
end
307338
k < kmax || @warn "Rational approximation to "*pFq2string(Val{p}(), Val{q}())*" reached the maximum type of ($kmax, $kmax)."
308339
return isfinite(R[r+3]) ? R[r+3] : R[r+2]

0 commit comments

Comments
 (0)