我正在尝试将公式转换为该公式的有限域等效物。
公式如下:
现在我已经实现了它并且它工作正常,但是我在有限域中需要它,这意味着我引入了一个p,让我们说并采取,但是上面的公式究竟是如何变化的?我是否只是在正常计算完公式之后?p = 183269mod pmod p
例:
我有多项式:我生成了6个随机点:f(x) = 1234 + 631x + 442x^2(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)
慕妹3146593
www说
相关分类