Heim >Backend-Entwicklung >C++ >Wie kann ich meine zahlentheoretische Transformation (NTT) und meine modulare Arithmetik für schnellere Berechnungen optimieren, insbesondere bei sehr großen Zahlen (z. B. über 12000 Bit)?
Ich wollte NTT schnell nutzen Quadrieren (siehe Schnelle Bignum-Quadratberechnung), aber das Ergebnis ist selbst für wirklich große Zahlen langsam .. mehr als 12000 Bits.
Meine Frage lautet also:
< ;ol>
Dies ist mein (bereits optimierter) Quellcode in C für NTT (er ist vollständig und Funktioniert zu 100 % in C, ohne dass Bibliotheken von Drittanbietern erforderlich sind, und sollte auch threadsicher sein. Beachten Sie, dass das Quellarray nur temporär verwendet wird!!! Außerdem kann es das Array nicht in sich selbst umwandeln.
p>
Hier ist ein Beispiel einer optimierten NTT-Implementierung in C unter Verwendung vorberechneter Potenzen und bitweiser Operationen:
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 0) { // Reorder even, odd elements for (uint32_t i = 0, j = 0; i = 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; } };
Das obige ist der detaillierte Inhalt vonWie kann ich meine zahlentheoretische Transformation (NTT) und meine modulare Arithmetik für schnellere Berechnungen optimieren, insbesondere bei sehr großen Zahlen (z. B. über 12000 Bit)?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!