GCD 扩展GCD 快速GCD 模线性方程 模线性方程组 单独求欧拉函数 递推求欧拉函数

来源:互联网 发布:mac os 10.13 cdr 编辑:程序博客网 时间:2024/06/06 00:23

GCD:

int GCD(int x, int y){    if (!x || !y)       return x>y ? x: y;    for (int t; t=x%y; x=y,y=t) ;    return y;}

扩展GCD:   求 x,y 使 gcd(a,b)=a*x+b*y;

int extGCD(int a, int b, int &x, int &y){    if (!b) {x=1; y=0; return a; }    int d=extGCD(b,a%b,x,y);    int t=x; x=y; y=t-a/b*y;    return d;}

快速GCD:某些大数据不能通过。

int kGCD(int x, int y){    if (!x || !y)       return x>y ? x: y;    if (!(x & 1) && !(y & 1))       return kGCD(x >> 1, y >> 1) << 1;    else       if (!(y & 1))          return kGCD(x,y >>1);       else          if (!(x & 1))             return kGCD(x >> 1,y);          else             return kGCD(abs(x-y),min(x,y));}


模线性方程:a*x = b(mod n)

void modeq(int a, int b, int n){    int d,x,y;    d=extGCD(a,n,x,y);    if (b%d>0)       printf("No Answer!\n");    else    {        int e=(x*(b/d))%n;        for (int i=0; i<d; i++) // x¿ÉÄÜ<0  ?           printf("%d-th ans: %d\n",i+1,(e+i*(n/d))%n);    }}


模线性方程组:a=b[k](mod b[k]); 其中w,b已知,w[i]>0 且w[i]与w[j]互质,求a;(中国余数定理)

int china(int b[], int w[], int k){    int n=1,a=0;    for (int i=0; i<k; i++) n*=w[i]; // 注意不要overflow;    for (int i=0; i<k; i++)    {        int m,d,x,y;        m=n/w[i];        d=extGCD(w[i],m,x,y);        a=(a+y*m*b[i])%n;    }    if (a>0)       return a;    else       return (a+n);}

单独求欧拉函数:

int euler(int x){    int res=x;    for (int i=2; i*i<=x; i++)       if (x % i==0)          {              res=res/i*(i-1);              while(x % i==0) x/=i;          }    if (x>1) res=res/x*(x-1);    return res;}


递推求欧拉函数:

int main(){    int maxn=100; int phi[maxn+1];    for (int i=1; i<=maxn; i++)       phi[i]=i;    for (int i=2; i<=maxn; i+=2)       phi[i]>>=1;    for (int i=3; i<=maxn; i+=2)       if (phi[i]==i)       {           for (int j=i; j<=maxn; j+=i)              phi[j]=phi[j]/i*(i-1);       }    return 0;}