program checkgap(input,output);
{ check that the zeros in zeros.t satify the desired bound
  and verify the bound (3.2) in reference [1] }
const
  hdim=13;
  edim=27;
  vdim=0;
  lmax=0;
  dz_val='1.0E-40';
  kappa_val='7.5E-1';
  l0=35;
  n0=40;

%include 'types.h';

var
  imin,imax,i: integer;
  beta2,dz,k2,p1,p2,gamma,kappa,a,theta: scalar;
  s0,s1,s2,s3,s4,s5,s6,s7,s8,st1,st2,st3: scalar;
  guess: zeros;

%include 'reps.i';
%include 'scalar.i';
%include 'sfun.i';

%include 'ztread';

procedure gap(n: integer; var s: scalar);
{ s:=(gap_n plusminus dz of guessed zeros), uses globals }
var
  dg,g0,g1,s0,s1: scalar;
begin { gap }
  if (n<1) or (n>zdim) then writeln('gap: error - index out of range')
  else begin
    dg:=dz;
    dg.l.si:=-1;
    ssum(guess[n],dg,g0);
    ssqrt(g0,s0);
    ssum(guess[n-1],dg,g1);
    ssqrt(g1,s1);
    sdiff(s0,s1,s);
  end;
end { gap };

begin { checkgap }
  sinit;
  ssset(dz_val,dz);
  ssset(kappa_val,kappa);
  sread('beta2.s',beta2);
  ztread('zeros.t',guess);
  writeln;

  write('checkgap: determine upper bound gamma on gaps');
  imin:=n0-l0;
  imax:=2*n0-1;
  writeln(imin:3,' ...',imax:3);
  gap(imin,gamma);
  for i:=imin+1 to imax do begin
    gap(i,st2);
    sunion(gamma,st2,st3);
    gamma:=st3;
  end;
  squot(sone,gamma,st1);
  writeln('checkgap: 1/gamma >=', rst(st1.l));
  writeln('checkgap: kappa    =', rst(kappa.l));
  if sge(st1,kappa) then writeln('checkgap: ok')
  else writeln('checkgap: error - test failed');

  writeln('checkgap: find allowed range for theta');
  sprod(kappa,kappa,k2);                { k2 = kappa^2 }
  sarctan(sone,p1);
  ismult(4,p1);                         { p1 = pi }
  sprod(p1,p1,p2);                      { p2 = pi^2 }
  sdiff(sone,beta2,s0);
  sprod(s0,k2,s1);                      { s1 = (1-beta^2)*kappa^2 }
  sprod(s1,p2,st1);
  s2:=st1;
  ismult(2,s2);                         { s2 = 2*(1-beta^2)*(pi*kappa)^2 }
  sneg(st1);
  sexp(st1,s3);                         { s3 = exp(-(1-beta^2)*(pi*kappa)^2) }
  ssum(sone,s2,st1);
  ssum(st1,s3,st2);
  squot(st2,k2,s4);                     { s4 = (1+s2+s3)/k2 }
  squot(beta2,s1,st1);
  isdiv(4,st1);
  sexp(st1,s5);                         { s5 = exp(beta^2/(4*s1)) }
  sprod(s0,s5,st1);
  sprod(st1,s4,a);                      { a = (1-beta^2)*s5*s4 }
  writeln('checkgap: a <=',rst(a.u));

  sprod(k2,k2,st1);
  isdiv(1+l0,st1);
  sprod(st1,a,st2);
  ssum(s3,st2,s6);                      { s6 = s3+sa*kappa^4/(1+l0) }
  ssqrt(beta2,st1);
  squot(shalf,st1,s7);
  sdiff(sone,s7,s8);                    { s8 = 1-1/(2*beta) }
  sprod(st1,p1,st2);
  sarcsin(s6,st1);
  squot(st1,st2,theta);                 { theta = arcsin(s6)/(pi*beta) }

  writeln('checkgap: need theta >',rst(theta.u));
  writeln('checkgap: need theta <',rst(s8.l));
  theta.l:=theta.u;
  s8.u:=s8.l;
  if sge(theta,s8) then writeln('checkgap: error - test failed')
  else writeln('checkgap: ok');

  sdone('checkgap');
end { checkgap }.

