Skip to content

Commit 089e208

Browse files
remove pochhammer from pFqweniger
7% savings
1 parent 8846b3b commit 089e208

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "HypergeometricFunctions"
22
uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
3-
version = "0.3.16"
3+
version = "0.3.17"
44

55
[deps]
66
DualNumbers = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ julia> pFq((1, 2+im), (3.5, ), exp(im*big(π)/3)) # More digits, you say?
3131
0.6786952632946589823300834090168381068073515492901393549193461972311801512528478 + 0.4523504929285013648194489713901658143893464679689810112119412310631860619948458im
3232

3333
julia> pFq((1, 2+im, 2.5), (3.5, 4), exp(im*π/3)) # ₃F₂ because why not
34-
0.843443403161569 + 0.3417550761546328im
34+
0.8434434031615688 + 0.3417550761546319im
3535

3636
julia> pFq((1, 2+im, 2.5), (3.5, 4), exp(im*big(π)/3)) # Also in extended precision
37-
0.8434434031615690763389963048175253868863156451003855955719081209861492349265671 + 0.3417550761546319732614495656712509723030350666571102474299311122586948108410529im
37+
0.8434434031615690763389963048175253868863156451003855955719081209861492349266966 + 0.34175507615463197326144956567125097230303506665711024742993111225869481084123im
3838

3939
julia> pFq((1, 1), (), -1) # A divergent series
4040
0.5963473623231935

src/weniger.jl

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ 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, γ::T4 = 3//2) where {p, q, T1, T2, T3, T4}
199+
function pFqweniger::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMAX, γ::T4 = 2) where {p, q, T1, T2, T3, T4}
200200
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α)))
@@ -227,8 +227,10 @@ function pFqweniger(α::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMA
227227
t *= β[j]+1
228228
end
229229
Q[1] = t
230+
P̂R = γ+2
231+
QR = T(1)
230232
k = 0
231-
@inbounds while k r || (k < kmax && errcheck(R[r+2], R[r+3], 8eps(real(T))))
233+
@inbounds while k r+2 || (k < kmax && errcheck(R[r+2], R[r+3], 8eps(real(T))))
232234
for j in 1:r+2
233235
N[j] = N[j+1]
234236
D[j] = D[j+1]
@@ -280,36 +282,39 @@ function pFqweniger(α::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMA
280282
for j in 1:p
281283
t2 *= α[j]+k+1
282284
end
283-
t2 /= pochhammer+k+1, k)
285+
t2 /= P̂R
286+
P̂R *= ((γ+2k+1)*+2k+2))/+k+1)
284287
t1 = k*((γ+2k)*t2 - P̂[1])
285-
for j in 2:r+1
288+
for j in 2:k
286289
s = ((k-j+1)*((γ+2k-j+1)*t1+k*P̂[j-1]) - k*P̂[j])/j
287290
P̂[j-1] = t2
288291
t2 = t1
289292
t1 = s
290293
end
291-
P̂[r+1] = t2
292-
P̂[r+2] = t1
294+
P̂[k] = t2
295+
P̂[k+1] = t1
293296
t2 = T(k+2)
294297
for j in 1:q
295298
t2 *= β[j]+k+1
296299
end
297-
t2 /= pochhammer+k, k)
300+
QR *= ((γ+2k-2)*+2k-1))/+k-1)
301+
t2 /= QR
298302
t1 = k*((γ+2k-1)*t2 - Q[1])
299-
for j in 2:r
303+
for j in 2:min(k, r)
300304
s = ((k-j+1)*((γ+2k-j)*t1+k*Q[j-1]) - k*Q[j])/j
301305
Q[j-1] = t2
302306
t2 = t1
303307
t1 = s
304308
end
305-
Q[r] = t2
306-
Q[r+1] = t1
309+
Q[min(k, r)] = t2
310+
Q[min(k, r)+1] = t1
307311
else
308312
t2 = γ+k
309313
for j in 1:p
310314
t2 *= α[j]+k+1
311315
end
312-
t2 /= pochhammer+2k-r-1, r+2)
316+
t2 /= P̂R
317+
P̂R *= ((γ+2k+1)*+2k+2))/((γ+2k-r-1)*+2k-r))
313318
t1 = k*((γ+2k)*t2 -+2k-1-r-2)*P̂[1])
314319
for j in 2:r+1
315320
s = ((k-j+1)*((γ+2k-j+1)*t1-(r-j+3)*k*P̂[j-1]) -+2k-j-r-2)*k*P̂[j])/j
@@ -323,7 +328,8 @@ function pFqweniger(α::NTuple{p, T1}, β::NTuple{q, T2}, z::T3; kmax::Int = KMA
323328
for j in 1:q
324329
t2 *= β[j]+k+1
325330
end
326-
t2 /= pochhammer+2k-r-1, r+1)
331+
QR *= ((γ+2k-2)*+2k-1))/((γ+2k-r-3)*+2k-r-2))
332+
t2 /= QR
327333
t1 = k*((γ+2k-1)*t2 -+2k-1-r-2)*Q[1])
328334
for j in 2:r
329335
s = ((k-j+1)*((γ+2k-j)*t1-(r-j+2)*k*Q[j-1]) -+2k-j-r-2)*k*Q[j])/j

0 commit comments

Comments
 (0)