素数

news/2024/11/29 19:41:27/文章来源:https://www.cnblogs.com/xsyc/p/18577417

可能出现“质数”、“素数”混用的情况,见谅。

定义

一个正整数无法被除了 \(1\) 和它自身之外的任何自然数整除,则称该数为质数,否则称其为合数。

注意到在整个自然数集合中,质数数量不多、分布稀疏,对于一个 足够大\(N \in \mathbb{Z}\)\(\leq N\) 的质数大约有 \(\frac{N}{\ln N}\) 个。换句话说,\(\ln N\) 个数中大约有 \(1\) 个质数。

质数判定与筛选

试除法

我们知道若 \(N \in \mathbb{Z}\)\(N\) 为合数,则必定存在一个能整除 \(N\) 的数 \(M\) 满足 \(2 \leq M \leq \sqrt{N}\)

可以写出代码:

bool IsPrime(int x) {if (x == 0 || x == 1)return 0;for (int i = 2; i * i <= x; i++) {if (x % i == 0)return 0;}return 1;
}

基于随机化的判定有 Miller-Robbin。

Eratosthenes

思想是对于任意 \(x\) 的倍数 \(x, 2x, 3x, \dots\) 都不是质数,所以从 \(2\) 开始倍数筛掉,往后若一个数 \(x\) 尚未被标记,意味着其不能被 \(\forall [2, x - 1]\) 整除,则其为质数。

然后同上试除法,为了防止形如 \(6 = 3 \times 2\) 同时被 \(2, 3\) 筛两次的情况(小于 \(x^2\) 的数 \(x\) 的倍数在扫描更小的数就已经筛过了),从 \(x^2\) 开始,标记 \(x^2, (x + 1)x, \dots, \lfloor \frac{N}{x} \rfloor x\) 即可。

void Prime(const int n) {memset(v, 0, sizeof(v));for (int i = 2; i <= n; i++) {if (v[i])continue;p[++tot] = i;for (int j = i; j <= n / i; j++)v[i * j] = 1;}
}

复杂度为 \(O(\sum_{p \leq N, p \in \mathbb{P}} \frac{N}{p}) = O(N \log \log N)\),接近线性,是 OI 中最常见的筛法。

线性筛

我们是怎么优化暴力筛的?通过枚举倍数来减少总的枚举次数。但是优化后我们的埃氏筛还是会重复标记某些合数,例如 \(12\) 会被 \(2 \times 6\)\(3 \times 4\) 同时标记。那我们能否唯一确定出一种筛选出某个数的做法:即我们 能否确定某个数唯一产生的方式

我们正式引入线性筛:线性筛通过“从小到大累积质因子”的方式标记每个合数,这里直接给出易懂的代码:

处理的手段其实就是通过确定唯一产生数的方式来确定唯一的“遍历”方式。

int v[N], p[N];void Prime(const int n) {m = 0;memset(v, 0, sizeof(v));for (int i = 2; i <= n; i++) {if (!v[i]) { v[i] = i; p[++m] = i; }    // 质数// 给当前的数 i 乘上一个质因子for (int j = 1; j <= m; j++) {// i 有比 p[j] 更小的质因子,或者已经超出了 n 的范围if (p[j] > v[i] || p[j] > n / i)break;// p[j] 是合数 i * p[j] 的最小质因子v[i * p[j]] = p[j];}}
}

复杂度为 \(O(n)\),真正的线性筛法。

算数基本定理

这非常重要。

任何一个大于 \(1\) 的正整数都能唯一分解有限个质数的乘积,形式化地:

\[N = p_1^{c_1} p_2^{c_2} \cdots p_m^{c_m} \]

其中 \(c_i \in \mathbb{Z}, p_i \in \mathbb{P}, p_1 \lt p_2 \lt \cdots \lt p_m\)

结合试除法和埃氏筛我们就可以进行一个质因数的分解,复杂度为 \(\sqrt{N}\)

void DivideNum(const int n) {m = 0;for (int i = 2; i * i <= n; i++) {if (n % i == 0) {   // i 是质数p[++m] = i;c[m] = 0;while (n % i == 0) { c /= i; c[m]++; }      // 抹掉所有 i}}if (n > 1) { p[++m] = n; c[m] = 1; }    // n 是质数
}

有一种效率更高的 Pollard's Rho 用于优化复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843609.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习记录,Python基础(3)

算术运算符a = 3 b = 4 print(a + b) # 7 print(a - b) # -1 print(a * b) # 12 print(a / b) # 0.75 print(a % b) # 3 print(a ** b) # 81 print(a // b) # 0 整除比较(关系)运算符注意:=是赋值运算符,==是比较运算符 比较运算符的结果一定是bool类型的扩展知识:比较两个…

ECharts 实战

EChart 资源Vue-EChart 不想封装 Echart, 可以选用这种方案。 Vue-ECharts 是一个 Vue 组件,旨在简化在 Vue 应用中集成 ECharts 的过程。它封装了 ECharts 的初始化和使用逻辑,用户只需要在 Vue 模板中添加组件并传递相应的 props,即可轻松创建图表。 支持Vue2 & Vue3…

腾讯云 AI 代码助手:单元测试应用实践

在软件开发这一充满创造性的领域中,开发人员不仅要构建功能强大的软件,还要确保这些软件的稳定性和可靠性。然而,开发过程中并非所有任务都能激发创造力,有些甚至是重复且乏味的。其中,编写单元测试无疑是最令人头疼的任务之一,它虽然对于验证软件组件是否按预期工作至关…

基于米尔全志T527开发板的FacenetPytorch人脸识别方案

本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实现的人脸识别库。它提供了…

Seata之小结和测试

目录一、本地事务二、分布式事务2.1、典型的分布式事务应用场景2.2、跨库事务2.3、分库分表2.4、微服务架构三、两阶段提交协议(2PC)2PC存在的问题四、Seata4.1、Seata的三大角色4.2、Seata AT模式的设计思路五、Seata快速开始Seata Server(TC)环境搭建步骤一:下载安装包步…

VS Code使用Git可视化管理源代码详细教程

思维导航前言 VS Code简介 环境准备 克隆GitHub中的存储库 查看当前所在分支 [*重要]实际工作开发四步曲(添,提,拉,推): 冲突解决 创建分支并推送到远程代码库 子分支开发完成后合并到主分支中VS Code Git提交修改历史记录查看(甩锅专用) 查看文件修改时间线对比文件修改…

二次函数+圆相结合的定值问题

来看一道初三接近5星难度的题目!高二圆锥曲线学到的定值问题与设而不求的方法,在初三压轴题中也会出现。专题:二次函数+圆 题型:动点问题+定值问题 难度系数:★★★★★ 【题目】 (24-25九年级湖北武汉)如图1,在平面直角坐标系$ xOy \(中,开口向…

2024-2025-1 20241401 《计算机基础与程序设计》 第十周学习总结

班级链接 2024计算机基础与程序设计作业要求 第十周作业作业目标 ①信息系统 ②数据库与SQL ③人工智能与专家系统 ④人工神经网络 ⑤模拟与离散事件 ⑥排队系统 ⑦天气与地震模型 ⑧图形图像教材学习内容总结 《计算机科学概论》第12、13、14章信息系统 信息系统: 帮助组织和…

数据结构查找

语雀链接:https://www.yuque.com/g/wushi-ls7km/ga9rkw/kl8h357ofcgocddz/collaborator/join?token=AwLuhwfJL8wLO2FH&source=doc_collaborator# 《数据结构查找》

ARM Trusted Firmware-A RISC-V OpenSBI 汇总

Trusted Firmware-A如图为 ARM TrustedFirmware (可信固件) 开源项目集合,它为带有 Exception Level 3 (EL3) Secure Monitor 的 ARM 架构 (Armv8-A、Armv9-A 和 Armv8-M 等) 提供了安全软件的实施参考实现。 1. TF-A 概述 Trusted Firmware-A (TF-A) project 是 ARM 可信固件…

使用 Keil 新建 Arm Visual Hardware(AVH) 项目

1 新建并配置项目 1.1 新建项目 我这里想模拟 Cortex-M55 核心,因此选择 SSE-300-MPS3由于是简单教程,我只想输出一个最简单的 Hello World,因此仅勾选串口相关的组件这里还需要特殊勾选一下以下选项1.2 配置Target Software Model 处选择 TrustZone disabledRead/Write Mem…