Skip to content

若整数 n 除以整数 d 余数为 0,即 d 能整除 n,则称整数 d 是整数 n 的约数,n 是约数 d 的倍数。记为 dn

算术基本定理的推论

在算术基本定理中,若正整数 n 能被唯一分解为 p1a1p2a2pkak,其中 ai 都是正整数,pi 是质数,且满足 p1<p2<<pk,则 n 的正约数集合可以写作:

p1b1p2b2pkbk其中 0biai

n 的正约数的个数为:

(a1+1)(a2+1)(ak+1)=i=1k(ai+1)

n 的正约数的和为:

(1+p1+p12++p1a1)(1+p2+p22++p2a2)(1+pk+pk2++pkak)=i=1k(1+pi+pi2++piai)=i=1k(j=0aipij)

试除法求 n 的约数集合

cpp
vector<int> factorize(int n) {
    vector<int> factor;
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            factor.push_back(i);
            if (i != n / i) factor.push_back(n / i);
        }
    }

    return factor;
}

由试除法可知一个整数 n 的约数个数上界为 n,因此试除法的时间复杂度为 O(n)

倍数法求 1n 每个数的约数集合

cpp
void factorize(int n) {
    vector<int> factor[500010];
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n / i; j++) {
            factor[i * j].push_back(i);
        }
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < factor[i].size(); j++) {
            cout << factor[i][j] << " ";
        }
        cout << endl;
    }
    return;
}

最大公约数和最小公倍数

若自然数 d 同时是自然数 ab 的约数,则称 dab 的公约数。在所有 ab 的公约数中最大的一个,称为 ab 的最大公约数,记作 gcd(a,b)

若自然数 d 同时是自然数 ab 的公倍数,则称 dab 的公倍数。在所有 ab 的公倍数中最小的一个,称为 ab 的最小公倍数,记作 lcm(a,b)

最大公约数和最小公倍数的关系:

gcd(a,b)lcm(a,b)=ab

更相减损术

a,bZ,abgcd(a,b)=gcd(a,ab)=gcd(b,ab)

欧几里得算法

a,bZ,gcd(a,b)={gcd(b,amodb)if abaif b=0

互质与欧拉函数

参见下节