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

                                           算术基本定理

算术基本定理:

每个大于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

多做题,多去用,没有最理解,只有更理解。

猜你喜欢

转载自blog.csdn.net/hzaukotete/article/details/81108188