procedure vconvinit(var c,r: scalar; var vk: vector);
var
  i: integer;
  s,si,ri,sc,sq,sr,st,s1,s2: scalar;
  vt0,vt1,vt2: vector; 

begin { vconvinit };
  write('(vconvinit'); flush(output);
  s1:=c;
  ismult(2,s1);
  ssum(r,s1,s);                                    { s=r+2c }
  squot(sone,s,si);                                { si=1/s }
  squot(sone,r,ri);                                { ri=1/r }
  squot(c,s,sc);                                   { sc=c/s }
  squot(s,r,sr);                                   { sr=s/r }
  ssqrt(sr,sq);                              { sq=sqrt(s/r) }

  vt0[0]:=sone;
  for i:=1 to vdim-1 do begin
    vt0[i]:=vt0[i-1];
    isdiv(i,vt0[i]);
  end;
  szero(vt0[vdim]);

  vscale(si,vt0,vt1);                  { vt1[k]=(si^k)/(k!) }
  vconv(vdim,c,vt0,vt1,vt2);   
  vscale(ri,vt0,vt1);
  vsprod(sq,vt1,vt0);               { vt0[k]=sq*(ri^k)/(k!) }
  vdiff(vt0,vt2,vt1);
  st:=s;
  st.l.si:=0;
  ispower(vdim,st,s1);
  for i:=2 to vdim do ismult(i,s1);
  vsprod(s1,vt1,vt2);                         { first bound }

  st.u:=sone.u;
  st.l.si:=0;
  for i:=vdim-1 downto 0 do begin
    ismult(i+1,st);
    ismult(2*(i+1)-1,st);
    isdiv(vdim-i,st);
    sprod(st,c,s1);
    st:=s1;
    s1:=sc;
    if i=0 then ismult(2,s1)
    else begin
      ismult(2*vdim+1,s1);
      isdiv(vdim-i+1,s1);
    end;
    sdiff(sone,s1,s2);
    if s2.l.si>0 then begin
      squot(sone,s2,s1);
      sprod(s1,st,vt1[i]);                   { second bound }
    end
    else vt1[i]:=vt2[i];
  end;

  for i:=0 to vdim-1 do begin
    sinter(vt1[i],vt2[i],vk[i]);    { min of the two bounds }
    with vk[i] do begin
      l:=u;
      l.si:=-u.si;
    end;
  end;

  ispower(vdim,sr,s2);
  sprod(sq,s2,vk[vdim]);
  vk[vdim].l.si:=0;

  write(')'); flush(output);
end { vconvinit };

