第一章・ノート「の情報セキュリティ数学的基礎」
可分
- 定義された
整数ドメインで、もし(A = Q \ CDOT B \)\そして、(B \)\割り切れる\(A \) 、表記(| B \)\ - プロパティ
- もし\(A | B、\ B | C \) 、その後、\(| C \)
- 場合\(C | A_ {I} 、\ iは1、\ 2、\ ..、\ = N \)は、次に\(C \)はまた、割り切れる\(A_ {I} \)の組み合わせ線形
素数,合数
- 素数を定義
以外は(1 \)\、それ自体、また素数としても知られている素数と呼ばない要因の数は、他の数の複合呼ばれます。 - \(2 \)最小の素数であります
区別素数
- A定理
合成数のための\(N- \)は、せいぜいがあってはならない(\ \ SQRT {N} \ ) 素因数。セット\(N = PQ \)に設けられ、\(P \)が最小因子である、\(P \当量Q \)
次に\(N = PQ \ GEQ P
^ {2} \) ので(P \当量\ \ SQRT {N}は\)
と仮定される(P \)は\合成数であるタイトルセットが一致しないと、分解が進むことができるので、\(P \)素数です。 - 定理推論
数の\(N- \)もはやそれが存在しない場合よりも、\(\ SQRT {N} \ ) 素因数は、それが素数ではありません。 - プライム通常決定
列挙子を(2- \ SQRT {N} \ \) 素数、存在する場合(N- \)\因子、次いで\(N- \)それ以外の場合は合成数であり、素数です。
ふるいです
ふるい方法を見つけるために使用される\(2-Nを\)内のすべての素数です。
エジプト風の画面
-
アルゴリズムは、思考
のすべての数字が素数であると仮定します。
数の\(X \) 、それが素数である場合、複数の画面の全て、及びマークが合成数である;それは合成数は、変更なしである場合。 -
アルゴリズムの最適化
- プライムのための(X \)\、から(X \)\回列挙し始めます。倍なので\(X * Y、\ Y <X \) 、と判断した(Y \)\時間外の画面を。
たとえば、\(35 = 5 * 7 \) 、それは、決定した素数である\(5 \)に決定プライム一度行くことにするときふるい\(7 \)ダイレクトから缶とき\(* 7 = 7 49 \)は、ふるいを開始します。 - \(N- \)と判断内素数\(\ SQRT {N} \ ) ことができます。
- プライムのための(X \)\、から(X \)\回列挙し始めます。倍なので\(X * Y、\ Y <X \) 、と判断した(Y \)\時間外の画面を。
-
時間の複雑さがある\(O(nlglgn)\)
-
\(コード\)
int n, vis[N]; void getPrime() { for(int i = 2; i <= n; ++i) vis[i] = 1; for(int i = 2; i * i <= n; ++i){ if(vis[i]){ for(int j = i * i; j <= n; j += i) vis[j] = 0; } } }
オイラー画面
-
エジプトスタイルの画面の窮状と向上
いくつかの合成数は、例えば、時間に上映される\(= 3×21 7 * 9 = 63 \) 。 -
最適化された
各係合が再び画面にのみ素因数の最小数であるように、複雑さを制御することができる\(O(N)\) -
ディテール
- デフォルトでは、すべての最初の数字は、次のサイクルで考慮素数、です。
- 現在の数が素数である場合、複合数が画面に最小素因数であることを保証する複数の要因にその画面全体、すべての。
- 現在の数が画面にプライム複数の合成数である場合、\(X \)場合、\(X \)サイクルされた後、新たな倍数に缶を与えるために続けて分割現在の複合番号ループは、終了する\(X \ )割り切れます。
-
\(コード\)
int n, prime[N], vis[N]; int Euler_sieve() { int cnt = 0;//length of prime table for(int i = 2; i <= n; ++i) vis[i] = 1; for(int i = 2; i <= n; ++i){ if(vis[i]) prime[++cnt] = i; for(int j = 1; j <= cnt && prime[j] * i <= n; ++j){ vis[prime[j] * i] = 0; if(i % prime[j] == 0) break; } } return cnt; }
進変換
検討\(K \) 、次に数字バンドを\(\用桁)が範囲([0、\ K)\ )\
- 小数点への変換
のための(N \)\ビット\(K \) 、すなわち進数に進、
-
10進数に変換\(K \)バンド
最初のモード\(K \)ローで得られた\(K \) 、次いで他に、バイナリの値\(K \)低い丸め。//k 进制的字符串向十进制转换 int num = 0; for(int i = 0; i < s.length(); ++i) num *= 10, num += s[i] - '0'; //十进制转换为 k 进制 stack<int> sta; while(num) { sta.push(num % k); num /= k; } while(!sta.empty()) cout<<sta.top()<<endl, sta.pop();
最大公約数と最小公倍数
-
定義の両方
にその名前に単語。前者は、最小の公倍数である最大の共通因子です。 -
関係
\ [\ B] = \ FRAC {AB} {(\ B)} \]\ [[A_ {0}、\ A_ {1}、\ ... \、A_ {N}] = \ FRAC {\ prod_ {I = 0} ^ {n}はA_ {I}} {(A_ {0 }、\ A_ {1}、\ ... \、A_ {N})} \]証明によって\((\ FRAC {A}、{(A、\ B)}、\ \ FRAC {B}を{(A、\ B)})= 1 \) 、および\((\ B) = 1 、\、[、\ B] = ABは、\) 式で示すことができます。
ユークリッドの互除法
ユークリッドアルゴリズムは、ユークリッド計算最大公約数です。
- 定理\(1 \)
\(A = B + C CDOT Q \ \) 、中((A、\ B)=(B、\ C)\)\セット\((\ B)
= D_ {1}、\(B \ C)= D_ {2} \) 次に\(D_ {1} | \ D_ {1} | B、\ D_ { C \)|} 1、そう\(D_ {1} \当量
D_ {2} \) 同様\(D_ {2} | B \ D_ {2} | C、\ D_ {2} | \) したがって\(D_ {2} \当量
D_ {1} \) ので\(D_ {1} = D_ {2} \) - 定理\(2 \)
\((A、\ 0)= A \)\(A \)である\(A \)最大因子\(A \)である\(0 \)因子、\((\ 0) = A \)
- ユークリッドアルゴリズムの
セット\(0} = R_ {A、\ R_ {} = B. 1、\ + R_ {N-0。1} = \) 、下記式\ [R_ {0} = R_ {1} Q_ {1} + R_ {2} \\ R_ {1} = R_ {2} Q_ {2} + R_ {3} \\ ... \\ R_ {I - 1} = R_ {I} Q_ {I} + R_ {I + 1} \\ ... \\ R_ {N - 1} = R_ {N} Q_ {N} + R_ {N + 1} \]定理によれば\(1 \)と定理\(2 \)最大公約数を取得することができます分割後と、
ベズーの等式
- \(S \ CDOT A + T \ CDOT B =(\ B)\)
- 推測\(R_ {I} = S_ {I} T_ {A + B} I \ I \ [0、\ N-] \) 、この推測を証明するために、数学的誘導を使用して。
ユークリッドアルゴリズムを展開
シークする((\ B)\ \) を同時に決定(S \ CDOT A + T \ \ \ CDOT B =(\ b)参照) 、特定の溶液である\(S_ {0}、\ T_ {0 } \)
-
再帰的アルゴリズムの
検討事項は、数学的帰納の推測によって実証されています\ [R_ {I} = S_ {I} +のT_ {I} B、\のI \ [0、\ n]は\]同時
\ [R_ {I} = R_ {I - 2} - Q_ {I - 1} R_ {I - 1} \]取得再帰
\ [S_ {I} = S_ {I - 2} - S_ {I - 1} Q_ {I - 1} \]\ [T_ {I} = T_ {I - 2} - T_ {I - 1} Q_ {I - 1} \]ここで、\(I \)から(2 \)\、カウントを開始し、すなわち\(I \ [2、で \ N] \)
\ [Q_ {I} = \ [\ FRAC {R_ {I - 1}}左\] \右{R_ {I}}]\ [R_ {I} = R_ {I - 1} \ MOD \ R_ {I} = R_ {I - 1} - Q_ {I} R_ {I} \]ここで、\(I \)から(1 \)\、カウントを開始し、すなわち\(I \ [1、 \ N - 1] \)
入手しやすい、初期値を考えてみましょう
\ [S_ {0} = 1、\ S_ {1} = 0 \]\ [T_ {0} = 0、\ T_ {1} = 1 \]\ [R_ {0} = A、\ R_ {1} = B \]\ [\] Q_ {1} = \左[\ FRAC {} {B} \右]だから、再帰的な方法は、あなたが最終的に特別な解を得ることができます。
、空間の最適化を考慮することができるだけ\(S_ {0}、\ S_ {1}、\ T_ {0}、\ T_ {1}、\ R_ {0}、\ R_ {1}、\ Q_ {0} \ )再帰ためのいくつかの変数、中間変数の値を保存する割当必要に導入された場合、最終的な空間的複雑さは一定です。
int s0, s1, s2, t0, t1, t2, r0, r1, r2, q1, cnt; pair<int, int> exgcd(int a, int b) { s0 = 1, s1 = 0, t0 = 0, t1 = 1; r0 = b, r1 = a % b, q1 = a / b; while(r1) { s2 = s1, s1 = s0 - s1 * q1, s0 = s2; t2 = t1, t1 = t0 - t1 * q1, t0 = t2; q1 = r0 / r1; r2 = r1, r1 = r0 - q1 * r1, r0 = r2; } return pair<int, int> {s1, t1}; }
-
再帰アルゴリズム
と再帰端を考慮\(B = 0、\(A、\ B)= A \) 、そう\(S = 1、T =
0 \) 考えを求めた\ \((Bを\ %のB)\)場合には\(X '\ Y' \) 、解決するバック\((A、Bを\) \) 下\(X、\ Y \)
の\ [BX '+( - \ \ FRAC \ lfloorを左{} {B} \右\ rfloor b)はY' = AX + \によって]解決済み
\ [X = Y '\ Y = X' - \右\ {} {B} \ FRAC \ lfloorを左\ rfloor Y」\]したがって、それは特殊なソリューション群を得ることができるすべての方法バックある\(X_ {0}、\ Y_ {0} \)
-
\(コード\)
int exgcd(int a, int b, int &x, int &y) { if(!b) {x = 1, y = 0; return a;} int r = exgcd(b, a % b, y, x);//y的值被修改为x',x的值被修改为y' y -= (a / b) * x; return r; }
算術の基本定理
- 算術の基本定理
任意より大きいため(1 \)\整数(N- \)\と呼ばれる電力の形で製品の素因数に分割することができ、\(N- \) :標準的な分解\ [N = \ prod_ {I = 1} ^ {K} P_ {I} ^ {\ alpha_ {I}} \]前記は、\(P_ {I} \)素数です。 - 多くの要因
乗算原理によって知られている、\(N- \)数因子であります\ [N = \ prod_ {I = 1} ^ {K}(1 + \ alpha_ {I})\]