【发布时间】:2021-06-17 17:54:48
【问题描述】:
我正在尝试将一个公式转换为该公式的有限域等效项。
现在我已经实现了它并且它可以正常工作,但是我需要在有限域中使用它,这意味着我引入了一个 p,比如说p = 183269 和mod p,但是如何上面的公式到底有没有变化?在我正常计算完公式后,我是否只需mod p?
例子:
我有多项式:f(x) = 1234 + 631x + 442x^2
我生成了 6 个随机点:(x, f(x) mod p)
1. (108, 93338)
2. (413, 146507)
3. (260, 171647)
4. (819, 98605)
5. (359, 13237)
6. (894, 118490)
现在,我想要的是使用上述公式在给定任意 3 个点的情况下重建 1234,但它给出的值不正确。
这是我的代码:
// x_input = [108, 413, 260]
var reconstructed float64 = 0.0
for _, k := range x_input {
var y float64 = float64(points[k])
var pr_x float64 = 1.0
for _, l := range x_input {
if l != k {
var aux_k float64 = float64(k)
var aux_l float64 = float64(l)
pr_x *= (aux_l / (aux_l - aux_k))
}
}
y *= pr_x
reconstructed += y
}
我正在尝试实现SSSS
编辑
正如@user58697 指出的那样,我的代码和对有限域的理解存在一些错误。我设法重写了我的公式,它看起来像这样:
reconstructed := 0
for _, k := range x_input {
y := points[k]
pr_x := 1
for _, l := range x_input {
if l != k {
inv := mod_inverse(l - k, p)
pr_x *= inv
}
}
y *= pr_x
reconstructed += y
}
return reconstructed % p
func mod_inverse(a, p int) int {
if a < 0 { // negative numbers are not allowed
a = a * -1
}
for i := 1; i < p; i++ {
if ((a % p) * (i % p)) % p == 1 {
return i
}
}
return p
}
不幸的是,它仍然存在一个或多个错误,因为它不会产生f(0)
【问题讨论】:
标签: algorithm go secret-key modular-arithmetic