6

연구 논문의 경우 행렬의 행렬식을 계산하는 가장 빠른 알고리즘을 연구하도록 지정되었습니다.매트릭스의 행렬식을 계산하는 가장 빠른 알고리즘?

는 이미^(N^3)하지만 뒷조사를하고 후,이 곳 N 사이의 실행^2 n은 어떤 알고리즘이있는 것 같다 O에있는 모두 실행에 대한 LU 분해Bareiss 알고리즘을 알고 삼.

source (113-114 페이지 참조) 및 source (198 페이지 참조)은 Coppersmith-Winograd의 행렬 곱셈 알고리즘을 기반으로하기 때문에 O (n^2.376)에서 실행되는 알고리즘이 있다고합니다. 그러나, 나는 그런 알고리즘에 대한 세부 사항을 찾을 수 없었습니다.

내 질문은 :

  1. 행렬의 행렬식을 계산하는 가장 빠른 생성 (비 이론적 인) 알고리즘은 무엇입니까?
  2. 가장 빠른 알고리즘에 대한 정보는 어디에서 찾을 수 있습니까?

감사합니다.

+0

얼마나 큰 행렬은? 얼마나 많은 결정 인자를 계산하고 싶습니까? –

+0

행렬이 매우 큽니다 (N> 22는 충분히 클 것입니까?). 그리고 얼마나 많이? 주어진 행렬에 대한 단 하나의 결정자. 입력 : 1 큰 매트릭스 출력 : 입력 매트릭스에 대한 단일 결정입니다. –

+0

숫자 안정성도 문제가됩니까? – Henry

답변

4

실용적인 (그리고 일반적으로 사용되는) 알고리즘은 Strassen 알고리즘이라고 생각합니다. 샘플 C 코드와 함께 Wikipedia에 대한 설명을 찾을 수 있습니다.

Coppersmith-Winograd's multiplication algorithms을 기반으로 한 알고리즘은 너무 복잡하여 실용적이지 못하지만 실제로는 최대한의 점근 적 복잡성이 있습니다.

+0

현재 바인딩이'O (n^{2.3728639}) '라는 점은 주목할 만하지만 소펠 (Sopel)이 말했듯이 더 작은 지수가 퍼싱할만한 가치는 없다 그것들은 앞에서 _enormous_ constant factor를 가지고 있기 때문에 실용적인 계산에서. – Hooked

+0

@ 소펠 Strassen은 매트릭스 반전에 사용됩니다. http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations을 참조하십시오. Coppersmith-Winograd를 기반으로 한 알고리즘에 대해서는 정확합니다. 저는 교수님에게 물었습니다. 그는 가장 빠르다고 말했지만 너무 복잡하여 실용적이지 않다고 말했습니다. 고맙습니다! –

+0

나는 그것들이 매우 유사한 문제라고 믿는다 (나는 Coppersmith-Winograd의 행렬 곱셈 알고리즘이 결정자를 계산하기 위해 변형 될 수 있음을 결론 지었다.) 그러나 이것에 대한 큰 지식이 없기 때문에 틀릴 수도있다. – Sopel

2

제 질문에 대한 직접적인 답변이 아니라는 것을 알고 있습니다 만, 제 연구 논문을 완성하기에 충분합니다. 난 그냥 내 교수를 물어 결국 나는 그가 말한 것을 요약한다 :

요약 :

  • 가장 빠른 행렬 곱셈 알고리즘 (예를 들어, 구리 세공인 - Winograd와 최근의 개선이) O와 함께 사용할 수 있습니다 (n^~ 2.376) 산술 연산이지만, 무거운 수학 도구를 사용하고 종종 비실용적입니다.
  • LU 분해 및 Bareiss가 LU 분해 및 Bareiss 최대한 빨리 가장 효율적인 알고리즘과 같은하지 않더라도, (N^3) 작업 O를 사용하여 수행하지만, 요컨대

보다 실용적이며, 그들은 더 실용적 나는이 두 논문에 초점을 맞추어야한다.

의견을 말하고 도움을 준 모든 분들께 감사드립니다.

+0

그것은 "LU 분해 및 Bareiss가 빠르지 않다"는 것은 사실이지만 정확하지 않습니다. 당신이 의미하는 바는 "LU 분해와 Bareiss는 빠르지 않습니다."입니다. 점근 적으로 우수한 알고리즘은 실제 실행 시간 함수에서 높은 상수를 가지므로 "느린"알고리즘이 더 빠릅니다. 예를 들어, 1e6 * n은 모든 n <1e5에 대해 0.0001 * n^2보다 큽니다. – Gene

0

임의의 정사각형 행렬의 결정 계산 다음 matlab에 테스트 스크립트 참조 (matlab에 내장 된 기능에 대한 비교도 포함되어 있습니다) :

nMin = 2; % Start with 2-by-2 matrices 
nMax = 50; % Quit with 50-by-50 matrices 
nTests = 10000; 
detsOfL = NaN*zeros(nTests, nMax - nMin + 1); 
detsOfA = NaN*zeros(nTests, nMax - nMin + 1); 
disp(' '); 
for n = nMin:nMax 
    tStart = tic; 
    for j = 1:nTests 
     A = randn(n, n); 
     detA1 = det(A); % Matlab's built-in function 
     if n == 1 
      detsOfL(j, 1) = 1; 
      detsOfA(j, 1) = A; 
      continue; % Trivial case => Quick return 
     end 
     [L, U, P] = lu(A); 
     PtL = P'*L; 
     realEigenvaluesOfPtL = real(eig(PtL)); 
     if min(prod(realEigenvaluesOfPtL)) < 0 % det(L) is always +1 or -1 
      detL = -1; 
     else 
      detL = 1; 
     end 
     detU = prod(diag(U)); 
     detA2 = detL * detU; % Determinant of A using LU decomposition 
     if detA1 ~= detA2 
      error(['Determinant computation failed at n = ' num2str(n) ', j = ' num2str(j)]); 
     end 
     detsOfL(j, n - nMin + 1) = detL; 
     detsOfA(j, n - nMin + 1) = detA2; 
    end 
    tElapsed = toc(tStart); 
    disp(sprintf('Determinant computation was successful for n = %d!! Elapsed time was %.3f seconds', n, tElapsed)); 
end 
disp(' '); 
관련 문제