首頁 > 後端開發 > C++ > 如何在 C 中使用整數算術有效地對大整數求平方?

如何在 C 中使用整數算術有效地對大整數求平方?

Mary-Kate Olsen
發布: 2024-12-23 07:28:54
原創
690 人瀏覽過

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

快速bignum平方計算

問題:

如何計算y = x^ 2 使用C 和整數算術盡可能快且不損失精度(32位進位)?

解法:

此問題可以使用Karatsuba乘法來解決,其複雜度為O(N^(log2(3))),其中N 是數量

實現:

這裡是Karatsuba 乘法的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;
}
登入後複製

這個實現的複雜度為O(N ^(log2(3))),這比樸素的O(N^2) 快得多

結論:

使用Karatsuba 乘法,可以比使用樸素O(N^2)演算法更快計算 y = x^2。

以上是如何在 C 中使用整數算術有效地對大整數求平方?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板