Back to Discover
Spark

试除法的大数困境:为什么几十位数就试不动了

试除法判断素数的最坏步数约为 √n;n 有 d 位时,这约等于 10^(d/2) 次候选除法,所以位数线性增加、工作量却指数爆炸——30 位还能勉强算,60 位就超过宇宙年龄。

Before you enter

A complete interactive classroom, not just a preview.

Start when you are ready to enter this Stage's 4 scenes and explore, respond, and learn as you go.

4
Scenes
8 min
Estimated
Content language: zh-CN
Start this Stage
Sign-in may be required to play
What happens inside
  1. 01一个 60 位数,试除法要多久?slide
    Slot 1Hook

    从一个违反直觉的估算开始:简单朴素的试除法,判断大素数时竟然需要宇宙年龄量级的时间。

    • 试除法是判断素数最直觉的方法
    • 判断一个 60 位数最坏要检查约 10^30 个候选因子
    • 即使每秒查一万亿个,也要超过宇宙年龄
    Phenomenon

    判断一个 60 位数字是否素数,朴素试除需要检查约 10^30 个候选因子;即使每秒检查一万亿个,也要超过宇宙年龄。

    Question

    为什么这样简单的算法,遇到大数会突然失效?

  2. 02直觉:多一位数,只是多试几个数?slide
    Slot 2Tension

    让学习者预测 30 位到 60 位的工作量差距,并点破常见的“线性”直觉。

    • n 增加一位,n 本身乘 10
    • 很多人会以为工作量只增加 2~10 倍
    • 实际增加的是 10 的 15 次方倍
    Prediction

    如果从 30 位跳到 60 位,你可能会猜试除次数增加 2 倍或 10 倍左右。

    Tempting intuition

    位数多一倍,查的数也只多一倍?

  3. 03拖动位数,看试除步数暴涨interactive
    Slot 3Reveal

    用滑块改变 n 的位数,观察最坏需要的候选因子数和同一台机器上的估算时间。

    • 位数增加 10 位,试除次数约增加 10^5 倍
    • 30 位约 10^15 次,60 位约 10^30 次
    • 时间从 17 分钟冲到 300 亿年
    Evidence

    滑块显示:d=30 时约 10^15 次,d=60 时约 10^30 次;同一台每秒 10^12 次的机器从 17 分钟变成超过宇宙年龄。

    Conclusion

    造成“慢”的不是单次除法的速度,而是候选因子数量随位数指数膨胀。

    Mechanism
    1. 1试除法的退出条件是检查完所有 ≤√n 的候选因子
    2. 2n 有 d 位时 n≈10^d,所以 √n≈10^(d/2),候选因子数也按 10^(d/2) 增长
    3. 3因此 d 每增加 10,步数乘 10^5;从 60 位开始完全不可行
  4. 04遇到大数,换一条路slide
    Slot 4Takeaway

    把结论迁移到真实场景:现代素性检验为什么不用试除。

    • 位数为 d 的 n,试除最坏需要约 10^(d/2) 次
    • 几十位以上时,朴素试除不可能完成
    • 现代算法用随机与数论结构绕过指数爆炸
    Transfer

    当你要判断一个 100 位的 RSA 素数时,不要写从 2 到 √n 的循环;改用 Miller–Rabin 这类概率素性检验。

    Expected inference

    用一小批随机底数的模幂测试,能在毫秒级给出“几乎确定”的答案,而不是靠 10^50 次试除。

Discussion

Discussion threads for a Stage aren't available yet.

Where this leads
Explore more

More in Math & Logic

See all