Python Altın Oran Matematik Problemi

Merhabalar,

Fibonacci serileriyle alakalı alternatif bir yöntemden bahsedeyim.

Bu serisinin fonksiyonel ifadesini Jacques Philippe Marie Binet 1843’te şöyle vermiş:

Fibonacci serisinde n. sırada yer alan sayı, altın oranın köklerinin n. kuvvetlerinin farkının, köklerin kendilerinin farkına olan bölümüne eşittir.

Yani, altın oran (Φ) diye bir irrasyonel sayı ve bu irrasyonel sayının x1 ve x2 diye iki tane kökü var. Bu kökleri bulup, istenen fonksiyonu f(n) = (x1 ** n - x2 ** n) / (x1 - x2) cinsinden yazıp, n. sırada yer alan fibonacci sayısını bulabiliriz.

Altın oran ne diyordu bize?

a > b > 0 durumunda; a'nın b'ye olan oranı, a+b'nin a'ya olan oranına eşitse, a ve b arasında altın oran vardır. Yani;

Φ = a/b = (a+b)/a

Yukardaki formüldeki (a+b)/a ifadesini açacak olsak, şöyle yazamaz mıydık?

(a/a) + (b/a)

a/a da 1'e eşit olur bu durumda. Formül de şöyle değişmez mi?

Φ = a/b = 1+b/a

Madem a/b, altın orana eşit o halde b/a için 1/Φ yazıp formülü yeniden düzenleyelim:

Φ = 1 + 1/Φ

İşte bir denklem elde ettik. Bu denklemi biraz daha değiştiriyorum.

Φ ** 2 - Φ - 1 = 0

Evet, lise zamanlarından aşina olduğumuz bir denkleme benzettik.

Hatırlarsanız, bir denklemin köklerini bulmak için deltayı (Δ) bulmamız lazımdı. Δ'nın formülünü hatırlayalım:

ax^2 + bx + c = 0 denklemi için Δ:

delta = b ** 2 - 4 * a * c

Bir denklemin kökleri nasıl bulunuyordu hatırlayalım:

x1 = (-b + delta ** 0.5) / (2 * a)
x2 = (-b - delta ** 0.5) / (2 * a)

Son elde ettiğimiz denklem şuydu: Φ ** 2 - Φ - 1 = 0. Bu ifadedeki a, b ve c değerleri şöyledir:
a = 1, b = -1, c=-1.

Bu değerleri yerlerine koyarsanız kökler şu sayılara eşit oluyor. x1 = ((1 + 5 ** 0.5) / 2) ve x2 = ((1 - 5 ** 0.5) / 2).

Yukardaki ifadeleri hesaplayacak olursak, x1'in 1.618033988749895... sayısına, x2'nin de -0.6180339887498949... sayısına eşit olduğunu buluruz.

O halde f(n) fonksiyonunu yeniden düzenleyelim:

f(n) = (x1 ** n - x2 ** n) / (x1 - x2) fonksiyonunda yer alan x1 ve x2 parametreleri yerine yeni bulduğumuz değerleri yazarsak, formül şu hale gelir.

f(n) = (((1 + 5 ** 0.5) / 2) ** n - ((1 - 5 ** 0.5) / 2) ** n) / (((1 + 5 ** 0.5) / 2) - ((1 - 5 ** 0.5) / 2))

Bu ifadenin Python dilindeki karşılığı aşağıdaki gibidir:

def nth_fib(n): return (x1 ** n - x2 ** n) / (x1 - x2) if (x1 := (1 + 5 ** 0.5) / 2, x2 := (1 - 5 ** 0.5) / 2) else 0


print(nth_fib(2) / nth_fib(1))
print(nth_fib(3) / nth_fib(2))
print(nth_fib(4) / nth_fib(3))
print(nth_fib(5) / nth_fib(4))
print(nth_fib(100) / nth_fib(99))
print(nth_fib(1000) / nth_fib(999))

İyi çalışmalar.