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

如何用Python高效计算Brun常数(含素性测试与大区间求和)

计算上限为10^20的Brun常数优化方案

关于Brun常数

Brun常数是所有孪生素数的倒数之和,已知随着计算上限增大,其值逐步趋近于约1.9,但要达到该值需要到10^530的量级,远超出常规计算范围。常用修正形式为 ( B_2^*(p) = B_2(p) + \frac{4C_2}{\log p} ),其中 ( C_2 ) 是孪生素数常数(精确值约为0.6601618158468695739...)。

现有实现的核心瓶颈

你当前的代码存在几个关键性能问题,导致无法高效处理10^20级别的计算:

  1. 素性测试效率不足:自定义的IsPrime函数依赖试除法,对10^20级别的大数时间复杂度极高,未使用更高效的确定性素性测试算法。
  2. 遍历方式低效:逐个遍历所有奇数并判断素性,单线程下完成10^20范围的遍历完全不现实。
  3. 精度与资源利用不足:普通浮点数会累积精度误差,且未利用多核CPU并行计算能力。

优化方向与实现

1. 替换素性测试为确定性Miller-Rabin算法

对于小于2^64的整数,使用基{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37}的Miller-Rabin测试可保证100%正确性,比试除法效率提升数个数量级。

2. 分段筛法+并行计算

将10^20的超大区间拆分为若干小分段,用多进程并行处理每个分段的孪生素数查找与倒数求和,平衡内存占用与计算效率。

3. 高精度浮点计算

使用mpmath库保证求和过程的精度,避免浮点数累积误差。

优化后的代码实现

import time
from multiprocessing import Pool, cpu_count
from mpmath import mp

# 设置高精度位数,可根据需求调整
mp.dps = 60

# 孪生素数常数
C2 = mp.mpf("0.660161815846869573927812110014555778432623360284733413319448")

def miller_rabin(n):
    """确定性Miller-Rabin素性测试,支持2^64以内的整数"""
    if n <= 1:
        return False
    elif n <= 3:
        return True
    elif n % 2 == 0:
        return False
    
    # 分解n-1为d*2^s
    d = n - 1
    s = 0
    while d % 2 == 0:
        d //= 2
        s += 1
    
    # 2^64以内数的验证基集合
    bases = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
    for a in bases:
        if a >= n:
            continue
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for _ in range(s - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True

def segment_twin_primes(start, end):
    """计算[start, end]区间内孪生素数的倒数和"""
    sum_reciprocal = mp.mpf(0)
    # 确保从奇数开始遍历
    if start % 2 == 0:
        start += 1
    
    current = start
    while current <= end:
        if miller_rabin(current) and miller_rabin(current + 2):
            sum_reciprocal += mp.mpf(1)/current + mp.mpf(1)/(current + 2)
        current += 2
    return sum_reciprocal

def compute_brun_constant(limit, segment_size=10**12):
    """分段并行计算Brun常数"""
    total_sum = mp.mpf(0)
    # 初始孪生素数对(3,5)
    if limit >= 5:
        total_sum += mp.mpf(1)/3 + mp.mpf(1)/5
    
    # 生成分段任务
    segments = []
    start = 7
    while start <= limit:
        end = min(start + segment_size - 1, limit)
        segments.append((start, end))
        start = end + 2
    
    # 多进程并行处理
    with Pool(cpu_count()) as pool:
        results = pool.starmap(segment_twin_primes, segments)
    
    # 合并结果
    for res in results:
        total_sum += res
    
    return total_sum

def compute_b2_aster(b2_val, p):
    """计算修正后的Brun常数"""
    return b2_val + (4 * C2) / mp.log(p)

if __name__ == "__main__":
    # 先测试10^16量级,10^20需分布式集群或进一步优化分段策略
    limit = 10**16
    start_time = time.time()
    
    b2 = compute_brun_constant(limit)
    b2_aster = compute_b2_aster(b2, limit)
    elapsed = time.time() - start_time
    
    print(f"上限到{limit}的Brun常数B2(p): {b2}")
    print(f"修正后的B2*(p): {b2_aster}")
    print(f"计算耗时: {elapsed:.2f}秒")

针对10^20的进一步建议

  1. 分布式计算:单台机器无法处理10^20的计算量,需将区间拆分到多台机器,使用Dask、Celery等分布式框架分发任务。
  2. 筛法优化:对于超大分段,使用分段埃氏筛代替Miller-Rabin,批量标记非素数,进一步提升效率。
  3. 内存调优:根据机器内存调整分段大小,避免内存溢出,同时平衡计算与IO开销。

内容的提问来源于stack exchange,提问作者Ch'nycos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:33:13