07-数论算法

1. 最大公约数

欧几里得算法(辗转相除法)求最大公约数(Greatest Common Divisor,GCD)的递归定理:对任意非负整数a和任意正整数b
gcd(a,b)=gcd(b,a \ mod \ b)
欧几里得算法递归实现:

// 欧几里得算法递归实现
public static int gcd(int a, int b) {
    if (b == 0)
        return a;
    return gcd(b, a % b);
}

欧几里得算法非递归实现:

// 欧几里得算法非递归实现
public static int gcd(int a, int b) {
    int r;
    while (b > 0) {
        r = a % b;
        a = b;
        b = r;
    }
    return a;
}

2. 最小公倍数

\begin{aligned} ①:& 令\quad a = gcd \times d1 = \frac{lcm}{m1}, b = gcd \times d2 = \frac{lcm}{m2}\\ ②:& \frac{a}{b} = \frac{gcd \times d1}{gcd \times d2} = \frac{\frac{lcm}{m1}}{\frac{lcm}{m2}} = \frac{d1}{d2} = \frac{m2}{m1}\\ ③:& 由最大公约数(gcd)与最小公倍数(lcm)的定义可推出:d1与d2互质,m1与m2互质\\ ④:& 结合②和③ \Rightarrow d1=m2,d2=m1\\ ⑤:& a \times b = (gcd \times d1) \times (\frac{lcm}{m2}) = gcd \times lcm \times \frac{d1=m2}{m2}=gcd \times lcm\\ & 结论:a\times b = gcd(a,b) \times lcm(a,b) \end{aligned}

求最小公倍数代码实现:

// 求最小公倍数
public static int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

3. 模取幂

模取幂:求一个数的幂对另一个数的模运算,a^b \ mod \ n

// 模取幂:Math.pow(a, b) % n
// a, b为非负整数,n为正整数
public static int modularExponentiation(int a, int b, int n) {
    int c = 0;
    int d = 1;
    String binaryB = Integer.toBinaryString(b);
    for (int i = 0; i < binaryB.length(); i++) {
        c *= 2;
        d = (d * d) % n;
        if (binaryB.charAt(i) == '1') {
            c++;
            d = (d * a) % n;
        }
    }
    return d;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容