Skip to content

[ring]: DivRoundByLastModulus modifies the left operand #531

@Pro7ech

Description

@Pro7ech

func (r Ring) DivRoundByLastModulus(p0, p1 Poly) {

This method should not write on p0.

func (r Ring) DivRoundByLastModulus(p0, p1 Poly) {

	level := r.level

	// Center by (p-1)/2
	pHalf := (r.SubRings[level].Modulus - 1) >> 1

	r.SubRings[level].AddScalar(p0.Coeffs[level], pHalf, p0.Coeffs[level])

	for i, s := range r.SubRings[:level] {
	        // p0 is modified
		s.AddScalarLazyThenNegTwoModulusLazy(p0.Coeffs[i], s.Modulus-BRedAdd(pHalf, s.Modulus, s.BRedConstant), p0.Coeffs[i])
		s.AddLazyThenMulScalarMontgomery(p0.Coeffs[level], p0.Coeffs[i], r.RescaleConstants[level-1][i], p1.Coeffs[i])
	}
}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions