Hornor's method와 현가계수
보통 현재 현금의 미래가치를 계산하기 위해서는 이자율을 거듭하여 곱합니다.
이자율이 일정할 때, 다음과 같은 식이 됩니다.
\[FV(x, t, r) = \sum^{t}_{i=1} r^{i-1} x\]\(t\)기간 동안의 각 기간동안 \(x\)원을 받을 때의 미래가치는 남은 기간만큼 이자율 \(r\)을 거듭제곱하여 구할 수 있습니다.
반대로 미래 현금의 현재가치는 할인율을 거듭하여 곱하여 구합니다.
\[PV(x, t, r) = \sum^{t}_{i=1} \frac{1}{r^i} x\]위 식은 모든 항의 계수가 \(x\)로 동일한 \(t\)차 다항식의 \(f(r)\)값을 구하는 것과 같고, naive하게 계산할 경우 \(O(t^2)\)의 시간이 소요됩니다.
하지만 Hornor's method
를 적용하면 이를 \(O(t)\)로 줄일 수 있습니다.
계산 방식은 다음과 같습니다.
double pv(double x, int t, double r) {
double v = 0;
for (int i = t; i >= 1; i--)
v = (v + x) / r;
return v;
}
여기서 더 나아가서, 각 기간동안의 수령액이 다르고, 이자율 또한 다른 경우에도 위 방식을 그대로 적용할 수 있습니다.
double pv(double x[], int t, double r[]) {
double v = 0;
// 할인된 가치를 구하기 위해서는 역순으로 더해야 함
for (int i = t; i >= 1; i--)
v = (v + x[i]) / r[i];
return v;
}
뭔가 특별한 기법인 것 같아보이지만 실은 지극히 단순한 캐싱의 일종입니다. 참고로 위 방식을 쓰면 손가락으로 계산기를 누르는 횟수를 줄이는 것은 물론, 다항식의 각 항이 지나치게 작아지는 것을 막음으로서 부동소수점 오차를 줄일 수 있다는 장점도 있습니다. 재무관리 수업을 듣다 이 내용이 나와서 지금껏 배운 내용을 복습해볼 겸 정리해 보았습니다.