目錄
一、背景知識回顧
1、什麼是質數?
質數(prime number)又稱素數,有無限個。
質數定義爲在大於1的自然數中,除了1和它本身以外不再有其他因數。
2、≡的意思?
≡ 的意思是左右兩邊的數對p求模結果相同。
3、mod的意思?
指求模運算。
4、數論中的倒數(也成爲逆元)
我們知道:如果a*x = 1,那麼x是a的倒數,x = 1/a,但是a如果不是1,那麼x就是小數。
那麼在數論中,大部分情況下都有求餘,所以現在問題變了
現在有:a*x ≡ 1 (mod p)
那麼x一定等於1/a嗎?
不一定
那麼在這個時候,我們就把x看成a的倒數,只不過加了一個求餘條件,所以x叫做a關於p的逆元。
二、什麼是費馬小定理?
費馬小定理是數論中的一個定理。其內容爲假如a是一個整數,p是一個質數的話,那麼:
ap = a(mod p)
假如a不是p的倍數的話,那麼這個定理也可以寫成:
ap − 1 = 1(mod p)
這個書寫方式更加常用些。
三、費馬小定理歷史
皮埃爾·德·費馬於1636年發現了這個定理,在一封1640年10月18日的信中他第一次使用了上面的書寫方式。在他的信中費馬還提出a是一個質數的要求。這個要求實際上不存在。
四、費馬小定理證明
任意取一個質數,比如13。考慮從1到12的一系列整數1,2,3,4,5,6,7,8,9,10,11,12,給這些數都乘上一個與13互質的數,比如3,得到3,6,9,12,15,18,21,24,27,30,33,36。對於模13來說,這些數同餘於3,6,9,12,2,5,8,11,1,4,7,10。這些餘數實際上就是原來的1,2,3,4,5,6,7,8,9,10,11,12,只是順序不同而已。
把1,2,3,„,12統統乘起來,乘積就是12的階乘12!。把3,6,9,„,36也統統乘起來,並且提出公因子3,乘積就是312×12!。對於模13來說,這兩個乘積都同餘於1,2,3,„,12系列,儘管順序不是一一對應,即312×12!≡12!mod 13。兩邊同時除以12!得312≡1 mod 13。如果用p代替13,用x代替3,就得到費馬小定理。
證明來自:《數論妙趣——數學女王的盛情款待》第六章 開門咒
五、應用
費馬小定理可以快速求得x關於p的逆元(參看上面逆元的概念)。
前提當然得是x與p互質纔有逆元。
即:x*x^p-2 ≡ 1 (mod p)
所以x^p-2就是x關於p的逆元。
六、求逆元的代碼實現
這裏使用了快速冪算法來求x^p-2。
#include<iostream>
#define ll long long
using namespace std;
ll quickpow(ll a, ll b, ll p){
ll temp = 1;
while(b){
if(b & 1) temp = (temp * a) % p;
a = (a * a) % p;
b >>= 1;
}
return temp;
}
int main()
{
ll a, p;
cin>>a>>p;
cout<<quickpow(a, p-2, p)<<endl;
return 0;
}
參考博客:
1、逆元的概念與逆元的計算:https://www.cnblogs.com/linyujun/p/5194184.html
2、費馬小定理證明:https://www.cnblogs.com/flipped/p/5218037.html
3、快速冪算法:https://blog.csdn.net/weixin_42151279/article/details/81057137