首页 > 代码库 > python 计算2**3**4**5%10**8 的说明
python 计算2**3**4**5%10**8 的说明
在群里看到了有一个群使用这个2**3**4**5%10**8作为验证的问题,直接在python输入计算,很显然等了半天都没有反应,因为指数的运算太大了
3**4**5运算如下
373391848741020043532959754184866588225409776783734007750636931722079040617265251229993688938803977220468765065431475158108727054592160858581351336982809187314191748594262580938807019951956404285571818041046681288797402925517668012340617298396574731619152386723046235125934896058590588284654793540505936202376547807442730582144527058988756251452817793413352141920744623027518729185432862375737063985485319476416926263819972887006907013899256524297198527698749274196276811060702333710356481L
然后是2的上面那么多次方....
经过一些人的指点,总结大概方法如下:
1、需要减少指数的大小,主要通过去除不必要的运算,而不必要的运算就是,2的指数运算会出现重复的情况。
如重复最后一位2的时候
2**1 2
2**2 4
2**3 8
2**4 16
2**5 32
2**6 64
2**7 128
2**8 256
2**9 512
2**10 1024
2**11 2048
2**12 4096
2**13 8192
2**14 16384
2**15 32768
2**16 65536
2**17 131072
2**18 262144
2**19 524288
可以看到 2**1 2**5 2**9 2**13 可以看到间隔都是 4
重复最后两位16
>>> for i in range(1,1000):
... if 2**i/10**2 > 0 and 2**i%10**2==16:
... print ‘2**%d‘ % i,2**i
...
2**24 16777216
2**44 17592186044416
2**64 18446744073709551616
2**84 19342813113834066795298816
2**104 20282409603651670423947251286016
2**124 21267647932558653966460912964485513216
2**144 22300745198530623141535718272648361505980416
2**164 23384026197294446691258957323460528314494920687616
2**184 24519928653854221733733552434404946937899825954937634816
2**204 25711008708143844408671393477458601640355247900524685364822016
2**4 2**24 2**44.... 可以看出来间隔为20
如此我们可以算出剩余3位的间隔为100
2**7 2**107 2**207
算出剩余4位的间隔是500
2**10 2**510 2**1010
归纳得到
4 20 100 500
观察规律可以得到
a(n)=a(n-1)**2/a(n-2)
举例 a(3) = a(2)**2/a(1)
= 20**2/4
= 100
这样算出8位的重复间隔,312500
那么
3**4**5%312500
43981
那么就只需要计算
2**43981%10**8就可以了
72100352L
本文出自 “Emrys_li的理想乡” 博客,请务必保留此出处http://9162220.blog.51cto.com/9152220/1535434