欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

時間復(fù)雜度取決于大整數(shù)乘法的大整數(shù)除法的制作方法

文檔序號:6348375閱讀:305來源:國知局
專利名稱:時間復(fù)雜度取決于大整數(shù)乘法的大整數(shù)除法的制作方法
技術(shù)領(lǐng)域
本發(fā)明主要提供一種特殊的分治遞歸運算的大整數(shù)除法(包括整除的商值及整除后取余數(shù))。這種算法主要應(yīng)用于計算機領(lǐng)域,尤其是加密技術(shù)中。
背景技術(shù)
當(dāng)前公開或使用的大整數(shù)除法即使采用Knuth的經(jīng)典名著“The Art ofComputerProgramming”的第4.3.1節(jié)中的猜商值公式來計算,也需要多次試運算,所有這些大整數(shù)除法最大的缺點是時間復(fù)雜度:T(n) =0(n2)這與大整數(shù)乘法相比差遠了。因此減少試運算的次數(shù),降低時間復(fù)雜度對大整數(shù)除法具有特別重要的意義。本文依據(jù)全新的計算理論,構(gòu)造了獨特的大整數(shù)除法計算方法,文中實施例使試運算出現(xiàn)的概率遠低于現(xiàn)有算法,即使出現(xiàn)也只需一次加法運算,不僅如此,更為重要的是本文采用特殊的分治遞歸的方法充分利用大整數(shù)乘法,使大整數(shù)除法的時間復(fù)雜度等于大整數(shù)除法中所采用的大整數(shù)乘法的時間復(fù)雜度,例如大整數(shù)除法中采用Karatsuba乘法加速時,本文中的大整數(shù)除法時間復(fù)
雜度:T(n) =O(nlog23),如果采用其他更快的大整數(shù)乘法,本算法會更快,這就使數(shù)值
很長的大整數(shù)除法的計算速度大幅提高,例如當(dāng)被除數(shù)的長度為4194304個四字節(jié),除數(shù)長度為2097152個四字節(jié)時,本算法中采用Karatsuba乘法加速時的速度為現(xiàn)有大整數(shù)除法速度的30倍左右。

發(fā)明內(nèi)容
本文在這部分將推出一種全新的大整數(shù)除法計算理論,并利用該理論構(gòu)造分治的大整數(shù)除法,在分治中充分利用大整數(shù)乘法,以達到加速目的。請看下面的推理:設(shè)大整數(shù)運算過程中采用h (大于1的整數(shù))進制,正整數(shù)集合:Z = {x| x > 0并且[x] = x}集合1:H = {x | 0≤x < h并且X為整數(shù)}集合2 =H2 = {x | 1≤X < h并且X為整數(shù)}任何有限長度的大整數(shù)除法都可轉(zhuǎn)化為非負大整數(shù)的除法,因此除了最后一段夕卜,下文只涉及非負大整數(shù)除法,非負大整數(shù)除法可表示如下:C = A/B (A≥0,B>0,C≥0并且A和B都是整數(shù)) (1)當(dāng)A = O 時,顯然 C = O,(2)當(dāng)A <B時,顯然C的整數(shù)部分為0,(3)當(dāng)A≥B時,可通過將被除數(shù)和除數(shù)都乘以hm從而使A和B都轉(zhuǎn)化為不小于hm的整數(shù),并使結(jié)果C保持不變,其中m≥2且m∈ Z,因此(1)式在排除(2)、(3)后,可轉(zhuǎn)化為下式:C = A/B (A 彡≥B,B ≥hm,m ≥ 2,C>0且A、B和 m都是正整數(shù)) (4)在⑷中A =(A1A2A3...Ai-1Ai)h可用多項式表示如下:A = Ahi-1+A3hi-2+A3hi-3+…+Ai-1h1+Ai(5)
其中
權(quán)利要求
1.種分治的大整數(shù)整除的方法,其工作流程用偽碼表示如下:void SuperDivision_Core (A, B, C,int k ) //調(diào)用時A、B都是大整數(shù)對象,分別對應(yīng){ //被除數(shù)、除數(shù)、應(yīng)在A、B后面預(yù)留F位空間,并將B中預(yù)留空間歸0,計算完成之 //后,結(jié)束時,模余在A中,商數(shù)的整數(shù)部分在C中,當(dāng)然應(yīng)用時這些參數(shù)可能就是一 //個整數(shù)類型或字符串類型的數(shù)組或指針以及相關(guān)變量(含指針)共同來實現(xiàn),外部調(diào) //用(不含自身遞歸)該函數(shù)之前應(yīng)滿足Aj<B,且被除數(shù)的長度為2k,除數(shù)的 //長度為k,并滿足k=2' reZ, if (Al=NULL) At.pf inger=A.pfinger+ k*2;//首次調(diào)用時,設(shè)置好A中當(dāng)前高端定位點指針At.pfinger, //At最好為static對象(含指針) if(k=N)//當(dāng)數(shù)值較小時,常規(guī)除法更有效, { Ac.pfinger=AT.pfinger- (N*2+F) ; //使 Ac.pfinger 指向 A 中當(dāng)前低端定位點 I/ Ac就是從A中當(dāng)前低端定位點的數(shù)位開始向高位延伸到第I個非0數(shù)位共同構(gòu)成 //的大整數(shù)(如果沒有非0數(shù),則Ac表示0) MinDivision(Ac, B.pfinger-F, N+F,C.pfinger );//在MinDivision中,第二個參數(shù)表示指向除數(shù)的指針,第三個參數(shù)表示 //除數(shù)長度,MinDivision函數(shù)的功能是計算C,并計算A' =Kf -E' C, //此處Ac與A'對應(yīng),不允許給C.pfinger[N]賦值,否則就會出現(xiàn)0覆蓋 At.pfinger=A1.pfinger-N; return; } Jc/9 B二BlIi +Br ; //將 B 分割為兩半,并且 Br.pfinger=B.pfinger // Bl pfinger=B.pfinger+k/2 , Bl Length = Br Length =k/2 , Ir JOC=CiJi +Cr ; //將 C 分割為兩半,并且 Cr.pfinger=C.pfingerIl Cl.pfinger=C.pfinger+k/2 ,Cl.Length =Cr.Length ^k/2, SuperDivision_Core(NULL , Bl , Cl k/2); //遞歸 SetCurrentA (At,Al) ; // 設(shè)置 Al,如設(shè)置 Al.pfinger=AT.pfinger -k-F;使 //Al.pfinger指向A中當(dāng)前低端定位點等 AL=AL-SuperMultiply (Br.pfinger -F,k/2, Cl.pfinger , k/2);//SuperMuItiply的功能是計算兩個大整數(shù)的乘積,此處Al與A7對應(yīng), if(AL<0) { //小概率事件Al: Al+ (Bh +Bk+ih + Bk+2h +Bk+3h + +Bk+F); Cl= Cl-1; }SuperDivision_Core(NULL, Bl, Cr,k/2) ;//遞歸 SetCurrentA (At , Ar ) ; //設(shè)置好 Ar,如設(shè)置 Ar.pfinger=AT.pfinger -k-F;使//Ar.pfinger指向A中當(dāng)前低端定位點等AR=AR-SuperMultiply(Br.pfinger ~F, k/2, Cr.pfinger , k/2); //此處Ar與A'對應(yīng), if (Ar〈O) { //小概率事件 Ar=Ar+ (BhF+Bk+1hF_1+ Bk+2hF-2+ BMhF—3+…+Bk+P); Cr= Cr-1; } return ; }
2.種分治的大整數(shù)整除的方法,其工作流程用偽碼表示如下:void SuperDivision_Core(A, B,C,int k ) //調(diào)用時A、B都是大整數(shù)對象,分別對應(yīng){ //被除數(shù)、除數(shù)、應(yīng)在A、B后面預(yù)留F位空間,并將B中預(yù)留空間歸0,計算完成之 //后,結(jié)束時,模余在A中,商數(shù)的整數(shù)部分在C中,當(dāng)然應(yīng)用時這些參數(shù)可能就是一 //個整數(shù)類型或字符串類型的數(shù)組或指針以及相關(guān)變量(含指針)共同來實現(xiàn),外部調(diào) //用(不含自身遞歸)該函數(shù)之前應(yīng)滿足Aj<B,且被除數(shù)的長度為2k,除數(shù)的 //長度為k,并滿足Ic==S1", reZ, if(Al=NULL) At.pfinger=A.pfinger+ k*2; //首次調(diào)用時,設(shè)置好A中當(dāng)前高端定位點指針At.pfinger, //At最好為static對象(含指針) if(k==N)//當(dāng)數(shù)值較小時,常規(guī)除法更有效, {Ac.pfinger=AT.pfinger-(N*2+F); //使 Ac.pfinger 指向 A 中當(dāng)前低端定位點// Ac就是從A中當(dāng)前低端定位點的數(shù)位開始向高位延伸到第I個非0數(shù)位共同構(gòu)成
3.種分治的大整數(shù)整除的方法,其工作流程用偽碼表示如下:SuperDivision(A, B, C, Y )//調(diào)用時,A為被除數(shù),B為除數(shù),{//結(jié)束時,C保存整除的商數(shù)、Y保存模余 if(FormatReady (A, B) =FALSE) return 0; // 若參數(shù)非法,則返回 0; //FormatReady的功能主要是分配空間,將預(yù)留空間清0,并將A、B的數(shù)據(jù)復(fù) //制到新空間上合適位置,并使A.pfinger、B.pfinger指向所對應(yīng)的新空間, //并且A.pfinger、B.pfinger之后都至少有F個預(yù)留空間,如果B.Length不等 //于2的整數(shù)次幕,則應(yīng)將從A、B復(fù)制到新空間上的數(shù)據(jù)都向高端移動相同個基數(shù) //位(騰空位置應(yīng)清0),相當(dāng)于將A、B都乘以一個整數(shù),以確保B.Length等于2 //的整數(shù)次冪,并對A作出修剪處理,以使(Aj<B&&A.Length%B.Length==CM //B.pf inger [B.Length-1] !=0)成立,所述修剪可通過向A前加0或調(diào)用 //BigDivision函數(shù)對A的部分高端數(shù)據(jù)進行處理,算出部分高端商數(shù) pAf inger=A.pfinger;C.pfinger= C.pf inger+A.Length-B.Length;A.pf inger= A.pf inger+A.Length-B.Length;while (A.pf inger >pAf inger) { A.pfinger= A.pfinger - B.Length; C.pfinger= C.p f inger-B.Length; SuperDivision一Core(A, B, C, B.Length); } Y=A; //得到余數(shù)Clear (A, B); //釋放 FormatReady (A, B)時,所分配的空間 return C.Length;}
4.據(jù)權(quán)利要求3所述大整數(shù)整除的方法,其特征是:SuperDivision_Core算法采用權(quán)利要求1中所述的方法。
5.據(jù)權(quán)利要求3所述大整數(shù)整除的方法,其特征是:SuperDivision_Core算法采用權(quán)利要求2中所述的方法。
6.種大整數(shù)整除的方法,其工作流程用偽碼表示如下:BigDivision(A, B,C )//調(diào)用時A,B,都是大整數(shù)對象,分別對應(yīng)被除數(shù)、除{//數(shù)、應(yīng)在A前面至少預(yù)留I位空間,如果會出現(xiàn)A.Length=-1,則A后面至 //少預(yù)留I位空間,如果會出現(xiàn)B.Length==I,則B后面也至少預(yù)留I位空間, //并將預(yù)留空間歸(h計算完成之后,結(jié)束時模余在A中,商數(shù)的整數(shù)部分在C中, //當(dāng)然應(yīng)用時這些參數(shù)可能就是一個整數(shù)類型或字符串類型的數(shù)組或指針, i=A.Length; Il得到 A 長度 if (B. Length<=0| | i<=0) return O //非法返回 O pCWorkFinger=C.pfinger+i— B.Length; k%.pA2f inger=A.pf inger+i—2; Ac.pf inger ~ A.pf inger + 1-B.Length; //Ac就是指當(dāng)前A中處于工作狀態(tài)的數(shù)據(jù) while (Ac.pfinger〉= A.pfinger) {Ci=*(( unsigned CPUInteger *) kz.pf inger) /Bi ; //其中unsigned CPUInteger *表示在計算機中CPU帶寬無符號整數(shù)類型的數(shù)據(jù), //如在 64 比特計算機用 * (unsigned _int64*(A2.pfinger))獲取(Ai*h+A2) Y=*(( unsigned CPUInteger *)A2.pfinger) _ Ci*Bi ;Y= (U/2) ; //U為CPU帶寬值,如在64比特計算機中U=64Y+= *( kz.pfinger-1) ; // 即 Y+= A3 ; X= B2Ci if(X>Y) //這是由于C1大于正確值 {X=X-Y5 //此時 X=C1 (Bih+B2)- (Aih2+A2hi+A3) Cl= Cl- X/(Bih+B2) ; //這行和下面一行扣除C1超出部分, ifpC%(Bi*h+B2)) Ci= C1-1 ; } Ic-1 Ac=Ac-BxC1 ; //計算 A=A—B*Cih ; if (Ac <0)//即 if (ACO) { Ac = Ac+B ; //計算 A-A+Bh*4 1 ;C1=C1-1;} *pCWoikFinger=Ci ; pCWorkFinger- = 1 ; //每循環(huán)一次pCWorkFinger就在C上向低端滑動一個基數(shù)位 A2.pfinger -=1; //每循環(huán)一次A2就就在A上向低端滑動一個基數(shù)位 Ac.pfinger -=1; //每循環(huán)一次Ac就在A上向低端滑動一個基數(shù)位} }
7.種大整數(shù)整除的方法,其工作流程用偽碼表示如下:BigDivision(A, B,C )//調(diào)用時A,B,都是大整數(shù)對象,分別對應(yīng)被除數(shù)、除[//數(shù)、應(yīng)在A前面至少預(yù)留I位空間,如果會出現(xiàn)A.Length==1,則A后面至 //少預(yù)留1位空間,如果會出現(xiàn)B.Length==1,則B后面也至少預(yù)留1位空間, //并將預(yù)留空間歸0,計算完成之后,結(jié)束時模余在A中,商數(shù)的整數(shù)部分在C中, //當(dāng)然應(yīng)用時這些參數(shù)可能就是一個整數(shù)類型或字符串類型的數(shù)組或指針, i=A.Length; //得到 A 長度 if (B.LengtK=O丨丨 i<=0) return 0 //非法返回 0 pCWorkFinger=C.pfinger+i- B.Length; A2.pA2finger=A.pfinger+1-2; Ac.pfinger = A.pf inger+1-B.Length; //Ac就是指當(dāng)前A中處于工作狀態(tài)的數(shù)據(jù) while (Ac.pfinger〉= A.pfinger){C1=*(( unsigned CPUInteger *)A2.pfinger) /B1 ; //其中unsigned CPUInteger *表示在計算機中CPU帶寬無符號整數(shù)類型的數(shù)據(jù), //如在 64 比特計算機用 * (unsigned —int64*(A2.pfinger))獲取(A1*h+A2) Y=*(( unsigned CPUInteger *)A2.pfinger)— C1*B1 ; Y= (U/2) ; // U為CPU帶寬值,如在64比特計算機中U=64 Y+= *( A2.pfinger-1) ; // 即 Y+= A3 ; X= B2*C1 if(X>Y) //這是由于C1大于正確值 {
8.據(jù)權(quán)利要求1、2、3、4、5、6、7所述大整數(shù)整除的方法,其特征是:用于計算商值的整數(shù)部分,去掉保存余數(shù)的相關(guān)代碼。
9.據(jù)權(quán)利要求1、2、3、4、5、6、7所述大整數(shù)整除的方法,其特征是:用于計算整除后的余數(shù),去掉保存商值整數(shù)的相關(guān)代碼。
10.據(jù)權(quán)利要求1、2、3、4、5、6、7所述大整數(shù)整除的方法,其特征是:用迭代或循環(huán)替代遞歸。
全文摘要
本發(fā)明提供一種時間復(fù)雜度取決于大整數(shù)乘法的大整數(shù)除法(含整除及求余數(shù)),主要應(yīng)用于計算機領(lǐng)域,尤其是加密技術(shù)中。該方法,通過特殊的分治及預(yù)先處理高位數(shù)據(jù),頂多一次試運算就可鎖定高位的商數(shù),并且在算出多位高位商數(shù)后采用快速的大整數(shù)乘法來消項,這樣使大整數(shù)除法的計算效率得到大幅地提高,并且使大整數(shù)除法的時間復(fù)雜度取決于所采用的大整數(shù)乘法。
文檔編號G06F9/30GK103092568SQ20111035509
公開日2013年5月8日 申請日期2011年11月1日 優(yōu)先權(quán)日2011年11月1日
發(fā)明者劉海云 申請人:劉海云
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
罗定市| 喀喇| 防城港市| 手机| 白水县| 洛隆县| 安阳市| 宁海县| 东源县| 株洲市| 恩平市| 柳河县| 乐平市| 武义县| 托克逊县| 那曲县| 香港 | 祁门县| 山丹县| 石楼县| 汨罗市| 屏南县| 措美县| 遵义市| 阳曲县| 大邑县| 镇平县| 揭阳市| 连江县| 陵水| 沧州市| 任丘市| 文成县| 台东市| 安西县| 伊宁市| 偏关县| 西乌珠穆沁旗| 门源| 乌鲁木齐市| 库伦旗|