热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线性素数筛选法与欧拉线性筛算法解析

本文详细介绍了线性素数筛选法和欧拉线性筛算法,并提供了详细的代码实现及数学证明,帮助读者深入理解这两种高效的算法。

线性素数筛选法与欧拉线性筛算法解析

线性素数筛选法

线性素数筛选法是一种高效找出所有小于给定整数n的素数的方法。其核心思想是利用已经找到的素数来标记非素数,确保每个合数仅被其最小的素因子筛除一次。

int primes[MAXN], marked[MAXN];
void linearSieve()
{
memset(marked, 0, sizeof(marked));
int count = 0;
for (int i = 2; i {
if (!marked[i])
primes[count++] = i;
for (int j = 0; j {
marked[i * primes[j]] = 1;
if (i % primes[j] == 0)
break;
}
}
}

在上述代码中,marked[i * primes[j]] = 1;表示将当前素数与之前找到的素数的乘积累计标记为非素数。而if (i % primes[j] == 0) break;则确保了每个合数仅被其最小的素因子筛除一次,从而保证了算法的线性时间复杂度。

欧拉线性筛算法

欧拉线性筛不仅能够高效地找出素数,还能同时计算出每个数的欧拉函数值。欧拉函数φ(n)表示小于n的正整数中与n互质的数的数量。

int eulerPhi[N], primes[N], visited[N], primeCount;
void eulerSieve()
{
for (int i = 2; i {
if (!visited[i])
{
primes[primeCount++] = i;
eulerPhi[i] = i - 1;
}
for (int j = 0; j {
visited[i * primes[j]] = 1;
if (i % primes[j] == 0)
{
eulerPhi[i * primes[j]] = eulerPhi[i] * primes[j];
break;
}
eulerPhi[i * primes[j]] = eulerPhi[i] * (primes[j] - 1);
}
}
eulerPhi[1] = 1; // 特殊情况
}

欧拉函数的计算遵循以下规则:

  • 若x为质数,则φ(x) = x - 1。
  • 若x % primes[j] == 0,则φ(x * primes[j]) = φ(x) * primes[j]。
  • 若x % primes[j] != 0,则φ(x * primes[j]) = φ(x) * (primes[j] - 1)。

这些规则基于欧拉函数的性质,特别是当x和y互质时,φ(xy) = φ(x) * φ(y)。通过这些规则,欧拉线性筛能够在遍历过程中高效地计算出每个数的欧拉函数值。


推荐阅读
author-avatar
开口就笑i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有