应用:
(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;
}