三年前寫過一篇博文,https://my.oschina.net/qidis/blog/3098902, 裏面介紹瞭如何表示大數的方法。 即如何將一個很長的十進制整數字符串轉化成二進制字符串,最終使用int[]來表達BigInteger。文章中提到了需要將二進制還原成十進制的問題,最近這個問題我似乎想明白了,遂記錄之。
進制轉化可以轉化爲如上的數學模型, p進制和q進制的轉化。
p取2,取值於集合{0,1}, 即爲整數的二進制表示。
q取10,取值於集合{0,1,2,3,4,5,6,7,8,9},即爲整數的十進制表示。
問題:已知 , 求。
解題: 先求m,然後依次求解
如何求解m。
設需要表示的整數爲n, 那麼n的範圍爲 。
使用夾逼法則即可確定m。
令
運用對數法則:
挺神奇的,這樣能得到, 並且 和m相當接近。 向下取整
依次嘗試
即可確定m的值, 確定m的值之後再來確定的值。
其實這裏有一種更簡單直觀的做法:
逐個區間進行嘗試,n一定會落在某個區間。
簡單的做法往往是低效率的,但也並非無意義。
再次使用夾逼原則:
這個過程應該可以使用二分法,先取a=5, 然後取a=3或者a=7.
確定了再確定的值。
令
重複上述過程即可求出集合 。
不難發現,整個過程其實是在不停的進行乘法和加減法的運算,以及比較運算。
比如一直在比較二進制整數和十進制整數的大小。 其比較法則是將十進制轉化爲二進制,然後比較兩個二進制數的大小。
二進制1100 和十進制10大小的比較:
將10轉化爲1010 ,
1100
1010
顯然1100更大。
大數BigInteger可以說是整個安全領域最基礎的零件。
其實本文也是在模擬大數除法的過程,只不過除以的是10。
以下的屬於意外之喜,本來是沒有想過這個問題的。
大數做除法的過程:
1:先確定商的長度
2: 然後依次從高往低確定商每個位置的數值。
3:剩餘的即爲餘數
:
需要的數學知識其實也都十分基礎,數列,集合,夾逼,對數函數,級數。
然後利用的級數展開進行計算
簡易的實現,勿噴。https://gitee.com/tuerqidi/my-biginteger