Büyük Sayılarda Faktöriyel Nasıl Hesaplanır? (BigInt)
10! bile 3.628.800 gibi 7 basamaklı bir sayıya ulaşır; 20!'de bu 19 basamağa, 100!'de ise tam 158 basamağa çıkar. Bu noktada JavaScript'in standart sayı tipi (Number) artık güvenilir değildir. Bu rehberde neden güvenilmediğini, hangi n değerinden itibaren sorun başladığını ve BigInt ile bu sorunun nasıl tamamen çözüldüğünü kod örnekleriyle anlatıyoruz.
Büyük faktöriyellerde neden sorun yaşanır?
Bu hızlı büyümenin sebebi, faktöriyeldeki her yeni çarpanın kendisinden bir öncekinden büyük olmasıdır. Örneğin 2^n gibi bir üstel fonksiyonda her adımda sabit bir sayı (2) ile çarparsınız; faktöriyelde ise her adımda çarpan da büyür (n ile). Bu fark, faktöriyeli matematikte "süper-üstel" (super-exponential) büyüme sınıfına sokar ve n=20 civarından itibaren sonuçları sıradan sayı tipleri için "büyük sayı" (big number) statüsüne taşır.
Number'ın sınırı: 19! ve 171!
Bu iki eşiği ayırt etmek önemlidir çünkü aralarında ciddi bir fark vardır:
- 19!'den itibaren (hassasiyet kaybı): Sonuç hâlâ sonlu bir sayı olarak görünür, hatta ilk birkaç basamağı doğru bile olabilir — ama son basamaklarda görünmez yuvarlama hataları oluşur. Bu en tehlikeli durumdur çünkü hata fark edilmeden geçebilir.
- 171!'den itibaren (taşma / overflow): Sonuç artık bir sayı bile değildir; JavaScript doğrudan
Infinitydöndürür. Hata bariz olduğu için fark edilmesi daha kolaydır, ama artık hiçbir bilgi taşımaz.
BigInt nedir, faktöriyelde nasıl kullanılır?
BigInt, sayıyı ondalık yerine bilgisayar belleğinde bir dizi (array) hâlinde, gerektiği kadar basamakla saklar. Bu sayede boyut teorik olarak yalnızca kullanılabilir bellekle sınırlıdır — 2^53 gibi katı bir eşik yoktur. Karşılığında, BigInt işlemleri normal Number işlemlerinden biraz daha yavaştır çünkü donanım seviyesinde doğrudan desteklenmez; yazılımsal olarak simüle edilir. Ancak faktöriyel gibi n<1000 mertebesindeki hesaplamalarda bu fark milisaniyeler seviyesinde kalır ve pratikte hissedilmez.
Kod örneği: BigInt ile faktöriyel fonksiyonu
Aşağıdaki fonksiyon, n! değerini BigInt kullanarak kesin olarak hesaplar. Dikkat edilmesi gereken tek nokta, döngüdeki sayaç ve başlangıç değerinin de BigInt (n harfi ile) olmasıdır — Number ile BigInt birbirine doğrudan karıştırılamaz:
function faktoriyelBigInt(n) {
let sonuc = 1n; // başlangıç: 0!=1
for (let i = 2n; i <= BigInt(n); i++) {
sonuc *= i;
}
return sonuc; // BigInt sonucu döner
}
// Örnek kullanım
faktoriyelBigInt(19); // 121645100408832000n — tam ve kesin
faktoriyelBigInt(50); // 65 basamaklı, kesin sonuç
Sonuç bir BigInt olduğundan ekranda göstermeden önce .toString() ile metne çevrilmeli; Number'a dönüştürülürse (Number(sonuc)) hassasiyet yeniden kaybedilir.
BigInt hesaplamayı kendiniz deneyin
1'den 1000'e kadar herhangi bir n için BigInt ile üretilmiş tam sonuç, basamak sayısı ve bilimsel gösterim — hepsi saniyeler içinde ve ücretsiz.
Faktöriyel Hesapla →Number vs BigInt karşılaştırma tablosu
Aşağıdaki tablo, faktöriyel büyüdükçe hassasiyetin nerede kaybolmaya başladığını ve sonunda taşmanın nerede gerçekleştiğini gösterir:
| n | Basamak sayısı | Number ile durum |
|---|---|---|
| 15! | 13 | Kesin (güvenli aralıkta) |
| 18! | 16 | Kesin (sınıra yakın) |
| 19! | 18 | Hassasiyet kaybı başlar |
| 25! | 26 | Yuvarlanmış, yanlış son basamaklar |
| 100! | 158 | Yuvarlanmış, çoğu basamak hatalı |
| 170! | 307 | Sonlu ama tamamen yuvarlanmış |
| 171! | 310 | Taşar → Infinity |
Basamak sayıları BigInt ile kesin hesaplanmıştır. "Kesin" sütunundaki değerler, karşılaştırma için 0!-12! tam değer tablosunu içeren "Faktöriyel Nedir?" rehberiyle tutarlıdır.
Görüldüğü gibi hassasiyet kaybı ile taşma arasında geniş bir bölge vardır (19!-170!): bu aralıkta Number sonuçları hâlâ "bir sayı" gibi görünür, hatalı olduklarını fark etmek zordur. Bu yüzden faktöriyel gibi hızlı büyüyen işlemlerde n bilinmeden önce her zaman BigInt kullanmak en güvenli yaklaşımdır. Faktöriyelin permütasyon ve kombinasyon gibi nerelerde kullanıldığını görmek isterseniz "Faktöriyelin Matematikte Kullanım Alanları" rehberine göz atabilirsiniz.
1000! gibi çok büyük değerler pratikte neden gerekir?
1000! gibi devasa değerler günlük hayatta doğrudan karşımıza çıkmasa da; kriptografi, olasılık teorisi, büyük kombinatorik problemler (ör. 1000 elemanlı bir kümenin olası tüm sıralamaları) ve sayı teorisi araştırmalarında kesin faktöriyel değerlerine ihtiyaç duyulur. BigInt olmadan bu hesaplamalar ya yapılamaz ya da yalnızca yaklaşık (Stirling) değerlerle yetinilir.