國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
4-7 Rule2: Distributive Law
在實數的運算中,*對於+滿足分配律,因此我們能利用分配律的反向 提出一些 terms 共有的元素。如 a*b1+a*b2 中,a 為 alice 變數,b1 和 b2 為 bob 變數,兩個 terms 皆含有 a 變數可提出。使用分配律的反向去處理這個式 子,將 a 從兩個 terms 提出,能使 a*b1+a*b2 = a*(b1+b2) 。
Term 因為是 factors 的連乘,若僅用乘法的交換律和結合律來降低 smc_mul 的數量,如 4-5 所推算會因 atomic 運算元的數量而有極限。接著利用 cost calculating 算出每個 term 所必須消耗的 smc 乘法,若大於 0 代表這個 term 是 shared term,若等於 0 是 local term。Expression 是這些 terms 的連加,
若僅用加法的交換律,shared terms 的數量 N 也使得串連這些 terms 的 N-1 個 smc 加法無法降為 local 運算。
交換律因為可以提出 terms 中共有的元素,有機會使 terms 降低乘法數 甚至是將 shared term 降為 local term。如 a*b1+a*b2 中,兩個 terms 皆需要耗 費一個 smc_mul 來跟 a 相連,運算耗費在 cost calculating 計算後皆為 1。而 兩個 shared terms 之間的相加也必須是 smc_add,所以整個 expression 消耗 的運算是兩個 smc_mul 和一個 smc_add.權重皆為 1 下總耗費是 3。反向的 分配律提出共同元素 a 後,因為 a*b1+a*b2 = a*(b1+b2),使得 expression 變 成 a*(b1+b2)。原本兩個 terms 提出 a 後各剩下 b1 和 b2,運算耗費也從 1 變 成 0,代表從 shared terms 降為屬於 bob 的 local terms,也讓它們之間的加法 變成 local 運算。而提出來的 a 和 smc_mul 因為是共同元素,在分配律下讓兩 個 term 共用而僅消耗一個 smc_mul。因此整個 expression 在 smc_add 變成 local 運算,以及兩個 smc_mul 提出 a 後變成共用一個 smc_mul 後,會將耗費 從 3 降為 1。
4-8 Rule2: Distributive Law 流程
在 smcSL 的編譯器實作中,系統會遵循圖 4-10 的流程來進行分配律的 優化,以確保每個步驟都是能減少運算耗費而不會做白工甚至劣化。舉
(a+b)*(a+b)+a 為例,原式已經依照乘法公式的和平方將繁複的計算簡化,容易
36
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
讓使用者直覺的將此式寫入。但經過編譯器 Rule2 的流程,可以利用分配律改 變原式而不影響結果,再減少一個 smc。
首先是將原式紀錄運算耗費後正規化,展開乘法公式的和平方,並用 Rule1 交換律和結合律優化發現運算耗費並沒有比原式好。接著依照圖 4-10 的 Rule2 流程,從 Step1 到 step5 共五個步驟。每個步驟皆保證執行後有效益,
在下個章節會分析原因,這邊先以介紹編譯器執行流程為主。
圖4-10 分配律處理流程
Step1 先找出可提出的 factors,條件是必須存在於兩個以上的 terms,
符合條件的 factor 我們給他代號 x。在例子中的 a 因為存在於四個 terms 中,
符合條件將其設為此 round 的 x,接著將含有 x 的 terms 和未含有 x 的 terms
37
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
分成兩群。
圖4-11 Ts 和 Tp 符號定義
Step2 開始針對含有 x 的 terms 做處理,由於在 rule1 時有用過交換律排 序,所以含有 x 的 terms 只要 inverse 就會依循 Shared, Bob, Alice 的順序。在 這個步驟編譯器主要是針對 shared terms 即圖 4-11 中的 Ts,亦即整個 term 的運算耗費大於 0,去嘗試提出元素 x(在這個例子裡是 a)。若如例子中的兩個 terms: a*b 取出 a 後,terms 的內容變成 b,運算耗費從 1 變成 0 代表這次分配 律對此 term 有效果。若如將 a*a*b 這種 shared term 提出 a 後,term 的內容變 成 a*b,運算耗費從 1 變成 1 代表沒有效果。最後如圖 4-12,有效果的 terms 提出 x 後並集合在一起成為 inner terms(Ti),沒有效果的維持原狀並與不含 x 的 terms 合稱 outer terms(To)。
圖4-12 Ti 和 To 符號定義
Step3 的 Alice 和 Bob 合稱 private terms(圖 4-13),因為他們原本的運 算耗費已經為 0,所以就算將 x 提出來也無法減少運算耗費。例子中的 private terms 是 a 和 a*a,這兩個 terms 在提出 a 後分別變成 1 和 a,運算耗費仍為 0。
因為 private terms 不管有沒有提出 x 都是 local 運算可以處理,所以我們要擴 大到整個 expression 來決定該 private term 要不要加入提出 x 的 inner terms 中。
因為每個 private term 有自己所屬的 party,例子中的 private terms: a 和 a*a 的所屬 party 皆為 Alice。所以 Step4 先去檢查目前 outer terms 有沒有 包含 level 是 Alice 的 terms,若有同類型的群聚,將 Tp 和 To 合併。另一方面 Step5 則檢查 Ti 有沒有包含 level 是 Alice 的 terms,若有則讓 Tp 先提出 x 成
38
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
為 Tp’,再與 Ti 合併。而 Step4 和 step5 只能選擇測試結果為 true 的執行,因 為 true 代表 Ti(或 To)能用同類聚集使 Tp 的加法 local 化。此例中的 outer terms 為 b*b、a1,其中 a1 的 level 是 Alice 使得 To.include? Party 為 true,Ti 為 b 和 b 使得 Ti.include?Party 為 false。兩個 step 一個為 true 一個為 false,
所以 a 和 a*a 選擇 true 那條和 To 合併成(a1+a+a*a)+b*b 使得 a 和 a*a 不用耗 費 smc 就可以合併。
整個流程分成對 shared terms 和 private terms 的處理,我將會以分析 A 和分析 B 在後面章節解釋為何這樣處理。以虛擬語法樹的變化分析為何每一個 步驟都是往更加優化的方向前進,將本來屬於 smc 的運算子降成 local 運算子 以提升效率。
圖4-13 Private term 定義