社区讨论

求问随机素数

学术版参与者 5已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mjl6o7a1
此快照首次捕获于
2025/12/25 16:31
2 个月前
此快照最后确认于
2025/12/27 15:50
2 个月前
查看原帖

论如何实现随机素数

下文中,简记 [l,r]p[l, r]^p 表示区间 [l,r][l, r]rl2r \ge l \ge 2
比如我要一个函数 ll rdp(ll l, ll r)typedef long long ll;)表示在区间 [l,r]p[l, r]^p 内随机一个素数。已经定义了函数 ll rdn(ll l, ll r) 表示区间 [l,r][l, r] 内随机整数。
一般写法是:
C
do {
    p = rdn(l, r);
} while (isprime(p));
其中 isprime 是质数检查(为了减少时间默认为 12 组基底的稳定 Miller-Rabin)。但是,数据一大,或者 rp 不佳,就会卡很久。
更好的方法是基于素数筛,令 prm[i] 表示 1-based 意义下第 ii 个质数,sz[i] 表示 i\le i 的质数个数,则有
C
prm[rdn(sz[l], sz[r])]
但是这样的缺点也很明显,就是容易内存爆炸。
所以,本蒟蒻在这里发出问题:如何在时间和空间都适合(例如:1s, 512 MB)的情况下随机出一个质数?

回复

11 条回复,欢迎继续交流。

正在加载回复...