Vì vậy, mọi người cứ cằn nhằn tôi để đăng bài này mặc dù nó chỉ giải quyết được một phiên bản đơn giản hóa của vấn đề. Được thôi :)
Cuối cùng, tôi sẽ đưa một số điều tôi học được từ bài báo của Ibarra và Trân, và tại sao phương pháp đó phá vỡ vấn đề chung của chúng tôi, nhưng có lẽ vẫn cung cấp một số thông tin hữu ích.
Nhưng trước tiên, chúng ta sẽ xem xét vấn đề đơn giản hơn là cố gắng quyết định tập hợp
các ternary và cơ quan đại diện nhị phân của 2 n có cả chiều dài chẵn hoặc lẻ chiều dài }L = { 2n|2n}
Lưu ý làm thế nào điều này có chứ không phải n như trong vấn đề ban đầu. Cụ thể, nếu số đầu vào không phải là lũy thừa bằng 2, chúng tôi muốn từ chối nó thay vì cố gắng tính chiều dài của nó trong bất kỳ cơ sở nào.2nn
Điều này giúp đơn giản hóa rất nhiều vấn đề: Nếu số gốc được viết là số nguyên tố là , sau đó với tất cả các v i ngoại trừ v 2, chúng ta chỉ cần kiểm tra xem tất cả chúng có phải là 0 không .2v23v35v57v7. . .vtôiv20
Điều này cho phép chúng ta giải quyết vấn đề đơn giản hóa này bằng cách sử dụng một trình bao bọc xung quanh phương thức cũ (theo Minsky tôi giả sử) để mã hóa trạng thái của một máy tự động -count theo số mũ của hệ số nguyên tố của một biến số tự động nhân / chia. mà như đã lưu ý trong OP ở trên là khá nhiều tương đương với một máy tự động 2 quầy.k
Đầu tiên, chúng ta cần một máy tự động -count để bọc. Chúng tôi sẽ sử dụng 3 quầy, đặt tên v 2 , v 3 và v 5 .kv2v3v5
Máy tự động sẽ chấp nhận iff cho các giá trị bộ đếm ban đầu, các đại diện nhị phân và nhị phân của có cả chiều dài chẵn hoặc chiều dài lẻ và cả v 3 và v 5 đều bằng không. Khi nó chấp nhận nó trước tiên sẽ bằng không tất cả các quầy của nó.2v2v3v5
Đây là một số mã cho điều đó, trong một định dạng lắp ráp tương tự như OP (Tôi vừa thêm các biến vào hướng dẫn). Tôi chưa thực sự thử nghiệm nó, vì tôi không có gì để chạy nó, nhưng tôi coi đây là một hình thức: automata 3 bộ đếm nổi tiếng là Turing-Complete và có thể xây dựng bất kỳ chức năng tính toán nào của một trong số chúng giá trị ban đầu.
// Check that v3 and v5 are both zero.
JZ v3, check5
GOTO reject
check5: JZ v5, init3
GOTO reject
// Decrement v2 until it is zero, constructing 2^n in the process. If 2^n
// was even, we will then pass to even2 with 2^n in v3; If 2^n was odd, we
// will pass to odd2 with 2^n in v5.
init3: INC v3 // Set v3 to 1 = 2^0 to start with.
even1: // We have decremented v2 an even number of times so far.
// 2^decremented amount is in v3.
JZ v2, odd2
DEC v2
dup3to5: JZ v3, odd1
DEC v3
INC v5
INC v5
GOTO dup3to5
odd1: // We have decremented v2 an odd number of times so far.
// 2^decremented amount is in v5.
JZ v2, even2
DEC v2
dup5to3: JZ v5, even1
DEC v5
INC v3
INC v3
GOTO dup5to3
// The second part checks the ternary length of 2^n, which starts out in v3
// or v5 according to whether the *binary* length of 2^n (i.e. n+1) was odd
// or even.
odd2: // v3 needs to have odd ternary length to accept.
// It is simplest to consider 0 to have even length in both
// binary and ternary. This works out as long as we're
// consistent.
JZ v3, reject
trisect3to5: DEC v3
DEC v3
JZ v3, even2
DEC v3
INC v5
GOTO trisect3to5
even2: // v5 needs to have even ternary length to accept
JZ v5, accept
trisect5to3: DEC v5
DEC v5
JZ v5, odd2
DEC v5
INC v3
GOTO trisect5to3
accept: HALT Accept
reject: HALT Reject
Bước tiếp theo sau đó là mã hóa lại phần trên theo số mũ của một biến tự động. Vì kết quả khá dài, tôi sẽ chỉ mô tả phương pháp chung, nhưng một phiên bản đầy đủ (hơi "tối ưu hóa" tại chỗ) có trên trang web của tôi.
JZ vp, label
DEC vp
next: ...
trở thành (về cơ bản chia cho p, và sau đó dọn dẹp để hoàn tác nếu phân chia không đồng đều):
DIV p, next, ..., newlabel.fp-1
newlabel.f1: MUL p
GOTO newlabel.i1
...
newlabel.fp-1: MUL p
INC
newlabel.ip-2: INC
...
newlabel.i1: INC
GOTO label
next: ...
INC vp
trở thành MUL p
. Cá nhân JZ
và DEC
đầu tiên có thể được thay đổi thành hình thức kết hợp. GOTO label
và HALT Reject
không thay đổi.
HALT Accept
sẽ không thay đổi, ngoại trừ trong trường hợp của chúng tôi, chúng tôi vẫn có một kiểm tra cuối cùng để làm: chúng ta cần phải đảm bảo rằng không có thừa số nguyên tố trong số khác hơn 2,3 và 5. Kể từ đó số không automaton 3 toa của chúng tôi các quầy nó sử dụng khi nó chấp nhận, điều này rất đơn giản: chỉ cần kiểm tra biến cuối cùng là 1, có thể được thực hiện bằng cách nhảy tới mã
DEC // BTW it cannot be zero before this.
JZ accept
HALT Reject
accept: HALT Accept
Mã trên trang web của tôi cũng có một kiểm tra ban đầu rằng số đó không bằng 0, mà tôi vừa nhận ra là dư thừa với các kiểm tra v3, v5 zero, ồ.
Như tôi đã đề cập, phương pháp trên hoạt động cho bài toán đơn giản, nhưng nó thực sự không có cơ hội làm việc cho bài toán chung, bởi vì: Trong bài toán chung, giá trị chính xác của mỗi số mũ của số nguyên tố để quyết định kích thước chung của nó và do đó kéo dài nó có trong các căn cứ khác nhau. Điều này có nghĩa rằng:
- Chúng tôi không có số nguyên tố "miễn phí" để sử dụng cho quầy.
- Thậm chí nếu chúng ta đã có số nguyên tố miễn phí cho quầy, chúng tôi không thực sự có một cách để trích xuất tất cả các thông tin cần thiết từ vô số số nguyên tố khác có giá trị số mũ làm vấn đề.
Vì vậy, hãy kết thúc bằng một lời giải thích về ý chính của phương pháp chung từ bài báo được liên kết ở trên của Ibarra và Trân ( phiên bản có thể tải xuống miễn phí ) để làm thế nào để chứng minh rằng một số vấn đề không thể giải quyết được bằng 2CA và cách nó bị phá vỡ một cách khó chịu trường hợp
S
Sau đó, họ phân tích máy tự động này để kết luận rằng họ có thể xây dựng các chuỗi số học nhất định của các số có hành vi được liên kết. Nói chính xác (Một số điều này không được nêu là định lý, nhưng được ẩn trong bằng chứng của cả hai ví dụ chính của chúng):
- vxtôitôi ≤ sD > 0x + n Dn ≥ 0
XS2+ 1x ∈ Xtôivxtôi≤ sp , r ∈ XK1, K2
- n ≥ 0p + n K1r + n K2
(Suy nghĩ:
- x > sx ∈ X
- Hầu hết những điều này cũng nên giữ cho các số bị từ chối , miễn là từ chối bằng cách tạm dừng rõ ràng thay vì hủy bỏ.)
D , K1, K2> s
K1= K2= 6kkpr2k3kp + 6knq+ 6kn
K1≠ K2