module Crypto.Lol.RLWE.RLWR where
import Crypto.Lol
import Control.Monad.Random
type Sample t m zq zp = (Cyc t m zq, Cyc t m zp)
type RLWRCtx t m zq zp =
(Fact m, Ring zq, RescaleCyc (Cyc t) zq zp, CElt t zq, CElt t zp)
sample :: (RLWRCtx t m zq zp, Random zq, MonadRandom rnd)
=> Cyc t m zq -> rnd (Sample t m zq zp)
sample s = let s' = adviseCRT s in do
a <- getRandom
return (a, roundedProd s' a)
roundedProd :: (RLWRCtx t m zq zp) => Cyc t m zq -> Cyc t m zq -> Cyc t m zp
roundedProd s = let s' = adviseCRT s in \a -> rescaleCyc Dec $ a * s'