前提
繰り返し二乗法について勉強しています。aのb乗の計算法についてのコードでわからないところがあります。下のコードで「if ((b & (1 << i)) != 0」の部分が機能しているのかがわかりません。
1<<iの部分は二進数で10、100、1000と増えていくことはわかります。そこからbとAND演算をして何がもとまっているのかがわかりません。
また、「{ Answer *= p; Answer %= m; }p *= p; p %= m;」ここの部分でなぜ分けて何がしたいのかがわかっていません。
誰かご教授お願いします。
実現したいこと
繰り返し二乗法の理解を深めたい
該当のソースコード
C++
1#include <iostream> 2using namespace std; 3 4long long modpow(long long a, long long b, long long m) { 5 // 繰り返し二乗法(p は a^1, a^2, a^4, a^8, ... といった値をとる) 6 long long p = a, Answer = 1; 7 for (int i = 0; i < 30; i++) { 8 if ((b & (1 << i)) != 0) { Answer *= p; Answer %= m; } 9 p *= p; p %= m; 10 } 11 return Answer; 12} 13 14const long long mod = 1000000007; 15long long a, b; 16 17int main() { 18 cin >> a >> b; 19 cout << modpow(a, b, mod) << endl; 20 return 0; 21}

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。