멀티 루트와 고차 방정식 처리

멀티 루트의 정의와 특징

한 개 이상의 뿌리(근)를 공유하는 함수에서 특정 근이 여러 번 반복되는 경우를 멀티 루트라 한다. 이를 수학적으로 표현할 때 어떤 실함수 $f(x)$가 근 $r$을 가질 뿐만 아니라 해당 근의 차수가 2 이상인 경우가 이에 해당한다. 예를 들어 $f(r)=0$이면서 $f'(r)=0$이면 중근(이차 근)이라 하고, 더 높은 차수에서도 비슷한 방식으로 정의된다. 이러한 멀티 루트가 존재하면 뉴턴 방법 같은 단순 반복법이 일반 루트에 대해 보여주는 수렴 속도와 달리, 수렴 차수가 떨어지거나 발산할 수 있다. 따라서 멀티 루트를 정확히 알아내고 효율적으로 수치 해석하는 알고리즘이 필요하다.

멀티 루트에서의 뉴턴 방법 분석

뉴턴 방법은 보통

xn+1=xnf(xn)f(xn)\begin{align} x_{n+1} &= x_n - \frac{f(x_n)}{f'(x_n)} \end{align}

형태이다. 이때 루트가 중근 이상이 되면 $f'(r)=0$이므로, 위 식이 분모 0에 가까워지고 실제 근 근방에서 매우 느리게 수렴하거나 불안정해진다. 멀티 루트에서 뉴턴 방법의 국소 수렴 차수는 1차로 떨어질 수 있다는 점이 잘 알려져 있다. 이를 보완하기 위해 멀티 루트에 특화된 수정 뉴턴 방법이 제안된다.

수정 뉴턴 방법

변형 뉴턴 방법의 한 예시로

xn+1=xnf(xn)f(xn)[f(xn)]2f(xn)f(xn)\begin{align} x_{n+1} &= x_n - \frac{f(x_n) f'(x_n)}{[f'(x_n)]^2 - f(x_n) f''(x_n)}\end{align}

형태를 사용할 수 있다. 분자의 $f(x_n)$, $f'(x_n)$과 분모의 $f''(x_n)$를 함께 고려함으로써, 멀티 루트에 대해 정상적인 수렴이 일어나도록 만든다. 실제 구현 시 점화식의 분모가 작아질 수 있으므로 계산 안정성을 살펴야 한다. 고차 근에 대한 또 다른 접근 방법으로 루트의 차수를 가정한 뒤 일반화된 형태의 반복식을 유도하기도 한다.

고차 방정식에서의 멀티 루트 검출

고차 방정식 $p(x)$이 주어졌을 때, 다항식 내에서 멀티 루트가 존재하는지 확인하려면 최대공약수(gcd) 방식이나 판별식, 혹은 미분 다항식을 동시에 고려하는 방식이 쓸 만하다. 예컨대 $p(x)$와 $p'(x)$의 최대공약수가 상수만이 아니라면, 그 공약수에 해당하는 인자가 곧 멀티 루트를 갖는 인자로 볼 수 있다. 이를 이용하면 목표함수에 멀티 루트가 있는지 판별할 수 있고, 근사 해석 과정에서 별도의 알고리즘을 적용할 수 있다.

고차 방정식의 반복 모사

고차 방정식을 풀 때는 차수에 따라 직접적인 해석적 해를 구하기 어렵다. 따라서 반복적 접근 방법이 거의 필수적이다. 한 가지 전형적인 기법으로 다항식 분할(deflation) 방식이 있다. 뿌리를 하나 찾으면 그에 해당하는 인수를 다항식에서 나누어 차수를 낮추는 식으로 처리한다. 이때 멀티 루트가 포함되어 있으면 나누는 횟수가 근의 차수만큼 반복된다. 예를 들어 $x=r$이 $k$차 루트면 $(x - r)^k$가 인수인 상태이다. 그러므로 효율적 계산을 위해선 해석적으로나 수치적으로 해당 루트가 몇 차인지도 어느 정도 추정해가며 다항식을 단순화하는 방식이 쓰인다.

고차 방정식에서의 일반화된 뉴턴 방법

단일 방정식 $f(x)=0$ 해를 찾는 것에서 고차 다항식을 풀기 위해 뉴턴 방법을 적용하면, 매 반복마다

xn+1=xnp(xn)p(xn)\begin{align} x_{n+1} &= x_n - \frac{p(x_n)}{p'(x_n)} \end{align}

과정을 수행한다. 이때 $p'(x_n)=0$에 가까운 구간을 회피하지 못하면 분모가 작아져 발산하거나 멀티 루트 근방에서 수렴 속도가 저하된다. 이런 상황을 피하려면 멀티 루트가 있을 것으로 의심되는 근방에서 수정 뉴턴 방법을 적용하거나, 중근 판별 과정을 통해 이미 멀티 루트가 있음을 알고 있다면 별도의 알고리즘으로 처리하는 방법을 병행한다.

다차 방정식의 해 집합 분리

고차 다항식에서 여러 서로 다른 루트를 갖는 경우도 있지만, 어떤 루트는 멀티 루트이고 나머지가 단일 루트인 혼합 형태일 수도 있다. 이렇게 다양한 근들(실근, 복소근, 멀티 루트)이 혼재한 상황에서 오차 없이 근을 전부 찾으려면 여러 수치 방법을 적절히 조합해야 한다. 먼저 근의 대략적 위치와 개수를 파악하려고 Sturm 순서나 Routh–Hurwitz 같은 이론적 근 개수 판별 기법을 적용하기도 한다. 이어서 다항식 분할로 차수를 점차 낮추고, 나머지 다항식에 대해 반복적 근사법을 이어가는 순으로 고차 방정식을 처리한다.

다항식 근 분할(deflation) 기법의 구체화

다차 방정식에서 하나의 근을 찾아내면, 해당 근이 실제로 중근 이상의 차수를 가졌는지 추가 점검이 필요하다. 가령 어떤 $n$차 다항식 $p(x)$에 대해 뿌리가 $r$로 추정되었을 때,

p(x)=(xr)kq(x)\begin{align} p(x) &= (x-r)^k q(x) \end{align}

형태로 분해되는지 확인한다. 여기서 $k \ge 1$이며 $q(r) \neq 0$이다. 근 $r$을 수치적으로 찾아냈다면 $k$가 2 이상인지도 살펴볼 수 있다. 이를 위해 $p(r)=0$인 상황에서 $p'(r)$도 0인지 검사하는 식이다. 예컨대,

p(r)=0,p(r)=0,,p(k1)(r)=0,p(k)(r)0p(r)=0,\quad p'(r)=0,\quad \ldots,\quad p^{(k-1)}(r)=0,\quad p^{(k)}(r)\neq 0

인 경우, $r$은 $k$차 멀티 루트가 된다.

만약 $r$이 $k$차 멀티 루트라고 판정되면, 실제 수치 해석 환경에서는 다항식 분할을 다음과 같이 수행한다. 먼저 1차로 $(x - r)$로 나누어 $p(x)$를 $p_1(x)$라 하고, 다시 $p_1(x)$를 $(x - r)$로 나누어 $p_2(x)$를 얻는 식으로 $k$번 반복한다. 이 과정을 ‘deflation’이라고 부른다. 이때 실수 연산 오류나 반올림 오차가 누적되면, 실제로는 $(x-r)$로 정확히 나누어떨어지지 않거나 분할 중에 큰 오차가 발생하기도 한다. 따라서 매 분할 단계마다 루트를 다시 한번 미세 조정(수치 방법 사용)하여 오차를 줄이는 전략이 권장된다.

컴패니언 행렬(companion matrix) 접근

고차 다항식

p(x)=xn+an1xn1++a1x+a0p(x) = x^n + a_{n-1}x^{n-1} + \cdots + a_1 x + a_0

에 대해서 컴패니언 행렬을 이용해 근을 고유값 문제로 바꾸는 방법이 잘 알려져 있다. 대표적인 형태로

C=(0000a01000a10100a20001an1)\mathbf{C} = \begin{pmatrix} 0 & 0 & 0 & \cdots & 0 & -a_0 \\ 1 & 0 & 0 & \cdots & 0 & -a_1 \\ 0 & 1 & 0 & \cdots & 0 & -a_2 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & \cdots & 1 & -a_{n-1} \end{pmatrix}

를 구성하고, $\mathbf{C}$의 고유값이 모두 $p(x)$의 근이 된다. 컴패니언 행렬 접근은 수치선형대수 기법으로 고유값을 구하면 되므로, 다항식의 근을 전부 찾을 수 있다. 복소 근도 자동으로 처리되고 멀티 루트의 경우에는 고유값의 중복으로 나타난다. 다만 컴패니언 행렬의 조건수가 좋지 않을 수 있으며, 수치 안정성을 고려해야 한다.

Bairstow 방법

2차 인자 분할을 기반으로 하는 Bairstow 방법도 고차 방정식 처리에서 전통적으로 사용된다. 다항식을 2차 인자

x2rxsx^2 - rx - s

로 나누며 반복 갱신하는 방식이다. 한번에 2차 인자를 찾음으로써 두 근을 동시에 근사하게 된다. $r$과 $s$를 적절히 갱신하여 나머지 다항식의 차수를 점차 낮추고, 남은 차수가 2 이하가 되면 직접 근의 해석적 공식을 사용한다. 멀티 루트가 끼어 있으면 $r$과 $s$의 갱신 과정에서 수렴 장애가 발생할 수 있으므로, 중복근 가능성을 염두에 두고 분모가 작은 경우에 별도 처리나 수정식을 쓸 수도 있다.

Muller 방법

세 점을 이용하여 2차 보간을 수행한 뒤 근을 예측하는 Muller 방법도 고차 방정식 근사에 쓰인다. $x_0, x_1, x_2$ 세 점을 잡고 함수값 $f(x_0), f(x_1), f(x_2)$를 이용해 2차 다항식을 추정, 그 근을 다음 반복점으로 삼는다. Newton 방법과 다르게 도함수를 명시적으로 쓰지 않으므로 고차식의 다중 도함수 계산 부담을 줄일 수 있다. 멀티 루트인 경우에도 어느 정도 유연하게 접근 가능하나, 여전히 근방에서 2차 보간이 깔끔하게 동작하지 않으면 수렴 오차가 커질 수 있다.

고차 방정식에서의 수치 안정성

차수가 높은 다항식을 직접 다루면 스케일링 문제가 심각해진다. 예컨대 계수들의 크기 차이가 매우 크거나, 근의 분포가 극단적인 경우, 고차항과 저차항 간의 계산이 반올림 오차에 취약해진다. 따라서 고차 식은 가능한 한 스케일을 조정하고, 국소 변수를 사용하여 축소하는 작업을 수행하는 것이 좋다. 일반적으로 전처리 과정을 통해 $x = \alpha + \beta,y$ 형태의 변수를 도입해 다항식의 계수들을 균질화시킨 뒤에 수치 해법을 적용하면, 최소한의 반올림 오차로 안정적인 근사 해를 얻을 가능성이 높아진다.

멀티 루트에서의 오차 해석

멀티 루트가 있으면, 동일한 차수의 단순 근보다 근 주변에서 $f'(r)=0$으로 인해 ‘평평한 곡선’ 형태가 된다. 이때 근 오차가 조금만 발생해도 함수값이 크게 달라지지 않아서, 고전적인 오차 분석이 어렵거나 과대 추정될 수 있다. 따라서 멀티 루트가 보장되어 있는 상황에선, 중근 이상에 특화된 수렴율 분석과 가중계수 조정 등을 통해 수치 안정성을 확보해야 한다. 예를 들어 수정 뉴턴 방법의 수렴 속도를 해석하면, 루트 차수가 높아질수록 실제 수렴 차수는 갈수록 1에 가까워지는 경향이 있지만, 보완 기법을 도입하면 다시 2차 근방으로 상승시킬 수도 있다.

멀티 루트 검출을 위한 gcd 접근

다항식 $p(x)$와 $p'(x)$의 최대공약수 $\text{gcd}[p(x), p'(x)]$가 상수가 아니면 그 공약수 다항식이 멀티 루트 집합을 의미한다. 실제로 수치적으로 gcd를 구하는 것은 다항식 나눗셈의 반복으로 구현할 수 있으나, 고차 다항식에서는 수치 오차가 커서 뚜렷한 판단을 방해할 수 있다. 이를 개선하려고 $p(x)$와 $p'(x)$를 공통으로 약분했을 때 남는 차수를 비교하거나, 심볼릭 연산과 수치 연산을 혼합해 안정된 gcd 계산을 수행하기도 한다.

반복방법 병합과 하이브리드 기법

하나의 고차 방정식을 풀 때 여러 알고리즘을 순차적으로 혹은 병렬로 병합해 사용하기도 한다. 예컨대, 초기 근사값을 구하기 위해 Muller 방법을 사용하고, 근방에 도달하면 수정 뉴턴 방법으로 전환하여 빠른 국소 수렴을 노리는 하이브리드가 있다. 혹은 Bairstow 방법으로 대략적인 2차 인자를 찾은 뒤, 다시 각각 2차 혹은 1차로 낮춘 방정식을 뉴턴 방법 등으로 정밀 보정하기도 한다. 멀티 루트가 보장된 구간에 대해서는 아예 중근용 공식 점화식으로 시작하는 접근도 연구된다.

Householder 계열 방법

고차 및 멀티 루트에 대해 뉴턴 방법보다 고차 도함수를 활용한 Householder 계열 방법이 소개되기도 한다. Householder 방법의 일반형은

xn+1=xnmf(xn)f(xn)[1  +  (m1)2!f(xn)f(xn)f(xn)  +  (m1)(m2)3!(f(xn)f(xn)f(xn))2+]\begin{align} x_{n+1} &= x_n - \frac{m\,f(x_n)}{f'(x_n)} \cdot \left[ 1 \;+\; \frac{(m-1)}{2!}\,\frac{f''(x_n)}{f'(x_n)}\,f(x_n) \;+\; \frac{(m-1)(m-2)}{3!}\,\left(\frac{f''(x_n)}{f'(x_n)}\,f(x_n)\right)^2 + \cdots \right] \, \end{align}

형태로 표현된다. $m$은 방법의 단계(order)에 해당하며, $m=2$가 Halley 방법, $m=3$ 이상이면 더 고차의 Householder 방법이 된다. 멀티 루트가 아니면 $m$차 수렴 속도를 보여 이론적으로 매우 빠른 근사에 이르게 되지만, 멀티 루트가 존재하면 여전히 $f'(r)=0$ 문제가 걸림돌이 되어 수렴 차수가 저하된다. 따라서 멀티 루트에 맞춰 분자와 분모의 형태를 달리하거나, 수정 인수를 도입하는 방식으로 변형하기도 한다.

Halley 방법

Householder 방법에서 $m=2$를 적용한 사례가 Halley 방법으로,

xn+1=xn    f(xn)f(xn)/[1    12f(xn)f(xn)f(xn)]\begin{align} x_{n+1} &= x_n \;-\; \frac{f(x_n)}{f'(x_n)}\,\biggl/ \Bigl[ 1 \;-\; \tfrac12\,\frac{f''(x_n)}{f'(x_n)}\,f(x_n) \Bigr] \,\end{align}

형태가 된다. 뉴턴 방법에 비해 추가로 2차 도함수를 요구하지만, 단근에 대해서는 3차 국소 수렴성을 갖는다. 다만 멀티 루트에서 $f'(r)=0$ 때문에 분모가 0에 수렴할 수 있고, $f''(r)$ 역시 0이 되면 분모의 형태가 더 복잡해진다. 따라서 실제 구현 시 안정성을 위해 분모가 작아지는지 사전에 검사하고, 별도 보정 방식을 둔다. 멀티 루트 바로 인근에서 Halley 방법만으로는 충분치 않으므로, 차수를 조정한 Householder 계열의 특수식을 쓰거나 수정 뉴턴 변형과 결합하기도 한다.

Weierstrass (Durand–Kerner) 방법

다항식의 모든 근을 동시에 추정하기 위해 고안된 방법으로, 초깃값을 여러 개 준비하고 반복과정을 병렬 혹은 동시 수행한다. $n$차 다항식

p(z)=zn+an1zn1++a1z+a0p(z) = z^n + a_{n-1} z^{n-1} + \cdots + a_1 z + a_0

의 근을 $z_1,\ldots,z_n$이라 하면, Weierstrass 방법(또는 Durand–Kerner 방법)은 각 근 추정값 $z_{k}^{(m)}$를 업데이트할 때 나머지 근 추정값을 전부 고려한다. 대표적으로

zk(m+1)=zk(m)    p(zk(m))jk[zk(m)zj(m)]\begin{align} z_{k}^{(m+1)} &= z_{k}^{(m)} \;-\; \frac{p\bigl(z_{k}^{(m)}\bigr)}{\displaystyle \prod_{j\neq k} \Bigl[z_{k}^{(m)} - z_{j}^{(m)}\Bigr]} \, \end{align}

식으로 반복한다. 복소수 영역에서 모든 근을 찾을 수 있고, 멀티 루트는 반복값이 서로 가까워지는 형태로 나타난다. 이 방법은 근의 중복도가 높으면 분모가 매우 작아져 발산할 우려가 있으므로, 멀티 루트 대응 알고리즘(예: 서로 가까운 근끼리 묶어 수정)으로 보완한다. 수렴 속도는 일반적으로 선형 수준이지만, 초깃값을 잘 주면 빠르게 수렴하기도 한다.

Aberth–Ehrlich 방법

Weierstrass 방법의 단점을 개선한 또 다른 전역 다근(모든 근) 탐색 방법으로, 각 근 갱신 시 ‘다른 근 추정값과의 거리’를 적절히 반영하여, 분모가 매우 작아지는 문제를 완화한다. 표준 형식은

zk(m+1)=zk(m)p(zk(m))p(zk(m))11jk1zk(m)zj(m)p(zk(m))p(zk(m))\begin{align} z_{k}^{(m+1)} &= z_{k}^{(m)} - \frac{p\bigl(z_{k}^{(m)}\bigr)}{p'\bigl(z_{k}^{(m)}\bigr)} \cdot \frac{1}{1 - \displaystyle \sum_{j \neq k} \frac{1}{z_{k}^{(m)} - z_{j}^{(m)}}\,\frac{p\bigl(z_{k}^{(m)}\bigr)}{p'\bigl(z_{k}^{(m)}\bigr)}} \,\end{align}

와 유사한 형태로 표현된다. Weierstrass 방법보다 분모의 폭발이나 근끼리 뭉침 현상이 덜하며, 멀티 루트의 경우에도 근 추정값 간 상호 보정 기능이 작동하기 때문에 상대적으로 안정적이라는 평가가 있다. 그러나 여전히 멀티 루트가 극단적으로 중복될 경우 수치적 문제는 남아 있고, 초기 분포가 근 주변을 균일하게 커버하도록 설정해야 한다.

복소 평면에서의 근 분리

고차 방정식이 복소루트를 포함하는 경우, 근 근방의 수치해석은 복소함수 분석 이론도 함께 고려해야 한다. Rouché 정리나 Argument Principle을 이용해 특정 경계 영역 안에 근이 몇 개 있는지 판별할 수 있고, 이를 기초로 영역을 작게 분할하면서 근 탐색을 진행한다. 멀티 루트가 경계 근처에 있으면 경계 부근에서 $f(z)$와 $f'(z)$가 동시에 0에 근접하는 지점이 발생하므로 주의를 요한다.

Stieltjes 폴리곤 접근

일부 고차 방정식에서는 계수나 뿌리의 특정 성질(양의 실수 근 등)을 이용해 Stieltjes 폴리곤 접근으로 근의 존재 범위를 가늠하기도 한다. 이는 근의 절댓값을 위아래에서 제한하는 식으로 활용 가능하며, 멀티 루트가 있으면 그 근들이 무리지어 나타나는 구간이나 원판(disk)을 추가로 설정해 탐색을 좁히기도 한다.

복합 반복 기법과 병렬화

고차 방정식을 여러 해석적, 수치적 기법으로 나누어 처리하는 것이 가능하다. 예컨대 일부 근은 실수영역에서 Muller 방법으로 찾고, 나머지 복소근 후보는 Weierstrass나 Aberth–Ehrlich 같은 전역 근 탐색 알고리즘으로 찾는 식이다. 한편 여러 근을 동시에 추정하는 기법은 CPU 혹은 GPU 병렬 계산과 궁합이 좋아, 고차 방정식을 매우 큰 차수까지 풀어야 하는 경우(예: 고차 다항 근사, 특수 다항식 해석) 적용성이 넓어진다. 멀티 루트 판별이 사전에 끝나 있으면, 분모에 대한 방어코드를 추가해 발산을 막는 식으로 안정성을 높일 수 있다.

고계 도함수를 활용하는 근사 전략

Householder 계열 외에도 고계 도함수를 부분적으로 활용하는 전략이 있다. 예를 들어

xn+1=xn    f(xn)f(xn)[1    αf(xn)2f(xn)f(xn)]x_{n+1} = x_n \;-\; \frac{f(x_n)}{f'(x_n)} \left[ 1 \;-\; \alpha\,\frac{f''(x_n)}{2\,f'(x_n)}\,f(x_n) \right]

같은 식으로, 2차 도함수를 이용하되 계수를 $\alpha$로 조정해 분모가 작아지는 상황을 완화하거나 수렴 속도를 조절할 수 있다. 이때 멀티 루트 근처에서 $f'(r) = 0$, $f''(r) \neq 0$인지를 먼저 판별하고, 필요하면 $f''(r)$가 0인지도 확인해 고차 도함수를 더 고려해야 할 수도 있다.

중근 근방에서의 미분 몫 활용

$f(x)$에 멀티 루트 $r$이 존재하면 $f(r)=0$과 함께 $f'(r)=0$ 등 여러 조건이 생긴다. 이를 별도의 방정식 계(예: $f(r)=0$, $f'(r)=0$, \dots)로 묶어 풀 수도 있다. 다변수 뉴턴 방법(시스템 뉴턴 방법)을 활용해 $r$을 동시에 만족시키는 지점을 찾는 아이디어다. 1차원 스칼라 방정식 접근이 아닌,

{F1(x)=f(x)F2(x)=f(x)\begin{align} \begin{cases} F_1(x) = f(x) \\ F_2(x) = f'(x) \end{cases} \end{align}

을 한꺼번에 풀면, $r$이 중근 이상인 지점에 대해서도 국소적으로 더 빠른 수렴을 보일 수 있다. 단, $f'(r)=0$만 만족하는 가짜 근(= $f(r)\neq 0$)이 같이 잡히지 않도록 주의해야 하며, 고계 미분 조건을 추가해 $f''(r)=0$도 함께 푸는 식으로 실제 차수를 높게 잡은 중복근만 걸러낼 수 있다.

실험 예시 (Octave)

쉘명령

쉘명령 위 예시에서 $(x-1)^2$가 중근 부분이며, 수정 뉴턴 식을 적용해도 $x=1$에 안정적으로 수렴한다. 만일 보통의 뉴턴 식

로 진행하면, 초기값에 따라 수렴 속도가 심각히 저하되거나 심지어 분모가 0에 가까워 발산하는 사례가 나타날 수 있다.

Sturm 순서(Sturm sequence)

고차 다항식의 실근 개수를 구하는 전통적 방법 중 하나가 Sturm 순서를 이용하는 방식이다. 다항식 $p(x)$가 주어졌을 때, Sturm 순서는 다음과 같은 일련의 다항식으로 구성한다.

p0(x)=p(x),pk+1(x)=rem[pk1(x),pk(x)],k=1,2,\begin{align} p_0(x) &= p(x),\\ p_{k+1}(x) &= -\text{rem}\bigl[p_{k-1}(x),\, p_k(x)\bigr],\quad k=1,2,\dots \end{align}

여기서 $\text{rem}[,u(x),,v(x),]$는 $u(x)$를 $v(x)$로 나눈 나머지를 의미한다. 이 순서를 이용해 주어진 구간 $[a, b]$에서 함수 $p(x)$가 갖는 실근의 개수를 (중복도까지 고려하여) 정확히 계산할 수 있다.

Sturm 정리에 따르면, 임의의 점 $x$에서 각 $p_i(x)$의 부호가 어떻게 바뀌는지를 세면, 두 점 $a$, $b$에서의 부호 변동 횟수 차이가 $[a,b]$ 구간 내에 존재하는 근(중복근 포함)의 수가 된다. 멀티 루트가 있을 경우에는 $p(x)$와 $p'(x)$가 동시에 0을 만족하므로, 해당 지점 근처에서 부호 변동 패턴이 다소 특수해진다. 하지만 이론적으로는 Sturm 순서가 중복근도 포함해 똑같이 근 개수를 세어 주기 때문에, 수치 구현 시에만 부동소수점 연산 오차를 주의하면 된다.

Sturm 순서를 활용한 근 분할

실근 전체를 찾고자 할 때는 구간을 점진적으로 이분하며, 각 하위 구간 안에 존재하는 근 개수를 Sturm 순서로 빠르게 검사해서 1개 이상이면 다시 세분화하고, 근이 없는 구간은 배제한다. 이 과정을 반복하면 모든 실근이 들어 있는 작은 구간들을 얻을 수 있다. 멀티 루트가 있으면 근이 축적되는 지점이 발생하므로, 그 구간을 더욱 세밀하게 분할해야 한다. 마지막으로, 각 구간 안에서 뉴턴 방법 등으로 근을 찾으며 초기값을 각 구간의 중간쯤에 두면 안정적인 수렴이 기대된다.

구간 수렴 방식(Interval Newton)

일반적 뉴턴 방법은 점 근방에서 국소적으로 해를 갱신하지만, 구간 수렴 방식을 적용하면 더 정교한 에러 제어가 가능하다. 구간 수렴(Interval Newton) 알고리즘은 각 단계에서

[xn][xn+1][x_n] \mapsto [x_{n+1}]

형태로, $[,x_n,]$이 일정한 폭의 구간이라 할 때, 뉴턴 방정식에 기초하여 갱신되는 구간 $[,x_{n+1},]$을 구한다. 이때

[xn+1]=xnf([xn])f([xn])\begin{align} [x_{n+1}] &= x_n^\star - \frac{f([x_n])}{f'([x_n])} \end{align}

와 같은 아이디어가 쓰이는데, 우변에서 $f([x_n])$와 $f'([x_n])$은 각각 구간 연산을 적용한다. 실제로는 구간 계산을 정밀하게 해야 하며, 멀티 루트 구간이면 $f'([x_n])$에 0이 포함될 가능성이 있어 분모 평가가 까다로워진다. 하지만 구간 수렴 방식은 한편으로 오차를 단조롭게 줄여나가는 성질이 있기 때문에, 고차 방정식을 안정적으로 다루는 방법 중 하나로 꼽힌다.

Routh–Hurwitz 판별

주로 제어공학에서 다항식의 모든 근이 특정 영역(예: 복소평면 왼쪽 절반)에 존재하는지를 판별하는 방식으로 Routh–Hurwitz 판별을 사용한다. 이 판별은 계수 배열로 이루어진 표(Routh 표)를 구성해 그 행렬의 특정 행 요소들의 부호 변화를 관찰한다. 멀티 루트가 발생하면 근이 경계선을 따라 배치되거나, 중복근이 해당 영역 경계에 놓이기도 한다. Routh–Hurwitz 방식은 근 분포에 관한 정성적인 정보를 주지만, 정확한 근을 구하거나 중복 차수를 세는데 직접적이지는 않다. 다만 다항식의 안정성(근이 전부 음의 실수부를 갖는지 등)을 간단히 판별하기에는 유용하다.

Kronecker 방정식 및 Sylvester 행렬

다항식 $p(x)$와 $q(x)$의 곱셈·최대공약수 계산 등은 Sylvester 행렬을 이용해 선형대수 형태로 환원할 수 있다. 멀티 루트가 있으면 $p(x)$와 $p'(x)$의 공약수 차수가 1 이상이므로, Sylvester 행렬의 행렬식(determinant)이 0이 되는 지점이 중근 정보와 직결된다. Sylvester 행렬에서 랭크(rank)가 떨어지는 정도가 곧 공약수 다항식의 차수와 대응한다. 그래서 컴패니언 행렬과 유사한 아이디어로, 각 미분 다항식과 목표 다항식의 Sylvester 행렬을 만들어 특정 조건(행렬식=0, 랭크 결손 등)을 확인하면 멀티 루트를 찾을 수 있다.

수치 GPGPU 활용

최신 수치 해석 환경에서는 대규모 병렬 처리가 가능한 GPGPU(범용 GPU 연산)와 결합해, 많은 초기값 혹은 전체 근을 동시에 갱신하는 전략이 실용화되고 있다. Weierstrass, Aberth–Ehrlich 같은 전역 근 탐색 기법을 대규모 병렬 쓰레드로 분산 실행하면, 차수가 큰 다항식에서도 빠른 시간 내에 모든 근을 근사할 수 있다. 멀티 루트 부분은 계산 과정에서 분모가 작아지거나 근끼리 뭉치는 현상이 발생하므로, 각 스레드끼리 데이터를 공유하며 누락 없이 대처해야 한다.

힐베르트 행렬식과 다항식 안정성

많은 응용에서, 다항식이 특정 도메인(예: 유닛 서클) 안에서 근을 갖는지 여부가 중요하다. 이때 힐베르트 변환이나 다른 복소해석 기법을 빌려 다항식을 사상(mapping)하여, 근의 위치를 간접적으로 판별하기도 한다. 멀티 루트가 있으면 사상된 평면에서 곡선이 겹치거나 접선이 0이 되는 지점이 나타나므로, 이를 추적해 근의 중복도를 추정할 수도 있다. 다만 이런 방법은 이론적으로는 흥미롭지만, 실제 고차식에 적용할 때는 부동소수점 오차가 누적될 수 있으므로 주의해야 한다.

가감승제(加減乘除)에 대한 안정성

수치 방정식 해법의 근간은 결국 사칙연산의 반복이다. 고차식일수록 항의 스케일이 달라서, 뺄셈으로 인해 유효숫자가 급감하는 경우(대칭항 소거)나 곱셈으로 인한 오차 증폭이 발생한다. 멀티 루트와 결합하면 $f'(r)$가 0에 근접하므로, 나누기 연산에서 분모가 작아지는 문제까지 겹친다. 실무에서는 Kahan 보상덧셈 알고리즘처럼 부동소수점 연산의 오차를 보정하는 기법을 적용하거나, 최대공약수 판단 시 정규화 과정을 반드시 거치는 식으로 오차를 줄여야 한다.

중근 근방의 함수 형태 시각화

mermaid로 간단한 함수 그래프 형태를 표현해 보면, 예컨대 $(x-1)^2(x+2)$ 같은 3차식에서 $x=1$은 중근, $x=-2$는 단근이다.

spinner

mermaid 실제로 $x=1$에서는 $f(1)=0$, $f'(1)=0$인 이중근이므로, 곡선이 $x$축에 접하는 형태가 시각적으로도 드러난다.

멀티 루트가 포함된 고차 방정식 예시 (Python)

쉘명령

쉘명령 위 방정식은 $x=1$에서 3차 중근, $x=-2$에서 2차 중근을 동시에 가진 예다. Symbolic Solver를 사용하면, $x=1$과 $x=-2$ 근들이 각각 어떤 차수를 갖는지 쉽게 파악할 수 있다. 실제 수치 접근 시, 이 다항식을 바로 뉴턴 방법에 넣어도 $f'(1)=0$, $f'(-2)=0$으로 인해 분모 0 문제가 발생한다. 따라서 수정 뉴턴이나, deflation을 차수만큼 반복하는 전략, 혹은 여러 초깃값을 두고 분산 탐색하는 기법이 요구된다.

고정소수점 방법과 멀티 루트

함수 $g(x)$를 정의해 $x = g(x)$ 형태로 유도하는 고정소수점 반복 역시 멀티 루트가 존재하면 수렴 거동에 영향을 받는다. 예컨대 $f(x)=0$을 $x = h(f, x)$ 형태로 재구성하여 반복식을 세웠을 때, 멀티 루트 $r$ 근방에서는 $|g'(r)|$가 1 이상으로 쉽게 커질 수 있어 수렴이 어렵다. 따라서 일반적 고정소수점 조건인 $|g'(x)| < 1$을 만족시키는 구간 확보가 까다롭고, 멀티 루트로 인해 $g'(r)=1$ 이상으로 올라가면 반복이 발산하거나 매우 느리게 진행된다. 이를 보완하려면 $g(x)$ 자체를 다른 형태로 재구성하거나, 고차 미분 정보에 기반한 추가 항을 넣어 수렴 영역을 확장하는 방안을 고려할 수 있다.

Arbitrary Precision(임의 정밀도) 활용

고차 방정식이나 멀티 루트가 포함된 경우, 부동소수점 연산 오차가 누적되어 근사 결과가 크게 흔들리기도 한다. 이런 상황에서 GMP, MPFR 같은 임의 정밀도(arbitrary precision) 라이브러리를 사용하면, 필요한 만큼 많은 유효자리수를 동적으로 확보하여 계산 정확도를 높일 수 있다. 다만 임의 정밀도 연산은 속도가 느려질 수 있기 때문에, 대규모 반복을 전부 임의 정밀도로 처리하기보다, 최후의 정밀 보정 단계에서만 임의 정밀도를 사용하는 하이브리드 전략을 쓰기도 한다. 멀티 루트 판별(gcd 방식, $p'(x)$와 동시근 여부 검사 등)을 임의 정밀도로 수행하면, 표준 배정도(double) 연산에서 오는 오차보다 훨씬 안정적으로 중복 차수를 결정할 수 있다.

Tschirnhaus 변환

다항식의 형태를 간단히 만들어 분석이나 수치해석을 쉽게 하려면 Tschirnhaus 변환이 쓰이기도 한다. 예를 들어 $x = y + \alpha$ 같은 선형 변환을 거쳐 특정 차수 항을 없애거나 계수를 단순화하면, 멀티 루트의 존재 여부가 좀 더 명확해질 수 있다. 특히 3차, 4차 방정식까지는 Tschirnhaus 변환으로 근사적으로나마 카르단 공식, 페랭 공식 등을 적용해 닫힌형 해를 구해볼 수도 있다. 하지만 5차 이상 일반 다항식은 해석적 공식이 불가능하므로(Abel–Ruffini 정리), 여전히 수치적 반복법이 필요하다. 멀티 루트라면 변환 전후로 중복 차수가 변하거나, 중복 형태가 달라지지 않는지 주의 깊게 살펴야 한다.

Chebyshev 다항식 접근

근 거동 분석에 Chebyshev 다항식을 연결시킬 수도 있다. 예를 들어, 다항식 근에 대한 최적 근사 다항식이나 최소 편차성을 논할 때 Chebyshev 다항식이 자연스럽게 등장한다. 어떤 고차 다항식을 Chebyshev 계열과 비교하면서, 함숫값의 극대·극소 구조를 파악할 수도 있다. 멀티 루트가 포함되면 극값이 한 지점에 중첩되어 곡선이 축에 접하는 패턴을 관찰할 수 있다. 실제 구현 측면에서는 Chebyshev 다항식의 빠른 재귀 계산 공식을 써서, 근 주변에서 함수값과 도함수를 효율적으로 추정하는 기법을 세우기도 한다.

Laguerre 방법

또 하나의 다항식 근 찾기 알고리즘으로 Laguerre 방법이 있다. 이 방법은 특정 무게함수(weight function)를 갖는 정규화 다항식(Laguerre 다항식)과 직접적인 관련이 있는 것은 아니지만, 유사하게 0차, 1차, 2차 도함수를 포함해 단일 근에 대해 매우 빠른 국소 수렴을 보인다는 점에서 알려져 있다. Laguerre 방법의 반복식은

xn+1=xnnf(xn)f(xn)±(n1)[(f(xn))2nf(xn)f(xn)]\begin{align} x_{n+1} &= x_n - \frac{n \, f(x_n)}{f'(x_n) \pm \sqrt{\bigl(n-1\bigr)\bigl[\bigl(f'(x_n)\bigr)^2 - n\,f(x_n)\,f''(x_n)\bigr]}} \end{align}

형태로 나타난다. $n$은 다항식의 차수이며, 부호 선택은 수렴을 안정화하기 위해서 적절히 고른다. 멀티 루트가 있을 경우, $f''(r)$가 0에 가까울 때 분모 안의 제곱근 항이 작아져서 불안정이 생길 수 있다. 하지만 일반 다항식에서 다양한 초기값에 대해 빠른 수렴을 보이므로, Bairstow나 다른 분할 방법과 결합해 최종적으로 모든 근을 찾는 수단으로 활용하기도 한다.

Berlekamp–Massey 알고리즘과 다항식

원래 부호이론(coding theory) 등에서 주로 쓰이는 Berlekamp–Massey 알고리즘은 다항식 나눗셈과 최대공약수 연산을 빠르게 처리할 수 있는 방법이기도 하다. GF(2) 등 유한체 위에서의 다항식 처리에 주로 적용되나, 실수나 복소수 계수 다항식에도 아이디어를 일부 활용하여 gcd를 구하거나, 반복적 나눗셈을 효율화하는 시도가 존재한다. 고차 방정식에 멀티 루트가 있으면 $p(x)$와 $p'(x)$가 공유하는 인자를 찾는 과정이 gcd 계산에 해당하므로, 이를 빠르게 해내는 정교한 알고리즘이 실제 구현에서 유용하다.

Hermite 결과식(Resultant)

두 다항식 $p(x)$와 $q(x)$의 멀티 루트 여부를 판별하기 위해 Hermite 결과식(resultant)을 사용하는 방식도 있다. 결과식이란, 두 다항식이 공통 근을 가지면 0이 되는 특정 결정값(determinant) 형태이다. $p(x)$, $p'(x)$의 결과식이 0이면 멀티 루트 존재를 알 수 있다. Sylvester 행렬식과 마찬가지로, 수치적으로 결과식을 계산하려면 행렬의 크기가 커질 수 있고, 반올림 오차가 누적될 수 있다. 하지만 심볼릭 연산이 가능할 땐 명확한 판단을 내려주며, 멀티 루트 차수를 결정하는 데에도 도움이 된다(결과식의 계수를 추가로 분석하거나, gcd 계산과 결합).

Galois 이론적 관점

고차 다항식을 이론적으로 연구할 때는 Galois 이론을 이용해 해의 분리 가능성(separability)과 멀티 루트 발생 여부를 논한다. 분리 가능 다항식(separable polynomial)이면 모든 근이 단근이지만, 불분리성(inseparability)이 있으면 멀티 루트가 생긴다. 실수나 복소수 체에서 보통의 다항식은 분리 가능인 경우가 대부분이지만, 특수한 계수나 확장 체에서 불분리성이 등장할 수도 있다. 수치 해석 단계에서는 Galois 이론 자체를 직접 활용하기보다, 이론적 배경을 참고해 멀티 루트 판별 알고리즘을 설계하는 정도로 활용될 수 있다.

미분동방정식 변환

비선형 스칼라 방정식을 풀기 위해, 어떤 경우에는 작은 가상 시간 변수 $t$를 도입해 상미분방정식(ODE) 형태로 바꾸는 방법도 연구된다. 예를 들어

dxdt=f(x)f(x)\frac{dx}{dt} = -\,\frac{f(x)}{f'(x)}

같은 동역학계를 설정하면, $t$가 증가함에 따라 $f(x)=0$을 만족하는 점으로 수렴하도록 설계할 수 있다. 멀티 루트 근방에서는 $f'(x)$가 0에 가깝게 되면서 상미분방정식의 계수항이 폭발하거나, $dx/dt$가 과도하게 커지는 문제가 생길 수 있다. 따라서 수치적으로는 stiff ODE 형태에 가깝게 변해, 별도의 적분 알고리즘 선택이나 단계 크기 조절이 필요하다.

Padé 근사 활용

고차 다항식의 일부 계수나 함수 형태가 알려진 상황에서, Padé 근사 혹은 유리함수 근사를 적용하는 접근도 가능하다. 근사된 유리함수에 대한 근은 분자와 분모의 다항식 근을 함께 해석해야 하며, 멀티 루트가 있는 경우엔 분자와 분모가 공통 인자를 가질 수도 있다. Padé 근사가 정확한 근을 보장하진 않지만, 근방에서 국소적인 근사精度를 높일 목적으로 쓰이기도 하고, 이후 본격적인 다항식 해법에 연결하는 연결고리로 활용할 수 있다.

FFT 기반 다항식 연산 최적화

고차 다항식의 곱셈이나 나눗셈, gcd 계산 등은 FFT(Fast Fourier Transform)에 기반한 고속 다항식 연산 알고리즘으로 가속할 수 있다. 차수가 매우 높은 경우(수백, 수천 차수 이상)에는 FFT 기반 분할 정복 알고리즘이 다항식을 직접 연산하는 것보다 훨씬 빠르다. 이를 이용해 $p(x)$와 $p'(x)$의 gcd를 구하거나, 분할(deflation) 과정을 대규모로 수행할 수 있다. 멀티 루트가 있는 구간을 발견하면, 지역적으로는 수치적인 작은 차수 다항식 접근을 사용하고, 전체적으로는 FFT 최적화를 활용하여 반복 계산 시간을 줄이는 전략을 세울 수 있다.

Jenkins–Traub 방법

고차 다항식의 근을 구하기 위한 전통적 알고리즘 중 Jenkins–Traub 방법이 유명하다. 이 방법은 (1) 분할 단계(정확도가 조금 떨어져도 다항식을 낮은 차수로 분할), (2) 고정 다항식 근 찾기 단계 등으로 이루어진다. 분할 단계에서 기존 근 근사값을 잘못 찾아도 이후 단계에서 적절히 보정하여 궁극적으로 정확한 근을 얻도록 설계되어 있다. 특히 실근·복소근을 가리지 않고 안정적인 수렴 거동을 보여, 수십 차수 이상의 다항식에도 실용적이다. 멀티 루트가 있을 때는 분모가 0 근방으로 가는 문제가 다른 반복법과 유사하게 발생할 수 있으므로, 알고리즘 내부에서 중근을 자동 판별해 추가 보정을 수행한다.

QR 알고리즘 기반 근 찾기

컴패니언 행렬 접근에서 행렬의 고유값을 찾기 위해 QR 알고리즘(또는 다른 고윳값 분해 알고리즘)을 사용할 수 있다. QR 알고리즘은 Hessenberg 혹은 상삼각 형태로 행렬을 점진적으로 정리하며 고윳값을 계산한다. 컴패니언 행렬은 이미 Hessenberg 형태에 가까우므로, 직접 QR 알고리즘을 적용하기에 편리하다. 수치적으로는 $n \times n$ 행렬에 대해 $\mathcal{O}(n^3)$ 시간이 들지만, 다항식이 매우 고차가 아니라면 병렬화 및 고속 선형대수 연산을 활용해 충분히 빠른 해를 얻을 수 있다. 멀티 루트는 고윳값이 중복될 때 나타나며, QR 알고리즘 결과에서 동일 값이 반복되는 형태로 관찰된다. 이때 중근 이상이면 레일리 몫(Rayleigh quotient) 등이 0에 가까워지고, 별도의 정교한 분할 또는 주변 행렬 요소의 수치 안정화 작업이 필요할 수 있다.

Jenkins–Traub vs. QR 고윳값 접근

일반적으로 컴패니언 행렬 + QR 알고리즘 방식은 구현 면에서 표준화된 선형대수 라이브러리를 그대로 활용할 수 있으므로 직관적이다. Jenkins–Traub 방법은 전통적인 1차원 다항식 근 분할 기법을 고도화한 것으로, 구현이 다소 복잡하지만 고차에서도 빠르고 안정적인 특징이 있다. 멀티 루트가 심한 경우 QR 접근은 행렬 조건수 문제, Jenkins–Traub 접근은 분할 단계에서 중근 감지 문제에 부딪힐 수 있다. 따라서 두 방법 중 어느 것이 더 좋은지는 다항식의 계수 조건이나 목표 정밀도, 그리고 구현 편의성 등에 달려 있다.

MPSolve 라이브러리

실수·복소 계수 다항식의 모든 근을 빠르고 정확하게 구해주는 MPSolve(다중 정밀도 솔버) 라이브러리는 Jenkins–Traub 계열, Aberth–Ehrlich 변형 등 여러 알고리즘을 활용하여 고도의 안정성을 보여준다. 임의 정밀도(arbitrary precision)를 지원하기 때문에, 계수의 크기 스케일 차가 극도로 클 경우에도 높은 신뢰도의 해를 얻을 수 있다. 멀티 루트가 있으면 자동으로 해당 근이 같은 위치로 수렴하는 근 추정값들이 등장하고, MPSolve 내부에서는 필요 시 gcd 판별 등을 통해 중복 차수를 추정하기도 한다.

Inverse Polynomial Approaches

고차 다항식의 근을 찾을 때, 직접 $p(x)=0$을 푸는 대신 역다항식

q(x)=xnp(1x)q(x) = x^n p\bigl(\tfrac1x\bigr)

형태로 변환하여, $x=0$ 근방을 해석하는 기법도 존재한다. 큰 크기의 근(절댓값이 매우 큰 실근 혹은 복소근) 대신 역근(절댓값이 매우 작은 근)으로 바꾸면, 반올림 오차 분포가 달라져 안정도가 개선될 수도 있다. 다만 이 변환 과정에서 멀티 루트가 뒤집혀 나타날 수 있으므로, $p(r)=0$에서 $r \neq 0$이면 $q(1/r)=0$이 되고, 루트 차수 또한 그대로 유지되지만 해석 구간이 $r$에서 $1/r$로 바뀌어 검토가 필요하다.

Root Locus와의 연관성

제어 분야에서 전형적으로 쓰이는 Root Locus(근궤적) 기법은 전달함수의 특성방정식을 $1 + K,G(s)=0$ 형태로 잡고, $K$를 변화시키며 근이 복소평면에서 이동하는 궤적을 그린다. $K$ 특정 값에서 중근이 발생하면 근들이 실축 혹은 복소평면 상에서 서로 합류·분기하는 특징을 보인다. 이는 결국 다항식 $p(s)=0$에서 멀티 루트를 갖는 상황과 동일한데, 수치해석적으로는 $p(s)=0$와 $p'(s)=0$가 동시에 만족되는 점에서 파생되는 문제들과 일치한다. Root Locus를 그릴 때도 멀티 루트 지점(분기점)에서는 분모 0, 분자 0이 함께 나타나 오차나 수렴성 문제가 야기된다.

Lagrange 보간 기반 방법

고차 다항식을 명시적으로 표현하지 않고, 여러 점에서의 함수값만으로 보간다음 근을 추정하는 방법도 연구된다. Lagrange 보간다항식으로 근사하고, 근방에서 다항식 형태를 유도해 직접 해를 추정하거나, 구간별로 이진 탐색과 보간을 섞는 하이브리드 기법도 가능하다. 멀티 루트가 포함된 데이터를 보간할 때는, 반복 데이터가 중복되는 지점 근방에서 보간다항식의 기울기가 0에 가까워져 보간 오차가 커질 수 있다. 따라서 보간점 배치 전략이나, 보간 후에 별도의 미분 검사를 통해 중복근을 판별해야 한다.

수치 적분과 근 추정

어떤 경우에는 $\int f(x),dx$나 $f(x)$가 만족하는 편미분방정식을 이용해 역연산적으로 근을 추적하기도 한다. 예를 들어 $\int_{x_0}^{x} f(t),dt = 0$ 형태로 바꾸어 구간 내에서 적분 값의 부호 변화를 토대로 근을 찾을 수 있다. 중근 이상이면 적분 곡선도 접선 형태로 변화가 부드럽게 되어, 근 검출 시 단순 부호 변화가 포착되지 않을 수도 있다. 그래서 구간을 세밀하게 쪼개거나, 적분 함수의 도함수(= $f(x)$)가 0도 되는지 함께 체크해야 멀티 루트를 놓치지 않는다.

초고차(ultra-high degree) 다항식 처리

차수가 수천, 수만에 이를 정도로 극단적으로 높은 다항식도 실무에서는 가끔 등장한다(예: 분광해석, 특수함수 근사 등). 이런 초고차 다항식은 멀티 루트 발생 가능성이 더욱 높아지고, 표준적인 O($n^3$) 알고리즘으로는 계산 불가능에 가깝다. FFT 기반 다항식 나눗셈, 분산·병렬 처리, Galois 확장, 적응형 정밀도 등을 종합하여 근 탐색을 수행한다. 특히 근들이 한 영역에 몰려 있거나(클러스터링), 중복도가 큰 루트가 여러 개 있을 때, 나눗셈과 gcd 연산에서 수치 에러가 폭발적으로 커질 수 있다. 이때 임의 정밀도 라이브러리와 혼합한 하이브리드 병렬 알고리즘이 동원되어야 한다.

Last updated