大數即不能用常規方法在計算機裡面表示的數,比長整型更長,例如256位,2048位的巨大數字。
大數計算包括大數的加減乘除、指數、開方、平方、求模等等。其中的加減法相對比較簡單,只要將大數從低到高逐字帶進位相加或者相減即可實現。大數乘法和除法則可以由加法和減法通過一定的邏輯得到,這裡使用除法作為例子進行講解。
方法:移位減法。
輸入:
被除數a,最高位255位為1;
除數b,最高位200位為1;
輸出:
商q = a / b;
餘數r = a % b;
計算:
1,令q = 0,r = a;
2,令n = MSBa - MSBb = 55;
3,B = b左移55位;
4,i自0至n-1執行:
(1)q = q << 1;
(2)若a >= b,a = a - B, q = q + 1;
(3)B = B >> 1;
(4)i = i + 1;
5, 輸出q和r。
原理:
實際上這是一種權計算方法,b左移n位跟a最高位對齊之後,如果a大於b,那麼從a減去b,同時,商的第n位置1,表示此時a中包含2^n個原始的b,以此類推,便可以得到最終的結果,最後當b回到原始值的時候,a-b剩餘的值就是餘數(模)。
按照同樣的方法,可以用移位加的方式實現大數的乘法。再類推一下,使用移位乘的方式可以實現大數的指數運算。
時間複雜度:
加減法的時間複雜度跟位數是線性關係;
乘除法的時間複雜度跟位數的平方是線性關係;
指數運算的時間複雜度跟位數的三次方是線性關係;
類似移位減這種除法的電路:
有一種高速流水線模數轉換電路,每個時鐘只轉換相應權位的一個位。例如要進行一個16位的A/D轉換,輸入模擬量x,輸出d[15:0]
第一級流水線:若x >= Vref/2^1,d[15] = 1, x = x - Vref/2(模擬減法器),否則D[15] = 0, x = x;
第一級流水線:若x >= Vref/2^2,d[14] = 1, x = x - Vref/4,否則D[14] = 0,x = x;
……
輸出幾位的結果就有幾級流水線,按照上述方法,可以實現極高速度的模數轉換。
每天都有新的收穫