1. 程式人生 > >算術基本定理(唯一分解定理)

算術基本定理(唯一分解定理)

                                           算術基本定理

算術基本定理:

每個大於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

多做題,多去用,沒有最理解,只有更理解。