Skip to content

Commit 57f9add

Browse files
special case 0F2
1 parent 23712f6 commit 57f9add

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

src/drummond.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ end
199199
function pFqdrummond(::Tuple{}, β::Tuple{T1, T1}, z::T2; kmax::Int = KMAX) where {T1, T2}
200200
(α, β) = β
201201
T = promote_type(T1, T2)
202-
if norm(z) < eps(real(T)) || norm(α) < eps(real(T)) || norm(β) < eps(real(T))
202+
if norm(z) < eps(real(T))
203203
return one(T)
204204
end
205205
ζ = inv(z)

src/weniger.jl

+54-2
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,59 @@ function pFqweniger(α::Tuple{T1}, β::Tuple{T2}, z::T3; kmax::Int = KMAX) where
214214
return isfinite(Thi) ? Thi : isfinite(Tmid) ? Tmid : Tlo
215215
end
216216

217+
# ₀F₂(α,β;z), algorithm γ = 2.
218+
function pFqweniger::Tuple{}, β::Tuple{T1, T1}, z::T2; kmax::Int = KMAX) where {T1, T2}
219+
(α, β) = β
220+
T = promote_type(T1, T2)
221+
if norm(z) < eps(real(T))
222+
return one(T)
223+
end
224+
ζ = inv(z)
225+
Nlo = α*β*ζ
226+
Dlo = α*β*ζ
227+
Tlo = Nlo/Dlo
228+
a0 = T(1)
229+
b0 = 2*T+1)*T+1)
230+
Nmid2 = (b0*ζ-a0)*Nlo + b0*ζ
231+
Dmid2 = (b0*ζ-a0)*Dlo
232+
Tmid2 = Nmid2/Dmid2
233+
k = 1
234+
b0 = 6*T+2)*T+2)
235+
b1 = 6*T+β+3)
236+
t0 = b0*ζ
237+
t1 = b1*ζ+1
238+
Nmid1 = t0*Nmid2 + t1*Nlo + b1*ζ
239+
Dmid1 = t0*Dmid2 + t1*Dlo
240+
Tmid1 = Nmid1/Dmid1
241+
k = 2
242+
a2 = T(5)/T(3)
243+
b0 = 10*T+3)*T+3)
244+
b1 = -10*(T-1)*β-T+11))
245+
b2 = T(40)
246+
t0 = b0*ζ+T(5)/T(3)
247+
t1 = b1*ζ+1
248+
t2 = b2*ζ-a2
249+
Nhi = t0*Nmid1 + t1*Nmid2 + t2*Nlo + b2*ζ
250+
Dhi = t0*Dmid1 + t1*Dmid2 + t2*Dlo
251+
Thi = Nhi/Dhi
252+
k = 3
253+
while k < 6 || (k < kmax && errcheck(Tmid1, Thi, 8eps(real(T))))
254+
a3 = -k*T(2k+1)/T((k-1)*(2k-3))
255+
b0 = T(4k+2)*T+k+1)*T+k+1)
256+
b1 = (T(k*(k-1))-T+1)*T+1))*T(2k-1)*T(4k+2)/T(k-1)
257+
b2 = T(k-α-2)*T(k-β-2)*T(4k+2)*k/T(k-1)
258+
t0 = b0*ζ+T(2k+1)/T(k-1)
259+
t1 = b1*ζ-3*T(2k-1)/T((k-1)*(2k-3))
260+
t2 = b2*ζ-T(2k+1)/T(k-1)
261+
Nhi, Nmid1, Nmid2, Nlo = t0*Nhi + t1*Nmid1 + t2*Nmid2 - a3*Nlo, Nhi, Nmid1, Nmid2
262+
Dhi, Dmid1, Dmid2, Dlo = t0*Dhi + t1*Dmid1 + t2*Dmid2 - a3*Dlo, Dhi, Dmid1, Dmid2
263+
Thi, Tmid1, Tmid2, Tlo = Nhi/Dhi, Thi, Tmid1, Tmid2
264+
k += 1
265+
end
266+
k < kmax || @warn "Rational approximation to "*pFq2string(Val{0}(), Val{2}())*" reached the maximum type of ("*string(kmax, ", ", kmax)*")."
267+
return isfinite(Thi) ? Thi : isfinite(Tmid1) ? Tmid1 : isfinite(Tmid2) ? Tmid2 : Tlo
268+
end
269+
217270
# ₂F₁(α,β,γ;z), algorithm γ = 2.
218271
function pFqweniger::Tuple{T1, T1}, β::Tuple{T2}, z::T3; kmax::Int = KMAX) where {T1, T2, T3}
219272
γ = β[1]
@@ -315,7 +368,7 @@ function pFqweniger(α::Tuple{T1, T1, T1}, β::Tuple{T2, T2}, z::T3; kmax::Int =
315368
b2 = T(40)
316369
t0 = b0*ζ+5*((T-1)*γ-T+11))*α-T+11)*γ-11*T(β)-49)/3
317370
t1 = b1*ζ+(T(3+β)*γ+T(3*β-11))*α+T(3*β-11)*γ-11*T(β)-93
318-
t2 = b2*ζ-a2 #
371+
t2 = b2*ζ-a2
319372
Nhi = t0*Nmid1 + t1*Nmid2 + t2*Nlo + b2*ζ
320373
Dhi = t0*Dmid1 + t1*Dmid2 + t2*Dlo
321374
Thi = Nhi/Dhi
@@ -349,7 +402,6 @@ function pFqweniger(α::Tuple{T1, T1, T1}, β::Tuple{T2, T2}, z::T3; kmax::Int =
349402
end
350403

351404
# ₘFₙ(α;β;z)
352-
# γ ∉ ℕ
353405
function pFqweniger::AbstractVector{T1}, β::AbstractVector{T2}, z::T3, args...; kwds...) where {T1, T2, T3}
354406
pFqweniger(Tuple(α), Tuple(β), z, args...; kwds...)
355407
end

0 commit comments

Comments
 (0)