分解質因數、求因子數和因子和(唯一分解定理)

【唯一分解定理】

又稱算術基本定理,可以描述爲:任意一個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,一個數能被唯一地分解成質因數的乘積。

公式:n = p_{1}^{a_{1}}\cdot p_{2}^{a_{2}}\cdot ...\cdot p_{k}^{a_{k}}(p_{1}<p_{2}<p_{3}<...<p_{k},a_{i}>0)

因子數: 

Cou(n)=(p_{1}+1)\cdot (p_{2}+1)\cdot...\cdot (p_{k}+1)=\prod_{j=1}^{k}(p_{j}+1)

p1可以取的個數爲[0, a1],p2可以取的個數爲[0, a2],pk可以取的個數爲[0, ak],根據乘法原理,總的因子個數就是這些指數+1的連乘,即(1 + Ye1) * (1 + Ye2) * ... * (1 + Yek)。

因子和:

  Sum(n)=\frac{p_{1}^{a_{1}+1}-1}{p_{1}-1}\cdot \frac{p_{2}^{a_{2}+1}-1}{p_{2}-1}\cdot ...\cdot \frac{p_{k}^{a_{k}+1}-1}{p_{k}-1}= \prod_{j=1}^{k} \frac{p_{j}^{a_{j}+1}-1}{p_{j}-1}

等比數列求和公式 S_{n}=\frac{a_{1}*(1-q_{n})}{1-q} ,推導可得上式。

【代碼化】

//分解質因數
void init(ll k) 
{
    int num=0;
    for(ll i=2;i*i<=k;i++){
        if(k%i==0) fac[num++]=i;
        while(k%i==0) k/=i;
    }
    if(k>1) fac[num++]=k;
}
//求因子數
int cou(int n){
    int s=1;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            int a=0;
            while(n%i==0){
                n/=i;
                a++;
            }
            s=s*(a+1);
        }
    }
    if(n>1) s=s*2;
    return s;
}
//求因子和
int sum(int n){
    int s=1;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            int a=1;
            while(n%i==0){
                n/=i;
                a*=i;
            }
            s=s*(a*i-1)/(i-1);
        }
    }
    if(n>1) s=s*(1+n);
    return s;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章