Safe Haskell | None |
---|---|
Language | Haskell2010 |
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
.
type TElt t r :: Constraint Source
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.