Turingmaschine Dezimahlzahl berechnen

Status
Für weitere Antworten geschlossen.

WieauchImmer23

Cadet 1st Year
Registriert
Aug. 2013
Beiträge
15
Hallo,
Ich habe diese Frage bereits in einem anderen Forum gestellt aber da konnte noch keiner helfen.
Also frage ich nochmal hier, da die Abgabe bereits Dienstag Nacht ist.

Hallo,
Ich habe hier eine relativ lange Aufgabe bei der ich einfach nicht weiterkomme, da ich schon für den Anfang keinen Ansatz habe.
Und zwar geht es darum, dass zwei GANZE Zahlen auf dem band stehen und diese addiert/mult/minus/dividiert/modulo und als Zusatz sinus berechnet werden sollen.
Die Zahlen sind im Dezimalsystem.

Wir können auch auf mehreren Bändern arbeiten, allerdings hatten wir dazu nur zwei theorie Folien in der VO und keine Bsp also verzichte ich darauf lieber.

Bsp: OOO193O23O+O
-> 193+23
ich stehe anfangs ganz rechts, also neben dem Operanden. O steht einfach für ein Blank.

Bei Addieren hatte ich jetzt zwei Ansätze:
Ich lese die rechte drei gehe, dann bis zum O und dann wieder zur ersten zahl (3).
Im gleichen Schritt überschreibe ich die beiden gelesenen Zahlen mit O
Dann gehe ich bis zur letzten linken Zahl und zwei Schritte weiter und schreibe dorthin meine sechs.

Ich habe allerdings keine Ahnung wie ich das elegant machen kann.
Wenn ich das so mache muss ich doch für jeden Schritt eine Maschine machen (also 0-9), diese geht dann über bis zur nächsten Zahl und dann wieder in eine andere Maschine die wieder 10 Kanten hat und dann das entsprechende Ausgeben.
Schon relativ viele Knoten.
Jetzt muss ich dann aber wieder zurück auf die zwei und dann mit 9 addieren, wo ja ein übertrag übrig bleibt.
Wenn das geschieht benötige ich wieder eine Maschine die das separat macht und dann wieder alle Knoten durchgehen.
Man sieht sehr umständlich.

2.)
Ich dachte mir, dass ich doch die Zahlen zuerst unär darstellen kann.
Die Einerstelle wäre wohl noch machbar, einfach eine Maschine die eine Zahl liest und dann entsprechend viele I schreibt. Allerdings habe ich dann schon dafür 10 Möglichkeiten.
Wenn ich dann die beiden Zehnerstellen lese muss ich das mit 10 Multiplizieren.
Wodurch ich wieder mehr Maschinen hätte, da ich ja auch von einer 100 stelligen Zahl ausgehen muss.
Und wenn ich fertig bin mit dem addieren muss ich es wieder zu Dezimal überführen.
Bei Addition und Subtraktion wäre unär wohl sehr leicht durchzuführen.
Allerdings hätte ich dann von Multiplikation und Division keine Ahnung.

Hat vielleicht jemand einen Ansatz für mich wie ich hier anfangen könnte? Oder wenigstens mal eine schöne Umrechnung von Dezimal <-> unär.
Mir würde wirklich schon ein Stoß in die richtige Richtung oder ein Pseudoalgorithmus helfen. Die Erklärung muss auch nicht mit Maschinen realisiert sein, einfach was logisches.
 
Wieviel Ahnung hast Du von Machine Code ? Kannst Du 8085 Assembler ?
 
was verstehst du unter "elegant"? (wenig zustaende, wenig schritte)

ich wuerde 3 baender nehmen(dann spart man sich schon mal die ganzen bewegungen zwischen den operanden). band1 = operand1, band2 = operand2 band3 = ergebnis. und auch hier benoetigst du etliche zustaende. hier mal fuer die addition

0+0+0 (operand1 , operand2, uebertrag von der vorherigen stelle)
0+0+1
0+1+0
0+1+1
...
9+9+0
9+9+1

das ganze machst du dann noch fuer die subtraktion.
multiplikation und division wuerde ich durch mehrmaliges anwenden der addition bzw der subtraktion berechnen (je nachdem was du unter elegant verstehst ist das jetzt gut oder schlecht). modulo kannst du damit dann auch gleich erschlagen.

fuer sinus gibt es eine reihe die aus den 4 grundrechenarten aufgebaut ist, also genau das was deine turingmaschine schon kann. wuerde ich wahrscheinlich aber nicht mehr programmieren, sondern nur sagen wie ich es machen wuerde.

ps: also ich finde die aufgabe nicht ganz ohne. wenn man davon 4 aufgaben auf dem uebungszettel und in der regel 1 woche zeit hat.
 
Wenn ich zwei Zahlen addieren müsste und das mit möglichst wenigen Zuständen (ist das deine Definition von Eleganz? ;)) dann würde ich von der einen Zahl 'B' 1 subtrahieren und zu der anderen Zahl 'A' hinzuaddieren, und zwar so oft bis Zahl 'B' null wird. Auf diese Weise bräuchte man sich auch (fast) nicht mit irgendwelchen Zehnerpotenzen beschäftigen und die Umrechnung ins Unärsystem wäre ebenfalls leicht möglich. Auch hinge die Anzahl der Zustände nicht von der Länge der Zahlen ab.

Ein Beispiel (Dezimalsystem):
Zahl 'A' = 192
Zahl 'B' = 203

192+203 Schritt 1 (S1)
193+202 S2
194+201 S3
195+200 S4
196+199 S5 (hier musst du einfach die Null ganz rechts und alle ihr folgenden Nullen durch 9 ersetzen bis du auf die erste 'nicht-null' triffst, von der du 1 subtrahierst.)

197+198 S6
.
.
.
395+000 S204 (Hier brauchst du noch eine Überprüfung, um festzustellen, dass Zahl 'B' null ist und du fertig bist).


Die Umrechnung ins Unärsystem ginge analog. Einfach immer 1 abziehen von der Zahl und auf den ersten freien Platz links von ihr eine 1 schreiben.


Nachteil bei der Sache: Relativ viele Schritte/Rechenoperationen und Kanten sind nötig, aber wenige Knoten/Zustände (Für die Addition sollten 13 reichen).
Ich hoffe das war jetzt einigermaßen verständlich und vielleicht sogar hilfreich :D?
 
Zuletzt bearbeitet:
protossgamer schrieb:
ps: also ich finde die aufgabe nicht ganz ohne. wenn man davon 4 aufgaben auf dem uebungszettel und in der regel 1 woche zeit hat.

Finde ich auch.
Aber rein aus Interesse und OT, um welche Art Veranstaltung handelt es sich da? Hatten nen Beispiel für ne Turing weitaus weniger tief angeschnitten, als kleinen Einstieg in Algorithmen und Datenstrukturen im Bsc. Wirtschaftsinfo.
 
Es hätte schlimmer kommen können. Wäre ich der Dozent, müsste die Turingmaschine eine beliebige Funktion numerisch integrieren können oder sowas. :evillol:

@WieauchImmer23
Gibts für den Sinus eine Vorgabe was die Genauigkeit des Ergebnisses betrifft?
 
So, ich hatte gerade ne richtig schöne Antwort geschrieben, aber da ich nicht auf "angemeldet bleiben" geklickt habe ist alles weg, also diesmal kurz.

Registermaschinen und ASm sollte für mich kein Problem sein.
Das ist nicht die einzige Aufgabe auf diesem Blatt, es ist nur eine Aufgabe.
Das ich Sinus machen würde habe ich gar nicht gedacht. Ich bin eigentlich schon froh wenn ich die Grundrechnungsarten und vielleicht Modulo habe.
Übrigends handelt es sich bei der Subtraktion um eine Subtraktion bei der nichts kleiner 0 rauskommen kann.

Eleganz:
Ja, schwer zu sagen was der Herr Dr. will :D
Aber ich würd mal sagen, wenn ich eine Abgabe habe mit 30 Maschinen je 10 Kanten aber es möglich ist das mit nur zehn Maschinen zu machen, wird meine Lösung nicht gerade viele %te bekommen.
Vor allem die Kompliziertheit bzw einfach Verständlichkeit und die Idee dahinter sollte gut durchdacht und ausgearbeitet sein.

@protossgamer
Ich habe leider keine Ahung wie du das meinst bzw wie ich damit rechnen soll. Wie schon oben geschrieben komme ich auch nicht mit zwei Bändern klar mangels Beispielen...
(ahhh jetzt versteh ichs so halbwegs doch)
Ich schätze mal das es damit bei Mult und Div wohl um einiges einfacher wäre vor allem wegen den Überträgen.


@Ochse
Ich hab wirklich so viel rumprobiert allein für die Addition und Unmengen verworfen auf Grund deren Komplexität aber auf diese beschissen einfache Methode bin ich nicht gekommen :/
Ich werde das jetzt schön aufzeichen und gucken ob es funktioniert.
Hast du vielleicht noch eine Idee was bei einem Überlauf zu tun wäre?
Sprich ich bin jetzt zu dem Punkt O999O29O gekommen, was dann zu 1000O28 kommen würde.
(Ahhh never mind, bin in der Schleife festgesteckt)

Hast du vielleicht noch so einen schönen Einfall bei Mult und Div?
Das Multiplikation nur eine mehrfache addition ist, ist klar. Aber trotzdem sehe ich nicht wie ich meine Additionsmaschine dafür benutzen könnte.
 
Ja, ein paar Ideen hab ich schon noch, aber bevor ich mir die Mühe mache die zu durchdenken oder sogar aufzuschreiben, hätte ich noch Fragen:
Wie genau soll die Division genau ablaufen?
Kann das Ergebnis eine Kommazahl sein oder eine der beteiligten Zahlen?
Modulo hieß nur der Rest wird berechnet, richtig?
Alles soll in eine einzige Turingmaschine gepackt sein, oder?

Ich glaube, wenn die Antwort auf die letzte Frage 'ja' lautet, ist es deutlich besser alles im Unärsystem zu erledigen.

Trotzdem hier erstmal die Addition im Dezimalsystem (war ziemlich dicht als ich das gestern aufgeschrieben hab, kann also Fehler enthalten :D)

Alan4.png

Erklärung:
Leerzeichen sind bei mir Unterstriche (_).
a="0-9", a-1 bedeutet, lese irgendeine Zahl zwischen 1 und 9 und subtrahiere 1 von ihr.


PS. Du kannst auf 'eingelogt bleiben' klicken um nicht so schnell ausgelogt zu werden.
 
Zuletzt bearbeitet:
Es steht zwar nichts da aber es wird sich wohl um eine Ganzzahldivision handeln, sprich 26/3 =8 sollte genügen.
Ja, Modulo ist der Rest einer Division, dafür sollten auch Teile von der Division verwendbar sein.
Alles in einer, verstehe nicht ganz was du meinst. Ich kann ja die befehle für Maschinen aufteilen und eigene Maschinen erstellen.

Ja, beim Unärsystem wäre Add und Sub sehr sehr einfach durch Shiften zu realisieren. Bei Mult und Div wäre ich mir da nicht so sicher.

Deines sieht ganz gut aus.
Mein Addierer besteht in den Grundzügen nur aus sechs Maschinen.
Und ich gehe immer von Anfang an ab ob eine null addiert wird, aber das ist ja egal.
 
Ich meine mit "alles in einem", dass die Turingmaschine erst den Operator liest und dann entscheidet was weiter geschehen muss, d.h. es gibt nicht für jeden Operator eine eigene Turingmaschine.

Ich frage mich, wie du die Addition in 6 Zuständen machen konntest, das sind immerhin 4 weniger als bei mir. :mad:

Die Tatsache, dass du nur eine Ganzzahldivision durchführen musst erleitert die Sache erheblich.
Lass mich noch ein bisschen über alles nachdenken ...:jumpin:


Edit:
Werde dir wahrscheinlich nicht mehr weiter helfen (ausgenommen dieser Post).
Die ganze Aufgabe ist irgendwie nervig und die Begrifflichkeiten, die du verwendendest, verwirren mich (z.B. Maschine anstatt Zustand) und dann noch diese diffuse Forderung nach Eleganz^^.
Aber hier nochmal ein Vorschlag bzw. Beispiel zur Division und zu Modulo (11/5):

_11_5_:_ Schritt 1 (S1)(Umwandlung ins Unärssystem; das kann immer also unabhängig vom Operator gemacht werden)
_1_10_4_:_ (S2)
_11_09_4_:_ (S3)
_111_08_4_:_ (S4)
.
.
.
_11111111111_00_4_:_ ( S12)(Fertig)
_11111111111____4_:_ (S13)(Nullen entfernen)
_11111111110____4_:_ (S14)(Null in die Unärzahl einfügen)
_11111111101____3_:_ (S15)(Null nach links shiften und von der Dezimalzahl 1 subtrahieren)
_11111111011____2_:_ (S16)(Null nach links shiften und von der Dezimalzahl 1 subtrahieren)
_11111110111____1_:_ (S17)(Null nach links shiften und von der Dezimalzahl 1 subtrahieren)
_11111101111____0_:_ (S18)(Null nach links shiften und von der Dezimalzahl 1 subtrahieren)
_11111001111____0_:_ (S19)(Null 1 Feld nach links kopiern, wenn links kein "_" steht)
_11111011111____0_:_ (S20)(2 Felder nach rechts gehen und Zahl dort 1 Feld nach links shiften)
_11111011111____0_:_ (S21)(2 Felder nach rechts gehen und Zahl dort 1 Feld nach links shiften)
_11111011111____0_:_ (S22)(2 Felder nach rechts gehen und Zahl dort 1 Feld nach links shiften)
_11111011110____0_:_ (S23)(2 Felder nach rechts gehen, dort ist ein "_" also 0 einfügen)
_11111011110____0_:_ (S24)(Nach links bis zur letzten Null gehen und wieder mit S19 anfangen)
.
.
.
_01111011110____0_:_ (S??)(Weitermachen bis die Null auf ein Leerzeichen kopiert würde, dann Abbruch)

Bei der Zahl 01111011110 repräsentiert die Anzahl aller Nullen ganz rechts bis zur ersten Eins den Rest der Division (hier in rot eine Null -> 11 mod 5 = 1). Die Anzahl aller anderen Nullen ist das Ergebnis der Division (zwei blaue Nullen -> 11/5=2).
Zum Schluss daher einfach links vom Geschehen alles Dezimal zusammenaddieren.
Die Multiplikation kann genauso im gemischten Zahlensystem erfolgen und sollte eigentlich relativ leicht machbar sein.

Wollte man bei der Turingmaschine die Anzahl der Zustände minimieren, käme kein schöner/eleganter Algorithmus raus, also hab ich das gar nicht erst versucht aber was versteht ein Ochse schon von Eleganz?
 
Zuletzt bearbeitet:
Ja, kein Problem hast mir ja eh schon viel geholfen und mir reciht ja die Logik.
Und ich kann halt nur die Begriffe verwenden die ich gelernt habe :)

Okay, diese Herangehensweise muss ich mir nochmal ansehen.

Aber vielleicht hast du ja noch einen Tipp für Mult/DIV mit Dezimalzahlen.
Ich bräuchte dafür doch nur die bereits vorhandenen addierer bzw subtrahierer.
Nur müsste ich eben die Zahl zB 100 mindestens zweimal kopieren. Einmal benötige ich die Zahl zum hinaufaddieren, einmal zum dekrementen und einmal um dann wenn nochmal multipliziert werden soll die Zahl noch zu kennen.
 
Ja vielleicht denk ich nochmal drüber nach.
Du hast gesehen, dass das Verfahren oben bereits eine Division durchführt (und gleichzeitig modulo)?
Worum geht es dir wenn du sagst du brauchst noch einen Tipp zur Muliplikation UND Division?

Edit:
Ich glaube Multiplikation, Addition und Subtraktion kannst du sehr gut zusammenpacken (Mit wenigen Zuständen und einem einzigen Addieren bearbeiten). Aber mal schauen.
Vielleicht kommt ja noch wer anderes zu Hilfe. Hallo liest das hier noch jemand ?:D
 
Zuletzt bearbeitet:
Also frage ich nochmal hier, da die Abgabe bereits Dienstag Nacht ist.
Viel Erfolg, aber wir sind kein Hausaufgaben-Board.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben