Python 59 bayt
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Bu 1000 basamak basar; gerekli olandan biraz daha fazla 5. Öngörülen yinelemeyi kullanmak yerine, bunu kullanır:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
6637
(En iç payda) şeklinde formüle edilebilir:
basamak * 2 * günlük 2 (10)
Bu doğrusal bir yakınsama anlamına gelir. Her derin yineleme bir ikili pi daha üretecektir .
Bununla birlikte, tan -1 kimliğinikullanmakta ısrar ederseniz ,sorunu biraz farklı bir şekilde ele almayı düşünmezseniz, benzer bir yakınsama elde edilebilir. Kısmi miktarlara göz atmak:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
her terimin yakınsama noktasının her iki tarafına ileri geri atladığı açıktır; dizinin dönüşümlü yakınsaması var. Ayrıca, her terim yakınsama noktasına bir önceki terimden daha yakındır; yakınsama noktasına göre kesinlikle tekdüzedir. Bu iki özelliğin kombinasyonu, iki komşu terimin aritmetik ortalamasının yakınsama noktasına her iki terimin kendisinden daha yakın olduğu anlamına gelir. Ne demek istediğimle ilgili daha iyi bir fikir vermek için aşağıdaki resmi göz önünde bulundurun:
Dış seri orijinaldir ve iç seri komşu terimlerin her birinin ortalaması alınarak bulunur. Dikkat çekici bir fark. Ama gerçekten dikkat çekici olan, bu yeni dizinin de alternatif yakınsamaya sahip olması ve yakınsama noktasına göre kesinlikle tekdüze olması. Bu, bu sürecin tekrar tekrar uygulanabileceği anlamına gelir, ad nauseum.
Tamam. Ama nasıl?
Bazı resmi tanımlar. Let p 1 (n) olması , n inci birinci dizisinin terimi p 2 (n) olması , n inci ikinci sekans terimi ve benzer şekilde p k (n) n, inci terimi k inci yukarıda tanımlandığı gibi sekans .
P 1 = [P 1 (1), P 1 (2), P 1 (3), P 1 (4), P 1 (5), ...]
P 2 = [(P 1 (1) + P 1 (2)) / 2, (P 1 (2) + P 1 (3)) / 2, (P 1 (3) + P 1 (4)) / 2, (P 1 (4) + P 1 (5)) / 2, ...]
P 3 = [(P 1 (1) + 2P 1 (2) + P 1 (3)) / 4, (P 1 (2) + 2P 1 (3) + P 1 (4)) / 4, (P 1 (3) + 2P 1 (4) + P 1 (5)) / 4, ...]
P 4 = [(P 1 (1) + 3P 1 (2) + 3P 1 (3) + P 1 (4)) / 8, (P 1 (2) + 3P 1 (3) + 3P 1 (4) + P 1 (5)) / 8, ...]
Şaşırtıcı olmayan bir şekilde, bu katsayılar tam olarak binom katsayılarını takip eder ve Pascal Üçgeni'nin tek bir sırası olarak ifade edilebilir. Pascal Üçgeni'nin rasgele bir sıra hesaplamak için önemsiz olduğu için, bir isteğe bağlı olarak 'derin' serisi bulunabilir, sadece birinci alarak n karşılık gelen terimi ile çarpın her kısmi miktarda, k inci Pascal Triangle satır ve bölünerek 2 k-1 .
Bu şekilde, tam 32 bit kayan nokta hassasiyeti (~ 14 ondalık basamak) yalnızca 36 yineleme ile elde edilebilir, bu noktada kısmi toplamlar ikinci ondalık basamakta bile yakınsamaz. Açıkçası bu golf değil:
# used for pascal's triangle
t = 36; v = 1.0/(1<<t-1); e = 1
# used for the partial sums of pi
p = 4; d = 3; s = -4.0
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print "%.14f"%x
Rastgele bir hassasiyet istiyorsanız, bu küçük bir değişiklikle elde edilebilir. Burada bir kez daha 1000 basamak hesaplanıyor:
# used for pascal's triangle
f = t = 3318; v = 1; e = 1
# used for the partial sums of pi
p = 4096*10**999; d = 3; s = -p
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print x>>f+9
Başlangıç değeri p başlar 2 10 arasında bir tamsayıdır bölme etkilerini ortadan kaldırmak için, daha büyük bir s / d olarak d yakınsama son birkaç basamak neden daha büyük olur. Yine burada 3318
da dikkat edin :
basamak * log 2 (10)
İteratations aynı sayıda birinci algoritma (nedeniyle yarıya t azalır 1 yerine 2 her bir tekrar). Bir kez daha, bu doğrusal bir yakınsamayı gösterir: yineleme başına bir ikili bit pi . Her iki durumda da, 5 basamaklı pi hesaplamak için 3318 iterasyon, 5 hesaplamak için 1 milyon iterasyondan biraz daha iyi kota olarak gereklidir .
p=lambda:3.14159