私は完全な答えを得る時間がありませんが、ここには部分的な答えがあります。このテクニックは継続的な分数の概念を使用しています。あなたの値dminは無視されますが、これは以下では使用されません。
continued fraction expansion of piは、必要なだけ多くの場所に入手してください。 DMAX < = 1E15のごバウンドのためには、
[3, 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 2, 1, 1, 2, 2, 2, 2, 1, 84, 2, 1, 1, 15, 3, 13]
すぐ下に、ちょうどDMAX上記の分母を持つパイのためのconvergentsを見つけるために、短いループを使用している唯一の最初の28個の数字を、必要とします。 Pythonでは分数numlo/denomlo
を使用しますが、それよりも良い近似があるかもしれません、Microsoft Excelなどの
pi_cont_frac = [3, 7, 15, 1, 292, 1, 1, 1, 2, 1,
3, 1, 14, 2, 1, 1, 2, 2, 2, 2,
1, 84, 2, 1, 1, 15, 3, 13]
denomlo, denomhi = 1, 0
numlo, numhi = 0, 1
for q in pi_cont_frac:
denomlo, denomhi = denomhi, q * denomhi + denomlo
numlo, numhi = numhi, q * numhi + numlo
if denomhi > dmax:
break
一部のソフトウェア、あろうこと。 denomhi - r * denomlo
をdmaxの直下(またはそれに等しい)にする自然数rの値を見つけてください。
次に、numlo/denomlo
または(denomhi - r * denomlo)/(denomhi - r * denomlo)
のいずれかがpiに最も近い割合になります。どちらが近いかを確認するだけです。
このアルゴリズムはlog(dmax)の順序であり、piの特性のため、通常ははるかに低くなります。 dmaxが< = 1e15の場合、28回のループが必要ですが、もう少しクリーンアップ文が必要です。
収束値(numhiとdenomhiの値)を事前に計算して格納し、dmaxのすぐ上のdenomhiの値を検索すると、より高速なアルゴリズムを作成できます。これは28個の数字しか必要としませんが、あなたは分子と分母の両方にこれを必要とします。バイナリ検索では、実際に瞬時に検索するために最大5つのステップが必要です。より多くの記憶装置を使用し、計算を少なくする別の可能性は、すべての中間部分を記憶することであろう。そのストレージは、少なくとも300の何百に入るだろう。 piの継続的な分数展開のために格納されたリストが気に入らなければ、piの値を使ってその値を計算することができますが、double precision(Cで)を使用すると、私が示した28の数字だけになります。
さらなる研究のために、分画および中間画分を検索してください。
'44/14'は' dmin = 13'と 'dmax = 15'に対して受け入れられる答えですか? –
あるいは、別の言い方をすると、 'dmin'という制約を引き起こすのは何ですか?近似が "十分に良い"ことを確認する唯一の理由がある場合は、別の方法で再記述すると問題がより簡単になる可能性があります。例えば制約が実際に近似とpiがわずかに異なる制約である1/dmin以下である場合に、簡単に適用できる単純な有理間隔で最も単純な有理を見つけるためのかなり簡単なアルゴリズムがあります。 –