> pAdd0 m1 m2 | length m1 == length m2 = zipWith (+) m1 m2
>             | otherwise = error "different length"
> pAdd m1 m2  | k >=0     = pAdd0 m1 ((replicate k 0)++m2)
>             | k < 0     = pAdd0 ((replicate (-k) 0)++m1) m2
>             where k     = length m1 - length m2
> polyN m n = map (*n) m
> polyX m x = foldl f 0 m where f a b = a*x+b
> kn m1 m2  = sum (zipWith (*) m1 (reverse m2))
> sv x y    = sum (zipWith (*) x y)
> mms x []  = []     
> mms x y   = (sv x y) : (mms x (tail y))
> pMult x y = mms (reverse x) ((replicate (length x - 1) 0) ++ y) 
> pSetr kk  = foldl pMult [1] [[1,-k] | k<-kk]
> delp n    = [k | k<-[1..n], mod n k == 0] 
> delims n  = d1 ++  map (\x -> -x) d1 where d1 = delp n
> pRoots m  = [k | k<- delims (last m), polyX m k == 0]
> pDer m = reverse (tail (zipWith (*) [0..length m -1] (reverse m)))
> pVal m n  = map (polyX m) [0..n]

Используются стадартные функции
length		-	длина списка
replicate	-	список из n значений
map		-	применение функции к списку
foldl		-	свертка спсика
sum 		-	суммирование списка
zipWith		-	попарное примение функции к двум спискам
reverse		-	переворачивание списка