數論學習總結

ohac發表於2013-08-04

   1.整數分解定理,即:d=p1^r1*p2^r2...pk^rk (pi為素數)

   2.同餘:

   若a mod c==b mod c,記作 a b (mod c).

   性質:

       (1).a+d ≡ b+d (mod c)

       (2).a*d ≡ b*d (mod c)

       (3).a/d ≡ b/d (mod c) (d|a&&d|b&&gcd(d,c)==1)

       (4).a^n ≡ b^n (mod c)

3.歐幾里得演算法:

   gcd(a,b)=gcd(b,a mod b).

   證:

     gcd(a,b)=gcd(b,a-b),因為若a,b有最大公約數d,則a=k1*d,b=d2*d,則a-b=(k1-k2)*d也為d的倍數。

     而 mod 相當於做多次減法。

   引理:gcd(a,b)*lcm(a,b)=a*b;

   證:

   由整數分解定理得:若a=p1^r1*p2^r2...pk^rk,b=p1^m1*p2^m2...pk^mk;

   則gcd(a,b)=p1^min(r1,m1)*p2^min(r2,m2)...pk^min(rk,mk)

     lcm(a,b)=p1^max(r1,m1)*p2^max(r2,m2)...pk^max(rk,mk)

   另一種gcd:
           若a為偶數,b為偶數,則gcd(a,b)=2*gcd(a/2,b/2)

        若a為奇數,b為奇數,則gcd(a,b)=gcd(b,a-b)

        若a為奇數,b為偶數,則gcd(a,b)=gcd(a,b/2)

        若a為偶數,b為奇數,則gcd(a,b)=gcd(a/2,b)

4.擴充套件歐幾里得

   背景:用於求形如 ax+by=c 的不定方程的解

   證:

     首先可以證明c一定為k*gcd(a,b),否則無解。

     下面說明如何在gcd中求出x,y

      x1*a+y1*b=gcd(a,b)

      x2*b+y2*(a%b)=gcd(a,b)

      可得:x1*a+y1*b=x2*b+y2*(a%b)

      整理可得:x1*a+y1*b=y2*a+(x2-y2*a/b)*b

      於是x1=y2,y1=x2-y2*(a/b)

   程式碼:

void exgcd(long long a,long long b,long long &x,long long &y,long long &d)
{
    if(b==0) {
        x=1;y=0;d=a;
        return;
    }
    exgcd(b,a%b,y,x,d);
    y-=x*(a/b);
    return;
}

      用途:

     (1).求解不定方程

     (2).模線性方程組

         形如:

         x mod k1=r1

         x mod k2=r2

         ...

         x mod km=rm

         我們的想法是:將 x mod ki=ri 轉換成x=p*ki+ri,將 x mod kj=rj轉換成x=q*kj+rj

         整理得:p*ki+ri=q*kj+rj

         可得:p*ki-q*kj=rj-ri

         接下來用擴充套件歐幾里得求出一組p,q,代入可得x,設為x0

         此時x0為這兩個方程的通解,然後就可以將兩方程合併,得 x mod lcm(ki,kj)=x0

         如此迴圈可得最終解

     (3).求逆元

         定義:若(a*b) mod p=1,則稱a,b互為關於p的逆元

         用途:(a/b) mod p=(a*k) mod p (k為b的逆元)

         證:http://blog.sina.com.cn/s/blog_7c4c33190100s48a.html