Doğum gününüz ya da başka özel bir günün, haftanın hangi gününe denk geldiğini mutlaka merak etmişsinizdir. John Conway’e sorarsanız size 2 saniyede cevabını verebilir.

Doomsday algoritması, John Conway1 tarafından 1973 yılında geliştirildi. Birkaç gün ve kural ezberimizdeyse, modüler aritmetik kullanarak belli bir tarihin haftanın hangi gününe denk geldiğini bulmamızı sağlıyor. Conway, bilgisayarına her giriş yaptığında rastgele tarihler soran bir programla pratik yaparak bu kadar hızlanmış.

Algoritmayla ilk kez birkaç yıl önce, The Doomsday Algorithm - Numberphile videosu ile karşılaştım. Biraz pratikten sonra verilen tarihin zorluğuna göre 30-180 saniye arasında cevaplayabiliyordum. Şimdi baya hamladım. Teoride daha fazla şeyi ezberleyerek daha hızlı çözmeyi sağlayan bir yöntem kullanıyordum, ters tepti çünkü hesaplamaktan çok ezberlediğimi hatırlamaya uğraşıyordum. Burada algoritmanın olabildiğince az ezber gerektirecek halini kullanacağız.

Beklenmedik bir şekilde, kısa bir süre Türkçe kaynak aradığımda sadece tek girdili bir ekşi sözlük başlığı bulabildim2. Bu, zihinsel hesaplamalarıyla insanları şaşırtmak isteyenler için iyi bir haber olabilir.

Buradan itibaren doomsday yerine kıyamet günü diyeceğim.

Artık yıllar#

Öncelikle artık yıllara kısaca değinelim. Artık yıllar, 365 değil 366 gündür, bu fazladan gün şubat ayına eklenir ve şubat 28 yerine 29 gün olur.

Bir yıl 4’e tam bölünebiliyorsa artık yıldır, ancak 100’e tam bölünebiliyorsa 400’e de tam bölünmeli. Yani 2000 yılı artık yıldır ama 1900 değildir3.

Günlerle Aritmetik#

Haftanın günlerini birer sayı gibi düşünürsek işlemlerimiz çok daha kolay hale gelir. Pazartesi 1’dir, salı 2. Pazar 0’dır çünkü mod 7’de işlem yapıyoruz. Bir günden 7 gün sonra yine aynı gündür. Birkaç örnek yapalım.

Salı gününden 4 gün sonrası hangi gündür ?

2 + 4 = 6 ki o da cumartesidir.

Çarşambadan 15 gün sonrası ?

Mod 7’de aritmetik işlem yaptığımız için, 15 eklemekle 1 eklemek aynı şeydir. 3 + 1 = 4 yani perşembe. Başka türlü de yapabiliriz. 3 + 15 = 18 = 4 yani perşembe.

Yazı boyunca gün içeren tüm işlemler mod 7’de, bunu denklemlerde belirtmemekle biraz üşengeçlik yaptım ama sonuçta sınavda değiliz.

Kıyamet Günü#

Bir yılda aşağıdaki tarihlerin hepsi haftanın aynı gününe denk gelir. Belli bir yıl için bu güne, o yılın kıyamet günü denir.

Ay Gün
Ocak 3 (artık yılda 4)
Şubat 28 (artık yılda 29)
Mart 14
Nisan 4
Mayıs 9
Haziran 6
Temmuz 11
Ağustos 8
Eylül 5
Ekim 10
Kasım 7
Aralık 12

Bunları ezberlemek göründüğünden daha kolay.

  • Şubat dışındaki çift aylar çifter (4/4, 6/6, 8/8, 10/10, 12/12)
  • 7/11 ve 11/7 birbirinin tersi
  • 5/9 ve 9/5 birbirinin tersi
  • Mart pi günü (ay/gün olarak yazarsanız 3/14 oluyor)
  • Şubatın son günü (martın 0’ı olarak da düşünebilirsiniz)

Örnek olarak, 2025 yılına bakalım.

2025 artık yıl değil ve kıyamet günü cuma. Bir yılın kıyamet gününü bildiğimiz sürece haftanın gününü bulmamız zor değil.

27/8/2025 hangi gündür ?

8’inin kıyamet günü olduğunu ve onun da cuma olduğunu biliyoruz. Cumaya 19 eklemeliyiz. 5 + 19 = 24 = 3 yani çarşamba.

Mod 7’de 19 eklemekle 2 çıkarmak aynı şeydir, o yüzden 5 + (-2) = 3 şeklinde de çözebiliriz.

Bu blog hangi gün yayınlandı ?

29 Kasım 2025 Cumartesi diyor ama güvenemedim. Kasımın 7’si kıyamet günü olduğu için 2025’te o gün cuma olmalı. 22 gün eklemeliyiz yani 3 hafta + 1 gün. Cuma + 1 = Cumartesi.

30 Ağustos 1922 hangi gündür ? (1922'nin kıyamet günü salı)

8/8 salı gününe 22 gün eklemeliyiz.

2 + 22 = 2 + 1 = 3 (çarşamba)

Tabii ki bir tarihin hangi güne denk geldiğini bulurken o yılın kıyamet gününü bilmediğimiz için takvime bakacaksak o zaman direkt aradığımız güne de bakarız. O halde asıl soru, bir yılın kıyamet gününü nasıl bulabiliriz ?

Kıyamet Gününü Bulma#

2025 yılının kıyamet günü cuma demiştik, bunu kullanarak 2026’daki kıyamet gününü bulamaz mıyız ? Artık olmayan yıllarda 365 gün var, o zaman kıyamet gününe 365 ekleyelim.

5 + 365 = 5 + 1 = 6 (cumartesi)

Takvime bakarak kontrol edelim. Evet, 2026’nın kıyamet günü cumartesi. Demek ki kıyamet günü, artık olmayan yıllarda 1, artık yıllarda 2 artıyor. Peki bir yılın kıyamet gününü bulurken hangi yılı kullanacağız ? Burada çıpa asırlar devreye giriyor.

Yıl Kıyamet günü
1800 cuma (5)
1900 çarşamba (3)
2000 salı (2)
2100 pazar (0)

Aynı sırayla tekrar ettikleri için bu 4 yılı ezberlememiz yeterli. 2200’de kıyamet gününün cuma, 1700’de pazar olduğunu bulabiliriz. Şimdi 2025’in kıyamet gününü bulmayı deneyelim. 2000’in kıyamet günü salı, 25 yıl ileri gitmeliyiz. Bu yıllardan 19’u artık olmayan, 6’sı artık (4’e bölünen) yıllardır.

2 + (19 + 6 * 2) = 2 + 31 = 2 + 3 = 5 (cuma)

Burada farklı formüller ve kısayollar üretilebilir. Mesela, kıyamet günü 12 yılda 1 artar4. Ekleyeceğimiz yılı 12’ye bölüp, bölümü ve kalanı toplayalım. Ayrıca kalanı 4’e bölüp bölümü ekleyelim. O zaman bir yılın kıyamet formülü:

Çıpa + bölüm + kalan + ⌊kalan / 4⌋

2025 için deneyelim. 2000li yıllar, kıyamet günümüz salı. 25 / 12 den bölüm 2, kalan 1. Kalandaki ayrık yıllar için, 1 / 4 den bölüm 0, yani içinden hiç 4 yıl çıkmıyor. Hepsini kıyamet günümüz salıya (2) ekleyelim.

2 + 2 + 1 + 0 = 5

Artık bir yılın kıyamet gününü bulabiliyoruz, içinde bulunduğu asrın kıyamet gününü unutmadığımız sürece. Kafanızda bir tür kodlama yapabilirsiniz. Ben direkt 18-5320 diye ezberledim. Sadece yakın gelecekle ilgileniyorsanız 2000’in salı olduğunu bilseniz de yeter.

Haftanın Gününü Bulma#

Bir yılın kıyamet gününü bulmayı öğrendik. Kıyamet günüyle haftanın gününü de bulmayı öğrenmiştik. Şimdi ikisini birleştirip, herhangi bir tarihin haftanın hangi günü olduğunu bulabiliriz. Önceki formüle, kaydırdığımız günleri de eklememiz yeterli.

14 Kasım 1987, haftanın hangi günüdür ?

Kasımın kıyamet günü 7’sinde, o zaman 7 gün eklemeliyiz. 1900’ün kıyamet günü Çarşamba, 87 yıl sonrasını bulmak için 87 / 12 den bölüm 7 kalan 3, 3 / 4 ten bölüm 0. Gereken her şeyi bulduk, sadece toplamamız gerekiyor.

3 + 7 + 7 + 3 + 0 = 6 (cumartesi)

Buradan sonrası 12 ve 7’ye bölme işlemlerine, mod 7’de toplamaya, 4 çıpayı ve 12 ayı ezberlemenize kalmış.

Ek Okuma#

Burada oldukça detaylı bir yazı var. Ayrıca bu sitede pratik yapabilirsiniz. Birçok programlama dilinde implementasyonu var, bunlardan birini çalıştırabilirsiniz. Biz de bir Common Lisp implementasyonu yapalım.

Program#

(defun artık-yıl? (yıl)
  (and (= (mod yıl 4) 0)
       (or (/= (mod yıl 100) 0)
           (= (mod yıl 400) 0))))

(defun gün+ (&rest günler)
  (mod (apply #'+ günler) 7))

(let ((çıpa #(2 0 5 3))) ; asrın modunu alarak index buluyorum
  (defun yıl-kıyamet-günü (yıl)
    (multiple-value-bind (asır yıl*) (floor yıl 100)
      (gün+ (aref çıpa (mod asır 4)) yıl* (floor yıl* 4)))))

(defstruct tarih
  (yıl 0 :type fixnum)
  (ay 0 :type fixnum)
  (gün 0 :type fixnum))

(let ((günler #(0 3 28 14 4 9 6 11 8 5 10 7 12)))
  (defun ay-kıyamet-günü (tarih)
    (with-slots (yıl ay) tarih
      (or (and (artık-yıl? yıl)
               (or (and (= ay 1) 4)
                   (and (= ay 2) 29)))
          (aref günler ay)))))

(defun tarih-hafta-günü (tarih)
  (let ((kıyamet (yıl-kıyamet-günü (tarih-yıl tarih))))
    (gün+ kıyamet (tarih-gün tarih) (- (ay-kıyamet-günü tarih)))))

Hesaplamak için gereken tüm mantık burada. Bir tarih objesi yapıp tarih-hafta-günü fonksiyonunu deneyelim.

CL-USER> (tarih-hafta-günü (make-tarih :yıl 1922 :ay 8 :gün 30))
3

Eğer sayı yerine metin olarak istiyorsak şunun gibi bir fonksiyon kullanabiliriz:

(let ((gün-metinleri #("Pazar" "Pazartesi" "Salı" "Çarşamba"
                       "Perşembe" "Cuma" "Cumartesi")))
  (defun gün->metin (gün)
    (aref gün-metinleri (mod gün 7))))

Rastgele bir tarih seçip kullanıcıya soru soracak şekilde ekleme yapılabilir, ben burada bırakıyorum.


  1. Sanırım John Conway’i ilk kez Game of Life‘ı (Hayat oyunu) sayesinde öğrenmiştim. Kendisi bir matematikçinin açısından bunun pek ilgi çekici olmadığını dile getirse de gerçekten büyüleyici bir oyun. Maalesef, keşfimden kısa bir süre sonra, 2020’de, kendisini kaybettik. ↩︎

  2. Ayrıca konumuzla alakasız, Kıyamet Algoritması adlı bir kitap da varmış. ↩︎

  3. 4000’e bölünenler de artık yıl değil, ama karşılaşacağımız sanmıyorum. ↩︎

  4. Saymaya 4’ün katı bir yılda başlarsak geçerli, ki zaten çıpa asırları kullanıyoruz. 12 yılda 3 artık yıl var, 15 mod 7 = 1. ↩︎