Advertisement
Guest User

Untitled

a guest
Oct 24th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. -- Тип данных "слагаемое"
  2. data Summand a = a :^: Integer
  3.  
  4. -- Переделать для Integral! Деление с остатком
  5.  
  6. iCoeff (x :^: y) = x
  7. iDeg (x :^: y) = y
  8.  
  9. instance (Show a, Ord a, Num a) => Show (Summand a) where
  10. show i =
  11. let
  12. a = iCoeff i
  13. b = iDeg i
  14. ft = if a == 1 then ""
  15. else if a == -1 then "-"
  16. else show a
  17. sc = if b == 1 then "x"
  18. else if b == 0 && a == 1 then show a
  19. else if b == 0 then ""
  20. else "x^" ++ (show b)
  21. in
  22. ft ++ sc
  23.  
  24. instance (Ord a) => Eq (Summand a) where
  25. (==) i1 i2 =
  26. let
  27. i1c = iCoeff i1
  28. i1d = iDeg i1
  29. i2c = iCoeff i2
  30. i2d = iDeg i2
  31. in
  32.  
  33.  
  34. -- Тип данных "многочлен"
  35. data Polynome a = CONST_ZERO | (Summand a) :+: (Polynome a)
  36.  
  37. hd (x :+: y) = x
  38. hd CONST_ZERO = 0.0 :^: 0
  39. tl (x :+: y) = y
  40. tl CONST_ZERO = CONST_ZERO
  41.  
  42. -- Нормализация многочлена
  43. normalize CONST_ZERO = CONST_ZERO
  44. normalize p =
  45. let
  46. auxNorm (CONST_ZERO, cur) = cur
  47. auxNorm (z, cur) =
  48. let
  49. findMin (CONST_ZERO, curRes) = curRes
  50. findMin ((x1 :^: x2) :+: y, curRes)
  51. | x2 < curRes = findMin (y, x2)
  52. | otherwise = findMin (y, curRes)
  53.  
  54. count (CONST_ZERO, x, curRes) = curRes
  55. count ((x1 :^: x2) :+: y, x, curRes)
  56. | x2 == x = count (y, x, curRes + x1)
  57. | otherwise = count (y, x, curRes)
  58.  
  59. erase (CONST_ZERO, x, curRes) = curRes
  60. erase ((x1 :^: x2) :+: y, x, curRes)
  61. | x2 == x = erase (y, x, curRes)
  62. | otherwise = erase (y, x, (x1 :^: x2) :+: curRes)
  63.  
  64. curX = findMin (z, iDeg (hd z))
  65. cnt = count (z, curX, 0)
  66. newZ = erase (z, curX, CONST_ZERO)
  67. in
  68. if cnt == 0 then auxNorm (newZ, cur)
  69. else auxNorm (newZ, (cnt :^: curX) :+: cur)
  70. in
  71. auxNorm (p, CONST_ZERO)
  72.  
  73. -- вывод многочлена на экран
  74. instance (Show a, Ord a, Num a) => Show (Polynome a) where
  75. show CONST_ZERO = "0"
  76. show i =
  77. let
  78. auxShow (x :+: CONST_ZERO, z) = auxShow (CONST_ZERO, z ++ "(" ++ show x
  79. ++ ")")
  80. auxShow (x :+: y, z) = auxShow (y, z ++ "(" ++ show x
  81. ++ ")" ++ " + ")
  82. auxShow (_, z) = z
  83. in
  84. auxShow (i, "")
  85.  
  86. -- подсчёт значения многочлена в точке x
  87. calculate p x =
  88. let
  89. auxCalc (CONST_ZERO, x, cur) = cur
  90. auxCalc ((x1 :^: x2) :+: y, x, cur) = auxCalc (y, x, x1 * (x ^ x2) + cur)
  91. in
  92. auxCalc (p, x, 0)
  93.  
  94. -- сравнение двух многочленов
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement