]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/Polynomials.scl
Merge commit 'a2a4242'
[simantics/platform.git] / tests / org.simantics.scl.compiler.tests / src / org / simantics / scl / compiler / tests / scl / Polynomials.scl
1 import "Prelude"\r
2 \r
3 data Poly a = Poly [a]\r
4 \r
5 normalize l = go (length l)\r
6   where\r
7     go i = if i > 0 && l!(i-1)==zero\r
8            then go (i-1)\r
9            else take i l \r
10 \r
11 instance (Eq a, Additive a) => Additive (Poly a) where\r
12     zero = Poly []\r
13     Poly a + Poly b = \r
14         Poly ( \r
15             normalize (\r
16                zipWith (+) a b + \r
17                  if la > lb\r
18                  then drop lb a\r
19                  else drop la b\r
20             )\r
21         )\r
22           where\r
23             la = length a\r
24             lb = length b        \r
25 \r
26 instance (Eq a, Ring a) => Ring (Poly a) where\r
27     one = Poly [one]\r
28     neg (Poly l) = Poly (map neg l)\r
29     a - b = a + (neg b)\r
30     Poly a * Poly b = \r
31         Poly ( if aDeg < bDeg\r
32                then [ segSum n 0        n    | n <- [0     ..aDeg]   ]\r
33                   + [ segSum n 0        aDeg | n <- [aDeg+1..bDeg]   ]\r
34                   + [ segSum n (n-bDeg) aDeg | n <- [bDeg+1..sumDeg] ]\r
35                else [ segSum n 0        n    | n <- [0     ..bDeg]   ]\r
36                   + [ segSum n (n-bDeg) n    | n <- [bDeg+1..aDeg]   ]\r
37                   + [ segSum n (n-bDeg) aDeg | n <- [aDeg+1..sumDeg] ]\r
38              )\r
39           where \r
40             aDeg = length a - 1\r
41             bDeg = length b - 1\r
42             sumDeg = aDeg + bDeg\r
43             segSum n low high = sum [ a!i * b!(n-i) | i <- [low..high] ]\r
44     fromInteger x = Poly [fromInteger x]\r
45             \r
46 a = Poly [4.0,5.0,8.0,3.0,2.0,1.0]\r
47 b = Poly [1.0,0.0,2.0,1.0]\r
48 main = a * a + a * b + b * a + b * b - (a+b)*(a+b)\r
49 --\r
50 []