From 99b6e039a7129e455fd5e94a2da6051f5906c561 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Fri, 19 Dec 2025 07:42:34 +0000 Subject: [PATCH 1/4] Start to support real line stiletjes transforms --- Project.toml | 2 +- src/SingularIntegrals.jl | 2 +- src/stieltjes.jl | 2 ++ test/test_realline.jl | 26 ++++++++++++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/test_realline.jl diff --git a/Project.toml b/Project.toml index c97f343..c465619 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "SingularIntegrals" uuid = "d7440221-8b5e-42fc-909c-0567823f424a" -authors = ["Sheehan Olver "] version = "0.3.9" +authors = ["Sheehan Olver "] [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" diff --git a/src/SingularIntegrals.jl b/src/SingularIntegrals.jl index 1b5ffca..e5b48e8 100644 --- a/src/SingularIntegrals.jl +++ b/src/SingularIntegrals.jl @@ -11,7 +11,7 @@ using BandedMatrices: _BandedMatrix using RecurrenceRelationshipArrays using RecurrenceRelationshipArrays: Clenshaw -export associated, stieltjes, logkernel, powerkernel, complexlogkernel +export associated, stieltjes, cauchy, logkernel, powerkernel, complexlogkernel include("stieltjes.jl") diff --git a/src/stieltjes.jl b/src/stieltjes.jl index e58fb42..40365c2 100644 --- a/src/stieltjes.jl +++ b/src/stieltjes.jl @@ -88,6 +88,8 @@ computes inv.(y - x') * P understood in a principle value sense. """ stieltjes(P, y...) = stieltjes_layout(MemoryLayout(P), P, y...) +cauchy(f, z...) = stieltjes(f, z...)/(-2convert(eltype(f), π)*im) + """ stieltjes(P) diff --git a/test/test_realline.jl b/test/test_realline.jl new file mode 100644 index 0000000..b56526a --- /dev/null +++ b/test/test_realline.jl @@ -0,0 +1,26 @@ +######## +# Inspired by +# https://github.com/marcusdavidwebb/MTFun.jl +######## + +using SingularIntegrals, ClassicalOrthogonalPolynomials + +φ = (n,x) -> sqrt(1/π) * (im - x)^float(n) / (im + x)^(float(n)+1) +p = n -> expand(legendre(-100..100), x -> φ(n,x)) + +@test [p(k)'p(j) for k=-4:4, j=-4:4] ≈ I rtol=2E-2 + + +for n = 0:3 + z = 3+2im + @test cauchy(p(n), z) ≈ φ(n,z) rtol=5E-2 + z = 3 - 2im + @test cauchy(p(n), z) ≈ 0 atol=5E-2 +end + +for n = -3:-1 + z = 3+2im + @test cauchy(p(n), z) ≈ 0 atol=5E-2 + z = 3 - 2im + @test cauchy(p(n), z) ≈ -φ(n,z) rtol=5E-2 +end \ No newline at end of file From d570a27df7805b9876f6f7578cc51cd0a92ca4ca Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Sun, 21 Dec 2025 11:50:18 +0000 Subject: [PATCH 2/4] Update test_realline.jl --- test/test_realline.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test_realline.jl b/test/test_realline.jl index b56526a..6ee17a7 100644 --- a/test/test_realline.jl +++ b/test/test_realline.jl @@ -6,6 +6,7 @@ using SingularIntegrals, ClassicalOrthogonalPolynomials φ = (n,x) -> sqrt(1/π) * (im - x)^float(n) / (im + x)^(float(n)+1) +R = (n,z) -> ((z-im)/(z+im))^n - 1 p = n -> expand(legendre(-100..100), x -> φ(n,x)) @test [p(k)'p(j) for k=-4:4, j=-4:4] ≈ I rtol=2E-2 @@ -16,6 +17,8 @@ for n = 0:3 @test cauchy(p(n), z) ≈ φ(n,z) rtol=5E-2 z = 3 - 2im @test cauchy(p(n), z) ≈ 0 atol=5E-2 + + @test sqrt(π)*(-1)^n*φ(n,0.1) ≈ -im*(R(n,0.1) - R(n+1,0.1))/2 end for n = -3:-1 @@ -23,4 +26,6 @@ for n = -3:-1 @test cauchy(p(n), z) ≈ 0 atol=5E-2 z = 3 - 2im @test cauchy(p(n), z) ≈ -φ(n,z) rtol=5E-2 + + @test sqrt(π)*(-1)^n*φ(n,0.1) ≈ -im*(R(n,0.1) - R(n+1,0.1))/2 end \ No newline at end of file From 68019dc0e55f459aee9dd2ff41f69cdf2fb4a5b5 Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Mon, 22 Dec 2025 12:54:29 +0000 Subject: [PATCH 3/4] Update test_realline.jl --- test/test_realline.jl | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/test/test_realline.jl b/test/test_realline.jl index 6ee17a7..41e158d 100644 --- a/test/test_realline.jl +++ b/test/test_realline.jl @@ -28,4 +28,27 @@ for n = -3:-1 @test cauchy(p(n), z) ≈ -φ(n,z) rtol=5E-2 @test sqrt(π)*(-1)^n*φ(n,0.1) ≈ -im*(R(n,0.1) - R(n+1,0.1))/2 -end \ No newline at end of file +end + + +x = 0.1 +for n = 0:5 + @test (-1)^n * sqrt(2/π) * (1+2im*x)^n / (1-2im*x)^(n+1) ≈ sum(expand(chebyshevt(0..100), k -> exp(-k/2) * laguerrel(n,k) * exp(im*k*x)))/sqrt(2π) +end + +for n = -5:-1 + @test (-1)^n * sqrt(2/π) * (1+2im*x)^n / (1-2im*x)^(n+1) ≈ -sum(expand(chebyshevt(0..100), k -> exp(-k/2) * laguerrel(abs(n)-1,k) * exp(-im*k*x)))/sqrt(2π) +end + + φ = (n,x) -> (-1)^n * sqrt(2/π) * (1+2im*x)^n / (1-2im*x)^(n+1) + +# ∫ exp(-k/2) * laguerrel(n,k) * exp(im*k*x) dx = +# ∫ exp(-k) * laguerrel(n,k) * exp(k*(im*x+1/2)) dx = +# ∫ d/dk(k * exp(-k) * laguerrel(n-1,1,k)) * exp(k*(im*x+1/2)) dx/n = +# -∫ k * exp(-k) * laguerrel(n-1,1,k) *d/dk(exp(k*(im*x+1/2))) dx/n = +# -∫ k * exp(-k) * laguerrel(n-1,1,k) *exp(k*(im*x+1/2)) dx * (im*x+1/2)/n = +# -∫ exp(-k) * (-laguerrel(n,k)+laguerrel(n-1,k)) *exp(k*(im*x+1/2)) dx * (im*x+1/2) = + +n = 2 +@test φ(n,x) ≈ (φ(n,x)-φ(n-1,x)) * (im*x+1/2) +@test φ(n,x)≈ φ(n-1,x) * (im*x+1/2)/(im*x-1/2) \ No newline at end of file From 711a10466fdbb0516dd608acfdf40d960113f5da Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Tue, 28 Apr 2026 08:22:04 +0100 Subject: [PATCH 4/4] Update test_realline.jl --- test/test_realline.jl | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/test/test_realline.jl b/test/test_realline.jl index 41e158d..d9aa19d 100644 --- a/test/test_realline.jl +++ b/test/test_realline.jl @@ -42,13 +42,22 @@ end φ = (n,x) -> (-1)^n * sqrt(2/π) * (1+2im*x)^n / (1-2im*x)^(n+1) -# ∫ exp(-k/2) * laguerrel(n,k) * exp(im*k*x) dx = -# ∫ exp(-k) * laguerrel(n,k) * exp(k*(im*x+1/2)) dx = -# ∫ d/dk(k * exp(-k) * laguerrel(n-1,1,k)) * exp(k*(im*x+1/2)) dx/n = -# -∫ k * exp(-k) * laguerrel(n-1,1,k) *d/dk(exp(k*(im*x+1/2))) dx/n = -# -∫ k * exp(-k) * laguerrel(n-1,1,k) *exp(k*(im*x+1/2)) dx * (im*x+1/2)/n = -# -∫ exp(-k) * (-laguerrel(n,k)+laguerrel(n-1,k)) *exp(k*(im*x+1/2)) dx * (im*x+1/2) = +# ∫ exp(-k/2) * L(n,k) * exp(i*k*z)) dx = +# ∫ exp(-k) * L(n,k) * exp(k*(i*z+1/2)) dx = +# ∫ d/dk(k * exp(-k) * L(n-1,1,k)) * exp(k*(i*z+1/2)) dx/n = +# -∫ k * exp(-k) * L(n-1,1,k) *d/dk(exp(k*(i*z+1/2))) dx/n = +# -∫ k * exp(-k) * L(n-1,1,k) *exp(k*(i*z+1/2)) dx * (i*z+1/2)/n = +# -∫ exp(-k) * (-L(n,k)+L(n-1,k)) *exp(k*(i*z+1/2)) dx * (i*z+1/2) = n = 2 @test φ(n,x) ≈ (φ(n,x)-φ(n-1,x)) * (im*x+1/2) -@test φ(n,x)≈ φ(n-1,x) * (im*x+1/2)/(im*x-1/2) \ No newline at end of file +@test φ(n,x)≈ φ(n-1,x) * (im*x+1/2)/(im*x-1/2) + +# F^{-1}[φ] = 1/sqrt(2π) * ∫ φ(x) exp(-im*k*z) dx = exp(-k/2) * L(n,k) +# F^{-1}[exp(iωx)φ] = 1/sqrt(2π) * ∫ φ(x) exp(i(ω-k)x) dx = exp(-(k-ω)/2) * L(n,k-ω) + + +# ∫_ω sign(k) exp(-k/2) * L(n,k) * exp(im*k*x) dx = +# ∫_ω sign(k) exp(-k) * L(n,k) * exp(k*(im*x+1/2)) dx = +# ∫_ω d/dk(k * exp(-k) * L(n-1,1,k)) * exp(k*(im*x+1/2)) dx/n = +# -ω*exp(-ω) -∫ k * exp(-k) * L(n-1,1,k) *d/dk(exp(k*(im*z+1/2))) dx/n = \ No newline at end of file