При делении числа на три, существует только три возможных остатка (0, 1 и 2). То, что вы намереваетесь, состоит в том, чтобы гарантировать, что остаток равен 0, следовательно, кратно трем.
Это может быть сделано с помощью автомата с тремя состояниями:
- ST0, кратным 3 (0, 3, 6, 9, ....).
- ST1, кратный 3 плюс 1 (1, 4, 7, 10, ...).
- ST2, кратный 3 плюс 2 (2, 5, 8, 11, ...).
Теперь подумайте о любого неотрицательного числа (это наш домен) и умножить его на два (галс двоичный ноль на конце). Переходы для этого являются:
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).
также думать о любом неотрицательном числе, умножить его на два, то добавить один (галс двоичную единицы на до конца). Переходы для этого:
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).
Эта идея состоит в том, что в конце вам нужно закончить в состоянии ST0. Однако, учитывая, что может быть произвольное количество подвыражений (и под-подвыражений), оно не поддается легкому преобразованию в регулярное выражение.
То, что вы должны сделать, это позволить любой из переходных последовательностей, которые могут получить от ST0 до st0 затем просто повторить их:
Они сводятся к двум РЗ последовательности:
ST0 --> ST0 : 0+
[0]
ST0 --> ST1 (--> ST2 (--> ST2)* --> ST1)* --> ST0: 1(01*0)*1
[1] ([0] ([1] )* [0] )* [1]
или regex:
(0+|1(01*0)*1)+
Это фиксирует кратные три или, по крайней мере, первую десятку, которую я тестировал.Вы можете попробовать сколько угодно, они все будут работать, это красота математического анализа, а не анекдотические доказательства.
Является ли это ваше вычислительная теория домашнего задания? – BobbyShaftoe
Возможно, вы могли бы дать некоторый фон, как вы хотите, и какой язык вы хотите использовать. –
часть его. я думаю, что у меня есть правильная NFA, но, похоже, не справляется со средними шагами, поскольку это довольно сложно. – Jaelebi