using Plots, ComplexPhasePortrait, ApproxFun
gr();

f = z -> exp(1/z)
phaseplot(-6..6, -6..6, f)

z = 2.0+2im
sum([z^k/factorial(-1.0k) for k=-100:0]) - exp(1/z)

k=-5;
sum(Fun(z -> f(z)/z^(k+1), Circle()))/(2π*im) - 1/factorial(-1.0k)

f = z -> exp(1/z) - 1

ζ = Fun(Circle())
-sum(f.(ζ)/(ζ-z))/(2π*im) - f(z)

f = z -> exp(1/z) 

ζ = Fun(Circle())
-sum(f.(ζ)/(ζ-z))/(2π*im) - f(z)

f = z -> 1/(z*(z+2))
phaseplot(-3..3, -3..3, f)

sum(Fun(f, Circle(3.0)))

f = z -> 1/z + 1/(z+2)
phaseplot(-3..3, -3..3, f)

f₋₁ = 2
res∞ = -f₋₁
sum(Fun(f, Circle(3.0))), -2π*im*res∞

res∞ = -2
res₋₂ = 1
sum(Fun(f, Circle(1.0))), -2π*im*(res∞ + res₋₂)

f = z -> exp(1/z)/(z*(z+2))
portrait(-3..3, -3..3, f)

sum(Fun(f, Circle(3.0)))

sum(Fun(f, Circle(1.0))), -2π*im * exp(-1/2)/(-2)

f = z -> (exp(1/z) + exp(z))/(z*(z+2))
Γ = Circle(0.0, 4.0) ∪ Circle(0.0,0.5,false) ∪ Circle(-2.0,0.1,false)
phaseplot(-5..5, -5..5, f)
plot!(Γ; color=:black, label=:contour, arrow=true, linewidth=1.5)

ζ = Fun(Γ)
z = 2.0+1.0im
sum(f.(ζ)/(ζ - z))/(2π*im)

f(z)

n = 7
m = 5
p = Fun(Taylor(), randn(n))
q = Fun(Taylor(), randn(m))
λ = complexroots(q)

Γ = Circle(0.0, 5.0)
for λ in λ
    Γ = Γ ∪ Circle(λ, 0.1, false)
end
r = z -> extrapolate(p,z)/extrapolate(q,z)

phaseplot(-5..5, -5..5, r)
plot!(Γ; color=:black, label=:contour)

ζ = Fun(Γ)
z = 2.0+2.0im
sum(r.(ζ)/(ζ - z))/(2π*im) - r(z)

n = 5
m = 5
p = Fun(Taylor(), randn(n))
q = Fun(Taylor(), randn(m))
λ = complexroots(q)

r = z -> extrapolate(p,z)/extrapolate(q,z)

phaseplot(-7..7, -7..7, r)

res = extrapolate.(p,λ)./extrapolate.(q',λ)
r∞ = p.coefficients[n]/q.coefficients[m]

r̃ = z -> r∞ + sum(res.*(z .- λ).^(-1))

z = 0.1+0.2im
r(z) - r̃(z)

phaseplot(-7..7, -7..7, r̃)