Pozycyjny system zapisywania liczb uchodzi za największe osiągnięcie matematyki
w ogóle – arytmetyczny odpowiednik wynalezienia koła.
Łatwość prowadzenia rachunków niewątpliwie popchnęła cywilizację do przodu.
Tzw. działania pisemne są prawdopodobnie pierwszymi abstrakcyjnymi
algorytmami, jakie współczesny człowiek poznaje w swoim życiu!
Dla (zbyt) wielu ludzi może to być główne skojarzenie
z hasłem „matematyka”.
Pomimo tego wzniosłego wstępu Czytelnik może mieć wrażenie, że zapis pozycyjny
nie kryje w sobie żadnych wielkich tajemnic. Mamy 10 symboli (cyfr) dla liczb
od do i kolejne wartości w zapisanym ciągu (czytając od prawej)
mnożymy przez kolejne potęgi liczby (podstawy systemu):
itd. Możemy wprawdzie wybrać inną
podstawę niż powszechnie stosowane 10 i otrzymać nieco mylące zapisy,
np. 101 oznaczające 5 w systemie binarnym (o podstawie 2) lub
(liczba w indeksie dolnym oznacza podstawę systemu), ale co to za ciekawostka…
Oprócz samej znakowej reprezentacji liczb, wraz ze zmianą podstawy
zmieniają się także charakteryzacje podzielności. Na przykład w systemie szóstkowym
podzielność jakiejś liczby przez 5 jest równoważna podzielności sumy
jej cyfr przez 5.
W systemie dziesiętnym działa tak trójka i dziewiątka. Zawsze „największa cyfra”
jest związana z cechą podzielności, ponieważ
suma cyfr przy podstawie przystaje do samej liczby modulo :
Oznacza to,
że przejście do sumy cyfr zachowuje nie tylko samą podzielność,
ale ogólniej – resztę z dzielenia.
Uniwersalny schemat występuje również dla dzielącego :
aby sprawdzić podzielność przez sprawdzamy podzielność liczby złożonej
z ostatnich cyfr (czyli cyfr najmniej znaczących).
„U nas” tę własność wspomina się głównie dla i
Szczególnym przypadkiem jest także podzielność przez potęgi 10 (zauważmy, że
nie ma tu znaczenia podstawa, czyli to, ile właściwie wynosi „”).
Istnieje więcej interesujących cech podzielności związanych z zapisem
dziesiętnym (np. liczba jest podzielna przez 11, gdy różnica sum cyfr na parzystych
i nieparzystych pozycjach jest podzielna przez 11) i pewnie jeszcze więcej przy innych
podstawach, ale wcale nie o tym jest ten artykuł.
Wybór podstawy systemu zmienia też radykalnie sytuację zapisu liczb niecałkowitych.
Jak wiadomo, rozwinięcie liczby wymiernej jest skończone wtedy i tylko wtedy,
gdy mianownik dzieli dla pewnego W przeciwnym wypadku jest
nie skończone, ale okresowe (od pewnego miejsca). Ponieważ podstawa dziesięć
jest uboga w dzielniki pierwsze (choć mogło być gorzej), takie
podstawowe liczby jak lub mają brzydką postać
dziesiętną. W systemie szóstkowym małe ułamki proste przyjmują postać
Nie mamy skończonego rozwinięcia ale być może dzielenie
czegoś na pięć części byłoby o wiele mniej modne, gdybyśmy nie
używali systemu dziesiętnego… Nie będziemy się tu jednak
rozwodzić nad wyborem podstawy systemu.
Uniwersalną wadą systemów o innej podstawie
niż 10 jest problem z odczytywaniem (nazywaniem) tak zapisanych liczb
– dziesiętny zapis zakorzenił się bardzo mocno w znacznej
części współczesnych języków.
To było przypomnienie podstawowych faktów o normalnych systemach
pozycyjnych, w których cyfry reprezentują możliwe reszty z dzielenia przez
całkowitą podstawę czyli wartości
Liczby ujemne oznaczamy dodatkowym znakiem minus.
Poza takimi prostymi uogólnieniami systemu dziesiętnego istnieją warianty
nieco bardziej oryginalne, i to właśnie im się przyjrzyjmy.
Informatycy z pewnością kojarzą „kod uzupełnień do dwóch”, powszechnie
stosowany do reprezentacji liczb całkowitych w komputerach. Ustalamy liczbę cyfr
(bitów) i najwyższy rząd uznajemy za ujemny. Na przykład dla 8 bitów liczba
jest równa (pierwsza cyfra oznacza
a kolejne już itd. aż do ).
Okazuje się, że standardowe, „pisemne” działania na takich liczbach
funkcjonują zupełnie poprawnie tak długo, jak wynik mieści się w ograniczonym
przedziale wartości (trudno o poprawny wynik, kiedy nie da się go zapisać).
Zauważmy, że aby zakodować liczbę ustawiamy bit o wartości na
1, a pozostałe bity kodują wartość
Tym samym całość liczby zapisanej w kodzie uzupełnień, kiedy ją odczytamy
w zwykłym systemie binarnym, będzie miała wartość
czyli modulo (a tak działają pisemne działania na bitach)
nadal pracujemy z liczbą zapisaną binarnie!
Co ciekawe, przy podstawie większej niż 2 to podejście już nie działa.
Gdyby było inaczej, to rozważając zapis dziesiętny
z trzema cyframi, przy czym trzecią cyfrą „ujemną”, mielibyśmy:
!
W ogólności liczbę kodowalibyśmy teraz jako
oraz co po odczytaniu z pominięciem minusa przy najstarszej
cyfrze daje i nie przystaje do modulo
czego potrzebujemy, aby stosować standardowe działania dziesiętne.
Aby uzyskać dziesiętny system uzupełnień pozbawiony tej wady, powinniśmy od standardowej interpretacji zapisu -cyfrowego odejmować jeśli wiodąca cyfra jest większa od 4.
Przykładowe mnożenie
wygląda następująco:
Kod uzupełnień, pomimo swoich praktycznych zastosowań, w teorii jest
„ułomny”, ponieważ opisuje jedynie skończony zakres liczb całkowitych.
Okazuje się jednak, że koncepcję „ujemnych rzędów” można zaprząc do pracy
na całym zbiorze liczb całkowitych.
Pozostając przy dwóch cyfrach, możemy rozważyć system minus dwójkowy
(zwany też negabinarnym), czyli taki, w którym nieparzyste rzędy są ujemne
(rząd jedności ma numer odpowiadając potędze zerowej) i nadal używamy
cyfr i Początkowe liczby naturalne wyglądają w tym systemie następująco:
Liczba cyfr rośnie jeszcze szybciej niż w systemie binarnym, gdyż tylko
zapis nieparzystej długości koduje wartości dodatnie. Jeśli spojrzymy na
zapis liczb ujemnych, związek pomiędzy liczbami wzajemnie
przeciwnymi może wydać się nieczytelny. Procedura zamiany znaku jest jednak dość
prosta (choć oczywiście nie aż tak prosta jak podmiana jednego symbolu na
początku liczby): przeglądamy zapis od prawej do lewej i zastępujemy cyfry
według schematu oraz (jeśli zostaniemy z wiodącą jedynką, możemy oczywiście po jej lewej stronie
dopisać zero i skorzystać z ostatniego przekształcenia).
Algorytm konwersji liczby na zapis negabinarny (lub o innej ujemnej podstawie)
jest taki sam jak dla podstawy dodatniej, tylko należy pamiętać,
że dzielimy przez liczbę ujemną (podstawę), ale rozważamy reszty nieujemne.
Na przykład dla zaczynamy od reszty (z dzielenia przez
), pozostałe dzielimy przez
Powstałe daje resztę a po podzieleniu
zostaje które również daje resztę Kolejne dzielenie daje wynik
czyli po odjęciu reszty otrzymujemy do podzielenia, i na koniec
zostaje
Zapisując wszystkie reszty w odwrotnej kolejności (pierwsza otrzymana reszta
to oczywiście cyfra jedności), otrzymujemy
Zauważmy, że wykonując działania minusdwójkowe, w razie przepełnienia
do następnego rzędu przenosimy A z kolei wymaga zapisania
i przeniesienia Przeanalizowanie wszystkich niespodzianek
związanych z działaniami minusdwójkowymi pozostawiam Czytelnikom Zainteresowanym.
Niewątpliwie pewna trudność w porównywaniu wartości zapisanych nagabinarnie
komplikuje algorytm dzielenia, zwłaszcza gdy spróbujemy dzielić liczby
różnych znaków.
Choć system minusdwójkowy należy do najpopularniejszych systemów o ujemnej
podstawie, możemy też wziąć na warsztat podstawę (aby nie porzucać
kompletu cyfr dziesiętnych). W takim systemie liczba
będzie trzycyfrowa, w końcu „” musi oznaczać podstawę systemu,
czyli
Skoro liczby ujemne sprawdzają się jako podstawy systemów liczbowych, to może
równie dobrym pomysłem mogłyby być ujemne cyfry? Najpopularniejszym tego typu
systemem jest trójkowy system zrównoważony, który używa podstawy trzy,
ale cyfry mają wartości oraz
Na minus jedynkę w tym zapisie proponuję „cyfrę nedej”: .
Początkowe liczby naturalne zapisujemy jako
Mając ujemne cyfry, nie musimy stosować znaku „”. Podobnie jak w kodzie uzupełnień,
znak liczby determinuje wiodąca cyfra – wartości ujemne zaczynają się od nedej.
Tym razem nie jesteśmy jednak ograniczeni do ustalonej z góry liczby cyfr.
Podobnie jak w klasycznym systemie trójkowym, parzystość jest
taka sama jak parzystość
sumy cyfr.
Aby ją wyznaczyć, wystarczy zatem policzyć niezerowe cyfry.
Gdyby upierać się przy ograniczeniu do liczb dodatnich, można by pomijać
przy zapisie początkową jedynkę – jaka by to była oszczędność!
Dodawanie, odejmowanie i mnożenie w systemie zrównoważonym zachowuje się „normalnie”,
jeśli za normalne uznajemy przenoszenie do kolejnego rzędu cyfry ujemnej
(możemy przenieść każdą z trzech cyfr). W szczególności, dodając do siebie dwie
jedynki, zapisujemy nedej i przenosimy jedynkę na lewo. Nieco zaskakujące rzeczy dzieją
się przy dzieleniu. Na początku system jest zachęcający, dzięki mało wymagającej
tabliczce mnożenia. Pojawia się jednak drobna kontrowersja dotycząca porównywania
liczb. Aby zobrazować te „osobliwości”, podzielmy 2024 przez 11.
Odnośne liczby zapisujemy jako
oraz
Bierzemy pierwsze trzy cyfry i wykonujemy odejmowanie (czyli dodawanie liczby przeciwnej):
Zapisujemy cyfrę wyniku (wynik powinien
być dodatni, więc wszystko idzie zgodnie z planem).
Teraz liczba zaczyna się od nedej, więc zmieniamy znak
(dopisujemy do wyniku ):
Nadal wszystko jest w porządku. W kolejnym kroku obliczamy
Teraz trzy pierwsze cyfry to co
do modułu mniejsze od 11.
Nadgorliwy rachmistrz poczułby potrzebę zwiększenia liczby cyfr,
czyli „opuszczenia” cyfry i obliczenia
„Opuszczając” teraz cyfrę dostaniemy
do podzielenia przez czyli mamy problem.
Okazuje się, że należało mimo wszystko wykonać odejmowanie
Właściwie to już na początku liczyliśmy więc trochę za późno
na zdziwienie. Całe dzielenie jest rozpisane na marginesie.
Czytelnik może na własną rękę opisać szczegóły tego algorytmu (czym się
różni od „zwykłego” dzielenia pisemnego) i uzasadnić, dlaczego działa.
Można się zastanawiać, jak należy interpretować „resztę” pozostającą na
koniec takiego dzielenia (z premedytacją wybrałem przykład z ilorazem
całkowitym). Prostym acz dobitnym przykładem możliwych komplikacji jest próba podzielenia 13 przez 5.
Zapis ułamków w systemie zrównoważonym także kryje w sobie niespodzianki.
Zauważmy, że „maksymalny” ułamek, czyli jest równy
Oznacza to, że zapis liczb
spoza przedziału wymaga niezerowej cyfry jedności!
Nie powinno to jednak dziwić, skoro zapis liczby wymaga użycia
rzędu dziewiątek (). Nie mamy też jednoznaczności zapisu,
ponieważ
Co ciekawe, niejednoznaczność dotyczy tylko liczb niecałkowitych (dokładnie tych,
które są postaci dla pewnych i ).
Ujemne cyfry można też wykorzystać w sposób „niezrównoważony”. Na przykład
w systemie dziesiętnym „zastąpić cyfrę przez nedej” –
wszystkie pozostałe cyfry zostają nieujemne. Oddaje to pewną powszechną
preferencję dotyczącą znaku liczb. Liczbę dziewięć zapisywałoby się
i nazywałaby się pewnie „nedejnaście”. A z zrobiłoby się
„sto nedejdziesiąt”. Gdyby kogoś gryzła nazwa „nedej”, może rozważyć
określenia typu „za jeden dziesięć” i „za dziesięć sto”.
Niezależnie od gustów widać, że ze wszystkich „szalonych” systemów ten dość
łatwo zintegrować z polszczyzną.
Łatwo też konwertować klasyczny zapis dziesiętny na „nedejowany”
– przechodzimy od prawej do lewej i każdą dziewiątkę zastępujemy przez
nedej, dodając jeden do kolejnego rzędu (może wystąpić przeniesienie).
W ramach ciekawostki można wspomnieć, że cena
musiałaby ustąpić lub
…
Jeśli Czytelnik doszedł do wniosku, że teraz pewnie zacznę opowiadać
o systemie, w którym występuje cyfra o wartości a podstawa
jest równa to znak, że nabrał już pewnego wyczucia i rozpoznaje,
jak dalekie uogólnienia znanego systemu dziesiętnego można poczynić.
Ułamkowe cyfry i podstawy to jednak temat na (nie)całkowicie inną opowieść.