唯一分解定理

应用:

(1)一个大于1的正整数N,如果它的标准分解式为:   ,

那么它的正因数个数为  。

(2) 它的全体正因数之和为   

当  时就称N为完全数。 是否存在奇完全数,是一个至今未解决之猜想。

(3) 利用算术基本定理可以重新定义整数a和b的最大公因子  和最小公倍数    , 并证明    。

(4)此外还可证明根号2是无理数等等。

(5)证明素数个数无限。

 

1;概念;任意一个大于0的正整数都能被表示成若干个素数的乘积且表示方法是唯一的;整理可以将相同素数的合并;可以得到

公式————n =P1^a1 * P2^a2 * …………* (P1 < P2 < ……Pn);

2;将唯一分解定理代码化;

第一步;素数打表;

以前我们素数打表都是枚举暴力进行筛选;但这种算法效果不太好,因此我们用一种更好的素数打表;

先看代码;

是不是很很蒙的感觉;刚开始我也是这样的。让我来解释一下吧;

2;是素数,则2*2, 2*4,2*8,………直到2*2……这些都不是素数,

3;是素数,则3*3, 3*6,3*9,…………直到3*……这些都不是素数,

5;是素数,则5*5, 5*10,5*15,………直到5*……这些都不是素数,

这个规律就是上面那种筛选法的思路;

1先将数组vis【】都初始化为0;也就是最初将所有数假定义为素数

2进行上面所说的筛选;将已经确定不是素数的数的数组定义为1;

3则可以确定了 0 为素数 ; 1 为合数;

4prime[len] = i;这个代码的作用就是标记素数位置的;

现在是不是懂了很多;

 

再考虑的就是怎么往定义上去靠;

再就是求幂;

还是先看代码吧;

#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
int factor[100],a[100],prime[100];;
int k=0;
void getprimefactor(int nn)//计算幂次方;
{
    int cas=0;
    for(int i=0; i<k; i++)
    {
        while(nn%prime[i]==0)//可以整除;
        {
            factor[cas]++;
            nn/=prime[i];
        }
        cas++;
    }
    if(nn>1)
        factor[cas]=1;
}
int main()
{
    int n;
    for (int i = 0; i < 100; i++)
        a[i] = i;
    for (int i = 2; i < sqrt(double(100)); i++)
        for (int j = i + 1; j < 100; j++)
            if (a[j] != 0 && a[j] % i == 0)
                a[j] = 0;

    for (int i = 2; i < 100; i++)
        if (a[i] != 0)
            prime[k++]=a[i];
    while(cin>>n)
    {
        memset(factor,0,sizeof(factor));
        getprimefactor(n);
        for(int i=0;i<100;i++)
            cout<<factor[i]<<" ";
        cout<<endl;
    }
    return 0;
}

关于唯一分解定理的一些拓展;

1;整数a能被11整除的充要条件;

—————a的奇数为数字之和与偶数位数字之和的差能被11整除

2;n = P1^a1 * P2^a2 * …………* (P1 < P2 < ……Pn)叫做标准分解式;

Gcd = 素数里面取较小的那个累乘;

Lcm =素数里面取较小的那个累乘;

例如列子1008;1260;882;

1008=2^4 * 3^2 * 7

1260=2^4 * 3^2 *5 * 7

882 =2 *3^2 * 7^2

 

Gcd =2 *3^2 * 7^1 *5^0 ;

Lcm =2^4* 3^2 * 5^1 * 7^2;

 

将一个数分解成若干素数的和

#include <stdio.h>  
#include <stdlib.h>  
typedef unsigned long DWORD;  
  
//函数decomp_integer对n分解素因数,分解后的素数存入facArr数组,并返回因子的个数  
int decomp_integer( DWORD n, DWORD facArr[])  
{  
    DWORD fac;      //n的可能的一个因子  
    int count;  
  
    if (n<4)        //4以内的数,不需要分解  
    {     
        facArr[0]=n; return 1;    
    }  
  
    count=0;  
    //下面的while循环为2试出n,直到2不是n的因子为止  
    while ( (n & 1)==0) // 这里判断偶数用 (n &1)==0,这比(n % 2)==0更快  
    {  
        facArr[count++]=2;  n/=2;  
    }  
  
    fac=3;  //用3到sqrt(n)之间的奇数试除  
    while (fac*fac<=n) // fac*fac <= n  
    {  
        while (n % fac==0)  
        {  
            facArr[count++]=fac;  
            n /= fac;  
        }  
        fac+=2;  
    }  
    if (n==1)  
        return count;  
  
    facArr[count++]=n;  
    return count;  
}  
  
int main(int argc, char* argv[])  
{  
    DWORD n,facArray[32];  
    int i,count;  
  
    printf("Please input unsigned integer:");  
    scanf("%u",&n);  
    count=decomp_integer(n,facArray);  
    printf("%u=%u",n,facArray[0]);  
    for (i=1;i<count;i++)  
        printf("*%d",facArray[i]);  
    printf("\n");  
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值