HRBU-ACM 数论基础(附加代码篇)

1.欧几里得

int gcd(int a,int b){
    while(b){
        int t=a%b;
        a=b; 
        b=t;
    }
    return a;
}

2.扩展欧几里得

                乘法逆元:如果有ax≡1( mod p),则称x是mod p意义下a的乘法逆元。

    逆元:x是最小的正整数解;

int e(int a,int b,int &x,int &y){
    if(b!=0){
        x=1;
        y=0;
        return a;
    }
    int ans=e(b,a%b,x,y)
    int temp=x;
    x=y;
    y=temp-(a/b)*x;
    return ans;
} //ans是最大公约数,x是逆元;

3.欧拉函数

          Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。 
  欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。.

int Euler(int n){
    int ret=n;
    for(int i=2;i<=sqrt(n);i++)
     if(n%i==0){
        ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i)))
        while(n%i==0)
          n/=i;
     }
    if(n>1)
          ret=ret/n*(n-1);
    return ret;
}

4.中国剩余定理

 设正整数两两互素,则同余方程组

 

                             

 

  有整数解。并且在模下的解是唯一的,解为

 

                               

 

  其中,而的逆元。

 

int shengyu(int a[],int m[],int n) {  
    int M = 1;  
    int ans = 0;  
    for(int i=1; i<=n; i++)  
        M*=m[i];  
    for(int i=1; i<=n; i++) {  
        int x,y;  
        int Mi=M/m[i];  
        e(Mi,m[i],x,y);  //扩展欧几里得
        ans=(ans+Mi*x*a[i])%M;  
    }  
    if(ans<0) ans+=M;  
    return ans;  
}

5.费马小定理

即费马小定理。

  容易知:逆元即为 x^(p-2);

long long qmod(long long a, long long b, long long p) {
    long long ans= 1;
    long long base= a%p;
    while(b) {
        if(b&1)
            ans=(ans*base)%p;
        base=(base*base)%p;
        b>>= 1;
    } 
    return ans;
}

 

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