Python版本的常见模板(二) 数论(一)

news2024/12/23 8:52:02

文章目录

  • 前言
  • 质数相关
    • 质数判断
    • 求约数
    • 求取区间质数
      • 埃氏筛法
      • 线性筛法
    • 分解质因数
  • 欧拉
    • 欧拉函数
      • 求取单个数
      • 线性筛法求取
    • 欧拉定理
    • 求逆元
      • 快速幂/幂取模
  • 欧几里得算法
    • 求最小公约数
    • 拓展欧几里得算法
    • 求解同余方程

前言

本文主要是提供Python版本的常见的一些与数论相关的模板,例如求解质数,质因数分解,简单博弈论,以及组合型问题(经典的括号匹配组合问题)等等。至于原理与证明的话,由于存在大量的数学公式推理,因此本文不展示,仅展示代码与变量说明和使用场景。

注意: 相关原理将使用红色字体进行标注,证明可自行查阅资料。本文不再赘述!

质数相关

质数判断

朴素方式:

def isPrim(n):
	if(n==1):
		return False
	for i in range(2,n):
		if(n%i==0);
			return False
	return True

之后的话,由于除法的一些性质,当 n/d = d 的时候,d^2 = n 在这个循环过程当中 d^2 <= n 这个时候的话,是没有必要全部除去的,只需要一般就好了。

优化版本:

def isPrime(n):
	if(n==1):
		return 
	
	i = 2
	while(i<=(n//i)):
		if(n%i==0):
			return False
	return True

求约数

这个的话就是前面说的那句话的比较好的运用

def yueShu(n):
	i = 1
	while(i<=n//i):
		if(n%i==0):
			print(i)
			if(i!=n//i):
				print(n//i)
		i+=1

此外:
在这里插入图片描述

求取区间质数

现在我们知道了如何判断一个质数,那么现在我们需要求取一个区间内的质数,例如,我们需要求取,从1~n之间所有的质数有哪些?

埃氏筛法

直接看到代码:

def getPrims(n):
	prime = [0] * (n+1):
	st = [False] * (n+1)
	cnt = 0
	for i in range(2,n+1):
		if(not st[i]):
			prime[cnt] = i
			cnt+=1
		
		j = i+i
		while(j<=n):
			st[j] = True
			j+=i
			

这个的话,就是把这个质数的倍数给筛掉。

线性筛法

埃氏筛法的效率还是可以的,但是还可以优化一下。

def getPrim(n):
	prime = [0] * (n+1):
	st = [False] * (n+1)
	cnt = 0
	for i in range(2,n+1):
	if(not st[i]):
		prime[cnt] = i
		cnt+=1
	
	j = 0
	while(prime[j] <=n//i):
		st[prime[j]*i] = True
		if(i%(prime[j])==0):
			break
		j+=1

这个的话就是把那个筛选的给优化了一下。

分解质因数

ok,接下来是分解质因数,这个分解质因数是很有用的东西。

N = p1^a1 * p2*a2 …pk^ak
对于一个数N都可以拆解为这样的样子,其中这个P是质数

def division(n):
	
	i = 2
	while(i<=n/i):
		if(n%i==0):
			a = 0
			while(n%i==0):
				n//=i
				a+=1
			print("当前质因数为:{},对于的幂是{}".format(i,a))
	if(n>1):
		print("当前质因数为:{},对于的幂是{}".format(n,1))

欧拉

这个东西的话和我们的这个质数还是有点关系的。

欧拉函数

欧拉函数φ(5) 表示从1~5 当中和5 互质的元素个数有几个。

求取单个数

同样的和我们刚刚的这个质数是类似的,可以直接求取这个欧拉函数,也有求取一个区间的所有欧拉函数值。
在这里插入图片描述


def OuLa(n):
	res = n
	i = 2
	while(i<=(n//i)):
		if(n%i==0):
			while(n%i==0):
				n//=i
			#res = res* (1-(1/i)) 优化一下避免处于小数
			res = res // i *(i - 1)

	return res

线性筛法求取

这个的话就是求取这个1~n这个范围的所有的欧拉数

def ouLaLiner(n):
	prim = [0] * (n+1)
	st = [False] * (n+1)
	cnt = 0
	phi = [1] * (n+1) # φ(1) = 1
	for i in range(2,n+1):
		if(not st[i]):
			prim[cnt] = i
			i+=1
			phi[i] = phi[i-1]
	
		j = 0
		while(prim[j]<=n//i):
			st[prim[j]*i] = True
			if(i%prim[j]==0):
				phi[prim[j]*i] = phi[i] *(prim[j])
				break
			phi[prim[j]*i] = phi[i] *(prim[j]-1)
			j+=1 
	

欧拉定理

那么接下来就是这个欧拉定理,这个欧拉定理的话,可以用在我们的求逆元的时候用上。

这个定理非常简单。
在这里插入图片描述

求逆元

在这里插入图片描述

那么这里的话,求解的时候的话,还需要一个求快速幂的算法

快速幂/幂取模

def KuaiSu(a,k):
	res = 1
	while(k):
		if(k%2==0):
			res*=a
		a*=a
		k//=2
	return res
def KuaiSu(a,k,p):
	res = 1
	while(k):
		if(k%2==0):
			res*=a % p
		a*=a % p
		k//=2
	return res

原理是这个:

(a + b) % p = (a % p + b % p) % p(1)

(a - b) % p = (a % p - b % p ) % p (2)

(a * b) % p = (a % p * b % p) % p .(3)

欧几里得算法

求最小公约数

这里的话主要是这个欧几里得算法,这个欧几里得算法的话作用还是非常大的,一个是求取最小公约数,然后的话就是用拓展欧几里得算法来求取这个同余方程(当然这块是先用裴蜀定理可以证明一下)

def gcd(a,b):
	if(b==0):
		return a
	return (b,a%b)

拓展欧几里得算法

在这里插入图片描述
我们使用这个拓展欧几里得算法的话可以求出这个来。
我们先来直接看到代码:

globe x=0,y=0
def exgcd(a,b,x,y):
	if(b == 0):
		x = 1,y = 0
		return a
    d = exgcd(b, a % b, y, x);
    y -= (a//b) * x;
	return d

这里的话这个y 是这样的:
在这里插入图片描述

求解同余方程

那么这个拓展欧几里得算法的话就可以去求解同余方程以及我们刚刚的求逆元。

因为我们那个求逆元其实也就是解一个同余方程,只是那个方程比较特殊而已。

为什么可以怎么来的如下:
在这里插入图片描述
这里的话就不给代码了,上面有。然后求逆的话是这样的:
在这里插入图片描述

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

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

相关文章

SQL中常见的数据类型

SQL中常见的数据类型 目录概述一、整型分类特点二、小数分类特点三、字符型四、日期型分类特点概述 数值型 整数&#xff1a;整型 小数&#xff1a;定点数、浮点数字符型 较短的文本&#xff1a;char、varchar 较长的文本&#xff1a;text、blob(用于保存较长的二进制数据&…

GEE学习笔记 八十二:湖北旱情分析(2019年8月-9月)

2019年8月1日至9月15日&#xff0c;湖北平均雨量为近53年来同期最少&#xff0c;仅69.4毫米。尤其是中东部地区降水异常偏少&#xff0c;一个半月里大多数地方的累计降水量均不足70毫米&#xff0c;其中洪湖、英山降水仅4毫米。鄂西东部一直到鄂东地区的降水量均比常年同期偏少…

IP协议相关特性

日升时奋斗&#xff0c;日落时自省 目录 1、地址管理 1.1、子网掩码 2、路由选择 针对网络层的IP协议理解 TCP/IP协议栈TCPIP 此处详细解析IPv4协议&#xff08;v4版本&#xff09; 4位版本&#xff1a;此处的取值只有两个v4 &#xff0c;v6 4位首部长度 &#xff1a;描…

【WPF】WindowChrome 自定义窗口完美实现

WindowChrome 自定义窗口完美实现简介效果图自定义最小化、最大化、关闭按钮布局实现结语简介 Microsoft官网关于 WindowChome 的介绍 截取Microsoft文章的一段话&#xff1a;   若要在保留其标准功能时自定义窗口&#xff0c;可以使用该 WindowChrome 类。 该 WindowChrome…

多元回归分析 | CNN-BiLSTM卷积双向长短期记忆神经网络多输入单输出预测(Matlab完整程序)

多元回归分析 | CNN-BiLSTM卷积双向长短期记忆神经网络多输入单输出预测(Matlab完整程序) 目录 多元回归分析 | CNN-BiLSTM卷积双向长短期记忆神经网络多输入单输出预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练结束: 已完成最大轮…

新建一个完整的react项目和完善初始项目

一&#xff1a;新建一个完整的react项目 1.环境准备 目前我的环境是 node&#xff1a;16.17.1 npm&#xff1a; 8.15.0 查看环境&#xff1a;1)&#xff1a;打开命令提示符工具&#xff0c;利用node -v和npm -v 查看一下自己的环境&#xff0c;如果觉得重新卸载、安装node比较…

用记事本实现“HelloWorld”输出

一、在任意文件夹中创建一个新的文本文档文件并写入以下代码 public class Hello{public static void main (String[] args){System.out.print("Hello,World!");} } 二、修改文件名称及文件类型为 Hello.java 特别注意&#xff1a;文件命名必须与代码中类的名称相同…

为什么伟大的产品只专注做一件事

uber 不允许你预订出租车。亚马逊一开始只是卖书。谷歌只是一个搜索引擎。麦当劳没有餐具。不知为什么&#xff0c;我们仍然相信一个产品要想成功&#xff0c;它必须做很多事情。这通常发生在两种情况下&#xff1a;当新产品试图让市场相信它们是值得的&#xff0c;或者当公司提…

儿童蜡笔出口美国CPC认证CPSIA+ASTM963测试

蜡笔是将颜料掺在蜡里制成的笔&#xff0c;可有数十种颜色&#xff0c;画画用。蜡笔没有渗透性&#xff0c;是靠附着力固定在画面上&#xff0c;不适宜用过于光滑的纸、板&#xff0c;亦不能通过色彩的反复叠加求得复合色。它是儿童学习色彩画的理想工具&#xff0c;一些画家用…

【Spark分布式内存计算框架——Spark SQL】5. DataFrame(下)

3.3 Row DataFrame中每条数据封装在Row中&#xff0c;Row表示每行数据&#xff0c;具体哪些字段位置&#xff0c;获取DataFrame中第一条数据。 如何构建Row对象&#xff1a;要么是传递value&#xff0c;要么传递Seq&#xff0c;官方实例代码&#xff1a; import org.apache.…

百分点科技宣布接入百度文心一言能力

2月16日&#xff0c; 百分点科技宣布成为百度文心一言&#xff08;英文名&#xff1a;ERNIE Bot&#xff09;首批生态合作伙伴。后续&#xff0c;百分点科技将全面体验并接入文心一言的能力。百分点科技专注于数据科学理论和技术的创新实践&#xff0c;长期坚持基础技术和行业应…

初始QML

Qt Quick的介绍 &#xff1a; Qt Quick是QML的标准类型和功能库。它包括视觉类型&#xff0c;交互类型&#xff0c;动画&#xff0c;模型和视图&#xff0c;粒子效果和着色器效果。QML 应用程序开发人员可以通过单个导入语句访问所有这些功能&#xff0c;简单来说Qt Quick是一…

使用 Hashnode API、Typescript 和 GraphQL 将博客文章添加到您的 React 站点

在本文中&#xff0c;我们将&#xff1a;使用 Next.js 引导一个 React.js Typescript 项目。设置 Apollo GraphQL 客户端并将其集成到我们的项目中。设置 GraphQL Codegen 以生成我们可以在整个应用程序中使用的类型、类型安全查询和自定义挂钩。创建一个索引页面&#xff0c;其…

Failed at the node-sass@4.14.1 postinstall script

vue项目启动&#xff0c;安装node14.18.0版本&#xff0c;构建时报错&#xff1a; Failed at the node-sass4.14.1 postinstall script 其实在构建过程中&#xff0c;还出现了其他组件的各种报错&#xff0c;最后反思了一下&#xff0c;觉得是nodeJs的版本问题&#xff0c;最…

BIM技巧 | Revit中如何给房间填充颜色?就5步

大家在Revit平面创建好房间后&#xff0c;有没有觉得各房间因为没有着色而区分不明显、视觉效果一般呢&#xff1f; 一、今天就教给大家如何给房间填充上颜色。 01 第一步 首先&#xff0c;将各个房间创建好&#xff1b; 02 第二步 在【建筑】-【房间和面积】单击下拉菜单…

深入理解vue2.x中Object.defineproperty()和vue3.x中Proxy

前言 vue2.x中数据的双向绑定主要通过Object.defineproperty()方法实现&#xff0c;data中的数据改变通过Object.defineProperty()对属性设置set属性&#xff0c;获取通过get属性&#xff0c;Object.defineProperty的作用就是劫持一个对象的属性,通常我们对属性的getter和sett…

魔兽世界私服架设教程——如何搭建魔兽世界私服

TrinityCore是一个魔兽世界服务端模拟器&#xff0c;我们可以通过TrinityCore来学习大型网络游戏服务端的编写&#xff0c;从中汲取营养来编写我们自己的游戏。一、前期准备工作CPU需要支持SSE2指令集Boost版本大于等于1.59.0MySQL数据库版本大于等于5.1.0OpenSSL版本为1.0.xCM…

基于机器学习LSTM的古代汉语切分标注算法及语料库研究 完整代码+数据+论文

完整代码&#xff1a;https://download.csdn.net/download/qq_38735017/87382302摘 要近年来&#xff0c;深度学习的浪潮渗透在科研和生活领域的方方面面&#xff0c;本文主要研究深度学习在自然语言处理&#xff0c;尤其是古汉语自然语言处理方面的应用。本文旨在利用计算机帮…

C#中GDI+的矩形功能扩展

原文出处&#xff1a;https://haigear.blog.csdn.net/article/details/129060020 GDI发展到GDI绘制函数中的参数往往都有矩形这个参数&#xff08;除绘制直线和路径&#xff09;&#xff0c;所以我们用好了矩形绘图就容易多了。 一、中心定位绘制图形 但当我们绘制一个图形时…

Towards Adversarial Attack on Vision-Language Pre-training Models

摘要虽然视觉-语言预训练模型(VLP)在各种视觉-语言(VL)任务上表现出革命性的改进&#xff0c;但关于其对抗鲁棒性的研究在很大程度上仍未被探索。本文研究了常用VLP模型和VL任务的对抗性攻击。首先&#xff0c;我们分析了不同设置下对抗性攻击的性能。通过研究不同扰动对象和攻…