基数変換アルゴリズムの妥当性の証明

アルゴリズム数学

mm桁のAA進数α\alphaは、


α=k=0m1akAk,ak=αAkmodAより\alpha = \sum_{k=0}^{m-1} a_k A^k, \quad a_k = \left\lfloor \frac{\alpha}{A^k} \right\rfloor \bmod Aより
α=k=0m1(αAkmodA)Ak\alpha = \sum_{k=0}^{m-1} \left( \left\lfloor \frac{\alpha}{A^k} \right\rfloor \bmod A \right) \cdot A^k

と表される。


同様に、nn桁のBB進数β\betaは、


β=k=0n1(βBkmodB)Bk\beta = \sum_{k=0}^{n-1} \left( \left\lfloor \frac{\beta}{B^k} \right\rfloor \bmod B \right) \cdot B^k

と表される。


値は等しいので、


k=0m1(αAkmodA)Ak=k=0n1(βBkmodB)Bk=α\sum_{k=0}^{m-1} \left( \left\lfloor \frac{\alpha}{A^k} \right\rfloor \bmod A \right) \cdot A^k = \sum_{k=0}^{n-1} \left( \left\lfloor \frac{\beta}{B^k} \right\rfloor \bmod B \right) \cdot B^k = \alpha

よって


α=k=0n1bkBk\alpha = \sum_{k=0}^{n-1} b_k B^k

kkを改めてjjに置き換えると、


α=j=0n1bjBj\alpha = \sum_{j=0}^{n-1} b_j B^j

k{0,1,,n1}\forall k \in \{0, 1, \dots, n-1\} について、右辺をBkB^kで括ると、


α=Bkj=0n1bjBjk\alpha = B^k \cdot \sum_{j=0}^{n-1} b_j B^{j-k}

両辺をBkB^kで割ると、


αBk=j=0n1bjBjk=j=0k1bjBjk+j=kn1bjBjk\frac{\alpha}{B^k} = \sum_{j=0}^{n-1} b_j B^{j-k} = \sum_{j=0}^{k-1} b_j B^{j-k} + \sum_{j=k}^{n-1} b_j B^{j-k}

この値を床関数で切り捨てると、


αBk=j=0k1bjBjk+j=kn1bjBjk=0+j=kn1bjBjk\left\lfloor \frac{\alpha}{B^k} \right\rfloor = \left\lfloor \sum_{j=0}^{k-1} b_j B^{j-k} + \sum_{j=k}^{n-1} b_j B^{j-k} \right\rfloor = 0 + \sum_{j=k}^{n-1} b_j B^{j-k}

ただし bjBjkb_j B^{j-k}BB の倍数なので、右辺に modB\bmod B を作用させると、


αBkmodB=(j=kn1bjBjk)modB=bk\left\lfloor \frac{\alpha}{B^k} \right\rfloor \bmod B = \left( \sum_{j=k}^{n-1} b_j B^{j-k} \right) \bmod B = b_k

したがって、BB進数における各桁 bkb_k の計算公式は、


bk=αBkmodB\boxed{b_k = \left\lfloor \frac{\alpha}{B^k} \right\rfloor \bmod B}