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;
}