原始的高斯消去法複雜度為𝛰(𝑛
3
),造成在越大的矩陣中所需的時間與 空間複雜度相對的要高出許多,在分析與改進高斯消去法執行時間前,事 先我們有對矩陣的狀況做評估數據以矩陣密度 1 的平均個數為主,首先在 因數分解法中所生成矩陣只有 0 與 1 兩種元素且平均矩陣密度相當稀疏,這也觸發我們將矩陣以大整數做排序的起因,排序的精神在於已經排好的 整數以二進位檢視已有高斯消去法上三角矩陣的雛形可減少搜尋的動作。
表 4.1. 0-1 矩陣密度統計
𝑛 密度 1 的平均個數 平均 FB size 平均
矩陣大小
64 bits 0.0090180491 386 207 42849
96 bits 0.0026310968 1633 788 620944
128 bits 0.0007094253 6835 3104 9634816
一開始所得到的數列,因為是正整數可先以 quick sort 將數列做排序由 大到小,因為由二次篩選法所篩選出的矩陣無法預測數列大小故以平均速 度最佳的 quick sort 實作,且 quick sort 無資料相依問題可以多執行緒概念 做加速,此時可得複雜度為𝑛log𝑛。我們將每次迴圈內的 exclusive or 定義 為
𝑛
32
因為以大整數宣告故可以減少 32 倍的運算量,由於矩陣的密度稀疏可 將 exclusive or 的平均次數定義為𝑚因為透過前面的 sorting 會使搜尋的次數 減少,於是便只要處理矩陣中有 1 的部分使 exclusive or 平均次數為𝑚而36
37 𝑛 2 −𝑛
2
+ 𝑛log𝑛 + 𝑚(𝑛 − 1) .32 𝑛
/ + 𝑚log𝑚(𝑛 − 1),在複雜度中我們看最高項 次,但因為𝑚的部份因一開始估計𝑚 < 𝑛在此不確定𝑚的大小是否小到可忽 略的程度於是便以實際程式觀察他的平均值。圖 4.3. m 與 n 的實際走勢圖
在實驗中我們去對因數分解所得到的矩陣統計𝑛的大小由 1691 至 12000 的矩陣中 exclusive or 的平均次數,由表可得在𝑛逐漸增加的同時,𝑚 相對會逐漸降低,雖然小但未足以能夠將其忽略,在分析的同時把𝑚視為 一個常數倍的𝑛,常數為約為 0.25 以下隨著𝑛變大而變小,並試著用更大的 𝑛觀察,當𝑛 = 8 62
、
𝑛 = 12 時,它的走勢是下降的,𝑚分別為 0.232𝑛、0.226𝑛,故在此將演算法的原式𝑚(𝑛 − 1) .
32 𝑛
/變更為 .25𝑛(𝑛 − 1) .32 𝑛
/而得 到 . 78𝑛3
− . 78𝑛2
。最後分析將複雜度式子改寫為 . 78𝑛3
+ 𝑛2
( .4922 + .25(log .25𝑛)) + 𝑛(log𝑛 − .5 − .25(log .25𝑛)),與原始的高斯消去法 2𝑛3
比較 後有所降低,實際程式執行時間為下降 56.32%,其差別便在原始的高斯為 2 倍的𝑛3
而改進後的高斯消去法為𝑛3
加上常數倍的𝑛2
與常數倍的𝑛,並以此112bit 128bit 144bit 160bit
n 1691.00 3104.00 8062.00 12000.00
m 419.37 748.06 1870.38 2712.00
0.00
5000.00
10000.00
15000.00
38
數據將理論值與實際秒數走勢表示出來,圖中理論值以等比例將數據調整 以便於與實際秒數做比較,由圖可看出理論的走勢與實際秒數的走勢相符 合,最後以此得複雜度的分析方向正確並可得在解更大的高斯消去矩陣有 著同樣的效果。
圖 4.4. sort gauss、gauss 的理論與數據走勢圖
實驗初期排序的部份都是以快速排序法實作,但因為實驗數據走勢圖 與理論不合,在經過演算法與數據上的分析後發現,除了 exclusive or 後的 數以外,其餘皆為有序數列;如此會使得快速排序的結果為最差情況不會 是原先所想到(𝑛log𝑛 + (𝑛 − 1)log(𝑛 − 1) + ⋯ + 2log2),反而導致複雜度 式子為(𝑛
2
+ (𝑛 − 1)2
+ ⋯ + 22
),才會有效能不如預期的情況發生,所以 才有之後插入排序法的引入並在最後提出上述的大整數排序的高斯消去演 算法流程圖,實驗中因快速排序法無資料相依問題已經做多執行緒的實現 但效益不為明顯所以未將此概念加入分析中。數列的排序法還有很多,實 驗中只用到了兩種排序法,其餘排序法中的筒排序法與基數排序法皆有分80bit FB_size:492
96bit FB_size:975
112bit FB_size:1691
128bit FB_size:3104
sort gauss 實驗數據
gauss 實驗數據
sort gauss 理論比值
gauss 理論比值
39
群概念,若有分群的方法就有可做平行處理的基準,有機會可將高斯消去 法平行處理實現的可能。