[問題] 關於 constexpr 質數表

作者: nevikw39 (牧)   2020-04-26 23:04:07
開發平台(Platform): (Ex: Win10, Linux, ...)
Ubuntu
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
g++ 7
問題(Question):
求 1e8 內所有質數。
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://gist.github.com/nevikw39/e9d580c03bf0cf800b03bcf38826608c
補充說明(Supplement):
一開始我用改良後的篩法,在本機約費時 1.2s、在 judge 0.6s。
我想到利用 constexpr 打好質數表,無奈 loop limit 為 262144,強制提高還會當掉無
法編譯。
所以我想說至少先建好 262144 內的質數表,執行時期再篩。
可是我不曉得在已知這 23000 個質數後,如何最快的求出其他質數。
想請教大家,非常感謝!!
整天改下來已經頭昏腦脹,如有描述不周的部份我很抱歉
作者: loveme00835 (髮箍)   2020-04-26 23:24:00
好暴力 xD
作者: oToToT (屁孩)   2020-04-26 23:47:00
linear sieve呢
作者: loveme00835 (髮箍)   2020-04-27 00:15:00
雖然 std::embed() 還沒進, 不過先給你一個提示: 可以把你的 bool array 轉成 bit array, 然後內嵌在程式碼裡 https://godbolt.org/z/BhqKza 這樣只要花費查找的成本就好一個常見的誤解就是把 constexpr 的求值和物件初始化時機搞混. 值可以提早在編譯時期求出, 但初始化還是要在執行時期才能做, 所以除非你可以免去初始化的成本, 不然 constexpr 能加速的只有那些和物件實例 (instance) 行為無關的部分
作者: loveme00835 (髮箍)   2020-04-27 07:24:00
好暴力 xD
作者: oToToT (屁孩)   2020-04-27 07:47:00
linear sieve呢
作者: loveme00835 (髮箍)   2020-04-27 08:15:00
雖然 std::embed() 還沒進, 不過先給你一個提示: 可以把你的 bool array 轉成 bit array, 然後內嵌在程式碼裡 https://godbolt.org/z/BhqKza 這樣只要花費查找的成本就好一個常見的誤解就是把 constexpr 的求值和物件初始化時機搞混. 值可以提早在編譯時期求出, 但初始化還是要在執行時期才能做, 所以除非你可以免去初始化的成本, 不然 constexpr 能加速的只有那些和物件實例 (instance) 行為無關的部分
作者: stimim (qqaa)   2020-04-28 03:26:00
hint: 1e8 內所有的合數必有一個 1e4 以內的質因數咦,時限是多少? 0.6s 過不了嗎?
作者: loveme00835 (髮箍)   2020-04-28 04:47:00
好好想想: 你建質數表的「目的」是什麼? 手段不是只有一種
作者: stimim (qqaa)   2020-04-28 06:33:00
另外還要看看你現在時間的瓶頸是不是在輸出的部分
作者: stimim (qqaa)   2020-04-27 19:26:00
hint: 1e8 內所有的合數必有一個 1e4 以內的質因數咦,時限是多少? 0.6s 過不了嗎?
作者: loveme00835 (髮箍)   2020-04-27 20:47:00
好好想想: 你建質數表的「目的」是什麼? 手段不是只有一種
作者: stimim (qqaa)   2020-04-27 22:33:00
另外還要看看你現在時間的瓶頸是不是在輸出的部分

Links booklink

Contact Us: admin [ a t ] ucptt.com