Đây là một cách tiếp cận mà tôi mong đợi sẽ cung cấp cho bạn một xấp xỉ nhân tử nhân, với thời gian chạy đa thức.
Đặt là ngôn ngữ thông thường là tập con của , ví dụ: . Chúng tôi sẽ cố gắng tính toán kích thước gần đúng của .{ 0 , 1 } n L = L ( M ) ∩ { 0 , 1 } n LL{0,1}nL=L(M)∩{0,1}nL
Ở cấp độ cao, cách tiếp cận gần đúng của chúng tôisẽ trông giống như thế này:|L|
Chọn một phân số , trong đó .0 < p < 1p0<p<1
Chọn một ngôn ngữ thông thường sao cho, đại khái, là một tập hợp con ngẫu nhiên có có kích thước xấp xỉ (nghĩa là ).R { 0 , 1 } n p 2 n | R | ≈ p 2 nRR{0,1}np2n|R|≈p2n
Kiểm tra xem có trống không. Lưu ý rằng kiểm tra này có thể được thực hiện trong thời gian đa thức.L∩R
Thực hiện liên tục các bước 1-3 cho các giá trị khác nhau của . Điều này cung cấp cho bạn một số thông tin sẽ cho phép bạn ước chừng.| L |p|L|
Cụ thể, nếu , thì chúng ta sẽ mong đợi|L|=m
Pr[L∩R=∅]=(1−p)m≈e−pm.
Vì vậy, nếu bạn tình cờ chọn và lặp lại các bước 1-3 một loạt lần, bạn sẽ thấy một giao lộ trống khoảng 37% thời gian. Nếu bạn thấy một giao lộ trống thường xuyên hơn đáng kể thì hãy tăng và thử lại. Nếu bạn thấy một giao lộ trống ít thường xuyên hơn thì bạn có thể giảm và thử lại.p pp=1/mpp
Theo cách này, bằng cách sử dụng một cái gì đó như tìm kiếm nhị phân, bạn sẽ có thể ước chừngđể trong một yếu tố gần đúng nhân.|L|
Bạn vẫn cần chọn một số cách để chọn sao cho đều đặn nhưng cũng hoạt động như một tập hợp con ngẫu nhiên. Có nhiều khả năng, nhưng một cách tốt có thể là chọn một hàm băm 2 phổ ngẫu nhiên , chọn ngẫu nhiên và để . Chọn cung cấp cho bạn một bộ ngẫu nhiên có kích thước gần đúng và vì là phổ 2, nên tất cả các toán học ở trên sẽ hoạt động đúng.h : { 0 , 1 } m → { 0 , 1 , 2 , ... , k - 1 } y ∈ { 0 , 1 , ... , k - 1 } R = { x ∈ { 0 , 1 } n : h ( x ) = y } k = ⌈ 1 / pRh:{0,1}m→{0,1,2,…,k−1}y∈{0,1,…,k−1}R={x∈{0,1}n:h(x)=y}R hk=⌈1/p⌉Rh
Điều này sẽ giải quyết vấn đề của bạn trong trường hợp tất cả các chuỗi trong NFA có cùng độ dài, giả sử . Nếu chúng có độ dài khác nhau, thì bạn có thể xử lý riêng từng độ dài có thể. Vì là chu kỳ, độ dài tối đa của bất kỳ chuỗi nào trong nhiều nhất là số trạng thái trong , do đó, điều này không làm tăng thời gian chạy quá nhiều.nML(M)M
(Cấu trúc này có thể nhắc nhở bạn về định lý Vazirani-Vazirani về SAT không rõ ràng.)