PrimeFinder.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * Copyright (c) 1999 CERN - European Organization for Nuclear Research.
  3. *
  4. * Permission to use, copy, modify, distribute and sell this software
  5. * and its documentation for any purpose is hereby granted without fee,
  6. * provided that the above copyright notice appear in all copies and
  7. * that both that copyright notice and this permission notice appear in
  8. * supporting documentation. CERN makes no representations about the
  9. * suitability of this software for any purpose. It is provided "as is"
  10. * without expressed or implied warranty.
  11. */
  12. package com.l2jserver.util;
  13. import java.util.Arrays;
  14. /**
  15. * <b>Modified for Trove to use the java.util.Arrays sort/search
  16. * algorithms instead of those provided with colt.</b><br>
  17. *
  18. * Used to keep hash table capacities prime numbers.
  19. * Not of interest for users; only for implementors of hashtables.
  20. *
  21. * <p>Choosing prime numbers as hash table capacities is a good idea
  22. * to keep them working fast, particularly under hash table
  23. * expansions.
  24. *
  25. * <p>However, JDK 1.2, JGL 3.1 and many other toolkits do nothing to
  26. * keep capacities prime. This class provides efficient means to
  27. * choose prime capacities.
  28. *
  29. * <p>Choosing a prime is <tt>O(log 300)</tt> (binary search in a list
  30. * of 300 ints). Memory requirements: 1 KB static memory.
  31. *
  32. * @author wolfgang.hoschek@cern.ch
  33. * @version 1.0, 09/24/99
  34. */
  35. public final class PrimeFinder {
  36. /**
  37. * The largest prime this class can generate; currently equal to
  38. * <tt>Integer.MAX_VALUE</tt>.
  39. */
  40. public static final int LARGEST_PRIME = Integer.MAX_VALUE; //yes, it is prime.
  41. /**
  42. * The prime number list consists of 11 chunks.
  43. *
  44. * Each chunk contains prime numbers.
  45. *
  46. * A chunk starts with a prime P1. The next element is a prime
  47. * P2. P2 is the smallest prime for which holds: P2 >= 2*P1.
  48. *
  49. * The next element is P3, for which the same holds with respect
  50. * to P2, and so on.
  51. *
  52. * Chunks are chosen such that for any desired capacity >= 1000
  53. * the list includes a prime number <= desired capacity * 1.11.
  54. *
  55. * Therefore, primes can be retrieved which are quite close to any
  56. * desired capacity, which in turn avoids wasting memory.
  57. *
  58. * For example, the list includes
  59. * 1039,1117,1201,1277,1361,1439,1523,1597,1759,1907,2081.
  60. *
  61. * So if you need a prime >= 1040, you will find a prime <=
  62. * 1040*1.11=1154.
  63. *
  64. * Chunks are chosen such that they are optimized for a hashtable
  65. * growthfactor of 2.0;
  66. *
  67. * If your hashtable has such a growthfactor then, after initially
  68. * "rounding to a prime" upon hashtable construction, it will
  69. * later expand to prime capacities such that there exist no
  70. * better primes.
  71. *
  72. * In total these are about 32*10=320 numbers -> 1 KB of static
  73. * memory needed.
  74. *
  75. * If you are stingy, then delete every second or fourth chunk.
  76. */
  77. private static final int[] PRIME_CAPACITIES = {
  78. //chunk #0
  79. LARGEST_PRIME,
  80. //chunk #1
  81. 5,11,23,47,97,197,397,797,1597,3203,6421,12853,25717,51437,102877,205759,
  82. 411527,823117,1646237,3292489,6584983,13169977,26339969,52679969,105359939,
  83. 210719881,421439783,842879579,1685759167,
  84. //chunk #2
  85. 433,877,1759,3527,7057,14143,28289,56591,113189,226379,452759,905551,1811107,
  86. 3622219,7244441,14488931,28977863,57955739,115911563,231823147,463646329,927292699,
  87. 1854585413,
  88. //chunk #3
  89. 953,1907,3821,7643,15287,30577,61169,122347,244703,489407,978821,1957651,3915341,
  90. 7830701,15661423,31322867,62645741,125291483,250582987,501165979,1002331963,
  91. 2004663929,
  92. //chunk #4
  93. 1039,2081,4177,8363,16729,33461,66923,133853,267713,535481,1070981,2141977,4283963,
  94. 8567929,17135863,34271747,68543509,137087021,274174111,548348231,1096696463,
  95. //chunk #5
  96. 31,67,137,277,557,1117,2237,4481,8963,17929,35863,71741,143483,286973,573953,
  97. 1147921,2295859,4591721,9183457,18366923,36733847,73467739,146935499,293871013,
  98. 587742049,1175484103,
  99. //chunk #6
  100. 599,1201,2411,4831,9677,19373,38747,77509,155027,310081,620171,1240361,2480729,
  101. 4961459,9922933,19845871,39691759,79383533,158767069,317534141,635068283,1270136683,
  102. //chunk #7
  103. 311,631,1277,2557,5119,10243,20507,41017,82037,164089,328213,656429,1312867,
  104. 2625761,5251529,10503061,21006137,42012281,84024581,168049163,336098327,672196673,
  105. 1344393353,
  106. //chunk #8
  107. 3,7,17,37,79,163,331,673,1361,2729,5471,10949,21911,43853,87719,175447,350899,
  108. 701819,1403641,2807303,5614657,11229331,22458671,44917381,89834777,179669557,
  109. 359339171,718678369,1437356741,
  110. //chunk #9
  111. 43,89,179,359,719,1439,2879,5779,11579,23159,46327,92657,185323,370661,741337,
  112. 1482707,2965421,5930887,11861791,23723597,47447201,94894427,189788857,379577741,
  113. 759155483,1518310967,
  114. //chunk #10
  115. 379,761,1523,3049,6101,12203,24407,48817,97649,195311,390647,781301,1562611,
  116. 3125257,6250537,12501169,25002389,50004791,100009607,200019221,400038451,800076929,
  117. 1600153859
  118. };
  119. static { //initializer
  120. // The above prime numbers are formatted for human readability.
  121. // To find numbers fast, we sort them once and for all.
  122. Arrays.sort(PRIME_CAPACITIES);
  123. }
  124. /**
  125. * Returns a prime number which is <code>&gt;= desiredCapacity</code>
  126. * and very close to <code>desiredCapacity</code> (within 11% if
  127. * <code>desiredCapacity &gt;= 1000</code>).
  128. *
  129. * @param desiredCapacity the capacity desired by the user.
  130. * @return the capacity which should be used for a hashtable.
  131. */
  132. public static final int nextPrime(int desiredCapacity) {
  133. int i = Arrays.binarySearch(PRIME_CAPACITIES, desiredCapacity);
  134. if (i<0) {
  135. // desired capacity not found, choose next prime greater
  136. // than desired capacity
  137. i = -i -1; // remember the semantics of binarySearch...
  138. }
  139. return PRIME_CAPACITIES[i];
  140. }
  141. }