PrimeSieve.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:2k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2.  Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3.  This file is a part of the Granados SSH Client Library that is subject to
  4.  the license included in the distributed package.
  5.  You may not use this file except in compliance with the license.
  6.   I implemented this algorithm with reference to following products though the algorithm is known publicly.
  7.     * MindTerm ( AppGate Network Security )
  8.  $Id: PrimeSieve.cs,v 1.2 2005/04/20 08:58:56 okajima Exp $
  9. */
  10. using System;
  11. namespace Granados.PKI
  12. {
  13. public class PrimeSieve {
  14. public readonly static byte[] bitCounts = {
  15. 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,
  16. 2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,
  17. 2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,
  18. 4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,
  19. 2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,
  20. 4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,
  21. 4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,
  22. 6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
  23. };
  24. private uint[] table;
  25. public PrimeSieve(int x) {
  26. if(x < 4)
  27. x = 4;
  28. int len = (x - 3) / (32 * 2);
  29. table = new uint[len];
  30. int max   = len * 32;
  31. int stop = (int)Math.Sqrt((double)max) + 1;
  32. for(int i = 0; i < stop ; i++) {
  33. if((table[i / 32] & (1 << (i & (32 - 1)))) == 0) {
  34. int k = 3 + i * 2;
  35. for (int j = i + k; j < max; j += k) {
  36. table[j / 32] |= ((uint)1 << (j & (32 - 1)));
  37. }
  38. }
  39. }
  40. }
  41. public uint AvailablePrimes() {
  42. uint i, bits, w, primes;
  43. for(i = 0, primes = 2; i < table.Length; i++) {
  44. w = table[i];
  45. for(bits = 0; w != 0; w >>= 8)
  46. bits += (uint)bitCounts[w & 0xff];
  47. primes += (32 - bits);
  48. }
  49. return primes;
  50. }
  51. public int getNextPrime(int x) {
  52. int p = ((x - 3) / 2) + 1;
  53. switch (x) {
  54. /* Trivial cases. */
  55. case 0:
  56. return 2;
  57. case 1:
  58. return 2;
  59. case 2:
  60. return 3;
  61. /* Cases above 2 are handled with the table. */
  62. default:
  63. while(true) {
  64. if((p / 32) >= table.Length)
  65. return 0;
  66. if((table[p / 32] & (1 << (p & (32 - 1)))) == 0)
  67. return p * 2 + 3;
  68. p++;
  69. }
  70. }
  71. }
  72. }
  73. }