数论定理

海伦公式:S=\frac{1}{4}\sqrt{\left ( a+b+c \right )(a+b-c)(a+c-b)(b+c-a)}

 

  1.欧拉定理: ,正整数 a , p 互质,则 a^{\varphi \left ( p \right )}\equiv 1\left ( mod \, \, \, p \right ) ,其中 φ(p) 是欧拉函数(1~p) 与 p 互质的数。

  2.费马小定理:对于质数p,任意整数a,均满足:a^{p-1}\equiv 1\left ( mod \, \, \, p \right )

  3.欧拉定理的推论:若正整数a,p互质,那么对于任意正整数b,有a^{b}\equiv a^{b\; mod\varphi \left ( p \right )}\left ( mod \, \, \, p \right )

 

求逆元:

1.扩展欧几里得算法:

a*b\equiv 1(mod\;\;p)可推得a*b+k*p=1

a就是要求的逆元,最终的如果a是正数的话要 mod p,因为a加上mp的时侯k减少mb可以使得等式依然成立。

代码:

LL exgcd(LL a,LL b,LL &x,LL &y)//扩展欧几里得算法 
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    LL ret=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return ret;
}
LL getInv(int a,int mod)//求a在mod下的逆元,不存在逆元返回-1 
{
    LL x,y;
    LL d=exgcd(a,mod,x,y);
    return d==1?(x%mod+mod)%mod:-1;
}

注意:返回的时候可以改成(x+mod)%mod,因为扩展欧几里得算法算出来的x应该不会太大.

性能分析:

  • 时间复杂度:O(logn)(实际是斐波那契数列)
  • 适用范围:只要存在逆元即可求,适用于个数不多但是mod很大的时候,也是最常见的一种求逆元的方法。

2.费马小定理/欧拉定理

费马小定理:对于质数p,任意整数a,均满足:a^{p-1}\equiv 1\left ( mod \, \, \, p \right )  , 拆成a^{p-2}*a\equiv 1(mod\, \, p)

其中a^{p-2}就是a在mod p意义下的逆元。

欧拉定理: ,正整数 a , p 互质,则 a^{\varphi \left ( p \right )}\equiv 1\left ( mod \, \, \, p \right ) ,拆成a^{\varphi \left ( p \right )-1}*a\equiv 1\left ( mod \, \, \, p \right )

其中a^{\varphi \left ( p \right )-1}就是a在mod p意义下的逆元。

代码

LL qkpow(LL a,LL p,LL mod)
{
    LL t=1,tt=a%mod;
    while(p)
    {
        if(p&1)t=t*tt%mod;
        tt=tt*tt%mod;
        p>>=1;
    }
    return t;
}
LL getInv(LL a,LL mod)
{
    return qkpow(a,mod-2,mod);
}

性能分析:

  • O(logmod)
  • 适用范围:一般在mod是个素数的时候用,比扩欧快一点而且好写。
  • 但是如果是合数,相信一般没人无聊到去算个欧拉函数。

 

 

你可能感兴趣的:(数论定理)