| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Crypto.Lol.Cyclotomic.Tensor
Description
Interface for cyclotomic tensors, and helper functions for tensor indexing.
- class (TElt t Double, TElt t (Complex Double)) => Tensor t where
- type TElt t r :: Constraint
- entailIndexT :: Tagged (t m r) (Fact m :- (Applicative (t m), Traversable (t m)))
- entailFullT :: Tagged (t m r) ((Fact m, TElt t r) :- (Eq (t m r), ZeroTestable (t m r), Ring (t m r), NFData (t m r), Random (t m r)))
- scalarPow :: (Fact m, TElt t r) => r -> t m r
- l, lInv :: (Fact m, TElt t r) => t m r -> t m r
- mulGPow, mulGDec :: (Fact m, TElt t r) => t m r -> t m r
- divGPow, divGDec :: (Fact m, TElt t r) => t m r -> Maybe (t m r)
- crtFuncs :: (Fact m, TElt t r, CRTrans r) => Maybe (r -> t m r, t m r -> t m r, t m r -> t m r, t m r -> t m r, t m r -> t m r)
- tGaussianDec :: (Fact m, OrdFloat q, Random q, TElt t q, ToRational v, MonadRandom rnd) => v -> rnd (t m q)
- twacePowDec :: (m `Divides` m', TElt t r) => t m' r -> t m r
- embedPow, embedDec :: (m `Divides` m', TElt t r) => t m r -> t m' r
- crtExtFuncs :: (m `Divides` m', TElt t r, CRTrans r) => Maybe (t m' r -> t m r, t m r -> t m' r)
- coeffs :: (m `Divides` m', TElt t r) => t m' r -> [t m r]
- powBasisPow :: (m `Divides` m', TElt t r) => Tagged m [t m' r]
- crtSetDec :: (m `Divides` m', PrimeField fp, Coprime (PToF (CharOf fp)) m', TElt t fp) => Tagged m [t m' fp]
- fmapT :: (Fact m, TElt t a, TElt t b) => (a -> b) -> t m a -> t m b
- fmapTM :: (Monad mon, Fact m, TElt t a, TElt t b) => (a -> mon b) -> t m a -> mon (t m b)
- hasCRTFuncs :: forall t m r. (Tensor t, Fact m, TElt t r, CRTrans r) => TaggedT (t m r) Maybe ()
- scalarCRT :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (r -> t m r)
- mulGCRT :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r)
- divGCRT :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r)
- crt :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r)
- crtInv :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r)
- twaceCRT :: forall t r m m'. (Tensor t, m `Divides` m', TElt t r, CRTrans r) => Maybe (t m' r -> t m r)
- embedCRT :: forall t r m m'. (Tensor t, m `Divides` m', TElt t r, CRTrans r) => Maybe (t m r -> t m' r)
- data Matrix r
- indexM :: Ring r => Matrix r -> Int -> Int -> r
- twCRTs :: (Fact m, CRTrans r) => TaggedT m Maybe (Matrix r)
- zmsToIndexFact :: Fact m => Tagged m (Int -> Int)
- indexInfo :: forall m m'. m `Divides` m' => Tagged `(m, m')` ([(Int, Int, Int)], Int, Int, [(Int, Int)])
- extIndicesPowDec :: m `Divides` m' => Tagged `(m, m')` (Vector Int)
- extIndicesCRT :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector Int)
- extIndicesCoeffs :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector (Vector Int))
- baseIndicesPow :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector (Int, Int))
- baseIndicesDec :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector (Maybe (Int, Bool)))
- baseIndicesCRT :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector Int)
- digitRev :: PP -> Int -> Int
Documentation
class (TElt t Double, TElt t (Complex Double)) => Tensor t where Source
Tensor is a container that supports all the core linear transformations needed for cyclotomic ring arithmetic.
The type t m r represents a cyclotomic coefficient tensor of
index m over base ring r. Many of the methods take and/or
produce coefficient tensors relative to particular bases, but the
tensor itself does not keep track of the corresponding basis.
CRT-related methods are wrapped in Maybe because they are
well-defined only when a CRT basis exists over the ring r for
index m.
The superclass constraint is for convenience, to ensure that we
can sample error tensors over Double.
Associated Types
type TElt t r :: Constraint Source
Methods
entailIndexT :: Tagged (t m r) (Fact m :- (Applicative (t m), Traversable (t m))) Source
Properties that hold for any index. Use with \\.
entailFullT :: Tagged (t m r) ((Fact m, TElt t r) :- (Eq (t m r), ZeroTestable (t m r), Ring (t m r), NFData (t m r), Random (t m r))) Source
Properties that hold for any (legal) fully-applied tensor. Use
with \\.
scalarPow :: (Fact m, TElt t r) => r -> t m r Source
Converts a scalar to a tensor in the powerful basis
l, lInv :: (Fact m, TElt t r) => t m r -> t m r Source
mulGPow, mulGDec :: (Fact m, TElt t r) => t m r -> t m r Source
Multiply by g in the powerful/decoding basis
divGPow, divGDec :: (Fact m, TElt t r) => t m r -> Maybe (t m r) Source
Divide by g in the powerful/decoding basis. The Maybe
output indicates that the operation may fail, which happens
exactly when the input is not divisible by g.
crtFuncs :: (Fact m, TElt t r, CRTrans r) => Maybe (r -> t m r, t m r -> t m r, t m r -> t m r, t m r -> t m r, t m r -> t m r) Source
A tuple of all the operations relating to the CRT basis, in a
single Maybe value for safety. Clients should typically not
use this method directly, but instead call the corresponding
top-level functions: the elements of the tuple correpond to the
functions mulGCRT, divGCRT, crt, crtInv.
tGaussianDec :: (Fact m, OrdFloat q, Random q, TElt t q, ToRational v, MonadRandom rnd) => v -> rnd (t m q) Source
Sample from the "skewed" Gaussian error distribution t*D
in the decoding basis, where D has scaled variance v.
twacePowDec :: (m `Divides` m', TElt t r) => t m' r -> t m r Source
The twace linear transformation, which is the same in both the
powerful and decoding bases.
embedPow, embedDec :: (m `Divides` m', TElt t r) => t m r -> t m' r Source
The embed linear transformations, for the powerful and
decoding bases.
crtExtFuncs :: (m `Divides` m', TElt t r, CRTrans r) => Maybe (t m' r -> t m r, t m r -> t m' r) Source
A tuple of all the extension-related operations involving the
CRT bases, for safety. Clients should typically not use this
method directly, but instead call the corresponding top-level
functions: the elements of the tuple correpond to the functions
twaceCRT, embedCRT.
coeffs :: (m `Divides` m', TElt t r) => t m' r -> [t m r] Source
Map a tensor in the powerfuldecodingCRT basis, representing
an O_m' element, to a vector of tensors representing O_m
elements in the same kind of basis.
powBasisPow :: (m `Divides` m', TElt t r) => Tagged m [t m' r] Source
The powerful extension basis w.r.t. the powerful basis.
crtSetDec :: (m `Divides` m', PrimeField fp, Coprime (PToF (CharOf fp)) m', TElt t fp) => Tagged m [t m' fp] Source
A list of tensors representing the mod-p CRT set of the
extension.
fmapT :: (Fact m, TElt t a, TElt t b) => (a -> b) -> t m a -> t m b Source
fmapTM :: (Monad mon, Fact m, TElt t a, TElt t b) => (a -> mon b) -> t m a -> mon (t m b) Source
Potentially optimized monadic fmap.
Top-level CRT functions
hasCRTFuncs :: forall t m r. (Tensor t, Fact m, TElt t r, CRTrans r) => TaggedT (t m r) Maybe () Source
Convenience value indicating whether crtFuncs exists.
scalarCRT :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (r -> t m r) Source
Yield a tensor for a scalar in the CRT basis. (This function is
simply an appropriate entry from crtFuncs.)
mulGCRT :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r) Source
Multiply by g in the CRT basis. (This function is simply an
appropriate entry from crtFuncs.)
divGCRT :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r) Source
Divide by g in the CRT basis. (This function is simply an
appropriate entry from crtFuncs.)
crt :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r) Source
The CRT transform. (This function is simply an appropriate entry
from crtFuncs.)
crtInv :: (Tensor t, Fact m, TElt t r, CRTrans r) => Maybe (t m r -> t m r) Source
The inverse CRT transform. (This function is simply an
appropriate entry from crtFuncs.)
twaceCRT :: forall t r m m'. (Tensor t, m `Divides` m', TElt t r, CRTrans r) => Maybe (t m' r -> t m r) Source
The "tweaked trace" function for tensors in the CRT basis:
For cyclotomic indices m | m',
Tw(x) = (mhat/m'hat) * Tr(g'/g * x).
(This function is simply an appropriate entry from crtExtFuncs.)
embedCRT :: forall t r m m'. (Tensor t, m `Divides` m', TElt t r, CRTrans r) => Maybe (t m r -> t m' r) Source
Embed a tensor with index m in the CRT basis to a tensor with
index m' in the CRT basis.
(This function is simply an appropriate entry from crtExtFuncs.)
Tensor indexing
twCRTs :: (Fact m, CRTrans r) => TaggedT m Maybe (Matrix r) Source
The "tweaked" CRT^* matrix: CRT^* . diag(sigma(g_m))
zmsToIndexFact :: Fact m => Tagged m (Int -> Int) Source
Convert a Z_m^* index to a linear tensor index in [m].
indexInfo :: forall m m'. m `Divides` m' => Tagged `(m, m')` ([(Int, Int, Int)], Int, Int, [(Int, Int)]) Source
A collection of information useful for working with tensor extensions,
tagged by m | m'.
The first component is a list of triples (p,e,e') where p^e | m and p^e' | m'.
The next two components are phi(m) and phi(m').
The final component is a pair for each triple in the first component (tot(p^e), tot(p^e')).
extIndicesPowDec :: m `Divides` m' => Tagged `(m, m')` (Vector Int) Source
The vector is made up of phi(m) blocks of phi(m')/phi(m)
consecutive entries. Each block constains all those indices into
the Pow (Dec) basis of O_m' that "lie above" the corresponding index into
the Pow (Dec) basis of O_m.
extIndicesCRT :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector Int) Source
The vector is made up of phi(m) blocks of phi(m')/phi(m)
consecutive entries. Each block constains all those indices into
the CRT basis of O_m' that "lie above" the corresponding index into
the CRT basis of O_m.
extIndicesCoeffs :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector (Vector Int)) Source
Used for extracting coefficients in a relative pow/dec/crt basis
Returns a vector of phi(m')/phi(m), each of dimension phi(m)
where the i^th vector contains the indices into the source vector
corresponding to the Z-coefficients of the i^th R-coefficient for
the relative basis.
See section "Two Index Transforms" and "Coefficients in Relative Bases"
from the corresponding paper.
baseIndicesPow :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector (Int, Int)) Source
A lookup table for toIndexPair applied to indices [phi(m')]
baseIndicesDec :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector (Maybe (Int, Bool))) Source
A lookup table for baseIndexDec applied to indices [phi(m')]
baseIndicesCRT :: forall m m'. m `Divides` m' => Tagged `(m, m')` (Vector Int) Source
Same as baseIndicesPow, but only includes the second component
of each pair.