热门标签 | 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)。通过这些规则,欧拉线性筛能够在遍历过程中高效地计算出每个数的欧拉函数值。


推荐阅读
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • 本文深入探讨了领域驱动设计(DDD)中的聚合概念及其在事件溯源架构中的应用。聚合是一组紧密相关的类,这些类作为一个整体运作,形成一个有明确边界的组织。只有通过聚合根才能与聚合内的对象进行交互。 ... [详细]
  • 本文详细介绍了如何处理Oracle数据库中的ORA-00227错误,即控制文件中检测到损坏块的问题,并提供了具体的解决方案。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 本文详细介绍了Python中的生成器表达式、列表推导式、字典推导式及集合推导式等,探讨了它们之间的差异,并提供了丰富的代码示例。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 本文探讨了如何在Sitecore 9环境中通过Postman使用API密钥发送请求,包括解决常见错误的方法。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文探讨了在SharePoint环境中使用BDC(Business Data Catalog)时遇到的问题及其解决策略,包括XML文件导入SSP后的不可见性问题以及与远程SQL Server 2005连接的难题。 ... [详细]
  • 本文探讨了在 PHP 的 Zend 框架下,使用 PHPUnit 进行单元测试时遇到的 Zend_Controller_Response_Exception 错误,并提供了解决方案。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • MKVToolNix 37.0.0 正式发布:增强的 MKV 格式处理工具
    MKVToolNix 37.0.0 版本现已推出,这是一款专为处理 Matroska (MKV) 格式的强大工具。它能够将各种视频、音频及字幕格式整合进 MKV 文件中。本次更新带来了新的功能和多项 Bug 修复。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
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社区 版权所有