7 Şubat 2016

Bret Victor'un Kitaplığı

Bir süre önce Twitter zaman akışımdan güzel bir kitaplık fotoğrafı geçti. Kitaplık daha önceden tanımadığım Bret Victor'a aitti ve çok az bir göz atışta dahi harika olduğu anlaşılıyordu.

Fotoğrafın bulunduğu internet sayfasının bağlantısını yerimlerime ekledim birkaç kitabı araştırdıktan ve inceledikten sonra. Tüm kitapların isimlerine fotoğraftan bakıp bu şekilde araştırmak ve ilgimi çekenleri kendi okuma listeme eklemek epey zor olacak diye düşünürken Max Cherepitsa harika bir işe imza attı ve fotoğraftaki tüm kitaplığı yazıya döktü. Bu sayede kitapları incelemek çok daha kolay olacak.

Cherepitsa, Medium'daki yazısından sonra konuyla ilgili bir yazı da günlüğünde yayımlamış ve kitaplıktaki kitapların hangilerinin Rusça baskısı olduğunu araştırmış. Ben de benzer bir çalışmayı başka bir kitap listesi üzerinde Türkçe için yapmıştım GitHub'da.

Çok uzaklarda neredeyse tamamını okumak istediğim bir kitaplığa sahip biri ve yine çok uzaklarda neredeyse aynı benim yapacağım gibi o kitaplığa yaklaşan başka biri.

3'lük Tabandan 9'luk Tabana Kolay Dönüşüm

Belki basitliğinden belki bilgisayarla ilgili olmasından taban aritmetiği çok sevdiğim matematik konularından biri. Burada yapılan temel işlemlerin başında belli bir tabanda belirtilmiş sayıların başka tabanlarda ifade edilmesi gelir. Bu da gerçekten güzelce anlatılır hem kitaplarda hem de derslerde. Hatta 2'lik tabanı 8'lik ve 16'lık tabana çevirme ve 8'lik ve 16'lık tabanı 2'lik tabana çevirmedeki özel durumlar da belirtilir aşağı yukarı şu şekilde: 2 -> 82 -> 168 -> 216 -> 2.

Bu bilgiler ışığında benzer soruları herkes çeşitli nedenlerle işlem hatası yapmazsa doğruca çözebilir. Peki soru biraz değiştirilip verilen sayının 3'lük tabandan 9'luk tabana çevrilmesi istenirse ne olur sizce? Bu biraz sorunun sorulduğu kişiye ve içinde bulunduğu duruma göre değişir. Ben benzer bir soruyla geçen sene Bilgisayar Mühendisliğine Giriş dersinin bir sınavında karşılaştım. 3 ve 9'un arasındaki kuvvetsel ilişki dikkatimi çekse de soruyu önce 10'luk tabana ve sonra hedef tabana çevirim yaparak çözdüm çünkü bir kısa veya kolay yol arayarak sonucu bulamama riskini alacağıma bu şekilde doğru sonuca biraz çok işlem yaparak da olsa ulaşacaktım. Bununla birlikte çözüm için herhangi bir kısıtlama olmasa da soruyu soranın amacının benden kolay yolu keşfetmemi istemesi olduğundan adım gibi emindim, ben de öyle yapardım büyük ihtimalle.

3'lük tabandan 9'luk tabana dönüşüm için kolay yolu sınavdan sonra araştıracaktım ama yapamadım. Yaklaşık bir sene sonra, geçen bütünleme döneminde arkadaşlarımdan biri BMG soruları hakkında benden yardım isteyince ben de eski bir halledilmemiş meseleyle ilgilenme şansını yakaladım.

O dönemde yetiştirmek için iki ödev üzerinde uğraştığımdan yöntemi kendi kendime keşfetmeyi deneyemedim. Bunun yerine internette kısa bir araştırma yaptım. Şaşırtıcı olmayan bir biçimde Türkçe içerik yok, şuradaki 3'lük tabanda yazılmış ''2011212'' sayısını 9'luk tabana çevirmenin yolu nedir? sorusunu saymazsak.

İngilizce arama yaparak kolayca çözüm yoluna ulaşabiliyoruz, How do you convert a number from base 3 directly to base 9? ve Changing base 3 to base 9 ile. Bu iki yazıyla yöntemi öğrenip arkadaşlarıma da aynen aktardım. Ama burada bırakmak içime sinmedi ve fazladan birkaç kişiye bile ulaşsa kardır diye düşünerek bu yazıya başladım.

Sorumuzu tekrarlayıp hatırlayalım. Bir sayı nasıl doğrudan 3'lük tabandan 9'luk tabana dönüştürülebilir? Örneğin 10'luk tabana geçiş yapmadan (1110212.20211)3 sayısını nasıl 9'luk tabana çevirebiliriz?

Soruda görüldüğü gibi (x)b ifadesinde x sayıyı, b de tabanı göstermektedir. Sadece bir taban diğerinin kuvveti olduğunda işe yarayan bir kolaylık vardır. Burada onu kullanacağız.

3 ^ n = 9
n = 2

Verilen sayıyı sağdan sola doğru n'li, yani 2'li gruplara ayıracağız ve en solda grup elaman sayısını tamamlayaman eleman kalırsa soluna yeteri kadar 0 ekleyeceğiz:

(01 11 02 12 . 20 21 10)3

Şimdi her grubu 3'lük tabandan 9'luk tabana dönüştüreceğiz ki bu tüm sayıyı tek seferde dönüştürmekten daha kolaydır. Daha sonra da dönüştürülen sayıları birleştirerek hedef sayıyı elde edeceğiz:

(01)3 = 3 x 0 + 1 x 1 = (1)9
(11)3 = 3 x 1 + 1 x 1 = (4)9
(02)3 = 3 x 0 + 1 x 2 = (2)9
(12)3 = 3 x 1 + 1 x 2 = (5)9
(20)3 = 3 x 2 + 1 x 0 = (6)9
(21)3 = 3 x 2 + 1 x 1 = (7)9
(10)3 = 3 x 1 + 1 x 0 = (3)9

Bunları sırayla birleştirirsek 9 tabanındaki karşılığını buluruz:

(1425.673)9

Taban aritmetiğine aşina olanlar ikilik grupların nasıl 3'lük tabandan 9'luk tabana dönüştürüldüğünü anlamıştır ama her ihtimale karşı biraz daha açık bir biçimde yazalım bir örneği:

(21)3 = (2 x 3 ^ 1 + 1 x 3 ^ 0)10 = (7)10 = (0 x 9 ^ 1 + 7 x 9 ^ 0)

Peki 9'luk tabandan 3'lük tabana dönüşüm yapmamız istenseydi ne yapacaktık? (836)9'u örnek olarak inceleyelim. İşimizi kolaylaştırması için 3'ün kuvvetlerinin bir tablosunu yazalım:

3 ^ 3   3 ^ 2   3 ^ 1   3 ^ 0
  27        9         3        1

Bu tablodan yararlanarak 9'luk tabandaki sayıyı n'li yani 2'li gruplar halinde 3'lük tabana çevirebiliriz:

(8)9 = (22)3
(3)9 = (10)3
(6)9 = (20)3

Gördüğünüz gibi zor bir tarafı yok. Ama bu kolay yolun sadece 2'lik ve kuvveti tabanlarda geçerli olmadığı ve genelleştirilebilir olduğu sanırım ya yeteri kadar vurgulanmıyor Türkçe kaynaklarda ya da biz öğrenenler ipuçlarını yakalayacak kadar dikkatli olamıyoruz her zaman.

Eminim okumaya doyamamışsınızdır, birkaç ek okumayla yardımcı olayım :)