計算某個範圍內的質數和的辦法
在解尤拉計劃606題時,遇到一個求質數立方和的問題,pe論壇中有人給出了一個不求質數而求立方和的演算法,感覺很神奇,查閱他提到的維基百科,有點明白了。
為簡單起見,先看第10題:質數求和,在此基礎上,立方和就好理解了。
我修改了原始碼,增加了中間結果輸出,基本思路是先求範圍內所有數的和,然後減去合數的和,用容斥定理去重複。
def P10(n): r = int(n**0.5) assert r*r <= n and (r+1)**2 > n V = [n//i for i in range(1,r+1)] print(V) V += list(range(V[-1]-1,0,-1)) print(V) S = {i:i*(i+1)//2-1 for i in V} #等差數列求和 print(S) for p in range(2,r+1): if S[p] > S[p-1]: # p is prime sp = S[p-1] # sum of primes smaller than p p2 = p*p for v in V: if v < p2: break S[v] -= p*(S[v//p] - sp) print(p,S) return S[n] #輸出 >>>> P10(90) [90, 45, 30, 22, 18, 15, 12, 11, 10] [90, 45, 30, 22, 18, 15, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] {90: 4094, 45: 1034, 30: 464, 22: 252, 18: 170, 15: 119, 12: 77, 11: 65, 10: 54, 9: 44, 8: 35, 7: 27, 6: 20, 5: 14, 4: 9, 3: 5, 2: 2, 1: 0} (2, {90: 2026, 45: 530, 30: 226, 22: 122, 18: 82, 15: 65, 12: 37, 11: 37, 10: 26, 9: 26, 8: 17, 7: 17, 6: 10, 5: 10, 4: 5, 3: 5, 2: 2, 1: 0}) (3, {90: 1354, 45: 341, 30: 154, 22: 77, 18: 58, 15: 41, 12: 28, 11: 28, 10: 17, 9: 17, 8: 17, 7: 17, 6: 10, 5: 10, 4: 5, 3: 5, 2: 2, 1: 0}) (5, {90: 1089, 45: 281, 30: 129, 22: 77, 18: 58, 15: 41, 12: 28, 11: 28, 10: 17, 9: 17, 8: 17, 7: 17, 6: 10, 5: 10, 4: 5, 3: 5, 2: 2, 1: 0}) (7, {90: 963, 45: 281, 30: 129, 22: 77, 18: 58, 15: 41, 12: 28, 11: 28, 10: 17, 9: 17, 8: 17, 7: 17, 6: 10, 5: 10, 4: 5, 3: 5, 2: 2, 1: 0}) 963
參考資料 https://en.wikipedia.org/wiki/Prime-counting_function
相關文章
- 生成某個範圍的隨機數隨機
- matlab 從某個範圍內隨機取出一個整數Matlab隨機
- java判斷集合是否包含某個範圍內的值Java
- 圖解計算機中的數值範圍和浮點運算圖解計算機
- C/C++練習7---求某個範圍內的所有素數 (sdut oj)C++
- JS判定一個給定的時間在某個時間範圍內JS
- 隨機範圍小數和隨機範圍整數隨機
- MySQL 中 整數型別的儲存和範圍計算過程詳解MySql型別
- 用SQL計算100以內的質數SQL
- 列舉範圍內的字串字串
- 如何計算字串某個字元出現的次數字串字元
- 使用gis計算水庫庫容和淹沒範圍
- 在指定範圍內生成隨機數隨機
- 6-1 使用函式輸出指定範圍內Fibonacci數的個數函式
- JS實現檢查給定時間範圍是否在每天的某個時間段內JS
- 計算機組成與體系結構-數值表示範圍-浮點數計算計算機
- js生成一定範圍內的隨機整數JS隨機
- PLSQL實現計算某數的平方SQL
- 如何在linux中用命令產生一個範圍內的隨機數?Linux隨機
- redis如何獲取有序集合指定範圍的個數Redis
- 手動計運算元網掩碼的 IP 範圍
- OpenMP平行計算程式設計-n以內的完數的個數程式設計
- 生成總和固定 可變範圍的隨機數隨機
- 基礎 變數的作用範圍變數
- 繫結變數的使用範圍變數
- 無法安裝顯示卡驅動怎麼辦 顯示超出頻率範圍的解決辦法
- 關於SLG中人物可到達範圍計算的想法(轉)
- 計算某時間段內ERP中的節假日中應排除的天數
- java生成指定範圍的隨機數Java隨機
- PLSQL--變數範圍的討論SQL變數
- Javascript中變數範圍和hoist現象JavaScript變數
- js計算圖片內點個數JS
- 程式碼段——C#判斷時間是否在某個範圍C#
- 計算機組成原理--浮點數-原碼補碼錶示範圍計算機
- UPDATE查詢結果範圍內的資料
- 關於:以前的某個程式安裝已在安裝計算機上建立掛起的檔案操作 解決辦法計算機
- 如何產生指定範圍的隨機數隨機
- 6-3 使用函式輸出指定範圍內的完數 (20分)函式