Asあなたの番号n
が適度に小さい(約1500より小さい)限り、これを行うための最速の方法は、実際にすべての可能な値を試すことです。あなたはnumpy
を使用することで、すぐに行うことができます。
import numpy as np
import scipy.misc as misc
nMax = 1000
a = 77
b = 100
n = np.arange(1, nMax+1, dtype=np.float64)
val = misc.comb(n, a)/n**b
print("Maximized for n={:d}".format(int(n[val.argmax()]+0.5)))
# Maximized for n=181
これは特にエレガントけどn
のその範囲のためにかなり速くありません。問題は、n>1484
の場合、分子がすでに大きくて、float
に格納することができないということです。このメソッドは、オーバーフローに陥るので失敗します。しかし、これはnumpy.ndarray
の問題だけでなく、python
の整数でも動作しません。あなたはPythonでfloat
は(私のシステムでmax_10_exp = 1024
を保持できる最大値より大きな2つの数のあなたの部門のフロート結果を持つようにしたいと
misc.comb(10000, 1000, exact=True)/10000**1001
参照してください:でも彼らと、あなたは計算することができません。 sys.float_info()
。)。その場合はrange
を使用することはできません。あなたが本当にそのようなことをしたいのであれば、数値的にもっと注意を払う必要があります。
「n」はどれくらいの大きさになると思いますか?リンクされた答えのような181のオーダー、または地球上の75億人のオーダーのオーダー? – jotasi
私は実際のデータを実行するまで、私は絶対に知る方法がないが、n <1000、そして確かに<< 10000を期待するだろう! – TimGJ
'comb 'をガンマ関数を介して(またはスターリングの公式で近似することによって)実数上の関数に変換することができます。その後、数値解法を実行して、近傍の整数が最大であるかどうかを調べることができます。 – strubbly