2012-04-12 7 views
3

Ich habe ein Hausaufgabenproblem, das mich fragt, ein Programm für eine nicht deterministische Turing-Maschine zu beschreiben, die L = {a^n: n is prime} akzeptiert. Ich bin mir nicht sicher, wie ich das anstellen soll. Kenne ich n? verwende ich die a s als unäre Ziffern und zähle sie? kann ich einfach die string ignorieren, und nur für die primär von n testen? Oder sind die Primzahlen bekannt, und nur die Zellenpositionen akzeptieren Zustände und ich kann die Daten einfach wie normal einlesen?Turing Machine zum Akzeptieren von Zeichenketten mit Hauptlängen

wie soll ich darüber gehen?

+0

Sie sollten Ihren Dozenten oder Tutor zur Klärung bitten. Wir können versuchen zu erraten, was sie gemeint haben (so intelligent eine Vermutung auch sein mag), aber nur sie wissen es sicher. – paxdiablo

+0

Wenn Sie nach Ihrem Titel gehen wollen, dann ist wahrscheinlich gemeint, dass Ihr NTM irgendeine Zeichenfolge von 'a's primärer Länge akzeptieren sollte. Zählen Sie also Ihre 'a's, lehnen Sie die Zeichenfolge ab, wenn ein anderes Symbol zu sehen ist, und akzeptieren Sie, wenn keine weiteren Symbole vorhanden sind. Schaut so aus. Und natürlich ist kein Prime "bekannt", Ihr Band würde nur eine Sequenz von 'a's anfänglich enthalten, und der ganze Rest wäre leer. –

+0

Wahrscheinlich besser auf http://programmers.stackexchange.com/ – Abizern

Antwort

2

Sie können das tatsächliche unbegrenzte Sieb von Eratosthenes links von Ihrem Ursprungspunkt auf Band setzen.

Nichtdeterminismus ermöglicht Ihnen, für jeden Status mehr als eine Übergangsregel zu haben. Wenn Sie also in Schritten von n nach links gehen, können Sie an jedem Punkt entweder ein. weiter nach links gehen und das Band markieren, in Schritten von n; oder b. beginnen von dem Ausgangspunkt, mit dem nächsten n.

Dann haben Sie Ihren Ausgangszustand mit zwei Regeln (vielleicht nach Überprüfung, dass alles, was Sie auf Band haben, nur a s und nichts anderes sind): a. Startmarkierung Vielfache von 2 und b. (jetzt unter der Annahme, dass das Sieb bereits vorhanden ist) zähle deine a s und benutze die markierten Primzahlen links vom Ursprung, um zu entscheiden, ob du akzeptieren willst.

So würde Ihr anfängliches Band, ........aaaaaaa......... am Ende so etwas wie .c.ccccc.ccc.c.ccc.c.ccc[p]cpcpp.OaaaaaaaA...x.y.z... werden (mit [] Markierung der endgültigen Kopfposition auf Band).

4

Zuerst könnten Sie irgendwo einen Speicherort verwenden, um zu kennzeichnen, ob die Zeichenkette die Hauptlänge hat oder nicht, und dann mehr oder weniger das tun, was Ness vorgeschlagen hat (obwohl ich seine Antwort nicht vollständig verstehe).

Verwenden Sie das Sieb von Eratosthenes. Beginnen Sie mit einer Hilfszeichenfolge der Länge 2, und bewegen Sie eine Zeile nach rechts in die Eingabezeichenfolge und die Hilfszeichenfolge. Wenn Sie das Endezeichen der Hilfszeichenfolge drücken, kehren Sie zum Anfang der Hilfszeichenfolge zurück, bis Sie das Endezeichen der Eingabe treffen Zeichenfolge. Auf diese Weise können Sie sehen, ob die Hilfszeichenfolge die Eingabezeichenfolge teilt. Gehen Sie dann zu einer Hilfsstring der Länge 3 und machen Sie dasselbe, und so weiter. Nur wenn keine Länge der Hilfszeichenfolgen die Eingabe-Zeichenfolgenlänge teilt, ist die Eingabezeichenfolgenlänge prime. Wenn eine Länge der Helper-Zeichenkette die Länge der Eingabe-Zeichenkette teilt, verwenden Sie Ihren Flag-Speicher-Slot, um dies anzuzeigen. Und der Algorithmus überprüft den Merkerspeicherplatz, und wenn er markiert ist, wird die gesamte Verarbeitung abgebrochen, so dass die Zeichenfolge zurückgewiesen werden kann.

Nun, während des Iterierens über die Eingabe, erlauben Sie einen nicht-deterministischen Sprung aus der inneren Schleife, so dass die Maschine beginnen kann, die Hilfsfolge der nächsten Länge zu testen. Auf diese Weise werden Helperketten aller Länge gleichzeitig getestet, aber wenn Ihr Flaggenschlitz markiert ist, hören sie alle auf zu arbeiten und lehnen die Kette ab.

Ein letztes Problem. Strings könnten akzeptiert werden vor (obwohl Zeit ist eine Art von Nicht-Konzept hier) sie sind nicht-Prime gefunden. Wenn Sie dieses Problem lösen können, sind Sie mir einen Schritt voraus.

P.S. Drineas ist böse