# Prime --- ### 主講人: 簡子軒、邱怡涵、林政啟 地點:S515 日期:109/10/16 --- ### 目錄 --- 1. Prime Numbers 1. Femat’s & Euler’s Theorems 1. Primality Test --- ### Prime Numbers --- ### 質數定義 --- $x∈Z+,x>1$ is called a prime, $if ∀y∈Z+,1<y<x⇒x(mod y) ≠ 0$ --- ### 算術基本定理 --- 定義 $∀A∈N,A>1,∃n∏i=1p^{a_i}_i=A.$ 其中$p_1<p_2<p_3<⋯<p_n$ 而且$p_i$是一個質數,$a_i∈Z+$ --- 每個大於1的正整數都可以由一個以上的質數乘積計算得到,過程稱為質因數分解,且若以大小順序排序這些質因數,只會有一解代表每個正整數。 $e.g. 660=2∗3∗5∗11$ 而且為了保證定理的唯一性(避免被多次累乘),1被正式定義為非質數。 --- ### Femat’s & Euler’s Theorems --- ### 費馬小定理 --- 假如$a∈Z+$,$p$是一個質數 如果$a$不是$p$的倍數,這個定理也可以寫成 $a^p−1≡1(mod p)$ 若 $a^p−a$ 是p的倍數 --- 證明(1) --- $a^{(p−1)}≡1 (mod p)$ 因為 a 與 p 互質,且 p 為質數,所以 $A={1,2,3,...,(p−1)}(mod p)$ $B={1×a,2×a,3×a,...,(p−1)×a}(mod p)$ $⇒1×a×2×a×3×a,...,(p−1)×a (mod p)$ $=1×2×3,...,(p−1) (mod p)$ $⇒(a^{(p−1)}−1)×1×2×3,...,(p−1) (mod p)=0$ --- 因為 $1,2,3,...,(p−1)$皆與 $p$ 互質 $⇒a^{(p−1)}−1≡0 (mod p)$ $⇒a^{(p−1)}≡1 (mod p)$ --- 證明(2) --- $a^p≡a(mod p)$ 已知 $a^{(p−1)}≡1 (mod p)$ 成立 $⇒a^{(p−1)}×a≡1×a (mod p)$ $⇒a^{(p)}≡a (mod p)$ --- ### 歐拉定理 --- 歐拉定理為費馬小定理的推廣 當$a∈Z^+,n∈Z^+,gcd(a,n)=1$ 的話 $a^φ(n) ≡ 1 (mod p)$ --- ### 歐拉函數 --- $φ(n)$ 對正整數n,小於或等於n的正整數中與n互質的總個數 $x={n∈Z+|∀y∈{i∈Z+,i≤n},gcd(n,y)=1}$ $φ(1)=1$ (小於等於1的正整數中和1互質的數只有1本身)。 --- 若n是質數的時,$φ(n)=n−1$, 所以歐拉定理變回費馬小定理: $a^{n−1}≡1(mod p)$ $a^n≡a(mod p)$ --- ### Primality Test --- 最入門基礎的質數尋找方式,非常的直觀 基本上就是用兩個for包起來,時間複雜度為O($n^2$) --- 優化 $— 1 ~ √n$ 假設 n 為合數,必定可以拆為 $n=a∗b$ 所以 $a,b$ 必定會有一數小於等於 $√n$ --- ### Sieve of Eratosthenes --- 給定一範圍 2~n 所使用的原理是從2開始 將每個質數的各個倍數篩除 剩餘的皆會是質數 --- ```cpp bool prime[20000000]; void eratosthenes(){ for (int i=0; i<20000000; i++) // 初始化 prime[i] = true; prime[0] = false; // 0 和 1 不是質數 prime[1] = false; // 找下一個未被刪掉的數字 for (int i=2; i<20000000; i++) if (prime[i])// 刪掉質數i的倍數,從兩倍開始。保留原本質數。 for (int j=i+i; j<20000000; j+=i) prime[j] = false; } ``` --- ### Linear Sieve Algorithm --- 從上一張的埃式篩,我們能夠發現這是可以被優化的,在埃式篩一個數可能會被多次檢查 ( 像是 $210=2∗3∗5∗7$ ,就會被檢查到4次 ),這樣的時間就被浪費。 --- ```cpp bool sieve[N]; void linear_sieve() { vector<int> prime; for (int i=2; i<N; i++) { if (!sieve[i]) prime.push_back(i); for (int j=0; i*prime[j]<N; j++) { sieve[i*prime[j]] = true; if (i % prime[j] == 0) break; } } } ``` --- ### 費馬質數判定法 --- 缺點: 不保證找出的質數必為質數,可能存在偽質數 應用: 加密程序PGP在算法當中用到了這個質性檢驗方法 --- ### 判斷n是不是質數 --- ``` Input n,k; for in range k: a=random(2,n−1) if(an−1≢1(modn)) return False return True ``` --- ### 謝謝大家
{"metaMigratedAt":"2023-06-15T14:52:04.376Z","metaMigratedFrom":"YAML","title":"Prime","breaks":true,"slideOptions":"{\"theme\":\"black\",\"treansition\":\"zoom\"}","contributors":"[{\"id\":\"d52a93a1-1936-4f13-bddc-4b51357ec0cf\",\"add\":4785,\"del\":2366},{\"id\":\"ea18ac12-78d9-4a97-8523-9916bd103452\",\"add\":9,\"del\":3},{\"id\":\"8cc3ed5a-89a7-48cd-83fb-2c7d356aee19\",\"add\":0,\"del\":1}]"}
    511 views
   Owned this note