다항식 근 찾기 알고리즘
Polynomial root-finding algorithms다항식의 뿌리를 찾는 것은 역사를 통틀어 많은 연구의 대상이 되어온 오랜 문제입니다.이것에 대한 증거는 19세기까지, 대수학은 본질적으로 다항식 방정식의 이론을 의미했다는 것입니다.
원칙
이 섹션은 너무 길어서 편하게 읽고 탐색할 수 없습니다.(2023년 1월) |
선형 다항식(도 1)의 근을 찾는 것은 쉽고 하나의 나눗셈만 있으면 됩니다. 일반 + {{ax + b }은 x - /{{ x = -입니다.2차 다항식(도 2)의 경우 2차 공식은 솔루션을 생성하지만 수치적 평가는 수치 안정성을 보장하기 위해 약간의 주의가 필요할 수 있습니다.3도와 4도의 경우, 라디칼 측면에서 폐쇄형 솔루션이 있는데, 이는 일반적으로 수치 평가에 편리하지 않습니다.너무 복잡하고 다항식의 루트의 직접적인 계산보다 쉽지 않은 n번째 루트의 계산을 포함하기 때문입니다(예를 들어, 입방 다항식의 실제 루트의 표현은 비실체 입방체 루트를 포함할 수 있습니다).5차 이상의 다항식의 경우, 아벨-러피니 정리는 일반적으로 근의 근본적인 표현이 없다고 주장합니다.
그래서, 매우 낮은 정도를 제외하고, 다항식의 근 찾기는 근의 근사치를 찾는 것으로 구성됩니다.대수학의 기본 정리에 따르면, 차수 n의 다항식은 배수를 세는 정확하게 n개의 실수 또는 복소 근을 갖습니다.
따라서 다항식의 루트 찾기 문제는 세 가지 다른 하위 문제로 분할될 수 있습니다.
- 하나의 루트 찾기
- 모든 루트 찾기
- 복잡한 평면의 특정 영역에서 뿌리를 찾는 것, 일반적으로 주어진 간격에서 실제 뿌리 또는 실제 뿌리를 찾는 것(예: 뿌리가 물리적 양을 나타낼 때, 실제 긍정적인 것만 흥미롭습니다).
하나의 근을 찾는 경우 뉴턴의 방법과 다른 일반적인 반복 방법이 일반적으로 잘 작동합니다.
모든 루트를 찾기 위해, 논쟁의 여지 없이 가장 신뢰할 수 있는 방법은 MATLAB에서[1] 표준 방법으로 구현된 다항식에 해당하는 컴패니언 매트릭스의 고유값을 계산하는 프란시스 QR 알고리듬입니다.
모든 뿌리를 찾는 가장 오래된 방법은 하나의 뿌리를 찾는 것으로 시작하는 것입니다.루트 r이 발견되면 이항 x – r을 분할하여 다항식에서 제거할 수 있습니다.결과 다항식에는 이 프로세스를 반복하여 찾을 수 있는 나머지 루트가 포함됩니다.그러나 낮은 정도를 제외하고는 수치 불안정성 때문에 잘 작동하지 않습니다.윌킨슨의 다항식은 하나의 계수에 대한 아주 작은 수정이 뿌리의 값뿐만 아니라 그 성질(실제 또는 복소)도 극적으로 변화할 수 있음을 보여줍니다.또한 근사값이 좋더라도 다항식을 근사근에서 평가할 때 0에 가깝지 않은 결과를 얻을 수 있습니다.예를 들어, 20도의 다항식(윌킨슨 다항식의 정도)이 10에 가까운 근을 가진다면,루트에서 다항식의 도함수는 10 이는 루트 값에 대한 -의오차가 의대략적인 루트에서 다항식의 값을 생성할 수 있음을 의미합니다
이러한 문제를 피하기 위해 모든 루트를 동시에 원하는 정확도로 계산하는 방법이 정교해졌습니다.현재 가장 효율적인 방법은 Aberth 방법입니다.MSolve라는 이름으로 무료 구현이 가능합니다.이것은 1,000개 이상의 유의한 소수 자릿수를 가진 1,000개 이상의 차수 다항식의 뿌리를 일상적으로 찾을 수 있는 참조 구현입니다.
모든 루트를 계산하는 방법은 실제 루트를 계산하는 데 사용될 수 있습니다.그러나 가상 부분이 작은 루트가 진짜인지 아닌지를 결정하는 것은 어려울 수 있습니다.게다가, 실제 뿌리의 수는 평균적으로 정도의 로그이기 때문에, 실제 뿌리에 관심이 있을 때 비실제 뿌리를 계산하는 것은 컴퓨터 자원의 낭비입니다.
스투름의 정리는 실제 근의 수와 구간의 근의 수를 계산하는 가장 오래된 방법이지만, 데카르트의 부호 규칙과 그 확장에 기초한 방법인 부단과 빈센트의 정리가 일반적으로 더 효율적입니다.루트 찾기의 경우 0 또는 하나의 루트를 포함하는 간격을 얻을 때까지 루트가 검색되는 간격의 크기를 줄이는 방법으로 모두 진행됩니다.그러면 고립된 루트에 대한 뉴턴 방법의 2차 수렴을 얻기 위해 하나의 루트를 포함하는 구간이 더 줄어들 수 있습니다.주요 컴퓨터 대수 시스템(메이플, 수학자, SageMath, PARI/GP)은 다항식의 실제 루트에 대한 기본 알고리즘으로 이 방법의 변형을 각각 가지고 있습니다.
방법의 클래스는 다항식의 루트를 찾는 문제를 [1]다항식의 동반 행렬의 고유값을 찾는 문제로 변환하는 것을 기반으로 하며, 원칙적으로 다항식의 루트를 찾는 데 모든 고유값 알고리즘을 사용할 수 있습니다.그러나 효율성을 위해 행렬의 구조를 사용하는 방법, 즉 행렬이 없는 형태로 구현될 수 있는 방법을 선호합니다.이러한 방법 중에는 검정력 방법이 있으며, 동반 행렬의 전치에 대한 적용은 가장 큰 계수의 뿌리를 찾는 고전적인 베르누이의 방법입니다.일부 가장 작은 루트를 먼저 찾는 시프트가 있는 역제곱법은 젠킨스-트라우브 알고리듬의 복잡한 (cpoly) 변형을 구동하고 수치 안정성을 부여하는 것입니다.또한 군집화된 루트가 있는 경우에도 2 1 2여기서 φ\는 황금비율)과 빠른 수렴을 보입니다.이 빠른 수렴은 한 단계당 3개의 다항식 평가 비용을 수반하며, 결과적으로 O(f(x))의 잔차가 발생하는데, 이는 뉴턴 방법의 3단계보다 느린 수렴입니다.
하나의 루트 찾기
근을 계산하기 위해 가장 널리 사용되는 방법은 뉴턴의 방법이며, 이 방법은 다음과 같은 계산의 반복으로 구성됩니다.
적절한 값 x부터 시작합니다 {\
f가 다항식인 경우 각 반복에서 다항식과 그 파생물을 계산하기 위해 전처리를 사용하여 호너의 방법 또는 평가를 사용할 때 계산이 더 빠릅니다.
수렴은 일반적으로 2차적이지만 훨씬 느리게 수렴하거나 전혀 수렴하지 않을 수 있습니다.특히, 다항식에 실수근이 이 실수라면 뉴턴의 방법은 수렴할 수 없습니다.그러나 다항식이 그 도함수의 더 큰 실제 루트보다 큰 실수 루트를 가지고 있다면, 이 이 더 큰 루트보다 크면 뉴턴의 방법은 이 가장 큰 루트로 4차 수렴합니다(근의 상한을 계산하는 쉬운 방법이 있습니다. 다항식 루트의 속성 참조).이것이 뿌리를 계산하기 위한 호너 방법의 시작점입니다.
하나의 루터가 발견되면 다항식에서 인자 x – r을 제거하기 위해 유클리드 나눗셈을 사용할 수 있습니다.결과 몫의 루트를 계산하고 이 과정을 반복하는 것은 원칙적으로 모든 루트를 계산하는 방법을 제공합니다.그러나 이 반복 체계는 수치적으로 불안정합니다. 근사 오차는 연속적인 인수 분해 동안 누적되므로 마지막 근은 원래 다항식의 인자에서 크게 벗어나는 다항식으로 결정됩니다.이 오차를 줄이기 위해 발견된 각 근에 대해 원래 다항식과 이 근사 근을 시작 값으로 뉴턴의 방법을 다시 시작할 수 있습니다.
그러나 모든 루트를 찾을 수 있다는 보장은 없습니다.사실, 계수에서 다항식의 근을 찾는 문제는 매우 불리한 조건을 가질 수 있습니다.이것은 윌킨슨의 다항식에 의해 설명됩니다: 이 차수 20의 다항식의 근은 20개의 첫 번째 양의 정수입니다; 계수 중 하나의 32비트 표현의 마지막 비트(-210과 동일)를 변경하면 10개의 실제 근과 0.6보다 큰 가상 부분을 가진 10개의 복소수를 가진 다항식이 생성됩니다.
뉴턴의 방법과 밀접한 관련이 있는 것은 핼리의 방법과 라게르의 방법입니다.둘 다 3차 수렴이 있는 반복 공정에 대해 다항식과 그 두 개의 첫 번째 파생을 사용합니다.이러한 방법의 두 단계를 연속적으로 하나의 테스트로 결합하면 6개의 다항식 평가(호너 규칙 사용)를 비용으로 9의 수렴률을 얻을 수 있습니다.반면에 뉴턴 방법의 세 단계를 결합하면 같은 수의 다항식 평가 비용으로 수렴률이 8이 됩니다.이것은 이러한 방법에 약간의 이점을 제공합니다(각 단계에서 제곱근을 계산해야 하기 때문에 라게르의 방법에 대해서는 덜 명확합니다).
실수 계수와 실수 시작점이 있는 다항식에 이러한 방법을 적용할 때 뉴턴과 핼리의 방법은 실수 선 안에 머무릅니다.복잡한 뿌리를 찾기 위해서는 복잡한 출발점을 선택해야 합니다.대조적으로, 평가에 제곱근이 있는 라게르 방법은 자체적으로 실제 축을 떠날 것입니다.
쌍으로 뿌리 찾기
주어진 다항식에 실제 계수만 있는 경우 복잡한 숫자의 계산을 피할 수 있습니다.이를 위해서는 켤레 복소근 쌍에 대한 2차 인자를 찾아야 합니다.이 작업에 다차원 뉴턴 방법을 적용하면 베어스토 방법이 나옵니다.
젠킨스-트라우브 알고리즘의 실제 변형은 이 방법의 개선입니다.
한 번에 모든 뿌리 찾기
단순한 듀랜드-커너와 약간 더 복잡한 애버스 방법은 단순한 복소수 산술만을 사용하여 모든 근을 동시에 찾습니다.고속 푸리에 변환과 유사한 다점 평가 및 보간을 위한 가속 알고리듬은 다항식의 큰 수준에서 속도를 높이는 데 도움이 될 수 있습니다.비대칭이지만 균등하게 분포된 초기 점 집합을 선택하는 것이 좋습니다.자유 소프트웨어 MPSolve에서 이 방법을 구현하는 것은 효율성과 정확성에 대한 참조입니다.
이 스타일을 가진 또 다른 방법은 단델린-그레페 방법(때로는 로바체프스키로 분류되기도 함)인데, 다항식 변환을 사용하여 반복적이고 암시적으로 뿌리를 제곱합니다.이것은 뿌리의 분산을 크게 확대합니다.Viète의 공식을 적용하면, 뿌리의 계수에 대한 쉬운 근사치를 얻을 수 있으며, 뿌리 자체에 대한 약간의 노력을 더하면 됩니다.
제외 및 인클로저 방법
실선의 세그먼트 또는 복소 평면의 영역에 루트가 포함되어 있지 않은지 여부를 알려주는 몇 가지 빠른 검정이 있습니다.루트의 계수를 경계하고 이러한 경계로 표시된 초기 영역을 재귀적으로 세분화하면 루트를 포함할 수 있는 작은 영역을 분리한 다음 다른 방법을 적용하여 정확하게 찾을 수 있습니다.
이 모든 방법은 다항식의 이동 및 축척된 버전의 계수를 찾는 것을 포함합니다.큰 정도의 경우 FFT 기반 가속 방법을 사용할 수 있습니다.
실제 루트에 대해서는 다음 섹션을 참조하십시오.
리머-슈어 알고리즘은 원에 대해 슈어-콘 테스트를 사용합니다. 변형인 윌프의 전역 이분법 알고리즘은 복소 평면의 직사각형 영역에 대해 권선 수 계산을 사용합니다.
분할 원 방법은 FFT 기반 다항식 변환을 사용하여 루트 군집에 해당하는 고차 요인을 찾습니다.인수 분해의 정밀도는 뉴턴 유형 반복을 사용하여 최대화됩니다.이 방법은 임의 정밀도가 높은 다항식의 근을 찾는 데 유용하며,[citation needed] 이 설정에서 거의 최적의 복잡성을 갖습니다.
실제 루트 분리
실제 계수로 다항식의 실제 근을 찾는 것은 19세기 초부터 많은 관심을 받아왔고, 여전히 활발한 연구 영역입니다.대부분의 루트 찾기 알고리즘은 실제 루트를 찾을 수 있지만 모든 루트를 찾았다고 증명할 수는 없습니다.Aberth 방법과 같이 모든 복잡한 뿌리를 찾는 방법은 실제 뿌리를 제공할 수 있습니다.그러나 다항식의 수치적 불안정성 때문에 (윌킨슨 다항식 참조) 어떤 뿌리가 진짜인지 결정하기 위해 임의 정밀 산술이 필요할 수 있습니다.게다가, 그들은 소수만이 실제일 때 모든 복잡한 뿌리를 계산합니다.
따라서 실제 루트를 계산하는 표준 방법은 분리 간격이라고 불리는 첫 번째 분리 간격을 계산하는 것입니다. 각 간격은 정확하게 하나의 실제 루트를 포함하고, 함께 모든 루트를 포함합니다.이 계산을 실제 루트 분리라고 합니다.분리 간격이 있으면 결과의 정밀도를 향상시키는 뉴턴 방법과 같은 빠른 수치 방법을 사용할 수 있습니다.
스투름의 정리에서 나온 실근 분리를 위한 가장 오래된 완전한 알고리즘입니다.그러나 데카르트의 부호 법칙과 빈센트의 정리에 기초한 방법보다 훨씬 덜 효율적인 것으로 보입니다.이러한 방법은 두 가지 주요 클래스로 나뉩니다. 하나는 연속 분수를 사용하고 다른 하나는 이분법을 사용합니다.두 방법 모두 21세기 초부터 극적으로 개선되었습니다.이러한 개선으로 모든 루트를 계산하기 위한 최고의 알고리즘과 유사한 계산 복잡성에 도달합니다(모든 루트가 실제인 경우에도).
이러한 알고리즘은 Mathematica(연속 분수법)와 Maple(이등분법)에서 구현되었으며 사용할 수 있습니다.두 구현 모두 일상적으로 1,000보다 높은 정도의 다항식의 실제 근을 찾을 수 있습니다.
다항식의 여러 근 찾기
다중근의 수치계산
다중 루트는 일반적으로 상태가 나쁘고 수치 계산이 부정확한 것으로 알려져 매우 민감합니다.MATLAB 패키지로 구현된 Zhonggang Zeng(2004)의 방법은 계수가 [2][3][4]부정확하더라도 다항식의 여러 근과 해당 배수를 정확하게 계산합니다.
방법은 두 단계로 요약할 수 있습니다.p p를 주어진 다항식이라고 .첫 번째 단계는 숫자 최대 공통 지수 알고리즘을 [4]사용하여 제곱 없는 인수 분해를 적용하여 다중성 구조를 결정합니다.이를 통해 p p를 다음과 같이 쓸 수 있습니다.
서 {{1},\k}}은 구별되는 뿌리의 배수입니다.이 방정식은 k< \ k <n \ displaystylek < )와 계수를 일치시키는n \ n 에서k \ k z k \ 를 것에 대해 과도하게 결정된 입니다.대부분의 경우 최소 제곱 솔루션은 더 이상 불량 상태가 아닙니다.두 번째 단계는 가우스-뉴턴 알고리즘을 적용하여 구별되는 뿌리에 대해 과도하게 결정된 시스템을 해결합니다.
다중 루트의 민감도는 윌리엄 카한(1972)이 발견한 다중 루트의 기하학적 특성으로 인해 정규화될 수 있으며, 과도하게 결정된 시스템 모델){\은 …, \의 을 유지합니다.
무제곱 인수분해
계수가 정수 또는 유리수로 정확하게 지정된 다항식의 경우 단순한 근만 있고 계수도 정확하게 지정된 요인으로 분해하는 효율적인 방법이 있습니다.무제곱 인수 분해라고 불리는 이 방법은 다항식의 다중 루트와 다항식의 최대 공약수의 루트를 기반으로 합니다.
다항식 p의 무제곱 인수분해는 p p {{ p = 이며, 여기서 각({는 루트가 여러 개 없는 다항식 또는 1개이며, 서로 두 개의 ({})는 공통 루트가 없습니다.
이 인수분해를 계산하는 효율적인 방법은 Yun의 알고리즘입니다.
레퍼런스
- ^ a b "Polynomial roots - MATLAB roots". MathWorks. 2021-03-01. Retrieved 2021-09-20.
- ^ McNamee, J.M. (2007). Numerical Methods for Roots of Polynomials, Part I. Elsevier. p. 257-278.
- ^ Stetter, H.J. (2004). Numerical Polynomial Algebra. SIAM. p. 223.
- ^ a b Zeng, Zhonggang (2004). "Computing multiple roots of inexact polynomials". Mathematics of Computation. 74 (250): 869-903. arXiv:2301.07880. doi:10.1090/S0025-5718-04-01692-8.
Zeng, Zhonggang (2004). "Algorithm 835: MultRoot – A Matlab package for computing polynomial roots and multiplicities". ACM Transaction on Mathematical Software. 30: 218-236. doi:10.1145/992200.992209. S2CID 18188044.