這是我寫的第一份博客,以後會堅持寫下去。我是一隻菜鳥,不求能寫出精緻的文章,只是想借助CSDN這個載體把自己學到的知識在這裏記錄一下順便鞏固一下;
這是我暑假留校的第二週,第一週學習的是C語言進階,第二週學習的是數論的部分知識,感覺數論的知識難以理解,因此在這裏重點寫一下數論的知識,順序是學長所講內容的從後往前寫;
好了步入正題:在講算法之前先總結一下需要提前掌握的概念:
①同餘式:同餘式是數論的基本概念之一,設m是給定的一個正整數,a、b是整數,若滿足m|(a-b),則稱a與b對模m同餘,記爲 a≡b(mod m),或記爲a≡b(m)。這個式子稱爲模m的同餘式,若m∤ (a-b),則稱a、b對模m不同餘,同餘概念又常表達爲:
1.a=b+km(k∈Z);
2.a和b被m除時有相同的餘數。 同餘式的記號由高斯(Gauss,C.F.)於1800年首創,發表在他的數論專著《算術研究》之中。
--------------引自《百度百科》
②取模運算規則:
-
(a + b) % p = (a % p + b % p) % p
-
(a - b) % p = (a % p - b % p) % p
-
(a * b) % p = (a % p * b % p) % p
-
a ^ b % p = ((a % p)^b) % p
值得注意的是這裏並沒有關於(a / b) % p 的運算規則。
③乘法逆元:
若ax≡1 mod f, 則稱a關於1模f的乘法逆元爲x。也可表示爲a * x≡1(mod f)。另外可以寫成 a * x = bf + 1;
那麼爲什麼要有乘法逆元呢?這裏就要提到上面的取模運算規則 ,我也在上文提到 取模運算沒有關於 (a / b) % m 的運算規則,那麼當 a 於 b 都很大是怎麼辦呢? 就要提到 乘法逆元了 對於 a 的乘法逆元 x,x % m =(1 / a)% m 及可以將 (a / b) % m 轉換爲:
(x % m * b%m)% m 這樣就解決了a與b過大的問題;那麼該怎麼求乘法逆元呢?別急下面進入數論的算法整理。