procedure vprod(var t1,t2: scalar; var v1,v2,v3: vector); var ho1,ho2,teq: boolean; i,j: integer; s,s1,s2,s3,sf,sp,ss,ts: scalar; begin { vprod }; write('(vprod'); flush(output); ho1:=not seq0(v1[vdim]); ho2:=not seq0(v2[vdim]); teq:=(addr(t1)=addr(t2)); if teq then begin s:=t1; isdiv(2,s); if ho1 or ho2 then ispower(vdim,stwo,sp); end else begin squot(t2,t1,s1); ssum(sone,s1,s2); squot(t2,s2,s); ssum(t1,t2,ts); end; pprod(vdim,v1,v2,v3); { p*p -> p } szero(s3); sf:=sone; for i:=vdim to 2*(vdim-1) do begin { p*p -> h } szero(ss); for j:=i-vdim to vdim-1 do begin sprod(v1[j],v2[i-j],s1); ssum(s1,ss,s2); ss:=s2; end; sprod(ss,sf,s1); sunion(s3,s1,s2); s3:=s2; ismult(i,sf); sprod(sf,s,s1); sf:=s1; end; sabs0(s2,s3); if ho1 then begin { h*(p+h) -> h } if not teq then begin squot(ts,t2,s1); ispower(vdim,s1,sp); end; vnorm(v2,t2,s1); sprod(sp,v1[vdim],sf); sprod(s1,sf,s2); ssum(s3,s2,s1); sabs0(s1,s3); end; if ho2 then begin { p*h -> h } if not teq then begin squot(ts,t1,s1); ispower(vdim,s1,sp); end; ss:=v1[vdim]; szero(v1[vdim]); vnorm(v1,t1,s1); v1[vdim]:=ss; sprod(sp,v2[vdim],sf); sprod(s1,sf,s2); ssum(s3,s2,s1); sabs0(s1,s3); end; v3[vdim]:=s3; write(')'); flush(output); end { vprod };