约数、最大公约数

约数、最大公约数1 约数 约数 又称因数 整数 a a a 除以整数 b b 0 b b 0 b b 0

大家好,我是讯享网,很高兴认识大家。

1. 约数

约数,又称因数。整数 a a a 除以整数 b ( b ≠ 0 ) b(b≠0) b(b=0) 除得的商正好是整数而没有余数,我们就说 a a a 能被 b b b 整除,或 b b b 能整除 a a a a a a 称为 b b b 的倍数, b b b 称为 a a a 的约数。

2. 试除法求约数

试除法求约数的原理和试除法判断质数的原理基本一致,但是注意求约数的时候要从 1 1 1 开始,时间复杂度是 O ( s q r t ( n ) ) O(sqrt(n)) O(sqrt(n))

#include <iostream> #include <algorithm> #include <vector> using namespace std; // 求 x 的所有约数 vector<int> get_divisors(int x) { 
    vector<int> res; for (int i = 1; i <= x / i; i ++ ) if (x % i == 0) { 
    res.push_back(i); if (i != x / i) res.push_back(x / i); } sort(res.begin(), res.end()); return res; } 

讯享网

3. 最大公约数—欧几里得算法(辗转相除法)

首先,如果 d ∣ a d|a da,并且 d ∣ b d|b db,那么 d ∣ x a + y b d|xa+yb dxa+yb


讯享网

我们先直接上结论,记 x , y x, y x,y 的最大公约数为 g c d ( x , y ) gcd(x, y) gcd(x,y),则 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b) = gcd(b, a \% b) gcd(a,b)=gcd(b,a%b)

证明:
因为 a % b = a − ⌊ a b ⌋ b a \% b = a - \lfloor \frac{a}{b} \rfloor b a%b=abab,因为 ⌊ a b ⌋ \lfloor \frac{a}{b} \rfloor ba 是一个整数,所以我们可以直接将其记为 c c c。因此,如果 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b) = gcd(b, a \% b) gcd(a,b)=gcd(b,a%b) 成立,则有 g c d ( a , b ) = g c d ( b , a − c ⋅ b ) gcd(a,b) = gcd(b, a - c·b) gcd(a,b)=gcd(b,acb) 成立,所以我们只要证明 g c d ( a , b ) = g c d ( b , a − c ⋅ b ) gcd(a,b) = gcd(b, a - c·b) gcd(a,b)=gcd(b,acb) 成立即可。

对于 ( a , b ) (a,b) (a,b) 中的任何一个约数 d d d,都有 d ∣ a d|a da d ∣ b d|b db,而 d ∣ a = d ∣ a − c ⋅ b + c ⋅ b d|a=d|a-c·b+c·b da=dacb+cb,又因为 d ∣ c ⋅ b d|c·b dcb 所以 d ∣ a − c ⋅ b d|a-c·b dacb,因此 ( a , b ) (a,b) (a,b) ( b , a % b ) (b, a \% b) (b,a%b) 的公约数集合是相同的,所以说 g c d ( a , b ) = g c d ( b , a − c ⋅ b ) gcd(a,b) = gcd(b, a - c·b) gcd(a,b)=gcd(b,acb)

讯享网int gcd(int a, int b) { 
    // gcd(a, 0) = a,因为 0 可以整除任何一个数 return b ? gcd(b, a % b) : a; } 
小讯
上一篇 2025-03-21 10:19
下一篇 2025-01-23 21:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/126115.html