Project Euler 7
Project Euler 7
题目
\(10001\text{st}\) prime
By listing the first six prime numbers: \(2, 3, 5, 7, 11\), and \(13\), we can see that the \(6\text{th}\) prime is \(13\).
What is the \(10 001\text{st}\) prime number?
解决方案
使用sympy
库中的prime
函数计算即可。筛选素数的常见筛法有线性筛和埃氏筛。
埃氏筛的思想主要是标记所有合数。当遇到一个没有被标记过的数时,就认为它是质数,然后将这个质数的所有倍数全都标记为合数。因此,有一些合数会被它的所有质因数重复标记。
线性筛的思想则是需要维护一个数组\(v\)。这个数组\(v\)的含义是\(v[i]\)是\(i\)的最小的质因数。线性筛比埃氏筛的效率高了一个对数级,因为其中的每个合数都只会被标记一次(被最小的质因数标记)。而数组\(v\),则控制着每个数\(i\)不能利用比\(v[i]\)更大的质因数去重复标记其它合数。
两种筛法都可以用来计算积性函数。
代码
1 | from sympy.ntheory.generate import prime |
埃氏筛:
1 | Q = 10001 |
线性筛:
1 |
|