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算一下;

    然后就可以算了。

  • 相关阅读:
    python笔记第二节
    python笔记第一节
    hadoop 家族生态圈 小结
    JDBC:impala 连接DEMO
    关于excel表格的导入导出的工具类。(java 反射 excel)
    简单写了一个类似全文检索的帮助类。
    关于框架SSM中文乱码问题总结
    关于SpringMVC, bean对象中含有Date型变,改如何接收数据的问题。
    Nlog
    java手动编译
  • 原文地址:https://www.cnblogs.com/chadinblog/p/6044497.html
Copyright © 2011-2022 走看看