Pi hesaplamamın doğru olup olmadığını nasıl belirlerim?


772

Pi rakamlarını sırayla veren bir programı uygulamak için çeşitli yöntemler deniyordum. Taylor serisi yöntemini denedim , ancak son derece yavaş bir şekilde birleştiğini kanıtladım (bir süre sonra sonucumu çevrimiçi değerlerle karşılaştırdığımda). Her neyse, daha iyi algoritmalar deniyorum.

Yani, programı yazarken tüm algoritmalarda olduğu gibi bir probleme takıldım: Hesapladığım nrakamların doğru olduğunu nasıl bilebilirim ?


20
daha çok matematiksel bir problem. iyi algoritmalar da hatanın bir tahminini verir.
örnek

35
Pi ile karşılaştır?
Dave Newton

55
@chris: "Kelimenin tam anlamıyla her yerde" mi?
Yörüngedeki Hafiflik Yarışları

32
Sizi 3.141592653589793238462643383279502'ye kadar kontrol edebilirim, bunun ötesinde neden bu kadar çok basamağa ihtiyacınız var? (Bu, evrenin büyüklüğünde bir daire ile atom düzeyinde doğruluk gibi bir şeydir.)
AJ Henderson

65
Neden sadece pi'ye bölüp sonucun 1 olup olmadığını kontrol etmiyorsun? (Şaka yapıyorum)
user541686

Yanıtlar:


1629

Pi'nin en çok rakamı için dünya rekoru sahibi olduğum için, iki sentimi ekleyeceğim :

Aslında yeni bir dünya rekoru ayarlamadığınız sürece, yaygın uygulama sadece hesaplanan rakamları bilinen değerlere göre doğrulamaktır. Yani bu yeterince basit.

Aslında, onlara karşı hesaplamaları doğrulamak için basamak parçacıklarını listeleyen bir web sayfam var: http://www.numberworld.org/digits/Pi/


Ancak dünya rekoru kıran bölgeye girdiğinizde, karşılaştırılacak bir şey yok.

Tarihsel olarak, hesaplanan basamakların doğru olduğunu doğrulamak için standart yaklaşım, basamakları ikinci bir algoritma kullanarak yeniden hesaplamaktır. Dolayısıyla, hesaplamalardan biri kötüye giderse, sondaki rakamlar eşleşmez.

Bu genellikle gereken sürenin iki katından fazlasını yapar (çünkü ikinci algoritma genellikle daha yavaştır). Ancak, daha önce hiç hesaplanmayan rakamlar ve yeni bir dünya rekorunun keşfedilmemiş topraklarına girdikten sonra hesaplanan rakamları doğrulamanın tek yolu budur.


Süper bilgisayarların rekoru kırdığı günlerde, iki farklı AGM algoritması yaygın olarak kullanıldı:

Her ikisi de O(N log(N)^2)uygulanması oldukça kolay olan algoritmalardır.

Ancak, günümüzde işler biraz farklı. Son üç dünya rekorunda , iki hesaplama yapmak yerine, bilinen en hızlı formülü ( Chudnovsky Formula ) kullanarak sadece bir hesaplama gerçekleştirdik :

Resim açıklamasını buraya girin

Bu algoritmanın uygulanması çok daha zordur, ancak AGM algoritmalarından çok daha hızlıdır.

Ardından , basamak çıkarma için BBP formüllerini kullanarak ikili basamakları doğrularız .

Resim açıklamasını buraya girin

Bu formül Eğer keyfi ikili basamak hesaplamak olanak vermeden bundan önceki bütün rakamları hesaplama. Bu nedenle, hesaplanan son birkaç ikili rakamı doğrulamak için kullanılır. Bu nedenle tam bir hesaplamadan çok daha hızlıdır.

Bunun avantajı:

  1. Sadece bir pahalı hesaplamaya ihtiyaç vardır.

Dezavantajı:

  1. Bir uygulaması Bailey-Borwein-Plouffe (BBP) formül gereklidir.
  2. İkili sayıdan ondalığa sayı tabanı dönüşümünü doğrulamak için ek bir adım gereklidir.

Son birkaç basamağı doğrulamanın neden tüm basamakların doğru olduğunu ima ettiğinin bazı ayrıntılarını açıkladım. Ancak bunu görmek kolaydır, çünkü herhangi bir hesaplama hatası son rakamlara yayılır.


Şimdi bu son adım (dönüşümü doğrulama) aslında oldukça önemlidir. Önceki dünya rekortmenlerinden biri aslında bizi bu konuda çağırdı , çünkü başlangıçta, nasıl çalıştığına dair yeterli bir açıklama vermedim.

Bu pasajı blogumdan aldım:

N = # of decimal digits desired
p = 64-bit prime number

Resim açıklamasını buraya girin

Temel 10 aritmetik kullanarak A ve ikili aritmetik kullanarak B hesaplayın.

Resim açıklamasını buraya girin

Eğer A = B"son derece yüksek olasılık" ile dönüşüm doğruysa.


Daha fazla bilgi için, blog yazım Pi - 5 Trilyon Basamak bölümüne bakınız .


15
Ve belirli bir algoritmanın N rakamına ne zaman dönüştüğünü bilmekle ilgili diğer soruyu cevaplamak için: Bu, algoritmanın yakınsama davranışını bilmenizi gerektirir. Taylor Serisi ArcTan(1)logaritmik olarak yakınsaktır. Bu nedenle yakınsama için katlanarak çok sayıda terime ihtiyacınız olacaktır - kısacası kullanmayın.
Gizemli

21
Evet, Chudnovsky'nin formülü her terim için sabit bir 14.18 basamakla birleşiyor. Böylece, kaç terime ihtiyacınız olduğunu toplam basamak sayısına bölebilirsiniz. (Tam değerdir: Log(151931373056000)/Log(10) = 14.181647462725477655...)
Mysticial

7
@ erikb85 Kinda. BBP formülü (bir dereceye kadar) ikinci bir algoritma olarak sayılır. Ancak, temel 10'a dönüşümü doğrulamadığı için tek başına yeterli değildir. İkinci bir hesaplama ihtiyacını ortadan kaldırmak için BBP + dönüşüm kontrolü kullanma fikri benim değildi. İlk kez 2009 dünya rekorunda Fabrice Bellard tarafından yapıldı. Öyle iyi bir fikirdi ki, aynısını yaptık ve geliştirdik.
Gizemli

83
@FunsukWangadu Sadece kendim için konuşabiliyorum, ama işte gidiyor: Pi'nin kendisini hiç umursamadım. Bana göre, bu sadece başka bir sayı. Değer, sayının kendisinde veya 10 terabaytlık işe yaramaz basamakta değil, bunu elde etmek için kullanılan yöntemlerdir . Yüzyıllar süren matematik ve bu başarıya katkıda bulunan onlarca yıllık bilgisayar / programlama araştırması diğer birçok alan için de geçerlidir ve bu nedenle rakamların sabit diskinden çok daha değerlidir. Basitçe söylemek gerekirse: Pi rakamlarını hesaplamak daha çok bir spordur.
Gizemli

8
@Mystical, sadece başka adresinin Pi hesaplama sitesinde tökezledi stackoverflow soru ve siz yaptığına yardım ancak gawk ve kıkırdama yapamadı. Günlükler sabit disk hataları / depremler ekledi :) saf şaşırtıcı!
Joe

48

Şüphesiz, amaçlarınız için (ki bu sadece bir programlama alıştırmasıdır), en iyi şey, sonuçlarınızı web üzerindeki pi rakamlarının herhangi bir listesiyle karşılaştırmaktır.

Ve bu değerlerin doğru olduğunu nasıl bilebiliriz? Bir algoritmanın uygulanmasının doğru olduğunu kanıtlamanın bilgisayar-bilim-y yolları olduğunu söyleyebilirim.

Daha pragmatik olarak, eğer farklı insanlar farklı algoritmalar kullanıyorlarsa ve hepsi binleri (milyon, her ne olursa olsun) bin ondalık basamak kabul etmeyi kabul ederse, bu size doğru bulduklarına dair sıcak bir bulanıklık hissi vermelidir.

Tarihsel olarak, William Shanks 1873'te pi'yi 707 ondalık basamağa yayınladı. Zavallı adam, 528 ondalık basamağından başlayarak bir hata yaptı.

Çok ilginç bir şekilde, 1995 yılında , önceki tüm basamakları hesaplamak zorunda kalmadan pi'nin n. Basamağını (taban 16) doğrudan hesaplayacak özelliğe sahip bir algoritma yayınlandı !

Son olarak, umarım ilk algoritmanız bu değildi pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...Programlamak için en basit olabilir, ama aynı zamanda bunu yapmanın en yavaş yollarından biri. Daha hızlı yaklaşımlar için Wikipedia hakkındaki pi makalesine göz atın .


7
Bu son formül (Leibniz formülü, iirc) aslında toplama ve çıkartmayı değiştirir.
Thomas

21

Birden fazla yaklaşım kullanabilir ve aynı cevaba yaklaşıp yaklaşmadıklarını görebilirsiniz. Ya da 'net'ten biraz al. Chudnovsky algoritması genellikle pi hesaplamak için çok hızlı bir yöntem olarak kullanılır. http://www.craig-wood.com/nick/articles/pi-chudnovsky/


Şansı azaltır, ancak her ikisi de yanlışsa, çoklu yaklaşım çözümünden hala emin olamıyorum. Net üzerinde kontrol geçerlilik taşımaz, neden değerleri netin kendisinden çıkarmıyorsunuz? Hangisi daha uygun bbp düşünüyorum?
Ishan Sharma

7
@IshanSharma İki algoritma bağımsızsa, her iki hesaplamanın da aynı sonuçlarla yanlış olma olasılığı hemen hemen sıfırdır. Her iki hesaplamada da bir şeyler ters giderse, nihai sonuçlar eşleşmez - bu nedenle bunlardan en az birinin yanlış olduğunu bilirsiniz.
Gizemli

15

Taylor serisi pi'ye yaklaşmanın bir yoludur. Belirtildiği gibi yavaşça yakınsar.

Taylor serisinin kısmi toplamlarının, pi'nin gerçek değerinden uzak bir sonraki terimin bir çarpanı içinde olduğu gösterilebilir.

Pi'ye yaklaştırmanın diğer yolları, maksimum hatayı hesaplamak için benzer yollara sahiptir.

Bunu biliyoruz çünkü matematiksel olarak ispatlayabiliriz.


Destekliyorum. Bence buradaki cevapların çoğu matematiksel kanıt kavramına neredeyse yeterince ağırlık vermiyor . Programınız pi basamaklarını hesaplamak için ne olursa olsun, programınızın yönteminin gerçekten pi hesapladığı en ikna edici matematiksel kanıttan daha ikna edici olmayacaktır. Bu, pi'yi pi hesaplayan programlar üzerinde farklı bir kısıtlama önermektedir: performans ve doğruluk kadar anlaşılabilirlik için hedef almaları gerekir .
Luis Casillas

5

Günah ve cos için (oldukça) hızlı bir şekilde birbirine geçen güç serilerini kullanarak hesaplamayı sin(pi/2)(veya cos(pi/2)bu konuda) deneyebilirsiniz . (Daha da iyisi: daha x=0hızlı yakınsama için daha yakın hesaplamak için çeşitli iki katlama formülleri kullanın .)

BTW, serisi kullanmaktan daha iyidir tan(x), bilgisayarla cos(x)kara kutu olarak (örneğin yukarıdaki gibi taylor serisini kullanabilirsiniz) Newton ile kök bulma yapmaktır. Kesinlikle daha iyi algoritmalar var, ancak tonlarca rakamı doğrulamak istemiyorsanız, bu yeterli olmalıdır (ve uygulanması zor değildir ve neden işe yaradığını anlamak için sadece biraz hesaplamaya ihtiyacınız vardır.)


6
1000'inci basamağın 1 ile kapandığını nasıl anlayacağımı pek görmüyorum. Çok kesin değerlere ihtiyacınız sin(pi/2)olur mu?
Matthieu M.13

Şaka falan olmadığı sürece önceki cevap hakkında ne söyleyeceğimi bilmiyorum. sin (pi / 2) = 1 cos (pi / 2) = 0 Bu yüzden, eminim ki bu kadar hızlı birleşirler.
BentFranklin

15
Değerlendirme sin(x)ve cos(x)yüksek hassasiyetin aslında Pi'nin kendisini hesaplamaktan çok daha zor olduğu herkes için açık değil .
Gizemli

2
Açık nedenlerden dolayı, bunun için günah (pi / 2) kullanmamalısınız. Bunun yerine günah (pi / 6) kullanmak ve tam olarak 1/2 olduğundan emin olmak daha iyidir.
Robert Lozyniak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.