[討論] 判斷是否為質數

看板C_and_CPP (C/C++)作者 (阿神)時間13年前 (2012/07/19 11:04), 編輯推噓2(2015)
留言17則, 7人參與, 最新討論串1/1
我寫好一段程式 http://ideone.com/GD24u 希望有好的效率 所以先計算input的平方根 然後在判斷input是否為偶數 不為偶數的話,從3開始作for迴圈 每次+2直到sqrt(input) 但因為開根號有點麻煩,所以我限制input必須<1000000 想請問如果希望有好的效率,又不想有限制 我能做甚麼樣的改善? 謝謝大家:) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.19.145.249

07/19 11:10, , 1F
google "質數 篩子"
07/19 11:10, 1F

07/19 12:03, , 2F
大小允許,i*i<num會比sqrt(num)還快
07/19 12:03, 2F

07/19 12:04, , 3F
也可以先Eratosthenes建好質數表,只用質數去試除
07/19 12:04, 3F

07/19 12:06, , 4F
如果只求"大部分"正確,費馬測試法也可以
07/19 12:06, 4F

07/19 12:22, , 5F
可是我sqrt是自己寫的,不是用內建的,沒有用for迴圈
07/19 12:22, 5F

07/19 12:23, , 6F
應該會比一直測是i*i<num還要快吧?
07/19 12:23, 6F

07/19 12:35, , 7F
primality test有Miller-Rabin一類的測試法,但是是機率的
07/19 12:35, 7F

07/19 13:05, , 8F
想那麼多,都寫一次benchmark不就知道了
07/19 13:05, 8F

07/19 13:07, , 9F
程式是多大,不測試光在那邊感覺麻煩效率,與丟銅板無異
07/19 13:07, 9F

07/19 13:40, , 10F
你的sqrt肯定比內建的慢啊 XDDDD
07/19 13:40, 10F

07/19 13:44, , 11F
使用 SSE 指令的 sqrt 大約 20~30 個 cpu cycle
07/19 13:44, 11F

07/19 13:45, , 12F
若使用 rsqrt 先求根號倒數會更快
07/19 13:45, 12F

07/19 13:46, , 13F
而你的版本使用加法和乘法的次數顯然超過十次
07/19 13:46, 13F

07/19 13:46, , 14F
加一加實在不會比內建的還快
07/19 13:46, 14F

07/19 14:11, , 15F
這些細節相對於演算法本身對執行時間的影響都不重要吧....
07/19 14:11, 15F

07/19 17:14, , 16F
一、二年前做過這些事,目前沒方法能比 lib 的sqrt還快.
07/19 17:14, 16F

07/19 17:15, , 17F
另外比較建議.. ceil(sqrt(x)); 可能會準確些。
07/19 17:15, 17F
文章代碼(AID): #1G1tb4D1 (C_and_CPP)
文章代碼(AID): #1G1tb4D1 (C_and_CPP)