> 文章列表 > 学python的第十五天---简单数论

学python的第十五天---简单数论

学python的第十五天---简单数论

  • 模运算
  • 一、刷题统计
  • 二、快速幂
  • 三、RSA解密
  • GCD
  • LCM
  • 四、核桃的数量(最小公倍数
  • 五、Hankson 的趣味题
  • 六、寻找整数
  • 素数
  • 七、笨小孩
  • 八、质数
  • 九、分解质因数

模运算

学python的第十五天---简单数论
(ab)mod m=(a mod m)(b mod m) mod m

一、刷题统计

学python的第十五天---简单数论

a,b,n=map(int,input().split())
res=a*5+b*2
m=n//res*7
n=n%res
t=0
while n>0:if t<5:n-=am+=1else:n-=bm+=1
print(m)

二、快速幂

学python的第十五天---简单数论

学python的第十五天---简单数论
学python的第十五天---简单数论

b,p,k=map(int,input().split())
def quick_mi(b,p,k):n=pb%=kans=1while n:if n&1==1:ans=(ans*b)%kb=(b*b)%kn>>=1return ansprint(quick_mi(b,p,k))

三、RSA解密

学python的第十五天---简单数论
先用下段代码求解p、q

import math
n=1001733993063167141
k=int(math.sqrt(n))
for i in range(2,k+1):if n%i==0:print(i,n//i)
891234941 1123984201

第二步将de%((p-1)(q-1))的式子转换一下

n=1001733993063167141
d=212353
p=891234941
q=1123984201
tmp=(p-1)*(q-1)
print(tmp)
for i in range(2,n+1):now=i*tmp+1if now%d==0:print(now//d)break
1001733991047948000
823816093931522017

第三步,利用快速幂的代码求解x=c^e mod n

n=1001733993063167141
e=823816093931522017
c=20190324
def fastpow(a,b,mod):ans=1while b:if b&1:ans=ans*a%moda=a*a%modb>>=1return ans
print(fastpow(c,e,n))
579706994112328949

GCD

学python的第十五天---简单数论

def gcd(a,b):if b==0:return areturn gcd(b,a%b)def gcd(a,b):return a if b==0 else gcd(b,a%b)from math import gcd

LCM

最小公倍数
LCM=a*b/gcd(a,b)
学python的第十五天---简单数论

def lcm(a,b):return a*b//gcd(a,b)

四、核桃的数量(最小公倍数)

学python的第十五天---简单数论
这道题就是求a,b,c的最小公倍数

from math import *def lcm(a,b):return a*b//gcd(a,b)a,b,c=map(int,input().split())
ans=lcm(lcm(a,b),c)
print(ans)

五、Hankson 的趣味题

学python的第十五天---简单数论
通过了80%,最后一个超时了,没有找到ac的python代码,如果有,麻烦大家发在评论群一下!

import math
from math import gcddef lcm(a,b):return a*b//gcd(a,b)n=int(input())
for i in range(n):a0,a1,b0,b1=map(int,input().split())ans=0for x in range(1,int(math.sqrt(b1)+1)):if b1%x==0:if gcd(x,a0)==a1 and lcm(x,b0)==b1:ans+=1y=b1//xif x==y:continueif gcd(y,a0)==a1 and lcm(y,b0)==b1:ans+=1print(ans)

六、寻找整数

学python的第十五天---简单数论

学python的第十五天---简单数论
学python的第十五天---简单数论
之前看别人的写法是找规律,感觉很复杂,但是感觉就是一直寻找他们的最小公倍数,然后累计步长很巧妙!

from math import *
mod=[0,0,1,2,1,4,5,4,1,2,9,0,5,10,11,14,9,0,11,18,9,11,11,15,17,9,23,20,25,16,29,27,25,11,17,4,29,22,37,23,9,1,11,11,33,29,15,5,41,46]
ans=2+mod[2]
k=2
for i in range(3,50):while True:if ans%i==mod[i]:k=lcm(k,int(i))breakelse:ans+=k#一直加他们的最小公倍数,一直到满足符合是其倍数
print(ans)
print(2022040920220409)

素数

学python的第十五天---简单数论
学python的第十五天---简单数论

七、笨小孩

学python的第十五天---简单数论

import math
def check(u):if u<=1:return Falsefor i in range(2,int(math.sqrt(u))+1):if u%i==0:return Falsereturn Trueletter=[0]*26
s=input()
for i in range(len(s)):if "A"<=s[i]<"Z":letter[ord(s[i]) - ord('A')] += 1else:letter[ord(s[i])-ord('a')]+=1
letter.sort()
maxx=letter[-1]
for i in letter:if i==0:continueminn=ibreak
# print(maxx,minn)
if check(maxx-minn):print("Lucky Word")print(maxx-minn)
else:print("No Answer")print("0")

八、质数

学python的第十五天---简单数论

N=106
primes=[]
bprime=[False]*Ndef getPrimes(n):global primesglobal cntbprime[0]=Truebprime[1]=Truefor i in range(2,n+1):if not bprime[i]:primes.append(i)cnt+=1for j in range(i*2,n+1,i):bprime[j]=Truen=int(input())
cnt=0
getPrimes(n-1)for p in primes:print(p,end=' ')
print()
print(cnt)

九、分解质因数

学python的第十五天---简单数论