L'idée est de décider au début de façon non déterministe combien le mot est cyclé, et d'avoir une copie de l'automate pour chaque cas. En termes d'automate, cela signifie que nous devinons dans quel étatD aurait été après avoir consommé le préfixe d'un mot (qui est un suffixe de notre entrée), et commencer dans cet état.
Maintenant la construction. Pour chaque étatq∈Q, séparé D en deux parties A1 et A2. A1 contient les états à partir desquels q est accessible et A2 les états accessibles depuis q:
[ source ]
Notez que n'importe quel nœud donné peut être contenu dans les deux A1 et A2. Par conséquent, le nombre d'états peut doubler si nous rendons cette étape explicite.
Maintenant, nous recâblons cet automate pour qu'il accepte tous les mots pour lesquels q marque le "point de cycle":
[ source ]
On a |Q|automates de cette forme; créer un nouvel état initial qui aε-transitions vers tous leurs états de départ. L'automate résultant acceptecycle(L). Au total, nous obtenons tout au plus|Q|⋅(2|Q|+1)+1 états, seulement |Q| plus d'états que les revendications de référence sont possibles.
Vous pouvez réaliser 2|Q|2+1états en modifiant un peu les automates des composants; éliminer toutq0 en remplaçant l'entrée ε-transitions avec copies de ses transitions sortantes. Autrement dit, pour chaque paire de transitions(q1,ε,q0),(q0,a,q2), introduire une transition (q1,a,q2).
Une construction rigoureuse et une preuve d'exactitude restent un exercice.