Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menyalurkan Integer Besar dengan Cekap dalam C Menggunakan Aritmetik Integer?

Bagaimanakah Saya Boleh Menyalurkan Integer Besar dengan Cekap dalam C Menggunakan Aritmetik Integer?

Mary-Kate Olsen
Lepaskan: 2024-12-23 07:28:54
asal
690 orang telah melayarinya

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

Pengiraan kuasa dua besar bignum yang pantas

Masalah:

Bagaimana cara saya mengira y = x^ 2 secepat mungkin tanpa kehilangan ketepatan menggunakan C dan aritmetik integer (32bit dengan Bawa)?

Penyelesaian:

Masalah boleh diselesaikan menggunakan pendaraban Karatsuba, yang mempunyai kerumitan O(N^(log2(3))), di mana N ialah bilangan digit.

Pelaksanaan:

Di sini ialah pelaksanaan pendaraban Karatsuba dalam 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;
}
Salin selepas log masuk

Pelaksanaan ini mempunyai kerumitan O(N^(log2(3))), yang jauh lebih pantas daripada algoritma O(N^2) yang naif .

Kesimpulan:

Menggunakan pendaraban Karatsuba, adalah mungkin untuk mengira y = x^2 jauh lebih pantas daripada menggunakan algoritma O(N^2) yang naif.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyalurkan Integer Besar dengan Cekap dalam C Menggunakan Aritmetik Integer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan