> 백엔드 개발 > C++ > 정수 연산을 사용하여 C에서 큰 정수를 효율적으로 제곱하려면 어떻게 해야 합니까?

정수 연산을 사용하여 C에서 큰 정수를 효율적으로 제곱하려면 어떻게 해야 합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-23 07:28:54
원래의
693명이 탐색했습니다.

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

빠른 대수 제곱 계산

문제:

y = x^를 어떻게 계산하나요? 2 C 및 정수 연산을 사용하여 정밀도 손실 없이 최대한 빠르게(32비트 Carry)?

해결책:

이 문제는 O(N^(log2(3)))의 복잡도를 갖는 Karatsuba 곱셈을 사용하여 해결될 수 있습니다. N은

구현:

다음은 C에서 Karatsuba 곱셈을 구현한 것입니다.

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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿