Last active
June 20, 2021 05:29
-
-
Save axman6/96475e7068f724f87db36a2a4e6c8758 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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