Se si divide un numero per tre, ci sono solo tre possibili remainder (0, 1 e 2). Quello a cui mirate è assicurarsi che il resto sia 0, quindi un multiplo di tre.
questo può essere fatto da un automa con i tre stati:
- ST0, multiplo di 3 (0, 3, 6, 9, ....).
- ST1, multiplo di 3 più 1 (1, 4, 7, 10, ...).
- ST2, multiplo di 3 più 2 (2, 5, 8, 11, ...).
ora pensare di qualsiasi numero non negativo (questo è il nostro dominio) e moltiplicarlo per due (virare uno zero binario fino alla fine). Le transizioni per che sono:
ST0 -> ST0 (3n * 2 = 3 * 2n, still a multiple of three).
ST1 -> ST2 ((3n+1) * 2 = 3*2n + 2, a multiple of three, plus 2).
ST2 -> ST1 ((3n+2) * 2 = 3*2n + 4 = 3*(2n+1) + 1, a multiple of three, plus 1).
pensare anche un numero non negativo, moltiplicarlo per due poi aggiungere una (virare un uno binario fino alla fine). Le transizioni per questo sono:
ST0 -> ST1 (3n * 2 + 1 = 3*2n + 1, a multiple of three, plus 1).
ST1 -> ST0 ((3n+1) * 2 + 1 = 3*2n + 2 + 1 = 3*(2n+1), a multiple of three).
ST2 -> ST2 ((3n+2) * 2 + 1 = 3*2n + 4 + 1 = 3*(2n+1) + 2, a multiple of three, plus 2).
Questa idea è che, alla fine, è necessario finire nello stato ST0. Tuttavia, dato che può esserci un numero arbitrario di sottoespressioni (e sotto-sotto-espressioni), non si presta facilmente alla riduzione a un'espressione regolare.
Quello che devi fare è consentire qualsiasi delle sequenze di transizione che possono ottenere da ST0 a st0 poi basta ripeterle:
Questi riducono a due sequenze RE:
ST0 --> ST0 : 0+
[0]
ST0 --> ST1 (--> ST2 (--> ST2)* --> ST1)* --> ST0: 1(01*0)*1
[1] ([0] ([1] )* [0] )* [1]
o la regex:
(0+|1(01*0)*1)+
Questa cattura i multipli di tre, o almeno i primi dieci che ho testato.Puoi provare quanti ne vuoi, funzioneranno tutti, questa è la bellezza dell'analisi matematica piuttosto che delle prove aneddotiche.
E 'questo il vostro lavoro teoria computazionale? – BobbyShaftoe
forse potresti dare qualche background come quello che vuoi fare e quale lingua vuoi usare. –
una parte di esso. Penso di avere l'NFA corretto ma non riesco a eliminare i passaggi intermedi perché è piuttosto complicato. – Jaelebi