Terinspirasi oleh video Seri Infinite ini .
pengantar
Pi didefinisikan sebagai rasio keliling dengan diameter lingkaran. Tetapi bagaimana sebuah lingkaran didefinisikan? Biasanya sebuah lingkaran didefinisikan sebagai titik-titik dengan jarak konstan ke titik tengah (mari kita asumsikan bahwa pusat berada pada (0,0)
). Pertanyaan selanjutnya adalah: Bagaimana kita menentukan jarak ? Berikut ini kami sedang mempertimbangkan gagasan jarak yang berbeda (diinduksi oleh Lp
-norms):
Diberi norma (= sesuatu yang mengukur panjang ) kita dapat dengan mudah membuat jarak (= jarak antara dua titik) sebagai berikut:
dist(A,B) := norm (A-B)
Norma euclidean diberikan oleh:
norm((x,y)) = (x^2 + y^2)^(1/2)
Ini juga disebut norma-L2 . Norma Lp lainnya dibangun dengan mengganti 2
rumus di atas dengan nilai lain antara 1 dan tak hingga:
norm_p((x,y)) = (|x|^p + |y|^p)^(1/p)
Lingkaran unit untuk norma-norma yang berbeda memiliki bentuk yang sangat berbeda:
Tantangan
Diberikan a p >= 1
, hitung rasio keliling terhadap diameter lingkaran-Lp sehubungan dengan Lp
-norm dengan akurasi empat angka signifikan.
Testcases
Kita bisa menggunakannya untuk p,q
dengan 1 = 1/p + 1/q
kita mendapatkan rasio yang sama untuk Lp
serta Lq
norma. Selanjutnya untuk p = q = 2
rasionya minimal, dan untuk p = 1, q = infinity
kita dapatkan rasio 4, sehingga rasio selalu antara pi
dan 4
.
p or q ratio
1 infinity 4
2 2 3.141592
1.623 2.60513 3.200
1.5 3 3.25976
4 1.33333 3.39693
A = πr²
) tidak berlaku untukp ≠ 2
Jawaban:
Python + scipy, 92 byte
Formula berasal dari pertanyaan math.SE ini .
sumber
x=1
, bagaimana kiriman Anda lakukan?MATL , 31 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Ini menghasilkan koordinat x , y dari seperempat lingkaran unit yang diambil sampelnya pada 1001 poin dengan langkah 0,001 dalam x . Panjang seperempat lingkaran didekati oleh garis poligon yang melewati titik-titik tersebut; yaitu jumlah dari panjang 1000 segmen. Panjangnya tentu saja dihitung menurut
p
-norm. Mengalikan hasilnya dengan 2 memberikan perkiraan panjang setengah lingkaran, yaitu, pi.sumber
Mathematica,
4946 byte3 byte disimpan karena alephalpha .
Fungsi anonim. Mengambil nomor sebagai input dan mengembalikan nomor sebagai output.
sumber
2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&
PARI / GP,
4843 byteMudah setelah @orlp menemukan formula, dan versi @ alephalpha menghemat 5 byte:
Untuk menambahkan sesuatu yang sedikit berguna, mari kita hitung
p
yang kita dapat3.2
:Penggunaan yang benar
Sementara kode memberikan hasil yang jauh lebih tepat daripada permintaan tantangan, kode dapat dengan mudah ditingkatkan banyak: jika kita mengganti batas integrasi atas
1
dengan[1,1/p-1]
(memberikan apa yang manual sebut sebagai eksponen singularitas) maka semua angka yang ditampilkanf(2)
setuju denganPi
. Ini masih benar jika kita meningkatkan presisi hingga 100 (tipe\p100
).Namun, setelah perubahan bahwa
solve
perhitungan tidak lagi bekerja. Saya mengubah istilah dalam untuk secara eksplisit menangani kasus iniu=0
dan juga mengubah ke komputer yang berbeda dengan versi PARI yang lebih baru dan 64 bit (yang menyiratkan presisi standar yang lebih tinggi).Ini adalah perhitungan peningkatan
p
nilai untukPi=3.2
, dan mari kita lihat Pi nyata:sumber
p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))
JavaScript (ES7), 80 byte
Berdasarkan jawaban orlp . Implementasi JS ini cukup lambat. Anda mungkin ingin mencoba
i=1e-7
(atau bahkan lebih tinggi) untuk perkiraan yang lebih cepat.Catatan : Ini pada dasarnya hanya ditujukan untuk Chrome dan Edge. Versi ES6 yang setara menggunakan
Math.pow()
Firefox 50.1 tampaknya jauh lebih lambat.Sunting : Menurut Neil, ini juga akan berfungsi dengan baik di Firefox 52.
sumber