P i = = 3。2


37

このInfinite Seriesのビデオに触発されました。

前書き

円周率は、円の直径に対する円周の比率として定義されます。しかし、円はどのように定義されますか?通常、円は中心点までの距離が一定の点として定義されます(中心がにあると仮定します(0,0))。次の質問は、距離をどのように定義するかです。以下では、距離の異なる概念(Lp-norms によって誘導される)を検討しています。

ノルム(= 長さを測定するもの)が与えられると、次のように距離(= 2点間の距離)を簡単に構築できます。

dist(A,B) := norm (A-B)

ユークリッドノルムは次の式で与えられます。

norm((x,y)) = (x^2 + y^2)^(1/2)

これはL2-normとも呼ばれます。他のLpノルム2、上記の式の1から無限大までの他の値で置き換えることにより作成されます。

norm_p((x,y)) = (|x|^p + |y|^p)^(1/p)

これらの異なる基準の単位円は、非常に明確な形をしています。

チャレンジ

が与えられたp >= 1場合、有効数字4桁の精度で-ノルムに対するLp円の円周と直径の比を計算しLpます。

テストケース

私たちは、のためにそれを使用することができるp,q1 = 1/p + 1/q我々は同じ比率を得るLpだけでなく、Lq規範。さらに用p = q = 2比率最小限であり、そしてのためにp = 1, q = infinity私たちは4の比率を取得し、その比率は、間常にあるpi4

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

2
形状はラメ曲線または超楕円として知られており、ノルム自体はそうではありませんが、0 < p <1でも存在します(三角形の不等式に違反するため)。超楕円のウィキペディアの記事には、エリアの閉じたフォームが含まれています。
ニール

@Neilただし、面積ではなく円周を考慮する必要があります。これは、私の知る限り、円弧長の積分によってのみ計算できます。
-flawr

7
申し訳ありませんが、それらについて読み終え​​る頃には、質問が何を求めていたかを忘れていました。
ニール

2
素敵な挑戦!
ルイスメンドー

1
面積式(A = πr²)が成り立たないことに注意するのは興味深いですp ≠ 2
Mego

回答:


12

Python + scipy、92バイト

from scipy.integrate import*
lambda p:2/p*quad(lambda x:(x/x**p+(1-x)**(1-p))**(1/p),0,1)[0]

数式は、このmath.SE質問からのものです


このアプローチで実装をテストするとき、私はそのアプローチの収束に問題がありました。の特異性のため、x=1あなたの提出はどうですか?
-flawr

ScipyはPython標準ライブラリの一部ではありません。たぶんセージに切り替える?
-busukxuan

2
@busukxuan標準ライブラリのみを使用できるPPCGの要件はありません。しかし、とにかくタイトルでそれを言及します。
orlp

1
@ChristianSieversは、私は、閉じた式:-Pだ他の誰かを使用するための悪い感じを避けるために私自身の統合をした
ルイス・Mendo

1
@ChristianSievers 興味がある場合に備えて、実際にサンドボックスに別の形式も含めました=)
flawr

10

MATL、31バイト

0:1e-3:1lyG^-lG/^v!d|G^!slG/^sE

オンラインでお試しください!または、すべてのテストケースを確認します

説明

これが発生するXY、ステップ0.001で1001点でサンプリング単位円の四分の一の座標Xを。円の4分の1の長さは、これらの点を通る折れ線の長さに近似しています。つまり、1000セグメントの長さの合計。もちろん、長さはp-norm に従って計算されます。結果に2を掛けると、半円のおおよその長さ、つまりpiが得られます。

0:1e-3:1   % Push [0 0.001 0.002 ... 0.999 1]. These are the x coordinates of
           % the vertices of the polygonal line that will approximate a quarter
           % of the unit circle
l          % Push 1
y          % Duplicate [0 0.001 0.002 ... 0.999 1] onto the top of the stack.
G          % Push input, p
^          % Element-wise power: gives [0^p 0.001^p ... 1^p]
-          % Element-wise subtract from 1: gives [1-0^p 1-0.001^p ... 1-1^p]
lG/        % Push 1, push p, divide: gives 1/p
^          % Element-wise power: gives [(1-0^p)^(1/p) (1-0.001^p)^(1/p) ...
           % ... (1-1^p)^(1/p)]. These are the y coordinates of the vertices
           % of the polygonal line
v          % Concatenate vertically into a 2×1001 matrix. The first row contains
           % the x coordinates and the second row contains the y coordinates
!          % Transpose
d|         % Compute consecutive differences down each column. This gives a
           % 1000×2 matrix with the x and y increments of each segment. These
           % increments will be referred to as Δx, Δy
G          % Push p
^          % Element-wise power
!          % Transpose
s          % Sum of each column. This gives a 1×1000 vector containing
           % (Δx)^p+(Δy)^p for each segment
lG/        % Push 1/p
^          % Element-wise power. This gives a 1×1000 vector containing 
           % ((Δx)^p+(Δy)^p)^(1/p) for each segment, that is, the length of 
           % each segment according to p-norm
s          % Sum the lenghts of all segments. This approximates the length of
           % a quarter of the unit circle
E          % Multiply by 2. This gives the length of half unit circle, that is,
           % pi. Implicitly display

8

Mathematica、49 46バイト

alephalphaにより3バイトが節約されました

2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&

匿名関数。入力として数値を受け取り、出力として数値を返します。


1
2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&
-alephalpha

5

PARI / GP、48 43バイト

@orlpが式を見つけた後は簡単で、@ alephalphaのバージョンは5バイトを節約します。

p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))

少し便利なものを追加するpために、取得する対象を計算しましょう3.2

? f=p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p));
? solve(p=1,2,f(p)-3.2)
%2 = 1.623002382384469009676324702

正しい使い方

コードはチャレンジ要求よりもはるかに正確な結果を提供しますが、簡単に大幅に改善することができます:統合の上限1[1,1/p-1](マニュアルで特異点指数と呼ぶものを与える)に置き換えると、表示されるすべての数字がf(2)一致しPiます。これは、精度を100(タイプ\p100)に上げた場合にも当てはまります。

ただし、その変更後、solve計算は機能しなくなりました。ケースを明示的に処理するように内部用語をu=0変更し、新しいPARIバージョンと64ビット(より高いデフォルト精度を意味する)を持つ別のコンピューターに変更しました。

p値の改善された計算を次に示します。Pi=3.2実際のPiも見てみましょう。

? f=p->2*intnum(u=0,[1,1/p-1],if(u,(1+(u^-p-1)^(1-p))^(1/p),0));
? f(2)
%2 = 3.1415926535897932384626433832795028842
? Pi
%3 = 3.1415926535897932384626433832795028842
? solve(p=1,2,f(p)-3.2)
%4 = 1.6230023823844690096763253745604419761

p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))
-alephalpha

0

JavaScript(ES7)、80バイト

orlpの回答に基づきます。このJS実装は非常に低速です。i=1e-7より高速な近似を試すために(またはそれ以上)試してみることもできます。

:これは基本的にChromeとEdgeのみを対象としています。Math.pow()Firefox 50.1で使用する同等のES6バージョンは、はるかに遅いようです。

編集:Neilによると、これはFirefox 52でも正常に動作するはずです。

f=
p=>{for(i=5e-8,s=x=0;(x+=i)<1;)s+=i*(x**(1-p)+(1-x)**(1-p))**(1/p);return 2/p*s}

console.log(f(1).toFixed(3))
console.log(f(2).toFixed(3))
console.log(f(1.623).toFixed(3))


ES7バージョンは、Firefox 52を使用して試してみるとかなり明るく見えました(科学的には測定しませんでしたが、Chromeとほぼ同じ速度を感じました; Edgeはフリーズしました)。
ニール

@Neilご意見ありがとうございます。それに応じて更新。
アーナルド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.