问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

数学课上用埃氏筛法快速找质数

创作时间:
作者:
@小白创作中心

数学课上用埃氏筛法快速找质数

引用
CSDN
11
来源
1.
https://blog.csdn.net/weixin_45595437/article/details/136113566
2.
https://blog.csdn.net/JackyQWJ/article/details/138680486
3.
https://blog.csdn.net/TWB1018/article/details/138725015
4.
https://blog.csdn.net/ben_shan_/article/details/136753901
5.
https://www.sohu.com/a/822947658_121124211
6.
https://blog.csdn.net/wayua/article/details/140414732
7.
https://www.cnblogs.com/lying7/p/18695506
8.
https://docs.pingcode.com/ask/ask-ask/199827.html
9.
https://leetcode.cn/problems/count-primes/solutions/
10.
https://oi-wiki.org/math/number-theory/min-25/
11.
https://www.goodreads.com/questions/5652047-99367376-pe

在数学课堂上,掌握高效的质数筛选方法是每个学生的必修课。埃拉托色尼选筛法(简称埃氏筛法)是一种古希腊数学家提出的筛选法,它可以帮助我们迅速找到指定范围内的所有质数。这种方法的基本原理是:一个合数总是可以分解成若干个质数的乘积,因此如果把质数的倍数都去掉,剩下的就是质数了。通过这个简单而有效的方法,学生们可以在短时间内准确地识别出质数,提高解题效率。

01

埃氏筛法的原理与步骤

埃氏筛法的核心思想非常直观:从最小的质数2开始,依次筛掉每个质数的倍数。具体步骤如下:

  1. 首先列出所有待筛选的自然数,例如1到100。
  2. 从最小的质数2开始,将2的所有倍数(4、6、8、10……)标记为合数。
  3. 找到下一个未被标记的数(这里是3),将其所有倍数标记为合数。
  4. 重复上述过程,直到遍历完所有数。

以筛选1到11之间的质数为例:

初始数组:1 2 3 4 5 6 7 8 9 10 11

  • 首先去掉1(既不是质数也不是合数)
  • 然后从2开始,将它的所有倍数筛掉:4 6 8 10
  • 接下来是3,筛掉它的倍数:6 9
  • 依此类推,直到遍历完所有数

最终剩余的数(2 3 5 7 11)就是质数。

02

历史背景与发展

埃氏筛法最早由古希腊数学家埃拉托斯特尼提出,他是亚历山大图书馆的馆长,被誉为“测地学之父”。这种方法在公元前240年左右就被记载下来,是人类历史上最早的质数筛选算法之一。

在美索不达米亚文明中,数学算法被广泛应用于城市管理和贸易记录。例如,巴比伦人使用六十进制数系统,能够精确计算地下蓄水池的尺寸,甚至掌握了毕达哥拉斯定理(勾股定理),这比古希腊数学家毕达哥拉斯早了近1000年。

03

与其他质数筛选方法的对比

与其他质数筛选方法相比,埃氏筛法具有以下优势:

  1. 实现简单:只需要一个布尔数组来标记质数和合数
  2. 直观易懂:基于质数倍数的简单筛选逻辑
  3. 效率较高:时间复杂度为O(n log log n),对于较小范围的筛选非常有效

然而,当需要筛选的数范围很大时,埃氏筛法的效率会有所下降。为了解决这个问题,后来发展出了线性筛法(欧拉筛)。线性筛法通过保证每个合数只被其最小的素因子筛除一次,将时间复杂度优化到O(n)。

04

在数学教学中的应用

埃氏筛法在数学教学中具有重要价值:

  1. 帮助学生直观理解质数和合数的概念
  2. 培养逻辑思维和算法设计能力
  3. 为学习更复杂的数论知识奠定基础

在实际教学中,教师可以通过编程实现埃氏筛法,让学生亲自动手实践。例如,使用C++语言实现埃氏筛法:

#include <iostream>
using namespace std;

const int N = 1e6 + 10;
bool st[N]; // 记录数字i是不是质数,true=是,false=不是

int getPrime(int n) {
    int cnt = 0; // 质数总数
    for (int i = 2; i <= n; i++) {
        if (st[i]) continue;
        else {
            cnt++;
            // 用当前质数去筛掉它的倍数
            for (int j = 2; j <= n / i; j++) // 从当前质数的2倍开始,一直到floor(n/i)倍
                st[j * i] = true;
        }
    }
    return cnt;
}

int main() {
    int n;
    cin >> n;
    int res = getPrime(n);
    cout << res << endl;
    return 0;
}

通过这样的实践,学生不仅能加深对质数的理解,还能提升编程能力。

05

总结

埃氏筛法作为最古老的质数筛选算法之一,以其简单直观的原理和较高的效率,在数学教学和实际应用中都具有重要价值。通过学习埃氏筛法,学生不仅能掌握一种实用的数学工具,还能培养逻辑思维能力和算法设计能力,为未来学习更复杂的数学知识奠定坚实基础。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号