Ini adalah pengembangan lebih lanjut dari jawaban @ ais523 , menguranginya menjadi hanya dua set kurung, dan juga menggunakan penempatan sel yang lebih kompak berdasarkan pada teori penguasa Golomb. ais523 telah membuat kompiler untuk konstruksi ini , serta sesi TIO ini menunjukkan sampel yang menghasilkan program BF berjalan dengan pelacakan debug dari penghitung TWM.
Seperti aslinya, ini dimulai dengan program di The Waterfall Model , dengan beberapa batasan yang tidak kehilangan sifat umum:
- Semua penghitung memiliki nilai pengaturan-ulang R ; yaitu, peta pemicu TWM f memiliki properti yang f(x,x)=R untuk semua x .
- Ada penghitung penghentian tunggal h .
- Jumlah c penghitung adalah (p−1)/2 untuk beberapa bilangan prima p .
Penguasa Golomb
Kami menggabungkan konstruksi Erd-Turán dengan fungsi permutasi dari array Welch-Costas untuk mendapatkan penguasa Golomb dengan properti yang diperlukan.
(Saya yakin konstruksi gabungan ini bukan ide baru, tetapi kami baru saja menemukan dan menyatukan kedua potongan ini dari Wikipedia.)
Biarkan r menjadi akar primitif p=2c+1 . Tentukan fungsinya
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- g2 c g ( i ) - g ( j ) i , j ∈ { 0 , … , 2 c - 1 } adalah penguasa Golomb orde . Yaitu, perbedaan adalah unik untuk setiap pasangan nomor berbeda .2cg(i)−g(j)i,j∈{0,…,2c−1}
- g(k)mod(2c) mengambil setiap nilai tepat sekali.0,…,2c−1
Struktur pita
Untuk setiap penghitung TWM , kami menetapkan dua posisi sel pita BF, sel fallback dan sel nilai :x∈{0,…,c−1}u ( x ) v ( x ) u(x) v(x)
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
Dengan properti kedua ada dua berbeda dapat dipilih.gk1,k2
Konten sel fallback sebagian besar waktu akan disimpan pada , kecuali ketika penghitungnya baru saja dikunjungi, ketika akan berada di , dua kali nilai penghitung ulang otomatis counter. Sel nilai akan disimpan dua kali lipat dari nilai penghitung TWM yang sesuai.02R
Semua sel lain yang dapat dijangkau oleh eksekusi program BF (angka terbatas) akan disimpan pada nilai ganjil, sehingga mereka selalu diuji sebagai bukan nol. Setelah inisialisasi ini otomatis karena semua penyesuaian sel adalah dengan jumlah genap.
Jika diinginkan, semua posisi sel dapat digeser ke kanan oleh konstanta untuk menghindari bergerak ke kiri dari posisi rekaman BF awal.
Struktur program BF
Misalkan menjadi jarak antara nilai penghitung penghentian dan sel fallback, dan misalkan menjadi angka yang cukup besar sehingga untuk semua penghitung . Maka struktur program BF dasar adalahH=v(h)−u(h)NcN+1≥v((x+1)modc)−u(x)x
inisialisasi penyesuaian[
>
×(H+cN+1) [
<
×c ]
<
×H ]
Inisialisasi
The inisialisasi fase set semua sel dapat dijangkau oleh program untuk nilai awal mereka, dalam keadaan seperti counter terakhir baru saja dikunjungi dan sel hanya aktif adalah sel mundur nya :u(c−1)
- Nilai sel diinisialisasi menjadi dua kali konten awal dari penghitung TWM yang sesuai, kecuali bahwa penghitung adalah pre-decremented.0
- Sel fallback diatur ke , kecuali sel , yang diatur ke .0u(c−1)2R
- Semua sel lain yang dapat dijangkau oleh program (angka terbatas) diatur ke .1
Kemudian pita penunjuk dipindahkan ke posisi (sel yang selalu bukan nol) sebelum kita mencapai program yang pertama .u(c−1)−H[
Awal dari lingkaran luar
Pada awal iterasi dari loop luar, penunjuk pita akan berada di atau untuk penghitung .u(x)−Hv(x)−Hx
Biarkan menjadi penghitung berikutnya untuk dikunjungi.y=((x+1)modc)
Gerakan menempatkan penunjuk kaset pada posisi yang dan tidak di sebelah kiri .>
×(H+cN+1)≡y(modc)v(y)
Loop dalam sekarang mencari ke kiri dalam langkah-langkah untuk sel nol. Jika counter adalah nol, maka ia akan berhenti pada sel nilai (nol) ; selain itu akan menemukan sel fallback .[
<
×c ]
cyv(y)u(y)
Sel mana pun yang ditemukan menjadi sel aktif baru .
Penyesuaian
The penyesuaian fase menyesuaikan berbagai sel pada pita berdasarkan posisi mereka relatif terhadap sel aktif. Bagian ini hanya berisi +-><
perintah dan penyesuaian ini terjadi tanpa syarat. Namun, karena semua sel yang berhubungan dengan counter berada dalam pola penguasa Golomb, setiap penyesuaian yang tidak sesuai untuk sel aktif saat ini akan kehilangan semua sel penting dan menyesuaikan beberapa sel yang tidak relevan sebagai gantinya (sambil tetap membuatnya aneh).
Karenanya, kode terpisah harus dimasukkan dalam program untuk setiap pasangan sel aktif dan sel yang mungkin diperlukan, kecuali untuk penyesuaian diri sel aktif, yang, karena penyesuaian hanya didasarkan pada posisi relatif, harus dibagi di antara mereka semua.
Penyesuaian yang diperlukan adalah:
- Sesuaikan sel fallback counter sebelumnya dengan .u(x)−2R
- Sesuaikan sel fallback penghitung saat ini dengan , kecuali jika sel aktif saat ini adalah dan jadi kita harus berhenti.u(y)2Rv(h)
- Sesuaikan sel nilai penghitung berikutnya dengan (menurunkan penghitung).v((y+1)modc)−2
- Ketika sel aktif adalah sel nilai (sehingga penghitung telah mencapai nol), sesuaikan semua sel nilai dengan dari peta pemicu TWM. itu sendiri menjadi disesuaikan dengan .v(y)yv(z)2f(y,z)v(y)2R
Penyesuaian pertama dan kedua di atas diperlukan oleh fakta bahwa semua sel aktif harus menyesuaikan diri dengan nilai yang sama, yaitu untuk sel nilai, dan dengan demikian juga untuk sel fallback. Ini membutuhkan persiapan dan pembersihan sel fallback untuk memastikan mereka kembali ke di cabang value dan fallback.2R0
Akhir dari lingkaran luar
Gerakan menyatakan bahwa pada akhir fase penyesuaian, penunjuk kaset dipindahkan ke tempat di sebelah kiri sel aktif.<
×HH
Untuk semua sel aktif selain dari sel penghenti nilai sel , ini adalah sel yang tidak relevan, dan sangat aneh dan tidak nol, dan loop luar berlanjut untuk iterasi lain.v(h)
Untuk , penunjuk ditempatkan pada sel fallback yang sesuai , di mana kami telah membuat pengecualian di atas agar tetap nol, sehingga program keluar melalui final dan berhenti.v(h)u(h)]