用欧拉筛法优化斯特尼筛法(质数筛法)

本文介绍了一种优化的素数筛法——欧拉筛法,并应用于寻找两个正整数之和为给定值的素数对。通过初始化、素数筛选和检查条件等步骤,实现高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;
const int g_kMaxs = 1000000;
bool g_u[g_kMaxs+1];
vector<int> g_primer;

void Init() {
    g_primer.clear();
/*
下面是素数的欧拉筛法:
该法优化的原理是保证
每个合数仅被它最小的
质因数筛去。
*/
    memset(g_u, true, sizeof(g_u));
    for (int i = 2; i <= g_kMaxs; i++) {
        if (g_u[i]) {
            g_primer.push_back(i);
        }
        for (int j = 0; j < (int)g_primer.size(); j++) {
            if (g_primer[j]*i > g_kMaxs) break;
            g_u[g_primer[j]*i] = false;
            if (i % g_primer[j] == 0) break; // 若当前素数为i的最小素因子,则分析下一个素数
/*
证明当 i % gprime[j] == 0 时,任意的 k > j 有g_preime[k]*i 有比gprime[k]小的质因子
证明:令 x = i / g_prime[j] => x 为整数
g_prime[k]*i = g_prime[k]*k*g_prime[j] => g_preime[k]*i 有比gprime[k]小的质因子g_prime[j];

证明当 i % g_prime[j] != 0时, g_prime[j]*i 没有比g_prime[j]小的质因子
证明: 假设 g_prime[j] * i 有比g_prime[j] 小的质数必然是 i 有比g_prime[j]小的质因子
而变量j由0递增意味着质数的递增,通过每次的 if (i % g_primer[j] == 0) break;判断
保证了i不可能有比 g_prime[j]小的质数。否则循环在走到当前 j 之前结束。
从而假设不成立,原命题成立。
*/
        }
    }
}

int main()
{
    int n = 0;
    Init();
    freopen("in.txt", "r", stdin);
    while (EOF != scanf("%d", &n) && n) {
        for (int i = 2; i <= n/2+1; i++) {
            if (g_u[i] && g_u[n-i]) {
                printf("%d = %d + %d\n", n, i, n-i);
                break;
            }
        }
    }
    return 0;
}


### 欧拉筛法优化与实现 在Python中,欧拉筛法是一种高效的素数筛选算,能够在线性时间内完成素数的筛选工作。该方不仅提高了效率,而且减少了不必要的重复计算。 #### 欧拉筛法的核心思想 欧拉筛法的关键在于利用已知的小素数去标记较大的合数,并且每个合数只会被它最小的那个质因子所对应的素数标记一次。这样就避免了像埃氏筛那样多次重复标记同一个合数的情况[^2]。 #### 代码实现细节 下面是基于上述原则的一个具体例子: ```python def euler_sieve(n): is_prime = [True] * (n + 1) # 初始化所有数字为可能的素数 primes = [] # 存储找到的所有素数 for i in range(2, n + 1): if is_prime[i]: primes.append(i) # 如果当前数未被标记,则是一个新的素数 for p in primes: if i * p > n: # 超过上限则停止处理 break is_prime[i * p] = False# 将此复合数标记为非素数 if i % p == 0: # 当前数能整除p时退出循环 break # 避免后续更大的素数再次乘以i造成浪费 return primes # 返回所有的素数列表 ``` 这段程序实现了基本的欧拉筛逻辑,其中`is_prime[]`数组用来跟踪哪些数值可能是素数;而`primes[]`则是用于保存最终确认下来的全部素数。每当遇到一个新的素数时,就会尝试将其与其他已经发现过的较小素数相乘得到更大范围内的合数并加以排除[^3]。 为了进一步提高性能,在实际应用中还可以考虑以下几点改进措施: - **减少内存占用**:由于只需要关心奇数是否为素数(除了2以外),因此可以通过仅分配一半大小的空间来存储这些信息。 - **提前终止条件**:一旦某个数已经被它的任何一个因数标记过了,就不必再继续检查其他因素,这有助于加快速度。 - **多线程加速**:对于特别大的输入规模,可以探索使用并发技术来进行分区处理,从而充分利用现代计算机硬件资源[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值