Q
對數整數整數
1
A
回答
1
好了,你必須通過你的意思是恆定的時候什麼小心。如果你正在處理固定寬度的整數,那麼一個簡單的for循環是有界的(對於基數爲2的64位整數,最壞的情況將是64次乘法),並且可能仍然比鑄造成浮點數更快,稱爲log
函數,並截斷回到一個整數。
如果您使用的是任意精度整數,那麼基本上不存在常量算法,因爲幾乎每個操作都至少爲O(log(n)),包括將其轉換爲浮點數。
這就是說,有一對夫婦的其他東西,你可以嘗試:
可以使用find first set操作找到2爲底的對數(雖然我不認爲Python提供這樣的功能) 。 x86爲此提供了bsr指令。這也是針對任意精度整數的少數操作之一,它可以是恆定的時間(儘管這取決於實現,內存存儲等)。
一旦你有一個基本2對數,你可以用它整數除法計算到任何電力的-2。
如果你只使用相同的基極b,和輸入由D ķ界,你可以使用的b相二進制搜索相結合的權力,這會爲O的預先計算的查找表(日誌( k)* log(n))爲任意精度整數(log(k)爲搜索,log(n)爲每個不等式比較)。
即使情況並非如此,仍然可以嘗試某種二進制搜索:通過平方加倍指數直到太大,然後從那裏進行二分搜索。
你最初的想法,用誤碼分析相結合,可以快速計算某些情況下,那麼你可以在不精確的人回落。 Python不爲2個參數的
log
提供誤差範圍(但不是很大,因爲您提供的例子應該是準確的),但現在最得體的數學庫,能夠計算出1 - 參數log
1個ULP內(單位在最後一個地方),並且將浮點和浮點除法轉換爲1/2 ulp以內,總的相對誤差爲3 ulps(因爲這些都是乘法),假設您的基數可以精確地表示爲浮點數(即不是像1e30
)。
在Python中,這將是:
import math, sys
def clog(n,b):
a = math.log(n)/math.log(b)
r = round(a)
i = int(r)
if abs(a-r) <= a*3*sys.float_info.epsilon:
# slow
if n > b**i:
return i+1
else:
return i
else:
return int(math.ceil(a))
相關問題
- 1. 整數和整數對偶?
- 2. 整數整數與整數的整數
- 3. 對稱整數到整數加密
- 4. 整數的ArrayList整數小整數
- 5. 整數數組整數VB.NET
- 6. CSVWriter對於整數數組
- 7. 對面PHP整數
- 8. 對整數輸入
- 9. 小數基數的整數對數
- 10. 整數NEQ Int(整數)Craziness
- 11. 大整數除以整數
- 12. 圓整雙數到整數?
- 13. 使用整數與整數
- 14. 大整數和雙整數
- 15. NAT2 :: [(整數,整數)定義
- 16. 調整兩列對一個整數集
- 17. 整數類型長整數和分數
- 18. 修改整數數組中的整數
- 19. 整數模數
- 20. 數組整數
- 21. 小數整數
- 22. 整數列表的整數值由個別整數值
- 23. 打印輸入整數從輸入整數到整數
- 24. 用戶輸入10個整數。需要對計數的整數和最大整數進行計數
- 25. 整數
- 26. 整數
- 27. 整數
- 28. 整數
- 29. 對整數轉換不足
- 30. 對齊整數(基本python)
好了,如果整數被固定精度,則迭代乘以所述鹼是已經恆定時間並且相反地任意精度的整數最任何操作是在最壞情況下的最短線性時間。我想這個棘手的問題是驗證一個近似值。也許從指數比特表示中快速冪函數的逆可能變成可用的二進制搜索,遞歸地平方B直到超過N,然後退回並乘以適合該路徑的冪。 – doynax
你在用什麼語言? –
@SimonByrne這個例子是用Python編寫的,但我相信問題是浮點硬件相關的(即與語言無關的)。 –