Pohon Stern-Brocot adalah pohon biner fraksi di mana setiap fraksi diperoleh dengan menambahkan pembilang dan penyebut dari dua fraksi yang berdekatan di tingkat di atas.
Ini dihasilkan dengan memulai dengan 0/1
dan 1/0
sebagai "fraksi titik akhir", dan dari sana, iterasi dengan menempatkan satu fraksi antara setiap pasangan fraksi berturut-turut dengan menambahkan pembilang dan penyebut dari fraksi tersebut bersama-sama, seperti:
0. 0/1 1/0
1. 0/1 1/1 1/0
2. 0/1 1/2 1/1 2/1 1/0
3. 0/1 1/3 1/2 2/3 1/1 3/2 2/1 3/1 1/0
4. 0/1 1/4 1/3 2/5 1/2 3/5 2/3 3/4 1/1 4/3 3/2 5/3 2/1 5/2 3/1 4/1 1/0
Dalam setiap iterasi dari pohon Stern-Brocot (yang n
iterasi th), ada 2^n + 1
unsur-unsur dalam urutan, yang kita dapat menganggap fraksi dari 0/2^n
ke 2^n/2^n
. Setiap iterasi baru hanya menyisipkan satu fraksi "setengah" antara setiap pasangan fraksi berturut-turut.
Ini membuat pohon Stern-Brocot pemetaan satu-ke-satu antara bilangan rasional positif dan pecahan biner antara 0 dan 1, dengan demikian juga berfungsi sebagai bukti bahwa kedua himpunan memiliki kardinalitas yang sama.
Tugas Anda adalah menulis sebuah program atau fungsi yang, mengingat pembilang dan penyebut bilangan rasional positif dalam istilah terendah, menentukan fraksi biner yang sesuai dengan posisi fraksi itu di pohon Stern-Brocot.
Contoh input dan output disediakan di bawah ini:
2/3 -> 3/8 (4th number in iteration 3)
4/7 -> 9/32 (between 1/2 and 3/5 in the chart above)
1/1 -> 1/2 (middle number in the first iteration)
Input yang tidak perlu Anda dukung, tetapi disertakan untuk referensi:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
Program terpendek dalam bahasa apa pun untuk mencapai tujuan ini menang.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, dll). Jika angka yang dihasilkan untuk suatu simpul adalah n
, maka 2^lg n
(log biner) adalah bit tertinggi yang diatur n
, dan fraksi biner yang diinginkan adalah (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Siapa pun yang mencoba solusi assembler dalam set instruksi dengan get-set-set-bit tertinggi mungkin ingin menggunakan pendekatan ini).