TI-57 -- Programm "NUMERI ROMANI"
Umwandlung von Römischer Zahlschrift nach Indischer Zahlschrift
Römische Tastatur anno MCMLXXXI
In der Vor-Homecomputerzeit war sie eine recht beliebte Fingerübung, die Umrechnung römischer Zahlen (lat. numeri romani) in das moderne Zahlensystem mit indischen Ziffern. Das allein wäre aber kein Grund "Numeri Romani" als erstes Beispiel eines Taschenrechnerprogramms im Forum vorzustellen. Ausschlagegebend waren vielmehr:
- Volle Ausschöpfung der Möglichkeiten des TI-57
- Einführung in einfaches AOS-Programmieren
- Keine technischen oder mathematischen Fachkenntnisse erforderlich
- Einfache Portierung auf andere Modelle
Meist wird bei Taschenrechnerprogrammen auf ein Ablaufdiagramm verzichtet. Das ist auch hier kein Problem. Erklärungsbedarf dafür bei der Ein- und Ausgabe, denn mangels alphanumerischer Zeichen werden Zifferntasten verwendet, und zwar nach folgendem Schlüssel:
Röm. Zahlzeichen |
Zahlwert | Zifferntaste |
---|---|---|
I | 1 | 1 |
V | 5 | 2 |
X | 10 | 3 |
L | 50 | 4 |
C | 100 | 5 |
D | 500 | 6 |
M | 1 000 | 7 |
V•M | 5 000 | 8 |
X•M | 10 000 | 9 |
Ursprünglich war nur eine Eingabe von Zahlzeichen bis M vorgesehen, da die römische Zahlschrift keine einheitliche Regelung für Werte oberhalb 3999 kennt. Die übliche Schreibweise mit Vinkulum läßt sich im gewählten numerischen Darstellungsschema nicht anwenden. Sie wäre auch algorithmisch komplizierter. Stattdessen bietet die simple Multiplikationsschreibweise an (Zahlzeichen V•M und X•M). So ist der Programmcode ohne Änderung auch oberhalb 3999 nutzbar. Streng nach Yhprums Gesetz: „Alles, was funktionieren kann, wird auch funktionieren.“ Eine andere Eigenart der römischen Zahlen läßt sich leider nicht so mühelos umgehen.
Subtraktionsregel
Die römische Zahlschrift beschreibt ein Additionssystem, d.h. Zahlzeichen werden unabhängig von ihrer Stellung addiert. Zwar stehen die Zeichen der Größe nach geordnet, doch auf ihren Zahlwert hat diese Anordnung zunächst keinen Einfluß. Man erkennt sofort, daß immer dann ein besonders langer römischer Zahlausdruck entsteht, wenn die darzustellende Zahl im modernen Stellenwertsystem die Ziffern 4 oder 9 enthält. So hätte Columbus in rein additiver Darstellung im Jahr MCCCCLXXXXII als erster Europäer die Karibik erreicht. Zwölf Zahlzeichen, wo dem Stellenwertsystem 4 Ziffern genügen: 1492. Da hilft es auch nicht, daß skandinavischen Siedlern unter Leif Eriksson schon um das Jahr M als ersten Europäern die Entdeckung Amerikas gelang.
Eine Abkürzung tut not. Naheliegenderweise bedient man sich dazu in einem Additionssystem der Subtraktion:
Steht eines der Zahlzeichen I, X oder C
vor einem der beiden jeweils nächstgrößeren Zahlzeichen,
so ist von diesem besagtes I, X oder C abzuziehen.
Subtraktionsgruppe | statt |
Zahlwert |
---|---|---|
IV | IIII | 4 |
IX | VIIII | 9 |
XL | XXXX | 40 |
XC | LXXXX | 90 |
CD | CCCC | 400 |
CM | DCCCC | 900 |
Gebräuchlich ist außerdem, ein einzelnes I oder X auch vor noch höheren Zeichen zu schreiben. So wird z.B. 99 zu IC statt XCIX - viel kürzer und übersichtlicher.
Zahlzeichen der sog. Fünferbündelung (V, L, D) setzt man ausschließlich vor kleineren Zahlzeichen, nie vor größeren. Ihr Wert wird also immer addiert, niemals subtrahiert.
Aber damit genug der Theorie. Als weiterführende Lektüre kann ich empfehlen: "Universalgeschichte der Zahlen" von Georges Ifrah.
Programmablauf
Schritte 00 bis 12
Nach Initialisierung wird die Anzahl der eingebenen Zahlzeichen ermittelt und die römische Zahl hinters Komma geschoben (Format "0.x").
Beispiel: die zweistellige Eingabe 65 für DC, also die Zahl 600, liefert einen Zehnerlogarithmus log(65) = 1,81. Um 1 erhöht und zur Ganzzahl verkürzt ergibt das die gesuchte Anzahl der Stellen: 2
Schritte 13 bis 44
Hier ist eine Zählschleife aufgebaut, die für jedes Zahlzeichen genau einmal durchlaufen wird.
Darin wird der Zahlwert w des Zeichens r bestimmt:
w= [ 1/2 + r/2 - INT(r/2) ] * 10^ INT(r/2) = [ 1/2 + FRAC(r/2) ] * 10^ INT(r/2)
mit 0 <= r <= 9 als Ziffernwert des eingebenen Zahlzeichens.
In Register 1 werden die einzelnen Zahlwerte addiert (Schritt 41).
Um ein paar Schritte einzusparen, wird der Zahlwert immer addiert, auch wenn er gemäß Subtraktionsregel eigentlich abzuziehen wäre. Zur Korrektur wird im nächsten Schleifendurchgang gegebenenfalls das alte Zahlzeichen zweimal subtrahiert, was platzsparend in den Schritten 35 bis 39 erfolgt.
In den verbleibenden Schritten 48 und 49 könnten nun noch Anweisungen untergebracht werden, die den Rechner ohne Ausschalten, d.h. ohne Löschen des Programms, in einen akkuschonenden Schlafmodus versetzen. Im Batteriebetrieb ist das aber wenig sinnvoll.
Bedienung des Programms
Vor dem Start wird der Rechner in Ganzzahldarstellung gebracht:
2nd INV Fix
Eingabe
Ganze römische Zahl, R/S
In einem Zug läßt der TI-57 max. 8 Stellen zu, obwohl die interne Darstellung 11 Stellen umfasst. Durch Addition sind im X-Register aber Zahlen bis max. 11 Stellen darstellbar.
Testbeispiel
MCMXLI
Diese Zahl können wir direkt eingeben:
757341 R/S
Nun huschen hektisch Zwischenergebnisse durch die Anzeige. Nach einer Viertelminute leuchtet in sattem Rot:
1941.
Das Entstehungsjahr der Zuse Z3, des ersten funktionsfähigen Digitalrechners.
Weitere Beispiele
CCCLXXXVIII
Diese 11stellige Zahl wird indirekt eingegeben, erst acht Stellen, dann die restlichen drei:
55543332 * 1 EE 3 + 111 = R/S
Ergebnis: 388.
Der Wert der kleinsten 11-stelligen römischen Zahl (siehe auch OEIS A036746)
MDCLXXIII
(Leibnizsche Vierspezies-Maschine)
MCMLXXIV
(HP-65, erster programmierbarer Taschenrechner)
MCMLXXVII
(Markteinführung Commodore PET 2001, Apple II, TRS-80, Atari 2600, TI-57)
MMMMDCCXI
(Dufte!)
MV•MDCCXI
(dito)
X•MV•MMDCLXVI
(einmal die ganze Klaviatur, OEIS A118640)
IX•M
Eingabe: 19 R/S
(Wiederentdeckung des Y2K-Problems?)
Programmcode
Zur Eingabeprozedur siehe das Handbuch. Am besten frisch geladenen Akku oder neue Batterie verwenden.
--Anzeige-- Befehl Kommentar
Zeile Schlüssel
#Initialisierung:
00 32 2 STO 2 Eingabe x in R2
01 00 0 Startwert
02 32 1 STO 1 Indische Zahl
03 32 7 STO 7 Zahlenwert zur linken, R7=Testregister T
#Röm. Zahl in Format "0.x" bringen:
04 33 2 RCL 2 Römische Zahl
05 18 LOG
06 75 +
07 01 1
08 85 =
09 49 Int Anzahl röm. Zahlzeichen
10 32 0 STO 0 Laufzahl für Schleifenkontrolle
11 -18 INV LOG 10^x
12 -39 2 INV Prd 2 Registerarithmetik (/) R2, Format "0.x"
#Sprungmarke '0', Beginn der Zählschleife
13 86 0 Lbl 0
#Ermittlung neues Zahlzeichen:
14 01 1
15 00 0
16 39 2 Prd 2 Registerarithmetik (*) R2, Linksschieben
17 33 2 RCL 2
18 49 Int höchstwertiges Zahlzeichen
19 -34 2 INV SUM 2 Registerarithmetik (-) R2, restliche röm. Zahl
#Berechnung Zwischenwert:
20 45 /
21 02 2
22 85 =
23 32 3 STO 3 Zwischenwert
#Berechnung neuer Zahlenwert:
24 49 Int
25 -18 INV LOG
26 55 *
27 43 (
28 33 3 RCL 3 Zwischenwert
29 -49 INV Int FRAC
30 75 +
31 83 .
32 05 5
33 44 )
34 85 =
#Wertberichtigung im Fall Subtraktionsregel:
35 22 x<->t Tausch mit Register 7
36 -76 INV x>=t x<t?
37 -34 1 INV SUM 1 Registerarithmetik (-) R1
38 -76 INV x>=t
39 -34 1 INV SUM 1
#Addition neuer Zahlenwert:
40 22 x<->t
41 34 1 SUM 1
#neuer Zahlenwert zur linken:
42 38 7 Exc 7 dasgleiche wie x<->t
43 56 Dsz Schleifenkontrolle mit R0
#Ende der Zählschleife
44 51 0 GTO 0 Sprung zu Marke '0', falls |R0|<=1
#Ausgabe:
45 33 1 RCL 1 Indische Zahl
46 81 R/S Halt und Anzeige
47 71 RST Nach Neustart Programmzähler zurück auf Schritt 00
Display More
5 Register, 48 Programmschritte
Autor: Postfix
Danke für's Mitmachen!
Freue mich schon auf Eure Programmbeispiele für den SR-56, TI-58, HP-65, HP-41C, Casio FX602P...