<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-10T12:05:44+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Akıllı Bir Kelime Öğrenme Sistemi Nasıl Tasarlanır?</title><link href="https://program.sonsuz.us/posts/akilli-bir-kelime-ogrenme-sistemi-nasil-tasarlanir/" rel="alternate" type="text/html" title="Akıllı Bir Kelime Öğrenme Sistemi Nasıl Tasarlanır?" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-bir-kelime-ogrenme-sistemi-nasil-tasarlanir</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-bir-kelime-ogrenme-sistemi-nasil-tasarlanir/"><![CDATA[<p>Bir kelimeyi bugün öğrenip yarın unutmak beynimizin küçük bir şakasıdır; kötü hafızadan çok, yanlış zamanda tekrar yapmanın sonucudur. AnkiWeb, Mochi ve Mnemosyne gibi sistemler bu sorunu <strong>aralıklı tekrar</strong> algoritmalarıyla çözer. Gelin benzer bir uygulamanın arkasındaki teoriyi, araçların farklı yaklaşımlarını ve çalışır durumdaki basit bir zamanlama algoritmasını birlikte inceleyelim.</p>

<p><img src="/img/akilli-bir-kelime-63.svg" alt="akilli-bir-kelime-63" /></p>

<p>``</p>

<h2 id="aralıklı-tekrar-neden-işe-yarar">Aralıklı tekrar neden işe yarar?</h2>

<p>Hermann Ebbinghaus’un unutma eğrisi, bir bilginin hatırlanma gücünün zamanla üstel biçimde azaldığını öne sürer. Basitleştirilmiş bir model şöyledir:</p>

\[R(t) = e^{-t/S}\]

<p>Burada $R(t)$ hatırlama olasılığını, $t$ son çalışmadan beri geçen süreyi, $S$ ise anının dayanıklılığını temsil eder. Aynı kelimeyi başarıyla hatırladıkça $S$ büyür; böylece tekrarlar arasındaki süre uzatılabilir.</p>

<p>Örneğin “serendipity” kelimesini ilk gün öğrendiğimizi düşünelim. İlk tekrar bir gün sonra, sonraki tekrar üç gün sonra, ardından sekiz veya on gün sonra yapılabilir. Amaç, kartı tamamen unutmadan hemen önce göstermektir. Çok erken tekrar zaman kaybettirir, çok geç tekrar ise öğrenme sürecini başa sarar.</p>

<h2 id="ankiweb-mochi-ve-mnemosyne-karşılaştırması">AnkiWeb, Mochi ve Mnemosyne karşılaştırması</h2>

<p>Bu araçların ortak hedefi aynı olsa da kullanıcı deneyimleri ve veri modelleri farklıdır:</p>

<table>
  <thead>
    <tr>
      <th>Sistem</th>
      <th>Güçlü yönü</th>
      <th>İçerik yaklaşımı</th>
      <th>Kimler için uygun?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>AnkiWeb</td>
      <td>Geniş eklenti ve deste sistemi</td>
      <td>Ön yüz, arka yüz ve alanlar</td>
      <td>Ayrıntılı kontrol isteyenler</td>
    </tr>
    <tr>
      <td>Mochi</td>
      <td>Temiz arayüz ve Markdown desteği</td>
      <td>Notlar arasında bağlantılar</td>
      <td>Not alma ile ezberi birleştirenler</td>
    </tr>
    <tr>
      <td>Mnemosyne</td>
      <td>Araştırma odaklı sade yapı</td>
      <td>Klasik soru-cevap kartları</td>
      <td>Dikkat dağıtmayan araç arayanlar</td>
    </tr>
  </tbody>
</table>

<p>Anki ekosistem ve özelleştirme konusunda öne çıkar. Mochi, kartları birbirine bağlayarak kişisel bilgi ağı kurmayı kolaylaştırır. Mnemosyne ise daha sade ve akademik bir yaklaşım sunar. Kısacası Anki bir kontrol paneli, Mochi dijital bahçe, Mnemosyne ise sakin bir çalışma masası gibidir.</p>

<h2 id="temel-veri-modeli">Temel veri modeli</h2>

<p>Kendi sistemimizde her kart için kelime, anlam, örnek cümle, tekrar tarihi, kolaylık katsayısı ve tekrar sayısı saklanabilir. Ayrıca öğrenme yönünü değiştirmek yararlıdır: “apple → elma” kartı tanımayı, “elma → apple” kartı ise aktif hatırlamayı ölçer.</p>

<p>Basit bir kart modeli şu alanları içerebilir:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">front</code>: Sorulan kelime veya ipucu</li>
  <li><code class="language-plaintext highlighter-rouge">back</code>: Anlam ve örnek cümle</li>
  <li><code class="language-plaintext highlighter-rouge">interval</code>: Bir sonraki tekrara kalan gün</li>
  <li><code class="language-plaintext highlighter-rouge">ease</code>: Kartın kişisel zorluk katsayısı</li>
  <li><code class="language-plaintext highlighter-rouge">due</code>: Gösterileceği tarih</li>
</ul>

<h2 id="basitleştirilmiş-sm-2-zamanlayıcısı">Basitleştirilmiş SM-2 zamanlayıcısı</h2>

<p>Aşağıdaki Python fonksiyonu, kullanıcının 0 ile 5 arasındaki cevabına göre yeni tekrar aralığını hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">schedule_card</span><span class="p">(</span><span class="n">quality</span><span class="p">,</span> <span class="n">repetitions</span><span class="p">,</span> <span class="n">interval</span><span class="p">,</span> <span class="n">ease</span><span class="p">):</span>
    <span class="c1"># 3'ten düşük puan, kartın hatırlanamadığını gösterir.
</span>    <span class="k">if</span> <span class="n">quality</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
        <span class="n">repetitions</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="n">interval</span> <span class="o">=</span> <span class="mi">1</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">repetitions</span> <span class="o">+=</span> <span class="mi">1</span>

        <span class="k">if</span> <span class="n">repetitions</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">interval</span> <span class="o">=</span> <span class="mi">1</span>
        <span class="k">elif</span> <span class="n">repetitions</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
            <span class="n">interval</span> <span class="o">=</span> <span class="mi">6</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">interval</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">interval</span> <span class="o">*</span> <span class="n">ease</span><span class="p">)</span>

    <span class="c1"># Başarılı cevap kolaylığı artırır, zor cevap azaltır.
</span>    <span class="n">ease</span> <span class="o">+=</span> <span class="mf">0.1</span> <span class="o">-</span> <span class="p">(</span><span class="mi">5</span> <span class="o">-</span> <span class="n">quality</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">0.08</span> <span class="o">+</span> <span class="p">(</span><span class="mi">5</span> <span class="o">-</span> <span class="n">quality</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.02</span><span class="p">)</span>
    <span class="n">ease</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">1.3</span><span class="p">,</span> <span class="n">ease</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">repetitions</span><span class="p">,</span> <span class="n">interval</span><span class="p">,</span> <span class="n">ease</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">schedule_card</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">))</span>
</code></pre></div></div>

<p>Fonksiyon kart unutulduğunda programı sıfırlar; doğru cevaplarda ise mevcut aralığı kolaylık katsayısıyla büyütür. $I_{yeni} = I_{eski} \times E$ ilişkisi, uzun vadede tekrar sayısını ciddi biçimde azaltır. Gerçek bir uygulamada saat dilimi, günlük kart sınırı, gecikmiş tekrarlar ve kullanıcı alışkanlıkları da hesaba katılmalıdır.</p>

<h2 id="i̇yi-bir-sistemin-sırrı">İyi bir sistemin sırrı</h2>

<p>Algoritma tek başına mucize yaratmaz. Kartlar kısa olmalı, tek bir bilgiyi sınamalı ve kelimeyi bağlam içinde göstermelidir. Görsel, ses kaydı ve gerçek bir örnek cümle hatırlamayı güçlendirir. En iyi araç; en gelişmiş formüle sahip olan değil, her gün açmayı unutmadığınız araçtır. Beş dakikalık düzenli tekrar, pazar gecesi yapılan iki saatlik kelime maratonunu çoğu zaman rahatça yener.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="kelime öğrenme" /><category term="aralıklı tekrar" /><category term="anki" /><category term="mochi" /><category term="mnemosyne" /><category term="python" /><summary type="html"><![CDATA[Bir kelimeyi bugün öğrenip yarın unutmak beynimizin küçük bir şakasıdır; kötü hafızadan çok, yanlış zamanda tekrar yapmanın sonucudur. AnkiWeb, Mochi ve Mnemosyne gibi sistemler bu sorunu aralıklı tekrar algoritmalarıyla çözer. Gelin benzer bir uygulamanın arkasındaki teoriyi, araçların farklı yaklaşımlarını ve çalışır durumdaki basit bir zamanlama algoritmasını birlikte inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-bir-kelime-63.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-bir-kelime-63.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bulmacaların Gizli Anahtarı: Problem Çözümünde İkili Sayı Sistemi</title><link href="https://program.sonsuz.us/posts/bulmacalarin-gizli-anahtari-problem-cozumunde-ikili-sayi-sistemi/" rel="alternate" type="text/html" title="Bulmacaların Gizli Anahtarı: Problem Çözümünde İkili Sayı Sistemi" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bulmacalarin-gizli-anahtari-problem-cozumunde-ikili-sayi-sistemi</id><content type="html" xml:base="https://program.sonsuz.us/posts/bulmacalarin-gizli-anahtari-problem-cozumunde-ikili-sayi-sistemi/"><![CDATA[<p><img src="/img/bulmacalarin-gizli-anahtari-13.svg" alt="bulmacalarin-gizli-anahtari-13" /></p>

<p>Bilgisayarların yalnızca sıfır ve birlerle çalışması ilk bakışta teknolojik bir sınırlama gibi görünebilir. Oysa ikili sayı sistemi, klasik mantık bulmacalarında bilgiyi düzenlemek, olasılıkları kodlamak ve en az sayıda işlemle sonuca ulaşmak için kullanılan son derece güçlü bir araçtır. Zehirli şişelerden ağırlık tartma sorularına kadar pek çok problem, doğru açıdan bakıldığında aslında gizlenmiş birer ikili kodlama egzersizidir.</p>

<p>``</p>

<h2 id="i̇kili-sistem-neden-bu-kadar-kullanışlı">İkili sistem neden bu kadar kullanışlı?</h2>

<p>Onluk sistemde her basamak 0 ile 9 arasında değer alırken ikili sistemde yalnızca iki durum bulunur: <strong>0</strong> ve <strong>1</strong>. Bunlar hayır–evet, kapalı–açık, başarısız–başarılı veya hafif–ağır gibi iki seçenekli durumları temsil edebilir.</p>

<p>Bir ikili sayının değeri şöyle hesaplanır:</p>

\[N = b_0 2^0 + b_1 2^1 + b_2 2^2 + ... + b_k 2^k\]

<p>Burada her $b_i$ yalnızca 0 veya 1 olabilir. Örneğin $1011_2$ sayısı:</p>

\[1 × 2^3 + 0 × 2^2 + 1 × 2^1 + 1 × 2^0 = 11\]

<p>Bu gösterimin problem çözmedeki asıl avantajı, $k$ adet iki durumlu gözlemle $2^k$ farklı olasılığı ayırt edebilmesidir.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">Gözlem sayısı</th>
      <th style="text-align: right">Kodlanabilen olasılık</th>
      <th>Örnek kodlar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">1</td>
      <td style="text-align: right">$2^1 = 2$</td>
      <td>0, 1</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td style="text-align: right">$2^2 = 4$</td>
      <td>00, 01, 10, 11</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td style="text-align: right">$2^3 = 8$</td>
      <td>000–111</td>
    </tr>
    <tr>
      <td style="text-align: right">10</td>
      <td style="text-align: right">$2^{10} = 1024$</td>
      <td>0000000000–1111111111</td>
    </tr>
  </tbody>
</table>

<h2 id="zehirli-şişe-bulmacası">Zehirli şişe bulmacası</h2>

<p>Klasik soruyu düşünelim: <strong>1000 şişeden biri zehirli ve yalnızca 10 test şeridimiz var. Tek turda zehirli şişeyi nasıl buluruz?</strong> Her şişeyi ayrı ayrı test etmek mümkün değildir. Fakat $2^{10}=1024$ olduğu için 10 şerit, 1024 farklı sonucu kodlayabilir.</p>

<p>Şişeleri 0 ile 999 arasında numaralandırır ve numaraları 10 bitlik ikili biçimde yazarız. Bir şişenin ikili gösterimindeki hangi bitler 1 ise o şişeden ilgili test şeritlerine örnek damlatırız. Örneğin 13 numaralı şişenin kodu <code class="language-plaintext highlighter-rouge">0000001101</code> olur; dolayısıyla 1 değerine sahip bitlerin karşılık geldiği şeritlere eklenir.</p>

<p>Bekleme sonunda pozitif çıkan şeritler 1, negatif çıkanlar 0 kabul edilir. Ortaya çıkan ikili sayı doğrudan zehirli şişenin numarasıdır. Buradaki sihir aslında sihir değil, her şişeye benzersiz bir <strong>bit deseni</strong> vermektir.</p>

<h2 id="ağırlıklarla-ölçme-bulmacası">Ağırlıklarla ölçme bulmacası</h2>

<p>Elimizde 1, 2, 4 ve 8 kilogramlık ağırlıklar varsa 1 ile 15 kilogram arasındaki her tam değeri ölçebiliriz. Çünkü bu ağırlıklar ikinin kuvvetleridir:</p>

\[1 + 2 + 4 + 8 = 15\]

<p>Örneğin 13 kilogram, $1101_2$ biçimindedir. Bu nedenle 8, 4 ve 1 kilogramlık ağırlıklar kullanılır; 2 kilogramlık ağırlık kullanılmaz.</p>

<table>
  <thead>
    <tr>
      <th>İkili basamak</th>
      <th style="text-align: right">Ağırlık</th>
      <th>13 kg için durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$2^3$</td>
      <td style="text-align: right">8 kg</td>
      <td>Kullan</td>
    </tr>
    <tr>
      <td>$2^2$</td>
      <td style="text-align: right">4 kg</td>
      <td>Kullan</td>
    </tr>
    <tr>
      <td>$2^1$</td>
      <td style="text-align: right">2 kg</td>
      <td>Kullanma</td>
    </tr>
    <tr>
      <td>$2^0$</td>
      <td style="text-align: right">1 kg</td>
      <td>Kullan</td>
    </tr>
  </tbody>
</table>

<h2 id="aynı-fikri-python-ile-görmek">Aynı fikri Python ile görmek</h2>

<p>Aşağıdaki kod, bir sayıyı oluşturmak için hangi ikinin kuvvetlerinin seçilmesi gerektiğini bulur:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">secilen_agirliklar</span><span class="p">(</span><span class="n">hedef</span><span class="p">):</span>
    <span class="n">agirliklar</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">bit</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">while</span> <span class="n">hedef</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">hedef</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">agirliklar</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="n">bit</span><span class="p">)</span>
        <span class="n">hedef</span> <span class="o">&gt;&gt;=</span> <span class="mi">1</span>
        <span class="n">bit</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="k">return</span> <span class="n">agirliklar</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">secilen_agirliklar</span><span class="p">(</span><span class="mi">13</span><span class="p">))</span>  <span class="c1"># [1, 4, 8]
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">hedef &amp; 1</code> işlemi en sağdaki bitin 1 olup olmadığını denetler. <code class="language-plaintext highlighter-rouge">hedef &gt;&gt;= 1</code> ise sayıyı bir bit sağa kaydırarak sıradaki basamağa geçer. Böylece algoritma, sayının ikili gösterimini doğrudan seçilecek ağırlıklara dönüştürür.</p>

<h2 id="bulmacalarda-ikili-düşünme-yöntemi">Bulmacalarda ikili düşünme yöntemi</h2>

<p>Bir soruda çok sayıda aday ve yalnızca iki sonuç üreten testler varsa şu adımlar uygulanabilir:</p>

<ol>
  <li>Olasılık sayısını $n$ olarak belirle.</li>
  <li>$2^k ≥ n$ koşulunu sağlayan en küçük $k$ değerini bul.</li>
  <li>Her adaya benzersiz bir $k$ bitlik kod ata.</li>
  <li>Her testi kodun bir basamağıyla ilişkilendir.</li>
  <li>Sonuç bitlerini birleştirerek doğru adayı belirle.</li>
</ol>

<p>Kısacası ikili sistem yalnızca bilgisayarların dili değildir; sınırlı gözlemlerden maksimum bilgi çıkarma yöntemidir. Bir bulmacada “açık veya kapalı”, “doğru veya yanlış” gibi iki durumlu sonuçlar görüyorsanız, çözümün bir köşesinde büyük olasılıkla ikinin kuvvetleri gülümsüyordur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ikili sistem" /><category term="algoritma" /><category term="problem çözme" /><category term="matematik" /><category term="bulmaca" /><category term="python" /><summary type="html"><![CDATA[Bilgisayarların yalnızca sıfır ve birlerle çalışması ilk bakışta teknolojik bir sınırlama gibi görünebilir. Oysa ikili sayı sistemi, klasik mantık bulmacalarında bilgiyi düzenlemek, olasılıkları kodlamak ve en az sayıda işlemle sonuca ulaşmak için kullanılan son derece güçlü bir araçtır. Zehirli şişelerden ağırlık tartma sorularına kadar pek çok problem, doğru açıdan bakıldığında aslında gizlenmiş birer ikili kodlama egzersizidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bulmacalarin-gizli-anahtari-13.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bulmacalarin-gizli-anahtari-13.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Büyük O, Teta ve Omega: Algoritma Karmaşıklığının Üç Farklı Yüzü</title><link href="https://program.sonsuz.us/posts/buyuk-o-teta-ve-omega-algoritma-karmasikliginin-uc-farkli-yuzu/" rel="alternate" type="text/html" title="Büyük O, Teta ve Omega: Algoritma Karmaşıklığının Üç Farklı Yüzü" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/buyuk-o-teta-ve-omega-algoritma-karmasikliginin-uc-farkli-yuzu</id><content type="html" xml:base="https://program.sonsuz.us/posts/buyuk-o-teta-ve-omega-algoritma-karmasikliginin-uc-farkli-yuzu/"><![CDATA[<p>Bir algoritmanın hızlı olduğunu söylemek tek başına pek anlamlı değildir. Hangi girdide, ne kadar hızlı ve büyüyen veri karşısında nasıl davranıyor? İşte Büyük O, Teta ve Omega notasyonları bu soruları matematiksel sınırlarla yanıtlar. Ancak yaygın inanışın aksine Büyük O doğrudan “en kötü”, Omega “en iyi”, Teta da “ortalama” durum demek değildir. Durum analizi ile asimptotik sınır, birbiriyle ilişkili ama farklı kavramlardır.</p>

<p>``</p>

<h2 id="önce-asimptotik-analiz-nedir">Önce asimptotik analiz nedir?</h2>

<p>Asimptotik analiz, girdi boyutu $n$ büyürken algoritmanın zaman veya bellek ihtiyacının nasıl değiştiğini inceler. Donanım, programlama dili ve birkaç milisaniyelik sabit farklar yerine büyüme eğilimine odaklanır.</p>

<p>Örneğin çalışma süresi</p>

\[T(n)=3n^2+5n+20\]

<p>olan bir algoritmada, büyük $n$ değerleri için $n^2$ terimi baskındır. Sabit katsayılar ve düşük dereceli terimler göz ardı edildiğinde büyüme $n^2$ ile ifade edilir.</p>

<h2 id="üç-notasyonun-temel-farkı">Üç notasyonun temel farkı</h2>

<table>
  <thead>
    <tr>
      <th>Notasyon</th>
      <th>Anlamı</th>
      <th>Verdiği sınır</th>
      <th>Basit yorum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$O(g(n))$</td>
      <td>En fazla bu hızda büyür</td>
      <td>Üst sınır</td>
      <td>“Bundan daha kötü büyümez.”</td>
    </tr>
    <tr>
      <td>$\Omega(g(n))$</td>
      <td>En az bu hızda büyür</td>
      <td>Alt sınır</td>
      <td>“En az bunun kadar büyür.”</td>
    </tr>
    <tr>
      <td>$\Theta(g(n))$</td>
      <td>Aynı mertebede büyür</td>
      <td>Sıkı sınır</td>
      <td>“Büyüme hızı tam olarak budur.”</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/buyuk-o-teta-62.svg" alt="buyuk-o-teta-62" /></p>

<h3 id="büyük-o-üst-sınır">Büyük O: Üst sınır</h3>

<p>$f(n)=O(g(n))$ diyebilmek için yeterince büyük $n$ değerlerinde</p>

\[0 \leq f(n) \leq c\,g(n)\]

<p>olacak pozitif bir $c$ sabiti bulunmalıdır. Örneğin $3n^2+5n+20$, hem $O(n^2)$ hem de teknik olarak $O(n^3)$ içindedir. Fakat $O(n^2)$ daha bilgilendirici ve daha sıkı bir üst sınırdır.</p>

<h3 id="omega-alt-sınır">Omega: Alt sınır</h3>

<p>$f(n)=\Omega(g(n))$, fonksiyonun en az $g(n)$ kadar hızlı büyüdüğünü belirtir:</p>

\[0 \leq c\,g(n) \leq f(n)\]

<p>Örneğin $3n^2+5n+20$, $\Omega(n^2)$ sınıfındadır. Bu notasyon algoritmanın belirli bir maliyetin altına inemeyeceğini anlatır.</p>

<h3 id="teta-sıkı-sınır">Teta: Sıkı sınır</h3>

<p>Teta, alt ve üst sınırın birleşimidir:</p>

\[c_1g(n) \leq f(n) \leq c_2g(n)\]

<p>Dolayısıyla $f(n)=\Theta(g(n))$ ise fonksiyon hem $O(g(n))$ hem de $\Omega(g(n))$ olur. Örneğimiz için en açıklayıcı ifade $T(n)=\Theta(n^2)$ biçimindedir.</p>

<h2 id="en-iyi-ortalama-ve-en-kötü-durum">En iyi, ortalama ve en kötü durum</h2>

<p>Durumlar, girdinin algoritmayı nasıl etkilediğini; notasyonlar ise seçilen durumdaki büyümeye ilişkin sınırı belirtir.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Doğrusal aramadaki örnek</th>
      <th>Karmaşıklık</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>En iyi</td>
      <td>Aranan değer ilk elemandır</td>
      <td>$\Theta(1)$</td>
    </tr>
    <tr>
      <td>Ortalama</td>
      <td>Değer genellikle listenin ortalarındadır</td>
      <td>$\Theta(n)$</td>
    </tr>
    <tr>
      <td>En kötü</td>
      <td>Değer sondadır veya hiç yoktur</td>
      <td>$\Theta(n)$</td>
    </tr>
  </tbody>
</table>

<p>Burada her durum için Teta kullanabildiğimize dikkat edin. “En kötü durum $O(n)$” doğrudur; fakat sıkı sınır biliniyorsa “en kötü durum $\Theta(n)$” daha güçlü bir ifadedir. Ortalama durum analizi ise girdilerin olasılık dağılımını gerektirir. Her girdinin eşit olasılıklı olduğunu varsaymak her zaman gerçekçi değildir.</p>

<h2 id="kod-üzerinde-görelim">Kod üzerinde görelim</h2>

<p>Aşağıdaki Python fonksiyonu, doğrusal arama yaparken kaç karşılaştırma gerçekleştirildiğini de döndürür:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">linear_search</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
    <span class="n">comparisons</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
        <span class="n">comparisons</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="n">target</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">index</span><span class="p">,</span> <span class="n">comparisons</span>

    <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">comparisons</span>

<span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">21</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">linear_search</span><span class="p">(</span><span class="n">numbers</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>   <span class="c1"># En iyi durum: 1 karşılaştırma
</span><span class="nf">print</span><span class="p">(</span><span class="nf">linear_search</span><span class="p">(</span><span class="n">numbers</span><span class="p">,</span> <span class="mi">21</span><span class="p">))</span>  <span class="c1"># En kötü durum: 5 karşılaştırma
</span></code></pre></div></div>

<p>İlk çağrıda maliyet girdi boyutundan bağımsızdır. İkinci çağrıda karşılaştırma sayısı $n$ ile birlikte doğrusal büyür.</p>

<h2 id="hangisini-kullanmalıyız">Hangisini kullanmalıyız?</h2>

<p>Bir algoritmayı tanıtırken analiz edilen durumu açıkça söylemek en güvenli yaklaşımdır: “en kötü durumda $\Theta(n^2)$” gibi. Yalnızca güvenli bir üst sınır biliniyorsa Büyük O, kaçınılmaz bir alt sınır gösteriliyorsa Omega, büyüme kesin biçimde sınırlandırılabiliyorsa Teta kullanılmalıdır. Kısacası notasyonlar yarışmıyor; algoritmanın performansını farklı açılardan aydınlatıyor.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritmalar" /><category term="büyük-o" /><category term="karmaşıklık" /><category term="performans" /><category term="veri-yapıları" /><category term="python" /><summary type="html"><![CDATA[Bir algoritmanın hızlı olduğunu söylemek tek başına pek anlamlı değildir. Hangi girdide, ne kadar hızlı ve büyüyen veri karşısında nasıl davranıyor? İşte Büyük O, Teta ve Omega notasyonları bu soruları matematiksel sınırlarla yanıtlar. Ancak yaygın inanışın aksine Büyük O doğrudan “en kötü”, Omega “en iyi”, Teta da “ortalama” durum demek değildir. Durum analizi ile asimptotik sınır, birbiriyle ilişkili ama farklı kavramlardır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/buyuk-o-teta-62.png" /><media:content medium="image" url="https://program.sonsuz.us/img/buyuk-o-teta-62.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dişli Çarklardan Silikon Çiplere: Bilgisayarın Gelişim Tarihi</title><link href="https://program.sonsuz.us/posts/disli-carklardan-silikon-ciplere-bilgisayarin-gelisim-tarihi/" rel="alternate" type="text/html" title="Dişli Çarklardan Silikon Çiplere: Bilgisayarın Gelişim Tarihi" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/disli-carklardan-silikon-ciplere-bilgisayarin-gelisim-tarihi</id><content type="html" xml:base="https://program.sonsuz.us/posts/disli-carklardan-silikon-ciplere-bilgisayarin-gelisim-tarihi/"><![CDATA[<p>Bugün cebimizde taşıdığımız telefonlar, birkaç on yıl önce odaları dolduran bilgisayarlardan milyonlarca kat daha güçlü. Ancak bu teknolojik yolculuk bir anda başlamadı. Dişli çarklarla çalışan hesap makinelerinden vakum tüplerine, transistörlerden milyarlarca bileşen içeren işlemcilere uzanan bilgisayar tarihi; matematik, mühendislik ve insan merakının ortak ürünüdür.</p>

<p>``</p>

<h2 id="mekanik-hesaplamanın-doğuşu">Mekanik hesaplamanın doğuşu</h2>

<p>Bilgisayarların uzak atalarından biri, 1642 yılında Blaise Pascal tarafından geliştirilen <strong>Pascaline</strong> adlı mekanik hesap makinesiydi. Dişli çarklar kullanan bu cihaz toplama ve çıkarma yapabiliyordu. Gottfried Wilhelm Leibniz ise 1670’lerde sistemi geliştirerek çarpma ve bölme işlemlerini de mekanikleştirdi.</p>

<p>Bu makinelerin temel fikri, sayıları fiziksel konumlarla temsil etmekti. Örneğin bir çarkın on farklı konumu, 0 ile 9 arasındaki rakamlara karşılık geliyordu. Günümüzde aynı yaklaşım elektrik sinyalleriyle uygulanır; ancak on durum yerine çoğunlukla iki durum kullanılır:</p>

\[bit \in \{0,1\}\]

<p>Mekanik sistemlerde hareket eden parçalar bilgiyi taşırken modern bilgisayarlarda bu görevi gerilim seviyeleri üstlenir.</p>

<h2 id="programlanabilir-makine-fikri">Programlanabilir makine fikri</h2>

<p>1800’lerin başında Joseph Marie Jacquard, dokuma tezgâhlarını <strong>delikli kartlarla</strong> kontrol etti. Kartlardaki delikler bir tür komut dizisi oluşturuyordu. Charles Babbage bu fikirden etkilenerek 1837’de <strong>Analitik Makine</strong> tasarımını ortaya koydu.</p>

<p>Babbage’ın makinesi tamamlanamamış olsa da işlem birimi, bellek, giriş ve çıkış gibi modern bilgisayar bileşenlerini teorik olarak içeriyordu. Ada Lovelace ise makinenin Bernoulli sayılarını hesaplaması için bir algoritma hazırladı ve tarihin ilk bilgisayar programcısı kabul edildi.</p>

<h2 id="elektronik-bilgisayarlar-sahneye-çıkıyor">Elektronik bilgisayarlar sahneye çıkıyor</h2>

<p>1940’larda mekanik parçaların yerini röleler ve vakum tüpleri aldı. 1946’da tanıtılan <strong>ENIAC</strong>, yaklaşık 18.000 vakum tüpü kullanıyor ve saniyede binlerce işlem gerçekleştirebiliyordu. Ne var ki devasa boyutlu, enerji oburu ve arızaya yatkındı.</p>

<table>
  <thead>
    <tr>
      <th>Dönem</th>
      <th>Temel teknoloji</th>
      <th>Başlıca avantaj</th>
      <th>Başlıca sorun</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1600–1800</td>
      <td>Dişli çarklar</td>
      <td>Hesabı otomatikleştirme</td>
      <td>Yavaşlık ve aşınma</td>
    </tr>
    <tr>
      <td>1940’lar</td>
      <td>Vakum tüpleri</td>
      <td>Elektronik hız</td>
      <td>Isınma ve yüksek enerji</td>
    </tr>
    <tr>
      <td>1950–1960</td>
      <td>Transistörler</td>
      <td>Küçük boyut, güvenilirlik</td>
      <td>Üretim maliyeti</td>
    </tr>
    <tr>
      <td>1970 sonrası</td>
      <td>Mikroişlemciler</td>
      <td>Yüksek entegrasyon</td>
      <td>Isı ve karmaşıklık</td>
    </tr>
    <tr>
      <td>Günümüz</td>
      <td>Çok çekirdekli çipler</td>
      <td>Paralel işlem</td>
      <td>Güç tüketimi sınırları</td>
    </tr>
  </tbody>
</table>

<h2 id="transistör-ve-mikroişlemci-devrimi">Transistör ve mikroişlemci devrimi</h2>

<p>1947’de transistörün geliştirilmesi bilgisayarları küçülttü, hızlandırdı ve daha güvenilir hâle getirdi. Ardından çok sayıda transistörün aynı yüzeye yerleştirildiği <strong>entegre devreler</strong> ortaya çıktı. 1971’de Intel 4004, ticari açıdan başarılı ilk mikroişlemcilerden biri oldu.</p>

<p>İşlemci performansı kabaca saat frekansı, çekirdek sayısı ve saat başına tamamlanan komut miktarıyla ilişkilendirilebilir:</p>

\[P \approx f \times C \times IPC\]

<p>Burada $f$ frekansı, $C$ çekirdek sayısını, $IPC$ ise döngü başına işlenen komut sayısını temsil eder. Gerçek performans bellek, önbellek ve yazılım tasarımından da etkilenir.</p>

<p>İkili sistemin temel mantığını küçük bir Python örneğiyle görebiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">ikili_topla</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="c1"># Metin biçimindeki ikili sayıları onlu sisteme çevirir.
</span>    <span class="n">toplam</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="nf">int</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>

    <span class="c1"># Sonucu yeniden ikili gösterime dönüştürür.
</span>    <span class="k">return</span> <span class="nf">bin</span><span class="p">(</span><span class="n">toplam</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">ikili_topla</span><span class="p">(</span><span class="sh">"</span><span class="s">1010</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">0111</span><span class="sh">"</span><span class="p">))</span>  <span class="c1"># 10001
</span></code></pre></div></div>

<p>Bu kod, işlemcideki gerçek mantık kapılarının yaptığı işi soyut düzeyde taklit eder. Donanımda toplama; AND, OR ve XOR gibi devrelerle gerçekleştirilir.</p>

<h2 id="günümüz-paralellik-ve-uzmanlaşma">Günümüz: Paralellik ve uzmanlaşma</h2>

<p>Transistör sayısının yaklaşık iki yılda bir artacağını öngören <strong>Moore Yasası</strong>, onlarca yıl boyunca sektöre yön verdi. Fiziksel küçülmenin zorlaşmasıyla üreticiler yalnızca frekansı artırmak yerine çok çekirdekli mimarilere yöneldi. GPU’lar grafik işlemlerinin yanında yapay zekâ ve bilimsel hesaplama için kullanılmaya başlandı. NPU gibi özel birimler ise belirli görevleri daha az enerjiyle tamamlıyor.</p>

<p>Kısacası bilgisayarın gelişimi, “daha hızlı hesaplama” arzusundan “doğru işi doğru donanımla yapma” anlayışına evrildi. Pascal’ın çarklarından modern işlemcilerin nanometre ölçeğindeki transistörlerine kadar değişmeyen temel amaç ise aynı kaldı: bilgiyi temsil etmek, kurallara göre işlemek ve anlamlı sonuç üretmek.</p>

<p><img src="/img/disli-carklardan-silikon-55.svg" alt="disli-carklardan-silikon-55" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bilgisayar tarihi" /><category term="işlemci" /><category term="teknoloji" /><category term="programlama" /><category term="donanım" /><category term="yapay zeka" /><summary type="html"><![CDATA[Bugün cebimizde taşıdığımız telefonlar, birkaç on yıl önce odaları dolduran bilgisayarlardan milyonlarca kat daha güçlü. Ancak bu teknolojik yolculuk bir anda başlamadı. Dişli çarklarla çalışan hesap makinelerinden vakum tüplerine, transistörlerden milyarlarca bileşen içeren işlemcilere uzanan bilgisayar tarihi; matematik, mühendislik ve insan merakının ortak ürünüdür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/disli-carklardan-silikon-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/disli-carklardan-silikon-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Flashcard Arenasında Üç Rakip: Anki, Mnemosyne ve Mochi</title><link href="https://program.sonsuz.us/posts/flashcard-arenasinda-uc-rakip-anki-mnemosyne-ve-mochi/" rel="alternate" type="text/html" title="Flashcard Arenasında Üç Rakip: Anki, Mnemosyne ve Mochi" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/flashcard-arenasinda-uc-rakip-anki-mnemosyne-ve-mochi</id><content type="html" xml:base="https://program.sonsuz.us/posts/flashcard-arenasinda-uc-rakip-anki-mnemosyne-ve-mochi/"><![CDATA[<p>Bir bilgiyi öğrenmek kolay, onu üç ay sonra hatırlamak ise bambaşka bir oyundur. Flashcard uygulamaları bu oyunda beynimize küçük ama düzenli paslar atar. Anki, Mnemosyne ve Mochi aynı temel fikri, yani <strong>aralıklı tekrarı</strong>, farklı arayüzler ve çalışma modelleriyle uygular. Gelin bu üç aracı karşılaştıralım ve kartların neden doğru zamanda karşımıza çıktığını anlayalım.</p>

<p><img src="/img/flashcard-arenasinda-uc-93.svg" alt="flashcard-arenasinda-uc-93" /></p>

<p>``</p>

<h2 id="aralıklı-tekrar-neden-işe-yarar">Aralıklı tekrar neden işe yarar?</h2>

<p>İnsan belleği, kullanılmayan bilgiyi zamanla silikleştirir. Basitleştirilmiş bir unutma eğrisi şu şekilde gösterilebilir:</p>

\[R(t)=e^{-t/S}\]

<p>Burada $R(t)$ bilgiyi hatırlama olasılığı, $t$ son tekrardan beri geçen süre, $S$ ise belleğin dayanıklılığıdır. Bir kartı başarıyla hatırladığımızda $S$ büyür; böylece bir sonraki tekrar daha ileri bir tarihe taşınabilir.</p>

<p>Basit bir planlayıcı, yeni aralığı yaklaşık olarak şöyle hesaplayabilir:</p>

\[I_{yeni}=I_{eski}\times E\times P\]

<p>$I$ tekrar aralığını, $E$ kartın kolaylık katsayısını, $P$ ise kullanıcının verdiği performans puanını temsil eder. Gerçek uygulamalar başarısızlıkları, gecikmiş tekrarları ve öğrenme geçmişini hesaba katan daha gelişmiş modeller kullanır. Dolayısıyla amaç her kartı her gün göstermek değil, <strong>unutmaya yaklaşırken</strong> göstermektir.</p>

<h2 id="üç-uygulama-üç-farklı-karakter">Üç uygulama, üç farklı karakter</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Anki</th>
      <th>Mnemosyne</th>
      <th>Mochi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yaklaşım</td>
      <td>Güçlü planlama ve özelleştirme</td>
      <td>Sade, akademik odaklı tekrar</td>
      <td>Notlar ile kartları birleştirme</td>
    </tr>
    <tr>
      <td>Kullanım hissi</td>
      <td>Ayrıntılı fakat öğrenme eğrisi yüksek</td>
      <td>Geleneksel ve doğrudan</td>
      <td>Modern ve görsel</td>
    </tr>
    <tr>
      <td>Kart yapısı</td>
      <td>Şablonlar, alanlar ve eklentiler</td>
      <td>Soru-cevap merkezli kartlar</td>
      <td>Markdown tabanlı bağlantılı notlar</td>
    </tr>
    <tr>
      <td>Uygun kullanıcı</td>
      <td>Kontrolü seven yoğun öğrenci</td>
      <td>Dikkat dağıtmayan araç arayan kişi</td>
      <td>Not ağı kurmak isteyen kullanıcı</td>
    </tr>
    <tr>
      <td>Öne çıkan yön</td>
      <td>Geniş ekosistem ve gelişmiş zamanlama</td>
      <td>Açık kaynaklı, yalın deneyim</td>
      <td>Kartlar arasında bağlantı kurabilme</td>
    </tr>
  </tbody>
</table>

<h3 id="anki-ayar-panelini-sevenlerin-laboratuvarı">Anki: Ayar panelini sevenlerin laboratuvarı</h3>

<p>Anki; kart şablonları, etiketler, medya desteği ve eklentileriyle oldukça esnektir. Modern sürümlerde FSRS gibi, geçmiş tekrar verilerinden yararlanarak daha verimli aralıklar üretmeyi amaçlayan zamanlama seçenekleri bulunur. Buna karşılık ilk deste hazırlamak, alanlarla şablonların farkını anlamak ve ayarları düzenlemek başlangıçta yorucu olabilir.</p>

<p>Dil öğrenenler, tıp öğrencileri ve binlerce kart yöneten kullanıcılar için güçlü bir seçenektir. Fakat her ayarı değiştirmek zorunda değilsiniz; varsayılanlarla başlayıp gerçek ihtiyaca göre ilerlemek daha sağlıklıdır.</p>

<h3 id="mnemosyne-gösterişsiz-ama-disiplinli">Mnemosyne: Gösterişsiz ama disiplinli</h3>

<p>Adını Yunan mitolojisindeki hafıza tanrıçasından alan Mnemosyne, aralıklı tekrar dünyasının köklü araçlarındandır. Arayüzü modern uygulamalar kadar parlak görünmeyebilir; buna karşın kart oluşturma ve puanlama akışı nettir. Açık kaynak yaklaşımı ve araştırma odaklı geçmişi önemli avantajlarıdır.</p>

<p>“Not sistemi değil, yalnızca düzgün çalışan bir tekrar aracı istiyorum” diyorsanız Mnemosyne mantıklı bir adaydır. Daha küçük eklenti ekosistemi ve sınırlı görsel cilası ise bazı kullanıcıları Anki veya Mochi’ye yöneltebilir.</p>

<h3 id="mochi-not-alırken-kart-üretmek">Mochi: Not alırken kart üretmek</h3>

<p>Mochi, Markdown notları ile flashcard sistemini aynı ortamda buluşturur. Kartlar arasında bağlantı kurabilmek, tek tek gerçekleri ezberlemek yerine kavram ağı oluşturmayı kolaylaştırır. Özellikle yazılım, tarih veya felsefe gibi ilişkisel konularda bu yaklaşım değerlidir.</p>

<p>Ancak zengin bağlantılar kurmak, otomatik olarak iyi öğrenme anlamına gelmez. Kartlar kısa, açık ve tek bir bilgiyi ölçer durumda olmalıdır. Ayrıca çevrim içi özellikler ve ücretlendirme seçenekleri zamanla değişebileceğinden güncel planlar kontrol edilmelidir.</p>

<h2 id="mini-bir-zamanlayıcı-nasıl-çalışır">Mini bir zamanlayıcı nasıl çalışır?</h2>

<p>Aşağıdaki Python kodu, doğru yanıtta aralığı büyüten, yanlış yanıtta kartı ertesi güne döndüren basitleştirilmiş bir modeldir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">sonraki_aralik</span><span class="p">(</span><span class="n">mevcut_gun</span><span class="p">,</span> <span class="n">puan</span><span class="p">,</span> <span class="n">kolaylik</span><span class="o">=</span><span class="mf">2.2</span><span class="p">):</span>
    <span class="c1"># 0-2 başarısız, 3-5 başarılı kabul edilir.
</span>    <span class="k">if</span> <span class="n">puan</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">1</span>

    <span class="n">performans</span> <span class="o">=</span> <span class="mf">0.8</span> <span class="o">+</span> <span class="p">(</span><span class="n">puan</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.2</span>
    <span class="n">yeni_aralik</span> <span class="o">=</span> <span class="n">mevcut_gun</span> <span class="o">*</span> <span class="n">kolaylik</span> <span class="o">*</span> <span class="n">performans</span>
    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">yeni_aralik</span><span class="p">))</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">sonraki_aralik</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>  <span class="c1"># Yaklaşık 15 gün
</span></code></pre></div></div>

<p>Bu örnek öğreticidir; gerçek planlayıcılar çok daha fazla veri kullanır. Yine de temel fikir açıktır: başarı aralığı büyütür, başarısızlık kartı yaklaştırır.</p>

<h2 id="hangisini-seçmeli">Hangisini seçmeli?</h2>

<p>Maksimum özelleştirme ve büyük deste yönetimi için <strong>Anki</strong>, sade ve açık kaynaklı bir çalışma düzeni için <strong>Mnemosyne</strong>, bağlantılı Markdown notlarıyla öğrenmek için <strong>Mochi</strong> öne çıkar. En iyi sistem, en gelişmiş algoritmaya sahip olan değil, her gün açmayı sürdürebildiğiniz sistemdir. Önce 20 kartlık küçük bir deste hazırlayın, bir hafta deneyin ve kararınızı gerçek çalışma alışkanlığınıza göre verin.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="flashcard" /><category term="anki" /><category term="mnemosyne" /><category term="mochi" /><category term="aralıklı tekrar" /><category term="öğrenme" /><summary type="html"><![CDATA[Bir bilgiyi öğrenmek kolay, onu üç ay sonra hatırlamak ise bambaşka bir oyundur. Flashcard uygulamaları bu oyunda beynimize küçük ama düzenli paslar atar. Anki, Mnemosyne ve Mochi aynı temel fikri, yani aralıklı tekrarı, farklı arayüzler ve çalışma modelleriyle uygular. Gelin bu üç aracı karşılaştıralım ve kartların neden doğru zamanda karşımıza çıktığını anlayalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/flashcard-arenasinda-uc-93.png" /><media:content medium="image" url="https://program.sonsuz.us/img/flashcard-arenasinda-uc-93.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Karatsuba Çarpımı: Büyük Sayıları Böl ve Fethet</title><link href="https://program.sonsuz.us/posts/karatsuba-carpimi-buyuk-sayilari-bol-ve-fethet/" rel="alternate" type="text/html" title="Karatsuba Çarpımı: Büyük Sayıları Böl ve Fethet" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/karatsuba-carpimi-buyuk-sayilari-bol-ve-fethet</id><content type="html" xml:base="https://program.sonsuz.us/posts/karatsuba-carpimi-buyuk-sayilari-bol-ve-fethet/"><![CDATA[<p>Bilgisayarınız iki küçük sayıyı göz açıp kapayıncaya kadar çarpabilir. Ancak binlerce veya milyonlarca basamak içeren sayılar söz konusu olduğunda, ilkokulda öğrendiğimiz klasik çarpma yöntemi pahalı hâle gelir. 1960 yılında Anatoly Karatsuba tarafından geliştirilen algoritma, zekice bir cebirsel dönüşüm kullanarak gereken küçük çarpma sayısını azaltır. Böylece büyük tam sayılarla çalışan kriptografi, matematik yazılımları ve bilimsel hesaplama sistemleri önemli ölçüde hızlanır.</p>

<p><img src="/img/karatsuba-carpimi-buyuk-26.svg" alt="karatsuba-carpimi-buyuk-26" /></p>

<p>``</p>

<h2 id="klasik-çarpmanın-maliyeti">Klasik çarpmanın maliyeti</h2>

<p>Her biri $n$ basamaklı iki sayıyı klasik yöntemle çarptığımızı düşünelim. Birinci sayının her basamağı, ikinci sayının bütün basamaklarıyla çarpılır. Yaklaşık olarak $n \times n = n^2$ tek basamaklı çarpma yapılır. Bu nedenle klasik yöntemin zaman karmaşıklığı $O(n^2)$ olur.</p>

<p>Karatsuba ise sayıları iki parçaya ayırır. Tabanı $B$ olan ve yaklaşık $2m$ basamak taşıyan iki sayı şöyle yazılabilir:</p>

\[x = aB^m + b\]

\[y = cB^m + d\]

<p>Normal açılım yapıldığında:</p>

\[xy = acB^{2m} + (ad + bc)B^m + bd\]

<p>Bu ifade doğrudan uygulanırsa $ac$, $ad$, $bc$ ve $bd$ olmak üzere dört çarpma gerekir. Karatsuba’nın numarası tam burada ortaya çıkar: ortadaki terim ayrı ayrı hesaplanmak zorunda değildir.</p>

\[ad + bc = (a+b)(c+d) - ac - bd\]

<p>Böylece yalnızca şu üç çarpım hesaplanır:</p>

<ul>
  <li>$z_2 = ac$</li>
  <li>$z_0 = bd$</li>
  <li>$z_1 = (a+b)(c+d) - z_2 - z_0$</li>
</ul>

<p>Sonuç ise $z_2B^{2m} + z_1B^m + z_0$ biçiminde birleştirilir. Dört çarpma yerine üç çarpma yapmak küçük sayılarda önemsiz görünebilir; fakat işlem her seviyede özyinelemeli tekrarlandığında fark kartopu gibi büyür.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th style="text-align: right">Klasik yöntem</th>
      <th style="text-align: right">Karatsuba</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Alt problem sayısı</td>
      <td style="text-align: right">4</td>
      <td style="text-align: right">3</td>
    </tr>
    <tr>
      <td>Alt problem boyutu</td>
      <td style="text-align: right">$n/2$</td>
      <td style="text-align: right">$n/2$</td>
    </tr>
    <tr>
      <td>Zaman karmaşıklığı</td>
      <td style="text-align: right">$O(n^2)$</td>
      <td style="text-align: right">$O(n^{\log_2 3})$</td>
    </tr>
    <tr>
      <td>Yaklaşık üs</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">1,585</td>
    </tr>
    <tr>
      <td>Küçük sayılardaki ek yük</td>
      <td style="text-align: right">Düşük</td>
      <td style="text-align: right">Daha yüksek</td>
    </tr>
  </tbody>
</table>

<p>Karatsuba’nın bağıntısı $T(n)=3T(n/2)+O(n)$ şeklindedir. Buradan karmaşıklık yaklaşık $O(n^{1.585})$ çıkar. Sayılar büyüdükçe bu üs farkı ciddi bir avantaj sağlar.</p>

<h2 id="python-ile-uygulama">Python ile uygulama</h2>

<p>Aşağıdaki fonksiyon sayıları onluk tabanda böler. Sayılar yeterince küçük olduğunda özyinelemeyi durdurup Python’ın normal çarpımını kullanır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
    <span class="c1"># Küçük değerlerde ek özyineleme maliyetinden kaçın.
</span>    <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">10</span> <span class="ow">or</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span>

    <span class="n">n</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">x</span><span class="p">)),</span> <span class="nf">len</span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">y</span><span class="p">)))</span>
    <span class="n">m</span> <span class="o">=</span> <span class="n">n</span> <span class="o">//</span> <span class="mi">2</span>
    <span class="n">taban</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">**</span> <span class="n">m</span>

    <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nf">divmod</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">taban</span><span class="p">)</span>
    <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="nf">divmod</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">taban</span><span class="p">)</span>

    <span class="n">z2</span> <span class="o">=</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
    <span class="n">z0</span> <span class="o">=</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
    <span class="n">z1</span> <span class="o">=</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">+</span> <span class="n">d</span><span class="p">)</span> <span class="o">-</span> <span class="n">z2</span> <span class="o">-</span> <span class="n">z0</span>

    <span class="k">return</span> <span class="n">z2</span> <span class="o">*</span> <span class="p">(</span><span class="n">taban</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">z1</span> <span class="o">*</span> <span class="n">taban</span> <span class="o">+</span> <span class="n">z0</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">karatsuba</span><span class="p">(</span><span class="mi">12345678</span><span class="p">,</span> <span class="mi">87654321</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">divmod</code>, bir sayının yüksek ve düşük basamaklarını tek adımda ayırır. Üç özyinelemeli çağrı gerekli ara çarpımları üretir; son satır da basamak kaydırmalarını onluk tabanın kuvvetleriyle gerçekleştirir.</p>

<h2 id="her-durumda-daha-mı-hızlı">Her durumda daha mı hızlı?</h2>

<p>Hayır. Özyinelemeli çağrılar, sayıları parçalama ve ara sonuçları toplama işlemleri ek maliyet oluşturur. Bu yüzden pratik kütüphaneler hibrit davranır: küçük sayılarda klasik çarpma, belirli bir basamak eşiğinden sonra Karatsuba kullanılır.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Mantıklı tercih</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Birkaç basamaklı sayılar</td>
      <td>Klasik çarpma</td>
    </tr>
    <tr>
      <td>Yüzlerce veya binlerce basamak</td>
      <td>Karatsuba</td>
    </tr>
    <tr>
      <td>Aşırı büyük sayılar</td>
      <td>Toom-Cook veya FFT tabanlı yöntemler</td>
    </tr>
  </tbody>
</table>

<p>Karatsuba’nın asıl güzelliği, daha güçlü donanım istemeden cebir sayesinde işi azaltmasıdır. Böl ve fethet yaklaşımının yalnızca problemi küçültmek değil, gereksiz hesaplamaları ortadan kaldırmak anlamına da geldiğini gösteren klasik ve hâlâ etkileyici bir algoritmadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="karatsuba" /><category term="algoritma" /><category term="böl-ve-fethet" /><category term="python" /><category term="matematik" /><category term="büyük-sayılar" /><summary type="html"><![CDATA[Bilgisayarınız iki küçük sayıyı göz açıp kapayıncaya kadar çarpabilir. Ancak binlerce veya milyonlarca basamak içeren sayılar söz konusu olduğunda, ilkokulda öğrendiğimiz klasik çarpma yöntemi pahalı hâle gelir. 1960 yılında Anatoly Karatsuba tarafından geliştirilen algoritma, zekice bir cebirsel dönüşüm kullanarak gereken küçük çarpma sayısını azaltır. Böylece büyük tam sayılarla çalışan kriptografi, matematik yazılımları ve bilimsel hesaplama sistemleri önemli ölçüde hızlanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/karatsuba-carpimi-buyuk-26.png" /><media:content medium="image" url="https://program.sonsuz.us/img/karatsuba-carpimi-buyuk-26.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Master Teorem ile Özyinelemeli Karmaşıklık Hesabı</title><link href="https://program.sonsuz.us/posts/master-teorem-ile-ozyinelemeli-karmasiklik-hesabi/" rel="alternate" type="text/html" title="Master Teorem ile Özyinelemeli Karmaşıklık Hesabı" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/master-teorem-ile-ozyinelemeli-karmasiklik-hesabi</id><content type="html" xml:base="https://program.sonsuz.us/posts/master-teorem-ile-ozyinelemeli-karmasiklik-hesabi/"><![CDATA[<p>Böl-fethet algoritmalarında kod birkaç satır görünebilir; fakat çalışma süresini hesaplamak bazen matematiksel bir bilmeceye dönüşür. Master Teorem, belirli biçimdeki özyineleme bağıntılarını uzun uzun açmadan sonuca ulaştıran pratik bir araçtır. Merge Sort, ikili arama ve benzeri algoritmaların karmaşıklığını bu yöntemle hızlıca sınıflandırabiliriz.
``</p>
<h2 id="temel-fikir-problem-nasıl-parçalanıyor">Temel fikir: Problem nasıl parçalanıyor?</h2>

<p>Bir böl-fethet algoritması genellikle üç adım uygular: problemi alt problemlere böler, bunları özyinelemeli biçimde çözer ve sonuçları birleştirir. Bu sürecin çalışma süresi şu bağıntıyla ifade edilir:</p>

\[T(n) = aT\left(\frac{n}{b}\right) + f(n)\]

<p>Buradaki değişkenlerin görevleri şöyledir:</p>

<table>
  <thead>
    <tr>
      <th>Sembol</th>
      <th>Anlamı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$a$</td>
      <td>Oluşturulan alt problem sayısı</td>
      <td>Merge Sort için 2</td>
    </tr>
    <tr>
      <td>$b$</td>
      <td>Problem boyutunun küçülme oranı</td>
      <td>Boyut yarıya iniyorsa 2</td>
    </tr>
    <tr>
      <td>$f(n)$</td>
      <td>Bölme ve birleştirme gibi özyineleme dışı işler</td>
      <td>Merge Sort için $n$</td>
    </tr>
    <tr>
      <td>$T(n)$</td>
      <td>Toplam çalışma süresi</td>
      <td>Aradığımız sonuç</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/master-teorem-ile-29.svg" alt="master-teorem-ile-29" /></p>

<p>Teoremin merkezindeki karşılaştırma, $f(n)$ ile $n^{\log_b a}$ arasındadır. İkinci ifade, özyineleme ağacındaki alt problemlerin ürettiği temel iş yükünü temsil eder. Kısacası şu soruyu sorarız: Maliyeti alt problemler mi, her seviyede yapılan ek iş mi, yoksa ikisi birlikte mi büyütüyor?</p>

<h2 id="master-teoremin-üç-durumu">Master Teorem’in üç durumu</h2>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Karşılaştırma</th>
      <th>Sonuç</th>
      <th>Baskın bölüm</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>$f(n)=O(n^{\log_b a-\varepsilon})$</td>
      <td>$\Theta(n^{\log_b a})$</td>
      <td>Alt problemler</td>
    </tr>
    <tr>
      <td>2</td>
      <td>$f(n)=\Theta(n^{\log_b a}\log^k n)$</td>
      <td>$\Theta(n^{\log_b a}\log^{k+1}n)$</td>
      <td>Dengeli</td>
    </tr>
    <tr>
      <td>3</td>
      <td>$f(n)=\Omega(n^{\log_b a+\varepsilon})$</td>
      <td>$\Theta(f(n))$</td>
      <td>Ek iş</td>
    </tr>
  </tbody>
</table>

<p>Buradaki $\varepsilon&gt;0$, fonksiyonlar arasında polinom düzeyinde bir fark bulunduğunu belirtir. Üçüncü durumda ayrıca düzenlilik koşulu aranır: Yeterince büyük $n$ değerleri için $af(n/b)\leq cf(n)$ ve $c&lt;1$ olmalıdır.</p>

<h2 id="örnek-merge-sort">Örnek: Merge Sort</h2>

<p>Merge Sort diziyi iki eşit parçaya ayırır, iki parçayı ayrı ayrı sıralar ve doğrusal zamanda birleştirir:</p>

\[T(n)=2T(n/2)+n\]

<p>Buradan $a=2$, $b=2$ ve $f(n)=n$ elde edilir. Kritik terim:</p>

\[n^{\log_2 2}=n\]

<p>$f(n)$ ile kritik terim eşit büyüdüğü için ikinci durum geçerlidir. Sonuç:</p>

\[T(n)=\Theta(n\log n)\]

<p>Aşağıdaki Python kodu bu yapının algoritmadaki karşılığını gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">items</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">items</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">items</span>

    <span class="n">middle</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">items</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span>
    <span class="n">left</span> <span class="o">=</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">items</span><span class="p">[:</span><span class="n">middle</span><span class="p">])</span>
    <span class="n">right</span> <span class="o">=</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">items</span><span class="p">[</span><span class="n">middle</span><span class="p">:])</span>
    <span class="k">return</span> <span class="nf">merge</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span>
</code></pre></div></div>

<p>İki özyinelemeli çağrı $2T(n/2)$ terimini, <code class="language-plaintext highlighter-rouge">merge</code> işlemi ise doğrusal $n$ maliyetini oluşturur.</p>

<h2 id="i̇ki-kısa-karşılaştırma">İki kısa karşılaştırma</h2>

<p>İkili aramada yalnızca bir yarı seçilir:</p>

\[T(n)=T(n/2)+1\]

<p>$a=1$, $b=2$ ve $f(n)=1$ olduğundan $n^{\log_2 1}=1$ bulunur. İkinci durum sonucunda karmaşıklık $\Theta(\log n)$ olur.</p>

<p>Şu bağıntıda ise birleştirme işi daha pahalıdır:</p>

\[T(n)=2T(n/2)+n^2\]

<p>Kritik terim $n$ iken $f(n)=n^2$ daha hızlı büyür. Düzenlilik koşulu da sağlandığından üçüncü durum uygulanır ve sonuç $\Theta(n^2)$ çıkar.</p>

<h2 id="ne-zaman-kullanılamaz">Ne zaman kullanılamaz?</h2>

<p>Master Teorem her özyineleme bağıntısına uymaz. Alt problemlerin eşit boyutta olmadığı $T(n)=T(n/3)+T(2n/3)+n$ veya boyutun sabit miktarda azaldığı $T(n)=T(n-1)+n$ biçimleri doğrudan kapsam dışındadır. Böyle durumlarda özyineleme ağacı, yerine koyma yöntemi ya da Akra–Bazzi teoremi tercih edilebilir.</p>

<p>Pratik reçete basittir: Önce $a$, $b$ ve $f(n)$ değerlerini çıkarın; ardından $n^{\log_b a}$ terimini hesaplayın ve $f(n)$ ile karşılaştırın. Üç durumdan doğru olanı seçtiğinizde, karmaşıklık hesabı korkutucu bir denklem olmaktan çıkıp kısa bir eşleştirme oyununa dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="master teorem" /><category term="algoritma" /><category term="karmaşıklık" /><category term="özyineleme" /><category term="böl ve fethet" /><summary type="html"><![CDATA[Böl-fethet algoritmalarında kod birkaç satır görünebilir; fakat çalışma süresini hesaplamak bazen matematiksel bir bilmeceye dönüşür. Master Teorem, belirli biçimdeki özyineleme bağıntılarını uzun uzun açmadan sonuca ulaştıran pratik bir araçtır. Merge Sort, ikili arama ve benzeri algoritmaların karmaşıklığını bu yöntemle hızlıca sınıflandırabiliriz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/master-teorem-ile-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/master-teorem-ile-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rastgele Soru Üretme Sistemleri: H5P, Moodle Question Bank ve Özel Algoritmalar</title><link href="https://program.sonsuz.us/posts/rastgele-soru-uretme-sistemleri-h5p-moodle-question-bank-ve-ozel-algoritmalar/" rel="alternate" type="text/html" title="Rastgele Soru Üretme Sistemleri: H5P, Moodle Question Bank ve Özel Algoritmalar" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/rastgele-soru-uretme-sistemleri-h5p-moodle-question-bank-ve-ozel-algoritmalar</id><content type="html" xml:base="https://program.sonsuz.us/posts/rastgele-soru-uretme-sistemleri-h5p-moodle-question-bank-ve-ozel-algoritmalar/"><![CDATA[<p>Her öğrenciye farklı görünen ama aynı kazanımı ölçen bir sınav hazırlamak, eğitim teknolojilerinin en eğlenceli problemlerinden biridir. Rastgele soru üretme sistemleri; hazır bir havuzdan soru seçebilir, seçeneklerin sırasını değiştirebilir veya matematiksel parametrelerden yepyeni sorular oluşturabilir. H5P hızlı etkileşimler, Moodle Question Bank kapsamlı sınav yönetimi, özel algoritmalar ise neredeyse sınırsız üretim özgürlüğü sunar.</p>

<p>``</p>

<h2 id="rastgelelik-gerçekte-ne-anlama-gelir">Rastgelelik gerçekte ne anlama gelir?</h2>

<p>Bir sistemde $N$ adet soru varsa ve sınav için bunlardan $k$ tanesi eşit olasılıkla seçiliyorsa, belirli bir sorunun sınava girme olasılığı yaklaşık olarak</p>

\[P(\text{sorunun seçilmesi}) = \frac{k}{N}\]

<p>olur. Örneğin 100 soruluk havuzdan 20 soru seçildiğinde her sorunun sınavda görünme olasılığı $0.20$ seviyesindedir. Ancak gerçek kalite yalnızca rastgele seçimden gelmez. Zorluk, konu dağılımı ve öğrenme çıktıları da dengelenmelidir.</p>

<p>Daha kontrollü bir modelde sınav; 4 kolay, 4 orta ve 2 zor sorudan oluşturulabilir. Buna <strong>katmanlı rastgele seçim</strong> denir. Böylece bir öğrenci tamamen kolay, başka biri tamamen zor bir sınavla karşılaşmaz.</p>

<h2 id="üç-yaklaşımın-karşılaştırması">Üç yaklaşımın karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
      <th>En uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>H5P</td>
      <td>Görsel ve etkileşimli içerik</td>
      <td>Gelişmiş soru üretimi sınırlı</td>
      <td>Ders içi alıştırmalar</td>
    </tr>
    <tr>
      <td>Moodle Question Bank</td>
      <td>Kategori, etiket ve sınav analizi</td>
      <td>Yapılandırma zaman alabilir</td>
      <td>Ölçme ve değerlendirme</td>
    </tr>
    <tr>
      <td>Özel algoritma</td>
      <td>Parametrik ve sınırsız üretim</td>
      <td>Yazılım geliştirme gerektirir</td>
      <td>Uyarlanabilir sınavlar</td>
    </tr>
  </tbody>
</table>

<h2 id="h5p-ile-hızlı-etkileşim">H5P ile hızlı etkileşim</h2>

<p>H5P; Multiple Choice, Fill in the Blanks ve Question Set gibi içerik türleriyle çalışır. Seçenek sıralaması karıştırılabilir ve bir soru setinden belirli sayıda içerik gösterilebilir. En büyük avantajı, öğrencinin anında geri bildirim almasıdır.</p>

<p>Bununla birlikte H5P çoğunlukla önceden hazırlanmış içerikleri rastgele sunar. Örneğin her seferinde farklı katsayılara sahip bir denklem oluşturmak istiyorsanız ek JavaScript geliştirmesi veya harici bir servis gerekebilir.</p>

<h2 id="moodle-question-bank-ile-kontrollü-seçim">Moodle Question Bank ile kontrollü seçim</h2>

<p>Moodle soruları kategoriler altında saklayabilir. “Cebir/Kolay” ve “Cebir/Zor” gibi kategoriler oluşturup sınava her kategoriden rastgele soru eklemek mümkündür. Ayrıca <strong>Calculated Question</strong> türü, değişkenleri belirli aralıklardan seçerek parametrik sorular üretir.</p>

<p>Örneğin $a$ ve $b$ rastgele seçildiğinde öğrenciye $a+b$ sorulabilir. $a \in [2,10]$ ve $b \in [5,20]$ tanımlanırsa sistem çok sayıda varyasyon oluşturur. Tolerans, birim ve ondalık hassasiyeti gibi ayrıntılar da Moodle üzerinden yönetilebilir.</p>

<h2 id="özel-algoritma-nasıl-kurulur">Özel algoritma nasıl kurulur?</h2>

<p>Basit bir JavaScript fonksiyonu, iki katsayı seçip birinci dereceden denklem üretebilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">denklemUret</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">9</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">a</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">b</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">20</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>

  <span class="k">return</span> <span class="p">{</span>
    <span class="na">soru</span><span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">a</span><span class="p">}</span><span class="s2">x + </span><span class="p">${</span><span class="nx">b</span><span class="p">}</span><span class="s2"> = </span><span class="p">${</span><span class="nx">a</span> <span class="o">*</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">b</span><span class="p">}</span><span class="s2"> denkleminde x kaçtır?`</span><span class="p">,</span>
    <span class="na">cevap</span><span class="p">:</span> <span class="nx">x</span>
  <span class="p">};</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">denklemUret</span><span class="p">());</span>
</code></pre></div></div>

<p>Kod önce doğru cevabı belirler, ardından bu cevaba uygun denklem kurar. Bu yaklaşım önemlidir; rastgele bir soru üretip sonradan çözmeye çalışmak yerine, <strong>cevaptan soruya doğru üretim</strong> hatalı veya çözümsüz örneklerin önüne geçer.</p>

<h2 id="adil-ve-güvenilir-bir-sistem-için">Adil ve güvenilir bir sistem için</h2>

<p>Gerçek sınavlarda sözde rastgele sayı üreteci için bir <code class="language-plaintext highlighter-rouge">seed</code> saklamak yararlıdır. Aynı seed kullanıldığında aynı sınav yeniden oluşturulabilir; böylece öğrenci itirazları incelenebilir. Ayrıca algoritma şu kontrollerden geçmelidir:</p>

<ul>
  <li>Aynı sorunun sınav içinde tekrarlanmaması</li>
  <li>Yanlış seçeneklerin doğru cevaptan farklı olması</li>
  <li>Zorluk dağılımının korunması</li>
  <li>Üretilen değerlerin anlamlı aralıklarda kalması</li>
  <li>Soru sürümlerinin ve seed bilgilerinin kaydedilmesi</li>
</ul>

<p>Hızlı ve görsel etkinliklerde H5P, kurumsal sınavlarda Moodle, benzersiz ve uyarlanabilir senaryolarda ise özel algoritmalar öne çıkar. En güçlü çözüm çoğu zaman bunları yarıştırmak değil, H5P’nin etkileşimini Moodle’ın soru bankası ve özel bir üretim servisinin esnekliğiyle birleştirmektir.</p>

<p><img src="/img/rastgele-soru-uretme-18.svg" alt="rastgele-soru-uretme-18" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="h5p" /><category term="moodle" /><category term="soru-bankası" /><category term="algoritma" /><category term="eğitim-teknolojileri" /><category term="rastgeleleştirme" /><summary type="html"><![CDATA[Her öğrenciye farklı görünen ama aynı kazanımı ölçen bir sınav hazırlamak, eğitim teknolojilerinin en eğlenceli problemlerinden biridir. Rastgele soru üretme sistemleri; hazır bir havuzdan soru seçebilir, seçeneklerin sırasını değiştirebilir veya matematiksel parametrelerden yepyeni sorular oluşturabilir. H5P hızlı etkileşimler, Moodle Question Bank kapsamlı sınav yönetimi, özel algoritmalar ise neredeyse sınırsız üretim özgürlüğü sunar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/rastgele-soru-uretme-18.png" /><media:content medium="image" url="https://program.sonsuz.us/img/rastgele-soru-uretme-18.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Roma Rakamlarıyla Aritmetik: Konumsuz Sayılar Nasıl Toplanır ve Çarpılır?</title><link href="https://program.sonsuz.us/posts/roma-rakamlariyla-aritmetik-konumsuz-sayilar-nasil-toplanir-ve-carpilir/" rel="alternate" type="text/html" title="Roma Rakamlarıyla Aritmetik: Konumsuz Sayılar Nasıl Toplanır ve Çarpılır?" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/roma-rakamlariyla-aritmetik-konumsuz-sayilar-nasil-toplanir-ve-carpilir</id><content type="html" xml:base="https://program.sonsuz.us/posts/roma-rakamlariyla-aritmetik-konumsuz-sayilar-nasil-toplanir-ve-carpilir/"><![CDATA[<p>Roma rakamları denince çoğumuzun aklına saat kadranları, tarihî yapılar ve film jeneriklerindeki gizemli tarihler gelir. Oysa <code class="language-plaintext highlighter-rouge">I</code>, <code class="language-plaintext highlighter-rouge">V</code>, <code class="language-plaintext highlighter-rouge">X</code>, <code class="language-plaintext highlighter-rouge">L</code>, <code class="language-plaintext highlighter-rouge">C</code>, <code class="language-plaintext highlighter-rouge">D</code> ve <code class="language-plaintext highlighter-rouge">M</code> sembolleriyle aritmetik yapmak da mümkündür. Üstelik bunun için sayıları mutlaka onluk sisteme çevirmek gerekmez. Biraz sembol birleştirme, biraz sadeleştirme ve bolca düzenleme yeterlidir.</p>

<p>``</p>

<h2 id="pozisyonel-olmamak-ne-demektir">Pozisyonel Olmamak Ne Demektir?</h2>

<p>Onluk sistem pozisyoneldir: <code class="language-plaintext highlighter-rouge">325</code> sayısındaki <code class="language-plaintext highlighter-rouge">3</code>, yüzler basamağında olduğu için $3 \times 100$ değerindedir. Roma sisteminde ise sembollerin temel değerleri konumlarından bağımsızdır.</p>

<table>
  <thead>
    <tr>
      <th>Roma sembolü</th>
      <th style="text-align: right">Değeri</th>
      <th>Beşli karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>I</td>
      <td style="text-align: right">1</td>
      <td>V = 5I</td>
    </tr>
    <tr>
      <td>X</td>
      <td style="text-align: right">10</td>
      <td>L = 5X</td>
    </tr>
    <tr>
      <td>C</td>
      <td style="text-align: right">100</td>
      <td>D = 5C</td>
    </tr>
    <tr>
      <td>M</td>
      <td style="text-align: right">1000</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/roma-rakamlariyla-aritmetik-33.svg" alt="roma-rakamlariyla-aritmetik-33" /></p>

<p>Bir Roma dizisinin değeri, çıkarma gösterimi yok sayıldığında sembol değerlerinin toplamıdır:</p>

\[V(s)=\sum_{i=1}^{n} V(s_i)\]

<p>Örneğin <code class="language-plaintext highlighter-rouge">VIII</code>, $5+1+1+1=8$ eder. Ancak <code class="language-plaintext highlighter-rouge">IV</code> gibi çıkarımlı yazımlarda küçük sembol büyük sembolden önce gelirse çıkarılır: $5-1=4$. Aritmetik algoritmalarında bu istisnayı azaltmak için önce genişletilmiş toplamsal biçim kullanmak oldukça pratiktir. Böylece <code class="language-plaintext highlighter-rouge">IV</code>, geçici olarak <code class="language-plaintext highlighter-rouge">IIII</code>; <code class="language-plaintext highlighter-rouge">IX</code> ise <code class="language-plaintext highlighter-rouge">VIIII</code> biçiminde düşünülebilir.</p>

<h2 id="roma-rakamlarıyla-toplama">Roma Rakamlarıyla Toplama</h2>

<p><code class="language-plaintext highlighter-rouge">XXVII + XVIII</code> işlemini ele alalım. Önce sembolleri toplamsal biçimde yan yana getiririz:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>XXVII + XVIII
= XXVIIXVIII
= XXXVVIIII
</code></pre></div></div>

<p>Ardından aynı sembolleri gruplayıp dönüşüm kurallarını uygularız:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">IIIII → V</code></li>
  <li><code class="language-plaintext highlighter-rouge">VV → X</code></li>
  <li><code class="language-plaintext highlighter-rouge">XXXXX → L</code></li>
  <li><code class="language-plaintext highlighter-rouge">LL → C</code></li>
  <li><code class="language-plaintext highlighter-rouge">CCCCC → D</code></li>
  <li><code class="language-plaintext highlighter-rouge">DD → M</code></li>
</ul>

<p><code class="language-plaintext highlighter-rouge">XXXVVIIII</code> ifadesinde iki <code class="language-plaintext highlighter-rouge">V</code>, bir <code class="language-plaintext highlighter-rouge">X</code> olur. Sonuç <code class="language-plaintext highlighter-rouge">XXXXV</code>, yani standart yazımla <code class="language-plaintext highlighter-rouge">XLV</code> olur. Gerçekten de $27+18=45$.</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Gösterim</th>
      <th>Amaç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Birleştirme</td>
      <td><code class="language-plaintext highlighter-rouge">XXVIIXVIII</code></td>
      <td>Sembolleri aynı havuzda toplamak</td>
    </tr>
    <tr>
      <td>Sıralama</td>
      <td><code class="language-plaintext highlighter-rouge">XXXVVIIII</code></td>
      <td>Eş sembolleri yan yana getirmek</td>
    </tr>
    <tr>
      <td>Sadeleştirme</td>
      <td><code class="language-plaintext highlighter-rouge">XXXXV</code></td>
      <td>Grupları büyük sembollere çevirmek</td>
    </tr>
    <tr>
      <td>Normalleştirme</td>
      <td><code class="language-plaintext highlighter-rouge">XLV</code></td>
      <td>Standart çıkarımlı yazımı üretmek</td>
    </tr>
  </tbody>
</table>

<p>Bu yaklaşım, elde taşımalı toplamanın Roma usulü kuzenidir. Tek fark, basamaklar yerine sembol paketleri taşınmasıdır.</p>

<h2 id="çarpma-tekrarlı-toplamadan-dağıtmaya">Çarpma: Tekrarlı Toplamadan Dağıtmaya</h2>

<p>En basit yöntem, çarpılan sayıyı tekrar tekrar toplamaktır. Örneğin <code class="language-plaintext highlighter-rouge">XII × III</code>, üç tane <code class="language-plaintext highlighter-rouge">XII</code> sembol grubunun birleşimidir:</p>

\[XII \times III = XII + XII + XII = XXXIIIIII\]

<p>Altı <code class="language-plaintext highlighter-rouge">I</code>, <code class="language-plaintext highlighter-rouge">VI</code> olarak sadeleşir ve sonuç <code class="language-plaintext highlighter-rouge">XXXVI</code> olur. Yani $12 \times 3=36$.</p>

<p>Büyük sayılarda tekrarlı toplama verimsizdir. Bunun yerine çarpanı Roma sembollerinin değerlerine ayırabiliriz. <code class="language-plaintext highlighter-rouge">XIV × VI</code> işlemi, dağılım özelliğiyle şöyle ele alınır:</p>

\[14 \times 6 = 14 \times (5+1)\]

<p>Roma mantığında bu, <code class="language-plaintext highlighter-rouge">XIV</code> sayısının beş katı ile bir kopyasını birleştirmek demektir. Sonuç $70+14=84$, yani <code class="language-plaintext highlighter-rouge">LXXXIV</code> olur.</p>

<h2 id="python-ile-sembol-tabanlı-toplama">Python ile Sembol Tabanlı Toplama</h2>

<p>Aşağıdaki kod, çıkarımlı biçimi önce toplamsal biçime genişletir; sembolleri sayar ve ardından değeri standart Roma gösterimine dönüştürür:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">values</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">I</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="sh">"</span><span class="s">V</span><span class="sh">"</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="sh">"</span><span class="s">X</span><span class="sh">"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="sh">"</span><span class="s">L</span><span class="sh">"</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">C</span><span class="sh">"</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span> <span class="sh">"</span><span class="s">D</span><span class="sh">"</span><span class="p">:</span> <span class="mi">500</span><span class="p">,</span> <span class="sh">"</span><span class="s">M</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1000</span>
<span class="p">}</span>

<span class="n">expansions</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">IV</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">IIII</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">IX</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">VIIII</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">XL</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">XXXX</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">XC</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">LXXXX</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">CD</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">CCCC</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">CM</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">DCCCC</span><span class="sh">"</span>
<span class="p">}</span>

<span class="k">def</span> <span class="nf">expand</span><span class="p">(</span><span class="n">roman</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">short</span><span class="p">,</span> <span class="n">long_form</span> <span class="ow">in</span> <span class="n">expansions</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
        <span class="n">roman</span> <span class="o">=</span> <span class="n">roman</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="n">short</span><span class="p">,</span> <span class="n">long_form</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">roman</span>

<span class="k">def</span> <span class="nf">roman_add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="n">pool</span> <span class="o">=</span> <span class="nf">expand</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="nf">expand</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
    <span class="n">total</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">values</span><span class="p">[</span><span class="n">symbol</span><span class="p">]</span> <span class="k">for</span> <span class="n">symbol</span> <span class="ow">in</span> <span class="n">pool</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">to_roman</span><span class="p">(</span><span class="n">total</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">to_roman</span><span class="p">(</span><span class="n">number</span><span class="p">):</span>
    <span class="n">table</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="sh">"</span><span class="s">M</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">900</span><span class="p">,</span> <span class="sh">"</span><span class="s">CM</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="sh">"</span><span class="s">D</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="sh">"</span><span class="s">CD</span><span class="sh">"</span><span class="p">),</span>
        <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="sh">"</span><span class="s">C</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">90</span><span class="p">,</span> <span class="sh">"</span><span class="s">XC</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="sh">"</span><span class="s">L</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">40</span><span class="p">,</span> <span class="sh">"</span><span class="s">XL</span><span class="sh">"</span><span class="p">),</span>
        <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="sh">"</span><span class="s">X</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="sh">"</span><span class="s">IX</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="sh">"</span><span class="s">V</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="sh">"</span><span class="s">IV</span><span class="sh">"</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="sh">"</span><span class="s">I</span><span class="sh">"</span><span class="p">)</span>
    <span class="p">]</span>
    <span class="n">result</span> <span class="o">=</span> <span class="sh">""</span>
    <span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">symbol</span> <span class="ow">in</span> <span class="n">table</span><span class="p">:</span>
        <span class="n">count</span><span class="p">,</span> <span class="n">number</span> <span class="o">=</span> <span class="nf">divmod</span><span class="p">(</span><span class="n">number</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
        <span class="n">result</span> <span class="o">+=</span> <span class="n">symbol</span> <span class="o">*</span> <span class="n">count</span>
    <span class="k">return</span> <span class="n">result</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">roman_add</span><span class="p">(</span><span class="sh">"</span><span class="s">XXVII</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">XVIII</span><span class="sh">"</span><span class="p">))</span>  <span class="c1"># XLV
</span></code></pre></div></div>

<p>Roma aritmetiği, bilgisayarların kullandığı modern sayı sistemleri kadar verimli değildir; sıfır ve basamak değeri bulunmaması işleri zorlaştırır. Yine de bu algoritmalar önemli bir fikri gösterir: Aritmetik, yalnızca rakamların biçimine değil, temsil kurallarına dayanır. Kuralları doğru tanımladığınızda, antik bir saat kadranı bile küçük bir hesap makinesine dönüşebilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="roma rakamları" /><category term="algoritma" /><category term="aritmetik" /><category term="sayı sistemleri" /><category term="python" /><summary type="html"><![CDATA[Roma rakamları denince çoğumuzun aklına saat kadranları, tarihî yapılar ve film jeneriklerindeki gizemli tarihler gelir. Oysa I, V, X, L, C, D ve M sembolleriyle aritmetik yapmak da mümkündür. Üstelik bunun için sayıları mutlaka onluk sisteme çevirmek gerekmez. Biraz sembol birleştirme, biraz sadeleştirme ve bolca düzenleme yeterlidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/roma-rakamlariyla-aritmetik-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/roma-rakamlariyla-aritmetik-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Zekâ Soruları Platformu: H5P, Moodle ve Özel Soru Bankasıyla Akıllı Bir Sistem Kurmak</title><link href="https://program.sonsuz.us/posts/zeka-sorulari-platformu-h5p-moodle-ve-ozel-soru-bankasiyla-akilli-bir-sistem-kurmak/" rel="alternate" type="text/html" title="Zekâ Soruları Platformu: H5P, Moodle ve Özel Soru Bankasıyla Akıllı Bir Sistem Kurmak" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/zeka-sorulari-platformu-h5p-moodle-ve-ozel-soru-bankasiyla-akilli-bir-sistem-kurmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/zeka-sorulari-platformu-h5p-moodle-ve-ozel-soru-bankasiyla-akilli-bir-sistem-kurmak/"><![CDATA[<p>Zekâ soruları yalnızca “Doğru cevap hangisi?” demekten ibaret değildir; süre yönetimi, ipucu kullanımı, zorluk dengesi ve çözüm yolunun açıklanması da deneyimin parçasıdır. H5P’nin etkileşimli içeriklerini, Moodle’ın öğrenme yönetimi yeteneklerini ve özel bir soru bankasının esnekliğini birleştirerek hem eğlenceli hem de ölçülebilir bir zekâ soruları platformu geliştirebiliriz.</p>

<p>``</p>

<h2 id="sistemin-temel-mantığı">Sistemin temel mantığı</h2>

<p>Platformu üç katmanlı düşünmek işleri kolaylaştırır. H5P, sorunun kullanıcıya nasıl sunulacağını belirler. Moodle; kullanıcı, ders, yetki, not ve raporlama süreçlerini yönetir. Özel soru bankası ise soruların kategorilerini, zorluk seviyelerini, sürümlerini ve istatistiklerini saklar.</p>

<p>Bir sorunun zorluk değeri yalnızca geliştiricinin tahminiyle belirlenmemelidir. Kullanıcıların başarı oranından yararlanılabilir. Bir soruyu $N$ kişi çözmüş ve $D$ kişi doğru cevaplamışsa kolaylık indeksi şöyle hesaplanır:</p>

\[p = \frac{D}{N}\]

<p>$p$ değeri 1’e yaklaştıkça soru kolaylaşır. Zorluk puanını $z = 1-p$ olarak tanımlarsak yüksek değerler daha zor soruları temsil eder. Örneğin 100 kişiden 25’i doğru cevap verdiyse $p=0.25$ ve $z=0.75$ olur.</p>

<h2 id="hangi-bileşen-ne-yapmalı">Hangi bileşen ne yapmalı?</h2>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Güçlü tarafı</th>
      <th>Sınırlaması</th>
      <th>Önerilen rol</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>H5P</td>
      <td>Etkileşimli ve görsel soru tipleri</td>
      <td>Karmaşık veri analizinde sınırlı</td>
      <td>Soru arayüzü ve geri bildirim</td>
    </tr>
    <tr>
      <td>Moodle</td>
      <td>Kullanıcı, ders, not ve yetki yönetimi</td>
      <td>Özel oyun mekanikleri ek geliştirme ister</td>
      <td>Ana platform ve raporlama</td>
    </tr>
    <tr>
      <td>Özel soru bankası</td>
      <td>Tam esneklik ve gelişmiş filtreleme</td>
      <td>Bakım ve güvenlik sorumluluğu getirir</td>
      <td>Merkezi içerik ve istatistik servisi</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/zeka-sorulari-platformu-27.svg" alt="zeka-sorulari-platformu-27" /></p>

<p>H5P içeriği Moodle içine eklentiyle yerleştirilebilir. Ancak sorular farklı uygulamalarda da kullanılacaksa içerikleri yalnızca H5P dosyalarında tutmak yerine merkezi bir API üzerinden sunmak daha sağlıklıdır. Böylece mobil uygulama, web sitesi ve Moodle aynı kaynaktan beslenir.</p>

<h2 id="örnek-soru-veri-modeli">Örnek soru veri modeli</h2>

<p>Aşağıdaki JavaScript nesnesi, çoktan seçmeli bir mantık sorusunun sadeleştirilmiş veri yapısını gösterir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">question</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">id</span><span class="p">:</span> <span class="dl">"</span><span class="s2">logic-1042</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">multiple-choice</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">category</span><span class="p">:</span> <span class="dl">"</span><span class="s2">örüntü</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">difficulty</span><span class="p">:</span> <span class="mf">0.65</span><span class="p">,</span>
  <span class="na">prompt</span><span class="p">:</span> <span class="dl">"</span><span class="s2">2, 6, 12, 20 dizisindeki sonraki sayı nedir?</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">options</span><span class="p">:</span> <span class="p">[</span><span class="mi">28</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">36</span><span class="p">],</span>
  <span class="na">correctIndex</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="na">explanation</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Terimler n × (n + 1) düzenini izler.</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">timeLimit</span><span class="p">:</span> <span class="mi">45</span><span class="p">,</span>
  <span class="na">tags</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">matematik</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">örüntü</span><span class="dl">"</span><span class="p">]</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Bu modelde <code class="language-plaintext highlighter-rouge">difficulty</code> uyarlanabilir test üretmek, <code class="language-plaintext highlighter-rouge">explanation</code> öğretici geri bildirim göstermek, <code class="language-plaintext highlighter-rouge">timeLimit</code> ise süreye dayalı puanlama yapmak için kullanılır. API, bu veriyi H5P’ye uygun biçime dönüştürebilir veya doğrudan özel arayüzde gösterebilir.</p>

<h2 id="puanlama-ve-oyunlaştırma">Puanlama ve oyunlaştırma</h2>

<p>Sadece doğru cevaba puan vermek, rastgele tahminleri ödüllendirebilir. Süreyi ve ipucu kullanımını hesaba katan bir formül daha dengelidir:</p>

\[P = B \times d \times \max(0.4, 1-\frac{t}{T}) - 10h\]

<p>Burada $B$ temel puan, $d$ zorluk çarpanı, $t$ harcanan süre, $T$ süre sınırı ve $h$ kullanılan ipucu sayısıdır. <code class="language-plaintext highlighter-rouge">max</code> bölümü, doğru fakat yavaş çözümlerin tamamen puansız kalmasını önler. Rozetler, günlük seriler ve kategori bazlı seviyeler de motivasyonu artırabilir; fakat liderlik tablosu zorunlu olmamalıdır.</p>

<h2 id="uygulama-yol-haritası">Uygulama yol haritası</h2>

<p>İlk sürümde Moodle kurulumu, H5P eklentisi, kullanıcı girişi ve temel soru API’si hazırlanmalıdır. İkinci aşamada soru editörü, sürümleme, ayrıntılı çözüm açıklamaları ve zorluk analizi eklenebilir. Son aşamada uyarlanabilir sınav motoru devreye girer: Kullanıcı doğru cevapladıkça daha zor, zorlandıkça daha öğretici sorular seçilir.</p>

<p>Ayrıca soru metinleri kullanıcı girdisi içeriyorsa XSS filtreleri uygulanmalı, API erişimi yetkilendirilmeli ve deneme kayıtları kişisel verilerden ayrıştırılmalıdır. Böylece platform, “birkaç bilmece yayınlayan site” olmaktan çıkıp ölçülebilir, genişletilebilir ve gerçekten öğretici bir öğrenme ekosistemine dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="h5p" /><category term="moodle" /><category term="soru-bankası" /><category term="eğitim-teknolojileri" /><category term="javascript" /><category term="oyunlaştırma" /><summary type="html"><![CDATA[Zekâ soruları yalnızca “Doğru cevap hangisi?” demekten ibaret değildir; süre yönetimi, ipucu kullanımı, zorluk dengesi ve çözüm yolunun açıklanması da deneyimin parçasıdır. H5P’nin etkileşimli içeriklerini, Moodle’ın öğrenme yönetimi yeteneklerini ve özel bir soru bankasının esnekliğini birleştirerek hem eğlenceli hem de ölçülebilir bir zekâ soruları platformu geliştirebiliriz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/zeka-sorulari-platformu-27.png" /><media:content medium="image" url="https://program.sonsuz.us/img/zeka-sorulari-platformu-27.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>