亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 一個任意長整數(shù)的除數(shù)的算法??。 [打印本頁]

作者: pinktopone    時間: 2008-05-14 01:50
標(biāo)題: 一個任意長整數(shù)的除數(shù)的算法??。
已知正整數(shù)m, 一定存在一個非負(fù)整數(shù)n, 使得2的n次方小于等于m, 并且m小于2的n+1次方, 即2^n <= m < 2^(n+1); (不等式 1)

現(xiàn)求a/b! a, b都為正整數(shù)! 可設(shè)a = bm + r, m為商,r為余數(shù), 滿足 0<= r < b。  又根據(jù)上面的不等式1,
有 (b*(2^n) + r) <= (bm + r) < (b*(2^(n+1)) + r);     而 0 <= r < b;   
     b*(2^n) <= (b*(2^n) + r) <= a < (b*(2^(n+1)) + r) < (b*(2^(n+1)) + b);
有 b * (2^n) <= a < b * (2^(n+1)) + b; (不等式 2)    其實(shí)不等式2的右邊可縮小范圍為 a < b*(2^(n+1));
因?yàn)槿绻?a >= b*(2^(n+1)), 則m >= 2^(n+1)  明顯與不等式1矛盾.  我們有 b*(2^n) <= a < b*(2^(n+1)); (不等式3)
利用不等式3可求得2^n 和2^(n+1), 然后再利用折半查找(當(dāng)然也可以用其它更好的方法)查找滿足條件的m!

除法的非遞歸算法偽代碼如下:
       Divide: a, b
       //注意所有變量和常量都是任意長整數(shù),它們之間的各種操作和比較都應(yīng)另外實(shí)現(xiàn),這里的描述只是為了方便說明
       if(a < b) return 0;
       power1 = 1; power2= 2;  n = 0; value1 = b * power1; value2 = b * power2;
           while( !(value1 <= a && a < value2))           //利用不等式3,得到2^n和2^(n+1)
           {
                  power1 = power2;      power2 *= 2;     //power1,power2 分別代表2^n和2^(n+1)
                  value1 = b * power1;             // value1 =  b * (2^n)              
                  value2 = b * power2;             // value2 =  b * (2^(n+1))
                  n++;                                       // 通過n來估計m有多大,當(dāng)然n遠(yuǎn)比m小得多
            }
            //從2^n到2^(n+1)中折半查找,總共有2^n+1個元素(當(dāng)然2^(n+1)不會
        low = power1;  high = power2;
            while(low<=high){
                  mid = (low + high) / 2;           //這里另外寫一個除以2的函數(shù)(比較簡單),不過也啟發(fā)我們可以用遞歸實(shí)現(xiàn),可能又不一樣了
            if(0 <= (a - b * mid) && (a - b * mid) < b)     return mid;    //找到m
                  else  if((a - b * mid) < 0)  high = mid;                                //繼續(xù)在前半?yún)^(qū)進(jìn)行查找
            else  low = mid;                                                                 //繼續(xù)在后半?yún)^(qū)進(jìn)行查找
        }
               
以上就是我的一點(diǎn)思路,提出來讓大家看看,希望大牛們給提提意見!!( 前面說了那么多,只是為了讓大家更好理解,敬請原諒!)
當(dāng)然本人是個菜鳥,編程能力不行,只好寫偽代碼,也不知寫得對不對,請大家不要砸雞蛋石頭,多提點(diǎn)寶貴意見!謝謝!
作者: openq    時間: 2008-05-14 10:07
不知道你這個任意長,怎么個實(shí)現(xiàn)法。如果任意長是數(shù)字長度,不知道你這個算法如何適應(yīng)2048位的除法?
作者: pinktopone    時間: 2008-05-14 12:43
是的,任意長是指數(shù)字長度,當(dāng)然在現(xiàn)實(shí)中不可能是任意長,只要能滿足一定的需求就行了!
至于您說的2048位是指被除數(shù)還是商? 我的本意是如果n是幾百,幾千或者更大,那么2^n已經(jīng)是很大了, 而我個人分析認(rèn)為那個算法的復(fù)雜度是n+log2(2^n+1)≈2n(不知是否正確),那么你得到m
只需線性次加,減,乘和比較的操作就行了. 具體實(shí)現(xiàn)時,如果整數(shù)很大的話,連怎樣存儲都要仔細(xì)考慮,更不用說其它方面啦! 如果您說的是指n=2048的話,不知我是否可認(rèn)為大概只需4096次就可以算出m(2^n <= m < 2^(n+1))?? 我提出這個問題是為了知道這個算法是否可行??效率有多高???
希望大家多多指點(diǎn)!!




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2