leetcode---素数,最小质因子,最大公约数

news2024/12/29 14:15:30

1 判断一个数是不是质数(素数)

方法1:依次判断能否被n整除即可,能够整除则不是质数,否则是质数
方法2:假如n是合数,必然存在非1的两个约数p1和p2,其中p1<=sqrt(n),p2>=sqrt(n)。
方法3:等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。

2 判断一段素数

2.1 Eratosthenes 筛法 O(Nlog(logN))

Eratosthenes 筛法进行的是打表,也就是平时说的离线操作,当查询量比较大的时候,我们往往采用这种方法进行离线操作处理;该算法的内容是:首先假设 n 个数全部都是素数,然后从 2 开始,把每一个数的倍数都剔除并标记成合数(因为合数肯定是有素因子的),这样列表中保存着的都是没有素因子的数,就是我们想要的质数了。

n = max(2, n)   #处理输入数字为0的情况
is_prime = n * [1] #标记是不是素数
is_prime[0] = is_prime[1] = 0

for i in range(2, n): # 从2开始
    if is_prime[i]:   #如果不是素数
        for j in range(2, n): # 就标记他的倍数的数字,剔除素数队列
            if i * j >= n: 
                break
            is_prime[i * j] = 0
return sum(is_prime)

比如对数字 6 来说,素因子 2 和 3 在筛选过程中都对他进行了剔除标记,也就是说,所有 6 的倍数,至少都被 2 和 3 进行了重复的剔除。
Eratosthenes 筛法的时间复杂度理论值是 O(Nlog(logN))

2.2 欧拉筛法 - 线性筛 O(N)

我们只对小于等于 sqrt(n) 的数进行取余检查;这里可以采取类似但是更简洁的办法,只要保证每个合数只会被他的最小素因子筛掉就可以了,所以我们优化算法的核心:

寻找并保存当前的素数;
对每个数的从小到大的素数次倍数进行标记,当发现这个数的素因子后停止(这也就保证每个数都是被最小素因子筛掉的);

线性筛的理论复杂度是 O(N)

n = max(2, n)
primes = n * [0]  # 保存已经筛出的素数
cnt = 0           # 记录已经筛出的素数个数
is_prime = n * [1]
is_prime[0] = is_prime[1] = 0
for i in range(2, n):
    if is_prime[i]: 
        # 保存已经筛出的素数
        primes[cnt] = i
        cnt += 1
    for j in range(cnt):
        # 如越界则停止
        if primes[j] * i >= n: 
            break 
        # 标记 i 的素数次倍数
        is_prime[primes[j] * i] = 0
        # 如遇到 i 的素因数,则停止
        #这句代码保证了每个数最多被筛一次,将时间复杂度降到了线性。证明如下:
        if i % primes[j] == 0: 
            break 
return sum(is_prime)

注意到筛法求素数的同时也得到了每个数的最小质因子。

2.3 meissel–lehmer(亚线性时间找出素数个数)

在这里插入图片描述
证明与推理过程

2.4 杜教筛,洲阁筛

3 根据筛法求【筛法可得到最小质因子】

3.1 筛法求欧拉函数

欧拉函数:是小于等于n的正整数中与n互质的数的数目

3.2 筛法求莫比乌斯函数

莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数)。
具体定义如下:
如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。
如果一个数不包含平方因子,并且有k个不同的质因子,那么miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。
给出一个数n, 计算miu(n)。

3.3 筛法求约数个数

3.4 筛法求约数和

4 最大公约数Greatest Common Divisor GCD

4.1 欧几里得算法

求 GCD 在数论中公认的最常用算法即为欧几里得算法,也就是我们在高中时学到的辗转相除法。
欧几里得算法的基本原理用一句话就可以说清楚:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数:gcd(a,b)=gcd(b,a mod b) 。

4.2 扩展欧几里得算法

丢番图方程(Diophantine Equation)
丢番图方程指的是:未知数个数多于方程个数,且未知数只能是整数的整数系数方程或方程组。
例如以下式中, a,b,c 都为整数:
a1*x1b1 + a2*x2b2 + …… + an*xnbn = n

裴蜀定理(Bézout’s identity)
在数论中,裴蜀定理是一个关于最大公约数的定理。这个定理说明了对于任意整数 a、b 和他们的最大公约数 d,关于未知数 x 和 y 的线性丢番图方程:ax+by=m有解,当且仅当 m 是 d 的倍数时。这个等式也被称为裴蜀等式。
裴蜀等式有解时必然有无穷多个整数解,每组解 x 、y 都称之为裴蜀数,可用辗转相除法求得。

辗转相除法实现扩展欧几里得算法
既然说可以用辗转相除法来解决这个问题,那么我们先来说明一下如何通过辗转相除法来求二元一次线性丢番图方程。

辗转相除法过程
以 23x + 17y = 1 为例,我们来求 GCD(23, 17):

23 = 17 * 1 + 6
17 = 6 * 2 + 5
6 = 5 * 1 + 1
5 = 1 * 5 + 0
1 = 0 * 0 + 1

改写成余数形式

将等式右边的第一项移项:
23×1+17×−1=6 (1)
17×1+6×−2=5 (2)
6×1+5×−1=1 (3)

反向带入原式

带下划线的 6 和 5 会使用 (1) 和 (2) 两个式子反向带入,形同换元:
1=6 ×1 + 5 ×(-1)
(1)×1+(2)×−1
(23×1+17×−1)+[17×1+(23×1+17×−1)×−2]×−1
23×3+17×−4
23x+17y

所以反解得,x = 3, y = -4 是上述二元一次线性丢番图方程的一组解。

扩展欧几里得算法证明

5 根据最大公约数求

5.1 根据两个杯子得到指定target的水

5.2 根据两个电容得到指定target的电量

情况一
边界情况,即当 c>max(a,b) ,这种情况是无法使得 A 和 B 的电量达到 c 的。直接输出 0。

情况二
当 a = c 或者 b = c 的时候,只进行一次充电操作就可以完成,直接输出 1。

情况三
接下来我们考虑一般情况,即需要满足以下前提条件:
c<max(a,b)且 c不等于min(a,b)
我们将这个问题换一个思路转化一下假设给出的 a 、b、 c 一定有解,那么我们来设置对 A 做了 x 次的充(放)电,对 B 做了 y 次的充(放)电,并且做了 k 次的操作三。

如果将 A、B 当做一个大电容来看这个电容只有充放电 a 单位、充放电 b 单位这 4 种操作。那么我们就可以列出一个关系式:
ax+by=c由于 a、b 为非负整数,又因为前提条件,则 x 和 y 符号相反。

暂且,我们先不管做了几次操作三,先只考虑充放电问题,那其实就是已知 a、b、c,我们在给定范围内求解 x 和 y 的解就可以了。那么这个问题我们要如何求解呢?这就是扩展欧几里得算法所要解决的问题。

ax+by=gcd(a,b)×k=c

def ex_gcd(a, b):
      if b == 0:
          return 1, 0, a
      else:
          x, y, r = ex_gcd(b, a % b) 
          x, y = y, (x - (a // b) * y)
          return x, y, r

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题 一句话省流&#xff1a; 确保项目地址没有任何中文&#xff0c;重新申请个许可证&#xff0c;然后该咋就咋&#xff0c;完事。 ——————————————————————————————…

攻防世界(CTF)~Reverse-easyRE1

题目介绍 下载附件后一个32位一个64位 64位的放到ExeinfoPE查看一下有无壳子&#xff08;无壳&#xff09; 放IDA看一下伪代码&#xff0c;习惯性看一下main函数&#xff0c;直接发现了flag flag{db2f62a36a018bce28e46d976e3f9864}

解锁智慧之门:十大知识管理工具深度剖析

在当今信息爆炸的时代&#xff0c;如何高效地管理和利用知识已成为企业和个人发展的重要挑战。为了帮助大家更好地应对这一挑战&#xff0c;本文将深度剖析十大知识管理工具&#xff0c;这些工具不仅能够帮助我们更好地组织、存储和分享知识&#xff0c;还能提升我们的工作效率…

华为OD机试 - 芯片资源占用(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

Linux_进程概念详解

本篇文章为作者学习Linux时所作总结&#xff0c;可能会有总结不足或疏漏之处&#xff0c;如有发现请各路大神批评指正 什么是进程&#xff1f; 课本上说&#xff0c;进程是程序的一个执行实例&#xff0c;正在执行的程序。对&#xff0c;也不对&#xff0c;我称之为正确的废话…

嵌入式面试——FreeRTOS篇(七) 软件定时器

本篇为&#xff1a;FreeRTOS 软件定时器篇 一、软件定时器的简介 1、定时器介绍 答&#xff1a; 定时器&#xff1a;从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xff0c;用户可以自定义定时器周期。 硬件定时器&#xff1a;芯片本…

python项目实战-xPath下载人生格言

事先声明一下&#xff0c;仅分享爬虫经验&#xff0c;不会对网站有影响的&#xff0c;也请想要实操的小伙伴不要对网站频繁访问&#xff0c;如有侵权请联系我删除文章 文章目录 代码展示步骤解析思路整理节点树xPath语法分析网页结构 实战思路获取源代码源代码转化成节点树提取…

新手必备!百度思维导图在内四款必备工具分享

作为一名资料员&#xff0c;每天都要处理大量的信息和数据&#xff0c;思维导图对我来说简直就是救星。它帮我理清思路&#xff0c;把复杂的信息条理化&#xff0c;让我能更高效地完成工作。今天&#xff0c;我就来跟大家分享一下我用过的几款思维导图工具&#xff1a;福昕思维…

java项目之基于保密信息学科平台系统源码(springboot+vue+mysql)

项目简介 基于保密信息学科平台系统实现了以下功能&#xff1a; 基于保密信息学科平台系统的主要使用者管理员有个人中心&#xff0c;用户管理&#xff0c;教师管理&#xff0c;学科概况管理&#xff0c;人才培养管理&#xff0c;学科动态管理&#xff0c;学科资源管理&#…

2本书让你轻松入门大模型!《大模型入门:技术原理与实战应用》+《自然语言处理:大模型理论与实践》

随着大模型技术的不断完善和普及&#xff0c;我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效&#xff0c;并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一&#xff0c;以GPT为代表的大模型应用一经推出在短…

信息系统与计算技术国际学术会议

第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;将于2024年11月8日-11月11日在中国西安盛大举行&#xff0c;由长沙理工大学主办&#xff0c;同济大学、西北工业大学联合协办。 会议聚焦信息系统与计算技术等相关研究领域&#xff0c;广泛邀请国内外…

JavaGuide(3)

一、项目背景与简介 JavaGuide由GitHub用户Snailclimb开发并维护&#xff0c;是一个全面而深入的Java学习资源库。它旨在为Java初学者和有经验的开发者提供一个系统的学习路径和丰富的资源&#xff0c;帮助他们系统地学习和巩固Java及相关技术知识。 二、项目内容与特点 Jav…

【HTML】defer 和 async 属性在 script 标签中分别有什么作用?

需要这两个属性的原因&#xff1f; 首先我们要知道的是&#xff0c;浏览器在解析 HTML 的过程中&#xff0c;遇到了 script 元素是不能继续构建 DOM 树的。 它会停止解析构建&#xff0c;首先去下载 js 代码&#xff0c;并且执行 js 的脚本&#xff1b;只有在等到 js 脚本执行…

try、catch、finally、return执行顺序超详解析与throw与throws区别

try、catch、finally、return执行顺序超详解析&#xff08;针对面试题&#xff09; 有关try、catch、finally和return执行顺序的题目在面试题中可谓是频频出现。总结一下此类问题几种情况。 写在前面 不管try中是否出现异常&#xff0c;finally块中的代码都会执行&#xff1b…

IPguard与Ping32敏感内容防护能力对比,两款知名防泄密软件对比

在信息安全的新时代&#xff0c;企业面临着日益严重的敏感内容泄露风险。为了保障数据安全&#xff0c;选择合适的防护工具至关重要。IPguard与Ping32作为市场上两款知名的终端管理解决方案&#xff0c;各自具备独特的敏感内容防护能力。本文将对这两者进行深入对比&#xff0c…

kubeadm 搭建k8s 1.28.2版本集群

kubeadm 搭建k8s 1.28.2版本集群 1、kubuadm介绍&#xff1a; kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具&#xff0c;这个工具能通过两条指令完成一个kubernetes 集群的部署&#xff1a; 创建一个Master 节点kubeadm init将Node 节点加入到当前集群中…

minio集群部署

最近接触到minio&#xff0c; 将本地集群部署&#xff0c;分别在ubuntu、centos stream9上进行了搭建&#xff0c;目前看里面的小坑不小&#xff0c;记录以下教程&#xff0c;以备忘、以供他人借鉴。 #### 准备 1、因新版本的minio要求&#xff0c;集群部署必须使用挂载非 roo…

Java基础:字符串详解

1 深入解读String类源码 1.1 String类的声明 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence { }String类是final的&#xff0c;意味着它不能被子类继承&#xff1b;String 类实现了Serializable接口&#xff0c;意味着…

没人告诉你的职场人情世故

看到前同事在群里分享的新年开工遭遇&#xff0c;真是让人感同身受。 第一天就遇到挫折&#xff0c;因为工作做得太快、太早交付&#xff0c;结果反被领导批评&#xff0c;还得重做&#xff0c;头大如斗。这不就提醒我们得时时刻刻记着职场里的那些不成文的规矩吗&#xff1f;…

Hunuan-DiT代码阅读

一 整体架构 该模型是以SD为基础的文生图模型&#xff0c;具体扩散模型原理参考https://zhouyifan.net/2023/07/07/20230330-diffusion-model/&#xff0c;代码地址https://github.com/Tencent/HunyuanDiT&#xff0c;这里介绍 Full-parameter Training 二 输入数据处理 这里…