任意有限域 Z p \mathbb{Z}_p Zp,generator为 ( p − 1 ) (p-1) (p−1)-th root of unity,对应的sagemath 脚本为:【有限域内任意 x x x,其 x p − 1 ≡ 1 m o d p x^{p-1}\equiv 1\mod p xp−1≡1modp 恒成立。】
generator = primitive_root(p)
当将有限域 Z p \mathbb{Z}_p Zp用于polynomial计算时,若有限域 Z p \mathbb{Z}_p Zp为FFT friendly的,则可借助(I)FFT来加速多项式运算,即要求 p p p 满足:
factor(p-1) = 2^s * t
其中 2 s 2^s 2s 值代表允许的多项式的最高阶数。 相应的 2 s 2^s 2s-th root of unity 的计算方式为:
power_mod(generator, t, p)
而对于curve25519来说,其Fr域的s值仅为2且generator无返回(无论是基于magma还是sagemath),所以,并不是FFT friendly 域,若想将其用于多项式运算,无法借助FFT进行加速。因此,实际选型时,一般不选择curve25519用于表示polynomial commitment等等。
在 Lagrange polynomial sage及rust代码实现 中,有:
/*
Lagrange interpolation polynomials in our evaluation domain:
,-------------------------------. ,-------------------------------. ,-------------------------------.
| A TERM | | B TERM | | C TERM |
`-------------------------------. `-------------------------------' `-------------------------------'
| a_0 | a_1 | a_2 | a_3 | | a_0 | a_1 | a_2 | a_3 | | a_0 | a_1 | a_2 | a_3 |
| 1 | 0 | 64512 | 0 | | 0 | 0 | 1 | 0 | | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 64512 | | 0 | 0 | 0 | 1 | | 0 | 0 | 0 | 0 |
| 0 | 0 | 2 | 0 | | 0 | 0 | 0 | 1 | | 0 | 64512 | 1 | 1 |
| 1 | 0 | 0 | 0 | | 0 | 0 | 0 | 0 | | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | | 0 | 0 | 0 | 0 | | 0 | 0 | 0 | 0 |
`-------'-------'-------'-------' `-------'-------'-------'-------' `-------'-------'-------'-------'
Example for u_0:
sage: r = 64513
sage: Fr = GF(r)
sage: omega = (Fr(5)^63)^(2^7)
sage: tau = Fr(3673)
sage: R. = PolynomialRing(Fr, 'x')
sage: def eval(tau, c0, c1, c2, c3, c4):
....: p = R.lagrange_polynomial([(omega^0, c0), (omega^1, c1), (omega^2, c2), (omega^3, c3), (omega^4, c4), (omega^5, 0), (omega^6, 0), (omega^7, 0)])
....: return p.substitute(tau)
sage: eval(tau, 1, 1, 0, 1, 0)
59158
sage: eval(tau, 0,0,0,0,1)
48317
sage: omega^8 //n=2^3=8,插值点为:w_{n}^{0},\cdots, w_{n}^{n-1}
1
*/
参考资料:
[1] Halo中的快速傅里叶(逆)变换算法(I)FFT [2] FFT rust代码实现 [3] Lagrange polynomial sage及rust代码实现 [4] curve25519之torsion points