NTT计算实例by ChatGPT

假设我们要计算多项式 f(x) = x^3 + 2x^2 + x + 3 在模数为 5 的情况下的NTT,模数为 p = 5。首先,我们需要将多项式系数表示为模 p 的剩余系。

f(x) = x^3 + 2x^2 + x + 3 ≡ x^3 + 2x^2 + x - 2 (mod 5)

接下来,我们需要选择 NTT 中使用的根。对于模数 p = 5,有两个原根,分别是 2 和 3。我们选择 3 作为根。

第一步是将多项式补零扩展到长度为 4。我们的多项式已经是 4 次的,因此我们不需要做任何事情。

f(x) = x^3 + 2x^2 + x - 2

第二步是计算 W_4^1, W_4^2, W_4^3,其中 W_4^k = 3^k mod 5。

W_4^1 = 3^1 mod 5 = 3
W_4^2 = 3^2 mod 5 = 4
W_4^3 = 3^3 mod 5 = 2

第三步是计算多项式在 W_4^1, W_4^2, W_4^3 处的取值。我们首先计算多项式在 W_4^1 处的取值:

f(W_4^1) = (33)1 + 2(32)1 + 3^1 - 2 = 3 + 2(4) + 3 - 2 = 10 ≡ 0 (mod 5)

然后我们计算多项式在 W_4^2 处的取值:

f(W_4^2) = (33)2 + 2(32)2 + 3^2 - 2 = 27 + 2(16) + 9 - 2 = 66 ≡ 1 (mod 5)

最后,我们计算多项式在 W_4^3 处的取值:

f(W_4^3) = (33)3 + 2(32)3 + 3^3 - 2 = 81 + 2(64) + 27 - 2 = 234 ≡ 4 (mod 5)

因此,多项式 f(x) 在模数为 5 的情况下的NTT是:

NTT(f(x)) = (0, 1, 4, 2)

这里的 NTT(f(x)) 表示多项式 f(x) 的 NTT 结果,其中每个元素对应于 f(x) 在 W_4^0, W_4^1, W_4^2, W_4^3 处的取值。
第四步是进行蝴蝶操作。对于 NTT 中的蝴蝶操作,我们需要选择一个旋转因子,这个旋转因子是根的幂次。对于长度为 4 的多项式,我们需要进行两次蝴蝶操作,因此选择旋转因子为根的平方,即 W_4^2 = 4。

我们使用以下公式进行蝴蝶操作:

A_k = a_k + W_n^k * a_{k + n/2}
B_k = a_k - W_n^k * a_{k + n/2}

其中,a_k 和 a_{k + n/2} 是多项式在 k 和 k + n/2 处的取值,A_k 和 B_k 是计算出来的新值。

我们首先对 k = 0 和 n/2 = 2 进行蝴蝶操作:

A_0 = a_0 + W_4^0 * a_2 = 0 + 1 * 4 = 4
B_0 = a_0 - W_4^0 * a_2 = 0 - 1 * 4 = -4 ≡ 1 (mod 5)

然后对 k = 1 和 n/2 = 2 进行蝴蝶操作:

A_1 = a_1 + W_4^1 * a_3 = 1 + 3 * 2 = 7 ≡ 2 (mod 5)
B_1 = a_1 - W_4^1 * a_3 = 1 - 3 * 2 = -5 ≡ 0 (mod 5)

因此,经过两次蝴蝶操作后,多项式 f(x) 在模数为 5 的情况下的NTT结果是:

NTT(f(x)) = (4, 1, 2, 0)

这里的 NTT(f(x)) 表示多项式 f(x) 的 NTT 结果,其中每个元素对应于 f(x) 在 W_4^0, W_4^1, W_4^2, W_4^3 处的取值。

最后,我们可以通过对NTT结果进行逆变换来计算原多项式 f(x)。由于我们在进行NTT时选择的是根 3,因此在进行逆变换时,我们需要选择的根是 3 的逆元,即 2。我们可以使用以下公式进行逆变换:

a_k = (1/n) * Σ_{j=0}^{n-1} W_n^(kj) * A_j

其中,n 是多项式的长度,A_j 是 NTT 结果中在 j 处的取值。

我们将 NTT(f(x)) = (4, 1, 2, 0) 代入上面的公式,得到:

a_0 = (1/4) * [4 + 1 + 2 + 0] = 7/4 ≡ 2 (mod 5)
a_1 = (1/4) * [4 + 2 * 1 + 0] = 3/2 ≡ 3 (mod 5)
a_2 = (1/4) * [42 * 1 + 0] = -1/2 ≡ 4 (mod 5)
a_3 = (1/4) * [4 - 2 * 1 + 0] = 1/2 ≡ 1 (mod 5)
因此,我们得到了原多项式 f(x) = 2 + 3x + 4x^2 + x^3。

总结一下,NTT 的步骤包括:选择根、求解旋转因子、进行位逆序置换、进行蝴蝶操作、逆变换。每一步都需要仔细计算,注意各个数值的变化和取模运算。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值