Read this in English
Bu proje, Fibonacci serisinin belirli bir sayıya kadar olan çift sayılarının toplamını hesaplayan bir Python komut satırı uygulamasıdır.
Not: Bu proje, Başkent Üniversitesi BİL458 - Bulut Çözüme Giriş dersinin ödevi için Hüseyin ASLIM tarafından kodlanmıştır.
- Python 3.6 veya daha yüksek bir sürüm
- Herhangi bir ek kütüphane gerektirmez (sadece standart Python kütüphaneleri kullanılmaktadır)
Fibonacci serisi, her sayının kendisinden önceki iki sayının toplamı olduğu bir sayı dizisidir. Seri genellikle 0 ve 1 ile başlar:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
Bu projede, belirli bir N sayısına kadar olan Fibonacci serisindeki çift sayıların toplamını hesaplıyoruz.
# Repoyu klonlayın
git clone https://github.com/huseyinaslim/fibonacci-even-sum.git
cd fibonacci-even-sum
# Çalıştırma izni verin (Unix/Linux/MacOS)
chmod +x fibonacci_even_sum.py# PyPI'dan kurulum
pip install fibonacci-even-sumBu komut, en son sürümü PyPI'dan indirir ve kurar. Kurulumdan sonra, fibonacci-even-sum komutunu doğrudan kullanabilirsiniz:
fibonacci-even-sum 100pip install fibonacci-even-sum==1.0.0pip install -e .Bu komut, projeyi geliştirme modunda kurar, böylece kodda yaptığınız değişiklikler anında etkili olur.
Programı aşağıdaki gibi çalıştırabilirsiniz:
# Kurulumdan sonra komut satırı aracı olarak
fibonacci-even-sum Nveya Python modülü olarak:
# Modül olarak çalıştırma
python -m fibonacci_even_sum NBurada N, Fibonacci serisinin üst sınır değeridir.
Farklı algoritmaları kullanmak için:
# Doğrudan yöntem kullanarak hesapla
fibonacci-even-sum N --direct
# Düzeltilmiş formül kullanarak hesapla
fibonacci-even-sum N --formulaAlgoritmaların performans karşılaştırmasını görmek için:
fibonacci-even-sum N --comparefibonacci-even-sum 100Bu komut, 100'e kadar olan Fibonacci serisindeki çift sayıların toplamını hesaplayacaktır.
Bu proje, tüm algoritmaların doğru çalıştığını doğrulamak için unit testler içermektedir. Testleri çalıştırmak için:
# Modül olarak çalıştırma
python -m fibonacci_even_sum.test_fibonacci_even_sumveya doğrudan test dosyasını çalıştırarak:
# Doğrudan çalıştırma
python fibonacci_even_sum/test_fibonacci_even_sum.pyTestler şu senaryoları içermektedir:
- Küçük Değerler Testi: 0, 1, 2, 8, 10, 34 ve 100 gibi küçük değerler için tüm algoritmaların doğru sonuç verdiğini kontrol eder.
- Orta Büyüklükte Değer Testi: 4.000.000 değeri için tüm algoritmaların doğru sonuç verdiğini kontrol eder.
- Büyük Değer Testi: 10^18 (1.000.000.000.000.000.000) gibi büyük bir değer için tüm algoritmaların aynı sonucu verdiğini kontrol eder.
- Negatif Değer Testi: Negatif değerler için tüm algoritmaların 0 döndürdüğünü kontrol eder.
Bu projede, Fibonacci serisinin çift sayılarının toplamını hesaplamak için dört farklı algoritma kullanılmıştır:
- Orijinal Algoritma: Tüm Fibonacci sayılarını hesaplar ve çift olanları toplar.
- Optimize Edilmiş Algoritma: Fibonacci serisinde her 3. sayının çift olduğu gerçeğinden yararlanarak, sadece çift Fibonacci sayılarını hesaplar.
- Doğrudan Yöntem: Standart Fibonacci hesaplamasını kullanır, ancak sadece çift sayıları toplar.
- Düzeltilmiş Formül: İteratif bir yaklaşımla çift Fibonacci sayılarını hesaplar.
Aşağıdaki performans karşılaştırması, belirtilen donanım ve yazılım konfigürasyonunda gerçekleştirilmiştir:
Sistem Bilgileri:
- İşlemci: Apple M1
- Bellek: 8 GB RAM
- İşletim Sistemi: macOS Darwin 24.3.0
- Python Sürümü: Python 3.11.0
N = 10.000.000.000.000.000.000 için performans karşılaştırması:
| Algoritma | Çalışma Süresi (saniye) | Hızlanma Oranı |
|---|---|---|
| Optimize Edilmiş Algoritma | 0.00000286 | 2.17x |
| Orijinal Algoritma | 0.00000620 | 1.00x |
| Doğrudan Yöntem | 0.00000715 | 0.87x |
| Düzeltilmiş Formül | 0.00000787 | 0.79x |
Optimize edilmiş algoritma, orijinal algoritmadan yaklaşık 2.17 kat daha hızlıdır. Doğrudan yöntem ve düzeltilmiş formül, bu test durumunda orijinal algoritmadan biraz daha yavaştır.
Tüm algoritmalar aynı sonucu vermektedir: 3.770.056.902.373.173.214
Fibonacci serisinde çift sayılar arasında çeşitli matematiksel ilişkiler vardır. Bu projede kullanılan dört farklı algoritmanın matematiksel temelleri şöyledir:
Bu algoritma, standart Fibonacci hesaplamasını kullanır ve her adımda sayının çift olup olmadığını kontrol eder:
a, b = 1, 2
total = 0
while b <= n:
if b % 2 == 0:
total += b
a, b = b, a + bZaman karmaşıklığı: O(log n), çünkü Fibonacci sayıları yaklaşık olarak φ^n hızında büyür (φ altın oran, yaklaşık 1.618).
Fibonacci serisinde her 3. sayının çift olduğu matematiksel bir gerçektir. Ayrıca, çift Fibonacci sayıları arasında şu ilişki vardır:
F(n+6) = 4*F(n+3) + F(n)
Sadeleştirirsek:
F(n+3) = 4*F(n) + F(n-3)
Bu ilişkiyi kullanarak, sadece çift Fibonacci sayılarını hesaplayabiliriz:
a, b = 0, 2 # İlk çift Fibonacci sayısı 2'dir
total = 0
while b <= n:
total += b
a, b = b, 4*b + a # F(n+3) = 4*F(n) + F(n-3)Zaman karmaşıklığı: O(log n / 3), çünkü sadece her 3. Fibonacci sayısını hesaplıyoruz.
Bu yöntem, standart Fibonacci hesaplamasını kullanır, ancak üç sayıyı takip ederek her adımda bir sonraki Fibonacci sayısını hesaplar:
a, b, c = 1, 1, 2 # F(1), F(2), F(3)
total = 0
while c <= n:
if c % 2 == 0: # Çift sayı kontrolü
total += c
a, b, c = b, c, b + cZaman karmaşıklığı: O(log n), orijinal algoritma ile aynıdır.
Bu yöntem, Fibonacci sayılarının genel formülünü kullanmak yerine, iteratif bir yaklaşımla çift Fibonacci sayılarını hesaplar:
f1, f2, f3 = 1, 1, 2 # F(1), F(2), F(3)
total = 0
while f3 <= n:
if f3 % 2 == 0: # Çift sayı kontrolü
total += f3
f1, f2, f3 = f2, f3, f2 + f3Zaman karmaşıklığı: O(log n), diğer iteratif yöntemlerle aynıdır.
Fibonacci sayılarını hesaplamak için kapalı bir formül olan Binet formülü şöyledir:
F(n) = (φ^n - (-φ)^(-n)) / √5
Burada φ = (1 + √5) / 2 ≈ 1.618 (altın oran) ve n, Fibonacci sayısının indeksidir.
Bu formül, büyük Fibonacci sayılarını doğrudan hesaplamak için kullanılabilir, ancak büyük n değerleri için hassasiyet sorunları yaşanabilir.
N = 10için çıktı: 10 (2 + 8 = 10)N = 34için çıktı: 44 (2 + 8 + 34 = 44)N = 100için çıktı: 44 (2 + 8 + 34 = 44)N = 4000000için çıktı: 4613732 (2 + 8 + 34 + 144 + 610 + 2584 + 10946 + 46368 + 196418 + 832040 + 3524578 = 4613732)
Bu proje MIT lisansı altında lisanslanmıştır. Daha fazla bilgi için LICENSE dosyasına bakın.