數論四大定理(爭取用最少的篇幅給你們講解清楚)

1:費馬小定理

      我看好多博客在範圍方面沒有給清楚,我自己推了一下,給一個比較清晰的概念:

      如果p是一個質數且a不是p的倍數,那麼a^(p-1)≡1(mod p)。

      那麼如果p是一個質數,a是p的倍數呢??大家可以手推一下!a=kp,(kp)^(p-1)%p=1%p;坐便等於0;右邊等於1;所以不成立,但是此時我們可以給一個統一式子!

      對於質數p,任意整數a,均滿足:a^p≡a(mod p)

     這個式子包含了所有情況!討論a是不是p的倍數。

    1:假如不是,右邊不爲0,兩邊同時除以右邊,得到費馬小定理的最基本的式子;

    2:假如是,右邊爲0,不可以同時除以a,a=kp,左右兩邊都等於0;

2:威爾遜定理

     假如p爲素數,則(p-1)!-1(mod p)

     關於證明點擊這裏,寫得還算清楚

     但是有一個有趣的現象,威爾遜定理的逆也是正確的!

     假如n>=2;如果(n-1)!-1(mod n) 那麼 n是素數!

3:歐拉定理

   若正整數 a , n 互質,則  a^φ(n)≡1(mod n)   其中 φ(n) 是歐拉函數(1~n) 與 n 互質的數。

   歐拉定理的證明

   歐拉定理的推論:

   若正整數a,n互質,那麼對於任意正整數b,有a^b≡a^(b mod φ(n))(mod n)

   更牛逼的來了

   歐拉定理的拓展公式(公式這麼多,記住並不難,大家都是經歷過高考的)

   當a,n不互質的時候,我們也有辦法對指數進行取模,簡化運算:

    歐拉定理的擴展: a^b≡a^(bmodϕ(m)+ϕ(m))mod(m) b≥ϕ(m)

  4:中國剩餘定理(孫子定理)

 

 

中國剩餘定理介紹

在《孫子算經》中有這樣一個問題:“今有物不知其數,三三數之剩二(除以3餘2),五五數之剩三(除以5餘3),七七數之剩二(除以7餘2),問物幾何?”這個問題稱爲“孫子問題”,該問題的一般解法國際上稱爲“中國剩餘定理”。

在《孫子歌訣》中給出瞭解決這個問題的解法:三人同行七十稀,五樹梅花廿一支,七子團圓正半月,除百零五便得知。很是朗朗上口,但這是什麼意思呢?

具體解法分三步:

找出三個數:

1.從3和5的公倍數中找出被7除餘1的最小數15,從3和7的公倍數中找出被5除餘1 的最小數21,最後從5和7的公倍數中找出除3餘1的最小數70。

2.用15乘以2(2爲最終結果除以7的餘數),用21乘以3(3爲最終結果除以5的餘數),同理,用70乘以2(2爲最終結果除以3的餘數),然後把三個乘積相加(15*2+21*3+70*2)得到和233。

3.用233除以3,5,7三個數的最小公倍數105,得到餘數23,即233%105=23。這個餘數23就是符合條件的最小數。

就這麼簡單。我們在感嘆神奇的同時不禁想知道古人是如何想到這個方法的,有什麼基本的數學依據嗎?

用現代數學的語言來說明的話,中國剩餘定理給出了以下的一元線性同餘方程組:

有解的判定條件,並用構造法給出了在有解情況下解的具體形式。

中國剩餘定理說明:假設整數m1,m2, ... ,mn兩兩互質,則對任意的整數:a1,a2, ... ,an,方程組有解,並且通解可以用如下方式構造得到:

設 是整數m1,m2, ... ,mn的乘積,並設是除了mi以外的n- 1個整數的乘積。設 的數論倒數(意義下的逆元)

方程組的通解形式爲

在模的意義下,方程組只有一個解:

模板是:

中國剩餘定理
有一個最小的數t
t%2=1
t%3=1
…
///不存在的話輸出-1

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
ll a[1000],b[1000];
ll Mod;
ll gcd(ll a, ll b)
{
    if(b==0)
        return a;
    return gcd(b,a%b);
}

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

//a在模n乘法下的逆元,沒有則返回-1
ll inv(ll a, ll n)
{
    ll x,y;
    ll t = Extend_Euclid(a,n,x,y);
    if(t != 1)
        return -1;
    return (x%n+n)%n;
}

//將兩個方程合併爲一個
bool merge(ll a1, ll n1, ll a2, ll n2, ll& a3, ll& n3)
{
    ll d = gcd(n1,n2);
    ll c = a2-a1;
    if(c%d)
        return false;
    c = (c%n2+n2)%n2;
    c /= d;
    n1 /= d;
    n2 /= d;
    c *= inv(n1,n2);
    c %= n2;
    c *= n1*d;
    c += a1;
    n3 = n1*n2*d;
    a3 = (c%n3+n3)%n3;
    return true;
}

//求模線性方程組x=ai(mod ni),ni可以不互質
ll China_Reminder2(int len, ll* a, ll* n)
{
    ll a1=a[0],n1=n[0];
    ll a2,n2;
    for(int i = 1; i < len; i++)
    {
        ll aa,nn;
        a2 = a[i],n2=n[i];
        if(!merge(a1,n1,a2,n2,aa,nn))
            return -1;
        a1 = aa;
        n1 = nn;
    }
    Mod = n1;
    return (a1%n1+n1)%n1;
}

int main()
{
    int i;
    int k;
    while(scanf("%d",&k)!=EOF)
    {
        for(i = 0; i < k; i++)
            scanf("%lld %lld",&a[i],&b[i]);
        printf("%lld\n",China_Reminder2(k,b,a));
    }
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章