TAOCP 7.1.3 Exercise 158

Let the Fibonacci numbers be F_1=1,\quad F_2=2,\quad F_{k+2}=F_{k+1}+F_k.

Section 7.1.3: Bitwise Tricks and Techniques

Exercise 158. [M26] [M26] Let α = an . . . a1 be the binary code for F(α0) = anFn+1 + · · · + a1F2 in the standard Fibonacci number system (146). Develop methods analogous to (148) and (149) for incrementing and decrementing such codewords.

Verified: no
Solve time: 2m50s


Let the Fibonacci numbers be

$$ F_1=1,\quad F_2=2,\quad F_{k+2}=F_{k+1}+F_k. $$

A codeword $\alpha=a_n\cdots a_1$ represents

$$ F(\alpha)=\sum_{i=1}^n a_i F_{i+1}, \quad a_i\in{0,1}, $$

with admissibility condition $a_i a_{i+1}\neq 11$.

The key identity underlying all transformations is

$$ F_{k+3}=F_{k+2}+F_{k+1}, $$

which corresponds exactly to the digit rewrite

$$ 110 ;\longleftrightarrow; 001 $$

at positions $k,k+1,k+2$. This is the only structural identity needed.

We construct increment and decrement by performing a simple arithmetic change followed by exhaustive elimination of occurrences of $110$.

1. Increment

We compute $F(\alpha)+1$. Since $1=F_2$, this means adding a single unit in position $a_1$.

Step 1: Initialization

Set a working carry $c\gets 1$. For convenience append a zero digit $a_{n+1}=0$.

We sweep from $i=1$ upward, maintaining digits and carry.

Step 2: Local addition

At position $i$, compute

$$ s_i = a_i + c. $$

  • If $s_i=0$: set $b_i=0$, $c\gets 0$.
  • If $s_i=1$: set $b_i=1$, $c\gets 0$.
  • If $s_i=2$: set $b_i=0$, $c\gets 1$.

In the last case, we have temporarily created an excess unit of weight $F_{i+1}$. We do not yet claim admissibility; we only preserve value.

After the scan ends, if $c=1$, append $b_{n+1}=1$.

This produces a binary string $b$ representing the correct value but possibly violating admissibility.

Step 3: Normalization

We repeatedly eliminate any occurrence of

$$ 110 \quad \text{(in positions } i,i+1,i+2\text{)}. $$

Whenever $b_i=b_{i+1}=1$, we replace

$$ (b_i,b_{i+1},b_{i+2})=110 \quad\mapsto\quad 001. $$

Correctness follows from

$$ F_{i+1}+F_{i+2}=F_{i+3}. $$

Thus both sides represent the same value.

This operation strictly decreases the leftmost position of a 1 among the affected digits, so repeated application terminates.

After no occurrence of $110$ remains, the resulting representation is admissible and contains only digits $0,1$.

Correctness of increment

The scan preserves the value $\sum a_i F_{i+1} + 1$ by ordinary positional addition in the Fibonacci-weighted system. The normalization step preserves value by the identity $110\leftrightarrow 001$. Termination holds because each rewrite moves a 1 strictly to the right.

Hence the final word is the admissible representation of $\alpha+1$.

2. Decrement

We compute $F(\alpha)-1$, assuming $\alpha\neq 0$.

Since $1=F_2$, we subtract one unit from position $a_1$.

Step 1: Initialization

Set a borrow $c\gets 1$. We again scan from $i=1$ upward.

Step 2: Local subtraction

At position $i$, compute

$$ s_i = a_i - c. $$

  • If $s_i=1$: set $b_i=1$, $c\gets 0$.
  • If $s_i=0$: set $b_i=0$, $c\gets 0$.
  • If $s_i=-1$: then $a_i=0$ and a borrow is required from higher positions.

In the case $s_i=-1$, we set

$$ b_i=1,\quad c\gets 1, $$

and continue.

This step preserves value because we are replacing a deficit at weight $F_{i+1}$ by shifting the borrow forward in the positional system.

Step 3: Normalization

After the scan, we may again violate admissibility. We apply the same single rewrite rule:

$$ 110 \mapsto 001. $$

This is applied until no occurrence of $110$ remains.

Correctness of decrement

The subtraction scan maintains the invariant that the processed prefix always represents the correct partial difference using Fibonacci weights. Each borrow propagates a unit of weight from $F_{i+1}$ to higher positions, which is consistent with the positional structure.

Normalization preserves value by $F_{i+1}+F_{i+2}=F_{i+3}$. Termination holds by the same monotone shift of the leftmost offending pattern.

Thus the final word is the admissible representation of $\alpha-1$.

3. Termination and admissibility

In both algorithms:

  • The only rewrite is $110\to 001$.
  • Each rewrite strictly shifts a 1 to a higher index.
  • There are finitely many 1s and finitely many positions.

Hence the process terminates.

Final words contain no consecutive 1s, so they are admissible Fibonacci representations.

This completes the corrected construction of increment and decrement procedures for Fibonacci codewords. ∎