zoukankan      html  css  js  c++  java
  • 【数论】求幂大法

    求幂大法是可以对指数取模 而结果不变的快速求幂的方法:

    A^b=A^(b mod phi(B)+phi(B)) (mod B) (条件:b>=phi(B))

    证明:

    我们知道A^i mod m 会存在循环节 在循环节前可能存在一段不循环的数

    假设前r 为不循环的数 s为循环节的长度

    也就是A^(r+i)=A^(r+i+s) (i>=0)

    要证明上面求幂大法 就是要证明 A^b mod B 的r>=phi(B) 且s|phi(B)

    也就是A^b mod B 当b<=phi(B)时开始循环 且循环的长度为phi(B)的因数

    设A=p1^a1*p2^a2...pn^an

       rj、sj为(pj^aj)^i mod B 的开始循环的数和循环节长度

       rj'、sj'为pj^i mod B 的开始循环的数和循环节长度

    显然

    1、只要所有rj<=phi(B) && sj|phi(B) 则得证(感性理解一下 A的循环节开始点为rj的最大值 而A的循环节长度为所有sj的lcm)

    2、rj'<=rj 且 sj'|sj

    需证明rj<=phi(B) 且 sj'|phi(B)

    对于某个质数p 设 B'=B/(p^r0) 满足(B',p)=1

    p^r=p^(r+s) (mod B)

    ->B|p^(r+s)-p^r

    ->B'*(p^r0)|p^r*(p^s-1)

    因为(p^r0,p^s-1) 所以r至少要取r0 由定义 r=r0

    所以B'|p^s-1

    ->p^s=1 (mod B')

    由欧拉定理可知 s|phi(B')

    又因为phi具有积性 所以phi(B')|phi(B)

    所以s|phi(B)

    再证明r<=phi(B)

    这里p^r|B 且(p^r,B)=1 所以phi(B)=phi(p^r)*...

    所以phi(B)>=phi(p^r)

    phi(p^r)=(p-1)*p(r-1)

    由于p为质数 不难发现(p-1)*p^(r-1)>r

    所以r<=phi(B) 得证

  • 相关阅读:
    数据库sql一些常考基础命令
    C# and .NET之父——传奇的anders hejlsberg
    数据库中3大范式的详解
    小胖求职记—求职中的技巧
    程序员们喜爱看的文章
    为什么世界上没有天才(转)
    C语言中system函数的使用
    关于DataGrid的知识和技巧
    分页
    在调用方法时产生异常的处理方法
  • 原文地址:https://www.cnblogs.com/g-word/p/3374007.html
Copyright © 2011-2022 走看看