Heim >Backend-Entwicklung >C++ >Wie kann ich große ganze Zahlen in C mithilfe der Ganzzahlarithmetik effizient quadrieren?
Schnelle Bignum-Quadrat-Berechnung
Problem:
Wie berechne ich y = x^ 2 so schnell wie möglich ohne Präzisionsverlust mit C und Ganzzahlarithmetik (32bit mit Carry)?
Lösung:
Das Problem kann mithilfe der Karatsuba-Multiplikation gelöst werden, die eine Komplexität von O(N^(log2(3))) hat, wobei N ist die Anzahl der Ziffern.
Implementierung:
Hier ist eine Implementierung von Karatsuba-Multiplikation in C:
void karatsuba(int *a, int *b, int n, int *c) { if (n <= 1) { c[0] = a[0] * b[0]; return; } int half = n / 2; int *a0 = new int[half]; int *a1 = new int[half]; int *b0 = new int[half]; int *b1 = new int[half]; for (int i = 0; i < half; i++) { a0[i] = a[i]; a1[i] = a[i + half]; b0[i] = b[i]; b1[i] = b[i + half]; } int *c0 = new int[half]; int *c1 = new int[half]; int *c2 = new int[n]; karatsuba(a0, b0, half, c0); karatsuba(a1, b1, half, c1); for (int i = 0; i < n; i++) c2[i] = 0; for (int i = 0; i < half; i++) for (int j = 0; j < half; j++) c2[i + j] += a0[i] * b1[j]; for (int i = 0; i < half; i++) for (int j = 0; j < half; j++) c2[i + j + half] += a1[i] * b0[j]; for (int i = 0; i < n; i++) c[i] = c0[i] + c1[i] + c2[i]; delete[] a0; delete[] a1; delete[] b0; delete[] b1; delete[] c0; delete[] c1; delete[] c2; }
Diese Implementierung hat eine Komplexität von O(N^(log2(3))), was deutlich schneller ist als der naive O(N^2)-Algorithmus.
Schlussfolgerung:
Mit der Karatsuba-Multiplikation ist es möglich, y = x^2 viel schneller zu berechnen als mit der naive O(N^2)-Algorithmus.
Das obige ist der detaillierte Inhalt vonWie kann ich große ganze Zahlen in C mithilfe der Ganzzahlarithmetik effizient quadrieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!