质因子分解

这篇记录《算法笔记》中质因子分解的相关内容,包括:
1. 质因子分解
2. 求一个正整数N的因子个数
3. 求一个正整数N的所有因子的和
其中2和3都是从1演变而来。


质因子分解:
质因子分解是指将一个正整数N写成一个或多个指数的乘积的形式,例如180=2*2*3*3*5,或者写成180=2^2+3^2+5的形式。

显然最后会归结到若干个不同质数的乘积,故我们可以进行一下步骤来实现对正整数N的质因子的分解:

1 打印质数表(由于1没有质因子,下面都是针对大于1的数来说的)
2 定义结构体,用来保存质因子及其个数:

struct factor{
    int x,cnt; //x为质因子,cnt为x的个数 
}fac[10];

//由于2*3*5*7*11*13*17*19*23*29就已经超过了int的范围,所以fac[]开10个就足够了。

3 对于正整数N,如果它存在[2,N]范围内的质因子,呀么这个质因子全部小于sqrt(N);要不有且仅有一个大于sqrt(N),其余小于sqrt(N)(自己思考)。

故可以有下面这个求质因子的算法:
枚举1-sqrt(n)范围内的所有质因子p,判断p是不是N的因子,
a. 如果p是N的因子,那么进行如下操作:

if(n%prime[i] == 0){
    fac[index].x = prime[i];
    fac[index].cnt = 0;

    while(n%prime[i] == 0){
        fac[index].cnt++;
        n /= prime[i];
    }

    index++;    

如果p不是n的质因子,则直接跳过。
b. 若以上步骤结束后,n仍大于1,则说明有且亲友一个大于sqrt(n)的质因子(可是是N本身)存在,这时需要讲这个质因子加入到fac数组中,并另其个数为1:

if(n != 1){
    fac[index].x = n;
    fac[index].cnt = 1;
    index++;
}

4 由于n==1的情况没有考虑进去,所以需要根据题目的意思对n==1进行特判。

以上,就是质因子分解的步骤。


求一个正整数N的因子个数:

我们知道(好吧,可能是数论中的知识),一个数的非质数因子可以由它的质数因子相乘得到。
所以N的因子个数就是(e1+1)(e2+1)(e3+1)……(ek+1), ei表示某个质因子的个数。

举个例子:

24 = 2*2*2*3

24的质因子如下:

2^0*3^0 = 1
2^0*3^1 = 3
2^1*3^0 = 2
2^1*3^1 = 6
2^2*3^0 = 4
2^2*3^1= 12
2^3*3^0 = 8
2^3*3^1 = 24

共8个因子。

所以从上面的例子可以看出,一个正整数N的因子个数,其实是通过选择这个数的质因子的不同个数组合合成的,所以就有了上面说的那个公式。对于每一项可以理解为:ei出现0次,ei出现1次,ei出现2次,……,ei出现k次。


正整数N的所有质因子之和:

还是上面那个例子,24的所有质因子之和为:

2^0*3^0 + 2^0*3^1 = 2^0 * (3^0+3^1)
2^1*3^0 + 2^1*3^1 = 2^1 * (3^0+3^1)
2^2*3^0 + 2^1*3^1 = 2^2 * (3^0+3^1)
2^3*3^0 + 2^1*3^1 = 2^3 * (3^0+3^1)

再整理一下得到:

(2^0*2^1*2^2*2^3) * (3^0+3^1) = 60

故,得到一般公式为:

(p1^0+p1^1+…+p1^e1) * (p2^0+p2^1+…+p2^e2) * (p3^0+p3^1+…+p3^e3) …… (pk^0+pk^1+…+pk^ek)
等比数列前n项和化简,得到:
((1-p1^(e1+1))/1-p1) * ((1-p2^(e2+1))/1-p2) * ((1-p3^(e3+1))/1-p3)……((1-pk^(ek+1))/1-pk)

(其中pi为n的质因子,ei为质因子pi的个数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值