Negativní základna - Negative base
Číselné soustavy |
---|
![]() |
Hindu-arabská číselná soustava |
východní Asiat |
evropský |
americký |
Abecední |
Bývalý |
Poziční systémy podle základna |
Nestandardní poziční číselné systémy |
Seznam číselných soustav |
A záporný základ (nebo negativní základ ) lze použít ke konstrukci a nestandardní poziční číselný systém. Stejně jako ostatní systémy s místní hodnotou má každá pozice násobky příslušné síly základny systému; ale ta základna je záporná - to znamená základna b je rovný −r pro nějaké přirozené číslo r (r ≥ 2).
Záporné základní systémy mohou pojmout všechna stejná čísla jako standardní systémy místních hodnot, ale kladná i záporná čísla jsou zastoupena bez použití znaménko minus (nebo v počítačové reprezentaci a znamení bit ); této výhodě čelí zvýšená složitost aritmetických operací. Potřeba uchovávat informace normálně obsažené záporným znaménkem často vede k tomu, že číslo záporné báze je o jednu číslici delší než jeho ekvivalent kladné báze.
Běžné názvy pozičních soustav se zápornou bází jsou tvořeny prefixování nega- na název příslušného kladného základního systému; například, negadecimální (základ −10) odpovídá desetinný (základ 10), negabinární (základ -2) až binární (základ 2), negaternary (základ -3) až trojice (základ 3) a negaquaternary (základ -4) až kvartérní (základ 4).[1][2]
Příklad
Zvažte, co se míní reprezentací 12243 v negadecimálním systému, jehož základna b je -10:
(−10)4 = 10,000 | (−10)3 = −1,000 | (−10)2 = 100 | (−10)1 = −10 | (−10)0 = 1 |
1 | 2 | 2 | 4 | 3 |
Protože 10 000 + (-2 000) + 200 + (−40) + 3 = 8,163, reprezentace 12,243−10 v negadecimálním zápisu je ekvivalentní 8,16310 v desítkové soustavě, zatímco −8,16310 v desítkové soustavě by byl zapsán 9,977−10 negadecimálně.
Dějiny
Negativní číselné báze byly nejprve zváženy Vittorio Grünwald v monografii z roku 1885 publikované v Giornale di Matematiche di Battaglini.[3] Grünwald dal algoritmy pro provádění sčítání, odčítání, násobení, dělení, extrakce kořenů, testů dělitelnosti a převodu radixů. Negativní báze byly později zmíněny kolem A. J. Kempner v roce 1936[4] a podrobněji prostudoval Zdzisław Pawlak a A. Wakulicz v roce 1957.[5]
Negabinary byl implementován na počátku polština počítač BINEG (a UMC ), postavený v letech 1957–1959, na základě myšlenek Z. Pawlaka a A. Lazarkiewicze z Matematický ústav v Varšava.[6] Implementace od té doby byly vzácné.
Zápis a použití
Označení základny jako −r, každý celé číslo A lze psát jednoznačně jako
kde každá číslice dk je celé číslo od 0 do r − 1 a vedoucí číslice dn je > 0 (pokud n = 0). Základna −r expanze A je pak dán řetězcem dndn−1...d1d0.
Systémy se zápornou bází lze tedy srovnávat s podepsané číslice, jako vyvážená ternární, kde je radix kladný, ale číslice jsou převzaty z částečně záporného rozsahu. (V tabulce níže je číslice hodnoty −1 zapsána jako jediný znak T.)
Některá čísla mají v základu stejné zastoupení −r jako v základně r. Například čísla od 100 do 109 mají stejnou reprezentaci v desítkové i negadecimální podobě. Podobně,
a je reprezentován 10001 v binárním a 10001 v negabinárním.
Některá čísla s jejich rozšířením v řadě kladných a odpovídajících záporných bází jsou:
Desetinný | Negadecimální | Binární | Negabinary | Trojice | Negaternary | Vyvážený ternár | Nega vyvážené ternární | Kvartérní | Negaquaternary |
---|---|---|---|---|---|---|---|---|---|
−15 | 25 | −1111 | 110001 | −120 | 1220 | T110 | 11T0 | −33 | 1301 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
−5 | 15 | −101 | 1111 | −12 | 21 | T11 | TT1 | −11 | 23 |
−4 | 16 | −100 | 1100 | −11 | 22 | TT | 1T | −10 | 10 |
−3 | 17 | −11 | 1101 | −10 | 10 | T0 | 10 | −3 | 11 |
−2 | 18 | −10 | 10 | −2 | 11 | T1 | 11 | −2 | 12 |
−1 | 19 | −1 | 11 | −1 | 12 | T | T | −1 | 13 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 2 | 10 | 110 | 2 | 2 | 1T | TT | 2 | 2 |
3 | 3 | 11 | 111 | 10 | 120 | 10 | T0 | 3 | 3 |
4 | 4 | 100 | 100 | 11 | 121 | 11 | T1 | 10 | 130 |
5 | 5 | 101 | 101 | 12 | 122 | 1TT | 11T | 11 | 131 |
6 | 6 | 110 | 11010 | 20 | 110 | 1T0 | 110 | 12 | 132 |
7 | 7 | 111 | 11011 | 21 | 111 | 1T1 | 111 | 13 | 133 |
8 | 8 | 1000 | 11000 | 22 | 112 | 10T | 10T | 20 | 120 |
9 | 9 | 1001 | 11001 | 100 | 100 | 100 | 100 | 21 | 121 |
10 | 190 | 1010 | 11110 | 101 | 101 | 101 | 101 | 22 | 122 |
11 | 191 | 1011 | 11111 | 102 | 102 | 11T | 1TT | 23 | 123 |
12 | 192 | 1100 | 11100 | 110 | 220 | 110 | 1T0 | 30 | 110 |
13 | 193 | 1101 | 11101 | 111 | 221 | 111 | 1T1 | 31 | 111 |
14 | 194 | 1110 | 10010 | 112 | 222 | 1TTT | TT1T | 32 | 112 |
15 | 195 | 1111 | 10011 | 120 | 210 | 1TT0 | TT10 | 33 | 113 |
16 | 196 | 10000 | 10000 | 121 | 211 | 1TT1 | TT11 | 100 | 100 |
17 | 197 | 10001 | 10001 | 122 | 212 | 1T0T | TT0T | 101 | 101 |
18 | 198 | 10010 | 10110 | 200 | 200 | 1T10 | TTT0 | 102 | 102 |
Všimněte si, že s výjimkou ternárního vyváženého nega, základny −r expanze záporných celých čísel mají sudé číslo číslic, zatímco základna −r expanze nezáporných celých čísel mají liché číslo číslic.
Výpočet
Základna −r rozšíření čísla lze najít opakovaným dělením −r, zaznamenávající nezáporné zbytky do a zřetězení těchto zbytků, počínaje posledním. Všimněte si, že pokud A / b je C se zbytkem d, pak před naším letopočtem + d = A a proto d = A − před naším letopočtem. Abychom dospěli ke správnému převodu, hodnota pro C musí být zvolen tak, aby d není negativní a minimální. Příkladem toho je čtvrtý řádek následujícího příkladu, kde –5 ÷ –3 musí být vybráno tak, aby se rovnalo 2 zbytku 1 místo 1 zbytku 2.
Například pro převod 146 v desítkovém na negaternární:
Po přečtení zbytků dozadu získáme negaternární zastoupení 14610: 21102–3.
- Důkaz: ((((2 · (–3) + 1) · (–3) + 1) · (–3) + 0) · (–3) + 2 = 14610.
Všimněte si, že ve většině programovací jazyky, výsledek (v celočíselné aritmetice) vydělení záporného čísla záporným číslem se zaokrouhlí na 0, obvykle zanechá záporný zbytek. V takovém případě máme A = (−r)C + d = (−r)C + d − r + r = (−r)(C + 1) + (d + r). Protože |d| < r, (d + r) je pozitivní zbytek. Abychom v takovém případě získali správný výsledek, měly by počítačové implementace výše uvedeného algoritmu přidat 1 a r na kvocient a zbytek.
Příklad implementačního kódu
Negabinární
C#
statický tětiva ToNegabinary(int hodnota){ tětiva výsledek = tětiva.Prázdný; zatímco (hodnota != 0) { int zbytek = hodnota % -2; hodnota = hodnota / -2; -li (zbytek < 0) { zbytek += 2; hodnota += 1; } výsledek = zbytek.ToString() + výsledek; } vrátit se výsledek;}
C ++
auto to_negabinary(int hodnota){ std::bitová sada<velikost(int) * CHAR_BIT > výsledek; std::size_t bit_position = 0; zatímco (hodnota != 0) { konst auto div_result = std::div(hodnota, -2); -li (div_result.rem < 0) hodnota = div_result.cit + 1; jiný hodnota = div_result.cit; výsledek.soubor(bit_position, div_result.rem != 0); ++bit_position; } vrátit se výsledek;}
Do negaternary
C#
statický tětiva negaternary(int hodnota){ tětiva výsledek = tětiva.Prázdný; zatímco (hodnota != 0) { int zbytek = hodnota % -3; hodnota = hodnota / -3; -li (zbytek < 0) { zbytek += 3; hodnota += 1; } výsledek = zbytek.ToString() + výsledek; } vrátit se výsledek;}
Visual Basic .NET
Soukromé Sdílené Funkce ToNegaternary(hodnota Tak jako Celé číslo) Tak jako Tětiva Ztlumit výsledek Tak jako Tětiva = Tětiva.Prázdný Zatímco hodnota <> 0 Ztlumit zbytek Tak jako Celé číslo = hodnota Mod -3 hodnota /= -3 Li zbytek < 0 Pak zbytek += 3 hodnota += 1 Konec Li výsledek = zbytek.ToString() & výsledek Konec Zatímco Vrátit se výsledekKonec Funkce
Krajta
def negaternary(i: int) -> str: "" "Desetinné až negenerární." "" -li i == 0: číslice = ["0"] jiný: číslice = [] zatímco i != 0: i, zbytek = divmod(i, -3) -li zbytek < 0: i, zbytek = i + 1, zbytek + 3 číslice.připojit(str(zbytek)) vrátit se "".připojit se(číslice[::-1])
>>> negaternary(1000)'2212001'
Společný Lisp
(defun negaternary (i) (-li (nula i) "0" (nechat ((číslice "") (rem 0)) (smyčka zatímco (ne (nula i)) dělat (progn (multi-value-setq (i rem) (zkrátit i -3)) (když (minusp rem) (příloha i) (příloha rem 3)) (setf číslice (zřetězit 'tětiva (write-to-string rem) číslice)))) číslice)))
Na jakoukoli negativní základnu
Jáva
veřejnost Tětiva negativní základna(int celé číslo, int základna) { Tětiva výsledek = ""; int číslo = celé číslo; zatímco (číslo != 0) { int i = číslo % základna; číslo /= základna; -li (i < 0) { i += Matematika.břišní svaly(základna); číslo++; } výsledek = i + výsledek; } vrátit se výsledek;}
AutoLisp
z intervalu [-10-2]:
(defun negabase (počet baz / kopat první) ;; NUM je libovolné číslo. BAZ je libovolné číslo v intervalu [-10, -2]. ;; ;; NUM a BAZ budou zkráceny na celé číslo, pokud jsou plovoucí (např. 14.25 ;; bude zkrácen na 14, -123456789,87 až -123456789 atd.). (-li (a (číslo počet) (číslo baz) (<= (opravit baz) -2) (> (opravit baz) -11)) (progn (setq baz (plovák (opravit baz)) počet (plovák (opravit počet)) kopat (-li (= počet 0) "0" "")) (zatímco (/= počet 0) (setq první (- počet (* baz (setq počet (opravit (/ počet baz)))))) (-li (minusp první) (setq počet (1+ počet) první (- první baz))) (setq kopat (strcat (itoa (opravit první)) kopat))) kopat) (progn (výzva (kond ((a (ne (číslo počet)) (ne (číslo baz))) „Špatné číslo a negabáze.“) ((ne (číslo počet)) "Špatné číslo.") ((ne (číslo baz)) „Špatná negabase.“) (t "Negabase musí být v intervalu [-10-2]."))) (princ))))
PHP
Převod z celého čísla na nějaký záporný základ:
funkce toNegativeBase($ č, $ základna){ $ číslic = pole(); $ základna = intval($ základna); zatímco ($ č != 0) { $ temp_no = $ č; $ č = intval($ temp_no / $ základna); $ zbytek = ($ temp_no % $ základna); -li ($ zbytek < 0) { $ zbytek += břišní svaly($ základna); $ č++; } array_unshift($ číslic, $ zbytek); } vrátit se $ číslic;}
Visual Basic .NET
Funkce toNegativeBase(Číslo Tak jako Celé číslo , základna Tak jako Celé číslo) Tak jako Systém.Sbírky.Obecný.Seznam(Z Celé číslo) Ztlumit číslice Tak jako Nový Systém.Sbírky.Obecný.Seznam(Z Celé číslo) zatímco Číslo <> 0 Ztlumit zbytek Tak jako Celé číslo= Číslo Mod základna Číslo = CInt(Číslo / základna) -li zbytek < 0 pak zbytek += Systém.matematika.břišní svaly(základna) Číslo+=1 konec -li číslice.Vložit(0, zbytek) konec zatímco vrátit se číslicekonec funkce
Výpočet zkratky
Následující algoritmy to předpokládají
- vstup je k dispozici v bitstrings a zakódováno (základna +2; číslice v ) (jako ve většině dnešních digitálních počítačů),
- existují operace add (+) a xor (^), které fungují na takových bitstrings (jako ve většině dnešních digitálních počítačů),
- sada výstupních číslic je standardní, tj. E. se základnou ,
- výstup je kódován ve stejném formátu bitstringu, ale význam míst je jiný.
Negabinární
Převod na negabinární (základ -2; číslice v ) umožňuje pozoruhodnou zkratku (implementace C):
nepodepsaný int toNegaBinary(nepodepsaný int hodnota) // vstup ve standardním binárním formátu{ nepodepsaný int Schroeppel 2 = 0xAAAAAAAA; // = 2/3*((2*2)^16-1) = ...1010 vrátit se (hodnota + Schroeppel 2) ^ Schroeppel 2; // exkluzivní NEBO // výsledný nepodepsaný int bude interpretován jako řetězec prvků ε {0,1} (bity)}
Kvůli D. Librikovi (Szudzik). Bitová část XOR je původně způsobena Schroeppel (1972).[7]
Port JavaScriptu pro stejný výpočet zkratky:
funkce toNegaBinary(číslo) { var Schroeppel 2 = 0xAAAAAAAA; // Převést na NegaBinary řetězec vrátit se ( ( číslo + Schroeppel 2 ) ^ Schroeppel 2 ).toString(2);}
Do negaquaternary
Převod na negaquaternary (základ −4; číslice v ) umožňuje podobnou zkratku (implementace C):
nepodepsaný int do NegaQuaternary(nepodepsaný int hodnota) // vstup ve standardním binárním formátu{ nepodepsaný int 4. Schroeppel = 0xCCCCCCCC; // = 4/5*((2*4)^8-1) = ...11001100 = ...3030 vrátit se (hodnota + 4. Schroeppel) ^ 4. Schroeppel; // exkluzivní NEBO // výsledný nepodepsaný int má být interpretován jako řetězec prvků ε {0,1,2,3} (páry bitů)}
Port JavaScriptu pro stejný výpočet zkratky:
funkce do NegaQuaternary(číslo) { var 4. Schroeppel = 0xCCCCCCCC; // Převést na NegaQuaternary řetězec vrátit se ( ( číslo + 4. Schroeppel ) ^ 4. Schroeppel ).toString(4);}
Aritmetické operace
Následující text popisuje aritmetické operace pro negabinary; výpočty ve větších základnách jsou podobné.
Přidání
Přidávání negabinárních čísel probíhá bitově, počínaje nejméně významné bity; bity z každého dodatku se sčítají s (vyvážená ternární ) přenést z předchozího bitu (0 na LSB). Tento součet se poté rozloží na výstupní bit a přenese se na další iteraci, jak ukazuje tabulka:
Součet | Výstup | Komentář | |||
---|---|---|---|---|---|
Bit | Nést | ||||
−2 | 010−2 | 0 | 1 | 01−2 | −2 se vyskytuje pouze během odčítání. |
−1 | 011−2 | 1 | 1 | 01−2 | |
0 | 000−2 | 0 | 0 | 00−2 | |
1 | 001−2 | 1 | 0 | 00−2 | |
2 | 110−2 | 0 | −1 | 11−2 | |
3 | 111−2 | 1 | −1 | 11−2 | 3 se vyskytuje pouze během přidávání. |
Druhý řádek této tabulky například vyjadřuje skutečnost, že −1 = 1 + 1 × -2; pátý řádek říká 2 = 0 + −1 × -2; atd.
Jako příklad přidat 1010101−2 (1 + 4 + 16 + 64 = 85) a 1110100−2 (4 + 16 − 32 + 64 = 52),
Přenášení: 1 −1 0 −1 1 −1 0 0 0 První doplněk: 1 0 1 0 1 0 1 Druhý doplněk: 1 1 1 0 1 0 0 + ----------------- --------- Počet: 1 −1 2 0 3 −1 2 0 1Bit (výsledek): 1 1 0 0 1 1 0 0 1Přenášení: 0 1 −1 0 −1 1 −1 0 0
takže výsledek je 110011001−2 (1 − 8 + 16 − 128 + 256 = 137).
Další metoda
Při přidávání dvou negabinárních čísel by mělo být pokaždé, když je generován přenos, rozšířen další přenos na další bit. Zvažte stejný příklad jako výše
Extra nošení: 1 1 0 1 0 0 0 Přenášení: 1 0 1 1 0 1 0 0 0 První přidání: 1 0 1 0 1 0 1 Druhý přidání: 1 1 1 0 1 0 0 + ---------- ---------------- Odpověď: 1 1 0 0 1 1 0 0 1
Negabinární plná zmije
A plný zmije obvod může být navržen tak, aby přidával čísla v negabinární podobě. Následující logika se používá k výpočtu součtu a nese:[8]
Zvyšování záporných čísel
Zvýšení záporného čísla lze provést pomocí následujícího vzorce:[9]
Odčítání
Chcete-li odečíst, vynásobte každý bit druhého čísla číslem -1 a přidejte čísla pomocí stejné tabulky jako výše.
Jako příklad k výpočtu 1101001−2 (1 - 8 - 32 + 64 = 25) minus 1110100−2 (4 + 16 − 32 + 64 = 52),
Přenášení: 0 1 −1 1 0 0 0 První číslo: 1 1 0 1 0 0 1 Druhé číslo: −1 −1 −1 0 −1 0 0 + ----------------- --- Počet: 0 1 −2 2 −1 0 1Bit (výsledek): 0 1 0 0 1 0 1Přenášení: 0 0 1 −1 1 0 0
takže výsledek je 100101−2 (1 + 4 −32 = −27).
Unární negace, −X, lze vypočítat jako binární odčítání od nuly, 0 − X.
Násobení a dělení
Posun doleva se vynásobí −2, posun doprava vydělí −2.
Chcete-li se množit, množte se jako obvykle desetinný nebo binární čísla, ale při přidávání čísel se používají negabinární pravidla pro přidávání carry.
První číslo: 1 1 1 0 1 1 0 Druhé číslo: 1 0 1 1 0 1 1 × ------------------------------ ------- 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 + ------- ------------------------------ Přenášení: 0 −1 0 −1 −1 −1 −1 −1 0 −1 0 0Počet: 1 0 2 1 2 2 2 3 2 0 2 1 0Bit (výsledek): 1 0 0 1 0 0 0 1 0 0 0 1 0Nesení: 0 −1 0 −1 −1 −1 −1 −1 0 −1 0 0
Pro každý sloupec přidejte nést na čísloa vydělením součtu −2 získáte nový nésta výsledný bit jako zbytek.
Porovnání záporných čísel
Je možné porovnat záporná čísla mírnou úpravou normálního nepodepsaného binární komparátor. Při porovnávání čísel a , obraťte každý lichý bit obou čísel. Poté proveďte srovnání a pomocí standardního nepodepsaného komparátoru.[10]
Zlomková čísla
Základna −r zastoupení může být samozřejmě přeneseno nad rámec bod radixu, což umožňuje reprezentaci necelých čísel.
Stejně jako u systémů s kladnou bází, zakončovací reprezentace odpovídají zlomkům, kde jmenovatelem je síla báze; opakující se reprezentace odpovídají jiným důvodům a ze stejného důvodu.
Nejedinečná reprezentace
Na rozdíl od systémů s kladnou bází, kde celá čísla a zakončovací zlomky mají nejedinečné reprezentace (například v desítkové soustavě) 0.999... = 1 ) v záporných základních systémech mají celá čísla pouze jedno zastoupení. Existují však racionály s nejedinečnými reprezentacemi. Pro číslice {0, 1, ..., t} s největší číslice a
my máme
- stejně jako
Takže každé číslo s koncová zlomek added má dvě odlišná reprezentace.
Například v negaternary, tj. a , tady je
- .
Taková nejedinečná reprezentace lze nalézt zvážením největší a nejmenší možné reprezentace s celočíselnými částmi 0 a 1 a poté si všimnete, že jsou si rovny. (Ve skutečnosti to funguje s jakýmkoli celočíselným základním systémem.) Racionály, které tedy nejsou jednoznačně vyjádřitelné, jsou formální
s
Imaginární základna
Stejně jako použití záporné základny umožňuje vyjádření záporných čísel bez výslovného záporného znaménka, použití znaku imaginární základna umožňuje reprezentaci Gaussova celá čísla. Donald Knuth navrhl čtveřice-imaginární základna (základna 2i) v roce 1955.[11]
Viz také
- Čtvrtletně imaginární základna
- Binární
- Vyvážená ternární
- Kvartérní číselná soustava
- Číselné soustavy
- 1 − 2 + 4 − 8 + ⋯ (p-adic čísla )
Reference
- ^ Knuth, Donald (1998), Umění počítačového programování, Díl 2 (3. vyd.), S. 204–205. Knuth zmiňuje jak negabinární, tak negadecimální.
- ^ Negativní systém je krátce popsán v Petkovšek, Marko (1990), „Nejednoznačná čísla jsou hustá“, Americký matematický měsíčník, 97 (5): 408–411, doi:10.2307/2324393, ISSN 0002-9890, JSTOR 2324393, PAN 1048915.
- ^ Vittorio Grünwald. Intorno all'aritmetica dei sistemi numerici a base negativa con particolare riguardo al sistema numerico a base negativo-decimale per lo studio delle sue analogie coll'aritmetica ordinaria (decimale), Giornale di Matematiche di Battaglini (1885), 203-221, 367
- ^ Kempner, A. J. (1936), „Anormal Systems of Numeration“, Americký matematický měsíčník, 43 (10): 610–617, doi:10.2307/2300532, JSTOR 2300532, PAN 1523792. Jediným odkazem na záporné báze je poznámka pod čarou na straně 610, která zní: „Kladná čísla menší než 1 a záporná čísla lze použít jako základy s mírnými úpravami procesu a vhodnými omezeními použitého souboru číslic.“
- ^ Pawlak, Z .; Wakulicz, A. (1957), „Využití expanzí se záporným základem v aritmometru digitálního počítače“, Bulletin de l'Académie Polonaise des Sciences, Classe III, 5: 233–236.
- ^ Marczynski, R. W., „Prvních sedm let polské práce na počítači“ Archivováno 19. 7. 2011 na Wayback Machine, IEEE Annals of the History of Computing, sv. 2, č. 1, leden 1980
- ^ Podívejte se na odkaz MathWorld Negabinary
- ^ Francis, Yu; Suganda, Jutamulia; Shizuhuo, Yin (4. září 2001). Úvod do informační optiky. Akademický tisk. str. 498. ISBN 9780127748115.
- ^ „Archivovaná kopie“. Citováno 2016-08-29.
- ^ Murugesan, San (1977). "Negabinární aritmetické obvody používající binární aritmetiku". IEE Journal on Electronic Circuits and Systems. 1 (2): 77. doi:10.1049 / ij-ecs.1977.0005.
- ^ D. Knuth. Umění počítačového programování. Svazek 2, 3. vydání. Addison-Wesley. str. 205, „Systémy polohových čísel“
Další čtení
- Warren Jr., Henry S. (2013) [2002]. Hacker's Delight (2. vyd.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8. 0-321-84268-5.