Heim > Backend-Entwicklung > C++ > Wie kann ich große ganze Zahlen in C mithilfe der Ganzzahlarithmetik effizient quadrieren?

Wie kann ich große ganze Zahlen in C mithilfe der Ganzzahlarithmetik effizient quadrieren?

Mary-Kate Olsen
Freigeben: 2024-12-23 07:28:54
Original
689 Leute haben es durchsucht

How Can I Efficiently Square Large Integers in C   Using Integer Arithmetic?

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage