# 最大公约数
# 1、求两个数的最大公约数
def gcd1(x, y):
while y:
x, y = y, x%y
return x
# 2、求一个数组的最大公约数
from functools import reduce
from math import gcd
nums = [1,2,3,4,5,6,7,8,9]
ans = reduce(gcd, nums)
# 最小公倍数
# 1、求两个数的最小公倍数
# 方法一
def lcm1(x, y):
return abs(x, y) // gcd(x,y)
# 方法二
def lcm2(x, y):
ans = max(x, y)
while True:
if ans % x == 0 and ans % y == 0:
return ans
ans += 1
# 2、求一个数组的最小公倍数
from functools import reduce
from math import lcm
ans = reduce(lcm, nums)
# 素数
# 1、判断一个数是否为素数
def prime1(m):
if m < 2: # 0 1 不是素数
return False
if m == 2: # 2 是素数
return True
if m % 2 == 0: # 被 2 整除的不是素数
return False
for i in range(2, int(m**0.5) + 1):
if m % i == 0:
return False
return True
# 2、求小于等于 n 的素数个数
def prime2(m):
if m < 2:
return 0
pri = [1] * m # 默认全是素数
pri[0] = pri[1] = 0 # 0 1 不是素数
ans = 0
for i in range(2, int(m**0.5)+1):
if pri[i] == 1: # 未标记
j = i*i # j 为 i 的倍数
while j < m:
pri[j] = 0 # 标记为非素数
j += i
return sum(pri)
# 3、输出小于等于 n 的素数
def prime3(m):
if m < 2:
return []
pri = [1] * (m+1) # 默认全是素数
pri[0] = pri[1] = 0 # 0 1 不是素数
for i in range(2,int(m**0,5)+1):
if pri[i] == 1:
j = i*i
while j <= m:
pri[j] = 0
j += i
ans = [i for i in range(len(pri)) if pri[i] == 1]
return ans
# 质因数(唯一分解定理)
def wei(m):
ans = {}
d = 2 # 2 是最小的质数
while m >= d:
if m % d == 0:
ans[d] = ans.get(d, 0) + 1
m //= d
else:
d += 1
return ans
# 快速幂
def kuaisu(x,n):
if n < 0:
n = -n
x = 1/x
ans = 1
while n > 0: # 指数大于 0
if n % 2 == 1: # 二进制末尾是 1
ans *= x
x *= x # 底数平方
n //= 2 # 指数的二进制右移一位
return ans
# 费马小定理求逆元(求a^-1)
def niyuan(a,p):
return pow(a,p-2,p) # a 的模逆元等于 a 的 p-2 次方模 p
# 计算组合数C(n, k)
from math import factorial
def comb(n, k):
return factorial(n) // (factorial(k) * factorial(n - k))
-数学算法-
最新推荐文章于 2025-12-09 16:47:37 发布
1万+

被折叠的 条评论
为什么被折叠?



