数论入门学习笔记
數論入門
- 一、整除的性質
- 二、模運算與同余運算
- 1.模運算及其性質
- 2.同余運算及其性質
- 三、快速冪
- 1. 快速冪
- 2.光速冪
- 四、最大公因數與最小公倍數
- 輾轉相除法(歐幾里得算法)
- 五、素數與素數篩
- 1.素數
- 2.素數篩
- 六、逆元
- 1.歐拉定理
- 2.費馬小定理
躺在草稿箱里的大一寫的博客(個人感覺寫的還行)
一、整除的性質
1. 整除:若a%b==0,則稱a能被b整除或b能整除a,記作b | a.
2. 整除性質:
(1)若 a|b <=> -a|b <=> a|-b <=> |a| | |b|
(2)若 a|b,b|c ?\Rightarrow? a|c
(3)若 a|b,a|c ?\Rightarrow? a|(bx+cy) 其中 x,y 為任意整數
(4)若 a|b ?\Rightarrow? am | bm 其中 m 為非零整數
(5)若 a|b,b|a ?\Rightarrow? b = ±a <=> |b|=|a|
(6)若 a|bc,且 a 與 c 互質,則 a|b
(7)若a|b,a|c,且b與c互質,則a|bc
(8)若a|b,c為任意整數,則b|ac
二、模運算與同余運算
1.模運算及其性質
(1) 取模運算:a % p(a mod p),表示 a 除以 p 的余數。
(2) 模 p 加法:(a + b) % p = (a%p + b%p) % p
(3) 模 p 減法:(a - b) % p = (a%p - b%p) % p
(4) 模 p 乘法:(a * b) % p = ((a % p)*(b % p)) % p
(5) 冪模 p:(a^b) % p = ((a % p)^b) % p
(6) 模運算滿足結合律、交換律和分配律。
(7) a≡b (mod n) 表示 a 和 b 模 n 同余,即 a 和 b 除以 n 的余數相等
注意:模運算無除法,不可使用(a / b) % p = (a%p / b%p) % p,遇到除法取模時,可求其乘法逆元
2.同余運算及其性質
(1)反身性:a≡a (mod m);
(2)對稱性:若 a≡b(mod m),則 b≡a (mod m);
(3)傳遞性:若 a≡b(mod m),b≡c(mod m),則 a≡c(mod m);
(4)同余式相加:若 a≡b(mod m),c≡d(mod m),則 a±c≡b±d(mod m);
(5)同余式相乘:若 a≡b(mod m),c≡d(mod m),則 ac≡bd(mod m)。
三、快速冪
1. 快速冪
假設要求xn ,那么原題可以很輕松的表示為:xn= (((x2)2)2…)。這樣只要做k次平方運算就能解決,時間復雜度就從O(n)下降到 log(n),只要冪運算的冪可以寫成 2k 的形式,就可以用上面的方法降低時間復雜度。所以我們可以將任意的實數n改寫有限個2k的形式的相乘。
例如假設 xn 等于 322 。x = 3, n = 22 = 10110(B),則有322 = 316 ×\times× 34×\times× 32,即310110 = 310000 ×\times× 300100×\times× 300010。
代碼樣例:
typedef long long ll; ll quick_pow(ll a, ll n) //快速冪 a^n {ll ans = 1, base = a;while (n) {if (n & 1) ans = ans * base;base = base * base; //計算1所在的位置的取值n >>= 1; //二進制右移}return ans; }快速冪取模:
typedef long long ll; ll quick_pow(ll a, ll n, ll mod) //快速冪取模 a^n % mod {ll ans = 1, base = a;while (n) {if (n & 1) ans = ans * base % mod;base = base * base % mod; n >>= 1; }return ans; }- 另一種理解方法:
- 當b為偶數時,xn 可以轉為 x^2 的 b2\frac{2}2b? 次方。
- 當b為奇數時,xn 可以轉為 x^2 的 b2\frac{2}2b? 次方,再乘以 x
代碼解釋:
ll pow(ll a,ll n) //快速冪 a^n {ll ans = 1, base = a;while(n){if(n & 1) ans = ans * base ; //n為奇數base = base * base ; //n為偶數時,底數平方n >>= 1; //指數減半}return ans; }2.光速冪
四、最大公因數與最小公倍數
輾轉相除法(歐幾里得算法)
以除數和余數反復做除法運算,當余數為 0 時,取當前算式除數為最大公約數
- 引入定理: gcd(a,b) = gcd(b, a %b)
gcd代碼:
int gcd(int a, int b) {int Rem;while (b > 0) {Rem = a % b;a = b;b = Rem;}return a; }gcd代碼簡化:
int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b); }定理:a、b 兩個數的最小公倍數乘以它們的最大公約數等于 a 和 b 本身的乘積。
- lcm(a,b) * gcd(a,b) = a * b
在求 lcm 時,如果將 lcm 寫成 a * b / gcd(a,b),a*b 可能會溢出,正確的方法應該是先除后乘,即:lcm(a,b) = a / gcd(a,b) * b
lcm代碼:
int lcm(int a, int b) {return a / gcd(a, b) * b; }多個數(a1, a2, a3…am)的 lcm ,先求出 a1,a2 的 lcm ,再求出 lcm(lcm(a1,a2), a3)……
五、素數與素數篩
1.素數
- 質數是指在大于 1 的自然數中,除了 1 和它本身以外不再有其他因數的自然數
判斷素數代碼:
bool is_prime(int num) {for (int i = 2; i * i <= num; i++) {if (num % i == 0)return false;}return true; }2.素數篩
- 素數篩就是快速篩出素數的算法
1.1 埃篩
- 復雜度 O(nloglogn)
埃篩代碼:
const int MAXN = 1e6 + 5; bool is[MAXN];//is[i] 1 is prime , 0 is not a prime int prime[MAXN], cnt = 0; void getprime() {memset(is, 1, sizeof(is));is[0] = is[1] = 0;for (int i = 2; i < MAXN; i++) {if (is[i]) {prime[cnt++] = i;for (int j = 2; i * j < MAXN; j++) {is[i * j] = 0;}}} }1.2 線性篩
- 復雜度 O(n)
線性篩代碼:
const int MAXN = 1e6 + 5; bool is[MAXN];//is[i] 1 is prime , 0 is not a prime int prime[MAXN], cnt = 0;void getprime() {memset(is, 1, sizeof(is));is[0] = is[1] = 0;for (int i = 2; i < MAXN; i++) {if (is[i]) {prime[cnt++] = i;}for (int j = 0; j < cnt; j++) {if (i * prime[j] > MAXN) //判斷數組下標是否越界break;is[i * prime[j]] = 0;if (i % prime[j] == 0) //根據最小素數因子篩除,避免重復篩選break;}} }六、逆元
1.歐拉定理
- 若 n,a 為正整數,且 n,a 互質,則:a ^ φ\varphiφ(n) ≡ 1(mod n)
2.費馬小定理
- 如果 p 是一個質數,而整數 a 不是 p 的倍數,則有 a ^(p-1)≡1(mod p)
總結
- 上一篇: OpenDRIVE地图图形化
- 下一篇: opendrive坐标系