CS 6.006 Lecture 12 Square Roots, Newton's Method を見る
わかったこと
Multiplicationの時間計算量
桁どうしの掛け算を行うときの時間計算量は、 で与えられる。
- naiveなアルゴリズム:
- Karatsuba:
DivisionはNewton Method + Multiplicationによって行われる
を求めたいとき、と考え、 を先に求める。
を求めたいとき、として、を求める。 の結果は整数となり、扱いやすい(?)上に、であればビットシフトだけで割り算ができるからである。
を求めたいとき、 となる関数を考え、になる点を探すことでを求める。 Newton法である。 このようにすると複数のMultiplicationとRによるビットシフトだけで計算が可能になる。
を直接考えれば?と思ったが、これだとaによる割り算が必要になるので、Rによるビットシフトが行えるという点が大事なのだと思う。
関連して調べたこと
pythonの整数の扱い
pythonでは多倍長整数として扱われる。32bitにおさまらなくなったら、余分にメモリを確保して、まとめて一つの数字として扱えるようになっている。 pythonの思想である、プログラマはロジックに集中するべきという思想に基づくらしい。
多倍長整数の演算は、整数を格納した複数の32bitメモリをひとつなぎにして、下位の桁から計算し、carryがあった場合に上位の桁に渡すことを繰り返すようになっている。 このスライドが参考になった。 リンク