func lagrangeCoefficients()

in client/internal/secret_sharing/internal/shamirgeneric/shamir_generic.go [160:195]


func lagrangeCoefficients(x []field.Element, gf field.GaloisField) ([]field.Element, error) {
	if len(x) < 2 {
		return nil, fmt.Errorf("must have at least 2 values")
	}
	out := []field.Element{}
	for i := 0; i < len(x); i++ {
		one, err := gf.CreateElement(1)
		if err != nil {
			return nil, err
		}
		out = append(out, one)
		for j := 0; j < len(x); j++ {
			if i == j {
				continue
			}
			if x[i] == x[j] {
				return nil, fmt.Errorf("all shares should be unique point")
			}
			out[i] = out[i].Multiply(x[j])
			// Perform ( x[j] * ( x[j] - x[i] )^-1 )
			// if x[j] > x[i]: (x[j] - x[i])^-1 * out[i]
			// if x[j] < x[i]  ((x[i] - x[j])^-1 * out[i]) - 1 mod FieldOrder
			x1, x2 := x[j], x[i]
			if !x[j].GT(x[i]) {
				x1, x2 = x[i], x[j]
				out[i] = out[i].Flip()
			}
			diff, err := x1.Subtract(x2).Inverse()
			if err != nil {
				return nil, err
			}
			out[i] = out[i].Multiply(diff)
		}
	}
	return out, nil
}