<?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-12T06:05:38+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">Altın Oran: Doğanın, Sanatın ve Mimarinin Matematiksel Ritmi</title><link href="https://program.sonsuz.us/posts/altin-oran-doganin-sanatin-ve-mimarinin-matematiksel-ritmi/" rel="alternate" type="text/html" title="Altın Oran: Doğanın, Sanatın ve Mimarinin Matematiksel Ritmi" /><published>2026-10-12T00:00:00+00:00</published><updated>2026-10-12T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/altin-oran-doganin-sanatin-ve-mimarinin-matematiksel-ritmi</id><content type="html" xml:base="https://program.sonsuz.us/posts/altin-oran-doganin-sanatin-ve-mimarinin-matematiksel-ritmi/"><![CDATA[<p><img src="/img/altin-oran-doganin-52.svg" alt="altin-oran-doganin-52" /></p>

<p>Bir ayçiçeğinin merkezine, çam kozalağının pullarına veya yüzyıllardır hayranlık uyandıran bir tabloya baktığımızda benzer bir düzen hissedebiliriz. Bu düzenin arkasındaki en ünlü matematiksel adaylardan biri altın orandır. Yaklaşık $1.618$ değerindeki bu sayı; geometriyi, Fibonacci dizisini ve estetik tartışmalarını aynı masada buluşturan büyüleyici bir köprüdür.</p>

<p>``</p>

<h2 id="altın-oran-nedir">Altın oran nedir?</h2>

<p>Bir doğru parçasını uzun ve kısa olmak üzere iki parçaya ayıralım. Bütün uzunluğun uzun parçaya oranı, uzun parçanın kısa parçaya oranına eşitse altın oran ortaya çıkar. Uzun parça $a$, kısa parça $b$ olmak üzere:</p>

\[(a+b)/a = a/b = φ\]

<p>Bu eşitlik çözüldüğünde pozitif kök şöyledir:</p>

\[φ = (1 + √5)/2 ≈ 1.6180339887\]

<p>Altın oranın ilginç özelliklerinden biri, karesi ve tersiyle kurduğu sade ilişkilerdir:</p>

\[φ^2 = φ + 1\]

\[1/φ = φ - 1\]

<p>Sanki sayı kendi içinde küçük bir matematiksel yapboz taşıyor!</p>

<h2 id="fibonacci-dizisiyle-bağlantısı">Fibonacci dizisiyle bağlantısı</h2>

<p>Fibonacci dizisinde her sayı kendisinden önce gelen iki sayının toplamıdır:</p>

\[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...\]

<p>Ardışık Fibonacci sayılarının büyük olanını küçük olana böldüğümüzde sonuç giderek altın orana yaklaşır. Örneğin $13/8 = 1.625$, $34/21 ≈ 1.619$ ve $89/55 ≈ 1.618$ olur. Bu yakınlaşma, altın oranın doğadaki spiral düzenlerle ilişkilendirilmesinin temel nedenlerinden biridir.</p>

<table>
  <thead>
    <tr>
      <th>Fibonacci oranı</th>
      <th style="text-align: right">Yaklaşık değer</th>
      <th style="text-align: right">Altın orana uzaklık</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$5/3$</td>
      <td style="text-align: right">1.6667</td>
      <td style="text-align: right">0.0486</td>
    </tr>
    <tr>
      <td>$13/8$</td>
      <td style="text-align: right">1.6250</td>
      <td style="text-align: right">0.0070</td>
    </tr>
    <tr>
      <td>$34/21$</td>
      <td style="text-align: right">1.6190</td>
      <td style="text-align: right">0.0010</td>
    </tr>
    <tr>
      <td>$89/55$</td>
      <td style="text-align: right">1.6182</td>
      <td style="text-align: right">0.0001</td>
    </tr>
  </tbody>
</table>

<p>Bu yakınsamayı Python ile gözlemleyebiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Fibonacci sayıları arasındaki oranların
# altın orana nasıl yaklaştığını gösterir.
</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span>

<span class="k">for</span> <span class="n">adim</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">12</span><span class="p">):</span>
    <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
    <span class="n">oran</span> <span class="o">=</span> <span class="n">b</span> <span class="o">/</span> <span class="n">a</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">adim</span><span class="si">}</span><span class="s">. adım: </span><span class="si">{</span><span class="n">b</span><span class="si">}</span><span class="s">/</span><span class="si">{</span><span class="n">a</span><span class="si">}</span><span class="s"> = </span><span class="si">{</span><span class="n">oran</span><span class="si">:</span><span class="p">.</span><span class="mi">8</span><span class="n">f</span><span class="si">}</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Döngü her adımda yeni Fibonacci sayısını üretir ve ardışık iki değerin oranını yazdırır. Çıktıda oranların bir süre altın değerin üstüne ve altına geçtiğini, ardından $1.618$ çevresinde dengelendiğini görürüz.</p>

<h2 id="doğadaki-izleri">Doğadaki izleri</h2>

<p>Ayçiçeği çekirdekleri ve çam kozalağı pulları, çoğu zaman birbirine zıt yönlerde ilerleyen spiral aileleri oluşturur. Bu spirallerin sayıları sıklıkla $34$, $55$ veya $89$ gibi Fibonacci sayılarına yakındır. Böyle bir yerleşim, bitkinin sınırlı alana çok sayıda tohum ya da yaprak sığdırmasına yardımcı olabilir.</p>

<p>Yaprakların gövde çevresindeki dizilimi de güneş ışığına erişimi artıran açılar oluşturabilir. Altın açı olarak bilinen değer yaklaşık olarak:</p>

\[360°/φ^2 ≈ 137.5°\]

<p>Ancak her spiral altın spiral değildir. Nautilus kabuğu sıkça kusursuz örnek olarak sunulsa da gerçek kabukların büyüme oranları türden türe değişir. Doğa cetvelle çizilmiş tek bir formülden çok, çevresel koşulların ve biyolojik süreçlerin birlikte çalıştığı esnek bir sistemdir.</p>

<h2 id="sanat-ve-mimaride-altın-oran">Sanat ve mimaride altın oran</h2>

<p>Altın dikdörtgenin kısa kenarı $1$ ise uzun kenarı yaklaşık $1.618$ olur. Bu biçimin Mona Lisa, Parthenon ve çeşitli Rönesans eserlerinde kullanıldığı sıkça ileri sürülür. Bazı tasarımlarda oran bilinçli biçimde uygulanmış olsa da tarihsel kanıt bulunmayan örnekler de vardır.</p>

<table>
  <thead>
    <tr>
      <th>Alan</th>
      <th>Olası kullanım</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Resim</td>
      <td>Kompozisyon ve odak yerleşimi</td>
      <td>Sonradan yapılan ölçümler seçici olabilir</td>
    </tr>
    <tr>
      <td>Mimari</td>
      <td>Cephe ve oda oranları</td>
      <td>Yapının farklı bölümleri farklı sonuç verir</td>
    </tr>
    <tr>
      <td>Grafik tasarım</td>
      <td>Izgara, boşluk ve boyutlandırma</td>
      <td>Estetiğin tek formülü değildir</td>
    </tr>
    <tr>
      <td>Doğa</td>
      <td>Yaprak ve tohum dizilimleri</td>
      <td>Yaklaşık değerler görülür</td>
    </tr>
  </tbody>
</table>

<p>Altın oran, güzelliği otomatik olarak üreten sihirli bir düğme değildir. Asıl değeri; büyüme, oran, geometri ve görsel düzen arasındaki bağlantıları incelememizi sağlamasıdır. Kısacası $φ$, doğanın gizli şifresinden ziyade çevremizdeki örüntüleri okumak için kullanabileceğimiz zarif bir matematiksel mercektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="altın oran" /><category term="matematik" /><category term="doğa" /><category term="sanat" /><category term="mimari" /><category term="fibonacci" /><category term="python" /><summary type="html"><![CDATA[Bir ayçiçeğinin merkezine, çam kozalağının pullarına veya yüzyıllardır hayranlık uyandıran bir tabloya baktığımızda benzer bir düzen hissedebiliriz. Bu düzenin arkasındaki en ünlü matematiksel adaylardan biri altın orandır. Yaklaşık $1.618$ değerindeki bu sayı; geometriyi, Fibonacci dizisini ve estetik tartışmalarını aynı masada buluşturan büyüleyici bir köprüdür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/altin-oran-doganin-52.png" /><media:content medium="image" url="https://program.sonsuz.us/img/altin-oran-doganin-52.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bitlerden Fraktala: Thue-Morse Ardışıklığının Şaşırtıcı Dünyası</title><link href="https://program.sonsuz.us/posts/bitlerden-fraktala-thue-morse-ardisikliginin-sasirtici-dunyasi/" rel="alternate" type="text/html" title="Bitlerden Fraktala: Thue-Morse Ardışıklığının Şaşırtıcı Dünyası" /><published>2026-10-12T00:00:00+00:00</published><updated>2026-10-12T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bitlerden-fraktala-thue-morse-ardisikliginin-sasirtici-dunyasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/bitlerden-fraktala-thue-morse-ardisikliginin-sasirtici-dunyasi/"><![CDATA[<p>Bir bilgisayara yalnızca “elindeki bitleri kopyala ve terslerini yanına ekle” deseydik, ortaya ne kadar karmaşık bir yapı çıkabilirdi? Thue-Morse ardışıklığı, son derece basit bu talimattan doğmasına rağmen öz-benzerlik, düzen ve kaos arasında gidip gelen büyüleyici bir dizidir. Üstelik matematikten müziğe, kombinatorikten algoritma tasarımına kadar pek çok alanda karşımıza çıkar.</p>

<p><img src="/img/bitlerden-fraktala-thue-22.svg" alt="bitlerden-fraktala-thue-22" /></p>

<p>``
Diziyi oluşturmaya tek bir <code class="language-plaintext highlighter-rouge">0</code> ile başlayalım. Her adımda mevcut bölümün bitlerini ters çevirip sonuna ekleyelim:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0
01
0110
01101001
0110100110010110
</code></pre></div></div>

<p>Burada ters çevirme işlemi <code class="language-plaintext highlighter-rouge">0 → 1</code> ve <code class="language-plaintext highlighter-rouge">1 → 0</code> biçimindedir. Örneğin <code class="language-plaintext highlighter-rouge">0110</code> kelimesinin tümleyeni <code class="language-plaintext highlighter-rouge">1001</code> olur; ikisini birleştirince <code class="language-plaintext highlighter-rouge">01101001</code> elde edilir. Bu üretim kuralı matematiksel olarak</p>

\[T_{k+1} = T_k\,\overline{T_k}\]

<p>şeklinde yazılabilir. $\overline{T_k}$, $T_k$ içindeki bütün bitlerin tümleyenini temsil eder. Her turda uzunluk iki katına çıktığı için $k$ adımından sonra $2^k$ eleman bulunur.</p>

<h2 id="sayıların-ikili-gösterimiyle-bağlantısı">Sayıların ikili gösterimiyle bağlantısı</h2>

<p>Thue-Morse dizisinin yalnızca önceki parçayı kopyalayarak tanımlanması gerekmez. Sıfırdan başlayan $n$ indeksli terim, $n$ sayısının ikili gösterimindeki <code class="language-plaintext highlighter-rouge">1</code> sayısının tek veya çift olmasına göre hesaplanabilir.</p>

<p>$n$ içindeki <code class="language-plaintext highlighter-rouge">1</code> bitlerinin sayısına $s_2(n)$ dersek:</p>

\[t_n = s_2(n) \bmod 2\]

<p>Yani <code class="language-plaintext highlighter-rouge">1</code> sayısı çiftse sonuç <code class="language-plaintext highlighter-rouge">0</code>, tekse <code class="language-plaintext highlighter-rouge">1</code> olur.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">$n$</th>
      <th style="text-align: center">İkili gösterim</th>
      <th style="text-align: right"><code class="language-plaintext highlighter-rouge">1</code> sayısı</th>
      <th style="text-align: right">$t_n$</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: right">0</td>
      <td style="text-align: right">0</td>
    </tr>
    <tr>
      <td style="text-align: right">1</td>
      <td style="text-align: center">1</td>
      <td style="text-align: right">1</td>
      <td style="text-align: right">1</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td style="text-align: center">10</td>
      <td style="text-align: right">1</td>
      <td style="text-align: right">1</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td style="text-align: center">11</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">0</td>
    </tr>
    <tr>
      <td style="text-align: right">4</td>
      <td style="text-align: center">100</td>
      <td style="text-align: right">1</td>
      <td style="text-align: right">1</td>
    </tr>
    <tr>
      <td style="text-align: right">5</td>
      <td style="text-align: center">101</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">0</td>
    </tr>
    <tr>
      <td style="text-align: right">6</td>
      <td style="text-align: center">110</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">0</td>
    </tr>
    <tr>
      <td style="text-align: right">7</td>
      <td style="text-align: center">111</td>
      <td style="text-align: right">3</td>
      <td style="text-align: right">1</td>
    </tr>
  </tbody>
</table>

<p>Bu tanımdan kullanışlı iki bağıntı çıkar:</p>

\[t_{2n}=t_n, \qquad t_{2n+1}=1-t_n\]

<p>Çift indeksler önceki değerleri tekrar ederken tek indeksler onların tersini taşır. Dizinin fraktal karakterinin cebirsel özeti tam olarak budur.</p>

<h2 id="neden-fraktala-benziyor">Neden fraktala benziyor?</h2>

<p>Fraktallarda bütünün daha küçük ölçekli kopyalarını görürüz. Thue-Morse dizisinde de her blok, daha önce oluşmuş bir bloğu ve onun renkleri değiştirilmiş hâlini içerir. Bitleri siyah ve beyaz kareler olarak çizersek farklı ölçeklerde yinelenen desenler ortaya çıkar. Ancak bu tekrar tam anlamıyla periyodik değildir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Periyodik dizi</th>
      <th>Thue-Morse dizisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Üretim</td>
      <td>Sabit blok tekrarı</td>
      <td>Blok ve tümleyenini birleştirme</td>
    </tr>
    <tr>
      <td>Tahmin edilebilirlik</td>
      <td>Kısa dönem yeterlidir</td>
      <td>İndeksin bit yapısı gerekir</td>
    </tr>
    <tr>
      <td>Öz-benzerlik</td>
      <td>Genellikle sınırlı</td>
      <td>Her iki kat ölçekte görünür</td>
    </tr>
    <tr>
      <td>Periyot</td>
      <td>Sonlu olabilir</td>
      <td>Sonsuz dizide yoktur</td>
    </tr>
  </tbody>
</table>

<p>Dizi deterministiktir; yani rastgele değildir. Buna karşın sonsuza kadar tekrar eden sabit bir periyoda da sahip değildir. Dahası, belirli türde aşırı tekrarları engelleyen <strong>overlap-free</strong> özelliğiyle kelime kombinatoriğinde önemli bir yere sahiptir.</p>

<h2 id="python-ile-üretelim">Python ile üretelim</h2>

<p>Aşağıdaki fonksiyon, her turun sonuna mevcut bitlerin tümleyenini ekler:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">thue_morse</span><span class="p">(</span><span class="n">iterations</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="n">sequence</span> <span class="o">=</span> <span class="sh">"</span><span class="s">0</span><span class="sh">"</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">iterations</span><span class="p">):</span>
        <span class="n">complement</span> <span class="o">=</span> <span class="sh">""</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span>
            <span class="sh">"</span><span class="s">1</span><span class="sh">"</span> <span class="k">if</span> <span class="n">bit</span> <span class="o">==</span> <span class="sh">"</span><span class="s">0</span><span class="sh">"</span> <span class="k">else</span> <span class="sh">"</span><span class="s">0</span><span class="sh">"</span>
            <span class="k">for</span> <span class="n">bit</span> <span class="ow">in</span> <span class="n">sequence</span>
        <span class="p">)</span>
        <span class="n">sequence</span> <span class="o">+=</span> <span class="n">complement</span>

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

<span class="nf">print</span><span class="p">(</span><span class="nf">thue_morse</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span>
<span class="c1"># 0110100110010110
</span></code></pre></div></div>

<p>Tek bir terime ihtiyaç duyulduğunda bütün diziyi üretmek gereksizdir. Python’daki <code class="language-plaintext highlighter-rouge">bit_count()</code> yöntemi daha doğrudan bir çözüm sunar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">thue_morse_term</span><span class="p">(</span><span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
    <span class="c1"># İkili gösterimdeki 1 sayısının paritesini döndürür.
</span>    <span class="k">return</span> <span class="n">n</span><span class="p">.</span><span class="nf">bit_count</span><span class="p">()</span> <span class="o">%</span> <span class="mi">2</span>

<span class="nf">print</span><span class="p">([</span><span class="nf">thue_morse_term</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">16</span><span class="p">)])</span>
</code></pre></div></div>

<p>İlk yöntem görsel deseni ve öz-benzerliği incelemek için, ikinci yöntemse büyük indekslerde hızlı sorgulama yapmak için uygundur.</p>

<p>Thue-Morse ardışıklığı, karmaşıklığın mutlaka karmaşık kurallardan doğmadığını gösteren zarif bir örnektir. Bir bit, bir tümleyen işlemi ve tekrar: Dijital dünyanın bu küçük tarifi, sonsuz ve periyotsuz bir matematik manzarası üretmeye yeter.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="thue-morse" /><category term="algoritma" /><category term="matematik" /><category term="fraktal" /><category term="python" /><category term="bit işlemleri" /><summary type="html"><![CDATA[Bir bilgisayara yalnızca “elindeki bitleri kopyala ve terslerini yanına ekle” deseydik, ortaya ne kadar karmaşık bir yapı çıkabilirdi? Thue-Morse ardışıklığı, son derece basit bu talimattan doğmasına rağmen öz-benzerlik, düzen ve kaos arasında gidip gelen büyüleyici bir dizidir. Üstelik matematikten müziğe, kombinatorikten algoritma tasarımına kadar pek çok alanda karşımıza çıkar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bitlerden-fraktala-thue-22.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bitlerden-fraktala-thue-22.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Euler Yolları ve Königsberg Köprüleri: Bir Şehir Gezintisinden Graf Teorisine</title><link href="https://program.sonsuz.us/posts/euler-yollari-ve-konigsberg-kopruleri-bir-sehir-gezintisinden-graf-teorisine/" rel="alternate" type="text/html" title="Euler Yolları ve Königsberg Köprüleri: Bir Şehir Gezintisinden Graf Teorisine" /><published>2026-10-12T00:00:00+00:00</published><updated>2026-10-12T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/euler-yollari-ve-konigsberg-kopruleri-bir-sehir-gezintisinden-graf-teorisine</id><content type="html" xml:base="https://program.sonsuz.us/posts/euler-yollari-ve-konigsberg-kopruleri-bir-sehir-gezintisinden-graf-teorisine/"><![CDATA[<p>Bir pazar yürüyüşüne çıktığınızı ve şehirdeki her köprüden yalnızca bir kez geçmek istediğinizi düşünün. Başladığınız yere dönmeniz şart olmayabilir; ancak hiçbir köprüyü ikinci kez kullanamazsınız. Kulağa eğlenceli bir rota bulmacası gibi gelen bu soru, 18. yüzyılda matematikçi Leonhard Euler’in elinde yepyeni bir alanın, yani graf teorisinin doğmasına yol açtı.</p>

<p><img src="/img/euler-yollari-ve-78.svg" alt="euler-yollari-ve-78" /></p>

<p>``</p>
<h2 id="königsberg-köprüleri-problemi">Königsberg Köprüleri Problemi</h2>

<p>Prusya’nın Königsberg şehri, Pregel Nehri’nin ayırdığı dört kara parçası ve bunları birbirine bağlayan yedi köprüden oluşuyordu. Şehir halkının sorusu basitti: Her köprüden tam bir kez geçilen bir yürüyüş yapılabilir miydi?</p>

<p>Euler, kara parçalarının şekli veya köprülerin uzunluğu gibi ayrıntıların önemsiz olduğunu fark etti. Her kara parçasını bir <strong>düğüm</strong>, her köprüyü ise iki düğümü bağlayan bir <strong>kenar</strong> olarak temsil etti. Böylece fiziksel şehir, matematiksel bir grafa dönüştü.</p>

<table>
  <thead>
    <tr>
      <th>Gerçek dünyadaki öğe</th>
      <th>Graf karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kara parçası</td>
      <td>Düğüm (vertex)</td>
    </tr>
    <tr>
      <td>Köprü</td>
      <td>Kenar (edge)</td>
    </tr>
    <tr>
      <td>Bir kara parçasındaki köprü sayısı</td>
      <td>Düğüm derecesi</td>
    </tr>
    <tr>
      <td>Köprüleri kullanan yürüyüş</td>
      <td>Graf üzerinde yol</td>
    </tr>
  </tbody>
</table>

<p>Aynı iki kara parçası arasında birden fazla köprü bulunabildiği için ortaya çıkan yapı teknik olarak bir <strong>çoklu graf</strong>tır.</p>

<h2 id="düğüm-derecesi-neden-önemlidir">Düğüm Derecesi Neden Önemlidir?</h2>

<p>Bir düğümün derecesi, o düğüme bağlı kenarların sayısıdır ve $\deg(v)$ ile gösterilir. Bir yol sırasında ara düğüme bir kenardan girip başka bir kenardan çıkmak gerekir. Dolayısıyla kullanılan kenarlar çiftler hâlinde eşleşir. Tek dereceli düğümler ise bu eşleşmenin bozulduğu başlangıç veya bitiş noktaları olabilir.</p>

<p>Grafın bütün düğüm dereceleri için şu önemli eşitlik geçerlidir:</p>

\[\sum_{v \in V} \deg(v) = 2\vert E\vert\]

<p>Her kenar iki uca sahip olduğundan dereceler toplamına iki katkı yapar. Bu sonuç, tek dereceli düğüm sayısının her zaman çift olduğunu da gösterir.</p>

<p>Königsberg grafındaki dört düğümün dereceleri $3, 3, 3$ ve $5$ idi. Yani dört düğüm de tek dereceliydi. Oysa her köprüden yalnızca bir kez geçen bir rota için tek dereceli düğüm sayısı en fazla iki olmalıdır. Sonuç: İstenen yürüyüş imkânsızdı!</p>

<h2 id="euler-yolu-ve-euler-devresi">Euler Yolu ve Euler Devresi</h2>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Koşul</th>
      <th>Başlangıç ve bitiş</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Euler devresi</td>
      <td>Tek dereceli düğüm yoktur</td>
      <td>Aynı düğüm</td>
    </tr>
    <tr>
      <td>Euler yolu</td>
      <td>Tam iki tek dereceli düğüm vardır</td>
      <td>Farklı düğümler</td>
    </tr>
    <tr>
      <td>İmkânsız durum</td>
      <td>İkiden fazla tek dereceli düğüm vardır</td>
      <td>Uygun rota yoktur</td>
    </tr>
  </tbody>
</table>

<p>Bu koşullarda grafın, izole düğümler göz ardı edildiğinde, bağlantılı olduğu kabul edilir. Euler yolu <strong>her kenarı</strong> tam bir kez kullanır. Bu nedenle her düğümü bir kez ziyaret etmeye çalışan Hamilton yoluyla karıştırılmamalıdır.</p>

<h2 id="python-ile-euler-yolu-kontrolü">Python ile Euler Yolu Kontrolü</h2>

<p>Aşağıdaki fonksiyon, komşuluk listesiyle verilen bağlantılı bir grafın Euler özelliğini dereceler üzerinden sınıflandırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">euler_durumu</span><span class="p">(</span><span class="n">graf</span><span class="p">):</span>
    <span class="n">tek_dereceliler</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">dugum</span><span class="p">,</span> <span class="n">komsular</span> <span class="ow">in</span> <span class="n">graf</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">komsular</span><span class="p">)</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">tek_dereceliler</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">dugum</span><span class="p">)</span>

    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">tek_dereceliler</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Euler devresi var</span><span class="sh">"</span>
    <span class="k">elif</span> <span class="nf">len</span><span class="p">(</span><span class="n">tek_dereceliler</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
        <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Euler yolu var: </span><span class="si">{</span><span class="n">tek_dereceliler</span><span class="si">}</span><span class="sh">"</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Euler yolu yok</span><span class="sh">"</span>

<span class="n">sehir</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">B</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">B</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">C</span><span class="sh">"</span><span class="p">],</span>
    <span class="sh">"</span><span class="s">B</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">D</span><span class="sh">"</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="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">D</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">D</span><span class="sh">"</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="sh">"</span><span class="s">B</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">C</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">C</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">D</span><span class="sh">"</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="nf">print</span><span class="p">(</span><span class="nf">euler_durumu</span><span class="p">(</span><span class="n">sehir</span><span class="p">))</span>
</code></pre></div></div>

<p>Listelerde aynı komşunun tekrarlanması paralel köprüleri temsil eder. Bir öz döngü ise düğüm derecesine iki katkı yaptığı için listede iki kez gösterilmiştir. Gerçek bir uygulamada ayrıca DFS veya BFS kullanarak grafın bağlantılı olup olmadığı doğrulanmalıdır.</p>

<p>Euler’in büyük başarısı belirli bir rotayı denemek değil, böyle bir rotanın var olup olamayacağını yapısal olarak kanıtlamaktı. Bugün aynı fikir; çöp toplama rotaları, ağ analizi, devre tasarımı ve DNA dizileme gibi pek çok alanda karşımıza çıkıyor. Bazen bir köprüden geçmeden önce dereceleri saymak, saatlerce dolaşmaktan çok daha akıllıcadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="graf teorisi" /><category term="euler yolu" /><category term="königsberg" /><category term="algoritma" /><category term="python" /><summary type="html"><![CDATA[Bir pazar yürüyüşüne çıktığınızı ve şehirdeki her köprüden yalnızca bir kez geçmek istediğinizi düşünün. Başladığınız yere dönmeniz şart olmayabilir; ancak hiçbir köprüyü ikinci kez kullanamazsınız. Kulağa eğlenceli bir rota bulmacası gibi gelen bu soru, 18. yüzyılda matematikçi Leonhard Euler’in elinde yepyeni bir alanın, yani graf teorisinin doğmasına yol açtı.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/euler-yollari-ve-78.png" /><media:content medium="image" url="https://program.sonsuz.us/img/euler-yollari-ve-78.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Grafların Bilgisayarda Gösterimi: Matris mi, Liste mi?</title><link href="https://program.sonsuz.us/posts/graflarin-bilgisayarda-gosterimi-matris-mi-liste-mi/" rel="alternate" type="text/html" title="Grafların Bilgisayarda Gösterimi: Matris mi, Liste mi?" /><published>2026-10-12T00:00:00+00:00</published><updated>2026-10-12T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/graflarin-bilgisayarda-gosterimi-matris-mi-liste-mi</id><content type="html" xml:base="https://program.sonsuz.us/posts/graflarin-bilgisayarda-gosterimi-matris-mi-liste-mi/"><![CDATA[<p>Bir sosyal ağdaki arkadaşlıkları, şehirler arasındaki yolları veya internet üzerindeki bağlantıları bilgisayarda nasıl saklarız? Matematikte birkaç nokta ve çizgiyle gösterilen graflar, belleğe yerleştirilirken biraz daha seçici olmamızı ister. En yaygın iki seçenek olan <strong>komşuluk matrisi</strong> ve <strong>komşuluk listesi</strong>, aynı grafı temsil etse de bellek tüketimi ve işlem performansı bakımından oldukça farklı davranır.</p>

<p>``</p>

<h2 id="önce-grafın-temelini-kuralım">Önce grafın temelini kuralım</h2>

<p>Bir graf, $G=(V,E)$ biçiminde tanımlanır. Burada $V$ düğümler, $E$ ise düğümler arasındaki kenarlardır. Düğüm sayısını $\vert V\vert =n$, kenar sayısını da $\vert E\vert =m$ ile gösterelim.</p>

<p>Bir grafın sahip olabileceği kenar sayısı, yönsüz ve öz döngüsüz durumda en fazla:</p>

\[m_{max}=\frac{n(n-1)}{2}\]

<p>olur. Eğer $m$, bu üst sınıra yakınsa grafa <strong>yoğun graf</strong>; kenar sayısı düğüm sayısına yakınsa <strong>seyrek graf</strong> denir. Temsil yöntemi seçilirken asıl belirleyici çoğu zaman bu yoğunluktur.</p>

<h2 id="komşuluk-matrisi">Komşuluk matrisi</h2>

<p>Komşuluk matrisi, $n \times n$ boyutunda iki boyutlu bir tablodur. <code class="language-plaintext highlighter-rouge">matris[i][j]</code> değeri, <code class="language-plaintext highlighter-rouge">i</code> ile <code class="language-plaintext highlighter-rouge">j</code> arasında kenar varsa <code class="language-plaintext highlighter-rouge">1</code>, yoksa <code class="language-plaintext highlighter-rouge">0</code> olur. Ağırlıklı graflarda bu hücreye kenarın ağırlığı yazılabilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Dört düğümlü yönsüz bir grafın komşuluk matrisi
</span><span class="n">matris</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">]</span>

<span class="c1"># 0 ve 2 arasında doğrudan kenar var mı?
</span><span class="nf">print</span><span class="p">(</span><span class="n">matris</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu yöntemin yıldız özelliği, iki düğüm arasında kenar bulunup bulunmadığını $O(1)$ zamanda söylemesidir. Ancak grafın yalnızca birkaç kenarı olsa bile bütün hücreler ayrılır. Dolayısıyla bellek karmaşıklığı her durumda $O(V^2)$ olur.</p>

<p>Bir düğümün tüm komşularını bulmak için ilgili satırın tamamı gezilir. Bu işlem $O(V)$ zaman alır. Matris, özellikle yoğun graflarda ve sık kenar sorgusu yapılan uygulamalarda güçlüdür.</p>

<h2 id="komşuluk-listesi">Komşuluk listesi</h2>

<p>Komşuluk listesinde her düğüm için yalnızca bağlantılı olduğu düğümler tutulur. Boş bağlantılar bellekte yer kaplamaz; yani kullanılmayan koltuklara bilet kesilmez.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Aynı grafın komşuluk listesi gösterimi
</span><span class="n">liste</span> <span class="o">=</span> <span class="p">{</span>
    <span class="mi">0</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span>
    <span class="mi">1</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span>
    <span class="mi">2</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span>
    <span class="mi">3</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span>
<span class="p">}</span>

<span class="c1"># 0 düğümünün komşularını dolaş
</span><span class="k">for</span> <span class="n">komsu</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">komsu</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu yapının bellek maliyeti $O(V+E)$ düzeyindedir. Bir düğümün komşularını dolaşmak, düğümün derecesi $d(v)$ olmak üzere $O(d(v))$ sürer. Buna karşılık belirli iki düğümün komşu olup olmadığını aramak, kullanılan liste yapısına göre $O(d(v))$ zaman alabilir. Komşular bir <code class="language-plaintext highlighter-rouge">set</code> içinde saklanırsa ortalama sorgu süresi $O(1)$ seviyesine indirilebilir; fakat ek bellek maliyeti oluşur.</p>

<h2 id="hızlı-karşılaştırma">Hızlı karşılaştırma</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Komşuluk matrisi</th>
      <th>Komşuluk listesi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bellek</td>
      <td>$O(V^2)$</td>
      <td>$O(V+E)$</td>
    </tr>
    <tr>
      <td>Kenar sorgusu</td>
      <td>$O(1)$</td>
      <td>$O(d(v))$</td>
    </tr>
    <tr>
      <td>Komşuları gezme</td>
      <td>$O(V)$</td>
      <td>$O(d(v))$</td>
    </tr>
    <tr>
      <td>Kenar ekleme</td>
      <td>$O(1)$</td>
      <td>Genellikle $O(1)$</td>
    </tr>
    <tr>
      <td>Uygun graf türü</td>
      <td>Yoğun</td>
      <td>Seyrek</td>
    </tr>
    <tr>
      <td>Uygulama kolaylığı</td>
      <td>Çok basit</td>
      <td>Biraz daha esnek</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/graflarin-bilgisayarda-gosterimi-62.svg" alt="graflarin-bilgisayarda-gosterimi-62" /></p>

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

<p>Grafınızda binlerce düğüm fakat az sayıda bağlantı varsa komşuluk listesi açık ara daha ekonomiktir. Örneğin yol ağları, web bağlantıları ve sosyal ağların büyük bölümü seyrektir. Bu yapılarda BFS ve DFS gibi algoritmalar listeyle $O(V+E)$ zamanda çalışır; matris kullanılırsa süre $O(V^2)$ seviyesine çıkabilir.</p>

<p>Düğüm sayısı küçükse, graf yoğunsa veya uygulama sürekli “Bu iki düğüm bağlı mı?” diye soruyorsa komşuluk matrisi daha pratik olabilir. Floyd–Warshall gibi matris tabanlı algoritmalar da doğal olarak bu gösterimle uyumludur.</p>

<p>Kısacası evrensel bir kazanan yoktur: <strong>matris sorgu hızını, liste ise bellek verimliliğini öne çıkarır</strong>. Doğru seçim, grafın yoğunluğuna ve en sık yapılacak işleme bağlıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="graf" /><category term="veri yapıları" /><category term="algoritma" /><category term="komşuluk matrisi" /><category term="komşuluk listesi" /><category term="python" /><summary type="html"><![CDATA[Bir sosyal ağdaki arkadaşlıkları, şehirler arasındaki yolları veya internet üzerindeki bağlantıları bilgisayarda nasıl saklarız? Matematikte birkaç nokta ve çizgiyle gösterilen graflar, belleğe yerleştirilirken biraz daha seçici olmamızı ister. En yaygın iki seçenek olan komşuluk matrisi ve komşuluk listesi, aynı grafı temsil etse de bellek tüketimi ve işlem performansı bakımından oldukça farklı davranır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/graflarin-bilgisayarda-gosterimi-62.png" /><media:content medium="image" url="https://program.sonsuz.us/img/graflarin-bilgisayarda-gosterimi-62.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Lineer Homojen Yinelemeli İlişkiler: Fibonacci’nin Kapalı Formuna Yolculuk</title><link href="https://program.sonsuz.us/posts/lineer-homojen-yinelemeli-iliskiler-fibonaccinin-kapali-formuna-yolculuk/" rel="alternate" type="text/html" title="Lineer Homojen Yinelemeli İlişkiler: Fibonacci’nin Kapalı Formuna Yolculuk" /><published>2026-10-12T00:00:00+00:00</published><updated>2026-10-12T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/lineer-homojen-yinelemeli-iliskiler-fibonaccinin-kapali-formuna-yolculuk</id><content type="html" xml:base="https://program.sonsuz.us/posts/lineer-homojen-yinelemeli-iliskiler-fibonaccinin-kapali-formuna-yolculuk/"><![CDATA[<p><img src="/img/lineer-homojen-yinelemeli-29.svg" alt="lineer-homojen-yinelemeli-29" /></p>

<p>Bir dizinin sonraki elemanını önceki elemanlardan üretmek oldukça doğaldır. Fibonacci dizisinde yaptığımız gibi iki sayıyı toplar, yenisini buluruz. Fakat doğrudan milyonuncu terim sorulduğunda bu yöntem biraz yorulur. Lineer homojen yinelemeli ilişkiler, dizinin bütün davranışını tek bir formülde yakalamamızı sağlayarak yinelemeyi adeta cebirsel bir kestirme yola dönüştürür.</p>

<p>``</p>

<h2 id="lineer-homojen-ilişki-nedir">Lineer homojen ilişki nedir?</h2>

<p>Sabit katsayılı, ikinci dereceden bir lineer homojen yinelemeli ilişki genel olarak</p>

\[a_n=c_1a_{n-1}+c_2a_{n-2}\]

<p>biçimindedir. “Lineer” denmesinin nedeni önceki terimlerin kuvvetlerinin veya birbirleriyle çarpımlarının bulunmamasıdır. “Homojen” ifadesi ise eşitliğe dizi dışından eklenen bağımsız bir fonksiyon olmadığını belirtir.</p>

<p>Örneğin $a_n=3a_{n-1}-2a_{n-2}$ homojendir. Buna karşılık $a_n=3a_{n-1}+n$ homojen değildir; çünkü $n$ biçiminde dışarıdan gelen bir terim vardır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Homojen örnek</th>
      <th>Homojen olmayan örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İlişki</td>
      <td>$a_n=2a_{n-1}+a_{n-2}$</td>
      <td>$a_n=2a_{n-1}+n$</td>
    </tr>
    <tr>
      <td>Dış kaynaklı terim</td>
      <td>Yok</td>
      <td>Var</td>
    </tr>
    <tr>
      <td>Temel çözüm yaklaşımı</td>
      <td>Karakteristik denklem</td>
      <td>Homojen ve özel çözüm</td>
    </tr>
  </tbody>
</table>

<h2 id="karakteristik-denklem-fikri">Karakteristik denklem fikri</h2>

<p>Çözümün $a_n=r^n$ biçiminde olduğunu varsayalım. Bu tahmin rastgele değildir: Üstel ifadeler kaydırıldıklarında yalnızca sabit bir çarpan kazanır. Varsayımı genel ilişkiye yerleştirirsek</p>

\[r^n=c_1r^{n-1}+c_2r^{n-2}\]

<p>elde ederiz. $r^{n-2}$ ortak çarpanına böldüğümüzde karakteristik denklem ortaya çıkar:</p>

\[r^2-c_1r-c_2=0\]

<p>Denklemin birbirinden farklı iki kökü $r_1$ ve $r_2$ ise genel çözüm</p>

\[a_n=A r_1^n+B r_2^n\]

<p>olur. $A$ ve $B$ sabitleri başlangıç koşullarından bulunur. Böylece her terimi sırayla hesaplamak yerine doğrudan istenen indekse gideriz.</p>

<table>
  <thead>
    <tr>
      <th>Kök durumu</th>
      <th>Genel çözüm</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Farklı gerçek kökler</td>
      <td>$A r_1^n+B r_2^n$</td>
    </tr>
    <tr>
      <td>Çift katlı kök $r$</td>
      <td>$(A+Bn)r^n$</td>
    </tr>
    <tr>
      <td>Karmaşık eşlenik kökler</td>
      <td>Üstel ve trigonometrik biçimlerin birleşimi</td>
    </tr>
  </tbody>
</table>

<h2 id="fibonacciye-uygulayalım">Fibonacci’ye uygulayalım</h2>

<p>Fibonacci ilişkisi</p>

\[F_n=F_{n-1}+F_{n-2}, \qquad F_0=0,\quad F_1=1\]

<p>şeklindedir. $F_n=r^n$ varsayımı karakteristik denklemi verir:</p>

\[r^2-r-1=0\]

<p>Kökler altın oran $phi$ ve onun eşleniğidir:</p>

\[r_1=\frac{1+\sqrt{5}}{2}=\phi, \qquad r_2=\frac{1-\sqrt{5}}{2}=\psi\]

<p>Dolayısıyla $F_n=A\phi^n+B\psi^n$ yazılır. $F_0=0$ ve $F_1=1$ koşulları kullanıldığında $A=1/\sqrt{5}$ ve $B=-1/\sqrt{5}$ bulunur. Sonuç, Binet formülü olarak bilinen zarif ifadedir:</p>

\[F_n=\frac{\phi^n-\psi^n}{\sqrt{5}}\]

<p>İçinde irrasyonel sayılar bulunmasına rağmen sonuç her doğal $n$ için tam sayıdır. Bunun nedeni, iki üstel terimde oluşan irrasyonel parçaların birbirini tam olarak yok etmesidir. Ayrıca $\vert \psi\vert &lt;1$ olduğu için büyük $n$ değerlerinde $\psi^n$ sıfıra yaklaşır. Bu nedenle yaklaşık olarak $F_n\approx \phi^n/\sqrt{5}$ denebilir.</p>

<h2 id="python-ile-doğrulama">Python ile doğrulama</h2>

<p>Aşağıdaki kod hem yinelemeli hesaplamayı hem de kapalı formu uygular. <code class="language-plaintext highlighter-rouge">round</code> kullanılması, kayan noktalı işlemlerde oluşabilecek küçük hassasiyet hatalarını temizler.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">math</span> <span class="kn">import</span> <span class="n">sqrt</span>

<span class="k">def</span> <span class="nf">fibonacci_iteratif</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="n">onceki</span><span class="p">,</span> <span class="n">simdiki</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="n">onceki</span><span class="p">,</span> <span class="n">simdiki</span> <span class="o">=</span> <span class="n">simdiki</span><span class="p">,</span> <span class="n">onceki</span> <span class="o">+</span> <span class="n">simdiki</span>
    <span class="k">return</span> <span class="n">onceki</span>

<span class="k">def</span> <span class="nf">fibonacci_binet</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="n">phi</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="nf">sqrt</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span> <span class="o">/</span> <span class="mi">2</span>
    <span class="n">psi</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nf">sqrt</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span> <span class="o">/</span> <span class="mi">2</span>
    <span class="k">return</span> <span class="nf">round</span><span class="p">((</span><span class="n">phi</span><span class="o">**</span><span class="n">n</span> <span class="o">-</span> <span class="n">psi</span><span class="o">**</span><span class="n">n</span><span class="p">)</span> <span class="o">/</span> <span class="nf">sqrt</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>

<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">11</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nf">fibonacci_iteratif</span><span class="p">(</span><span class="n">n</span><span class="p">),</span> <span class="nf">fibonacci_binet</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
</code></pre></div></div>

<p>Kapalı form teorik olarak doğrudan hesaplama sağlasa da çok büyük indekslerde kayan nokta hassasiyeti sorun çıkarabilir. Bu durumda matris üs alma veya tam sayı aritmetiği daha güvenilirdir. Yine de karakteristik denklem yöntemi, dizinin büyüme hızını ve köklerin davranış üzerindeki etkisini görmenin en güçlü yollarından biridir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="matematik" /><category term="algoritma" /><category term="fibonacci" /><category term="yinelemeli ilişkiler" /><category term="python" /><summary type="html"><![CDATA[Bir dizinin sonraki elemanını önceki elemanlardan üretmek oldukça doğaldır. Fibonacci dizisinde yaptığımız gibi iki sayıyı toplar, yenisini buluruz. Fakat doğrudan milyonuncu terim sorulduğunda bu yöntem biraz yorulur. Lineer homojen yinelemeli ilişkiler, dizinin bütün davranışını tek bir formülde yakalamamızı sağlayarak yinelemeyi adeta cebirsel bir kestirme yola dönüştürür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/lineer-homojen-yinelemeli-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/lineer-homojen-yinelemeli-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Antik Dünyadan Rönesans’a: Caesar, Polybius ve Vigenère Şifreleri</title><link href="https://program.sonsuz.us/posts/antik-dunyadan-ronesansa-caesar-polybius-ve-vigen%C3%A8re-sifreleri/" rel="alternate" type="text/html" title="Antik Dünyadan Rönesans’a: Caesar, Polybius ve Vigenère Şifreleri" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/antik-dunyadan-ronesansa-caesar-polybius-ve-vigen%C3%A8re-sifreleri</id><content type="html" xml:base="https://program.sonsuz.us/posts/antik-dunyadan-ronesansa-caesar-polybius-ve-vigen%C3%A8re-sifreleri/"><![CDATA[<p>Günümüzde şifreleme denince akla devasa asal sayılar ve karmaşık algoritmalar geliyor. Oysa kriptografinin temelleri, harfleri kaydırmak veya bir tabloya yerleştirmek kadar basit fikirlerle atıldı. Caesar, Polybius ve Vigenère şifreleri yalnızca tarihî merak konusu değildir; modern şifrelemenin neden anahtar, anahtar uzayı ve istatistiksel direnç gibi kavramlara ihtiyaç duyduğunu gösteren harika laboratuvarlardır.</p>

<p><img src="/img/antik-dunyadan-ronesansa-25.svg" alt="antik-dunyadan-ronesansa-25" /></p>

<p>``</p>
<h2 id="caesar-şifresi-alfabeyi-biraz-kaydıralım">Caesar şifresi: Alfabeyi biraz kaydıralım</h2>

<p>Adını Roma lideri Julius Caesar’dan alan bu yöntemin askerî yazışmalarda kullanıldığı anlatılır. Her harf, alfabede sabit miktarda ileri kaydırılır. Harfleri $0$ ile $25$ arasında numaralandırırsak şifreleme işlemi şöyle gösterilir:</p>

\[E_k(x) = (x + k) \bmod 26\]

<p>Şifreyi çözmek için kaydırma geri alınır:</p>

\[D_k(x) = (x - k) \bmod 26\]

<p>Örneğin $k=3$ olduğunda <code class="language-plaintext highlighter-rouge">ABC</code>, <code class="language-plaintext highlighter-rouge">DEF</code> olur. Fikir zarif olsa da yalnızca 26 olası anahtar vardır. Saldırgan bütün kaydırmaları deneyerek anlamlı sonucu birkaç saniyede bulabilir. Buna <strong>kaba kuvvet saldırısı</strong> denir. Uzun metinlerde en sık görülen harfi dildeki yaygın harflerle karşılaştıran frekans analizi de kullanılabilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">caesar</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="n">kaydirma</span><span class="p">):</span>
    <span class="n">sonuc</span> <span class="o">=</span> <span class="sh">""</span>
    <span class="k">for</span> <span class="n">karakter</span> <span class="ow">in</span> <span class="n">metin</span><span class="p">.</span><span class="nf">upper</span><span class="p">():</span>
        <span class="k">if</span> <span class="sh">"</span><span class="s">A</span><span class="sh">"</span> <span class="o">&lt;=</span> <span class="n">karakter</span> <span class="o">&lt;=</span> <span class="sh">"</span><span class="s">Z</span><span class="sh">"</span><span class="p">:</span>
            <span class="n">kod</span> <span class="o">=</span> <span class="p">(</span><span class="nf">ord</span><span class="p">(</span><span class="n">karakter</span><span class="p">)</span> <span class="o">-</span> <span class="nf">ord</span><span class="p">(</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">)</span> <span class="o">+</span> <span class="n">kaydirma</span><span class="p">)</span> <span class="o">%</span> <span class="mi">26</span>
            <span class="n">sonuc</span> <span class="o">+=</span> <span class="nf">chr</span><span class="p">(</span><span class="n">kod</span> <span class="o">+</span> <span class="nf">ord</span><span class="p">(</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">sonuc</span> <span class="o">+=</span> <span class="n">karakter</span>
    <span class="k">return</span> <span class="n">sonuc</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">caesar</span><span class="p">(</span><span class="sh">"</span><span class="s">KRIPTOGRAFI</span><span class="sh">"</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod, yalnızca Latin alfabesindeki harfleri kaydırır; boşluk ve noktalama işaretlerini korur. Negatif kaydırma verilerek şifre çözme işlemi de yapılabilir.</p>

<h2 id="polybius-karesi-harfler-koordinata-dönüşüyor">Polybius karesi: Harfler koordinata dönüşüyor</h2>

<p>MÖ 2. yüzyılda yaşamış Yunan tarihçi Polybius, karakterleri bir tablo üzerindeki koordinatlarla temsil etti. Klasik $5 \times 5$ karede I ve J aynı hücreyi paylaşır. Örneğin A <code class="language-plaintext highlighter-rouge">11</code>, B <code class="language-plaintext highlighter-rouge">12</code>, F ise <code class="language-plaintext highlighter-rouge">21</code> olarak yazılır.</p>

<p>Bu yaklaşımın önemli özelliği, harfleri sayısal çiftlere dönüştürmesidir. Böylece mesajlar meşale, ses veya işaret kombinasyonlarıyla iletilebilir. Ancak standart kare gizli değilse saldırgan koordinatları doğrudan geri çevirebilir. Karışık anahtarlı bir alfabe kullanılsa bile tek bir harf daima aynı çifte dönüştüğü için frekans analizi hâlâ etkilidir.</p>

<h2 id="vigenère-tek-kaydırma-yetmezse">Vigenère: Tek kaydırma yetmezse</h2>

<ol>
  <li>yüzyılda Blaise de Vigenère ile özdeşleşen bu yöntem, tekrar eden bir anahtar kelime kullanarak her karaktere farklı Caesar kaydırması uygular. Matematiksel olarak:</li>
</ol>

\[C_i = (P_i + K_i) \bmod 26\]

<p><code class="language-plaintext highlighter-rouge">ANAHTAR</code> gibi bir anahtar, mesaj uzunluğunca tekrarlanır. Böylece aynı düz metin harfi farklı konumlarda farklı şifreli harflere dönüşebilir. Bu nedenle Vigenère uzun süre <strong>çözülemez şifre</strong> olarak ün kazandı.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">vigenere_sifrele</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="n">anahtar</span><span class="p">):</span>
    <span class="n">metin</span> <span class="o">=</span> <span class="n">metin</span><span class="p">.</span><span class="nf">upper</span><span class="p">()</span>
    <span class="n">anahtar</span> <span class="o">=</span> <span class="n">anahtar</span><span class="p">.</span><span class="nf">upper</span><span class="p">()</span>
    <span class="n">sonuc</span><span class="p">,</span> <span class="n">sira</span> <span class="o">=</span> <span class="sh">""</span><span class="p">,</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">harf</span> <span class="ow">in</span> <span class="n">metin</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">harf</span><span class="p">.</span><span class="nf">isalpha</span><span class="p">()</span> <span class="ow">and</span> <span class="sh">"</span><span class="s">A</span><span class="sh">"</span> <span class="o">&lt;=</span> <span class="n">harf</span> <span class="o">&lt;=</span> <span class="sh">"</span><span class="s">Z</span><span class="sh">"</span><span class="p">:</span>
            <span class="n">kaydirma</span> <span class="o">=</span> <span class="nf">ord</span><span class="p">(</span><span class="n">anahtar</span><span class="p">[</span><span class="n">sira</span> <span class="o">%</span> <span class="nf">len</span><span class="p">(</span><span class="n">anahtar</span><span class="p">)])</span> <span class="o">-</span> <span class="nf">ord</span><span class="p">(</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">sonuc</span> <span class="o">+=</span> <span class="nf">chr</span><span class="p">((</span><span class="nf">ord</span><span class="p">(</span><span class="n">harf</span><span class="p">)</span> <span class="o">-</span> <span class="nf">ord</span><span class="p">(</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">)</span> <span class="o">+</span> <span class="n">kaydirma</span><span class="p">)</span> <span class="o">%</span> <span class="mi">26</span> <span class="o">+</span> <span class="nf">ord</span><span class="p">(</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">))</span>
            <span class="n">sira</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">sonuc</span> <span class="o">+=</span> <span class="n">harf</span>
    <span class="k">return</span> <span class="n">sonuc</span>
</code></pre></div></div>

<p>Şifrenin zayıf noktası anahtarın tekrarlanmasıdır. <strong>Kasiski incelemesi</strong>, şifreli metindeki yinelenen diziler arasındaki uzaklıkları ölçerek muhtemel anahtar uzunluğunu bulur. Friedman testi ise harflerin çakışma olasılığından yararlanır. Uzunluk belirlendikten sonra metin sütunlara ayrılır ve her sütun ayrı bir Caesar şifresi gibi frekans analiziyle çözülür.</p>

<h2 id="hızlı-karşılaştırma">Hızlı karşılaştırma</h2>

<table>
  <thead>
    <tr>
      <th>Teknik</th>
      <th>Temel fikir</th>
      <th style="text-align: right">Anahtar uzayı</th>
      <th>Başlıca kırılma yöntemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Caesar</td>
      <td>Sabit harf kaydırma</td>
      <td style="text-align: right">Çok küçük</td>
      <td>Kaba kuvvet, frekans analizi</td>
    </tr>
    <tr>
      <td>Polybius</td>
      <td>Harfi koordinata çevirme</td>
      <td style="text-align: right">Kare düzenine bağlı</td>
      <td>Eşleme ve frekans analizi</td>
    </tr>
    <tr>
      <td>Vigenère</td>
      <td>Tekrarlanan çoklu kaydırma</td>
      <td style="text-align: right">Anahtara bağlı</td>
      <td>Kasiski, Friedman, frekans analizi</td>
    </tr>
  </tbody>
</table>

<p>Bu üç yöntem bize önemli bir ders verir: Bir algoritmanın karmaşık görünmesi güvenli olduğu anlamına gelmez. Küçük anahtar uzayı, tekrar eden desenler ve dilin istatistiksel yapısı saldırgana ipucu verir. Yine de bu klasikler, modern kriptografideki saldırı modelini anlamak ve kendi şifre analiz araçlarımızı geliştirmek için vazgeçilmez başlangıç noktalarıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kriptografi" /><category term="caesar" /><category term="polybius" /><category term="vigenère" /><category term="şifreleme" /><category term="siber güvenlik" /><summary type="html"><![CDATA[Günümüzde şifreleme denince akla devasa asal sayılar ve karmaşık algoritmalar geliyor. Oysa kriptografinin temelleri, harfleri kaydırmak veya bir tabloya yerleştirmek kadar basit fikirlerle atıldı. Caesar, Polybius ve Vigenère şifreleri yalnızca tarihî merak konusu değildir; modern şifrelemenin neden anahtar, anahtar uzayı ve istatistiksel direnç gibi kavramlara ihtiyaç duyduğunu gösteren harika laboratuvarlardır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/antik-dunyadan-ronesansa-25.png" /><media:content medium="image" url="https://program.sonsuz.us/img/antik-dunyadan-ronesansa-25.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Armstrong Sayıları: Basamaklardan Doğan Matematiksel Sihir</title><link href="https://program.sonsuz.us/posts/armstrong-sayilari-basamaklardan-dogan-matematiksel-sihir/" rel="alternate" type="text/html" title="Armstrong Sayıları: Basamaklardan Doğan Matematiksel Sihir" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/armstrong-sayilari-basamaklardan-dogan-matematiksel-sihir</id><content type="html" xml:base="https://program.sonsuz.us/posts/armstrong-sayilari-basamaklardan-dogan-matematiksel-sihir/"><![CDATA[<p>Bazı sayılar sıradan görünürken basamaklarına ayrıldıklarında küçük bir matematik gösterisi yapar. Armstrong sayıları da tam olarak bu gruptadır: Her basamağın belirli bir kuvvetini alıp topladığımızda sayının kendisine geri döneriz. Bu özellik hem basamak işlemlerini öğrenmek hem de döngü, fonksiyon ve algoritma karmaşıklığı pratiği yapmak için harika bir bahanedir.
``
Bir sayının Armstrong sayısı olup olmadığını anlamadan önce tanımı netleştirelim. Pozitif bir $n$ sayısının basamak sayısı $k$ ve basamakları $d_1,d_2,\ldots,d_k$ olsun. Eğer</p>

\[n = \sum_{i=1}^{k} d_i^k\]

<p>eşitliği sağlanıyorsa bu sayı bir Armstrong sayısıdır. Bu sayılara <strong>narsistik sayılar</strong> da denir. Buradaki önemli ayrıntı, her basamağın kuvvetinin sayının toplam basamak sayısına eşit olmasıdır.</p>

<p>Örneğin $153$ üç basamaklıdır. Dolayısıyla her basamağın üçüncü kuvveti alınır:</p>

\[1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153\]

<p>Sonuç yine $153$ olduğundan sayı Armstrong özelliği taşır. Buna karşılık $123$ için aynı işlem $1+8+27=36$ sonucunu verir; yani sihir gerçekleşmez.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">Sayı</th>
      <th style="text-align: right">Basamak sayısı</th>
      <th style="text-align: right">Kuvvetler toplamı</th>
      <th style="text-align: center">Armstrong mı?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">153</td>
      <td style="text-align: right">3</td>
      <td style="text-align: right">$1^3+5^3+3^3=153$</td>
      <td style="text-align: center">Evet</td>
    </tr>
    <tr>
      <td style="text-align: right">370</td>
      <td style="text-align: right">3</td>
      <td style="text-align: right">$3^3+7^3+0^3=370$</td>
      <td style="text-align: center">Evet</td>
    </tr>
    <tr>
      <td style="text-align: right">9474</td>
      <td style="text-align: right">4</td>
      <td style="text-align: right">$9^4+4^4+7^4+4^4=9474$</td>
      <td style="text-align: center">Evet</td>
    </tr>
    <tr>
      <td style="text-align: right">123</td>
      <td style="text-align: right">3</td>
      <td style="text-align: right">$1^3+2^3+3^3=36$</td>
      <td style="text-align: center">Hayır</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-tek-sayı-kontrolü">Python ile tek sayı kontrolü</h2>

<p>Sayıyı metne dönüştürmek, basamaklara erişmenin en okunabilir yollarından biridir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">armstrong_mu</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="n">basamaklar</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>
    <span class="n">kuvvet</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">basamaklar</span><span class="p">)</span>

    <span class="n">toplam</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="nf">int</span><span class="p">(</span><span class="n">basamak</span><span class="p">)</span> <span class="o">**</span> <span class="n">kuvvet</span>
                 <span class="k">for</span> <span class="n">basamak</span> <span class="ow">in</span> <span class="n">basamaklar</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">toplam</span> <span class="o">==</span> <span class="n">sayi</span>

<span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">153</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">370</span><span class="p">,</span> <span class="mi">9474</span><span class="p">]:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="nf">armstrong_mu</span><span class="p">(</span><span class="n">sayi</span><span class="p">))</span>
</code></pre></div></div>

<p>Fonksiyon önce basamak sayısını belirler. Ardından her karakteri tekrar tam sayıya çevirir, uygun kuvveti hesaplar ve sonuçları toplar. Son satırda toplam ile başlangıçtaki sayı karşılaştırılır. Böylece kontrol mantığı yeniden kullanılabilir küçük bir fonksiyona dönüşür.</p>

<p>Metin dönüşümü kullanmadan, yalnızca aritmetik işlemlerle de basamakları ayırabiliriz. $n \bmod 10$ son basamağı verirken, $n // 10$ son basamağı sayıdan çıkarır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">aralikta_armstrong</span><span class="p">(</span><span class="n">baslangic</span><span class="p">,</span> <span class="n">bitis</span><span class="p">):</span>
    <span class="n">bulunanlar</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">baslangic</span><span class="p">,</span> <span class="n">bitis</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
        <span class="n">kuvvet</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">sayi</span><span class="p">))</span>
        <span class="n">gecici</span> <span class="o">=</span> <span class="n">sayi</span>
        <span class="n">toplam</span> <span class="o">=</span> <span class="mi">0</span>

        <span class="k">while</span> <span class="n">gecici</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">basamak</span> <span class="o">=</span> <span class="n">gecici</span> <span class="o">%</span> <span class="mi">10</span>
            <span class="n">toplam</span> <span class="o">+=</span> <span class="n">basamak</span> <span class="o">**</span> <span class="n">kuvvet</span>
            <span class="n">gecici</span> <span class="o">//=</span> <span class="mi">10</span>

        <span class="k">if</span> <span class="n">toplam</span> <span class="o">==</span> <span class="n">sayi</span><span class="p">:</span>
            <span class="n">bulunanlar</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>

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

<span class="nf">print</span><span class="p">(</span><span class="nf">aralikta_armstrong</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">))</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">gecici</code> değişkeni önemlidir; doğrudan <code class="language-plaintext highlighter-rouge">sayi</code> üzerinde bölme yapsaydık karşılaştıracağımız özgün değeri kaybederdik. Algoritma, verilen aralıktaki her sayıyı tek tek inceler.</p>

<h2 id="karmaşıklık-ve-optimizasyon">Karmaşıklık ve optimizasyon</h2>

<p>Üst sınır $N$, sayıların ortalama basamak sayısı da $k$ ise yaklaşık zaman karmaşıklığı $O(Nk)$ olur. Küçük aralıklarda bu son derece yeterlidir. Daha büyük aramalarda $0^k$ ile $9^k$ arasındaki sonuçları önceden bir tabloda saklamak, aynı kuvvet hesaplarını tekrar yapmayı önler.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Metne dönüştürme</td>
      <td>Kısa ve okunabilir</td>
      <td>Karakter dönüşümü yapar</td>
    </tr>
    <tr>
      <td>Mod ve bölme</td>
      <td>Sayısal mantığı öğretir</td>
      <td>Biraz daha uzun kodlanır</td>
    </tr>
    <tr>
      <td>Kuvvetleri önbellekleme</td>
      <td>Büyük aralıklarda hız kazandırır</td>
      <td>Ek hazırlık ve bellek ister</td>
    </tr>
  </tbody>
</table>

<p>Aynı şablon; mutlu sayılar, mükemmel sayılar ve rakamları toplamına bölünebilen Harshad sayıları gibi özel sayı problemlerine de uyarlanabilir. Değişen şey çoğunlukla basamaklara uygulanan kuraldır. Kısacası Armstrong sayıları yalnızca matematiksel bir merak değil, problemi parçalama ve temiz fonksiyon tasarlama konusunda eğlenceli bir algoritma laboratuvarıdır.</p>

<p><img src="/img/armstrong-sayilari-basamaklardan-27.svg" alt="armstrong-sayilari-basamaklardan-27" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="armstrong sayıları" /><category term="python" /><category term="algoritma" /><category term="matematik" /><category term="basamak işlemleri" /><category term="özel sayılar" /><summary type="html"><![CDATA[Bazı sayılar sıradan görünürken basamaklarına ayrıldıklarında küçük bir matematik gösterisi yapar. Armstrong sayıları da tam olarak bu gruptadır: Her basamağın belirli bir kuvvetini alıp topladığımızda sayının kendisine geri döneriz. Bu özellik hem basamak işlemlerini öğrenmek hem de döngü, fonksiyon ve algoritma karmaşıklığı pratiği yapmak için harika bir bahanedir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/armstrong-sayilari-basamaklardan-27.png" /><media:content medium="image" url="https://program.sonsuz.us/img/armstrong-sayilari-basamaklardan-27.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bölünebilme Kurallarının Ardındaki Matematik: Kalanlarla Hızlı Hesap</title><link href="https://program.sonsuz.us/posts/bolunebilme-kurallarinin-ardindaki-matematik-kalanlarla-hizli-hesap/" rel="alternate" type="text/html" title="Bölünebilme Kurallarının Ardındaki Matematik: Kalanlarla Hızlı Hesap" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bolunebilme-kurallarinin-ardindaki-matematik-kalanlarla-hizli-hesap</id><content type="html" xml:base="https://program.sonsuz.us/posts/bolunebilme-kurallarinin-ardindaki-matematik-kalanlarla-hizli-hesap/"><![CDATA[<p>Uzun bir sayının 3’e, 7’ye veya 11’e tam bölünüp bölünmediğini anlamak için hemen hesap makinesine uzanmanız gerekmez. Bölünebilme kuralları sihirli kestirmeler gibi görünse de aslında basamak değerleri ve kalanlar üzerine kuruludur. Gelin, ezberlenen kuralların matematik motorunun kapağını açalım.</p>

<p><img src="/img/bolunebilme-kurallarinin-ardindaki-13.svg" alt="bolunebilme-kurallarinin-ardindaki-13" /></p>

<p>``</p>

<h2 id="bölünebilmek-ne-demektir">Bölünebilmek ne demektir?</h2>

<p>Bir $N$ tam sayısı, $d$ sayısına bölündüğünde kalan sıfırsa $d$ ile tam bölünür. Modüler aritmetik dilinde bunu şöyle yazarız:</p>

\[N ≡ 0 \pmod d\]

<p>Örneğin $42 ≡ 0 \pmod 7$ olduğundan 42, 7’ye tam bölünür. Bir sayının ondalık gösterimi ise basamak değerleri kullanılarak açılabilir:</p>

\[N = a_0 + 10a_1 + 10^2a_2 + \cdots + 10^ka_k\]

<p>Bölünebilme kuralları, buradaki $10$, $100$ ve diğer kuvvetlerin ilgili bölen karşısındaki kalanlarını kullanır. Yani mesele rakamları rastgele toplamak değil, onluk sistemin davranışını değerlendirmektir.</p>

<h2 id="yaygın-kurallar-ve-nedenleri">Yaygın kurallar ve nedenleri</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: right">Bölen</th>
      <th>Hızlı kontrol</th>
      <th>Matematiksel fikir</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">2</td>
      <td>Son rakam çifttir.</td>
      <td>$10 ≡ 0 \pmod 2$</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td>Rakamlar toplamı 3’ün katıdır.</td>
      <td>$10 ≡ 1 \pmod 3$</td>
    </tr>
    <tr>
      <td style="text-align: right">4</td>
      <td>Son iki basamak 4’ün katıdır.</td>
      <td>$100 ≡ 0 \pmod 4$</td>
    </tr>
    <tr>
      <td style="text-align: right">5</td>
      <td>Son rakam 0 veya 5’tir.</td>
      <td>Onun katlarının son basamağı belirleyicidir.</td>
    </tr>
    <tr>
      <td style="text-align: right">6</td>
      <td>Sayı hem 2’ye hem 3’e bölünür.</td>
      <td>$6 = 2 \times 3$ ve bölenler aralarında asaldır.</td>
    </tr>
    <tr>
      <td style="text-align: right">8</td>
      <td>Son üç basamak 8’in katıdır.</td>
      <td>$1000 ≡ 0 \pmod 8$</td>
    </tr>
    <tr>
      <td style="text-align: right">9</td>
      <td>Rakamlar toplamı 9’un katıdır.</td>
      <td>$10 ≡ 1 \pmod 9$</td>
    </tr>
    <tr>
      <td style="text-align: right">10</td>
      <td>Son rakam 0’dır.</td>
      <td>$10 ≡ 0 \pmod {10}$</td>
    </tr>
    <tr>
      <td style="text-align: right">11</td>
      <td>Tek ve çift sıralı rakam toplamlarının farkı 11’in katıdır.</td>
      <td>$10 ≡ -1 \pmod {11}$</td>
    </tr>
  </tbody>
</table>

<h3 id="neden-rakamları-topluyoruz">Neden rakamları topluyoruz?</h3>

<p>$5832$ sayısını ele alalım. Çünkü $10 ≡ 1 \pmod 3$ olduğundan, 10’un bütün pozitif kuvvetleri de 3’e göre 1 kalanını verir:</p>

\[5832 ≡ 5 + 8 + 3 + 2 = 18 ≡ 0 \pmod 3\]

<p>Dolayısıyla sayı 3’e bölünür. Aynı mantık 9 için de geçerlidir. Bu nedenle rakamlar toplamı yöntemi yalnızca pratik bir numara değil, basamak açılımının doğrudan sonucudur.</p>

<h2 id="11-kuralındaki-işaret-değiştirme">11 kuralındaki işaret değiştirme</h2>

<p>$10 ≡ -1 \pmod {11}$ olduğu için kuvvetler sırayla $1, -1, 1, -1$ biçiminde ilerler. Örneğin 2728 için dönüşümlü toplamı hesaplayalım:</p>

\[8 - 2 + 7 - 2 = 11\]

<p>Sonuç 11’in katı olduğu için 2728 de 11’e tam bölünür. Bir bakıma rakamlar matematiksel bir tahterevalliye oturur; denge 11’in katında kurulursa test başarıyla tamamlanır.</p>

<h2 id="peki-ya-7">Peki ya 7?</h2>

<p>7 kuralı biraz daha afacan görünür: Son rakamın iki katını, kalan sayıdan çıkarın. Elde edilen sonuç 7’nin katıysa başlangıçtaki sayı da 7’nin katıdır. Örneğin 203 için:</p>

\[20 - 2 \times 3 = 14\]

<p>14, 7’ye bölündüğünden 203 de bölünür. Bu işlem gerekirse sonuç küçülene kadar tekrarlanabilir.</p>

<h2 id="kuralları-kodlamak">Kuralları kodlamak</h2>

<p>Aşağıdaki Python fonksiyonu, seçilen bölen için anlaşılır kontroller uygular. Böylece kuralların bir algoritmaya nasıl dönüştüğünü görebiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">bolunur_mu</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="n">bolen</span><span class="p">):</span>
    <span class="n">rakamlar</span> <span class="o">=</span> <span class="p">[</span><span class="nf">int</span><span class="p">(</span><span class="n">rakam</span><span class="p">)</span> <span class="k">for</span> <span class="n">rakam</span> <span class="ow">in</span> <span class="nf">str</span><span class="p">(</span><span class="nf">abs</span><span class="p">(</span><span class="n">sayi</span><span class="p">))]</span>

    <span class="k">if</span> <span class="n">bolen</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">9</span><span class="p">):</span>
        <span class="k">return</span> <span class="nf">sum</span><span class="p">(</span><span class="n">rakamlar</span><span class="p">)</span> <span class="o">%</span> <span class="n">bolen</span> <span class="o">==</span> <span class="mi">0</span>
    <span class="k">if</span> <span class="n">bolen</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
        <span class="k">return</span> <span class="nf">abs</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span> <span class="o">%</span> <span class="mi">100</span> <span class="o">%</span> <span class="mi">4</span> <span class="o">==</span> <span class="mi">0</span>
    <span class="k">if</span> <span class="n">bolen</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span>
        <span class="k">return</span> <span class="nf">abs</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span> <span class="o">%</span> <span class="mi">1000</span> <span class="o">%</span> <span class="mi">8</span> <span class="o">==</span> <span class="mi">0</span>
    <span class="k">if</span> <span class="n">bolen</span> <span class="o">==</span> <span class="mi">11</span><span class="p">:</span>
        <span class="n">fark</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">rakamlar</span><span class="p">[::</span><span class="mi">2</span><span class="p">])</span> <span class="o">-</span> <span class="nf">sum</span><span class="p">(</span><span class="n">rakamlar</span><span class="p">[</span><span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">])</span>
        <span class="k">return</span> <span class="n">fark</span> <span class="o">%</span> <span class="mi">11</span> <span class="o">==</span> <span class="mi">0</span>

    <span class="k">return</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">bolen</span> <span class="o">==</span> <span class="mi">0</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">bolunur_mu</span><span class="p">(</span><span class="mi">2728</span><span class="p">,</span> <span class="mi">11</span><span class="p">))</span>  <span class="c1"># True
</span></code></pre></div></div>

<p>Kod, 3 ve 9 için rakamları toplar; 4 ve 8 için yalnızca gerekli son basamakları inceler. Genel durumda ise doğrudan kalan operatörünü kullanır.</p>

<p>Bölünebilme kuralları, zihinden hesaplamayı hızlandırmanın ötesinde modüler aritmetiği somutlaştırır. Kuralları ezberlemek işe yarar; fakat neden çalıştıklarını bilmek, yeni bölenler için kendi yöntemlerinizi geliştirmenizi sağlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="matematik" /><category term="bölünebilme" /><category term="modüler aritmetik" /><category term="algoritma" /><category term="python" /><summary type="html"><![CDATA[Uzun bir sayının 3’e, 7’ye veya 11’e tam bölünüp bölünmediğini anlamak için hemen hesap makinesine uzanmanız gerekmez. Bölünebilme kuralları sihirli kestirmeler gibi görünse de aslında basamak değerleri ve kalanlar üzerine kuruludur. Gelin, ezberlenen kuralların matematik motorunun kapağını açalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bolunebilme-kurallarinin-ardindaki-13.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bolunebilme-kurallarinin-ardindaki-13.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Catalan Sayıları: Parantezlerden İkili Ağaçlara Uzanan Sayma Macerası</title><link href="https://program.sonsuz.us/posts/catalan-sayilari-parantezlerden-ikili-agaclara-uzanan-sayma-macerasi/" rel="alternate" type="text/html" title="Catalan Sayıları: Parantezlerden İkili Ağaçlara Uzanan Sayma Macerası" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/catalan-sayilari-parantezlerden-ikili-agaclara-uzanan-sayma-macerasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/catalan-sayilari-parantezlerden-ikili-agaclara-uzanan-sayma-macerasi/"><![CDATA[<p>Bazı sayı dizileri matematiğin gizli aktörleri gibidir: Farklı görünen problemlerde tekrar tekrar sahneye çıkarlar. Catalan sayıları da dengeli parantezlerden çokgenlere, ikili arama ağaçlarından dağ yollarına kadar şaşırtıcı sayıda yapıyı sayar. İlk terimleri $1, 1, 2, 5, 14, 42, 132$ olan bu dizi, “Kaç farklı geçerli yapı oluşturabilirim?” sorusunun en renkli cevaplarından biridir.
``</p>

<h2 id="catalan-sayısının-matematiksel-tanımı">Catalan sayısının matematiksel tanımı</h2>

<p>Sıfırıncı Catalan sayısı $C_0=1$ kabul edilir. Genel formül şöyledir:</p>

\[C_n = \frac{1}{n+1}\binom{2n}{n} = \frac{(2n)!}{(n+1)!n!}\]

<p>Buradaki merkezi binom katsayısı, $2n$ konum içinden $n$ tanesini seçer. Ancak seçilen her dizilim geçerli değildir. Örneğin açılan parantez sayısının hiçbir noktada kapanan parantez sayısından az olmaması gerekir. Formüldeki $n+1$ bölümü, bu geçersiz düzenlemeleri ayıklayan kombinatorik düzeltmedir.</p>

<p>Catalan sayıları özyinelemeli olarak da hesaplanabilir:</p>

\[C_{n+1}=\sum_{i=0}^{n} C_iC_{n-i}\]

<p>Bu bağıntının arkasındaki fikir bölüp birleştirmedir. Bir yapı kökünden iki parçaya ayrılıyorsa sol tarafta $i$, sağ tarafta $n-i$ eleman bulunabilir. Olasılıkların çarpılması ve bütün bölünmelerin toplanması Catalan sonucunu verir.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">$n$</th>
      <th style="text-align: right">$C_n$</th>
      <th style="text-align: right">Dengeli parantez çifti sayısı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">0</td>
      <td style="text-align: right">1</td>
      <td style="text-align: right">Boş dizi</td>
    </tr>
    <tr>
      <td style="text-align: right">1</td>
      <td style="text-align: right">1</td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">()</code></td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right"><code class="language-plaintext highlighter-rouge">(())</code>, <code class="language-plaintext highlighter-rouge">()()</code></td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td style="text-align: right">5</td>
      <td style="text-align: right">Beş farklı dizilim</td>
    </tr>
    <tr>
      <td style="text-align: right">4</td>
      <td style="text-align: right">14</td>
      <td style="text-align: right">On dört farklı dizilim</td>
    </tr>
  </tbody>
</table>

<h2 id="dengeli-parantezler-neden-catalan-sayısıdır">Dengeli parantezler neden Catalan sayısıdır?</h2>

<p>$n$ çift açma ve kapama parantezi içeren bir dizide toplam $2n$ karakter vardır. Geçerli bir dizilim iki kurala uyar:</p>

<ol>
  <li>Toplam açma ve kapama parantezi sayıları eşittir.</li>
  <li>Soldan sağa ilerlerken kapanan parantez sayısı, açılanlardan fazla olamaz.</li>
</ol>

<p>Örneğin <code class="language-plaintext highlighter-rouge">(()())</code> geçerliyken <code class="language-plaintext highlighter-rouge">())(()</code> geçersizdir. İkinci dizi toplamda eşit sayıda parantez içerse bile üçüncü karakterde henüz açılmamış bir parantezi kapatmaya çalışır. Matematik bile “Önce aç, sonra kapat!” der.</p>

<h2 id="i̇kili-ağaçlarla-bağlantısı">İkili ağaçlarla bağlantısı</h2>

<p>$n$ düğümlü farklı ikili ağaç biçimlerinin sayısı da $C_n$ değeridir. Kök düğümü seçtikten sonra kalan düğümler sol ve sağ alt ağaçlar arasında dağıtılır. Sol alt ağaçta $i$ düğüm varsa sağ tarafta $n-1-i$ düğüm bulunur.</p>

<table>
  <thead>
    <tr>
      <th>Problem</th>
      <th>Ayrıştırma biçimi</th>
      <th style="text-align: right">Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dengeli parantez</td>
      <td>Dış parantezin içi ve sonrası</td>
      <td style="text-align: right">$C_n$</td>
    </tr>
    <tr>
      <td>İkili ağaç</td>
      <td>Sol ve sağ alt ağaç</td>
      <td style="text-align: right">$C_n$</td>
    </tr>
    <tr>
      <td>Çokgen üçgenleme</td>
      <td>Seçilen üçgenin iki yanı</td>
      <td style="text-align: right">$C_{n-2}$</td>
    </tr>
    <tr>
      <td>Izgara yolu</td>
      <td>Köşegeni aşmayan yollar</td>
      <td style="text-align: right">$C_n$</td>
    </tr>
  </tbody>
</table>

<p>Aynı sayıların ortaya çıkmasının nedeni, bu problemlerin yüzeyde farklı olsa da aynı özyinelemeli bölünme yapısını taşımasıdır.</p>

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

<p>Aşağıdaki dinamik programlama yaklaşımı, özyinelemeli bağıntıyı kullanır. <code class="language-plaintext highlighter-rouge">dp[k]</code>, $k$ boyutundaki yapıların sayısını saklar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">catalan</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="n">dp</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
    <span class="n">dp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>

    <span class="k">for</span> <span class="n">boyut</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">sol</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">boyut</span><span class="p">):</span>
            <span class="n">sag</span> <span class="o">=</span> <span class="n">boyut</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">sol</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">boyut</span><span class="p">]</span> <span class="o">+=</span> <span class="n">dp</span><span class="p">[</span><span class="n">sol</span><span class="p">]</span> <span class="o">*</span> <span class="n">dp</span><span class="p">[</span><span class="n">sag</span><span class="p">]</span>

    <span class="k">return</span> <span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>

<span class="nf">print</span><span class="p">([</span><span class="nf">catalan</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">8</span><span class="p">)])</span>
<span class="c1"># [1, 1, 2, 5, 14, 42, 132, 429]
</span></code></pre></div></div>

<p>Algoritmanın zaman karmaşıklığı $O(n^2)$, alan karmaşıklığı ise $O(n)$ olur. Yalnızca tek bir $C_n$ değeri gerekiyorsa faktöriyel formülü daha hızlı olabilir; dinamik programlama ise dizinin tüm ara terimlerini üretmek ve mantığı görmek için daha öğreticidir.</p>

<p>Catalan sayıları, farklı problemlerin ortak matematiksel iskeletini fark etmenin harika bir örneğidir. Bir soruda dengeli parantez, ikili ağaç, köşegeni aşmayan yol veya çokgen üçgenleme görürseniz, sahne arkasında bir Catalan sayısının kostümünü giymekte olabileceğini unutmayın.</p>

<p><img src="/img/catalan-sayilari-parantezlerden-39.svg" alt="catalan-sayilari-parantezlerden-39" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="catalan sayıları" /><category term="kombinatorik" /><category term="algoritma" /><category term="dinamik programlama" /><category term="ikili ağaç" /><category term="python" /><summary type="html"><![CDATA[Bazı sayı dizileri matematiğin gizli aktörleri gibidir: Farklı görünen problemlerde tekrar tekrar sahneye çıkarlar. Catalan sayıları da dengeli parantezlerden çokgenlere, ikili arama ağaçlarından dağ yollarına kadar şaşırtıcı sayıda yapıyı sayar. İlk terimleri $1, 1, 2, 5, 14, 42, 132$ olan bu dizi, “Kaç farklı geçerli yapı oluşturabilirim?” sorusunun en renkli cevaplarından biridir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/catalan-sayilari-parantezlerden-39.png" /><media:content medium="image" url="https://program.sonsuz.us/img/catalan-sayilari-parantezlerden-39.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Çinlilerin Kalan Teoremi: Parçalı Bilgiden Tek Bir Sayıya</title><link href="https://program.sonsuz.us/posts/cinlilerin-kalan-teoremi-parcali-bilgiden-tek-bir-sayiya/" rel="alternate" type="text/html" title="Çinlilerin Kalan Teoremi: Parçalı Bilgiden Tek Bir Sayıya" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/cinlilerin-kalan-teoremi-parcali-bilgiden-tek-bir-sayiya</id><content type="html" xml:base="https://program.sonsuz.us/posts/cinlilerin-kalan-teoremi-parcali-bilgiden-tek-bir-sayiya/"><![CDATA[<p>Bir sayıyı doğrudan bilmiyor, fakat farklı sayılara bölündüğünde bıraktığı kalanları biliyor olabilirsiniz. İlk bakışta bu bilgiler ayrı yapboz parçaları gibi görünür. Çinlilerin Kalan Teoremi, modüller uygun olduğunda bütün parçaları birleştirerek tek ve tutarlı bir çözüm üretir. Üstelik bu çözüm yalnızca teorik bir merak değildir; kriptografi, takvim hesapları, paralel işlem ve bilgisayar aritmetiğinde karşımıza çıkar.</p>

<p>``</p>

<h2 id="temel-fikir-aynı-sayı-farklı-saatler">Temel fikir: Aynı sayı, farklı saatler</h2>

<p>Modüler aritmetiği farklı büyüklüklerde çalışan saatlere benzetebiliriz. Örneğin</p>

\[x \equiv 2 \pmod{3}\]

<p>ifadesi, $x$ sayısının 3’e bölündüğünde 2 kalanını verdiğini söyler. Benzer biçimde şu sistemi ele alalım:</p>

\[x \equiv 2 \pmod{3}, \qquad
x \equiv 3 \pmod{5}, \qquad
x \equiv 2 \pmod{7}\]

<p>Burada aynı $x$, üç farklı modüler saatte belirli konumlara gelmektedir. Modüller olan 3, 5 ve 7 ikişer ikişer aralarında asaldır. Yani her farklı çift için $\gcd(m_i,m_j)=1$ koşulu sağlanır.</p>

<p>Çinlilerin Kalan Teoremi şunu garanti eder: Modüller ikişer ikişer aralarında asalsa sistemin, modüllerin çarpımına göre tek bir çözüm sınıfı vardır.</p>

\[M=m_1m_2\cdots m_k\]

<p>Başka bir deyişle çözüm $M$ aralığında benzersizdir; fakat tam sayılarda sonsuz kez tekrar eder.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Anlamı</th>
      <th style="text-align: right">Örnekteki değeri</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$a_i$</td>
      <td>İstenen kalan</td>
      <td style="text-align: right">2, 3, 2</td>
    </tr>
    <tr>
      <td>$m_i$</td>
      <td>Modül</td>
      <td style="text-align: right">3, 5, 7</td>
    </tr>
    <tr>
      <td>$M$</td>
      <td>Tüm modüllerin çarpımı</td>
      <td style="text-align: right">105</td>
    </tr>
    <tr>
      <td>Çözüm sınıfı</td>
      <td>Eşdeğer bütün sayılar</td>
      <td style="text-align: right">$23+105k$</td>
    </tr>
  </tbody>
</table>

<h2 id="çözüm-nasıl-inşa-edilir">Çözüm nasıl inşa edilir?</h2>

<p>Her denklem için toplam çarpımdan ilgili modülü çıkaran bir parça oluşturulur:</p>

\[M_i=\frac{M}{m_i}\]

<p>Ardından $M_i$ sayısının $m_i$ modülündeki çarpımsal tersi bulunur. Bu ters $y_i$ ile gösterilirse</p>

\[M_i y_i \equiv 1 \pmod{m_i}\]

<p>olmalıdır. Son çözüm şu formülle birleştirilir:</p>

\[x \equiv \sum_{i=1}^{k} a_iM_iy_i \pmod{M}\]

<p>Örneğimizde $M=105$ olur. Parçalar sırasıyla 35, 21 ve 15’tir. Bunların ilgili modüllerdeki tersleri 2, 1 ve 1 olarak bulunur. Dolayısıyla</p>

\[x \equiv 2\cdot35\cdot2+3\cdot21\cdot1+2\cdot15\cdot1=233 \pmod{105}\]

<p>elde edilir. $233$ sayısının 105’e göre kalanı 23 olduğundan en küçük pozitif çözüm $x=23$’tür. Gerçekten de 23; 3’e bölününce 2, 5’e bölününce 3 ve 7’ye bölününce 2 kalanını verir.</p>

<h2 id="python-ile-genel-çözüm">Python ile genel çözüm</h2>

<p>Aşağıdaki fonksiyon, modüllerin bağımsızlığını kontrol eder ve yapıcı formülü uygular. <code class="language-plaintext highlighter-rouge">pow(Mi, -1, mi)</code> ifadesi Python’da modüler tersi hesaplar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">math</span> <span class="kn">import</span> <span class="n">gcd</span><span class="p">,</span> <span class="n">prod</span>

<span class="k">def</span> <span class="nf">crt</span><span class="p">(</span><span class="n">kalanlar</span><span class="p">,</span> <span class="n">moduller</span><span class="p">):</span>
    <span class="c1"># Modüllerin ikişer ikişer aralarında asal olduğunu doğrula.
</span>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">moduller</span><span class="p">)):</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">moduller</span><span class="p">)):</span>
            <span class="k">if</span> <span class="nf">gcd</span><span class="p">(</span><span class="n">moduller</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">moduller</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
                <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">'</span><span class="s">Modüller aralarında asal değil</span><span class="sh">'</span><span class="p">)</span>

    <span class="n">M</span> <span class="o">=</span> <span class="nf">prod</span><span class="p">(</span><span class="n">moduller</span><span class="p">)</span>
    <span class="n">toplam</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">ai</span><span class="p">,</span> <span class="n">mi</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">kalanlar</span><span class="p">,</span> <span class="n">moduller</span><span class="p">):</span>
        <span class="n">Mi</span> <span class="o">=</span> <span class="n">M</span> <span class="o">//</span> <span class="n">mi</span>
        <span class="n">ters</span> <span class="o">=</span> <span class="nf">pow</span><span class="p">(</span><span class="n">Mi</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">mi</span><span class="p">)</span>
        <span class="n">toplam</span> <span class="o">+=</span> <span class="n">ai</span> <span class="o">*</span> <span class="n">Mi</span> <span class="o">*</span> <span class="n">ters</span>

    <span class="k">return</span> <span class="n">toplam</span> <span class="o">%</span> <span class="n">M</span><span class="p">,</span> <span class="n">M</span>

<span class="n">cozum</span><span class="p">,</span> <span class="n">periyot</span> <span class="o">=</span> <span class="nf">crt</span><span class="p">([</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">])</span>
<span class="nf">print</span><span class="p">(</span><span class="n">cozum</span><span class="p">,</span> <span class="n">periyot</span><span class="p">)</span>  <span class="c1"># 23 105
</span></code></pre></div></div>

<p>Fonksiyon <code class="language-plaintext highlighter-rouge">(23, 105)</code> döndürür. Bu sonuç yalnızca 23’ü değil, $x=23+105k$ biçimindeki bütün çözümleri temsil eder.</p>

<h2 id="modüller-aralarında-asal-değilse">Modüller aralarında asal değilse</h2>

<p>Teoremin klasik biçimi doğrudan uygulanamaz; ancak sistem mutlaka çözümsüz değildir. İki denklem için kalanların $\gcd(m_1,m_2)$ modülünde uyumlu olması gerekir. Örneğin $x\equiv1\pmod4$ ve $x\equiv3\pmod6$ sistemi uyumludur; fakat $x\equiv1\pmod4$ ve $x\equiv2\pmod6$ değildir. Kısacası CRT, farklı modüler dünyaların aynı sayıda buluşabilmesi için güçlü ve zarif bir köprü kurar.</p>

<p><img src="/img/cinlilerin-kalan-teoremi-86.svg" alt="cinlilerin-kalan-teoremi-86" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="çinlilerin kalan teoremi" /><category term="modüler aritmetik" /><category term="sayı teorisi" /><category term="matematik" /><category term="python" /><category term="algoritma" /><summary type="html"><![CDATA[Bir sayıyı doğrudan bilmiyor, fakat farklı sayılara bölündüğünde bıraktığı kalanları biliyor olabilirsiniz. İlk bakışta bu bilgiler ayrı yapboz parçaları gibi görünür. Çinlilerin Kalan Teoremi, modüller uygun olduğunda bütün parçaları birleştirerek tek ve tutarlı bir çözüm üretir. Üstelik bu çözüm yalnızca teorik bir merak değildir; kriptografi, takvim hesapları, paralel işlem ve bilgisayar aritmetiğinde karşımıza çıkar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/cinlilerin-kalan-teoremi-86.png" /><media:content medium="image" url="https://program.sonsuz.us/img/cinlilerin-kalan-teoremi-86.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>