MODULE polyval; (*--------------------------------------------------------- File name: polyval.pm Author: MM, AG Date: 6/07/05 Problem: Calculates P(x) for all x = {0 1 2 3 ... 1024} where P is a polynomial of degree N. Uses Horner Schema. Example of Execution 1: P(x) = x^4 + 3x^3 + (0x^2) + 4x + 5 L0x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L1Res: 5 13 53 179 469 1025 1973 3463 5669 8789 13045 18683 25973 35209 46709 Cycles: (N + 2) assign + 1 ID + (N + 1) add + N mult. *) (*---------------------------------------------------------- CONFIGURATION ----------------------------------------------------------*) CONST MAXCELLS=1024; (* MAXCELLS cells in one line *) CONST N=5; CONFIGURATION chain[0..(MAXCELLS - 1)]; CONNECTION left: chain [i] -> chain[(i-1) MOD MAXCELLS]; right: chain[i] -> chain[(i+1) MOD MAXCELLS]; (*---------------------------------------------------------- VARIABLES ----------------------------------------------------------*) VAR L0x, L1Res: chain OF INTEGER; i:INTEGER; A: ARRAY[0..(N-1)] OF INTEGER; (* coefficients of polynomials *) ArrLine: ARRAY[0..(N-1)] OF chain OF INTEGER; (*---------------------------------------------------------- MAIN ----------------------------------------------------------*) BEGIN (* initialize data *) (* P(x) = x^4 + 3x^3 + (0x^2) + 4x + 5 *) A[0] := 5; A[1] := 4; A[2] := 0; A[3] := 3; A[4] := 1; (* Horner Schema *) FOR i:= 0 TO (N -1) DO ArrLine[i] := A[i]; END; (* FOR *) L0x := ID(chain) - 1; (* L0x = 0 1 2 3 4 5 ... *) L1Res := 0; (* L1Res = 0 0 0 0 0 0 ...*) FOR i:= (N-1) TO 0 BY -1 DO L1Res:= L0x * L1Res + ArrLine[i]; END; (* FOR *) (* Printing *) IF ID(chain) < 16 THEN WriteString("P(x) = x^4 + 3x^3 + (0x^2) + 4x + 5"); WriteLn; WriteString("L0x: "); WriteInt(L0x, 2); WriteLn; WriteString("L1Res: "); WriteInt(L1Res, 2); WriteLn; END; (* display *) END polyval.