您当前的位置: 首页 > 

mutourend

暂无认证

  • 1浏览

    0关注

    661博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

FFT friendly域内的lagrange polynomial计算

mutourend 发布时间:2021-01-27 14:40:13 ,浏览量:1

任意有限域 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

关注
打赏
1664532908
查看更多评论
立即登录/注册

微信扫码登录

0.0373s