Maison >développement back-end >C++ >Comment puis-je mettre efficacement au carré de grands entiers en C à l'aide de l'arithmétique des nombres entiers ?

Comment puis-je mettre efficacement au carré de grands entiers en C à l'aide de l'arithmétique des nombres entiers ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 07:28:54694parcourir

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

Calcul rapide du carré de Bignum

Problème :

Comment calculer y = x^ 2 aussi vite que possible sans perte de précision en utilisant l'arithmétique C et entière (32 bits avec Carry)?

Solution :

Le problème peut être résolu en utilisant la multiplication de Karatsuba, qui a une complexité de O(N^(log2(3))), où N est le nombre de chiffres.

Implémentation :

Voici une implémentation de Multiplication de Karatsuba en 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;
}

Cette implémentation a une complexité de O(N^(log2(3))), qui est nettement plus rapide que l'algorithme naïf O(N^2).

Conclusion :

En utilisant la multiplication Karatsuba, il est possible de calculer y = x^2 beaucoup plus rapidement qu'en utilisant le naïf Algorithme O(N^2).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn