Skip to content

Commit 81deeb7

Browse files
internal API change to parameters: AbstractVector -> NTuple
What a great idea!
1 parent f48db8e commit 81deeb7

File tree

5 files changed

+55
-27
lines changed

5 files changed

+55
-27
lines changed

src/confluent.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ function _₁F₁(a, b, z; kwds...)
2323
end
2424

2525
function _₁F₁general(a, b, z; kwds...)
26-
if abs(z) > 10 # TODO: check this algorithmic parameter cutoff
26+
if abs(z) > 10 # TODO: check this algorithmic parameter cutoff, determine when to use rational algorithms
2727
if isreal(z)
2828
if real(z) 0 # 13.7.1
29-
return gamma(b)/gamma(a)*exp(z)*z^(a-b)*drummond2F0(1-a, b-a, inv(z); kwds...)
29+
return gamma(b)/gamma(a)*exp(z)*z^(a-b)*pFqdrummond((1-a, b-a), (), inv(z); kwds...)
3030
else # 13.7.1 + 13.2.39
31-
return gamma(b)/gamma(b-a)*(-z)^-a*drummond2F0(a, a-b+1, -inv(z); kwds...)
31+
return gamma(b)/gamma(b-a)*(-z)^-a*pFqdrummond((a, a-b+1), (), -inv(z); kwds...)
3232
end
3333
else # 13.7.2
34-
return gamma(b)/gamma(a)*exp(z)*z^(a-b)*drummond2F0(1-a, b-a, inv(z); kwds...) + gamma(b)/gamma(b-a)*(-z)^-a*drummond2F0(a, a-b+1, -inv(z); kwds...)
34+
return gamma(b)/gamma(a)*exp(z)*z^(a-b)*pFqdrummond((1-a, b-a), (), inv(z); kwds...) + gamma(b)/gamma(b-a)*(-z)^-a*pFqdrummond((a, a-b+1), (), -inv(z); kwds...)
3535
end
3636
elseif real(z) 0
3737
return _₁F₁maclaurin(a, b, z; kwds...)
@@ -49,5 +49,5 @@ const M = _₁F₁
4949
Compute Tricomi's confluent hypergeometric function `U(a, b, z) ∼ z⁻ᵃ ₂F₀([a, a-b+1]; []; -z⁻¹)`.
5050
"""
5151
function U(a, b, z; kwds...)
52-
return z^-a*drummond2F0(a, a-b+1, -inv(z); kwds...)
52+
return z^-a*pFqdrummond((a, a-b+1), (), -inv(z); kwds...)
5353
end

src/drummond.jl

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# using Drummond's sequence transformation
33

44
# ₀F₀(;z)
5-
function drummond0F0(z::T; kmax::Int = 10_000) where T
5+
function pFqdrummond(::Tuple{}, ::Tuple{}, z::T; kmax::Int = 10_000) where T
66
if norm(z) < eps(real(T))
77
return one(T)
88
end
@@ -28,7 +28,8 @@ function drummond0F0(z::T; kmax::Int = 10_000) where T
2828
end
2929

3030
# ₁F₀(α;z)
31-
function drummond1F0::T1, z::T2; kmax::Int = 10_000) where {T1, T2}
31+
function pFqdrummond::Tuple{T1}, ::Tuple{}, z::T2; kmax::Int = 10_000) where {T1, T2}
32+
α = α[1]
3233
T = promote_type(T1, T2)
3334
absα = abs(T(α))
3435
if norm(z) < eps(real(T)) || norm(α) < eps(absα)
@@ -71,7 +72,8 @@ function drummond1F0(α::T1, z::T2; kmax::Int = 10_000) where {T1, T2}
7172
end
7273

7374
# ₀F₁(β;z)
74-
function drummond0F1::T1, z::T2; kmax::Int = 10_000) where {T1, T2}
75+
function pFqdrummond(::Tuple{}, β::Tuple{T1}, z::T2; kmax::Int = 10_000) where {T1, T2}
76+
β = β[1]
7577
T = promote_type(T1, T2)
7678
if norm(z) < eps(real(T))
7779
return one(T)
@@ -101,8 +103,9 @@ function drummond0F1(β::T1, z::T2; kmax::Int = 10_000) where {T1, T2}
101103
end
102104

103105
# ₂F₀(α,β;z)
104-
function drummond2F0::T1, β::T2, z::T3; kmax::Int = 10_000) where {T1, T2, T3}
105-
T = promote_type(T1, T2, T3)
106+
function pFqdrummond::Tuple{T1, T1}, ::Tuple{}, z::T2; kmax::Int = 10_000) where {T1, T2}
107+
(α, β) = α
108+
T = promote_type(T1, T2)
106109
absα = abs(T(α))
107110
absβ = abs(T(β))
108111
if norm(z) < eps(real(T)) || norm*β) < eps(absα*absβ)
@@ -144,7 +147,9 @@ function drummond2F0(α::T1, β::T2, z::T3; kmax::Int = 10_000) where {T1, T2, T
144147
end
145148

146149
# ₁F₁(α,β;z)
147-
function drummond1F1::T1, β::T2, z::T3; kmax::Int = 10_000) where {T1, T2, T3}
150+
function pFqdrummond::Tuple{T1}, β::Tuple{T2}, z::T3; kmax::Int = 10_000) where {T1, T2, T3}
151+
α = α[1]
152+
β = β[1]
148153
T = promote_type(T1, T2, T3)
149154
absα = abs(T(α))
150155
if norm(z) < eps(real(T)) || norm(α) < eps(absα)
@@ -195,8 +200,9 @@ function drummond1F1(α::T1, β::T2, z::T3; kmax::Int = 10_000) where {T1, T2, T
195200
end
196201

197202
# ₀F₂(α,β;z)
198-
function drummond0F2::T1, β::T2, z::T3; kmax::Int = 10_000) where {T1, T2, T3}
199-
T = promote_type(T1, T2, T3)
203+
function pFqdrummond(::Tuple{}, β::Tuple{T1, T1}, z::T2; kmax::Int = 10_000) where {T1, T2}
204+
(α, β) = β
205+
T = promote_type(T1, T2)
200206
if norm(z) < eps(real(T)) || norm(α) < eps(real(T)) || norm(β) < eps(real(T))
201207
return one(T)
202208
end
@@ -231,8 +237,10 @@ function drummond0F2(α::T1, β::T2, z::T3; kmax::Int = 10_000) where {T1, T2, T
231237
end
232238

233239
# ₂F₁(α,β,γ;z)
234-
function drummond2F1::T1, β::T2, γ::T3, z::T4; kmax::Int = 10_000) where {T1, T2, T3, T4}
235-
T = promote_type(T1, T2, T3, T4)
240+
function pFqdrummond::Tuple{T1, T1}, β::Tuple{T2}, z::T3; kmax::Int = 10_000) where {T1, T2, T3}
241+
γ = β[1]
242+
(α, β) = α
243+
T = promote_type(T1, T2, T3)
236244
absα = abs(T(α))
237245
absβ = abs(T(β))
238246
if norm(z) < eps(real(T)) || norm*β) < eps(absα*absβ)
@@ -283,15 +291,21 @@ function drummond2F1(α::T1, β::T2, γ::T3, z::T4; kmax::Int = 10_000) where {T
283291
end
284292

285293
# ₘFₙ(α;β;z)
286-
function pFqdrummond::AbstractVector{T1}, β::AbstractVector{T2}, z::T3; kmax::Int = 10_000) where {T1, T2, T3}
287-
T = promote_type(T1, T2, T3)
294+
function pFqdrummond::AbstractVector{T1}, β::AbstractVector{T2}, z::T3; kwds...) where {T1, T2, T3}
295+
pFqdrummond(Tuple(α), Tuple(β), z; kwds...)
296+
end
297+
function pFqdrummond::NTuple{p, Any}, β::NTuple{q, Any}, z; kwds...) where {p, q}
298+
T1 = mapreduce(typeof, promote_type, α)
299+
T2 = mapreduce(typeof, promote_type, β)
300+
pFqdrummond(T1.(α), T2.(β), z; kwds...)
301+
end
302+
function pFqdrummond::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = 10_000) where {p, q, T1, T2, T3}
303+
T = promote_type(eltype(α), eltype(β), T3)
288304
absα = abs.(T.(α))
289305
if norm(z) < eps(real(T)) || norm(prod(α)) < eps(prod(absα))
290306
return one(T)
291307
end
292308
ζ = inv(z)
293-
p = length(α)
294-
q = length(β)
295309
r = max(p+1, q+2)
296310
err = one(real(T))
297311
for j in 1:p
@@ -380,3 +394,11 @@ function pFqdrummond(α::AbstractVector{T1}, β::AbstractVector{T2}, z::T3; kmax
380394
end
381395
return isfinite(R[r+1]) ? R[r+1] : R[r]
382396
end
397+
398+
@deprecate drummond0F0(x; kwds...) pFqdrummond((), (), x; kwds...) false
399+
@deprecate drummond1F0(α, x; kwds...) pFqdrummond((α, ), (), x; kwds...) false
400+
@deprecate drummond0F1(β, x; kwds...) pFqdrummond((), (β, ), x; kwds...) false
401+
@deprecate drummond2F0(α, β, x; kwds...) pFqdrummond((α, β), (), x; kwds...) false
402+
@deprecate drummond1F1(α, β, x; kwds...) pFqdrummond((α, ), (β, ), x; kwds...) false
403+
@deprecate drummond0F2(α, β, x; kwds...) pFqdrummond((), (α, β), x; kwds...) false
404+
@deprecate drummond2F1(α, β, γ, x; kwds...) pFqdrummond((α, β), (γ, ), x; kwds...) false

src/gauss.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ function _₂F₁general(a, b, c, z)
9292
elseif abs(inv(1-z)) ρ
9393
return exp(-a*log1p(-z))*_₂F₁one(a, c-b, c, z/(z-1))
9494
else
95-
return pFqweniger([a, b], [c], z) # _₂F₁taylor(a, b, c, z)
95+
return pFqweniger((a, b), (c, ), z) # _₂F₁taylor(a, b, c, z)
9696
end
9797
end
9898

@@ -150,7 +150,7 @@ function _₂F₁general2(a, b, c, z)
150150
return gamma(c)*(gamma(b-a)/gamma(b)/gamma(c-a)*(0.5-z)^(-a)*_₂F₁continuation(a, a+b, c, 0.5, z) + gamma(a-b)/gamma(a)/gamma(c-b)*(0.5-z)^(-b)*_₂F₁continuation(b, a+b, c, 0.5, z))
151151
end
152152
end
153-
return pFqweniger([a, b], [c], z)
153+
return pFqweniger((a, b), (c, ), z)
154154
end
155155

156156
# Special case of (-x)^a*_₂F₁ to handle LogNumber correctly in RiemannHilbert.jl

src/generalized.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ function _₃F₂(a₁, a₂, a₃, b₁, b₂, z; kwds...)
5050
if abs(z) ρ
5151
_₃F₂maclaurin(a₁, a₂, a₃, b₁, b₂, float(z); kwds...)
5252
else
53-
pFqweniger([a₁, a₂, a₃], [b₁, b₂], float(z); kwds...)
53+
pFqweniger((a₁, a₂, a₃), (b₁, b₂), float(z); kwds...)
5454
end
5555
end
5656
_₃F₂(a₁, b₁, z; kwds...) = _₃F₂(1, 1, a₁, 2, b₁, z; kwds...)

src/weniger.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@
33

44
# ₘFₙ(α;β;z)
55
# γ ∉ ℕ
6-
function pFqweniger::AbstractVector{T1}, β::AbstractVector{T2}, z::T3; kmax::Int = 10_000) where {T1, T2, T3}
7-
T = promote_type(T1, T2, T3)
6+
function pFqweniger::AbstractVector{T1}, β::AbstractVector{T2}, z::T3; kwds...) where {T1, T2, T3}
7+
pFqweniger(Tuple(α), Tuple(β), z; kwds...)
8+
end
9+
function pFqweniger::NTuple{p, Any}, β::NTuple{q, Any}, z; kwds...) where {p, q}
10+
T1 = mapreduce(typeof, promote_type, α)
11+
T2 = mapreduce(typeof, promote_type, β)
12+
pFqweniger(T1.(α), T2.(β), z; kwds...)
13+
end
14+
function pFqweniger::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = 10_000) where {p, q, T1, T2, T3}
15+
T = promote_type(eltype(α), eltype(β), T3)
816
absα = abs.(T.(α))
9-
if norm(z) < eps(real(T)) || norm(prod(α)) < eps(prod(absα))
17+
if norm(z) < eps(real(T)) || norm(prod(α)) < eps(real(T)(prod(absα)))
1018
return one(T)
1119
end
1220
γ = T(3)/2
1321
ζ = inv(z)
14-
p = length(α)
15-
q = length(β)
1622
r = max(p, q)+3
1723
ρ = max(p, q)+1
1824
C = zeros(T, r)

0 commit comments

Comments
 (0)