计算最大公约数

63 阅读1分钟

这是计算最大公约数的函数.辗转相除法

function gcd(a, b)
    if b == 0 then
        return a
    end 
    return gcd(b, a % b)
end

它的计算其实是使用欧拉定理.

zh.wikipedia.org/wiki/欧拉定理_(…

证明

对于任何可以整除a和b的整数,那么它也一定能整除a-b

假设 a b 都有公约数 n 且 a>b, 假设 a=x1na=x_1n, b=x2nb=x_2n

那么ab=(x1x2)n a-b =(x_1-x_2)n

  1. a=kb+t 那么 t=a-kb

    td=adkbd\frac{t}{d} = \frac{a}{d} -\frac{kb}{d}

    因为 a、b都能够被d整除

    所以 adkbd\frac{a}{d}-\frac{kb}{d} 为整数,

    td\frac{t}{d} 为整数,所以 d 也是 t 的公约数.

在均衡负载中,对设置的权重求最大公约数,需要用到 gcd 函数.

当传入的值是非数字时, 比如传入 字符串 “0”, b==0 判断失效

执行 gcd(”0”,nil) ,再次执行 gcd(nil,nil) 导致出现死循环.

mp.weixin.qq.com/s?__biz=Mzg…