唯一分解定理

转自:https://blog.csdn.net/zw1996/article/details/50966032
算数基本定理 1.概念;任意一个大于0的正整数都能被表示成若干个素数的乘积且表示方法是唯一的;整理可以将相同素数的合并;可以得到公式————n = P1^a1 * P2^a2 * …………* (P1 < P2 < ……Pn);2.将唯一分解定理代码化;第一步;素数打表;以前我们素数打表都是枚举暴力进行筛选;但这种算法效果不太好,因此我们用一种更好的素数打表;先看代码;vis[100000] = {0},prime[100000]={0};for(i = 2; i <=n; i++){ if(vis[i] == 0){ prime[len] = i; len++; for(j = ii; j <= n; j+= i){ vis[j] = 1; } } }是不是很很蒙的感觉;刚开始我也是这样的。让我来解释一下吧;2;是素数,则22, 24,28,………直到22……这些都不是素数,3;是素数,则33, 36,39,…………直到3*……这些都不是素数,5;是素数,则55, 510,515,………直到5……这些都不是素数,这个规律就是上面那种筛选法的思路;1先将数组vis【】都初始化为0;也就是最初将所有数假定义为素数2进行上面所说的筛选;将已经确定不是素数的数的数组定义为1;3则可以确定了 0 为素数 ; 1 为 合数;4 prime[len] = i;这个代码的作用就是标记素数位置的;现在是不是懂了很多; 再考虑的就是怎么往定义上去靠;再就是求幂;还是先看代码吧;voidgetprimefactor(long long nn)//计算幂次方;{ int cas=0; for(inti=0;i<len&&prime[i]*prime[i]<=nn;i++) { while(nn%prime[i]==0)//可以整除; { factor[cas]++; nn/=prime[i]; } if(factor[cas] != 0)//就是进入了while里面的; cas++; }if(nn>1) factor[cas]=1; //就是因为上面for条件的原因;prime[i]prime[i]<=nn当不满足这个条件的时候就应该还有一个素数的一次方}就是利用取余和整除循环来求解;就这样;唯一分解定理也就被我们分解了;只需做题来消化了;关于唯一分解定理的一些拓展;1;整数a能被11整除的充要条件;—————a的奇数为数字之和与偶数位数字之和的差能被11整除2;n = P1^a1 * P2^a2 * ………… (P1 < P2 < ……Pn)叫做标准分解式;Gcd = 素数里面取较小的那个累乘;Lcm =素数里面取较小的那个累乘;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值