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
}