数论初步——Eratosthenes筛法

本文介绍了如何使用Eratosthenes筛法计算无平方因子数,并提供了具体算法及实现代码。通过筛选去除区间内特定形式的数,最终确定无平方因子数的数量。

无平方因子的数
给出正整数 n n m m ,区间 [nm] [ n , m ] 内的“无平方因子”的数有多少个?
整数 p p 无平方因子,当且仅当不存在 k>1 k > 1 ,使得 p 是 k2 k 2 的倍数。(1 <= n <= m <= 1012 10 12 ,m - n <= 107 10 7 )。
分析:
首先先介绍一下用Eratosthenes筛法构造1 ~ n的素数表。
思想:

对于不超过 n 的每个非负整数 p,删除2p,3p,4p,…..,当处理完所有的数之后,还没有被删除的数就是素数。

实现代码:

int m = sqrt(n + 0.5);
memset(vis,0,sizeof(vis));
for(int i = 2; i <= m; i++) if(!vis[i])
    for(int j = i*i; j <= n; j+=i) vis[j] = true;

这里给出一个有意思的问题:
给定n,c的值是多少???换句话说,不超过n的整数中,有多少的素数呢?

素数定理: π π ( x x )~ xlnx x l n x

最后,我们如何求出区间内无平方因子的个数呢?方法和筛素数类似,对于不超过 m m 的所有素数p,筛掉区间[n,m]内 p2 p 2 的所有倍数。

实现代码:


int r = sqrt(m + 0.5);
memset(vis,0,sizeof(vis));
for(int i = n; i <= r; i++) if(!vis[i])
    for(int j = i*i; j <= m; j+=i*i) vis[j] = true;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值