Guest User

Untitled

a guest
Nov 24th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. -- EEA
  2. eea :: (Integral m) => m -> m -> (m, m, m)
  3. eea f g = loop f g 1 0 0 1
  4. where
  5. loop r0 r1 s0 s1 t0 t1
  6. | r2 == 0 = if r1 < 0 then ((-r1), (-s1), (-t1)) else (r1, s1, t1)
  7. | otherwise = loop r1 r2 s1 s2 t1 t2
  8. where
  9. (q, r2) = r0 `divMod` r1
  10. s2 = s0 - s1 * q
  11. t2 = t0 - t1 * q
  12.  
  13. -- 途中経過も出力
  14. eeaList :: (Integral m) => m -> m -> [(m, m, m)]
  15. eeaList f g = loop f g 1 0 0 1
  16. where
  17. loop r0 r1 s0 s1 t0 t1
  18. | r2 == 0 = [(r0, s0, t0)] ++ case r1 < 0 of True -> [((-r1), (-s1), (-t1))]
  19. _ -> [(r1, s1, t1)]
  20. | otherwise = [(r0, s0, t0)] ++ loop r1 r2 s1 s2 t1 t2
  21. where
  22. (q, r2) = r0 `divMod` r1
  23. s2 = s0 - s1 * q
  24. t2 = t0 - t1 * q
  25.  
  26. -- 余りの絶対値を小さくとる割り算
  27. absDivMod :: (Integral m) => m -> m -> (m, m)
  28. absDivMod a b
  29. | abs b >= abs (2 * r) = (q, r)
  30. | otherwise = (q + 1, r - b)
  31. where
  32. (q, r) = a `divMod` b
  33.  
  34. -- EEA with absDivMod
  35. absEea :: (Integral m) => m -> m -> (m, m, m)
  36. absEea f g = loop f g 1 0 0 1
  37. where
  38. loop r0 r1 s0 s1 t0 t1
  39. | r2 == 0 = if r1 < 0 then ((-r1), (-s1), (-t1)) else (r1, s1, t1)
  40. | otherwise = loop r1 r2 s1 s2 t1 t2
  41. where
  42. (q, r2) = r0 `absDivMod` r1
  43. s2 = s0 - s1 * q
  44. t2 = t0 - t1 * q
  45.  
  46. absEeaList :: (Integral m) => m -> m -> [(m, m, m)]
  47. absEeaList f g = loop f g 1 0 0 1
  48. where
  49. loop r0 r1 s0 s1 t0 t1
  50. | r2 == 0 = [(r0, s0, t0)] ++ case r1 < 0 of True -> [((-r1), (-s1), (-t1))]
  51. _ -> [(r1, s1, t1)]
  52. | otherwise = [(r0, s0, t0)] ++ loop r1 r2 s1 s2 t1 t2
  53. where
  54. (q, r2) = r0 `absDivMod` r1
  55. s2 = s0 - s1 * q
  56. t2 = t0 - t1 * q
  57.  
  58. -- EEA の検算
  59. checkEea :: (Integral m, Random m) => (m -> m -> (m, m, m)) -> Bool
  60. checkEea f
  61. | False `elem` checkedeList = False
  62. | otherwise = True
  63. where
  64. checkedeList = check f <$> as <*> bs
  65. as = map (fst . random . mkStdGen) [0..99]
  66. bs = map (fst . random . mkStdGen) [0..(-99)]
  67. check f a b
  68. | s * a + t * b == gcd a b = True
  69. | otherwise = False
  70. where
  71. (_, s, t) = f a b
Add Comment
Please, Sign In to add comment