繰り返し二乗法

「繰り返し二乗法」の編集履歴(バックアップ)一覧はこちら

繰り返し二乗法」(2013/11/02 (土) 03:10:04) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

繰り返し二乗法のアルゴリズムを答えよ。 ==== 0を含むすべて自然数は2のべき乗の和の組み合わせで表すことが出来る。2進数がその例である。 nを2のべき乗の和で表すと >|| n = 2^(k_1) + 2^(k_2) + 2^(k_3) + ... ||< よって、 >|| x^n = x^(2^k_1) x^(2^k_2) x^(2^k_3) ... ||< 2進数で操作をすればよいので1のビットが立つ部分iについて、resにx^iを掛けていく。 下位ビットから考えているのでxは順次二乗していけばよい。nの1と0のビットの数だけ処理するのみなのでO(log n)でxのべき乗を高速に求められる。 >|| typedef long long ll; ll mod_pow(ll x, ll n, ll mod) { ll res = 1; while(n > 0) { if(n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } ||<
*繰り返し二乗法 **解説 0を含むすべて自然数は2のべき乗の和の組み合わせで表すことが出来る。2進数がその例である。 nを2のべき乗の和で表すと >|| n = 2^(k_1) + 2^(k_2) + 2^(k_3) + ... ||< よって、 >|| x^n = x^(2^k_1) x^(2^k_2) x^(2^k_3) ... ||< 2進数で操作をすればよいので1のビットが立つ部分iについて、resにx^iを掛けていく。 下位ビットから考えているのでxは順次二乗していけばよい。nの1と0のビットの数だけ処理するのみなのでO(log n)でxのべき乗を高速に求められる。 >|| typedef long long ll; ll mod_pow(ll x, ll n, ll mod) { ll res = 1; while(n > 0) { if(n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } ||<

表示オプション

横に並べて表示:
変化行の前後のみ表示: