/* * 输入:正整数k 和 正整数m * 输出:k*m */ __int64 km(__int64 k, __int64 m){ __int64 x = k; int w = (int)floor(log(m) / log(2)) -1; __int64 e = 1 << w; for(int i=0; i<=w; i++){ x <<= 1; if(m & e) x += k; e >>= 1; } return x; }
2、使用位运算的乘方运算
指数变为2进制后,使用位运算完成乘方运算。
伪代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/* * 输入:正整数v mod m 和 g mod m * 输出:g^v mod m */ __int64 gvmm(__int64 g, __int64 v, __int64 m){ int w = (int)floor(log(v) / log(2)) - 1; __int64 e = 1 << w; __int64 x = g; for(int i=0; i<=w; i++){ x = (x * x) % m; if(v & e){ x = (g * x) % m; } e >>= 1; } return x; }