[Delphi]快速计算质数序列

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

       本程序(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, 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值