Umrechnung in andere Zahlensysteme
Transcrição
Umrechnung in andere Zahlensysteme
Ein Turbo-Pascal-Programm zur Umrechnung vom Dezimalsystem in andere Zahlensysteme∗ Stefan Ackermann Mathematisches Institut der Universität Leipzig 11. November 2005 Zusammenfassung Dezimalzahlen bzw. Dezimalbrüche lassen sich auf recht einfache Weise in ein anderes Zahlensystem zur Basis p umrechnen. Ausgangspunkt ist die Darstellung einer Zahl z in dem gewünschten Zahlensystem. Zweckmäßigerweise behandelt man ganzen Anteil [z] und den gebrochenen Anteil {z} auf unterschiedliche Art. Neben der Beschreibung der Algorithmen und der Angabe des vollständigen Programmes werden qualitative Aussagen zur Periodizität der entstehenden p-adischen Zahl getroffen. 0 Dieses Lehrmaterial wurde im Rahmen der studentischen Ausbildung am Mathematischen Institut der Universität Leipzig entwickelt. Es kann in der vorliegenden Form frei kopiert und weitergegeben werden. Eigenmächtige Änderungen sind unerwünscht. Anregungen und Änderungswünsche sind jedoch stets willkommen und werden bei Einverständnis in absehbarer Zeit eingearbeitet. email: [email protected] 1 Inhaltsverzeichnis 1 Umrechnung des ganzen Teils in eine p-adische Zahl 1.1 Die Darstellung von zg im p-adischen System . . . . . . . . . . . . . 1.2 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Codierung des Algorithmus . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 2 Umrechnung des gebrochenen Anteils in eine p-adische Zahl 2.1 Die Darstellung von zb im p-adischen System . . . . . . . . . . 2.2 Periodenbeginn und -länge . . . . . . . . . . . . . . . . . . . . . 2.3 Codierung des Algorithmus . . . . . . . . . . . . . . . . . . . . 2.4 Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 4 5 6 3 Anwendung des Programmes 3.1 Weitere ganzzahlige Beispiele . . . . . . . . . . . . . . . . . . . . . . 3.2 Probleme mit der Rechengenauigkeit . . . . . . . . . . . . . . . . . . 3.3 Ein nicht ganzzahliges Beispiel . . . . . . . . . . . . . . . . . . . . . 6 6 7 7 4 Umrechnung aus anderen Zahlensystemen heraus 4.1 Das kleine Einmaleins zur Basis 5 . . . . . . . . . . . . . . . . . . . . 4.2 Beispiel 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Beispiel 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 9 10 A PROGRAMM: 10 2 . . . . . . . . 1 Umrechnung des ganzen Teils in eine p-adische Zahl Sei z ∈ R gegeben, so bezeichne man den ganzen Teil von z mit zg := [z] und den gebrochenen Anteil von z mit zb := {z}. 1.1 Die Darstellung von zg im p-adischen System Den ganzen Teil zg kann man nun in Anlehnung an das bekannte HORNER-Schema folgendermaßen darstellen: zg = zk pk + zk−1 pk−1 + ... + z2 p2 + z1 p + z0 = (zk pk−1 + zk−1 pk−2 + ... + z2 p + z1 )p + z0 = ((zk pk−2 + zk−1 pk−3 + ... + z2 )p + z1 )p + z0 = (...(zk p + zk−1 )p + ... + z2 )p + z1 )p + z0 Die zi sind die Ziffern im p-adischen System, d. h. es gilt 0 ≤ zi < p. Durch das iterative Ausklammern von p sieht man sofort: • z0 ist der Rest von zg bei der Teilung durch p, also z0 = zg MOD p; • z1 ist der Rest des bei der obigen Division erhaltenen ganzzahligen Quotienten bei der erneuten Teilung durch p, d. h. z1 = [zg /p] MOD p bzw. z1 = (zg DIV p) MOD p usw. Den ganzen Anteil im neuen p-adischen System erhält man daher einfach durch fortwährendes Dividieren durch die Basis p und “Aufsammeln” der Reste in einer Zeichenkette von rechts nach links, solange bis als Ergebnis der Division 0 auftritt. 1.2 Beispiele Man stelle die Zahl 43 in den Zahlensystemen zur Basis 7 bzw. zur Basis 11 dar! Es ist 43 : 7 = 6 Rest 1 43 : 11 = 3 Rest 10 6 : 7 = 0 Rest 6 3 : 11 = 0 Rest 3 43 = 61[7] 2 43 = 3A[11] 3 2 Das für die Darstellung maßgebliche Zahlensystem wird als Index in eckigen Klammern angegeben. Fehlt diese Angabe, dann ist das Dezimalsystem maßgebend. 3 Bei Zahlensystemen zu einer Basis größer als 10 werden die fehlenden Ziffern durch große Buchstaben dargestellt, also A = 10, B = 11 usw. 3 1.3 Codierung des Algorithmus In einem Turbo-Pascal-Programm sähe das folgendermaßen aus: var z, zb : real; p, zg, rest, : integer; ganz, bruch : string; { eventuell auch double oder extended } { eventuell auch longint } {*** Behandlung des ganzen Anteils ***} ganz:=’’; Repeat rest:=zg MOD p; if rest>9 then rest:=rest+7; ganz:=CHR(48+rest)+ganz; zg:=zg DIV p; until zg=0; 2 {Vgl. ASCII-Code-Tabelle} Umrechnung des gebrochenen Anteils in eine padische Zahl Es sei nochmal an die unter 1. beschriebene Zerlegung z = zg + zb erinnert. 2.1 Die Darstellung von zb im p-adischen System Den gebrochenen Anteil zb stellt man nun folgendermaßen dar: zb = z−1 p−1 + z−2 p−2 + ... + z1−m p1−m + z−m p−m + ... = (z−1 + z−2 p−1 + ... + z1−m p2−m + z−m p1−m + ...)/p = (z−1 + (z−2 + ... + z1−m p3−m + z−m p2−m + ...)/p)/p Im Grunde ist dies wieder das HORNER-Schema, diesmal mit der Variablen p1 . Aus der letzten Zeile, die durch fortwährendes Ausklammern von p−1 entstanden ist, kann man nun ablesen: • z−1 ist der ganze Anteil des Produktes zb p, also z−1 = [zb p], • z−2 ist der ganze Anteil des Produktes von p mit dem gebrochenen Anteil des obigen Produktes, d.h. z−2 = [p {zb p}] usw. Den gebrochenen Anteil im neuen p-adischen System erhält man daher einfach durch fortwährendes Multiplizieren mit der Basis p und Abspalten der ganzen Anteile der Zwischenprodukte, die man in einer Zeichenkette von links nach rechts aufsammelt. Dieser Prozeß endet, wenn ein solches Produkt ganzzahlig wird. Das kann nur dann passieren, wenn der Nenner von zb (in der Darstellung als gekürzter Bruch) nur Primfaktoren enthält, die auch in p enthalten sind. Anderenfalls ist der p-adische Bruch periodisch bzw. bei einer irrationalen Zahl auch unendlich. 2.2 Periodenbeginn und -länge z sei nun ein vollständig gekürzter, echter Bruch, also z = ggT(m, n) = 1. 4 m n mit m < n ∈ N und Unabhängig von p, d. h. vom Zahlensystem, in dem m und n dargestellt sind, treten höchstens n−1 verschiedene Reste bei der Division durch n auf, d. h. spätestens nach n Divisionen wiederholen sich die p-adischen Ziffern. Somit ist die Periodenlänge höchstens n. Abhängig von p tritt dieser Fall allerdings häufig viel früher ein. Dabei können noch einige “Vorziffern” auftreten, bevor die Periode beginnt. Sei zb = m n = 0, z−1 ...z−k z−(k+1) ...z−(k+l) , also k die Anzahl der Vorziffern und l die Periodenlänge. n läßt sich noch als Produkt n = n1 n2 schreiben, wobei n1 das Produkt aller zu p teilerfremden Primfaktoren von n ist. Mit anderen Worten ist ggT(p, n1 ) = 1 und ggT(p, n2 ) = ggT(p, n). Dann gilt: • k ist die kleinste der nichtnegativen ganzen Zahlen x, für die n2 Teiler von px ist. • l ist die kleinste der natürlichen Zahlen y, für die n1 Teiler von py − 1 ist bzw. für die py bei der Teilung durch n1 den Rest 1 läßt. Ist n1 = 1, dann ist l = 0. Um sich diesen Sachverhalt zu veranschaulichen, benutzt man den hier beschriebenen Algorithmus zur Bestimmung der p-adischen Ziffern, d. h. die fortlaufende Multiplikation mit p und das Abspalten des ganzzahligen Anteils. Ist z = n1mn2 , so kann man in dem nach k Multiplikationen mit p entstandenen Bruch mit n2 kürzen, d. h. es ist z pk = qm m k p = . n1 n2 n1 Die bei folgenden Multiplikationen auftretenden ganzzahligen Anteile, die ja gerade die gesuchten p-adischen Ziffern sind, hängen nun nicht mehr von n2 ab. Nach weiteren l Multiplikationen ist z pk pl = qm l qm p ≡ mod n1 , n1 n1 da pl ≡ 1 mod n1 , d. h. es treten von nun an wieder die gleichen ganzzahligen Anteile auf wie bereits vor l Multiplikationen. An dieser Stelle sieht man auch, dass im Falle n1 = 1, also wenn n nur aus Primfaktoren besteht, die auch in p enthalten sind, der Algorithmus nach k Schritten endet. Im Falle n2 = 1, also wenn n und p teilerfremd sind, treten keine “Vorziffern” auf. 2.3 Codierung des Algorithmus In Turbo-Pascal könnte man dies wieder folgendermaßen programmieren: {*** Behandlung des gebrochenen Anteils ***} bruch:=’’; If zb>0 then begin 5 bruch:=’.’; Repeat zb:=p*zb; rest:=TRUNC(zb); zb:=FRAC(zb); if rest>9 then rest:=rest+7; {Vgl. ASCII-Code-Tabelle} bruch:=bruch+CHR(48+rest); until (zb=0) or (length(bruch)=21); if (length(bruch)=21) and (zb>0) then bruch:=bruch+’...’; end; 2.4 Beispiele Man stelle den Dezimalbruch 0.125 in den Systemen zur Basis 7 und zur Basis 14 dar! • Vorüberlegung Es ist 0.125 = 18 und 8 = 23 , d. h. für p = 7 ist n1 = 8 und n2 = 1, somit k = 0 wegen 1|70 und l = 2 wegen 8|72 − 1 = 48, aber nicht 8|71 − 1 = 6. Dagegen ist für p = 14 = 7 ∗ 2 n1 = 1 und n2 = 8, somit k = 3 wegen 8|143 = 2744, aber nicht 8|142 = 196 und l = 0 wegen 1|140 − 1. • Umrechnung 0.125 ∗ 7 = 0.875 0.125 ∗ 14 = 1.75 0.875 ∗ 7 = 6.125 0.75 ∗ 14 = 10.50 0.125 ∗ 7 = 0.875 0.5 ∗ 14 = 7.0 0.875 ∗ 7 = 6.125 0.0 ∗ 14 = 0.0 0.125 = 0.06[7] 0.125 = 0.1A7[14] • Bemerkung Im Falle p = 14 bricht der Prozeß ab, weil der Nenner 8 nur den Primfaktor 2 enthält, der auch in 14 enthalten ist. 3 Anwendung des Programmes Versieht man die oben angegebenen Teil-Routinen noch mit Programmtext zur Datenein- und -ausgabe, dann erhält man das im Anhang A angegebene TurboPascal-Programm. Die nun folgenden Beispiele wurden mit diesem Programm gerechnet. 3.1 Weitere ganzzahlige Beispiele • Umzuwandlungen der Zahl 39 in Zahlen zur Basis 2 bis 17 6 Basis = 2 100111 1110 Basis = 3 Basis = 4 213 124 Basis = 5 Basis = 6 103 54 Basis = 7 Basis = 8 47 43 Basis = 9 Basis = 10 39 Basis = 11 36 Basis = 12 33 Basis = 13 30 Basis = 14 2B Basis = 15 29 Basis = 16 27 Basis = 17 22 • Umzuwandlungen der Zahl 123 in Zahlen zur Basis 2 bis 17 Basis = 2 1111011 11120 Basis = 3 Basis = 4 1323 443 Basis = 5 Basis = 6 323 234 Basis = 7 Basis = 8 173 Basis = 9 146 3.2 Basis = 10 123 Basis = 11 102 Basis = 12 A3 Basis = 13 96 Basis = 14 8B Basis = 15 83 Basis = 16 7B Basis = 17 74 Probleme mit der Rechengenauigkeit Der angebene Algorithmus funktioniert natürlich nur, wenn man exakt rechnen kann. Dazu könnte man ihn z. B. in einem Computeralgebrasystem wie Maple oder Mathematica realisieren. Die hier vorgestellte Implementierung verwendet das Rechenwerk des Turbo-PascalCompilers. Im ganzzahligen Fall kann man exakt rechnen, solange die Zahlen nicht den in Turbo-Pascal vorgebenen Typenbereich (Integer: −32768...32767) bzw. (LongInt: −2147483648...2147483647) verlassen. Bei größeren Zahlen muss man auf real-Typen ausweichen, was sofort Rundungs- und Rechenfehler bei den Divisionen nach sich zieht. Bei der Umrechnung des gebrochenen Anteils treten von vornherein Rechenungenauigkeiten auf. Je nachdem, ob man sich für den Typ real, double oder extended entscheidet, muss man spätestens im Bereich von (dezimal) 10−13 , 10−16 oder 10−20 damit rechnen, dass die Ergebnisse fehlerbehaftet sind. Um exakte Ergebnisse auch unter Turbo-Pascal zu erhalten, müsste man die Zahlen als Zeichenketten darstellen und für diese zwei der schriftlichen Multiplikation bzw. Division nachempfundene Routinen zur Multiplikation und Division mit Rest programmieren. Mit diesen Unterprogrammen könnte man dann auch mit beliebig großen ganzen Zahlen rechnen. Fügte man einem solchen Programm noch einen Euklidischen Algorithmus hinzu, dann könnte man mit den in 2.2 beschriebenen Mitteln innerhalb des Programmes auch die Anzahl der Vorziffern und die Periodenlänge bestimmen. Im folgenden Beispiel sind Periodenlänge und Anzahl der Vorziffern allerdings nachträglich “mit der Hand” ausgerechnet worden. 3.3 Ein nicht ganzzahliges Beispiel 41 Ergebnisse der Umwandlung der Zahl 7.41 = 7 + 100 in einen p-adischen Bruch für 2 ≤ p ≤ 20 bei 30 ausgerechneten Nachkommastellen. 7 p 7.41 n1 n2 k l 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 111.01101000111101011100001010001 21.10200122000021021211102001220 13.12203311300220331130022033113 12.20111111111111111111111111010 11.22432054320543205432054241141 10.26042604260426042604253555213 7.32172702436560507534? 7.36180072543618007252644816515 7.40999999999999999986122212192 7.45678A012345678A0049057889A66 7.4B05915343A0B62A64B41515BA899 7.543A018C7C1229649438C314B5570 7.5A507BA8D623507B65A0BDDA5B92B 7.623B3B3B3B3B3B3A51240991550BB 7.68F 5C28F 5C28F 5C 7.6G85A64F DD1902EC7D0CGGDF 21775 7.76F 22F F 22F F 22F E3597CHE5E8BAA1 7.7F 03BB3IF 77F 03993849C904IF H8H 7.83JJJJJJJJJJJJF 91044F 8D1619DF 25 4 100 1 25 4 4 25 25 4 100 1 25 4 100 1 1 100 100 1 25 4 100 1 25 4 4 25 25 4 100 1 25 4 100 1 1 100 2 0 1 2 2 0 1 0 2 0 1 0 2 2 1 0 2 0 2 20 20 10 1 5 4 20 10 0 10 20 20 10 2 5 20 4 10 0 Man beachte die Rechenungenauigkeit des Computers: Bei p = 8, p = 12, p = 13 und p = 17 kann man die Periode nicht erkennen. Bei p = 10 und p=20 müsste der Algorithmus nach jeweils zwei Schritten beendet sein, also 7.41 bzw. 7.84 als Ergebnis liefern. 4 Umrechnung aus anderen Zahlensystemen heraus Im Prinzip kann man diese Umrechnungen aus jedem Zahlensystem heraus vornehmen, in dem man die Multiplikation und die Division - d. h. das kleine Einmaleins - beherrscht. Da wir - und auch alle Computerhochsprachen - noch immer die Division im Zehnersystem bevorzugen, sind uns diese Rechenregeln nicht so geläufig. (Es soll sogar Leute geben, die für das kleine Einmaleins im Dezimalsystem den Taschenrechner bemühen müssen.) Auch das im Anhang angegebene Programm leistet nur Umrechnungen vom Zehnersystem in ein System mit der Basis 2 bis 36. Für mehr Ziffern reicht das Alphabet nicht aus. Am Beispiel des Zahlensystems zur Basis 5 soll im folgenden trotz allem demonstriert werden, wie solche Umrechnungen vorzunehmen sind. 4.1 Das kleine Einmaleins zur Basis 5 ... angegeben als Multiplikationstafel. Da beim mehrstelligen Multiplizieren auch addiert werden muss, sei auch noch eine Additionstafel angegeben: 8 ∗ 0 1 2 3 4 10 0 1 0 0 0 1 0 2 0 3 0 4 0 10 2 0 2 4 11 13 20 3 0 3 11 14 22 30 4 0 4 13 22 31 40 10 0 10 20 30 40 100 + 0 1 2 3 4 10 0 1 2 0 1 2 1 2 3 2 3 4 3 4 10 4 10 11 10 11 12 3 3 4 10 11 12 13 4 4 10 11 12 13 14 10 10 11 12 13 14 20 Man beachte 5 = 10[5] ! Es ist z. B. 4[5] ∗4[5] = 4∗4 = 16 = 3∗51 +1 = 31[5] und 13[5] : 2[5] = 8 : 2 = 4 = 4[5] . 4.2 Beispiel 1 Man rechne die Zahl 1234.12[5] in einen 3-adischen Bruch um! • Umrechnung des ganzen Teils: 12[5] : 3 = 2 Rest 1 13[5] : 3 = 2 Rest 2 24[5] : 3 = 4 Rest 2 , da 2 ∗ 3 = 11[5] , da 2 ∗ 3 = 11[5] , da 4 ∗ 3 = 22[5] Insgesamt ist also 1234[5] : 3 = 224[5] Rest 2. Analog erhält man 224[5] : 3 = 41[5] Rest 1, ebenso 41[5] : 3 = 12[5] Rest 0, und 12[5] : 3 = 2 Rest 1, 2[5] : 3 = 0 Rest 2. Zusammengefasst erhält man daraus 1234[5] = 21012[3] . In der Tat ist 1234[5] = 1 ∗ 53 + 2 ∗ 52 + 3 ∗ 5 + 4 = 125 + 50 + 15 + 4 = 194 = = 162 + 27 + 3 + 2 = 2 ∗ 34 + 1 ∗ 33 + 0 ∗ 32 + 1 ∗ 3 + 2 = 21012[3] . • Umrechnung des gebrochenen Teils 0.122...[5] ∗ 3 = 0.422...[5] 0.422...[5] ∗ 3 = 2.322...[5] 0.322...[5] ∗ 3 = 2.022...[5] 0.022...[5] ∗ 3 = 0.122...[5] usw. (Man beachte 2 ∗ 3 = 11[5] bei ständigem Übertrag 1.) Es ist also 0.12[5] = 0.0220[3] . Die Periode hat die Länge 4. • Tatsächlich ist 0.12[5] = 1 5 + 2 25 + 2 125 + ... = 1 5 + 2 25 1 i i=0 5 2 5 = 15 + 25 4 P∞ | geometrische Reihe = 3 10 . Mit den Bezeichnungen aus Abschnitt 2.2 ist dann n1 = 10, n2 = 1, k = 0 und l = 4 wegen 10|34 − 1. 9 4.3 Beispiel 2 Man rechne die Zahl 1234.12[5] in einen 14-adischen Bruch um! Dabei beachte man 14 = 24[5] • Umrechnung des ganzen Teils: 123[5] : 24[5] = 2 Rest 20[5] 204[5] : 24[5] = 3 Rest 22[5] , da 24[5] ∗ 2 = 103[5] , da 24[5] ∗ 3 = 132[5] Insgesamt ist also 1234[5] : 22[5] = 23[5] Rest 22[5] . Analog erhält man 23[5] : 24[5] = 0[5] Rest 23[5] . Unter Beachtung von 22[5] = 12 = C[14] und 23[5] = 13 = D[14] erhält man daraus 1234[5] = DC[14] . In der Tat ist 1234[5] = 1 ∗ 53 + 2 ∗ 52 + 3 ∗ 5 + 4 = 125 + 50 + 15 + 4 = 194 = = 13 ∗ 14 + 12 = DC[14] . • Umrechnung des gebrochenen Teils 0.122...[5] ∗ 24[5] 0.044...[5] ∗ 24[5] 0.344...[5] ∗ 24[5] = 4.044...[5] = 2.344...[5] = 21.044...[5] Die erste Zeile rechnet man beispielsweise so aus: 0.122...[5] ∗ 20[5] 0.122...[5] ∗ 4[5] = 2.444...[5] = 1.044...[5] Die Addition der beiden Zwischenergebnisse liefert 4.044...[5] . Mit 21[5] = 11 = B[14] ist also 0.12[5] = 0.42B [14] . Die Periode hat die Länge 2. 3 • Tatsächlich ist wegen 0.12[5] = 10 unter Verwendung der Bezeichnungen aus Abschnitt 2.2 n1 = 5, n2 = 2, d. h. k = 1 wegen 2|14 und l = 2 wegen 5|142 − 1. A PROGRAMM: Programm zur Umrechnung einer positiven Dezimalzahl in ein Zahlensystem mit einer Basis zwischen 2 und 36. Ziffern größer als 9 werden durch die Buchstaben A, B, C,... dargestellt. program zsys;\\ {Umrechnung vom Dezimalsystem in andere Zahlensysteme Stefan Ackermann, Universit"at Leipzig, November 1992} uses crt; var z, zb : double; p, zg, rest, line: integer; 10 ganz, bruch : string; begin clrscr; window(5,1,75,25); clrscr; WriteLn(’Programm zur Umrechnung einer positiven Dezimalzahl in ein’); WriteLn(’Zahlensystem mit einer Basis zwischen 2 und 36’); WriteLn; WriteLn(’Ziffern groesser als 9 werden durch die Buchstaben A, B, C,...’); WriteLn(’dargestellt.’); WriteLn(’-------------------------------------------------------------’); WriteLn; p:=1; While p>0 do {*** Eingabe ***} begin if p=1 then begin window(1,8,80,25); clrscr; Write(’ Eingabe der umzuwandelnden Zahl: ’); ReadLn(z); window(2,24,80,25); WriteLn(’ 1’+chr(26)+’Neue Zahl/0’+chr(26)+’Beenden’); window(1,10,80,22); clrscr; end; zg:=TRUNC(z); {ganzen Teil abspalten} zb:=FRAC(z); {gebrochenen Teil abspalten} Write(’ Basis= ’); line:=whereY; p:=-1; While not ((p=TRUNC(p)) and (p>-1) and (p<37)) do begin GotoXY(10,line); clrEOL; ReadLn(p); if line=13 then line:=12; end; if p>1 then begin {*** Behandlung des ganzen Anteils ***} ganz:=’’; Repeat rest:=zg MOD p; if rest>9 then rest:=rest+7; ganz:=CHR(48+rest)+ganz; zg:=zg DIV p; until zg=0; 11 {Vgl. ASCII-Code-Tabelle} {*** Behandlung des gebrochenen Anteils ***} bruch:=’’; If zb>0 then begin bruch:=’.’; Repeat zb:=p*zb; rest:=TRUNC(zb); zb:=FRAC(zb); if rest>9 then rest:=rest+7; {Vgl. ASCII-Code-Tabelle} bruch:=bruch+CHR(48+rest); until (zb=0) or (length(bruch)=21); if (length(bruch)=21) and (zb>0) then bruch:=bruch+’...’; end; {*** Ausgabe der Ergebnisse ***} GotoXY(13,line); WriteLn(’: ’, ganz, bruch); end; end; window(1,1,80,25); clrscr; end. Interessenten stelle ich das Programm gern auch auf Diskette oder noch lieber per Email1 zur Verfügung. 1 [email protected] 12