Floor Sum を理解したい
おことわり
この記事は厳密性を保証しません。
Floor Sum とは?
を高速に求めるやつ(ただしで,)。
どういうアルゴリズムを使えばいいのか
まず,, として , の状態を作り上げます。すると
となります。 と は簡単に求められるので, の部分をうまく求めればいいです。
のときは当然 となる*1ので,以下では の場合について考えます。
ここで, となるような の個数をごとに数え上げることを考えます。
は整数なので, と は同値であり,
よって となるような の個数は 個あります。
これを からまで足し合わせて
となります。ここで, という記号を導入すると
となります。
つまり,結局のところ
となります。ここで,
の部分は元の問題と同じ構造をしているので再帰的に解けば問題が解けます。
再帰関数を作る
とおきます。
するとさっきの式は
と書き直せます。
計算量
雑に見積もります。
は を呼び出すので,だいたいユークリッドの互除法と同じくらいの計算量になることが分かります。よって,計算量は で抑えられそうだということが分かります。
いかがでしたか?
間違っている部分などがあれば教えて下さい。
*1:の定義からです。