唯一分解定理


1.唯一分解定理,也叫算術基本定理,指的是任何n>=2,都可以分解為n=p1*p2*p3*.....pn,其中pi為質數。

其包括兩個斷言:斷言1:數n可以以某種方式分解成素數乘積。

                             斷言2:僅有一種這樣的因數分解。(除因數重排外)。

其可以化簡為

 

 

2.如何實現:

實現方法1

#include <bits/stdc++.h>
#define maxn 10005
typedef long long ll;
using namespace std;
int main()
{

    int n,i=0;
    int cnt=0;
    int a[maxn]={0};//存儲其所有因子
    scanf("%d",&n);
    for(i=2;i*i<=n;i++)
    {
        while(n%i==0)
        {
            a[cnt++]=i;
            n/=i;
        }
    }
    if(n>1)
        a[cnt++]=n;
    for(i=0;i<cnt;i++)
    {
        if(i) printf(" ");
        printf("%d",a[i]);
    }
    printf("\n");
    return 0;
}

 

  實現方法2:

我們要的其實是n的所有素數因子,所以我們只要預先用歐拉篩打個素數表,遍歷的時候就只用遍歷素數了,這樣可以快一點,並且可以處理1e12以內的數。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int prime[10000005];
int a[1000005];
bool vis[10000005];
int cnt=0;
void primejudge(int n)
{
    memset(vis,false,sizeof(vis));
    vis[1]=true;
    int i,j;
    for(i=2;i<=n;i++)
    {
        if(!vis[i]) prime[cnt++]=i;
        for(j=0;j<cnt&&i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
}
int main()
{

    primejudge(10000005);//預處理了1e7以內的素數
    ll n;
    int i,index=0;
    scanf("%lld",&n);
    for(i=0;i<cnt&&prime[i]*prime[i]<=n;i++)
    {
        while(n%prime[i]==0)
        {
            a[index++]=prime[i];
            n/=prime[i];
        }
        if(n==1) break;
    }
    if(n!=1)
    {
        a[index++]=n;//這一步的意思是。如果遍歷到了1e7的素數,n還沒有變為1,那么剩下的n一定是一個素數。(前提,n<1e12)
    }
    for(i=0;i<index;i++)
    {
        if(i) printf(" ");
        printf("%d",a[i]);
    }
    printf("\n");
    return 0;
}

  應用1:

計算因子有多少個。設f(x)表示x的因子數,則f(a)=(1+x1)*(1+x2)*(1+x3)......(1+xn),將上代碼改造一下,就可以求得f(a).

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM