Skip to content

Instantly share code, notes, and snippets.

@axman6
Last active June 20, 2021 05:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save axman6/96475e7068f724f87db36a2a4e6c8758 to your computer and use it in GitHub Desktop.
Save axman6/96475e7068f724f87db36a2a4e6c8758 to your computer and use it in GitHub Desktop.
mport Group ( ElementModP, ElementMod(ElementMod), g, mult )
import Data.MemoTrie (memo)
data LogCache = LogCache
!ElementModP
!Int
LogCache
logCache :: LogCache
logCache = LogCache (ElementMod 1) 0 (go logCache) where
go (LogCache g0 n xs) = let n' = n+1 in LogCache (mult [g0,ElementMod g]) n' (go xs)
takeLog :: Int -> LogCache -> [(ElementModP,Int)]
takeLog = go where
go k (LogCache e n xs)
| k <= 0 = []
| otherwise = (e,n) : go (k-1) xs
dlogFind :: ElementModP -> Int
dlogFind e = find logCache where
find (LogCache e' n xs)
| e == e' = n
| otherwise = find xs
dlog :: ElementModP -> Int
dlog = memo dlogFind
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment