本程序(uPrimes)的算法是从Julia语言的Primes软件包算法转换过来,能实现1秒内找出0到1亿范围内的所有质数,这是编译为64bit的测试结果, 如果编译为32bit的话稍慢些。
常用的找质数的方法如uPrimesSimple单元所示,方法很简单,但0到1亿范围内找出所有的质数要超过7秒,性能上与前者相比,有7倍差距。
unit uPrimes;
interface
uses SysUtils, Math;
type
TIntArray = array of Int64;
function Primes(Lo, Hi:Int64): TIntArray; overload;
function Primes(N: Int64): TIntArray; overload;
function IsPrime(N: Int64): Boolean;
implementation
const
wheel : array[1..8 ] of Int64 = (4, 2, 4, 2, 4, 6, 2, 6);
wheel_primes : array[1..8 ] of Int64 = (7, 11, 13, 17, 19, 23, 29, 31);
wheel_indices: array[1..31] of Int64 = (0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 2, 2, 3, 3, 3,
3, 4, 4, 5, 5, 5, 5, 6,
6, 6, 6, 6, 6, 7, 7);
bases: array[1..256] of UInt16 =(
15591, 2018, 166, 7429, 8064, 16045, 10503, 4399, 1949, 1295, 2776, 3620,
560, 3128, 5212, 2657, 2300, 2021, 4652, 1471, 9336, 4018, 2398, 20462,
10277, 8028, 2213, 6219, 620, 3763, 4852, 5012, 3185, 1333, 6227, 5298,
1074, 2391, 5113, 7061, 803, 1269, 3875, 422, 751, 580, 4729, 10239,
746, 2951, 556, 2206, 3778, 481, 1522, 3476, 481, 2487, 3266, 5633,
488, 3373, 6441, 3344, 17, 15105, 1490, 4154, 2036, 1882, 1813, 467,
3307, 14042, 6371, 658, 1005, 903, 737, 1887, 7447, 1888, 2848, 1784,
7559, 3400, 951, 13969, 4304, 177, 41, 19875, 3110, 13221, 8726, 571,
7043, 6943, 1199, 352, 6435, 165, 1169, 3315, 978, 233, 3003, 2562,
2994, 10587, 10030, 2377, 1902, 5354, 4447, 1555, 263, 27027, 2283, 305,
669, 1912, 601, 6186, 429, 1930, 14873, 1784, 1661, 524, 3577, 236,
2360, 6146, 2850, 55637, 1753, 4178, 8466, 222, 2579, 2743, 2031, 2226,
2276, 374, 2132, 813, 23788, 1610, 4422, 5159, 1725, 3597, 3366, 14336,
579, 165, 1375, 10018, 12616, 9816, 1371, 536,

本文介绍了从Julia语言移植的uPrimes程序,对比传统方法,它能在1秒内找到指定范围内的质数,且针对32位编译进行了性能优化。通过介绍wheel factorization和sieve of Eratosthenes原理,展示了程序的高性能算法和细节实现。
最低0.47元/天 解锁文章
1222





