第一章 数论(基础知识1.1-1.3)

1.1 整除

定义:称a整除b , 如果 ∃q∈Z , st b=a*q ,记作 a|b.

性质:

  1. 传递性:如果a|b,b|c,则a|c
  2. a|b且a|c ↔ ∀x,y∈Z , a|(b*x+c*y)
  3. 若a*x+b*y=1, 且a|n,b|n,则(a*b)|n

1.2 同余

定义:a就模m来说同余于b,如果(a-b)|m,其中a b为整数,m为自然数,记作a≡b(mod m) .

性质:

  1. 自反性: a≡a(mod m) 
  2. 对称性:a≡b(mod m) ,b≡a(mod m)
  3. 传递性:a≡b(mod m) ,b≡c(mod m),则 a≡c(mod m)  
  4. 同加性:a≡b(mod m) ,则a+c≡b+c(mod m)
  5. 同乘性:a≡b(mod m) ,a*c≡b*c(mod m)       a≡b(mod m) c≡d(mod m) 则a*c≡b*d(mod m)   
  6. 同幂性:a≡b(mod m), a­^n≡b^n(mod m)
  7. a*b mod k=(a mod k) *(b mod k) mod k
  8. a mod p=x,a mod q=x,p q互质,则a mod p*q=x

1.3最大公约数 

1.3.1辗转相除法

int GCD(int x,int y)
{
    return y==0?x:GCD(y,x%y);
}

1.3.2二进制算法(更相减损术)

  x y均为偶数:GCD(x,y)=2*GCD(x/2,y/2)
  x为偶数:GCD(x,y)=GCD(x/2,y)
  y为偶数:GCD(x,y)=GCD(x,y/2)
  x y均为奇数:GCD(x,y)=GCD(x-y,y)

int GCD(int x,int y)
{
    int i,j;
    
    if(x==0||y==0)return x+y;
    for(i=0;0==(x&1);++i)//判断奇偶性,偶数循环
        x>>=1;
    for(j=0;0==(y&1);++j)//判断奇偶性,偶数循环
        y>>=1;
        
    if(j<i)i=j;//取较小循环次数  GCD(x,y)=2*GCD(x/2,y/2)
    while(1)
    {
        if(x<y)swap(x,y);
        x-=y;
        if(x==y)return y<<i;//终止条件
        while(0==(x&1))//偶数循环
            x>>=1;
    }
}

1.3.3最小公倍数

LCM(a,b)=a*b div GCD(a,b)

1.3.4扩展欧几里得算法

已知a b求一组x y,满足 a*x+b*y=gcd(a,b)

推导:

GCD(a,b)=GCD(b,a%b)

p*a+q*b=p*b+q*(a%b)=p*b+q*(a-a/b*b)=q*a+(p-a/b*q)*b

int extended_gcd(int a,int b,int &x,int &y)
{
    int ret,tmp;
    if(!b)
    {
        x=1;y=0;//特殊情况下的一组解
        return a;
    }
    ret=extended_gcd(b,a%b,x,y);
    tmp=x;
    x=y;
    y=tmp-a/b*y;//最终的x y方程的一组通解
    return ret;//最终的ret是a b的最大公约数
}

 1.3.5求解线性同余方程组

a*x+b*y=c:

step 1:extended(a,b,x,y)得一组通解(x0,y0)

step 2:x=x0*(c/GCD(a,b))+b*t   y=y0*(c/GCD(a,b))-a*t

猜你喜欢

转载自blog.csdn.net/sdau20171989/article/details/81253224