Khi bạn chia một số cho ba, chỉ có ba phần còn lại có thể (0, 1 và 2). Những gì bạn đang nhắm đến là đảm bảo phần còn lại là 0, do đó là bội số của ba.
này có thể được thực hiện bởi một automaton với ba trạng thái:
- st0, bội số của 3 (0, 3, 6, 9, ....).
- ST1, bội số của 3 cộng 1 (1, 4, 7, 10, ...).
- ST2, bội số của 3 cộng 2 (2, 5, 8, 11, ...).
Bây giờ hãy suy nghĩ số bất kỳ số không âm (đó là tên miền của chúng tôi) và nhân nó với hai (tack một số không nhị phân vào cuối). Các hiệu ứng chuyển tiếp cho điều đó là:
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).
Cũng nghĩ ra bất kỳ số không âm, nhân nó bởi hai sau đó thêm một (tack một nhị phân trên đến cùng). Quá trình chuyển đổi cho điều đó là:
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).
Ý tưởng này là, cuối cùng, bạn cần kết thúc ở trạng thái ST0. Tuy nhiên, cho rằng có thể có một số lượng tùy ý các biểu thức con (và các biểu thức con phụ), nó không cho vay dễ dàng để giảm đến một biểu thức chính quy.
Những gì bạn phải làm là cho phép bất kỳ của chuỗi chuyển tiếp có thể nhận được từ st0 để st0 sau đó chỉ cần lặp lại chúng:
Những đun sôi xuống để hai chuỗi RE:
ST0 --> ST0 : 0+
[0]
ST0 --> ST1 (--> ST2 (--> ST2)* --> ST1)* --> ST0: 1(01*0)*1
[1] ([0] ([1] )* [0] )* [1]
hoặc regex:
(0+|1(01*0)*1)+
Điều này ghi lại bội số của ba hoặc ít nhất mười lần đầu tiên tôi đã thử nghiệm.Bạn có thể thử bao nhiêu tùy thích, tất cả chúng sẽ hoạt động, đó là vẻ đẹp của phân tích toán học hơn là bằng chứng giai thoại.
Đây có phải là lý thuyết bài tập tính toán của bạn? – BobbyShaftoe
có thể bạn có thể cung cấp cho một số nền tảng như những gì bạn muốn làm và ngôn ngữ mà bạn muốn sử dụng. –
một phần của nó. tôi nghĩ rằng tôi có NFA chính xác nhưng cant dường như để loại bỏ các bước giữa là khá phức tạp của nó. – Jaelebi