算术基本定理(唯一分解定理):任何一个大于 1 的自然数 N,如果 N 不为质数,那么 N 可以唯一分解成有限个质数的乘积 N=P1a1P2a2P3a3PnanP1<P2<P3<<Pn 且均为质数,a1,a2,a3,,an 均为正整数。

定理推论

  • 一个大于 1 的整数 N,如果它的标准分解式为 N=P1a1P2a2P3a3Pnan,那么它的正因数个数为 σ0(N)=(1+a1)(1+a2)(1+an)

简单证明:

P1b1P2b2P3b3Pnbn (0b1a1,0b2a2,) 一定是 N 的正因数。其中 b1 可选 [0,a1]1+a1 种,b2 可选 [0,a2]1+a2

根据乘法原理,整体选法总数为:(1+a1)(1+a2)(1+an)。每一种选法对应一个正因数,则选法数量就是正因数的个数。

  • 它的全体正因数之和为 σ1(N)=(P10+P11+P12++P1a1)(P20+P21+P22++P2a2)(Pn0+Pn1+Pn2++Pnan)

简单证明:

我们将 (P10+P11+P12++P1a1)(P20+P21+P22++P2a2)(Pn0+Pn1+Pn2++Pnan) 使用分配律展开,会得到一个多项式。

多项式中每个单项式的结构均为 P1b1P2b2P3b3Pnbn (0b1a1,0b2a2,),即 N 的一个正因数。多项式的值便是所有正因数的和。

常见题型

求正因数个数

需要先用到欧拉筛生成质数,然后用质数从小到大分解 N 得到 a1,a2,a3,,an,然后计算出正因数个数 σ0(N)=(1+a1)(1+a2)(1+an)

bool is_prime[SIZE];
int prime[SIZE], primesize = 0;
// 欧拉筛生成质数代码省略
int fact_cnt(int n)
{
    int now = n, ans = 1;
    for (int i = 0; i < primesize && prime[i] <= sqrt(now); i++)
    {
        int cnt = 0;
        while (now % prime[i] == 0)
        {
            cnt++;
            now /= prime[i];
        }
        ans *= (cnt + 1);
    }
    if (now != 1)
        ans *= 1 + 1;
    return ans;
}

判断正因数之和奇偶性

需要以下结论:

  • 奇数个奇数相加为奇数,偶数个奇数相加为偶数
  • 奇数乘奇数为奇数,奇数乘偶数为偶数,偶数乘偶数为偶数
  • 除了 2,质数均为奇数。因此除了 2,质数的任意次幂都是奇数。

假设 σ1(N)=(1+P1+P12++P1a1)(1+P2+P22++P2a2)(1+Pn+Pn2++Pnan) 为奇数,那么:

情况 1:2N,那么 P1=2,所以 P1+P12++P1a1 为偶数,1+P1+P12++P1a1 为奇数。

如果 σ1(N) 为奇数,那么 (1+P2+P22++P2a2),,(1+Pn+Pn2++Pnan) 均为奇数

(P2+P22++P2a2),,(Pn+Pn2++Pnan) 均为偶数

因为 P2,,Pn 均为质数,由结论可知,一定是偶数个奇数相加,即 a2,,an 均为偶数

情况 1.1:a1 为偶数,N=P1a1P2a2P3a3Pnan=(P1a1/2P2a2/2P3a3/2Pnan/2)2 为完全平方数 x2

情况 1.2:a1 为奇数, N=P1a1P2a2P3a3Pnan=P1×(P1(a11)/2P2a2/2P3a3/2Pnan/2)2 为完全平方数的两倍 2x2

情况 2:2N,同上得 (P1+P12++P1a2),,(Pn+Pn2++Pnan) 均为偶数

所以 N=P1a1P2a2P3a3Pnan=(P1a1/2P2a2/2P3a3/2Pnan/2)2 为完全平方数 x2

综上所述:N=x2  2x2σ1(N) 为奇数,反之为偶数。

代码实现非常简单,略去。