zoukankan      html  css  js  c++  java
  • 数论

    写得很简略,属于自己的推导,以免什么时候忘了结论还可以算出来;

    1.欧拉函数:

    f(x)表示小于等于x的数中与x互质的数的个数;

    一个质数与它以下的都互质,f(x)=x-1

    一个质数的幂x^k,f(x^k)=x^k-x^(k-1)=x^(k-1)*(x-1)=x^k*(1-1/x)

    欧拉函数是积性函数,唯一分解定理得,

    x=p1^q1*p2^q2......*pn^qn

    所以f(x)=f(p1^q1)*f(p2^q2)*......f(pn^qn)

    f(x)=x*(1-1/p1)*(1-1/p2)*......*(1-1/pn)

    很好推导,学会了这个过程也容易理解线筛求欧拉函数;

     

    2.公式

    a^f(n)=1 (mod n)   a,n互质

    a^(p-1)%p=1   p质数

    a^b (mod n)=a^(b mod f(n)) (mod n) a,n互质

    (p-1)!=-1 (mod p) 素数

    3.逆元

    用上面的公式,不信求不出来;

    有一个有趣的线性求法:

    m为质数

    m=ka+b

    ka+b=0 (mod m)

    kb-1+a-1=0(mod m)

    a-1=-kb-1(mod m)

    a-1=-(m/a)(1/(m%a)) (mod m)

    递推即可;

    4.中国剩余定理:

    x%m1=a1

    x%m2=a2

    ......

    x%mn=an

    如果mi互质,x=sum(ai*Mi*M-1)

    Mi=M/mi

    M-1为Mi对mi的乘法逆元;

    不互质怎么样?将方程合并;

    x%m1=a1  x=m1k1+a1

    x%m2=a2  x=m2k2+a2

    d=gcd(m1,m2)

    m1k1/d=m2k2/d+(a2-a1)/d d|(a2-a1),否则无解

    m1k1/d=(a2-a1)/d (mod m2/d)

    gcd解一下方程

    通解k1=k+r*m2/d

    带回去x=m1k1+a1=m1(k+r*m2/d)+a1

    x=m1k+m1m2/d*r+a1

    x=m1k+a1 (mod lcm(m1,m2))

    将所有的方程一一合并即可;

     

    5.bsgs大步小步算法

    a^x=b (mod n) n为素数

    设m=n^(1/2)

    先验证一下a^0-a^m mod n

    顺便记录一下a^0-a^m这些值

    然后算m+1-2m,如果有解,

    必然有a^i*a^m=b mod n

    两边乘a^(-m),

    则a^i=b*a^(-m) mod n

    检查一下a^i这些值中是否有b*a^(-m)这个数,用hash或map都可以;

    n不是素数怎么办?

    a^x=b mod n

    a^x+cn=b

    然后将n和一些a消一下,使gcd(a,n)=1;

    在用ex_gcd算一下;

    然后就可以算了。

  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/chadinblog/p/6044497.html
Copyright © 2011-2022 走看看