빠른 대수 제곱 계산
문제:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!