procedure vtrans(d2: integer; var s,sd: scalar; var v1,v2: vector);
var
  imax,i,j,jmin: integer;
  st,sf,s0,s1,s2,s3: scalar;
  vt: vector;
begin { vtrans }
  write('(vtrans'); flush(output);
  ptrans(d2,sd,v1,v2);                              { p -> p }

  imax:=min(d2,(vdim+1) div 2);
  vt[0].u:=sone.u;
  vt[0].l.si:=0;
  for i:=1 to imax do begin          { binomial coefficients }
    vt[i]:=vt[i-1];
    ismult(vdim-i+1,vt[i]);
    isdiv(i,vt[i]);
    vt[vdim-i]:=vt[i];
  end;
  vt[vdim]:=vt[0];

  imax:=min(d2,vdim);
  jmin:=1;
  sabs0(sd,s0);
  squot(s0,s,st);
  if not sle(st,shalf) then begin
    s1:=st;
    repeat
      jmin:=2*jmin;
      isdiv(2,s1);
    until sle(s1,shalf) or (jmin>999);
    sdiff(sone,s1,s2);
    ispower(jmin,s2,s3); { 1/s3 is an upper bound on exp(st) }
  end;
  ispower(vdim-imax,s0,s2);
  sprod(s2,v1[vdim],sf);

  for i:=imax downto 0 do begin
    j:=vdim+1-i;
    if j<jmin then s2:=s3 else begin
      s1:=st;
      isdiv(j,s1);
      sdiff(sone,s1,s2)
    end;
    squot(vt[i],s2,s1);
    sprod(sf,s1,s2);
    ssymm(s2,s2);
    ssum(v2[i],s2,s1);
    v2[i]:=s1;
    sprod(sf,s0,s1);
    sf:=s1;
  end;
  v2[vdim].l.si:=0;
  write(')'); flush(output);
end { vtrans };

