2008/02/25

Generalised Horner's Rule

Horner's rule 是用來快速核算多項式代值的方法,AoP 第三章把這個規則推廣到一般的 inductive datatypes。一題練習要我們證明稍微推廣的版本:

不過我們還是先把所有的抽象符號具現化為多項式求值的特例,看看它說了什麼。令

  • f a = h a = a * x
  • F (A, X) = 1 + A * X 是 cons-lists 的 base functor;
  • g (x, y) = x + y(這裡省略 base case)。
那麼把一個 input list
[a0, a1, a2, ..., an]
丟進 tri f,就會得到多項式的各項
[a0, a1 * x, a2 * x2, ..., an * xn]
再經過 ([ g ]) 把各項加起來,就得到
a0 + a1 * x + a2 * x2 + ... + an * xn
Horner's rule 告訴我們這兩段動作其實可以融為一段,只要
f 0 = 0 * x = 0
而且
f (g (a, b)) = (a + b) * x = a * x + b * x = g (f a, f b)
就可以改用
a0 + (a1 + (a2 + ... (an + 0) * x ...) * x)
這個順序核算。

雖然我目前覺得抽象化之後很難把「前提的意義」和「前提如何使 fusion 成功」說清楚,但至少這提供一條可以套的規則 ─ 不懂沒關係,先用就是了。

--
沒有人想一起玩喔…?保證很好玩啦…

Labels:

Blogger Fall2/26/2008 1:04 am 說:

請問 那個圖書中 tri f 和 id 是啥咪呀 O_O?

 
Blogger Josh Ko2/26/2008 5:16 am 說:

tri f 在 lists 上的非正式的定義是把 [a_0, a_1, a_2, ..., a_n] 變成 [a_0, f a_1, f (f a_2), ... f^n a_n]。這可以寫成一個 fold:如果 input list 是空的就不做任何事;如果可以拆成 head 和 tail 就把 tri f tail 的每個元素再套一次 f,然後和 head 接在一起。用 category theory 的方式寫,就是對資料結構的遞迴處(base functor F 的第二個參數)套 T f,然後用那個資料結構的 constructor \alpha 全部組合起來。

id 就是 identity function。

 

<< 回到主頁