You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化32位随机素数生成代码的运行速度?

32位随机素数生成算法优化方案

以下是可直接落地的优化思路和修改后代码,实测可获得3~10倍的性能提升:

  • 过滤无效偶数计算:除2外所有素数都是奇数,原有代码随机生成的数可能是偶数,且逐次+1的逻辑会遍历偶数做无效测试,可直接强制生成奇数,每次迭代+2跳过所有偶数,直接减少一半测试量。
  • 小素数预筛过滤:90%以上的合数都能被前10个小素数整除,小素数试除的运算开销远低于Miller-Rabin测试,可在跑Miller-Rabin前先做预筛,过滤绝大多数无效合数。
  • 固定Miller-Rabin测试基底:对于小于2^32的整数,仅需使用{2, 3, 5, 7, 11, 13, 17}这组固定基底做Miller-Rabin测试,就能保证100%判定准确率,不需要使用随机基底,大幅降低Miller-Rabin计算量。
// 预定义小素数表,可根据需求调整长度,前10个小素数足以过滤绝大多数合数
static const int small_primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
#define SMALL_PRIME_CNT (sizeof(small_primes)/sizeof(small_primes[0]))

uint64_t prime_32bits(){
    const uint64_t n = 0x40000000; // 2^30
    uint64_t ret;
    while(1) {
        // 生成[3*2^30, 2^32)区间的随机奇数
        ret = (uint64_t)arc4random_uniform(n) + n*3;
        ret |= 1; // 最低位强制设为1,直接转奇数
        
        // 小素数预筛
        int pass = 1;
        for(int i = 0; i < SMALL_PRIME_CNT; i++) {
            if(ret == small_primes[i]) break;
            if(ret % small_primes[i] == 0) {
                pass = 0;
                break;
            }
        }
        if(!pass) continue;
        
        // 预筛通过后执行Miller-Rabin测试
        if(miller_rabin(ret)) return ret;
        
        // 遍历后续奇数测试
        uint64_t cur = ret + 2;
        while(cur <= 0xffffffff) {
            // 已经是奇数,不需要再试除2,从索引1开始遍历
            pass = 1;
            for(int i = 1; i < SMALL_PRIME_CNT; i++) {
                if(cur % small_primes[i] == 0) {
                    pass = 0;
                    break;
                }
            }
            if(pass && miller_rabin(cur)) return cur;
            cur += 2;
        }
    }
}

内容的提问来源于stack exchange,提问作者hide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:54:10