在右下角加上下標
\(數值_n\)
\(1101_2\)
以十進位為例
一個十進位數\(=\)第\(i\)位數\( \times 10^{i - 1}\) 的和
再看看二進位
一個二進位數\(=\)第\(i\)位數\( \times 2^{i - 1}\) 的和
推廣到n進位
一個n進位數\(=\)第\(i\)位數\( \times n^{i - 1}\) 的和
先把數字轉成我們最熟悉的十進位,再轉成其他的
//isp(x)判斷x是不是質數
bool isp(int x){
for(int i=2;i<x;i++){
if(x%i==0) return 0;
}
return 1;
}就判斷x有沒有除了1跟x以外的因數
好像有點慢?
//isp(x)判斷x是不是質數
bool isp(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0) return 0;
}
return 1;
}//isp(x)判斷x是不是質數
bool prime[1000000];
bool isp(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0) return 0;
}
return 1;
}
int main(){
for(int i=1;i<1000000;i++){
prime[i]=isp(i);
}
}//vector是一種長度可變的陣列
bool notprime[1000000];
vector<int> prime;
int main(){
for(int i=2;i<1000000;i++){
if(!notprime[i]) prime.push_back(i);
for(int j:prime){
if(i*j>=1000000) break;
notprime[i*j]=1;
if(i%j==0) break;
}
}
}//minp[i]紀錄i的最小質因數
int minp[10000000];
vector<int> prime;
int main(){
for(int i=2;i<10000000;i++){
if(!minp[i]) prime.push_back(i),minp[i]=i;
for(int j:prime){
if(i*j>=10000000) break;
minp[i*j]=j;
if(i%j==0) break;
}
}
}可以做質因數分解
在等號兩邊一起加減乘不會影響結果
但除法會是錯的
由餘數的定義可以知道\(a\)除以\(m\)
可表示成\(a = mq + r\),r是餘數
但如果\(a<0\)
那r可以是正的也可以是負的
例如:
\(-5除以2的餘數可以是-1也可以是1\)
在不同的程式語言有不同的結果
C++: (-5) % 2 = -1
Python:(-5) % 2 = 1
//算x^p
int pow(int x,int p){
int res=1;
while(p--) res*=x;
return res;
}一點也不快?
//算x^p
int pow(int x,int p){
if(p==1) return x;
int res=pow(x,p/2);
res*=res;
if(p%2==1) res*=x;
return res;
}二進位分解
以此類推,把我們要的位元乘起來
二進位分解
//算x^p
int pow(int x,int p){
int res=1;
for(;p>0;p/=2,x*=x)
if(p%2==1)
res*=x;
return res;
}小心不要overflow
\(gcd(a, b)\)
當b不是a的因數時
\(gcd(a, b)=gcd(b, a\%b)\)
\(gcd(64, 42) = gcd(42, 22) = gcd(22, 20) = gcd(20, 2) = 2\)
\(gcd(a, b) = gcd(b, a\%b)\)
令\(a = rb+q, q = a\%b\)
令\(d = gcd(a,b)\)
\(\because d|a\)
\(\therefore rb + q\equiv 0\pmod d\)
\(gcd(a, b) = gcd(b, a\%b)\)
令\(a = rb+q, q = a\%b\)
令\(d = gcd(a,b)\)
\(\because d|a\)
\(\therefore rb + q\equiv 0\pmod d\)
\(\because d|b\)
\(\therefore b\equiv 0\pmod d\)
\(\because rb \equiv 0\pmod d\)
\(\therefore rb+q\equiv 0 + q\equiv 0\pmod d\)
\(q\equiv 0\pmod d\)
\(gcd(a, b) = gcd(b, a\%b)\)
\(q\equiv 0\pmod d\)
\(a\%b\equiv 0\pmod d\)
\(d|a\%b, b\)
現在我們已經知道\(gcd(a, b)\)是\(b\)和\(a\%b\)的因數
那會不會有\(gcd(b, a\%b)>gcd(a, b)\)?
\(gcd(a, b) = gcd(b, a\%b)\)
假設\(b, a\%b有公因數d'\)
\(且d'>gcd(a, b)\)
\(a = rb+q\)
\(gcd(a, b) = gcd(b, a\%b)\)
假設\(b, a\%b有公因數d'\)
\(且d'>gcd(a, b)\)
\(a = rb+q\)
\(q=a\%b\)
\(rb\equiv 0\pmod {d'}\)
\(q\equiv 0\pmod {d'}\)
\(rb+q\equiv 0+0\equiv 0\pmod {d'}\)
\(a\equiv 0\pmod {d'}\)
\(gcd(a, b) = gcd(b, a\%b)\)
\(\because a\equiv 0\pmod{d'}\)
\(\therefore d'|a, b\)
\(gcd(a, b) >= d'\)
與假設矛盾
如果\(b|a\),則\(gcd(a, b) = b\)
否則\(gcd(a, b) = gcd(b, a\%b)\)
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}已知整數\(a, b\)
可計算\(ax+by=gcd(a, b)\)
\(x和y的解\)
令\(ax_1+by_1 = gcd(a, b)\)
令\(bx_2 + (a\%b)y_2=gcd(b, a\%b)\)
令\(ax_1+by_1 = gcd(a, b)\)
令\(bx_2 + (a\%b)y_2=gcd(b, a\%b)\)
由歐基里得算法可知
\(gcd(a, b) = gcd(b, a\%b)\)
令\(ax_1+by_1 = gcd(a, b)\)
令\(bx_2 + (a\%b)y_2=gcd(b, a\%b)\)
由歐基里得算法可知
\(gcd(a, b) = gcd(b, a\%b)\)
\(ax_1+by_1=bx_2+(a\%b)y_2\)
令\(ax_1+by_1 = gcd(a, b)\)
令\(bx_2 + (a\%b)y_2=gcd(b, a\%b)\)
由歐基里得算法可知
\(gcd(a, b) = gcd(b, a\%b)\)
\(ax_1+by_1=bx_2+(a\%b)y_2\)
\(a\%b=a-\lfloor a/b\rfloor b\)
令\(ax_1+by_1 = gcd(a, b)\)
令\(bx_2 + (a\%b)y_2=gcd(b, a\%b)\)
由歐基里得算法可知
\(gcd(a, b) = gcd(b, a\%b)\)
\(ax_1+by_1=bx_2+(a\%b)y_2\)
\(a\%b=a-\lfloor a/b\rfloor b\)
\(ax_1 + by_1 = bx_2+(a-\lfloor a/b\rfloor b)y_2\)
\(ax_1 + by_1 = bx_2+ay_2-\lfloor a/b\rfloor by_2\)
\(ax_1 + by_1 = bx_2+ay_2-\lfloor a/b\rfloor by_2\)
\(ax_1 + by_1 = bx_2+ay_2-\lfloor a/b\rfloor by_2\)
\(ax_1 + by_1 = ay_2 + b(x_2 - \lfloor a/b\rfloor y_2)\)
\(x_1 = y_2, y_1 = x_2 - \lfloor a/b\rfloor y_2\)
\(x_2, y_2是bx + (a\%b)y = gcd(b, a\%b)的解\)
所以只要求出\(bx+(a\%b)y=gcd(b, a\%b)\)
就可以透過\(x_1 = y_2, y_1 = x_2 - \lfloor a/b\rfloor y_2\)
推出\(ax+by=gcd(a, b)\)的解
\(ax+by=gcd(a, b)\)
如果\(b|a\)
則\(ax+by=b\)
\(x = 0, y = 1\)
pair<int, int> exgcd(int a, int b){
if(a % b == 0){
return {0, 1};
}
pair<int, int> tmp = exgcd(b, a % b);
return {tmp.second, tmp.first - a/b * tmp.second};
}void exgcd(int a, int b, int &x, int &y){
if(a % b == 0){
x = 0; y = 1;
return;
}
exgcd(b, a%b, y, x);
y = y - a / b * x;
}在同餘下的除法
除法不能用,但可以乘以倒數
模逆元只有在\(a, m互質時存在\)
如果\(a, m\)不互質
存在一個大於1的整數\(d\)使\(a=da', m=dm'\)
設x為一任意整數
試證明\(ax\%m \ne 1\)
\(ax = da'x\)
\((da'x)\%(dm')=d(a'x\%m')\)
\(\because d>1\)
\(\therefore d(a'x\%m') \ne 1\)
\(ax\% \ne 1\)
擴展歐幾里得
費馬小定理/歐拉函數
\(a^{p - 1} \equiv 1\pmod p\)
\(a\times a^{p - 2}\equiv 1\pmod p\)
\(\because a\times a^{-1}\equiv 1\pmod p\)
且\(a\times a^{p-2}\equiv 1\pmod p\)
\(\therefore a^{-1} \equiv a^{p-2}\pmod p\)
費馬小定理的推廣
要先證明一些東西
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
| 10 | 11 | 12 |
| 13 | 14 | 15 |
| 16 | 17 | 18 |
| 19 | 20 | 21 |
| 22 | 23 | 24 |
| 25 | 26 | 27 |
將n質因數分解
將次方提出來
整理一下
其實就只是質因數分解
設\(n=3\times 5\times 7t + 3\times 5r + 3s + q\)
則\(n \equiv q\pmod 3\)
\(n\equiv 3\times s+q\pmod 5\)
\(n\equiv 3\times 5r + 3s+q\pmod 7\)
用這個方式就可以推出n
解一個有\(k\)項的中國剩餘定理
其中任意兩\(m_i, m_j\)互質
令\(M = m_1\times m_2\times m_3 ... \times m_k\)
令\(M_i = M/m_i\)
\(n = a_1M_1M_1^{-1} + a_2M_2M_2^{-1}+...a_kM_kM_k^{-1}\)