当前位置: 代码迷 >> 综合 >> 八分钟搞懂快速幂的运算原理(无代码)
  详细解决方案

八分钟搞懂快速幂的运算原理(无代码)

热度:20   发布时间:2024-01-25 18:56:25.0

如果你不知道快速幂有多么快,那我可要告诉你这样一句话:

快速幂之于乘法的作用,相当于乘法之于加法的作用。

直接对比说明:

//101+101+101+101+101+101+101+101+101+101       加法算式
//101*110                                       乘法算式
//列竖式:
//               101     乘数1
//        *      110     乘数2
//        -----------
//               000     ←     0*(101*1)        0*(101)
//              101~     ←     1*(101*10)       1*(101+101)
//             101~~     ←     1*(101*100)      1*(101+101+101+101)
//        -----------
//             11110
//显然,我们算了三个数(向左箭头),这三个数刚好是乘数2的一个位数
//第i个箭头对应的数是乘数1左移位i次再乘上乘数2的第i位得到
//第i个箭头里括号里的数非常好递推,只要第i-1的括号里的数再左移一次就好
//如果认为位移一次的代价是1,累加一个数的代价是1
//那么总代价就是2*(乘数2在二进制下的位数)
//即2*log(乘数2)//101*101*101*101*101*101*101*101*101*101       乘法算式
//101^110                                       乘方算式(姑且拿异或符号当乘方来用,你懂就好)
//列式:
//               101     底数
//        ^      110     幂
//        -----------
//               000     ←     0*(101^1)        0*(101)
//             11001?     ←     1*(101^10)       1*(101*101)
//        1001110001     ←     1*(101^100)      1*(101*101*101*101)
//        -----------
//        1010001010
//显然,我们算了三个数(向左箭头),这三个数刚好是幂的一个位数
//第i个箭头对应的数是底数做平方i次再乘上幂的第i位得到
//第i个箭头里括号里的数非常好递推,只要第i-1个括号里的数再平方就好
//如果认为算一次平方的代价是1,累加一个数的代价是1
//那么总代价就是2*(幂在二进制下的位数)
//即2*log(幂)

 

其原理就是这样。

实现的话,如果你是个新手,没写过快速幂,你可以考虑开一个辅助数组,然后存底数,底数的平方,底数的平方的平方,etc..

整完之后在乘个位数。

如果你熟练一点,就不必开辅助数组了。

不高兴的话,你套板子也行。

 

  相关解决方案