September Morn Update
This commit is contained in:
parent
4e2d22a71d
commit
aac6731f2c
6856 changed files with 141342 additions and 21127 deletions
|
|
@ -1,16 +1,25 @@
|
|||
-- Extended Euclidean algorithm. Given non-negative a and b, return x, y and g
|
||||
-- such that ax + by = g, where g = gcd(a,b). Note that x or y may be negative.
|
||||
-- Given a and m, return Just x such that ax = 1 mod m.
|
||||
-- If there is no such x return Nothing.
|
||||
modInv :: Int -> Int -> Maybe Int
|
||||
modInv a m
|
||||
| 1 == g = Just (mkPos i)
|
||||
| otherwise = Nothing
|
||||
where
|
||||
(i, _, g) = gcdExt a m
|
||||
mkPos x
|
||||
| x < 0 = x + m
|
||||
| otherwise = x
|
||||
|
||||
-- Extended Euclidean algorithm.
|
||||
-- Given non-negative a and b, return x, y and g
|
||||
-- such that ax + by = g, where g = gcd(a,b).
|
||||
-- Note that x or y may be negative.
|
||||
gcdExt :: Int -> Int -> (Int, Int, Int)
|
||||
gcdExt a 0 = (1, 0, a)
|
||||
gcdExt a b = let (q, r) = a `quotRem` b
|
||||
(s, t, g) = gcdExt b r
|
||||
in (t, s - q * t, g)
|
||||
gcdExt a b =
|
||||
let (q, r) = a `quotRem` b
|
||||
(s, t, g) = gcdExt b r
|
||||
in (t, s - q * t, g)
|
||||
|
||||
-- Given a and m, return Just x such that ax = 1 mod m. If there is no such x
|
||||
-- return Nothing.
|
||||
modInv a m = let (i, _, g) = gcdExt a m
|
||||
in if g == 1 then Just (mkPos i) else Nothing
|
||||
where mkPos x = if x < 0 then x + m else x
|
||||
|
||||
main = do
|
||||
print $ 2 `modInv` 4
|
||||
print $ 42 `modInv` 2017
|
||||
main :: IO ()
|
||||
main = mapM_ print [2 `modInv` 4, 42 `modInv` 2017]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue