我想使用NTT来快速平方(请参阅快速 bignum 平方计算),但即使对于非常大的数字,结果也很慢......超过12000 位。
所以我的问题是:
< ;ol>
这是我的(已经优化的)NTT C 源代码(它是完整的并且 100% 可以在C 不需要任何第三方库,并且也应该是线程安全的,请注意源数组被用作临时数组!!!,而且它不能将数组转换为自身)。
以下是使用预计算幂和按位运算的 C 语言优化 NTT 实现的示例:
class NTT { public: NTT() { // Initialize constants p = 0xc0000001; W = modpow(2, 0x30000000 / n); iW = modpow(2, p - 1 - 0x30000000 / n); rN = modpow(n, p - 2); NN = n >> 1; // Precompute W and iW powers WW = new uint32_t[n]; iWW = new uint32_t[n]; WW[0] = 1; iWW[0] = 1; for (uint32_t i = 1; i < n; i++) { WW[i] = modmul(WW[i - 1], W); iWW[i] = modmul(iWW[i - 1], iW); } } void NTT(uint32_t *dst, uint32_t *src, uint32_t n) { if (n > 0) { // Reorder even, odd elements for (uint32_t i = 0, j = 0; i < NN; i++, j += 2) { dst[i] = src[j]; } for (j = 1; i < n; i++, j += 2) { dst[i] = src[j]; } // Recursive NTT NTT(src, dst, NN); // Even NTT(src + NN, dst + NN, NN); // Odd // Restore results for (uint32_t i = 0, j = NN; i < NN; i++, j++) { uint32_t a0 = src[i]; uint32_t a1 = modmul(src[j], WW[i]); dst[i] = modadd(a0, a1); dst[j] = modsub(a0, a1); } } } private: uint32_t p, n, NN, W, iW, rN; uint32_t *WW, *iWW; // Modular arithmetic operations inline uint32_t modadd(uint32_t a, uint32_t b) { uint32_t d = a + b; if (d >= p) d -= p; return d; } inline uint32_t modsub(uint32_t a, uint32_t b) { uint32_t d = a - b; if (d > a) d += p; return d; } inline uint32_t modmul(uint32_t a, uint32_t b) { uint32_t m = (uint64_t)a * b; return m - (p * (m / p)); } inline uint32_t modpow(uint32_t a, uint32_t b) { if (b == 0) return 1; uint32_t t = modpow(a, b / 2); t = modmul(t, t); if (b & 1) t = modmul(t, a); return t; } };
以上是如何优化数论变换 (NTT) 和模运算以加快计算速度,尤其是对于非常大的数字(例如超过 12000 位)?的详细内容。更多信息请关注PHP中文网其他相关文章!