Guest User

Untitled

a guest
Oct 22nd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. module Resultant where
  2.  
  3. import Numeric.LinearAlgebra
  4.  
  5. type Poly = [Double]
  6. -- 多項式はこれで表す
  7. -- 主係数から定数までを,次数の大きい項から順に全て列挙
  8. -- 例 : x^2 - 2 -> [1, 0, (-2)]
  9.  
  10. deg :: Poly -> Int -- 次数計算
  11. deg f = length f - 1
  12.  
  13.  
  14. mj :: Poly -> Poly -> Int -> Matrix Double -- M_j (f, g) の計算
  15. mj f g j = (k >< k) -- k * k 行列
  16. $ concat -- 行ごとの配列になっているものをくっつけて1つの配列に
  17. $ map (makeMsRow f k) [0..(n - j - 1)] -- 上側
  18. ++ map (makeMsRow g k) [0..(m - j - 1)] -- 下側
  19. where
  20. (m, n) = (deg f, deg g)
  21. k = m + n - 2 * j
  22.  
  23.  
  24. psc :: Poly -> Poly -> Int -> Double -- PSC_j (f, g) の計算
  25. psc f g = det . mj f g
  26.  
  27.  
  28. degGcd :: Poly -> Poly -> Int
  29. degGcd f g = head $ filter (\j -> psc f g j /= 0) [0..] -- PSC が最初に 0 じゃなくなる j
  30.  
  31.  
  32. makeMsRow :: Poly -> Int -> Int -> Poly -- M_j の各行を生成
  33. makeMsRow f k = flip add0last k . add0head f -- 右に n ずらしてから長さ k の配列を作る
  34.  
  35.  
  36. add0head :: Poly -> Int -> Poly
  37. add0head a 0 = a
  38. add0head a n
  39. | n < 0 = undefined
  40. | otherwise = 0 : add0head a (n - 1) -- n 個の 0 を先頭に加える
  41.  
  42.  
  43. add0last :: Poly -> Int -> Poly
  44. add0last a n
  45. | dif == 0 = a
  46. | dif < 0 = add0last (init a) n -- 長い分を削る
  47. | otherwise = a ++ zeros dif -- 短い分 0 を後ろに加える
  48. where
  49. dif = n - length a
  50. zeros :: Int -> Poly -- n 個の 0 のリストを生成
  51. zeros 0 = []
  52. zeros n
  53. | n < 0 = undefined
  54. | otherwise = 0 : zeros (n - 1)
Add Comment
Please, Sign In to add comment