알고리즘을 분석하는 동안 우리는 일반적으로 단일 컴퓨터 명령을 취하기 위해 곱셈을 가정한다고 봅니다. 그러나이 가정은 숫자의 크기 (비트 수와 관련하여)가 적절하지 않을 때 발생합니다. 가장 기본적인 형태의 곱셈에서 두 개의 n 비트 숫자를 곱하는 것은 일반적으로 O (n^2)입니다. 이 맥락에서, x^n (x의 n 승) 계산에 대한 복잡성 (비트 연산 관점에서)은 무엇일까요? Explain 된 방식으로 큰 숫자의 곱
는 나에게 복잡성은큰 숫자의 곱
답변
x^n
을 계산하는 복잡도는 물론 전력 계산에 사용되는 알고리즘과 곱셈에 달려 있습니다. 지수에 의한 제곱 당 힘을 계산하면 O (log n) 곱셈이 필요합니다. 각 단계에서 하나의 숫자를 정사각형으로 표시하거나 두 개의 숫자를 곱해서 두 개의 숫자 중 하나를 정사각형으로 표시합니다. x
가 d(x)
숫자를 가지고
경우 x^n
는 Θ가 (n 개 * (D)가 (X)) 자리 마지막 단계에서는 약 n/2*d(x)
자릿수를 정사각형 (및 가능한 한 작게하여 그 수를 곱) 및 보유 알고리즘은 누적 기와 함께 반복 된 사분면 x^(2^k)
을 2^k <= n < 2^(k+1)
으로 곱함으로써 완성됩니다.
하자가 m
-digit 번호 제곱의 선정 될 S(m)
(또는 선정 된 임의의 두 m
-digit 숫자를 곱한 M(m)
동일하지 않을 수 있음). 그 다음 squarings은 대략
S(2^(k-1)*d(x)) + S(2^(k-2)*d(x)) + S(2^(k-3)*d(x)) + ...
work가 필요합니다. S(m) >= m
부터 S(2^(k-1)*d(x))
과 2*S(2^(k-1)*d(x))
사이입니다. 그래서 squarings에 대한 작업은 마지막 단계에 의해 지배됩니다. 누적 기와 함께 x^(2^s)
을 곱하면, 같은 결과가 얻어지며 최종 곱셈이 작업을 지배합니다. 최종 누산기 반복 제곱만큼 클 수 있으므로 반복 제곱하여 n
번째 전력 x
상승의 총 비용은 Θ(M(n*d(x)))
이다
Θ(M(2^k*d(x)),
이다. 순수한 곱셈 (M(m) = O(m^2)
)을 사용하면 총 비용은 O(n^2*d(x)^2)
이됩니다. 더 진보 된 곱셈 알고리즘 (Karatsuba, Toom-Cook, Schönhage-Strassen, ...)을 사용하면 훨씬 낮은 복잡성을 갖게되고, O(n*d(x)*log (n*d(x)) * log log (n*d(x)))
조금 약간 아래로 내려갑니다.
n
단계, x
곱하여 반복적 컴퓨팅 파워
M(m,k)
가
k
-digit 번호가 포함
m
-digit 수를 곱한 비용을 표시하자. 하나의 요인은 항상
x
때문에, 총 비용은 비용
M(m,k) = m*k
와 교과서 알고리즘으로
M(d(x),d(x)) + M(d(x),2*d(x)) + M(d(x),3*d(x)) + ... + M(d(x),(n-1)*d(x))
입니다,이 n*(n-1)/2*d(x)^2
에 요약, 그래서 총 비용은 다시 Θ(n^2*d(x)^2)
입니다. 그러나 상수 계수는 반복 된 제곱에 의한 지수화보다 큽니다. , m < k
경우 1 자리로 숫자를 볼 - 많은 Θ(m*k)
아래의 비용 M(m,k)
을 줄일 - 내가 아는까지로 -, 당신이 할 수없는 몇 번 반복 한 후 여기에 어떻게 당신이 크게 다른 길이의 숫자를 곱 있습니다
숫자와 r
- 자리 숫자 (r*m <= k < (r+1)*m
)를 b^m
으로 설정하면 m
이 충분히 큰 경우 더 나은 알고리즘을 사용하여 "숫자"를 곱하는 비용을 줄일 수 있지만 r
요소는 줄일 수 없습니다. 따라서이 알고리즘은 O(n^2*M(d(x)))
의 복잡도를 가지므로 n^2
인수는 제거 할 수 없습니다.
Wikipedia 다양한 곱셈 알고리즘의 복잡성 시간의 좋은 개요를 n 개의 기하 급수적으로 (그러나 정확한 그림의 확실하지 않은) 것 같다.
2 개의 m 자리 숫자 (O (m^2)의 복잡성을 가짐)와 그 자체로 숫자를 곱하여 힘을 모으는 순진한 방법을 곱하는 단순한 교과서 방법을 가정 해 보겠습니다. 시간은, 단순히 N 승산, O (n 개 *의 m^2)의 때문에 복잡성 또는 O (㎚^2)
N^K 비용이 (N)
O((log(n))^k)
로그 - 비트 - n의 표현 n
^k - 두 개의 n 자릿수 O 비용 (n^2)
- 1. 큰 정수의 병렬 곱
- 2. 큰 숫자의 부분
- 3. 매우 큰 숫자의 vb.net
- 4. ArrayIndexOutOfBoundsException 큰 숫자의 프로그램 추가
- 5. C에서 큰 숫자의 모든 요소/C++
- 6. 큰 숫자의 숫자 분리 (iOS-Xcode)
- 7. 큰 숫자의 마지막 13 자리 가져 오기
- 8. CUDA로 숫자의 큰 배열을 정렬해야하므로 추력
- 9. X보다 큰 숫자의 PDF를 검색하는 방법
- 10. 큰 숫자의 경우 Python에서 10 진수로
- 11. 매트릭스에서 인접한 숫자의 가장 큰 영역 찾기
- 12. (a/b) 큰 숫자의 경우 mod n입니까?
- 13. 큰 숫자의 JSON.Stringify()가 숫자 값을 변경합니까?
- 14. z3의 교차 곱
- 15. 다중 배열의 데카르트 곱
- 16. xslt 재귀 곱
- 17. 곱 처리기 상수 - C
- 18. 3D 배열 곱
- 19. 목록 사전의 데카르트 곱
- 20. r에있는 행렬 곱
- 21. 평행 행렬 곱
- 22. 합계가 쿼리에서 곱 해지고 있습니다.
- 23. 30보다 작은 숫자의 합계와 30보다 큰 숫자의 합을 선택하는 방법은 무엇입니까?
- 24. 파이썬에서 두 벡터의 교차 곱
- 25. I는 0, 1로 구성된 문자열의 큰 숫자의 구성 데이터 프레임이
- 26. 복수 (2 개 이상) 숫자의 가장 큰 공약수
- 27. C++에서 큰 숫자의 n 번째 루트를 구하는 방법은 무엇입니까?
- 28. ASP.NET에서 Excel로 내보내기, 1000보다 큰 숫자의 소수점 서식 문제가 발생했습니다.
- 29. 더 큰 숫자의 복권 번호를 효율적으로 생성하는 방법
- 30. 숫자의 보통 변경
O (n2)는 무의미한 것처럼 보입니다. O (2 * n) 또는 O (n^2)를 의미합니까? 전자가 여전히 O (n)임을 유의하십시오. – leppie
[올바른 알고리즘] (http://en.wikipedia.org/wiki/Sch%C3%B6nhage%E2%80%93Strassen_algorithm)을 사용하면 곱셈을 O보다 약간 낮출 수 있습니다 (N x log N x log log 엔). –
하드웨어가 실제로 어떻게 증가하는지 고려하고 싶습니까? – phant0m