简单数论学
本次內容包括:快速冪,拓展歐幾里得,同余逆元,埃氏篩法
快速冪
背景:求a的n次冪
常規方法:循環累乘 復雜度O(n)
數論方法:快速冪,使用二進制拆分或分治。復雜度對數級
二進制拆分:將n從二進制角度去看,不斷二進制右移,當末位為1則乘,每次右移都會改變乘數1 2 4 8。
代碼:
或者有
int fastpow(int a,int n) {int ans=1;while(n){if(n&1){ans*=a;}a=fastpow(a,a)n>>=1;} }分治:層層拆分后分堆合并。
代碼:
temp=fastpow(a,n/2);注意這一步
拓展:矩陣快速冪
重點:將矩陣視為同快速冪中的整數元素即可。
主要操作有:定義矩陣乘法,初始化矩陣,設置單位矩陣。
0.
初始化矩陣
1.矩陣乘法線性代數有學不再說明:
Matrix multi(matrix a,matrix b)//乘法二元操作 {matrix res;for(int i=0;i<50;i++){for(int j=0;j<50;j++){for(int k=0;k<50;k++){res.m[i][j]+=a.m[i][k]*b.m[k][j];//從左向右,分行乘列,層層進行}}}return res; }2.設置單位矩陣與矩陣快速冪
int fastpow(matrix a,int n) {matrix res;for(int i=0;i<50;i++)res.m[i][i]=1;while(n){if(n&1)Matrixmulti(res,a);a=Matrixmulti(a,a);n>>=1;}return res; }拓展歐幾里得
四步走,我之前有寫,不再寫了。
同余逆元
同余: a和b取模于m的余數相同,成為同余。
性質:a-b是m的整數倍
應用:構成二元一次方程ax+by=mn
逆元: ax和1取模于m同余。得到ax-my=1,得到ax+my=1視m為參數,加號可允許m可正可負,得到二元一次方程之后,用拓展歐幾里得求解的得出逆元
代碼:
應用:逆元與除法取模
a,b,k設k是b的逆元
則對于(a/b)%m=ak%m
求二元一次方程
如果知道了a的逆,那么可求ax與b取模m同余的方程,
設a的逆為k
x與k*b取模于m同余。
埃氏篩法
思想:找從2到n所有的素數,從頭開始,2是最小的素數,然后把2-n中所有2的倍數刪去,下一個素數是3,把所有3的倍數刪去。
實操:刪除操作可以用單鏈表,也可以用標記數組來完成。
總結
- 上一篇: VB2010(17)_消息对话框Mess
- 下一篇: POJ 2798:二进制转换十六进制