Problem 6:

A flea starts at (0,0) on the infinite 2D integer lattice and executes a biased random walk: At each step it hops north or south with probability 1/4, east with probability 1/4+epsilon , and west with probability 1/4-epsilon .  The probability that the flea returns to (0,0) sometime during its wanderings is 1/2.  What is epsilon ?

Solution:

If u(x,y)  is the probability that the flea, starting at ``(x,y) , ever reaches (0,0), then u(0,0) = 1  and otherwise
u(x,y) = u(x,y+1)/4+u(x,y-1)/4+(1/4+epsilon)*u(x-1,y)+(1/4-epsilon)*u(x+1,y) .  The probability that the flea returns is v(epsilon) = u(0,1)/4+u(0,-1)/4+(1/4+epsilon)*u(-1,0)+(1/4-epsilon)*u(1,0) .

We can't calculate v  or u(x,y)  directly, but we can approximate it by taking solving the equations in a finite region with boundary conditions u(x,y) = 0  on the boundary of the region.  This corresponds to looking at the situation where the flea is killed if it hits the boundary of the region.  We want to find epsilon  (in this approximation) so that v(epsilon) = 1/2  .  This can be done by Newton's method: for this we need the derivatives of v  and u(x,y)  with respect to epsilon , which satisfy the equations

obtained by differentiating the equations for u and v:

`u'`(0,0) = 0

`u'`(x,y) = `u'`(x,y+1)/4+`u'`(x,y-1)/4+(1/4+epsilon)*`u'`(x-1,y)+u(x-1,y)+(1/4-epsilon)*`u'`(x+1,y)-u(x+1,y)
`u'`(x,y) = `u'`(x,y+1)/4+`u'`(x,y-1)/4+(1/4+epsilon)*`u'`(x-1,y)+u(x-1,y)+(1/4-epsilon)*`u'`(x+1,y)-u(x+1,y)  otherwise

`v'`(epsilon) = `u'`(0,1)/4+`u'`(0,-1)/4+(1/4+epsilon)*`u'`(-1,0)+u(-1,0)+(1/4-epsilon)*`u'`(1,0)-u(1,0)
`v'`(epsilon) = `u'`(0,1)/4+`u'`(0,-1)/4+(1/4+epsilon)*`u'`(-1,0)+u(-1,0)+(1/4-epsilon)*`u'`(1,0)-u(1,0)

I'll solve the system by iteration:
u[n+1](x,y) = u[n](x,y+1)/4+u[n](x,y-1)/4+(1/4+epsilon)*u[n](x-1,y)+(1/4-epsilon)*u[n](x+1,y)
u[n+1](x,y) = u[n](x,y+1)/4+u[n](x,y-1)/4+(1/4+epsilon)*u[n](x-1,y)+(1/4-epsilon)*u[n](x+1,y)  

I'll take advantage of the symmetry u(x,y) = u(x,-y) , and also the fact that (if you colour the

lattice as a checkerboard) the flea alternates between black and white sites, so we only

update, say, the black sites for odd n and the white ones for even n.

>    getflea:= proc(eps,M)
Procedure to do one Newton iteration for (2M+1) by (2M+1) grid
local A,dA,i,j,iter,pp,pm,R,dR,Rp,ip,ip0,iip;
u(x,y) = A[x+M,y+1]
A:= hfarray(1..2*M,1..M);
u'(x,y) = dA[x+M,y+1]  
dA:= hfarray(1..2*M,1..M);
use R to check convergence by changes in u(1,0)
R:= 0;
Probabilities for east and west hops.
pp:= 1/4+eps; pm:= 1/4-eps;
Initialize the arrays
for i from 1 to 2*M do for j from 1 to M do A[i,j]:= 0;
  dA[i,j]:= 0;
od od:
A[M,1]:= 1;
ip =0 or 1 depending whether this iteration is for black or white sites  
if (-1)^M=1 then ip:= 0 else ip:= 1 fi;
ip = ip0 on iterations that update u(1,0).
ip0:= 1-ip;
for iter from 1 do
for each iteration
  ip:= 1-ip;
     update sites on y=0
  for i from 2+ip to 2*M-1 by 2 do if i <> M then
      A[i,1]:= 0.5*A[i,2]+pp*A[i+1,1]+pm*A[i-1,1];
      dA[i,1]:= 0.5*dA[i,2]+A[i+1,1]+pp*dA[i+1,1]-A[i-1,1]+pm*dA[i-1,1]   fi od:
  iip:= ip;
  
update sites not on y=0
  for i from 2 to 2*M-1 do
   iip:= 1-iip;
   for j from 2+iip to M-1 by 2 do
     A[i,j]:= 0.25*(A[i,j-1]+A[i,j+1])+pp*A[i+1,j]+pm*A[i-1,j];
     dA[i,j]:= 0.25*(dA[i,j-1]+dA[i,j+1])+pp*dA[i+1,j]         +A[i+1,j]+pm*dA[i-1,j]-A[i-1,j];
     od od;
  if ip=ip0 then
    Rp:= A[M+1,1];
    if abs(Rp-R) <= 1e-15 then
if no significant change in u(1,0), calculate v(eps) and next eps
      R:= pp*A[M+1,1]+pm*A[M-1,1]+0.5*A[M,2];
      dR:= pp*dA[M+1,1]+A[M+1,1]+pm*dA[M-1,1]-A[M-1,1]+0.5*dA[M,2];
      print(R,dR);
      return eps - (R-0.5)/dR;
    else
     R:= Rp;
fi fi;
od
end;

>   

getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...
getflea := proc (eps, M) local A, dA, i, j, iter, pp, pm, R, dR, Rp, ip, ip0, iip; A := hfarray(1 .. 2*M,1 .. M); dA := hfarray(1 .. 2*M,1 .. M); R := 0; pp := 1/4+eps; pm := 1/4-eps; for i to 2*M do f...

>    Digits:= 15;
ti:= time(): lasteps:= 0; eps:= 0.1: N:= 5:
for iter from 1 while abs(lasteps - eps) > 1e-14 do
  N:= floor(3/2*N);
  lasteps:= eps:
  eps:= evalhf(getflea(eps,N));
  (time()-ti)*seconds;
od;

Digits := 15

lasteps := 0

N := 7

lasteps := .1

.410009796332776399, -1.98590726978539590

eps := .546855963335346266e-1

.626*seconds

N := 10

lasteps := .546855963335346266e-1

.513419027792780702, -2.29697893359143812

eps := .605276297960703064e-1

3.419*seconds

N := 15

lasteps := .605276297960703064e-1

.503242315619490843, -2.51430360332518710

eps := .618171779696492092e-1

12.627*seconds

N := 22

.500238133562584952, -2.52198933102199074

eps := .619116008760650928e-1

36.588*seconds

N := 33

lasteps := .619116008760650928e-1

.500005915021445979, -2.52146387723504439

eps := .619139467440742998e-1

96.444*seconds

N := 49

lasteps := .619139467440742998e-1

.500000019485132396, -2.52143064632599412

eps := .619139544718824916e-1

233.550*seconds

N := 73

lasteps := .619139544718824916e-1

.500000000005278444, -2.52143052205187690

eps := .619139544739759212e-1

543.080*seconds

N := 109

lasteps := .619139544739759212e-1

.499999999999998944, -2.52143052201665707

eps := .619139544739755050e-1

1243.185*seconds

The latest epsilon  value of .619139544739755050e-1  should have more than 10 correct digits (actually it has 12, not counting the initial 0).  

But this method might be very slow if we wanted, say, 30 digits.  Here's a different method that I thought of later, which works directly with the infinite lattice.  First of all, according to probability theory, the probability
p  of return is related to the expected number mu  of times the flea is at (0,0) [including the first time] by mu = sum((k+1)*p^k*(1-p),k = 0 .. infinity) `` = 1/(1-p) .  So we are looking for epsilon  to make mu = 2 .  We can write this as the sum of the probabilities that the flea is at (0,0) at each time.  Noting that this means making the same number of hops north as south and the same number east as west, we can write this as a convergent series
mu = sum(sum((2*j+2*k)!/(j!^2)/(k!^2)*(1/16-epsilon^2)^j*(1/4)^(2*k),k = 0 .. infinity),j = 0 .. infinity) `` = sum(c[j]*q^j,j = 0 .. infinity)  where q = 1/16-epsilon^2 .  All we need to do is compute the coefficients c[j] , sum the series and solve for mu = 2 .   The series doesn't converge very quickly: the radius of convergence is 1/16 (since mu = infinity  for epsilon = 0 , i.e. q = 1/16 ), and we will be looking at values of q rather close to 1/16.  So we'll need lots of terms to get an accurate value.

Maple calculates c[j] as an expression involving a hypergeometric function.  Maple 8 can convert this to an expression involving associated Legendre functions.

>    cj:= sum((2*j+2*k)!/(j!)^2/(k!)^2*(1/4)^(2*k),k=0..infinity) assuming j::posint;

cj := (2*j)!/j!^2*hypergeom([j+1, j+1/2],[1],1/4)

>    convert(%,`2F1`); # Maple 8 required

2/3*(2*j)!/j!^2/GAMMA(2*j+1)/Pi^(1/2)*LegendreQ(-1/2,2*j+1/2,2)*2^(2*j+1/2)/(3^(j-3/4))/exp(1/2*I*(4*j+1)*Pi)

We want to calculate c[j]  numerically, which Maple can do quite nicely for each j  using the hypergeom expression.  If we want, say, about 30 digits, we'll want enough terms until c[j]*q^j < 10^(-31)  for the q  we'll be using.  I'll do the calculations with 40 digits.

>    Digits:= 40: ti:= time():
q0:= 1/16 - .06^2:
for j from 0 do c[j]:= evalf(cj);
if c[j]*q0^j < 1e-31 then break fi;
od:
(time()-ti)*seconds;

566.424*seconds

>    j;

1067

>    c[j]*q0^j;

.9631099586682019371406887084219984152204e-31

>    Newt:= proc(eps) local q,j,v,vp;
This does one iteration of Newton's method for sum(c[j]*q^j,j = 1 .. 1067) = 2
  q:= evalf(1/16 - eps^2);
  v:= add(c[j]*[1,j/q]*q^j,j=0..1067);
  q:= q - (v[1]-2)/v[2];
  sqrt(1/16-q);
  end;

Newt := proc (eps) local q, j, v, vp; q := evalf(1/16-eps^2); v := add(c[j]*[1, j/q]*q^j,j = 0 .. 1067); q := q-(v[1]-2)/v[2]; sqrt(1/16-q) end proc
Newt := proc (eps) local q, j, v, vp; q := evalf(1/16-eps^2); v := add(c[j]*[1, j/q]*q^j,j = 0 .. 1067); q := q-(v[1]-2)/v[2]; sqrt(1/16-q) end proc
Newt := proc (eps) local q, j, v, vp; q := evalf(1/16-eps^2); v := add(c[j]*[1, j/q]*q^j,j = 0 .. 1067); q := q-(v[1]-2)/v[2]; sqrt(1/16-q) end proc
Newt := proc (eps) local q, j, v, vp; q := evalf(1/16-eps^2); v := add(c[j]*[1, j/q]*q^j,j = 0 .. 1067); q := q-(v[1]-2)/v[2]; sqrt(1/16-q) end proc
Newt := proc (eps) local q, j, v, vp; q := evalf(1/16-eps^2); v := add(c[j]*[1, j/q]*q^j,j = 0 .. 1067); q := q-(v[1]-2)/v[2]; sqrt(1/16-q) end proc
Newt := proc (eps) local q, j, v, vp; q := evalf(1/16-eps^2); v := add(c[j]*[1, j/q]*q^j,j = 0 .. 1067); q := q-(v[1]-2)/v[2]; sqrt(1/16-q) end proc
Newt := proc (eps) local q, j, v, vp; q := evalf(1/16-eps^2); v := add(c[j]*[1, j/q]*q^j,j = 0 .. 1067); q := q-(v[1]-2)/v[2]; sqrt(1/16-q) end proc

>    epsilon:= 0.06; ti:= time():
do
  oldepsilon:= epsilon:
  epsilon:= Newt(epsilon);
  print(epsilon);
  if abs(oldepsilon-epsilon) < 1e-30 then break fi;
od:
(time()-ti)*seconds;

epsilon := .6e-1

.6185464777359234928096383672378469744488e-1

.6191389694661146920928926758876176218166e-1

.6191395447393679735579619866533703591195e-1

.6191395447399094284817516850672649427361e-1

.6191395447399094284817521647321009312810e-1

.6191395447399094284817521647321009312826e-1

5.380*seconds

This has 31 correct digits.