1. 程式人生 > >乘法逆元(對於質數模數的乘法逆元)

乘法逆元(對於質數模數的乘法逆元)

逆元是什麼

  • 設S為一有二元運算 * 的集合。若e為(S,*)的單位元且a*b=e,則a稱為b的左逆元素且b稱為a的右逆元素。若一元素x同時是y的左逆元素和右逆元素時,x稱為y的兩面逆元素或簡稱為逆元素。S內的一有兩面逆元素的元素被稱為在S內為可逆的。
  • 直觀地說,它是一個可以取消另一給定元素運算的元素。

乘法逆元

  • 也就是說,對於一個乘法運算b,它的乘法逆元就是它的倒數 b1

分數取模

  • 然而在很多題目中,資料都是十分大的,所以題目經常會出現”答案模Ha”,就是對Ha取模,這裡Ha一般是個質數,比如說最常見的 109+7 ( 1000000007 ),此時,要是答案是個分數,那該怎麼辦呢?答案就是要用到分數取模的方法。

  • 先把內容寫出來,下面再證明:

當gcd(b,Ha)==1時(其實就是 b 和 Ha 互質)

ab1abHa2 (mod Ha)

這裡的”≡”是同餘符號,意思是左邊那個和右邊那個除以最後括號裡的Ha的餘數相同。
這樣我們要求a/b模Ha的值時,就不會不知所措,只需求出 abHa2 模Ha的值就行了。

證明

這個的證明需要用到費馬小定理,費馬小定理就先不證了,可以百度或看其它的博文。

費馬小定理:

  • 假如p是質數,且gcd(a,p)=1,那麼 ap1 ≡ 1 (mod p)
  • 即:假如a是整數,p是質數,且a,p互質(即兩者只有一個公約數1),那麼a的(p-1)次方除以p的餘數恆等於1。

gcd(b,Ha)==1那麼我們就可以做一下推導(此處模數都為Ha,就不打上去了):

bHa1 ≡ 1
bHa2b1
abHa2ab1

第二行是第一行兩邊同乘 b1 得到的

這樣,分數取模我們就學會了。

注意

要注意幾點:
* Ha必須是質數
* b與Ha要互質