最近我看到,給出瞭解決數論問題,我需要找到對(X,Y)的量x^k + y^k = n,其中給出k和n。我唯一的解決方案是暴力破解所有可能的x,y對,並檢查它們是否等於n。但是,我需要做的是爲大n和k,1 < = N < = 10^18,1 < = K < = 100。 什麼是最有效的方法呢?查找量,其中x-1K-+ Y^K = N
回答
一種可能的方法是使用a hash table。
首先,計算所有的值x ķ,爲此,結果低於ñ。將每個這樣的值添加到散列表中,映射到x(其他方式,而不是其他方式)。
之後,迭代通過鍵X ķ從散列集,並檢查是否補體,即 N - X ķ也是在哈希集合的密鑰。
如果n - X ķ也是一個鍵,則該哈希表將其映射到值y,使得n - X ķ = Y ķ,我們確定了有效的(X, y)對。
否則,如果n - x k不是散列表的關鍵,那麼沒有解決方案,其中x是一個元素。
對上述基本思想進行了改進。例如,如果找到一個好的對(x,y),那麼這意味着(y,x)也是一對好的對。使用這種方法,無法測試n/2以上的x值,因爲這會導致已經列舉的配對。
編輯
正如梅德Bychenko在評論部分指出,存在該方法使用大量內存的情況下,使其不太可行。
此問題是最明顯的,其中k = 2,因爲隨着k增加,有顯著更少x值對於其中x ķ <ñ。
對於k = 2,可以在不使用哈希表的情況下處理該問題,而是直接檢查n-x是否是完美正方形。要檢查一個數是否是一個完美的正方形,可以應用sqrt函數並檢查結果是否爲整數值。
的另一種方法,用O(1)空間複雜度對任意k,是使用二進制搜索,用於檢查是否N - X ķ爲整數的第k功率。這在類O中具有時間複雜度(n 1/k * log(n))
如果n <= 10^18'和'k == 2'然後我們必須計算多達*十億*項... –
謝謝,好點,我編輯了答案。 – qwertyman
- 1. 查找2^n的第一個數字,其中n的順序是10^5
- 2. 如何查找和n更改&N
- 3. 查找溶液復發:T(N)= 2 T(N/4 +√N)+(√10)N
- 4. Pascal's Triangle - 查找第n行
- 5. 查找n維鄰居
- 6. 如何使圖標重複N次,其中N是變量?
- 7. 查找地圖中最高的n值
- 8. 查找int中的第n個SET位
- 9. 查找SQL中第N大元素
- 10. 編解碼器的矢量[N]其中N確定矢量的末尾
- 11. 從n個組中查找所有組合的大小n
- 12. 查找C中N個個案之間的偶數N
- 13. 在Java中查找2d n * n矩陣的逆?
- 14. 查找其中值屬於
- 15. 查找並替換字符串模式N次,其中N在模式中定義
- 16. 通過其中一個值在向量中查找對象
- 17. 查找給定n個鍵的二叉樹數量的變化
- 18. 查找列表中最高的n個元素及其位置。 Python
- 19. 查找其中2米範圍重疊
- 20. C - 在float中查找int變量
- 21. 查找其ID與
- 22. 從其他表單中查找變量值
- 23. 查找其中矢量的差大於1
- 24. 查找進程ID並將其分配給ubuntu中的變量
- 25. 索引匹配,其中查找值在查找數組中
- 26. 如何查找數組中大於其後所有元素的元素數量?
- 27. 在MySQL中查詢查找第N個最大值
- 28. 插入n個數據幀,其中n是在其他列表
- 29. 查找殭屍其中id = 1,並將其存儲在一個變量
- 30. 查找的向量C++
許多可能的優化,但第一個:不需要強制*對*。對於每個候選'x',找到'n - x^k'並確定它是否是第k次方。(當然,你需要特殊情況'k = 1',並且'k = 2'也有數字理論技巧可用。) –
'x'和'y'是* positive *? –
@DmitryBychenko是的,x和y是自然數 – MRMKR