算術基本定理(唯一分解定理)
阿新 • • 發佈:2019-01-07
算術基本定理
算術基本定理:
每個大於1的正整數N都可以表示成素數之積的形式 :
N=p1^a1*p2^a2*p3^a3...(pi代表素數,ai代表指數)
d(n)是n的正因子的個數:
d(n)=(a1+1)*(a2+1)*(a3+1)…
Sum(n)是n的所有因子之和:
Sum(n)=(1+p1+p1^2+…+p1^a1)*(1+p2+p2^2+……+p2^a2)*….
公式與推論都很容易理解,關鍵點在於如何分解;
兩種分解方法:
#include<bits/stdc++.h> #define MAXN 1e5 int N; bool isprime[MAXN]; int prime[MAXN];//1-N中的素數 int cnt=0;//記錄1-N中素數的個數 struct node { int p; int num; node() {p=0;num=0;} } a[MAXN]; int m=0;//素陣列元素個數 void init() //尋找1-N中的所有素數(埃氏篩) { memset(isprime,true,sizeof isprime); for(int i=2;i<=N;i++) { if(isprime[i]) { prime[cnt++]=i; for(int j=2;i*j<=N;j++) isprime[i*j]=false; } } } void solve(int N) //算術基本定理分解N { m=0; for(int i=0;i<cnt;i++) { if(N%prime[i]==0) { while(N%prime[i]==0) { a[m].p=prime[i]; a[m].num++; N/=prime[i]; } m++; } } }
當然還有更簡單的分解方法:(只求出素數底數)wei
void solve(int n)
{
m=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
f[m++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1)
f[m++]=n;
}
唯一分解定理是真的重要啊...orz
多做題,多去用,沒有最理解,只有更理解。