2
2
# using Drummond's sequence transformation
3
3
4
4
# ₀F₀(;z)
5
- function drummond0F0 (z:: T ) where T
5
+ function drummond0F0 (z:: T ; kmax :: Int = 10_000 ) where T
6
6
if norm (z) < eps (real (T))
7
7
return one (T)
8
8
end
@@ -18,7 +18,7 @@ function drummond0F0(z::T) where T
18
18
Dhi, Dlo = ((k+ 2 )* ζ- 1 )* Dhi + k* ζ* Dlo, Dhi
19
19
Thi, Tlo = Nhi/ Dhi, Thi
20
20
k += 1
21
- while abs (Thi - Tlo) > 10 * abs (Thi) * eps ( real (T)) && k < 10_000
21
+ while k < kmax && errcheck ( Tlo, Thi, 10 eps ( real (T)))
22
22
Nhi, Nlo = ((k+ 2 )* ζ- 1 )* Nhi + k* ζ* Nlo, Nhi
23
23
Dhi, Dlo = ((k+ 2 )* ζ- 1 )* Dhi + k* ζ* Dlo, Dhi
24
24
Thi, Tlo = Nhi/ Dhi, Thi
@@ -28,9 +28,9 @@ function drummond0F0(z::T) where T
28
28
end
29
29
30
30
# ₁F₀(α;z)
31
- function drummond1F0 (α:: T1 , z:: T2 ) where {T1, T2}
31
+ function drummond1F0 (α:: T1 , z:: T2 ; kmax :: Int = 10_000 ) where {T1, T2}
32
32
T = promote_type (T1, T2)
33
- absα = T ( abs (α))
33
+ absα = abs ( T (α))
34
34
if norm (z) < eps (real (T)) || norm (α) < eps (absα)
35
35
return one (T)
36
36
end
@@ -56,7 +56,7 @@ function drummond1F0(α::T1, z::T2) where {T1, T2}
56
56
Nhi /= α+ k+ 1
57
57
Dhi /= α+ k+ 1
58
58
k += 1
59
- while abs (Thi - Tlo) > 10 * abs (Thi) * eps ( real (T)) && k < 10_000
59
+ while k < kmax && errcheck ( Tlo, Thi, 10 eps ( real (T)))
60
60
Nhi, Nlo = ((k+ 2 )* ζ- (α+ 2 k+ 1 ))* Nhi + k* (ζ- 1 )* Nlo, Nhi
61
61
Dhi, Dlo = ((k+ 2 )* ζ- (α+ 2 k+ 1 ))* Dhi + k* (ζ- 1 )* Dlo, Dhi
62
62
Thi, Tlo = Nhi/ Dhi, Thi
@@ -71,7 +71,7 @@ function drummond1F0(α::T1, z::T2) where {T1, T2}
71
71
end
72
72
73
73
# ₀F₁(β;z)
74
- function drummond0F1 (β:: T1 , z:: T2 ) where {T1, T2}
74
+ function drummond0F1 (β:: T1 , z:: T2 ; kmax :: Int = 10_000 ) where {T1, T2}
75
75
T = promote_type (T1, T2)
76
76
if norm (z) < eps (real (T))
77
77
return one (T)
@@ -91,7 +91,7 @@ function drummond0F1(β::T1, z::T2) where {T1, T2}
91
91
Dhi, Dmid, Dlo = ((β+ k+ 1 )* (k+ 2 )* ζ- 1 )* Dhi + k* (β+ 2 k+ 2 )* ζ* Dmid + k* (k- 1 )* ζ* Dlo, Dhi, Dmid
92
92
Thi, Tmid, Tlo = Nhi/ Dhi, Thi, Tmid
93
93
k += 1
94
- while abs (Thi - Tmid) > 10 * abs (Thi) * eps ( real (T)) && abs (Tmid- Tlo) > 10 * abs (Tmid) * eps ( real (T)) && k < 10_000
94
+ while k < kmax && errcheck (Tmid, Thi, 10 eps ( real (T)))
95
95
Nhi, Nmid, Nlo = ((β+ k+ 1 )* (k+ 2 )* ζ- 1 )* Nhi + k* (β+ 2 k+ 2 )* ζ* Nmid + k* (k- 1 )* ζ* Nlo, Nhi, Nmid
96
96
Dhi, Dmid, Dlo = ((β+ k+ 1 )* (k+ 2 )* ζ- 1 )* Dhi + k* (β+ 2 k+ 2 )* ζ* Dmid + k* (k- 1 )* ζ* Dlo, Dhi, Dmid
97
97
Thi, Tmid, Tlo = Nhi/ Dhi, Thi, Tmid
@@ -101,10 +101,10 @@ function drummond0F1(β::T1, z::T2) where {T1, T2}
101
101
end
102
102
103
103
# ₂F₀(α,β;z)
104
- function drummond2F0 (α:: T1 , β:: T2 , z:: T3 ) where {T1, T2, T3}
104
+ function drummond2F0 (α:: T1 , β:: T2 , z:: T3 ; kmax :: Int = 10_000 ) where {T1, T2, T3}
105
105
T = promote_type (T1, T2, T3)
106
- absα = T ( abs (α))
107
- absβ = T ( abs (β))
106
+ absα = abs ( T (α))
107
+ absβ = abs ( T (β))
108
108
if norm (z) < eps (real (T)) || norm (α* β) < eps (absα* absβ)
109
109
return one (T)
110
110
end
@@ -129,7 +129,7 @@ function drummond2F0(α::T1, β::T2, z::T3) where {T1, T2, T3}
129
129
Nhi /= (α+ 2 )* (β+ 2 )
130
130
Dhi /= (α+ 2 )* (β+ 2 )
131
131
k = 2
132
- while abs (Thi - Tmid) > 10 * abs (Thi) * eps ( real (T)) && abs (Tmid- Tlo) > 10 * abs (Tmid) * eps ( real (T)) && k < 10_000
132
+ while k < kmax && errcheck (Tmid, Thi, 10 eps ( real (T)))
133
133
Nhi, Nmid, Nlo = ((k+ 2 )* ζ- (α+ k+ 1 )* (β+ k+ 1 )- k* (α+ β+ 2 k+ 1 ))* Nhi - k* (α+ β+ 3 k- ζ)* Nmid - k* (k- 1 )* Nlo, Nhi, Nmid
134
134
Dhi, Dmid, Dlo = ((k+ 2 )* ζ- (α+ k+ 1 )* (β+ k+ 1 )- k* (α+ β+ 2 k+ 1 ))* Dhi - k* (α+ β+ 3 k- ζ)* Dmid - k* (k- 1 )* Dlo, Dhi, Dmid
135
135
Thi, Tmid, Tlo = Nhi/ Dhi, Thi, Tmid
@@ -144,9 +144,9 @@ function drummond2F0(α::T1, β::T2, z::T3) where {T1, T2, T3}
144
144
end
145
145
146
146
# ₁F₁(α,β;z)
147
- function drummond1F1 (α:: T1 , β:: T2 , z:: T3 ) where {T1, T2, T3}
147
+ function drummond1F1 (α:: T1 , β:: T2 , z:: T3 ; kmax :: Int = 10_000 ) where {T1, T2, T3}
148
148
T = promote_type (T1, T2, T3)
149
- absα = T ( abs (α))
149
+ absα = abs ( T (α))
150
150
if norm (z) < eps (real (T)) || norm (α) < eps (absα)
151
151
return one (T)
152
152
end
@@ -180,7 +180,7 @@ function drummond1F1(α::T1, β::T2, z::T3) where {T1, T2, T3}
180
180
Nhi /= α+ k+ 1
181
181
Dhi /= α+ k+ 1
182
182
k += 1
183
- while abs (Thi - Tmid) > 10 * abs (Thi) * eps ( real (T)) && abs (Tmid- Tlo) > 10 * abs (Tmid) * eps ( real (T)) && k < 10_000
183
+ while k < kmax && errcheck (Tmid, Thi, 10 eps ( real (T)))
184
184
Nhi, Nmid, Nlo = ((β+ k+ 1 )* (k+ 2 )* ζ- (α+ 2 k+ 1 ))* Nhi + k* ((β+ 2 k+ 2 )* ζ- 1 )* Nmid + k* (k- 1 )* ζ* Nlo, Nhi, Nmid
185
185
Dhi, Dmid, Dlo = ((β+ k+ 1 )* (k+ 2 )* ζ- (α+ 2 k+ 1 ))* Dhi + k* ((β+ 2 k+ 2 )* ζ- 1 )* Dmid + k* (k- 1 )* ζ* Dlo, Dhi, Dmid
186
186
Thi, Tmid, Tlo = Nhi/ Dhi, Thi, Tmid
@@ -195,7 +195,7 @@ function drummond1F1(α::T1, β::T2, z::T3) where {T1, T2, T3}
195
195
end
196
196
197
197
# ₀F₂(α,β;z)
198
- function drummond0F2 (α:: T1 , β:: T2 , z:: T3 ) where {T1, T2, T3}
198
+ function drummond0F2 (α:: T1 , β:: T2 , z:: T3 ; kmax :: Int = 10_000 ) where {T1, T2, T3}
199
199
T = promote_type (T1, T2, T3)
200
200
if norm (z) < eps (real (T)) || norm (α) < eps (real (T)) || norm (β) < eps (real (T))
201
201
return one (T)
@@ -221,7 +221,7 @@ function drummond0F2(α::T1, β::T2, z::T3) where {T1, T2, T3}
221
221
Dhi, Dmid1, Dmid2, Dlo = (ζ* (k+ 2 )* (α+ k+ 1 )* (β+ k+ 1 )- 1 )* Dhi + ζ* k* ((k+ 1 )* (α+ β+ 2 k)+ (α+ k)* (β+ k)+ α+ β+ 3 k+ 2 )* Dmid1 + ζ* k* (k- 1 )* (3 k+ α+ β+ 1 )* Dmid2 + ζ* k* (k- 1 )* (k- 2 )* Dlo, Dhi, Dmid1, Dmid2
222
222
Thi, Tmid1, Tmid2, Tlo = Nhi/ Dhi, Thi, Tmid1, Tmid2
223
223
k += 1
224
- while abs (Thi - Tmid1) > 10 * abs (Thi) * eps ( real (T)) && abs (Tmid1- Tmid2) > 10 * abs (Tmid1) * eps ( real (T)) && abs (Tmid2 - Tlo) > 10 * abs (Tmid2) * eps ( real (T)) && k < 10_000
224
+ while k < kmax && errcheck (Tmid1, Thi, 10 eps ( real (T)))
225
225
Nhi, Nmid1, Nmid2, Nlo = (ζ* (k+ 2 )* (α+ k+ 1 )* (β+ k+ 1 )- 1 )* Nhi + ζ* k* ((k+ 1 )* (α+ β+ 2 k)+ (α+ k)* (β+ k)+ α+ β+ 3 k+ 2 )* Nmid1 + ζ* k* (k- 1 )* (3 k+ α+ β+ 1 )* Nmid2 + ζ* k* (k- 1 )* (k- 2 )* Nlo, Nhi, Nmid1, Nmid2
226
226
Dhi, Dmid1, Dmid2, Dlo = (ζ* (k+ 2 )* (α+ k+ 1 )* (β+ k+ 1 )- 1 )* Dhi + ζ* k* ((k+ 1 )* (α+ β+ 2 k)+ (α+ k)* (β+ k)+ α+ β+ 3 k+ 2 )* Dmid1 + ζ* k* (k- 1 )* (3 k+ α+ β+ 1 )* Dmid2 + ζ* k* (k- 1 )* (k- 2 )* Dlo, Dhi, Dmid1, Dmid2
227
227
Thi, Tmid1, Tmid2, Tlo = Nhi/ Dhi, Thi, Tmid1, Tmid2
@@ -231,10 +231,10 @@ function drummond0F2(α::T1, β::T2, z::T3) where {T1, T2, T3}
231
231
end
232
232
233
233
# ₂F₁(α,β,γ;z)
234
- function drummond2F1 (α:: T1 , β:: T2 , γ:: T3 , z:: T4 ) where {T1, T2, T3, T4}
234
+ function drummond2F1 (α:: T1 , β:: T2 , γ:: T3 , z:: T4 ; kmax :: Int = 10_000 ) where {T1, T2, T3, T4}
235
235
T = promote_type (T1, T2, T3, T4)
236
- absα = T ( abs (α))
237
- absβ = T ( abs (β))
236
+ absα = abs ( T (α))
237
+ absβ = abs ( T (β))
238
238
if norm (z) < eps (real (T)) || norm (α* β) < eps (absα* absβ)
239
239
return one (T)
240
240
end
@@ -268,7 +268,7 @@ function drummond2F1(α::T1, β::T2, γ::T3, z::T4) where {T1, T2, T3, T4}
268
268
Nhi /= (α+ k+ 1 )* (β+ k+ 1 )
269
269
Dhi /= (α+ k+ 1 )* (β+ k+ 1 )
270
270
k += 1
271
- while abs (Thi - Tmid) > 10 * abs (Thi) * eps ( real (T)) && abs (Tmid- Tlo) > 10 * abs (Tmid) * eps ( real (T)) && k < 10_000
271
+ while k < kmax && errcheck (Tmid, Thi, 10 eps ( real (T)))
272
272
Nhi, Nmid, Nlo = ((k+ 2 )* (γ+ k+ 1 )* ζ- (α+ k+ 1 )* (β+ k+ 1 )- k* (α+ β+ 2 k+ 1 ))* Nhi + k* ((γ+ 2 k+ 2 )* ζ- (α+ β+ 3 k))* Nmid + k* (k- 1 )* (ζ- 1 )* Nlo, Nhi, Nmid
273
273
Dhi, Dmid, Dlo = ((k+ 2 )* (γ+ k+ 1 )* ζ- (α+ k+ 1 )* (β+ k+ 1 )- k* (α+ β+ 2 k+ 1 ))* Dhi + k* ((γ+ 2 k+ 2 )* ζ- (α+ β+ 3 k))* Dmid + k* (k- 1 )* (ζ- 1 )* Dlo, Dhi, Dmid
274
274
Thi, Tmid, Tlo = Nhi/ Dhi, Thi, Tmid
@@ -283,9 +283,9 @@ function drummond2F1(α::T1, β::T2, γ::T3, z::T4) where {T1, T2, T3, T4}
283
283
end
284
284
285
285
# ₘFₙ(α;β;z)
286
- function drummondpFq (α:: AbstractVector{T1} , β:: AbstractVector{T2} , z:: T3 ) where {T1, T2, T3}
286
+ function pFqdrummond (α:: AbstractVector{T1} , β:: AbstractVector{T2} , z:: T3 ; kmax :: Int = 10_000 ) where {T1, T2, T3}
287
287
T = promote_type (T1, T2, T3)
288
- absα = T .( abs .(α))
288
+ absα = abs .( T .(α))
289
289
if norm (z) < eps (real (T)) || norm (prod (α)) < eps (prod (absα))
290
290
return one (T)
291
291
end
@@ -295,13 +295,15 @@ function drummondpFq(α::AbstractVector{T1}, β::AbstractVector{T2}, z::T3) wher
295
295
r = max (p+ 1 , q+ 2 )
296
296
C = zeros (T, r)
297
297
C[1 ] = one (T)
298
+ Ĉ = zeros (T, r)
299
+ Ĉ[1 ] = one (T)
298
300
P = zeros (T, p+ 1 )
299
301
t = one (T)
300
302
for j in 1 : p
301
303
t *= α[j]+ 1
302
304
end
303
305
P[1 ] = t
304
- err = one (T )
306
+ err = one (real (T) )
305
307
for j in 1 : p
306
308
err *= absα[j]+ 1
307
309
end
@@ -318,33 +320,37 @@ function drummondpFq(α::AbstractVector{T1}, β::AbstractVector{T2}, z::T3) wher
318
320
D[r+ 1 ] = prod (β)* ζ/ prod (α)
319
321
R[r+ 1 ] = N[r+ 1 ]/ D[r+ 1 ]
320
322
k = 0
321
- while ( abs (R[r+ 1 ] - R[r]) > 10 * abs ( R[r+ 1 ]) * eps (real (T)) && k < 10_000 ) || k < r
323
+ while k < r || (k < kmax && errcheck (R[r], R[r+ 1 ], 10 eps (real (T))))
322
324
for j in 1 : r
323
325
N[j] = N[j+ 1 ]
324
326
D[j] = D[j+ 1 ]
325
327
R[j] = R[j+ 1 ]
326
328
end
327
329
t1 = zero (T)
328
330
for j in 0 : min (k, q+ 1 )
329
- t1 += C [j+ 1 ]* Q[j+ 1 ]* N[r- j]
331
+ t1 += Ĉ [j+ 1 ]* Q[j+ 1 ]* N[r- j]
330
332
end
331
333
if k ≤ q+ 1
332
- t1 += Q[k+ 1 ]
334
+ if p > q
335
+ t1 += Q[k+ 1 ]
336
+ else
337
+ t1 += Q[k+ 1 ] / T (factorial (k+ 1 ))
338
+ end
333
339
end
334
340
t2 = zero (T)
335
- t2 += P[1 ]* N[r]
341
+ t2 += Ĉ[ 1 ] * P[1 ]* N[r]
336
342
for j in 1 : min (k, p)
337
- t2 += C [j+ 1 ]* P [j+ 1 ]* ( N[r- j+ 1 ]+ N[r- j])
343
+ t2 += P [j+ 1 ]* (C [j+ 1 ]* N[r- j+ 1 ] + Ĉ[j + 1 ] * N[r- j])
338
344
end
339
345
N[r+ 1 ] = ζ* t1- t2
340
346
t1 = zero (T)
341
347
for j in 0 : min (k, q+ 1 )
342
- t1 += C [j+ 1 ]* Q[j+ 1 ]* D[r- j]
348
+ t1 += Ĉ [j+ 1 ]* Q[j+ 1 ]* D[r- j]
343
349
end
344
350
t2 = zero (T)
345
- t2 += P[1 ]* D[r]
351
+ t2 += Ĉ[ 1 ] * P[1 ]* D[r]
346
352
for j in 1 : min (k, p)
347
- t2 += C [j+ 1 ]* P [j+ 1 ]* ( D[r- j+ 1 ]+ D[r- j])
353
+ t2 += P [j+ 1 ]* (C [j+ 1 ]* D[r- j+ 1 ] + Ĉ[j + 1 ] * D[r- j])
348
354
end
349
355
D[r+ 1 ] = ζ* t1- t2
350
356
R[r+ 1 ] = N[r+ 1 ]/ D[r+ 1 ]
@@ -354,14 +360,23 @@ function drummondpFq(α::AbstractVector{T1}, β::AbstractVector{T2}, z::T3) wher
354
360
N[r+ 1 ] /= P[1 ]
355
361
D[r+ 1 ] /= P[1 ]
356
362
k += 1
357
- for j in min (k, max (p, q+ 1 )): - 1 : 1
358
- C[j+ 1 ] += C[j]
363
+ if p > q
364
+ for j in min (k, max (p, q+ 1 )): - 1 : 1
365
+ C[j+ 1 ] += C[j]
366
+ Ĉ[j+ 1 ] += Ĉ[j]
367
+ end
368
+ else
369
+ for j in min (k, max (p, q+ 1 )): - 1 : 1
370
+ C[j+ 1 ] = (C[j+ 1 ]* (k+ 1 - j) + C[j])/ (k+ 1 )
371
+ Ĉ[j+ 1 ] = (Ĉ[j+ 1 ]* (k- j) + Ĉ[j])/ (k+ 1 )
372
+ end
373
+ Ĉ[1 ] = Ĉ[1 ]* k/ (k+ 1 )
359
374
end
360
375
t = one (T)
361
376
for j in 1 : p
362
377
t *= α[j]+ k+ 1
363
378
end
364
- err = one (T )
379
+ err = one (real (T) )
365
380
for j in 1 : p
366
381
err *= absα[j]+ k+ 1
367
382
end
0 commit comments