summaryrefslogtreecommitdiff
path: root/testsuite/tests/lib/integer/integerRecipMod.hs
blob: aad4a7e33b1959dc1117b5c6114e1607d71d331e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{-# LANGUAGE BangPatterns, CPP, MagicHash, UnboxedTuples, TupleSections #-}

module Main (main) where

import Data.List (group)
import Data.Bits
import Data.Word
import Data.Maybe
import Control.Monad

import GHC.Word
import GHC.Base
import GHC.Num.Integer
import GHC.Num.Natural
import qualified GHC.Num.Integer as I

recipModInteger :: Integer -> Natural -> Maybe Natural
recipModInteger x m = case I.integerRecipMod# x m of
   (# y |    #) -> Just y
   (#   | () #) -> Nothing

main :: IO ()
main = do
   let
      f x = case recipModInteger x (2*3*11*11*17*17) of
               y -> fmap (x,) y

   -- positive modulo
   print $ mapMaybe f [-7..71]

   -- modulo == 1 or 0
   print (recipModInteger 77 1)
   print (recipModInteger 77 0)