模指数运算是我们悲惨求学人在学习数理基础时需要用到的一种实用的运算方法,那么下面就让我来深入分析公式来理解其原理。
example:3^11(mod 4)
我们都知道十进制的11可以转换成二进制的1011。那么这时候问题来了,老师又告诉我们依据不同的情况这个二进制的数我们可以从前往后或者从后往前来计算,这是为什么呢?下面我们来简单分析一下:
一、从后往前计算
这时候3^1011^=(1x3^1^)*(1x3^2^)(0x3^4^)(1x3^8^)
后面四项不带系数依次记为 b1、b2、b3、b4
这就和我们平常算的一样,先计算b1的模等于31(mod 4),之后依次平方可得b2、b3、b4的模,然后再乘上相应的系数即可得到最后的结果:
31001(mod 4):
a1=b0=1x3(mod 4)=3 b1=b02(mod 4)=1
a2=a1x(1xb1)(mod 4)=3 b2=b12=1
a3=a2(mod 4)=3(注:这里34的系数是零,因此不用乘) b3=b22=1
a4=a3x(1xb3)(mod 4)=3
因此结果是3。
二、从前往后计算
如此:3^1011=(1x3^8)(0x3^4)(1x3^2)(1x3^1)
这时候我们最后考虑1x31,于是k=(1x3^8)(0x3^4)(1x3^2)
此时我们再分解,从1x316开始。c1=38=34x32x(3)2,c2=34=32x(3)2,c3=(3)2这时候我们将高位的数分配给了低位的数。那我们先来计算c1,先是t0=(3)2(mod 4)=1,然后我们发现又乘了一个32,这就相当于是t0xt0,则t1=t02(mod 4)=1,那么现在t1等于32x(3)2=34,我们又发现c1=t2=t1xt1(mod 4)=1。那么我们分析一下,一个高位的数分配下来后只要一直计算最低位的平方就可以得到最高位的模值,且高位的数每低一位就要少平方一次。那么好办了,我们只要从最高位开始,依次往低位找系数为1的,如果为0就计算t(i+1)=ti2(mod 4)就好了;如果为1,就将这一位分配给低位,也就是开始算最低位的平方,t(i+1)=ti2x(3)2(mod 4),那么现在已知ti和3后面每次都要平方的,那么我们干脆将他们合并成t(i+1)=(tix3)2(mod 4),后面的就依次类推,我们就知道计算方法是从最高位开始,先计算(3)2(mod 4),依次往低位计算,遇到0直接平方,遇到1平方之后再乘一个(3)2,直到计算到最后一位,因为最后一位还剩一个3^1,最低位系数为1直接乘3就好了,系数为0就已经计算结束了。
过程:
a0=(3)2(mod 4)=1
a1=a02(mod 4)=1
a2=a12x32(mod 4)=1
a3=a2x3(mod 4)=3
结果为3。
总结:
个人觉得第二种方法比较好,因为可以无脑一直平方(嘿嘿)。但是还是要依据具体情况,那个计算方便就按哪种方法来计算。