PROCEDURE gline(x1,y1,x2,y2 :INTEGER); BEGIN LINE(x1,y1,x2,y2) END; PROCEDURE cadd(VAR c1,c2,c3:complex); BEGIN c3.re := c1.re+c2.re; c3.im := c1.im+c2.im END; PROCEDURE csub(VAR c1,c2,c3:complex); BEGIN c3.re := c1.re-c2.re; c3.im := c1.im-c2.im END; PROCEDURE cmul(VAR c1,c2,c3:complex); BEGIN c3.re := c1.re*c2.re-c1.im*c2.im; c3.im := c1.re*c2.im+c1.im*c2.re END; PROCEDURE set_complex(xre,xim:REAL; VAR c:complex); BEGIN c.re := xre; c.im := xim END; PROCEDURE cline(c1,c2 :complex); BEGIN gline(ROUND(c1.re*1000),ROUND(c1.im*1000), ROUND(c2.re*1000),ROUND(c2.im*1000)) END; PROCEDURE ftree(c1,c2,f0,f1 :complex; n :INTEGER); VAR z,z0,z1 :complex; BEGIN IF 0 < n THEN BEGIN cline(c1,c2); csub(c2,c1,z); cmul(z,f0,z0); cmul(z,f1,z1); cadd(c1,z0,z0); cadd(c1,z1,z1); ftree(c2,z0,f0,f1,n - 1); ftree(c2,z1,f0,f1,n - 1); END END;