素数线性筛法的原理

for(int i = 2; i <= 1000000; ++ i)
	{
		if(!isComp[i])
			pv.push_back(i);
		for(int k = 0; k < pv.size() && i * pv[k] <= 1000000; ++ k)
		{
			isComp[i * pv[k]] = 1;
			if(i % pv[k] == 0)
				break;
		}
		
	}

isComp数组代表该数是否为合数 pv是一个存储素数的vector

这个算法对每个合数有且仅有一次访问,他是基于如下规则的:

该合数在算法中被最小素数p1访问到i * pv[k] 其中pv[k]即为p1

证明:假设有合数C=p1*p2*c1,p1 p2为素数且p1为最小素因数,c1为整数

若该合数会被p2访问到,那么C=p2*(p1*c1)

但是p1*c1即为i能整除p1,算法在此步就break掉,无法再对比p1大的p2进行相乘运算

于是i*pv[k]即为该数的最小素因数分解式

根据此分解式可以得出许多结论,包括在O(logn)时间内得到素因子分解,以及在该算法遍历过程中得到欧拉函数Pi(n) ,在此不一一展开


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值