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

数论入门(python)

一、快速幂例题:杭电oj2035求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”由于当b很大时,时间复杂度高&#x

一、快速幂

例题:杭电oj2035

求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”

由于当b很大时,时间复杂度高,所以要快速幂

*关于取模运算的性质:

(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)

快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。


不是解答,是我自己随便写的板子a,b=31,100000
mid=1 #用来接收盛放奇数幂的底数
mod=10*8+9
while b>0:if b%2: #奇数的处理b=b-1mid=mid*ab=b/2a=a**2%modelse:b = b / 2 #幂减少一半,底数翻倍a = a ** 2 % mod
print(mid*a%mod)​

二、线性筛

原理并不复杂,但需要看下最后一句

n = int(input())
st = [True]*(n+1)
cnt = 0
primes = []
for i in range(2, n+1):if st[i]:cnt += 1primes.append(i)for p in primes:if i*p>n:break #防止越界st[p*i] = Falseif i % p == 0:break #这样就保证了每个合数被自己的最小质因数所筛,不重复,减少时间复杂度

解释下最后一句:举个例子 :i = 8 p=2,如果不跳出循环,那么再次循环时,p=3,所得的8 * 3  = 2 * 12,在i = 12时会计算再计算一遍24


三、逆元

逆元概念:在mod某个数意义下的倒数。例如5x≡1(mod3),x=2是满足10=1(mod3),所以称2是5在mod3意义下的逆元。记为inv(a,p)

需要注意只有a和p互质,a才有关于p的逆元

四大求逆元的方法


·费马小定理

定理概念:在p是素数的前提下满足:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV0HvvJ09V29uZGVyZnVsIEFuc3dlcg==,size_6,color_FFFFFF,t_70,g_se,x_16

稍作变形,有:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV0HvvJ09V29uZGVyZnVsIEFuc3dlcg==,size_6,color_FFFFFF,t_70,g_se,x_16

即a的p-2次方,便是我们所求。

a,p=3,5
#求a mod p 的逆元,也就是求a的p-2次方
mid=1
p=p-2
while p:if p%2:p=p-1mid=mid*ap=p/2a=a**2continueelse:p = p / 2a = a ** 2
print(mid*a)
q=3*2187
print(q%5)输出:
2187
1

·欧拉定理

对于素数p,有:0e15dfb9267a4fa5aa1ffd4e989ee62b.jpg

其中,指数是p的欧拉函数值,也就是小于p的与p互质的数(只有1这一个约数)

类似的变换有:watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV0HvvJ09V29uZGVyZnVsIEFuc3dlcg==,size_10,color_FFFFFF,t_70,g_se,x_16


对于欧拉函数:

其中pi是n的所有质因数:

例如:φ ( 10 ) 的质因数为2,5,所以φ ( 10 ) = 10 * (1 - 1/2) * (1 - 1/5) = 4(1,3,5,7这四个数)

φ (24)的质因数为2,3,所以φ (24)=24* (1 - 1/2) * (1 - 1/3)=8(1,5,7,11,13,17,19,23这八个数)


欧拉函数性质:

1,若n为质数,则φ ( n ) = n - 1;
2,若m与n互质,则φ ( n*m ) = φ ( n ) * φ ( m );
3,若正整数n与a互质,那么就有:0e15dfb9267a4fa5aa1ffd4e989ee62b.jpg
4,若n为奇数时,φ ( 2n ) = φ ( n );
5,若n = pk且p是质数,那么φ ( n ) = (p - 1) * pk-1 = pk - pk-1.

代码基于快速幂,不再写了


线性递推求逆元


扩展欧几里得求逆元

如果gcd(a,p)=1;
那么就有ax+py=1
双方同时modp
就有ax≡1(modp)
因为py是p的倍数全部约掉了
此时x就是a的逆元
所以只需解出该情况下的扩展欧几里得方程的解问题就解决了

def ext_gcd(a,b):if not b :return 1,0,aelse:x,y,gcd=ext_gcd(b,a%b)x,y=y,(x-(a//b)*y)return x,y,gcd
x,y,gcd=ext_gcd(7,6)
print(x,y,gcd)返回值:
1 -1 1

后续更新:

扩展欧几里得求ax+by=gcd(a,b)*k

以及通解


四、扩展中国剩余

用于求解模运算方程组,eg:

x=a1∗x1+b1(1)
x=a2∗x2+b2(2)
x=a2∗x2+b2(3)

对于一式和二式,消x得:

a1*x1+a2*x2=b1-b2(因为x是未知量,符号不考虑)

利用扩展欧几里得求x1,得到 :

k=a1*x1+b1

于是我们得到新式子:

x≡k(mod  lcm(a1,a2))

等价于:x=lcm(a1,a2)*x' +k  (4)

同理联立(3) 和 (4)就能得到解

def ext_gcd(a,b):if not b:x,y=1,0return x,y,ax,y,gcd=ext_gcd(b,a%b)x,y=y,(x-(a//b)*y)return x,y,gcd
n=3
nums=[[3,2],[5,3],[7,2]]
while len(nums)>1:mid=nums.pop()a1,b1=mid[0],mid[1]mid=nums.pop()a2, b2 = mid[0], mid[1]mid1,mid2,mid3=ext_gcd(a1,a2)q=abs(b1-b2)mid1,mid2=mid1*(q/mid3),mid2*(q/mid3)k=mid1*a1+b1lcm=a1*a2/mid3nums.append([lcm,k])
print(int((mid1*a1+b1)%lcm))


推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了蓝桥训练中的闰年判断问题,并提供了使用Python代码进行判断的方法。根据给定的年份,判断是否为闰年的条件是:年份是4的倍数且不是100的倍数,或者是400的倍数。根据输入的年份,输出结果为yes或no。本文提供了相应的Python代码实现。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
手机用户2602907485
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有