首页 > 代码库 > [蒟蒻修炼计划][学习笔记]数论(一)

[蒟蒻修炼计划][学习笔记]数论(一)

扩展欧几里得

求二元一次不定方程技术分享的一组解。

技术分享时,有一组解 技术分享

技术分享时,因为 技术分享

所以设技术分享满足技术分享,

技术分享,

整理得 技术分享

所以技术分享

就可以在求gcd的过程中得到一组解。

inline int exgcd(int a,int b,int &x,int &y){    if(!b){        x=1;y=0;return a;    }    else{        int ret=exgcd(b,a%b,y,x);        y-=a/b*x;return ret;    }}

欧拉函数

欧拉函数技术分享的定义:小于等于技术分享的正整数中与技术分享互质的数的个数。

技术分享时,技术分享

技术分享时,技术分享可以写成技术分享个素数的幂的积的形式,第技术分享个素数的质数为技术分享:

技术分享

根据容斥原理得,技术分享

简单地推一下后发现,技术分享

BSGS

求最小的技术分享使得技术分享为质数。

技术分享,则技术分享,即技术分享

将所有的技术分享技术分享存起来,从小到大枚举技术分享,直到技术分享是某个技术分享

此时答案为技术分享

技术分享由费马小定理可得,技术分享,所以 技术分享,

   所以可以用快速幂实现除法(技术分享时会有技术分享)。

typedef long long ll; map<ll,ll> m;inline ll po(ll x,ll k,ll p){    ll ret=1;    while(k){        if(k&1) ret=ret*x%p;        x=x*x%p;k>>=1;    }    return ret;}inline ll bsgs(ll a,ll b,ll p){    if(gcd(a,p)!=1) return -1;
    ll s=sqrt(p),k=1,x=1,y;    while(s*s<=p) ++s;    for(ll i=0;i<s;++i){        if(!m[k]) m[k]=i;
        k=k*a%p;    }    for(ll i=0;i<s;++i){        y=b*po(x,p-2,p)%p;        if(m.count(y))            return i*s+m[y];        x=x*k%p;    }    return -1;}

[蒟蒻修炼计划][学习笔记]数论(一)