• 2的正幂末尾数的模式


    2的正幂 — 2, 4, 8, 16, 32, 64, 128, 256, … — 末尾数字遵循一个显而易见的规律: 2, 4, 8, 6, 2, 4, 8, 6, … . 这4个数字永远循环下去。最末尾数以外还有循环 — 实际上是最末m位 — 从2m 开始的2的幂。例如,从04开始最末两位数就存在一个长度20的循环,同时从008开始最末3位数就存在一个长度100的循环。

    本文,我将告诉你为什么会有这些循环,它们有多长,如何表达为数学形式,如何看见它们。

    最末尾数的循环

    末位数-所在位置-是十进制整数d在d/10后的余数。等价地,末位数是d mod 10的结果,根据约定取最小非负值-普通余数-作为返回结果。模运算,持续叠加到2的幂运算,得到末位数的循环:

    1. mbox{footnotesize{displaystyle{2^1 equiv 	extbf{2} pmod{10}}}}
    2. mbox{footnotesize{displaystyle{2^2 equiv 2^1 cdot 2 equiv 2 cdot 2 equiv 	extbf{4} pmod{10}}}}
    3. mbox{footnotesize{displaystyle{2^3 equiv 2^2 cdot 2 equiv 4 cdot 2 equiv 	extbf{8} pmod{10}}}}
    4. mbox{footnotesize{displaystyle{2^4 equiv 2^3 cdot 2 equiv 8 cdot 2 equiv 	extbf{6} pmod{10}}}}
    5. mbox{footnotesize{displaystyle{2^5 equiv 2^4 cdot 2 equiv 6 cdot 2 equiv 	extbf{2} pmod{10}}}}
    6. mbox{footnotesize{displaystyle{2^6 equiv 2^5 cdot 2 equiv 2 cdot 2 equiv 	extbf{4} pmod{10}}}}

    我们从2开始,取10的模,再乘以2,再对10取模,等等。可知此模式将循环,直到先前的一个结果-2再次出现在第五步-循环确认。这展现了数字 2n, n ≥ 1, 末位数在四个数字 2, 4, 8, 和 6间循环。

    这循环告诉我们,末尾数相同的2的幂是有关联的,它们的指数相差4:

    • Ends in 2: 21, 25, 29, 213, 217, … .
    • Ends in 4: 22, 26, 210, 214, 218, … .
    • Ends in 8: 23, 27, 211, 215, 219, … .
    • Ends in 6: 24, 28, 212, 216, 220, … .

    你可以使用指数运算规则来更简洁地描述,展示所有2的幂中末位数有规律的前4个:

    • Ends in 2: 21·24k, or 21+4k, k ≥ 0.
    • Ends in 4: 22·24k, or 22+4k, k ≥ 0.
    • Ends in 8: 23·24k, or 23+4k, k ≥ 0.
    • Ends in 6: 24·24k, or 24+4k, k ≥ 0.

    也可以按照指数对4取模的结果来对2的幂建立联系:

    • Ends in 2: mbox{footnotesize{displaystyle{n equiv 1 pmod{4}}}}
    • Ends in 4: mbox{footnotesize{displaystyle{n equiv 2 pmod{4}}}}
    • Ends in 8: mbox{footnotesize{displaystyle{n equiv 3 pmod{4}}}}
    • Ends in 6: mbox{footnotesize{displaystyle{n equiv 0 pmod{4}}}}

    这就很容易知道任意2的正幂的末位数是几。例如, 2319 的末位数是 8, 因为 mbox{footnotesize{displaystyle{319 equiv 3 pmod{4}}}}.

    Cycle in the Last Digit of 2n, n≥1
    Power of Two (k ≥ 0)Exponent (mod 4)Last Digit
    21+4k 1 2
    22+4k 2 4
    23+4k 3 8
    24+4k 0 6

    小结,表格告诉我们,如果 mbox{footnotesize{displaystyle{x equiv y pmod{4}}}}, mbox{footnotesize{displaystyle{2^x equiv 2^y pmod{10}}}}.

    末两位数的循环

    类似的分析,只是对100取模,展示2的幂的末两位数,从 22 开始,循环周期是20:

    Cycle in the Last Two Digits of 2n, n≥2
    Power of Two (k ≥ 0)Exponent (mod 20)Last 2 Digits
    22+20k 2 04
    23+20k 3 08
    24+20k 4 16
    25+20k 5 32
    26+20k 6 64
    27+20k 7 28
    28+20k 8 56
    29+20k 9 12
    210+20k 10 24
    211+20k 11 48
    212+20k 12 96
    213+20k 13 92
    214+20k 14 84
    215+20k 15 68
    216+20k 16 36
    217+20k 17 72
    218+20k 18 44
    219+20k 19 88
    220+20k 0 76
    221+20k 1 52

    末三位的循环

    为了找出末三位数的循环,重复上面的过程,对1000取模。下面展示了2的幂的末三位,从 23开始,循环周期是100:

    Cycle in the Last Three Digits of 2n, n≥3
    Power of Two (k ≥ 0)Exponent (mod 100)Last 3 Digits
    23+100k 3 008
    24+100k 4 016
    25+100k 5 032
    26+100k 6 064
    27+100k 7 128
    28+100k 8 256
    29+100k 9 512
    210+100k 10 024
    211+100k 11 048
    212+100k 12 096
    213+100k 13 192
    214+100k 14 384
    215+100k 15 768
    216+100k 16 536
    217+100k 17 072
    218+100k 18 144
    219+100k 19 288
    220+100k 20 576
    221+100k 21 152
    222+100k 22 304
    223+100k 23 608
    224+100k 24 216
    225+100k 25 432
    226+100k 26 864
    227+100k 27 728
    228+100k 28 456
    229+100k 29 912
    230+100k 30 824
    231+100k 31 648
    232+100k 32 296
    233+100k 33 592
    234+100k 34 184
    235+100k 35 368
    236+100k 36 736
    237+100k 37 472
    238+100k 38 944
    239+100k 39 888
    240+100k 40 776
    241+100k 41 552
    242+100k 42 104
    243+100k 43 208
    244+100k 44 416
    245+100k 45 832
    246+100k 46 664
    247+100k 47 328
    248+100k 48 656
    249+100k 49 312
    250+100k 50 624
    251+100k 51 248
    252+100k 52 496
    253+100k 53 992
    254+100k 54 984
    255+100k 55 968
    256+100k 56 936
    257+100k 57 872
    258+100k 58 744
    259+100k 59 488
    260+100k 60 976
    261+100k 61 952
    262+100k 62 904
    263+100k 63 808
    264+100k 64 616
    265+100k 65 232
    266+100k 66 464
    267+100k 67 928
    268+100k 68 856
    269+100k 69 712
    270+100k 70 424
    271+100k 71 848
    272+100k 72 696
    273+100k 73 392
    274+100k 74 784
    275+100k 75 568
    276+100k 76 136
    277+100k 77 272
    278+100k 78 544
    279+100k 79 088
    280+100k 80 176
    281+100k 81 352
    282+100k 82 704
    283+100k 83 408
    284+100k 84 816
    285+100k 85 632
    286+100k 86 264
    287+100k 87 528
    288+100k 88 056
    289+100k 89 112
    290+100k 90 224
    291+100k 91 448
    292+100k 92 896
    293+100k 93 792
    294+100k 94 584
    295+100k 95 168
    296+100k 96 336
    297+100k 97 672
    298+100k 98 344
    299+100k 99 688
    2100+100k 0 376
    2101+100k 1 752
    2102+100k 2 504

    末m位数循环

    2的正幂的末m位数循环要对10m取模,循环周期是 4·5m-1, 始于 2m. (具体证明涉及到数论,超出了本文的范围)

    Cycle Length for Number of Ending Digits (1 to 10)
    mPeriod (4·5m-1)Starts with
    1 4 21
    2 20 22
    3 100 23
    4 500 24
    5 2500 25
    6 12500 26
    7 62500 27
    8 312500 28
    9 1562500 29
    10 7812500 210

    周期增长飞快-指数级增长-所以无法列出m大于3的列表。

    循环的嵌套(Nesting of Cycles)

    对于末m位,m-1位,m-2位, …, 末1位的循环,可以看做是嵌套的,尽管它们的起始点是交错的。你只需将较小的起始数补零,就能让它们对齐。

    例如,在长度是100的末三位循环中,包含了5次长度是20的末两位循环;每一个长度是20的末两位循环包含5次长度为4的最末位循环。你从8(需移动两位)开始观察就能发现最末位的规律,末两位的规律始于08(需移动一位),末三位的规律始于008(不需移位)。

    下表标出了嵌套的循环(全部100行都被标记,因为只有100个2的幂-末三位的一个循环-被列出)。

    Nested 1-3 Digit Ending Patterns in Powers of Two from 2^3 to 2^102

    Nested 1-3 Digit Ending Patterns From 23 to 2102

    使用PARI/GP探索末位循环

    我使用PARI/GP 来进行上面的计算和验证。下面是三个例子:

    • 列出前20个末位是2的2的幂:
      ? for (i=0,19,print("2^",1+4*i,": ",2^(1+4*i)))
      2^1: 2
      2^5: 32
      2^9: 512
      2^13: 8192
      2^17: 131072
      2^21: 2097152
      2^25: 33554432
      2^29: 536870912
      2^33: 8589934592
      2^37: 137438953472
      2^41: 2199023255552
      2^45: 35184372088832
      2^49: 562949953421312
      2^53: 9007199254740992
      2^57: 144115188075855872
      2^61: 2305843009213693952
      2^65: 36893488147419103232
      2^69: 590295810358705651712
      2^73: 9444732965739290427392
      2^77: 151115727451828646838272
      
    • 列出末两位的循环( ‘%’ 号返回余数,等价于取模运算):
      ? for (i=2,21,print("2^",i," mod(100): ",2^i % 100))
      2^2 mod(100): 4
      2^3 mod(100): 8
      2^4 mod(100): 16
      2^5 mod(100): 32
      2^6 mod(100): 64
      2^7 mod(100): 28
      2^8 mod(100): 56
      2^9 mod(100): 12
      2^10 mod(100): 24
      2^11 mod(100): 48
      2^12 mod(100): 96
      2^13 mod(100): 92
      2^14 mod(100): 84
      2^15 mod(100): 68
      2^16 mod(100): 36
      2^17 mod(100): 72
      2^18 mod(100): 44
      2^19 mod(100): 88
      2^20 mod(100): 76
      2^21 mod(100): 52
      

      (单位的数字这里没有前补零)

    • 打印末位1到10位数的周期长度:
      ? for (i=1,10,print(i,": ",4*5^(i-1)))
      1: 4
      2: 20
      3: 100
      4: 500
      5: 2500
      6: 12500
      7: 62500
      8: 312500
      9: 1562500
      10: 7812500
      
  • 相关阅读:
    ACM-ICPC ShangHai 2014
    DEBUG感想
    WireShark 使用日记
    C++ 备忘录
    BZOJ 1022 [SHOI2008]小约翰的游戏John
    高斯消元
    BZOJ3236 [Ahoi2013]作业
    BZOJ P3293&&P1045
    ZKW费用流的理解
    BZOJ 几道水题 2014-4-22
  • 原文地址:https://www.cnblogs.com/sirlipeng/p/5391096.html
Copyright © 2020-2023  润新知