Rzymski system zapisywania liczb

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

Rzymski system zapisywania liczb zwany też łacińskimaddytywny system liczbowy, w podstawowej wersji używa 7 znaków.

Sposób zapisu[edytuj | edytuj kod]

W systemie rzymskim do zapisu liczb używa się 7 liter, z których tworzy się liczbę według podanej tabeli:

Znak Wartość
I 1
II 2
III 3
IV 4
V 5
VI 6
VII 7
VIII 8
IX 9
X 10
XX 20
XXX 30
XL 40
L 50
LX 60
LXX 70
LXXX 80
XC 90
C 100
CC 200
CCC 300
CD 400
D 500
DC 600
DCC 700
DCCC 800
CM 900
M 1 000
MD 1 500
MM 2 000

Nie istnieją znaki dla liczb większych od 1000, choć można zapisywać większe liczby poprzez zapisanie liczby stukrotnie mniejszej i umieszczenie jej między '|' np.:

  • |MD| = 1500 * 100 = 150 000
  • |XL| = 40 * 100 = 4000 (zamiast MMMM)

Innym znakiem pełniącym podobną funkcję jest nadkreślenie oznaczające pomnożenie przez 1000 np.:

  • XL = 40 * 1000 = 40 000

Aby utworzyć liczbę, trzeba zestawić odpowiednie znaki, poczynając od tego oznaczającego liczbę największą do tego oznaczającego liczbę najmniejszą.

Jeżeli składnik liczby, którą piszemy, jest wielokrotnością liczby nominalnej, wtedy zapisywany jest z użyciem kilku następujących po sobie znaków, z zachowaniem zasady, by nie pisać czterech tych samych znaków po sobie (choć dawniej się jej nie stosowało), lecz napisać jeden znak wraz ze znakiem oznaczającym wartość większą o jeden rząd (liczbowy).

Sposób odczytu[edytuj | edytuj kod]

Cyfry jednakowe są dodawane, cyfry mniejsze stojące przed większymi są odejmowane od nich, cyfry mniejsze stojące za większymi są do nich dodawane.

MCLXIV = 1000(M) + 100(C) + 50(L) + 10(X) + 5(V) – 1(I) = 1164

Można spotkać zapis, w którym minimalizuje się (ogranicza) liczbę znaków. Np. 1999 to normalnie MCMXCIX, ale można również napisać MIM, choć to drugie jest już jednak modyfikacją.

Przykłady[edytuj | edytuj kod]

  • IV = 4
  • VII = 7
  • XIX = 19
  • XL = 40
  • XCV = 95
  • CM = 900
  • MXXV = 1025
  • MCMXCV = 1995
  • MM = 2000
  • MCMLVI = 1956
  • MMXI = 2011
  • MMMCCCXXXVIII = 3338

Historia[edytuj | edytuj kod]

System rzymski zapisywania liczb wykorzystuje cyfry pochodzenia etruskiego, które Rzymianie przejęli i zmodyfikowali ok. 500 p.n.e. Nadaje się on, co prawda, do wygodnego zapisywania liczb, jest jednak niewygodny w prowadzeniu nawet prostych działań arytmetycznych, oraz nie pozwala na zapis ułamków. Te niewygody nie występują w systemie pozycyjnym.

System rzymski stosowany był w łacińskiej części Europy do końca średniowiecza.

Dzisiejsze zastosowania[edytuj | edytuj kod]

Do dziś system rzymski jest zwyczajowo używany do zapisywania liczb w pewnych szczególnych przypadkach. Na przykład w Polsce zapisuje się cyframi rzymskimi: numery liceów (ale nie szkół podstawowych i gimnazjów), numery klas i lat studiów, numery tomów, numery pięter, wydziałów w instytucjach. Zwyczajowo stosuje się czasem liczby rzymskie do lat powstania budowli (na ich frontonach) oraz numeruje rozmaite grupy klasyfikacyjne (szczególnie na ich wyższych poziomach).

Cyfry rzymskie nadal bywają wykorzystywane do oznaczania miesięcy w zapisie daty, mimo upowszechnienia się systemu opartego na cyfrach wyłącznie arabskich. Wykorzystanie zapisu rzymskiego pozwala uniknąć dwuznaczności wywołanych stosowaniem różnych wariantów kolejności poszczególnych członów w zapisie (vide np. popularny w USA sposób podawania najpierw miesięcy a potem dni wobec czego zapis „08/11/10” może być rozumiany albo jako 8 listopada albo 11 sierpnia, natomiast zapis 8 XI 2010 można rozumieć tylko w jeden sposób; przy zapisie z udziałem cyfr rzymskich najczęściej pomija się początkowe 0 przy dniach miesiąca o wartości jednocyfrowej).

Cyfry rzymskie powszechnie stosuje się również w numeracji stuleci (np. XIX wiek — nie dotyczy to tradycji anglosaskiej, gdzie powszechnie stosuje się cyfry arabskie), w imionach władców i papieży (np. Jan Paweł II), nazwach wydarzeń historycznych (II wojna światowa).

Użycie liczby rzymskiej wskazuje też czasami na liczebnik porządkowy.

Geneza[edytuj | edytuj kod]

Geneza poszczególnych znaków:

  • M (1000) – z łac. mille – "tysiąc"
  • D (500) – Być może z czasem M zostało przekształcone (lub na odwrót) w grecki znak Φ, skąd może pochodzić D, będące prawą połową tego znaku.
  • C (100) – z łac. centum – "sto"
  • L (50) – jest (dolną) połową znaku C (100)
  • X (10) – jest zestawieniem dwóch znaków V (5)
  • V (5) – Pochodzenie znaku V jest niepewne. Jedna z teorii mówi, że znak V (5) oddaje kształt otwartej dłoni, gdzie jest 5 palców, a każde dwa tworzą literę V.[potrzebne źródło]
  • I (1) – od pionowej kreski, oznaczającej jeden element

Warianty zapisu[edytuj | edytuj kod]

Liczby 5000 i 10000[edytuj | edytuj kod]

Rzymianie do zapisywania liczb poza siedmioma symbolami, które przetrwały do dziś, używali dodatkowo ligatur oznaczający 5000, oraz oznaczający 10000. Dodatkowo stosowano notację pozwalającą zapisywać większe liczby. Wpisanie liczby pomiędzy dwa znaki | oznaczało liczbę stukrotnie większą, a umieszczenie poziomej kreski nad liczbą oznaczało mnożenie przez 1000.

Liczby 1/2, 500 i 1000[edytuj | edytuj kod]

John Wallis w 1655 roku zaproponował użycie symbolu , oznaczającego 1000 (zamiennie z M), do oznaczania nieskończoności; później dla wygody ten symbol został zniekształcony do znaku , i od tej pory jest on stosowany w tym właśnie znaczeniu.

Liczba zero[edytuj | edytuj kod]

Moneta semis (1/2 lub 6/12 asa). Jej nominał został zapisany za pomocą litery S.

Liczba zero nie posiada własnego znaku w systemie rzymskim, gdyż "nic" nie było powszechnie uważane za wartość liczby. Wartość 0,5 jest reprezentowana przez znak S (łac. Semis - pół) oraz ł (skreślone l).

Rok wydania CIƆ IƆ C LXX IV (1674) na karcie tytułowej dzieł zebranych Matthiolego

W typografii XVIII-w. na kartach tytułowych książek spotykamy wariant zapisu tych liczb z zastosowaniem odwróconej litery C:

  • 1000 CIƆ (oprócz M),
  • 500 IƆ (oprócz D)

Przyjęte było także (obecnie rzadkość) oddzielanie kropką i spacją części liczby oznaczających tysiące, setki i dziesiątki z jednościami, np. M. DC. LXI = 1661.

"IIII" na tarczach zegarów[edytuj | edytuj kod]

Typowy zegar z opisem liczbami rzymskimi w Bad Salzdetfurth, Niemcy
Zegar na Bramie Shepherda w Greenwich z liczbami rzymskimi aż do XXIII (oraz 0)
Tarcza zegara Wieży Spaskiej w Moskwie z godziną czwartą oznaczoną 'IV'

Na cyferblatach zegarów opisywanych liczbami rzymskimi tradycyjnie stosuje się oznaczenie IIII dla godziny czwartej zamiast IV, co jest sprzeczne z ogólnie przyjętym systemem zapisu. Istnieje kilka wyjaśnień tego odstępstwa:

  • W wielu przypadkach zapis IIII jest stosowany jako spełnienie kanonu ustanowionego przez najstarszy istniejący zegar znajdujący się w Katedrze w Wells, który został wybudowany między 1386, a 1392 rokiem. W tym przypadku użyto zapisu IIII ponieważ był to w tych czasach powszechny sposób zapisu liczby 4 w manuskryptach (jako iiij lub iiii). W tym zegarze zastosowano niesymetryczną tarczę 24 godzinną, a do opisu minut i faz księżyca użyto cyfr arabskich, przez co teorie o symetrycznej 12 godzinnej tarczy nie mają zastosowania[1].
  • Niektórzy sądzą, że zapis IV był unikany, gdyż symbolizował rzymskiego boga Jowisza (IVPPITER). To twierdzenie przypisywane jest pisarzowi Science fiction Isaacowi Asimovowi[2]. Jest to fantazja, taki skrót dla wyrazu Iuppiter w zapisach historycznych nie występuje.[3]
  • Król Francji, Ludwik XIV wolał zapis IIII i tak kazał wykonywać zegary swoim mistrzom, a zapoczątkowany tak zwyczaj ostał się po dziś dzień[4].
  • Zapisane za pomocą standardowego zapisu dwa zestawy znaków (IV i VI oraz IX i XI) byłby podobne, co mogło by prowadzić do łatwych pomyłek ludzi nienawykłych do czytania tradycyjnych cyferblatów.
  • Forma czteroznakowa IIII stwarza wizualną symetrię tarczy wobec VIII po jej drugiej stronie.
  • Wraz z liczbą IIII w sumie na cyferblacie znajduje się dwadzieścia "I", cztery "V" i cztery "X"[5]. To oznacza, że zegarmistrz potrzebuje tylko jednej formy składającej się ze znaków VIIIIIX, która wykorzystana cztery razy daje wszystkie potrzebne do opisania tarczy znaki. Łatwo można zauważyć pewien schemat:
    • VIII I IX
    • VII III X
    • VI II IIX
    • V IIII IX
IIX i jedno IX po obróceniu o 180° tworzą XII i XI. Zapis 4 jako IV wymaga wytworzenia siedemnastu "I", pięciu "V" i czterech "X" co wymusza posiadanie więcej niż jednej formy odlewniczej.
  • Przy użyciu IIII do opisu pierwszych czterech godzin wykorzystuje się tylko "I", znak "V" występuje tylko w kolejnych czterech godzinach, a znak "X" znajduje się tylko w opisie ostatnich czterech godzin. To nadaje tarczy symetrii radialnej.

Odejmowanie w liczbach rzymskich[edytuj | edytuj kod]

Odejmowanie przy zapisywaniu cyframi rzymskimi jak przy zapisie IV czy IX albo XC nie było popularne w zapisie stosowanym przez Rzymian, a upowszechniło się dopiero w średniowieczu.

Obecnie przyjęte jest użycie odejmowania w zapisie liczb:

IV = 4
IX = 9
XL = 40
XC = 90
CD = 400
CM = 900

Dawniej stosowano bardziej złożone odejmowania, np. w zapisie daty MDCXIC = 1689[6].

Warianty w ciesielskich znakach montażowych[edytuj | edytuj kod]

Dawni cieśle używali często cyfr rzymskich w znakach montażowych, pisząc je kredą, ołówkiem, tłustą kredką (tzw. rudką) albo wycinając je w drewnie. Niektóre z nich zachowały się do dziś na belkach starych budowli. Często był to jednak system nieco zmodyfikowany[7]:

  • często IIII oznaczało cyfrę 4,
  • VIIII lub IIIIV oznaczało 9,
  • XVIIII oznaczało 19
  • w Belgii N oznaczało 50, a X z kreską na dole i na górze - 100
  • czasami stosowano uproszczenia, np. zamiast XX, tworzono jedną kreskę z dwoma poprzecznymi nacięciami albo zamiast XXXV pisano V z trzema nacięciami na jednym wydłużonym ramieniu.

Cyfry rzymskie w algorytmach[edytuj | edytuj kod]

Prosta implementacja konwertora do systemu rzymskiego w Javie:

public class ArabicToRomanConverter {
 
    public static Map<Integer, Character> romanLetters = new HashMap<>();
    static {
        romanLetters.put(1, 'I');
        romanLetters.put(5, 'V');
        romanLetters.put(10, 'X');
        romanLetters.put(50, 'L');
        romanLetters.put(100, 'C');
        romanLetters.put(500, 'D');
        romanLetters.put(1000, 'M');
    }
 
    public static void main(String[] args) {
        System.out.println(toRoman(3059));
    }
 
    public static String toRoman(int n) {
        if (n < 1 || n > 3999) {
            return "";
        }
        String arabic = String.valueOf(n);
        StringBuilder roman = new StringBuilder();
        for (int i = 0; i < arabic.length(); i++) {
            int digit = Character.getNumericValue(arabic.charAt(i));
            List<Integer> values = new LinkedList<>();
            if (digit == 0) {
                continue;
            } else if (digit <= 3) {
                for (int j = 0; j < digit; j++) {
                    values.add(1);
                }
            } else if (digit == 4) {
                values.add(1);
                values.add(5);
            } else if (digit == 5) {
                values.add(5);
            } else if (digit <= 8) {
                values.add(5);
                for (int j = 0; j < (8 - digit); j++) {
                    values.add(1);
                }
            } else {
                values.add(1);
                values.add(10);
            }
            int valueMultiplicator = (int)Math.pow(10, arabic.length() - i - 1);
            for (int value : values) {
                roman.append(romanLetters.get(value * valueMultiplicator));
            }
        }
        return roman.toString();
    }
}

Konwersja liczb arabskich na liczby rzymskie w PHP:

function decimal2roman($input) {
  $roman =   Array( "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I");
  $decimal = Array(1000,  900, 500,  400, 100,   90,  50,   40,  10,   9,    5,    4,   1);
  $romanvalue = "";
  for ($i = 0; $i < 13; $i++) {
    while ($input >= $decimal[$i]) {
      $input -= $decimal[$i];
      $romanvalue .= $roman[$i];
    }
  }
  return $romanvalue;
}

Istnieje też ciekawy algorytm, napisany w Polsce (tzw. algorytm Vaxa), znacznie krótszy i szybszy. Przykładowa implementacja w Javie:

public static String rome(int liczba)
{
	if(liczba <= 0 || liczba >= 4000)
		throw new IllegalArgumentException(String.format(
			"Invalid roman number (%d), accepted range: [0,3999]", liczba));
	final String cyfryRzymskie = "IVXLCDM";
	StringBuilder rzymskie = new StringBuilder(16);
	for(int cyfra = 0, dzielnik = 5; liczba > 0; ++cyfra, dzielnik ^= 7)
	{
		int ileCyfr = liczba % dzielnik;
		liczba /= dzielnik;
		while(ileCyfr-- > 0)
		{
			int indeks = cyfra;
			if(ileCyfr > 2)
			{
				int nieparzystość = liczba & 1;
				liczba -= nieparzystość;
				indeks += nieparzystość + (ileCyfr = 1);
			}
			rzymskie.insert(0, cyfryRzymskie.charAt(indeks));
		}
	}
	return rzymskie.toString();
}

Przykładowa implementacja w PHP:

function rome($N){
	$c='IVXLCDM';
	for($a=5,$b=$s='';$N;$b++,$a^=7)
		for($o=$N%$a,$N=$N/$a^0;$o--;$s=$c[$o>2?$b+$N-($N&=-2)+$o=1:$b].$s);
	return $s;
}

Konwerter ten ma ograniczony zakres od 1 do 3999, choć w prosty sposób (np. w ostatnim algorytmie poprzez dopisanie kolejnych symboli w inicjacji zmiennej $c lub cyfryRzymskie) zakres ów można dowolnie rozszerzać.

Zobacz też[edytuj | edytuj kod]

Przypisy

  1. Paul Lewis, Clocking the fours: A new theory about IIII; see the clock
  2. » Roman_Numerals
  3. A. Cappelli, Lexicon Abbreviaturarum. Dizionario di Abbreviature Latine ed Italiane (Milano, 1920, reprint 1999).
  4. W.I. Milham, Time & Timekeepers (New York: Macmillan, 1947) p. 196
  5. FAQ: Roman IIII vs. IV on Clock Dials – Donn Lathrop's page on IIII vs. IV.
  6. na stronie tytułowej dzieła Tourneforta Schola botanica, Amstelaedami 1689
  7. mgr inż. arch. Dominik Mączyński (Krajowy Ośrodek Badań Dokumentacji Zabytków): Znaki, inskrypcje i ślady w zabytkowych konstrukcjach dachowych, cz. 1, Dachy, nr 4 (124) 2010