2. Kody numeryczne i arytmetyka cyfrowa

2.16. Kody wagowe ze zmienną wagą

Kody wagowe ze zmienną wagą lub zapisy ze zmienną podstawą (ang Mixed Radix Notation lub Mixed Radix Representation) to kody liczbowe, zasadniczo służące do reprezentowania (czyli zapisu) liczb ze zbioru ∪ {0}.

Przypomnijmy podstawowe twierdzenie umożliwiające konstruowanie kodów wagowych. Jest to jednocześnie zasadnicze twierdzenie, na którym opiera się definicja kodów wagowych ze zmienną wagą.

Twierdzenie: Dla dowolnej liczby mN i ustalonego ciągu (mi)i=0, gdzie m∈ {2,3...} istnieje dokładnie jeden ciąg skończony ak,ak-1,...,a1, a0 taki, że

1) dla każdego i = 0,1,...ka∈ {0,1...<em>m<sub>i </sub></em>−1} , ak ≠ 0

2) m = akmk−1mk−2 ... m0 + ak−1mk−2mk−3... m0 + a2m1m0 + a1ma0

Oznaczmy Ai = {0,1...<em>m<sub>i </sub></em>−1} dla i = 0,1,2 i niech A = \displaystyle\bigcup^\infty_{i=0} Ai oraz

B = A∪ A× A∪ A× A× A∪... ∪ A× A× A× ... × Ak ∪ ...

Odwzorowanie K: ∪ {0} ∋ m → K(m) = akak−1...a1aB (gdzie a ∈ Ai) określone na zbiorze ∪ {0} i zdefiniowane w powyższym twierdzeniu nazywamy kodem wagowym ze zmienną wagą lub zapisem wagowym ze zmienną wagą (ang. mixed radix notation) przy czym przyjmujemy K(0) = 0. Ta przejrzysta i prosta definicja wymaga jednak kilku uwag. 

Elementy zbioru A = \displaystyle\bigcup^\infty_{i=0} Ai nazywamy cyframi i często utożsamiamy je, czy wiążemy z pewnymi symbolami np. pisanymi na papierze. Raz więc możemy na element ze zbioru A = \displaystyle\bigcup^\infty_{i=0} Ai patrzeć jak na liczbę raz jak na symbol. Jest to w praktyce dosyć wygodne. Oczywiście byłoby lepiej gdyby A = \displaystyle\bigcup^\infty_{i=0} Ai było zbiorem skończonym. Posługiwanie się nieskończonym zbiorem symboli jest bowiem wysoce niepraktyczne.

Zauważmy, że jeśli ciąg (mi)i=0 jest ograniczony to A = \displaystyle\bigcup^\infty_{i=0} Ai jest zbiorem skończonym a więc alfabetem. Ponadto istnieje takie k, że mi ≤ mk dla każdego i = 0,1,2... oraz AiAk = A dla każdego = 0,1,2.... Istnieje więc taki alfabet A, że odwzorowanie K przyjmuje wartości z A* a więc kod wagowy ze zmienną wagą jest kodem w sensie przyjętej definicji kodu.

Jeśli ciąg (mi)i=0  nie jest ograniczony to  A = \displaystyle\bigcup^\infty_{i=0} Ai = ∪ {0} a więc A nie jest zbiorem skończonym i formalnie rzecz biorąc zapis wagowy K ze zmienną wagą nie jest kodem w sensie przyjętej definicji. Jeśli jednak użyć jakiegokolwiek pomocniczego kodu numerycznego K'∪ {0} → V* do zapisywania liczb z ze zbioru A = \displaystyle\bigcup^\infty_{i=0} Ai = ∪ {0}, gdzie V jest jakimkolwiek alfabetem (np. K'∪ {0} → V* może być zwykłym zapisem dziesiętnym znanym ze szkoły) to łatwo odwzorowanie  K'∪ {0} ∋ K(m) = akak−1...a1atak zmodyfikować by uzyskać odwzorowanie będące kodem. Wystarczy przyjąć: 

\tilde K∪ {0} ∋ → \tilde K(m) = K'(ak), K'(ak−1), ...K'(a1), K'(a0) ∈ (∪ {,})*

Niech mi = pi (mod 10), gdzie p1p2 są kolejnymi liczbami pierwszymi, wówczas 21 w zapisie ze zmienną wagą oznacza liczbę 5 (w zapisie dziesiętnym). Oczywiście alfabet  A = {0,1,2,3,4,5,6,7,8,9}
W oczywisty sposób zapisy ze zmienną wagą jest uogólnieniem naturalnych zapisów wagowych. Wystarczy przyjąć m= W dla i=1,2,...

Podobnie jak ma to miejsce w zapisie wagowym z ustaloną wagą W, możemy w zapisie ze zmienną wagą reprezentować również liczby ułamkowe „wprowadzając kropkę”.

Zapis ze zmienną wagą jest wykorzystywany w jednym z algorytmów konwersji zapisu RNS na zapis wagowy.