斐波那契编码
Template:NoteTA 斐波那契編碼(Fibonacci coding)是一種僅使用兩種符號(0和1)表達數值的Template:Link-en[1]。這種編碼是基於斐波那契數來表達整數的一個例子。這種編碼皆以「11」為結尾,並且在結尾之前不會出現連續2個1。
斐波那契編碼與齊肯多夫表述法密切相關。齊肯多夫表述法是一種基於齊肯多夫定理的进制系統,並且也具有不連續使用兩個1的特性。特定整數的斐波那契編碼正是數字順序顛倒的齊肯多夫表述法,並在末尾附加了一個額外的“1”。
定義
對於一個數字,若代表在斐波那契編碼中的Template:Link-en,則有:
其中Template:Math為第Template:Math個斐波那契數,因此Template:Math是第Template:Math個相異的斐波那契數。最後一位為始終是1的附加位,並且不攜帶位置值。
可以看出,這樣的編碼是唯一的,並且在任何碼字中唯一出現的“11”是在末尾,即d(k−1)和d(k)。倒數第二位是最高有效位,第一位是最低有效位。許多进制可以省略前導零,如十进制,然而斐波那契編碼的前導零不能省略。
下面顯示了前幾個斐波那契編碼,以及其所謂的隱含概率,即對所有在斐波那契編碼中有最小碼值的數字而言的值。
| 數字 | 斐波那契表述法 | 斐波那契編碼 | 隱含概率 |
|---|---|---|---|
| 1 | Template:進制 | 1/4 | |
| 2 | Template:進制 | 1/8 | |
| 3 | Template:進制 | 1/16 | |
| 4 | Template:進制 | 1/16 | |
| 5 | Template:進制 | 1/32 | |
| 6 | Template:進制 | 1/32 | |
| 7 | Template:進制 | 1/32 | |
| 8 | Template:進制 | 1/64 | |
| 9 | Template:進制 | 1/64 | |
| 10 | Template:進制 | 1/64 | |
| 11 | Template:進制 | 1/64 | |
| 12 | Template:進制 | 1/64 | |
| 13 | Template:進制 | 1/128 | |
| 14 | Template:進制 | 1/128 |
將一個整數N編碼為斐波那契編碼的方法為:
- 找到小於或等於Template:Math的最大斐波那契數,並且用Template:Math減去這個斐波那契數,並記錄剩餘的數
- 如果減去的這個數為為第Template:Math個斐波那契數Template:Math,置1到Template:Math的位置(將最左邊的數字視為位置0)。
- 將Template:Math替換為剩餘的數,並重複步驟1~2直到剩餘的數為0
- 在最右邊加一個「1」
要解碼斐波那契編碼,請刪除最後的「1」,將剩餘的位數分配給1,2,3,5,8,13...(斐波那契數),並將位數為「1」的斐波那契數加總。
與其他通用編碼的比較
斐波那契編碼有一個有用的特性,有時它與其他Template:Link-en相比更具吸引力:斐波那契編碼是Template:Link-en的一個示例,可以更容易地從損壞的資料流中恢復數據。對於大多數其他Template:Link-en,如果單個位元被更改,則其後的任何數據可能無法被正確讀取。另一方面,對於斐波那契編碼,更改位元可能會導致一個字詞(token)被讀取為兩個,或者導致兩個字詞被錯誤地讀取為一個,但從資料流中讀取“0”能阻止錯誤進一步傳播。由於唯一沒有“0”的資料流是“11”字詞的資料流,因此單個位元錯誤損壞的資料流與原始資料流之間的總編輯距離最多為3。
在這種使用符號序列進行編碼的方法中,可以自由推廣其中某些不允許存在的模式(如“11”)。[2]
例子
下表展示了整數65編碼到斐波那契编码為Template:進制的具體內容,表示Template:計算結果。不使用前兩個斐波那契數Template:Math和Template:Math,且末尾必定會加上一個「1」。
斐波那契进制
斐波那契进制(Fibonaccimal Base)是與黃金进制關係緊密的計數系統。它只用0和1表示數,每個數位的位值對應斐波那契數[3]。和黃金进制一樣,其標準形也不連續使用兩個1。如:
- 30 = 1×21 + 0×13 + 1×8 + 0×5 + 0×3 + 0×2 + 1×1 + 0×1 = Template:進制
斐波那契进制與齊肯多夫表述法非常接近,斐波那契进制僅比齊肯多夫表述法末尾附加了一個額外的“0”。
由於最末位始終為零,因此有時會將之省去[3],而省去後的結果則與齊肯多夫表述法相同[4]。