import Control.Monad
import Foreign.Ptr
import Foreign.C.String
import Foreign.Marshal.Alloc
import Data.Number.Flint
main = do
putStrLn "Output:\n"
-- Case 1
putStrLn "Positive integer: x = 127 mod 7^10"
forM_ [padic_terse, padic_series, padic_val_unit] $ \printMode -> do
withNewPadicCtx 7 8 12 printMode $ \ctx -> do
withNewPadic $ \x -> do
padic_init2 x 10
padic_set_ui x 127 ctx
putStr "print: "; padic_print x ctx; putStr "\n"
cstr <- padic_get_str nullPtr x ctx
str <- peekCString cstr
free cstr
putStrLn $ "getStr: " ++ str
-- Case 2
putStrLn "Positive integer larger than p^N: x = 1057 mod 2^10"
forM_ [padic_terse, padic_series, padic_val_unit] $ \printMode -> do
withNewPadicCtx 2 8 12 printMode $ \ctx -> do
withNewPadic $ \x -> do
padic_init2 x 10
padic_set_ui x 1057 ctx
putStr "print: "; padic_print x ctx; putStr "\n"
cstr <- padic_get_str nullPtr x ctx
str <- peekCString cstr
free cstr
putStrLn $ "getStr: " ++ str
-- Case 3
putStrLn "Negative integer: x = -127 mod 3^10"
forM_ [padic_terse, padic_val_unit] $ \printMode -> do
withNewPadicCtx 2 8 12 printMode $ \ctx -> do
withNewPadic $ \x -> do
padic_init2 x 10
padic_set_ui x (-127) ctx
putStr "print: "; padic_print x ctx; putStr "\n"
cstr <- padic_get_str nullPtr x ctx
str <- peekCString cstr
free cstr
putStrLn $ "getStr: " ++ str
-- Log
putStrLn "Log of 7380996 mod 5^20"
withNewPadicCtx 5 10 25 padic_series $ \ctx -> do
withNewPadic $ \x -> do
withNewPadic $ \y -> do
padic_set_ui x 7380996 ctx
padic_log y x ctx
putStr "x = "; padic_print x ctx; putStr "\n"
putStr "y = "; padic_print y ctx; putStr "\n"