Iterasi Bailey – Borwein – Plouffe
Kami telah melihat beberapa tantangan pi pada PPCG, tetapi tidak ada yang secara khusus menentukan algoritma yang harus Anda gunakan. Saya ingin melihat implementasi dari algoritma Bailey – Borwein-Plouffe dalam bahasa apa pun hingga iterasi n
. Rumusnya adalah sebagai berikut:
Algoritme Anda harus menampilkan setiap iterasi hingga n, menunjukkan jumlah menengah serta hasil akhir untuk membentuk "persekongkolan". Anda juga dapat menggunakan bentuk polinomial tereduksi dari algoritma yang ditunjukkan pada halaman wikipedia. Contoh run for n=50
ditunjukkan di bawah ini:
3
3.1
3.14
3.141
3.1415
3.14159
3.141592
3.1415926
3.14159265
3.141592653
3.1415926535
3.14159265358
3.141592653589
3.1415926535897
3.14159265358979
3.141592653589793
3.1415926535897932
3.14159265358979323
3.141592653589793238
3.1415926535897932384
3.14159265358979323846
3.141592653589793238462
3.1415926535897932384626
3.14159265358979323846264
3.141592653589793238462643
3.1415926535897932384626433
3.14159265358979323846264338
3.141592653589793238462643383
3.1415926535897932384626433832
3.14159265358979323846264338327
3.141592653589793238462643383279
3.1415926535897932384626433832795
3.14159265358979323846264338327950
3.141592653589793238462643383279502
3.1415926535897932384626433832795028
3.14159265358979323846264338327950288
3.141592653589793238462643383279502884
3.1415926535897932384626433832795028841
3.14159265358979323846264338327950288419
3.141592653589793238462643383279502884197
3.1415926535897932384626433832795028841971
3.14159265358979323846264338327950288419716
3.141592653589793238462643383279502884197169
3.1415926535897932384626433832795028841971693
3.14159265358979323846264338327950288419716939
3.141592653589793238462643383279502884197169399
3.1415926535897932384626433832795028841971693993
3.14159265358979323846264338327950288419716939937
3.141592653589793238462643383279502884197169399375
3.1415926535897932384626433832795028841971693993751
3.14159265358979323846264338327950288419716939937510
Ketepatan setiap iterasi harus sama dengan n
yang diteruskan ke algoritma, yaitu mengatakan bahwa setiap iterasi harus menghitung pi hingga lulus n
untuk semua k
.
Aturan:
- Built-in tidak diperbolehkan, Anda juga tidak
pi
harus menggunakan rumus. - Anda harus mendukung
n
hingga maksimum yang memungkinkan bahasa Anda dalam hal perhitungan16^n
. Jika input menyebabkan overflow aritmatika selama perhitungan setelahx<n
eksekusi karena bahasa Anda hanya mendukung desimal2^32-1
, ini tidak masalah. Asumsi lain apa pun padan
tidak baik. - Anda HARUS memberikan penjelasan tentang bagaimana Anda mendapatkan output jika tidak jelas. Misalnya, jika Anda memposting dalam bahasa Golf, break-down diperlukan 100%. Ini untuk memastikan Anda menggunakan algoritma yang ditentukan.
- Lubang loop standar tidak diizinkan.
- Ini adalah kode-golf, jumlah byte terendah yang menang di sini.
Kode Referensi (Kode yang digunakan untuk Menghasilkan Contoh):
public static void main(String[] args) {
(0..50).each {
n->
def x=(0..n).collect {
j->
def k=new BigDecimal(j)
def s={it.setScale(n)}
def a=s(1.0g).divide(s(16.0g)**s(k))
def b=s(4.0g)/(s(8.0g)*s(k)+s(1.0g))
def c=s(2.0g)/(s(8.0g)*s(k)+s(4.0g))
def d=s(1.0g)/(s(8.0g)*s(k)+s(5.0g))
def e=s(1.0g)/(s(8.0g)*s(k)+s(6.0g))
def f=a*(b-c-d-e)
}.sum()
println(n + "\t" + x.setScale(n, BigDecimal.ROUND_DOWN))
}
}
Implementasi ini berakhir pada n=255
, Anda dapat membatalkan kurang atau lebih.
Implementasi ini dilakukan di Groovy.
Calculate foo via x method
tantangan.Jawaban:
05AB1E ,
635250 byteFormula spesialisasi
Cobalah online!
Formula BBP
Cobalah online!
sumber
Python 2,
109108 byteUji di Ideone .
sumber
Python 2, 174 Bytes
Sobat, ini adalah waktu ketika saya berharap bahwa Python memiliki cara yang lebih mudah untuk menjaga ketelitian tak terbatas untuk desimal. Mungkin menerapkan tipe ketelitian infite Anda sendiri untuk tantangan ini lebih pendek tapi saya tidak bisa membayangkan bagaimana caranya. Rumusnya ditulis kata demi kata.
Contoh output untuk
n=100
(dengan beberapa nomor baris yang ditambahkan):Ini tampaknya berfungsi untuk angka yang lebih besar,
n=1000
berjalan dalam beberapa detik dann=10000
tampaknya belum memberi saya kesalahan apa pun!sumber
Haskell,
101100 byteTerima kasih kepada @nimi untuk satu byte.
Implementasi langsung. Menghitung
n
hingga 15 digit (standar presisi ganda).sumber
l<-[8*fromIntegral k]
bukannyalet ...
menyimpan satu byte.J,
736462 byteIni menghasilkan setiap pendekatan ke n digit sebagai string yang diformat. Ini menggunakan penyederhanaan polinomial rumus dan mendapatkan n digit pertama dengan mengalikan penjumlahannya dengan pangkat 10, memberinya dasar, dan membaginya dengan pangkat 10 yang sama.
Input diambil sebagai integer yang diperluas, yang berarti bahwa rasional digunakan ketika pembagian terjadi yang membuat hasil tetap tepat.
Pemakaian
Ini adalah output untuk n = 100, yang menunjukkan jumlah kumulatif untuk k dalam [0, 100].
Penjelasan
Pertama buat kisaran [0, n ], ditunjukkan untuk n = 5
Kalikan masing-masing dengan 8
Bentuk tabel tambahan di antara
[1, 4, 5, 6]
dan produk dengan 8Bagilah setiap baris dengan
[4, 2, -1, 1]
Kemudian kurangi kolom dari bawah ke atas menggunakan pengurangan
Bagilah masing-masing 16 k untuk k dalam [0, n ] dengan setiap hasil
Temukan jumlah kumulatif
Hitung 10 k untuk k di [0, n ] dan kalikan dengan masing-masing
Kemudian lantai setiap produk
Membaginya dengan kekuatan 10 yang sama untuk mendapatkan hasil
sumber
PARI / GP, 86 byte
Atau tanpa titik desimal dalam 69 byte :
Daripada membaginya dengan 16 k setiap iterasi, nilai p sebelumnya malah dikalikan dengan 16 . Lantai p ÷ (8/5) k kemudian nilai π terpotong dengan jumlah digit yang benar.
Contoh Penggunaan
sumber
C GCC, 118 byte
Golf:
Tidak Terkumpul:
Untuk mengubah n, cukup ubah while (k <15) ke while (k <n)
keluaran:
presisi maksimum adalah 15 tempat desimal, saya bisa meningkatkan ke nilai apa pun dengan gmp, tapi mungkin hari pi berikutnya: P
dengan cetakan cantik, 143 byte
Golf:
Tidak Terkumpul:
keluaran:
sumber
IBM / Lotus Notes Formula, 125 byte
Formula dalam bidang yang dihitung dengan bidang lain yang disebut "a" untuk input.
Pada dasarnya port algoritma dari jawaban Python dari @shebang. Menghitung hingga 15 digit setelah itu terpotong karena keterbatasan bahasa (lihat output). Harus buang 12 byte dengan pernyataan @f pada akhirnya hanya untuk menyingkirkan. setelah 3 di awal: - /
Tidak disatukan
sumber
C #, 183 byte
Golf:
Tidak Terkumpul:
sumber
3.14159265358979
untuk setiapn >= 14
karena presisi ganda?APL (NARS), 206 karakter, 412 byte
Ini menemukan semua approssimation dalam rasional besar, daripada menggunakan satu fungsi yang mengkonversi rasional besar dalam string numerik ... test:
sumber