当前位置: 首页 > news >正文

锋云科技网站建设百度入驻

锋云科技网站建设,百度入驻,网站做SEO优化多少钱,二维码生成器哪个好用文章目录前言质数相关质数判断求约数求取区间质数埃氏筛法线性筛法分解质因数欧拉欧拉函数求取单个数线性筛法求取欧拉定理求逆元快速幂/幂取模欧几里得算法求最小公约数拓展欧几里得算法求解同余方程前言 本文主要是提供Python版本的常见的一些与数论相关的模板,例…

文章目录

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

前言

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

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

质数相关

质数判断

朴素方式:

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

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

优化版本:

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

求约数

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

def yueShu(n):i = 1while(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 = 0for i in range(2,n+1):if(not st[i]):prime[cnt] = icnt+=1j = i+iwhile(j<=n):st[j] = Truej+=i

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

线性筛法

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

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

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

分解质因数

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

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

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

欧拉

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

欧拉函数

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

求取单个数

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


def OuLa(n):res = ni = 2while(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 = 0phi = [1] * (n+1) # φ(1) = 1for i in range(2,n+1):if(not st[i]):prim[cnt] = ii+=1phi[i] = phi[i-1]j = 0while(prim[j]<=n//i):st[prim[j]*i] = Trueif(i%prim[j]==0):phi[prim[j]*i] = phi[i] *(prim[j])breakphi[prim[j]*i] = phi[i] *(prim[j]-1)j+=1 

欧拉定理

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

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

求逆元

在这里插入图片描述

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

快速幂/幂取模

def KuaiSu(a,k):res = 1while(k):if(k%2==0):res*=aa*=ak//=2return res
def KuaiSu(a,k,p):res = 1while(k):if(k%2==0):res*=a % pa*=a % pk//=2return 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 areturn (b,a%b)

拓展欧几里得算法

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

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

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

求解同余方程

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

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

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

http://www.tj-hxxt.cn/news/111277.html

相关文章:

  • 哪个网站做外贸年费比较便宜seo策略工具
  • 网站类型怎么分seo零基础教学
  • 建设网商城网站需要在那里备案安卓优化大师新版
  • 建筑网片多少钱一平方seo积分系统
  • 南郊做网站运营培训班学费大概多少
  • python做的网站源码seo推广优化公司哪家好
  • 湖南营销型企业网站开发百度指数排名明星
  • 网站开发Java与Python企业文化ppt
  • 织梦系统做的网站怎么样爱站网挖掘关键词
  • 软件开发具体流程晋城seo
  • 中国古建筑网站站长统计官方网站
  • 不属于网站后期维护知乎小说推广对接平台
  • 网站设计步骤及注意事项小程序商城制作一个需要多少钱
  • 网站的排名就是友情链接东莞最新消息今天
  • 洛阳哪里做网站seo排名优化排行
  • 厦门市城乡建设委员会网站免费个人自助建站
  • 青海省住房和城乡建设厅 网站域名查询 ip
  • 博彩网站怎么做广州推广seo
  • 做网站需要编程怎么让百度搜索靠前
  • 电子商务网站设计分析怎么做重庆seo杨洋
  • 怎么做加密网站台州网站制作维护
  • 烟台市铁路建设管理局网站八大营销方式有哪几种
  • 做变形字的网站长沙百度推广优化排名
  • 东莞微信网站建设百度搜索排行榜
  • 有那些是做批发的网站关键词优化公司排行
  • 大同疫情最新消息seo关键词快速排名
  • 网站ui设计标准宁波关键词优化排名工具
  • 渝北集团网站建设seo营销培训
  • 做钓鱼网站盗游戏号会被判刑吗长沙电商优化
  • 网站空间备案要多久seo外包服务