ringqp

package
v5.0.0-...-7726d69 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 28, 2023 License: Apache-2.0 Imports: 2 Imported by: 0

Documentation

Overview

Package ringqp is implements a wrapper for both the ringQ and ringP.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CopyLvl

func CopyLvl(levelQ, levelP int, p1, p2 Poly)

CopyLvl copies the values of p1 on p2. The operation is performed at levelQ for the ringQ and levelP for the ringP.

Types

type Poly

type Poly struct {
	Q, P *ring.Poly
}

Poly represents a polynomial in the ring of polynomial modulo Q*P. This type is simply the union type between two ring.Poly, each one containing the modulus Q and P coefficients of that polynomial. The modulus Q represent the ciphertext modulus and the modulus P the special primes for the RNS decomposition during homomorphic operations involving keys.

func (*Poly) Copy

func (p *Poly) Copy(other Poly)

Copy copies the coefficients of other on the target polynomial. This method simply calls the Copy method for each of its sub-polynomials.

func (*Poly) CopyNew

func (p *Poly) CopyNew() Poly

CopyNew creates an exact copy of the target polynomial.

func (*Poly) Decode64

func (p *Poly) Decode64(data []byte) (pt int, err error)

Decode64 decodes the input bytes on the target Poly. Writes on pre-allocated coefficients. Assumes that each coefficient is encoded on 8 bytes.

func (*Poly) Encode64

func (p *Poly) Encode64(data []byte) (pt int, err error)

Encode64 writes a Poly on the input data. Encodes each coefficient on 8 bytes.

func (*Poly) Equals

func (p *Poly) Equals(other Poly) (v bool)

Equals returns true if the receiver Poly is equal to the provided other Poly. This method checks for equality of its two sub-polynomials.

func (*Poly) LevelP

func (p *Poly) LevelP() int

LevelP returns the level of the polynomial modulo P. Returns -1 if the modulus P is absent.

func (*Poly) LevelQ

func (p *Poly) LevelQ() int

LevelQ returns the level of the polynomial modulo Q. Returns -1 if the modulus Q is absent.

func (*Poly) MarshalBinary

func (p *Poly) MarshalBinary() ([]byte, error)

func (*Poly) MarshalBinarySize64

func (p *Poly) MarshalBinarySize64() (dataLen int)

MarshalBinarySize64 returns the length in byte of the target Poly. Assumes that each coefficient uses 8 bytes.

func (*Poly) UnmarshalBinary

func (p *Poly) UnmarshalBinary(b []byte) error

type Ring

type Ring struct {
	RingQ, RingP *ring.Ring
}

Ring is a structure that implements the operation in the ring R_QP. This type is simply a union type between the two Ring types representing R_Q and R_P.

func (*Ring) Add

func (r *Ring) Add(p1, p2, p3 Poly)

Add adds p1 to p2 coefficient-wise and writes the result on p3.

func (*Ring) AddLazy

func (r *Ring) AddLazy(p1, p2, p3 Poly)

AddLazy adds p1 to p2 coefficient-wise and writes the result on p3 without modular reduction.

func (*Ring) AtLevel

func (r *Ring) AtLevel(levelQ, levelP int) *Ring

AtLevel returns a shallow copy of the target ring configured to carry on operations at the specified levels.

func (*Ring) EvalPolyScalar

func (r *Ring) EvalPolyScalar(pol []Poly, pt uint64, p3 Poly)

EvalPolyScalar evaluate the polynomial pol at pt and writes the result in p3

func (*Ring) ExtendBasisSmallNormAndCenter

func (r *Ring) ExtendBasisSmallNormAndCenter(polyInQ *ring.Poly, levelP int, polyOutQ, polyOutP *ring.Poly)

ExtendBasisSmallNormAndCenter extends a small-norm polynomial polQ in R_Q to a polynomial polQP in R_QP.

func (*Ring) IMForm

func (r *Ring) IMForm(p1, p2 Poly)

IMForm switches back p1 from the Montgomery domain to the conventional domain and writes the result on p2.

func (*Ring) INTT

func (r *Ring) INTT(p1, p2 Poly)

INTT computes the inverse-NTT of p1 and returns the result on p2.

func (*Ring) Inverse

func (r *Ring) Inverse(scalar ring.RNSScalar)

Inverse computes the modular inverse of a scalar a expressed in a CRT decomposition. The inversion is done in-place and assumes that a is in Montgomery form.

func (*Ring) LevelP

func (r *Ring) LevelP() int

LevelP returns the level at which the target ring operates for the modulus P.

func (*Ring) LevelQ

func (r *Ring) LevelQ() int

LevelQ returns the level at which the target ring operates for the modulus Q.

func (*Ring) MForm

func (r *Ring) MForm(p1, p2 Poly)

MForm switches p1 to the Montgomery domain and writes the result on p2.

func (*Ring) MulCoeffsMontgomery

func (r *Ring) MulCoeffsMontgomery(p1, p2, p3 Poly)

MulCoeffsMontgomery multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction.

func (*Ring) MulCoeffsMontgomeryLazy

func (r *Ring) MulCoeffsMontgomeryLazy(p1, p2, p3 Poly)

MulCoeffsMontgomeryLazy multiplies p1 by p2 coefficient-wise with a constant-time Montgomery modular reduction. Result is within [0, 2q-1].

func (*Ring) MulCoeffsMontgomeryLazyThenAddLazy

func (r *Ring) MulCoeffsMontgomeryLazyThenAddLazy(p1, p2, p3 Poly)

MulCoeffsMontgomeryLazyThenAddLazy multiplies p1 by p2 coefficient-wise with a constant-time Montgomery modular reduction and adds the result on p3. Result is within [0, 2q-1]

func (*Ring) MulCoeffsMontgomeryLazyThenSubLazy

func (r *Ring) MulCoeffsMontgomeryLazyThenSubLazy(p1, p2, p3 Poly)

MulCoeffsMontgomeryLazyThenSubLazy multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction and subtracts the result from p3.

func (*Ring) MulCoeffsMontgomeryThenAdd

func (r *Ring) MulCoeffsMontgomeryThenAdd(p1, p2, p3 Poly)

MulCoeffsMontgomeryThenAdd multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction and adds the result to p3.

func (*Ring) MulCoeffsMontgomeryThenSub

func (r *Ring) MulCoeffsMontgomeryThenSub(p1, p2, p3 Poly)

MulCoeffsMontgomeryThenSub multiplies p1 by p2 coefficient-wise with a Montgomery modular reduction and subtracts the result from p3.

func (*Ring) MulRNSScalar

func (r *Ring) MulRNSScalar(s1, s2, sout ring.RNSScalar)

MulRNSScalar multiplies s1 and s2 and stores the result in sout.

func (*Ring) MulRNSScalarMontgomery

func (r *Ring) MulRNSScalarMontgomery(p Poly, scalar []uint64, pOut Poly)

MulRNSScalarMontgomery multiplies p with a scalar value expressed in the CRT decomposition. It assumes the scalar decomposition to be in Montgomery form.

func (*Ring) MulScalar

func (r *Ring) MulScalar(p1 Poly, scalar uint64, p2 Poly)

MulScalar multiplies p1 by scalar and returns the result in p2.

func (*Ring) NTT

func (r *Ring) NTT(p1, p2 Poly)

NTT computes the NTT of p1 and returns the result on p2.

func (*Ring) NTTLazy

func (r *Ring) NTTLazy(p1, p2 Poly)

NTTLazy computes the NTT of p1 and returns the result on p2. Output values are in the range [0, 2q-1].

func (*Ring) Neg

func (r *Ring) Neg(p1, p2 Poly)

Neg negates p1 coefficient-wise and writes the result on p2.

func (*Ring) NewPoly

func (r *Ring) NewPoly() Poly

NewPoly creates a new polynomial with all coefficients set to 0.

func (*Ring) NewRNSScalar

func (r *Ring) NewRNSScalar() ring.RNSScalar

NewRNSScalar creates a new Scalar value (i.e., a degree-0 polynomial) in the RingQP.

func (*Ring) NewRNSScalarFromUInt64

func (r *Ring) NewRNSScalarFromUInt64(v uint64) ring.RNSScalar

NewRNSScalarFromUInt64 creates a new Scalar in the RingQP initialized with value v.

func (*Ring) PermuteNTTWithIndex

func (r *Ring) PermuteNTTWithIndex(p1 Poly, index []uint64, p2 Poly)

PermuteNTTWithIndex applies the automorphism X^{5^j} on p1 and writes the result on p2. Index of automorphism must be provided. Method is not in place.

func (*Ring) PermuteNTTWithIndexThenAddLazy

func (r *Ring) PermuteNTTWithIndexThenAddLazy(p1 Poly, index []uint64, p2 Poly)

PermuteNTTWithIndexThenAddLazy applies the automorphism X^{5^j} on p1 and adds the result on p2. Index of automorphism must be provided. Method is not in place.

func (*Ring) Reduce

func (r *Ring) Reduce(p1, p2 Poly)

Reduce applies the modular reduction on the coefficients of p1 and returns the result on p2.

func (*Ring) Sub

func (r *Ring) Sub(p1, p2, p3 Poly)

Sub subtracts p2 to p1 coefficient-wise and writes the result on p3.

func (*Ring) SubRNSScalar

func (r *Ring) SubRNSScalar(s1, s2, sout ring.RNSScalar)

SubRNSScalar subtracts s2 to s1 and stores the result in sout.

type UniformSampler

type UniformSampler struct {
	// contains filtered or unexported fields
}

UniformSampler is a type for sampling polynomials in Ring.

func NewUniformSampler

func NewUniformSampler(prng utils.PRNG, r Ring) (s UniformSampler)

NewUniformSampler instantiates a new UniformSampler from a given PRNG.

func (UniformSampler) AtLevel

func (s UniformSampler) AtLevel(levelQ, levelP int) UniformSampler

AtLevel returns a shallow copy of the target sampler that operates at the specified levels.

func (UniformSampler) Read

func (s UniformSampler) Read(p Poly)

Read samples a new polynomial in Ring and stores it into p.

func (UniformSampler) WithPRNG

func (s UniformSampler) WithPRNG(prng utils.PRNG) UniformSampler

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL