算法-数论算法

1. 最大公约数

欧几里得算法(辗转相除法)求最大公约数(Greatest Common Divisor,GCD)的递归定理:对任意非负整数a和任意正整数b
g c d ( a , b ) = g c d ( b , a   m o d   b ) gcd(a,b)=gcd(b,a \ mod \ 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. 最小公倍数

① : 令 a = g c d × d 1 = l c m m 1 , b = g c d × d 2 = l c m m 2 ② : a b = g c d × d 1 g c d × d 2 = l c m m 1 l c m m 2 = d 1 d 2 = m 2 m 1 ③ : 由 最 大 公 约 数 ( g c d ) 与 最 小 公 倍 数 ( l c m ) 的 定 义 可 推 出 : d 1 与 d 2 互 质 , m 1 与 m 2 互 质 ④ : 结 合 ② 和 ③ ⇒ d 1 = m 2 , d 2 = m 1 ⑤ : a × b = ( g c d × d 1 ) × ( l c m m 2 ) = g c d × l c m × d 1 = m 2 m 2 = g c d × l c m 结 论 : a × b = g c d ( a , b ) × l c m ( a , b ) \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} a=gcd×d1=m1lcm,b=gcd×d2=m2lcmba=gcd×d2gcd×d1=m2lcmm1lcm=d2d1=m1m2(gcd)(lcm)d1d2,m1m2d1=m2,d2=m1a×b=(gcd×d1)×(m2lcm)=gcd×lcm×m2d1=m2=gcd×lcma×b=gcd(a,b)×lcm(a,b)

求最小公倍数代码实现:

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

3. 模取幂

模取幂:求一个数的幂对另一个数的模运算, a b   m o d   n a^b \ mod \ n ab 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值