Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. -- f s + g t = gcd(f, g) なる (s, t) を求める
  2. eea :: Integer -> Integer -> (Integer, Integer)
  3. eea f g = loop f g 1 0 0 1
  4. where
  5. loop :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer
  6. -> (Integer, Integer)
  7. loop r r' s s' t t' -- r = r_i-1, r' = r_i
  8. | r'' == 0 = (s', t')
  9. | otherwise = loop r' r'' s' s'' t' t''
  10. where
  11. (q', r'') = r `divMod` r' -- = (q_i, r_i+1)
  12. s'' = s - s' * q' -- = s_i+1
  13. t'' = t - t' * q' -- = t_i+1
  14.  
  15.  
  16. -- 途中経過も表示 [(r, s, t)]
  17. eeaList :: Integer -> Integer -> [(Integer, Integer, Integer)]
  18. eeaList f g = loop f g 1 0 0 1
  19. where
  20. loop :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer
  21. -> [(Integer, Integer, Integer)]
  22. loop r r' s s' t t' -- r = r_i-1, r' = r_i
  23. | r'' == 0 = [(r, s, t), (r', s', t')]
  24. | otherwise = [(r, s, t)] ++ loop r' r'' s' s'' t' t''
  25. where
  26. (q', r'') = r `divMod` r' -- = (q_i, r_i+1)
  27. s'' = s - s' * q' -- = s_i+1
  28. t'' = t - t' * q' -- = t_i+1
  29.  
  30.  
  31. -- (s, t, gcd(f, g))
  32. eeaGcd :: Integer -> Integer -> (Integer, Integer, Integer)
  33. eeaGcd f g = loop f g 1 0 0 1
  34. where
  35. loop :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer
  36. -> (Integer, Integer, Integer)
  37. loop r r' s s' t t' -- r = r_i-1, r' = r_i
  38. | r'' == 0 = (s', t', r')
  39. | otherwise = loop r' r'' s' s'' t' t''
  40. where
  41. (q', r'') = r `divMod` r' -- = (q_i, r_i+1)
  42. s'' = s - s' * q' -- = s_i+1
  43. t'' = t - t' * q' -- = t_i+1
  44.  
  45.  
  46. -- 余りの絶対値が小さくなるような割り算
  47. -- 9 = 2 * 5 + (-1)
  48. absDivMod :: Integer -> Integer -> (Integer, Integer)
  49. absDivMod a b = loop a b x
  50. where
  51. x | a * b >= 0 = 1
  52. | otherwise = (-1)
  53. loop :: Integer -> Integer -> Integer -> (Integer, Integer)
  54. loop s t q
  55. | abs r > (abs t) `div` 2 = loop r t x
  56. | otherwise = (q, r)
  57. where
  58. r = abs s - abs t
  59. x
  60. | q >= 0 = q + 1
  61. | otherwise = q - 1
  62.  
  63.  
  64. tupleMap3 :: (a -> a) -> (a, a, a) -> (a, a, a)
  65. tupleMap3 f (x, y ,z) = (f x, f y, f z)
  66.  
  67.  
  68. absEeaList :: Integer -> Integer -> [(Integer, Integer, Integer)]
  69. absEeaList f g = loop f g 1 0 0 1
  70. where
  71. loop :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer
  72. -> [(Integer, Integer, Integer)]
  73. loop r0 r1 s0 s1 t0 t1 -- r = r_i-1, r' = r_i
  74. | r2 == 0 = [(r0, s0, t0), (r', s', t')]
  75. | otherwise = [(r0, s0, t0)] ++ loop r1 r2 s1 s2 t1 t2
  76. where
  77. (q, r2) = r0 `absDivMod` r1 -- = (q_i, r_i+1)
  78. s2 = s0 - s1 * q -- = s_i+1
  79. t2 = t0 - t1 * q -- = t_i+1
  80. (r', s', t')
  81. | r1 < 0 = tupleMap3 (*(-1)) (r1, s1, t1)
  82. | otherwise = (r1, s1, t1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement