您的位置:首页 > 其它

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

2013-07-26 08:34 513 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: