Passen Sie Zeichenfolgen an, deren Länge eine vierte Potenz ist


28

Betrachten wir im Rahmen dieser Frage nur Zeichenketten, die aus dem xbeliebig oft wiederholten Zeichen bestehen .

Beispielsweise:

<empty>
x
xx
xxxxxxxxxxxxxxxx

(Nun, eigentlich muss es nicht sein x- jedes Zeichen ist in Ordnung, solange die gesamte Zeichenfolge nur einen Zeichentyp enthält.)

Schreiben Sie einen regulären Ausdruck in einen beliebigen regulären Ausdruck Ihrer Wahl, um alle Zeichenfolgen mit einer Länge von n 4 für eine nicht negative ganze Zahl n (n> = 0) abzugleichen. Beispielsweise sind Zeichenfolgen der Länge 0, 1, 16, 81 usw. gültig. der Rest ist ungültig.

Aufgrund der technischen Einschränkung ist es schwierig, Werte von n größer als 128 zu testen. Ihr regulärer Ausdruck sollte jedoch unabhängig davon logisch korrekt funktionieren.

Beachten Sie, dass Sie in Ihrem regulären Ausdruck (für Perl-Benutzer) keinen beliebigen Code ausführen dürfen. Jede andere Syntax (Look-Around, Rückverweis usw.) ist zulässig.

Bitte fügen Sie auch eine kurze Erklärung zu Ihrer Herangehensweise an das Problem bei.

(Bitte fügen Sie keine Erklärung für die automatisch generierte Regex-Syntax ein, da diese unbrauchbar ist.)


"xx" ist nicht gültig, oder?
Kendall Frey

@KendallFrey: Nein. Es ist nicht gültig.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́

@nhahtdh denkst du, es gibt eine mögliche Antwort darauf?
Xem

1
@ Timwi: Ja. Java, PCRE (wahrscheinlich auch Perl, kann aber nicht testen), .NET. Meins funktioniert jedoch nicht in Ruby / JS.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̷̰̀ĥ̷̳

1
Diese Frage wurde zu den häufig gestellten Fragen zum Stapelüberlauf bei regulären Ausdrücken unter "Advanced Regex-Fu" hinzugefügt .
Aliteralmind

Antworten:


21

Dieser (ir) reguläre Ausdruck scheint zu funktionieren.

^((?(1)((?(2)\2((?(3)\3((?(4)\4x{24}|x{60}))|x{50}))|x{15}))|x))*$

Dieser reguläre Ausdruck ist mit PCRE-, Perl- und .NET-Versionen kompatibel.

Dies folgt im Grunde genommen einem "Differenzbaum" (nicht sicher, ob es einen richtigen Namen dafür gibt), der dem Regex mitteilt, wie viele weitere x für die nächste vierte Potenz passen:

1     16    81    256   625   1296  2401 ...
   15    65    175   369   671   1105 ...
      50    110   194   302   434 ...
         60    84    108   132 ...
            24    24    24 ...  # the differences level out to 24 on the 4th iteration

\2, \3, \4Speichert und aktualisiert die Differenz als auf der 2., 3. und 4. Reihen gezeigt.

Dieses Konstrukt kann leicht für höhere Leistungen erweitert werden.

Sicher keine elegante Lösung, aber es funktioniert.


+1. Gute Antwort. Obwohl sich diese Antwort von meiner unterscheidet (sie verwendet bedingten Regex, während meine dies nicht tut), hat sie den gleichen Sinn wie meine Lösung (indem sie den Differenzbaum ausnutzt und die vorwärts deklarierte Rückreferenz einiger Regex-Engines verwendet).
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́

nette Idee bezüglich des Unterschiedbaums. für Quadrate ist der Baum 1 4 9 16 ... 3 5 7 ... 2 2 2, richtig?
Sparr

@ Sparr danke und ja
Volatility

24

Eine andere Lösung

Dies ist meiner Meinung nach eines der interessantesten Probleme auf der Website. Ich muss Deadcode dafür danken, dass er wieder nach oben geschoben wurde .

^((^|xx)(^|\3\4\4)(^|\4x{12})(^x|\1))*$

39 Bytes , ohne Bedingungen oder Zusicherungen ... irgendwie. Die Alternationen, wie sie verwendet werden ( ^|), sind in gewisser Weise eine Art Bedingung, um zwischen "erster Iteration" und "nicht erster Iteration" zu wählen.

Dieser reguläre Ausdruck funktioniert hier: http://regex101.com/r/qA5pK3/1

Sowohl PCRE als auch Python interpretieren den regulären Ausdruck korrekt und er wurde auch in Perl bis zu n = 128 getestet , einschließlich n 4 -1 und n 4 +1 .


Definitionen

Die allgemeine Technik ist dieselbe wie bei den anderen bereits veröffentlichten Lösungen: Definieren Sie einen selbstreferenzierenden Ausdruck, der bei jeder nachfolgenden Iteration einer Länge entspricht, die dem nächsten Term der Vorwärtsdifferenzfunktion D f mit einem unbegrenzten Quantifizierer ( *) entspricht. Eine formale Definition der Vorwärtsdifferenzfunktion:

Definition 1: Vorwärtsdifferenzfunktion

Zusätzlich können auch Differenzfunktionen höherer Ordnung definiert werden:

Definition 2: zweite Vorwärtsdifferenzfunktion

Oder allgemeiner:

Definition 3: k-te Vorwärtsdifferenzfunktion

Die Vorwärtsdifferenzfunktion hat viele interessante Eigenschaften; es ist zu Sequenzen, was die Ableitung zu stetigen Funktionen ist. Zum Beispiel wird D f eines Polynoms n- ter Ordnung immer ein Polynom n-1- ter Ordnung sein, und für jedes i ist , wenn D f i = D f i + 1 , die Funktion f auf ähnliche Weise exponentiell dass die Ableitung von e x gleich sich selbst ist. Die einfachste diskrete Funktion, für die f = D f ist, ist 2 n .


f (n) = n 2

Bevor wir die obige Lösung untersuchen, wollen wir mit etwas Einfacherem beginnen: einem regulären Ausdruck, der Zeichenfolgen entspricht, deren Länge ein perfektes Quadrat ist. Untersuchen der Vorwärtsdifferenzfunktion:

EFD: n ^ 2

Das heißt, die erste Iteration sollte mit einer Zeichenfolge der Länge 1 , die zweite mit einer Zeichenfolge der Länge 3 , die dritte mit einer Zeichenfolge der Länge 5 usw. übereinstimmen, und im Allgemeinen sollte jede Iteration mit einer Zeichenfolge übereinstimmen, die zwei länger als die vorherige ist. Der entsprechende reguläre Ausdruck folgt fast direkt aus dieser Aussage:

^(^x|\1xx)*$

Es ist ersichtlich, dass die erste Iteration nur mit einer übereinstimmt xund jede nachfolgende Iteration genau wie angegeben mit einer Zeichenfolge, die zwei länger als die vorherige ist. Dies impliziert auch einen erstaunlich kurzen perfekten Quadrattest in Perl:

(1x$_)=~/^(^1|11\1)*$/

Dieser reguläre Ausdruck kann weiter verallgemeinert werden, um mit jeder n- eckigen Länge übereinzustimmen:

Dreieckszahlen:
^(^x|\1x{1})*$

Quadratzahl:
^(^x|\1x{2})*$

Fünfeckige Zahlen:
^(^x|\1x{3})*$

Sechseckige Zahlen:
^(^x|\1x{4})*$

etc.


f (n) = n 3

Gehen Sie weiter zu n 3 und untersuchen Sie noch einmal die Vorwärtsdifferenzfunktion:

EFD: n ^ 3

Es ist möglicherweise nicht sofort ersichtlich, wie dies implementiert werden kann. Daher untersuchen wir auch die zweite Differenzfunktion:

EFD ^ 2: n ^ 3

Die Vorwärtsdifferenzfunktion steigt also nicht um eine Konstante, sondern um einen linearen Wert. Es ist schön, dass der Anfangswert (' -1 th') von D f 2 Null ist, was eine Initialisierung bei der zweiten Iteration sichert. Der resultierende reguläre Ausdruck ist der folgende:

^((^|\2x{6})(^x|\1))*$

Die erste Iteration stimmt mit 1 überein , wie zuvor, die zweite mit einer längeren Zeichenfolge 6 ( 7 ), die dritte mit einer längeren Zeichenfolge 12 ( 19 ) usw.


f (n) = n 4

Die Vorwärtsdifferenzfunktion für n 4 :

EFD: n ^ 4

Die zweite Vorwärtsdifferenzfunktion:

EFD ^ 2: n ^ 4

Die dritte Vorwärtsdifferenzfunktion:

EFD ^ 3: n ^ 4

Das ist hässlich. Die Anfangswerte für D f 2 und D f 3 sind beide ungleich Null, 2 bzw. 12 , was berücksichtigt werden muss. Sie haben wahrscheinlich schon herausgefunden, dass der reguläre Ausdruck diesem Muster folgt:

^((^|\2\3{b})(^|\3x{a})(^x|\1))*$

Weil der D f 3 muss eine Länge von Match 12 auf der zweiten Iteration, a ist notwendigerweise 12 . Da es sich jedoch mit jedem Term um 24 erhöht , muss die nächste tiefere Verschachtelung ihren vorherigen Wert zweimal verwenden, was bedeutet, dass b = 2 ist . Als letztes müssen Sie D f 2 initialisieren . Da D f 2 Einflüsse D f direkt, was letztlich ist das, was wir passen wollen, kann ihr Wert durch Einsetzen des entsprechende Atom initialisiert wird direkt in den regulären Ausdruck, in diesem Fall (^|xx). Der endgültige reguläre Ausdruck wird dann:

^((^|xx)(^|\3\4{2})(^|\4x{12})(^x|\1))*$

Höhere Aufträge

Ein Polynom fünfter Ordnung kann mit dem folgenden regulären Ausdruck verglichen werden:
^((^|\2\3{c})(^|\3\4{b})(^|\4x{a})(^x|\1))*$

f (n) = n 5 ist eine ziemlich einfache Übung, da die Anfangswerte sowohl für die zweite als auch für die vierte Vorwärtsdifferenzfunktion Null sind:

^((^|\2\3)(^|\3\4{4})(^|\4x{30})(^x|\1))*$

Für sechs Ordnungspolynome:
^((^|\2\3{d})(^|\3\4{c})(^|\4\5{b})(^|\5x{a})(^x|\1))*$

Für Polynome siebter Ordnung:
^((^|\2\3{e})(^|\3\4{d})(^|\4\5{c})(^|\5\6{b})(^|\6x{a})(^x|\1))*$

etc.

Beachten Sie, dass nicht alle Polynome auf genau diese Weise abgeglichen werden können, wenn einer der erforderlichen Koeffizienten nicht ganzzahlig ist. Zum Beispiel erfordert n 6 , dass a = 60 , b = 8 und c = 3/2 ist . Dies kann in diesem Fall umgangen werden:

^((^|xx)(^|\3\6\7{2})(^|\4\5)(^|\5\6{2})(^|\6\7{6})(^|\7x{60})(^x|\1))*$

Hier habe ich b auf 6 und c auf 2 geändert , die das gleiche Produkt wie die oben angegebenen Werte haben. Es ist wichtig, dass sich das Produkt nicht ändert, da a · b · c ·… die konstante Differenzfunktion steuert, die für ein Polynom sechster Ordnung D f 6 ist . Es sind zwei Initialisierungsatome vorhanden: eines zum Initialisieren von D f auf 2 , wie bei n 4 , und das andere zum Initialisieren der fünften Differenzfunktion auf 360 , während gleichzeitig die fehlenden zwei von b hinzugefügt werden .


An welchen Motoren haben Sie das getestet?
n̴̖̋h̴̖̋a̷̭̿h̷̭̿d̷̰̀ĥ̷̳

Ich verstehe endlich, was los ist. In der Tat ist nur die Unterstützung der Vorwärtsreferenz erforderlich. +1
n̴̖̋h̴̖̋a̷̭̿h̷̭̿d̷̰̀ĥ̷̳

@nhahtdh ahh, du hast recht. Weiterleitungen sind auch nicht unbedingt ein universelles Merkmal.
Primo

1
Ausgezeichnet! Ich mag, wie kurz, einfach und leicht zu verstehen ist. Mit seiner flachen Verschachtelung ist es einfach, von Hand zu berechnen, wie es sich verhält. Außerdem ist es genauso schnell wie die Lösungen von Volatility und nhahtdh . Und ich liebe Ihre ausführliche Erklärung, einschließlich der Demonstration, dass dies sogar auf Polynome ausgedehnt werden kann. Ich würde Bonuspunkte geben, wenn ich könnte.
Deadcode

@Lynn danke! Habe nicht damit gerechnet ...
primo

13

In dieser Lösung werden keine Bedingungen, vorwärts deklarierten oder verschachtelten Rückverweise, Lookbehind, Bilanzgruppen oder Regex-Rekursionen verwendet. Es werden nur Lookahead- und Standard-Backreferenzen verwendet, die sehr häufig unterstützt werden. Ich wurde durch Regex Golf , der die ECMAScript-Regex-Engine verwendet, inspiriert, unter diesen Einschränkungen zu arbeiten .

Die Funktionsweise dieses 50-Byte-Regex ist konzeptionell recht einfach und unterscheidet sich grundlegend von allen anderen eingereichten Lösungen für dieses Rätsel. Es war überraschend zu entdecken, dass diese Art von mathematischer Logik in einem regulären Ausdruck ausgedrückt werden konnte.

      \2                     \4  \5
^((?=(xx+?)\2+$)((?=\2+$)(?=(x+)(\4+)$)\5){4})*x?$

(Erfassungsgruppen sind über dem regulären Ausdruck gekennzeichnet.)

Die regex kann einfach an eine Strom verallgemeinert werden , indem das Ersetzen 4in {4}der gewünschten Leistung.

Probieren Sie es online!

Es funktioniert durch wiederholtes Teilen der kleinsten vierten Potenz einer Primzahl, durch die der aktuelle Wert teilbar ist. Somit ist der Quotient bei jedem Schritt immer eine vierte Potenz, wenn der ursprüngliche Wert eine vierte Potenz war. Ein letzter Quotient von 1 zeigt an, dass der ursprüngliche Wert tatsächlich eine vierte Potenz war; Damit ist das Spiel beendet. Null ist auch abgestimmt.

Erstens verwendet es eine Lazy Capture-Gruppe \2, um den kleinsten Faktor der Zahl größer als 1 zu erfassen. Somit ist dieser Faktor garantiert eine Primzahl. Zum Beispiel wird mit 1296 (6 ^ 4) anfänglich \2= 2 erfasst .

Dann wird zu Beginn einer Schleife, die viermal wiederholt wird, geprüft, ob die aktuelle Zahl durch \2, mit, teilbar ist (?=\2+$). Beim ersten Durchlaufen dieser Schleife ist dieser Test unbrauchbar, doch der Zweck wird später deutlich.

Weiter im Inneren dieser inneren Schleife, verwendet es die gierigen Capture - Gruppe \4die Nummer der größte Faktor kleiner als es selbst zu erfassen: (?=(x+)(\4+)$). Tatsächlich dividiert dies die Zahl durch ihren kleinsten Primfaktor \2; Beispiel: 1296 wird anfänglich als \4= 1296/2 = 648 erfasst. Beachten Sie, dass die Division der aktuellen Zahl durch \2implizit ist. Es ist zwar möglich, die aktuelle Nummer explizit durch eine Nummer zu teilen, die in einer Erfassungsgruppe enthalten ist (die ich erst vier Tage nach dem Posten dieser Antwort entdeckt habe), dies würde jedoch zu einem langsameren und schwer verständlichen regulären Ausdruck führen, was jedoch nicht der Fall ist Dies ist notwendig, da der kleinste Faktor einer Zahl, der größer als 1 ist, immer mit dem größten Faktor übereinstimmt, der kleiner ist als er selbst (so dass sein Produkt der Zahl selbst entspricht).

Da diese Art von Regex nur von der Zeichenfolge "fressen" kann (wodurch sie kleiner wird), indem ein Ergebnis am Ende der Zeichenfolge verbleibt, müssen wir das Ergebnis der Division an das Ende der Zeichenfolge "verschieben". Dies geschieht, indem das Ergebnis der Subtraktion (die aktuelle Zahl minus \4) in der Erfassungsgruppe erfasst \5wird und dann außerhalb des Vorgriffs ein Teil des Anfangs der aktuellen Zahl, der entspricht, abgeglichen wird \5. Dies lässt die verbleibende unverarbeitete Zeichenfolge am Ende \4in der Länge übereinstimmen .

Jetzt geht es zurück zum Anfang der inneren Schleife, wo deutlich wird, warum die Teilbarkeit durch den Primfaktor geprüft wird. Wir haben gerade durch den kleinsten Primfaktor der Zahl dividiert; Wenn die Zahl noch durch diesen Faktor teilbar ist, bedeutet dies, dass die ursprüngliche Zahl möglicherweise durch die vierte Potenz dieses Faktors teilbar ist. Wenn dieser Test zum ersten Mal durchgeführt wird, ist er unbrauchbar. Bei den nächsten drei Tests wird jedoch festgestellt, ob das Ergebnis der impliziten Division durch \2noch durch teilbar ist \2. Wenn es \2zu Beginn jeder Iteration der Schleife noch durch teilbar ist , beweist dies, dass jede Iteration die Zahl durch dividiert \2.

In unserem Beispiel mit einer Eingabe von 1296 durchläuft dies die folgende Schleife:

\2= 2
\4= 1296/2 = 648
\4= 648/2 = 324
\4= 324/2 = 162
\4= 162/2 = 81

Jetzt kann der Regex zum ersten Schritt zurückkehren. Das ist es, was das Finale *macht. In diesem Beispiel wird 81 zur neuen Nummer. Die nächste Schleife läuft wie folgt ab:

\2= 3
\4= 81/3 = 27
\4= 27/3 = 9
\4= 9/3 = 3
\4= 3/3 = 1

Es wird nun wieder zum ersten Schritt zurückgeschleift, wobei 1 die neue Nummer ist.

Die Zahl 1 kann nicht durch eine Primzahl geteilt werden, was zu einer Nichtübereinstimmung mit führen würde (?=(xx+?)\2+$). Sie verlässt daher die Schleife der obersten Ebene (die mit *dem Ende). Es erreicht jetzt die x?$. Dies kann nur null oder eins entsprechen. Die aktuelle Zahl ist zu diesem Zeitpunkt genau dann 0 oder 1, wenn die ursprüngliche Zahl eine perfekte vierte Potenz war. Wenn es zu diesem Zeitpunkt 0 ist, bedeutet dies, dass die Schleife der obersten Ebene nie mit etwas übereinstimmte, und wenn es 1 ist, bedeutet dies, dass die Schleife der obersten Ebene eine perfekte vierte Potenz nach unten geteilt hat, bis sie nicht mehr durch irgendetwas teilbar war (oder es war an erster Stelle 1, was bedeutet, dass die Top-Level-Schleife nie zu etwas passte).

Es ist auch möglich, dies in 49 Bytes durch wiederholte explizite Aufteilung (die auch für alle Potenzen verallgemeinert ist - ersetzen Sie die gewünschte Potenz minus eine in die {3}) zu lösen , aber diese Methode ist weitaus langsamer und erklärt den verwendeten Algorithmus sprengt den Rahmen dieser Antwort:

^((x+)((\2(x+))(?=(\4*)\2*$)\4*(?=\5$\6)){3})?x?$

Probieren Sie es online!


Aus meinen Tests (bis Länge 1024) geht hervor, dass es richtig ist. Der reguläre Ausdruck ist jedoch zu langsam - es dauert sehr lange, bis die Länge 16 ^ 4 erreicht ist. Daher ist es sehr schwierig, eine große Anzahl zu überprüfen. Aber da Leistung nicht erforderlich ist, stimme ich zu, wenn ich Ihre Regex verstehe.
n̴̖̋h̴̖̋a̷̭̿h̷̭̿d̷̰̀ĥ̷̳

1
Ihre Regex und Volatilität sind fantastisch. Ihre Geschwindigkeit und Kürze beeindrucken mich. Beide passen in 7,5 Sekunden zu 100000000 auf meinem i7-2600k, viel schneller, als ich es von einem Regex erwartet hätte. Meine Lösung liegt hier in einer völlig anderen Größenordnung, da es 12 Sekunden dauert, bis 50625 erreicht ist. Mein Ziel war jedoch nicht die Geschwindigkeit, sondern die Erledigung der Aufgabe in minimaler Codelänge mit einer viel eingeschränkteren Anzahl von Operationen.
Deadcode

Unsere Antworten sind schnell, da sie kaum Rückschritte machen. Mit freundlichen Grüßen gehen Sie viel zurück ((((x+)\5+)\4+)\3+)\2+$. Ihre ist auch auf seine eigene Weise erstaunlich, da ich mir nicht einmal vorstellen kann, wie ich eine quadratische Zahl ohne vorwärts deklarierte Rückreferenz zuordnen kann.
n̴̖̋h̴̖̋a̷̭̿h̷̭̿d̷̰̀ĥ̷̳

Übrigens ist diese Frage kein Code-Golf, sondern ein Rätsel. Ich beurteile die Lösung nicht nach der Codelänge.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̷̰̀ĥ̷̳

Oh. Das erklärt, warum Sie verwendet haben (?:). Soll ich meine Antwort bearbeiten, um die optimierte Version zur primären zu machen?
Deadcode

8

Lösung

^(?:(?=(^|(?<=^x)x|xx\1))(?=(^|\1\2))(^x|\3\2{12}xx))*$

Dieser reguläre Ausdruck ist mit Java-, Perl-, PCRE- und .NET-Versionen kompatibel. Dieser Regex verwendet eine ganze Reihe von Funktionen: Look-Ahead, Look-Behind und vorwärts deklarierte Rückverweise. Vorwärts deklarierte Rückverweisarten beschränken die Kompatibilität dieses Regex mit einigen Engines.

Erläuterung

Diese Lösung verwendet die folgende Ableitung.

Indem wir die Summe vollständig ausdehnen, können wir folgende Gleichheit nachweisen:

\ sum \ limits_ {i = 1} ^ n (i + 1) ^ 4 - \ sum \ limits_ {i = 1} ^ ni ^ 4 = (n + 1) ^ 4 - 1
\ sum \ limits_ {i = 1} ^ ni ^ 4 - \ sum \ limits_ {i = 1} ^ n (i-1) ^ 4 = n ^ 4

Kombinieren wir die Summe auf der linken Seite:

\ sum \ limits_ {i = 1} ^ n (4 (i + 1) ^ 3 - 6 (i + 1) ^ 2 + 4 (i + 1) - 1) = (n + 1) ^ 4 - 1
\ sum \ limits_ {i = 1} ^ n (4i ^ 3 - 6i ^ 2 + 4i - 1) = n ^ 4

Subtrahieren Sie die 2 Gleichungen (obere Gleichung minus untere Gleichung) und kombinieren Sie die Summierungen auf der linken Seite. Vereinfachen Sie sie dann:

\ sum \ limits_ {i = 1} ^ n (12i ^ 2 + 2) = (n + 1) ^ 4 - n ^ 4 - 1

Wir erhalten die Differenz zwischen aufeinanderfolgenden vierten Potenzen als Potenzsumme:

(n + 1) ^ 4 - n ^ 4 = \ sum \ limits_ {i = 1} ^ n (12i ^ 2 + 2) + 1

Dies bedeutet, dass die Differenz zwischen aufeinanderfolgenden vierten Potenzen um (12n 2 + 2) zunimmt .

Um das Denken zu vereinfachen, beziehen Sie sich auf den Unterschiedsbaum in der Antwort von Volatility :

  • Die rechte Seite der endgültigen Gleichung ist die 2. Zeile im Differenzbaum.
  • Das Inkrement (12n 2 + 2) ist die 3. Zeile im Differenzbaum.

Genug der Mathematik. Zurück zur obigen Lösung:

  • Die 1. Erfassungsgruppe behält eine Reihe von ungeraden Zahlen bei, um i 2 zu berechnen, wie in der Gleichung gezeigt.

    Genau genommen beträgt die Länge der ersten Erfassungsgruppe 0 (nicht verwendet), 1, 3, 5, 7, ..., wenn die Schleife durchlaufen wird.

    (?<=^x)xLegt den Anfangswert für die ungerade Zahlenreihe fest. Das ^ist nur da, um den Look-Ahead in der ersten Iteration zufrieden zu stellen.

    xx\1 addiert 2 und rückt zur nächsten ungeraden Zahl vor.

  • Die 2. Erfassungsgruppe behält die quadratische Zahlenreihe für i 2 bei .

    Genau genommen beträgt die Länge der 2. Erfassungsgruppe 0, 1, 4, 9, ..., wenn die Schleife iteriert.

    ^in (^|\1\2)legt den Anfangswert für die quadratische Zahlenreihe fest. Und \1\2fügt die ungerade Zahl zur aktuellen Quadratzahl hinzu, um zur nächsten Quadratzahl zu gelangen.

  • Die dritte Erfassungsgruppe (außerhalb der Vorausschau und des tatsächlichen Textverbrauchs) entspricht der gesamten rechten Seite der oben abgeleiteten Gleichung.

    ^xin (^x|\3\2{12}xx)legt den Anfangswert fest, der sich auf + 1der rechten Seite der Gleichung befindet.

    \3\2{12}xxaddiert die Differenzerhöhung (12n 2 + 2) mit n 2 aus Erfassungsgruppe 2 und passt die Differenz gleichzeitig an.

Diese Anordnung ist möglich, da die in jeder Iteration übereinstimmende Textmenge größer oder gleich der Textmenge ist, die zum Ausführen der Vorausschau zum Konstruieren von n 2 erforderlich ist .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.