Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Тип данных "слагаемое"
- data Summand a = a :^: Integer
- -- Переделать для Integral! Деление с остатком
- iCoeff (x :^: y) = x
- iDeg (x :^: y) = y
- instance (Show a, Ord a, Num a) => Show (Summand a) where
- show i =
- let
- a = iCoeff i
- b = iDeg i
- ft = if a == 1 then ""
- else if a == -1 then "-"
- else show a
- sc = if b == 1 then "x"
- else if b == 0 && a == 1 then show a
- else if b == 0 then ""
- else "x^" ++ (show b)
- in
- ft ++ sc
- instance (Ord a) => Eq (Summand a) where
- (==) i1 i2 =
- let
- i1c = iCoeff i1
- i1d = iDeg i1
- i2c = iCoeff i2
- i2d = iDeg i2
- in
- -- Тип данных "многочлен"
- data Polynome a = CONST_ZERO | (Summand a) :+: (Polynome a)
- hd (x :+: y) = x
- hd CONST_ZERO = 0.0 :^: 0
- tl (x :+: y) = y
- tl CONST_ZERO = CONST_ZERO
- -- Нормализация многочлена
- normalize CONST_ZERO = CONST_ZERO
- normalize p =
- let
- auxNorm (CONST_ZERO, cur) = cur
- auxNorm (z, cur) =
- let
- findMin (CONST_ZERO, curRes) = curRes
- findMin ((x1 :^: x2) :+: y, curRes)
- | x2 < curRes = findMin (y, x2)
- | otherwise = findMin (y, curRes)
- count (CONST_ZERO, x, curRes) = curRes
- count ((x1 :^: x2) :+: y, x, curRes)
- | x2 == x = count (y, x, curRes + x1)
- | otherwise = count (y, x, curRes)
- erase (CONST_ZERO, x, curRes) = curRes
- erase ((x1 :^: x2) :+: y, x, curRes)
- | x2 == x = erase (y, x, curRes)
- | otherwise = erase (y, x, (x1 :^: x2) :+: curRes)
- curX = findMin (z, iDeg (hd z))
- cnt = count (z, curX, 0)
- newZ = erase (z, curX, CONST_ZERO)
- in
- if cnt == 0 then auxNorm (newZ, cur)
- else auxNorm (newZ, (cnt :^: curX) :+: cur)
- in
- auxNorm (p, CONST_ZERO)
- -- вывод многочлена на экран
- instance (Show a, Ord a, Num a) => Show (Polynome a) where
- show CONST_ZERO = "0"
- show i =
- let
- auxShow (x :+: CONST_ZERO, z) = auxShow (CONST_ZERO, z ++ "(" ++ show x
- ++ ")")
- auxShow (x :+: y, z) = auxShow (y, z ++ "(" ++ show x
- ++ ")" ++ " + ")
- auxShow (_, z) = z
- in
- auxShow (i, "")
- -- подсчёт значения многочлена в точке x
- calculate p x =
- let
- auxCalc (CONST_ZERO, x, cur) = cur
- auxCalc ((x1 :^: x2) :+: y, x, cur) = auxCalc (y, x, x1 * (x ^ x2) + cur)
- in
- auxCalc (p, x, 0)
- -- сравнение двух многочленов
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement