首页 > 代码库 > 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