[问题] 关于 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