OPEN17的个人小站
用于计算两个数的最大公约数,即gcd(m,n)
也就是初中数学的辗转相除法
# py自带gcd和lcm
from math import gcd,lcm
对于给定的值:0 ≤ m < n 计算 gcd(m, n),可以用到以下递归式:
gcd(0,n)=n
gcd(m, n) = gcd(n \bmod m), m > 0时间复杂度:O(log n)
同样还有根相减损法,即gcd(m,n)=gcd(m−n,n),但是除非m,n较为相近且较大,否则远不如取余下降的快
最小公倍数lcm(m,n)=(m×n)/gcd(m,n),为了防止溢出通常先除再乘[1]
"""
扩展欧几里得用于求出ax+by=gcd(a,b)的一组特解
通解即为 x'=x+k*b/(gcd(a,b)) y'=y-k*a/(gcd(a,b))
同时显然知道扩展欧几里得后,裴蜀定理的正确性自然一目了然
>>> exgcd(3,10)
(1, -3, 1)
"""
def exgcd(a, b):
if b==0: return a,1,0
d, x, y = exgcd(b, a % b)
return d, y, x - (a // b) * y
python虽然有高精度无需担心溢出,但是高精度运算常数还是比较大 ↩︎
用于计算两个数的最大公约数,即gcd(m,n)
也就是初中数学的辗转相除法
# py自带gcd和lcm
from math import gcd,lcm
对于给定的值:0 ≤ m < n 计算 gcd(m, n),可以用到以下递归式:
gcd(0,n)=n
gcd(m, n) = gcd(n \bmod m), m > 0时间复杂度:O(log n)
同样还有根相减损法,即gcd(m,n)=gcd(m−n,n),但是除非m,n较为相近且较大,否则远不如取余下降的快
最小公倍数lcm(m,n)=(m×n)/gcd(m,n),为了防止溢出通常先除再乘[1]
"""
扩展欧几里得用于求出ax+by=gcd(a,b)的一组特解
通解即为 x'=x+k*b/(gcd(a,b)) y'=y-k*a/(gcd(a,b))
同时显然知道扩展欧几里得后,裴蜀定理的正确性自然一目了然
>>> exgcd(3,10)
(1, -3, 1)
"""
def exgcd(a, b):
if b==0: return a,1,0
d, x, y = exgcd(b, a % b)
return d, y, x - (a // b) * y
python虽然有高精度无需担心溢出,但是高精度运算常数还是比较大 ↩︎