-数学算法-

# 最大公约数
# 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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值