2 bloom.c -- Bloom filters
3 Copyright (C) 2006 Sebastian Freundt
5 Author: Sebastian Freundt <hroptatyr@sxemacs.org>
7 This file is part of SXEmacs
9 SXEmacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 SXEmacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 /* Synched up with: Not in FSF. */
39 #define BLOOM_USE_PRIMES 0
42 static const uint32_t bloom_primes[] = {
43 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,
44 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
45 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239,
46 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
47 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
48 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467,
49 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569,
50 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643,
51 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
52 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823,
53 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
54 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009,
55 1013, 1019, 1021, 1031, 1033, 1039, 1049,
56 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123,
57 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223,
58 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301,
59 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423,
60 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487,
61 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571,
62 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657,
63 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747,
64 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861,
65 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949,
66 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029,
67 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129,
68 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237,
69 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311,
70 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393,
71 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503,
72 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617,
73 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693,
74 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777,
75 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861,
76 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969,
77 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
78 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191,
79 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301,
80 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373,
81 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491,
82 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571,
83 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671,
84 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767,
85 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863,
86 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947,
87 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057,
88 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157,
89 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259,
90 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363,
91 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481,
92 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583,
93 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673,
94 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789,
95 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909,
96 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993,
97 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087,
98 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197,
99 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309,
100 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419,
101 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507,
102 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639,
103 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711,
104 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821,
105 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897,
106 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043,
107 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133,
108 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247,
109 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329,
110 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427,
111 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563,
112 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673,
113 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779,
114 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869,
115 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971,
116 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069,
117 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207,
118 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309,
119 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457,
120 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541,
121 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621,
122 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723,
123 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853,
124 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949,
125 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087,
126 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191,
127 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291,
128 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419,
129 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537,
130 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641,
131 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731,
132 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831,
133 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941,
134 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043,
135 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161,
136 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277,
137 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377,
138 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463,
139 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587,
140 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689,
141 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791,
142 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887,
143 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009,
144 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103,
145 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181,
146 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273,
147 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357,
148 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463,
150 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597,
151 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667,
152 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771,
153 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867,
154 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973,
155 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071,
156 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161,
157 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261,
158 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353,
159 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467,
160 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551,
161 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681,
162 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783,
163 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863,
164 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941,
165 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041,
166 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119,
167 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239,
168 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323,
169 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413,
170 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497,
171 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577,
172 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653,
173 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757,
174 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853,
175 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953,
176 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033,
177 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127,
178 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219,
179 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327,
180 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421,
181 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523,
182 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633,
183 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711,
184 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799,
185 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901,
186 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999,
187 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087,
188 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221,
189 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341,
190 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431,
191 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537,
192 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627,
193 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717,
194 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779,
195 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869,
196 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957,
197 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083,
198 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173,
199 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269,
200 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331,
201 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427,
202 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527,
203 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629,
204 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727,
205 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791,
206 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889,
207 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991,
208 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087,
209 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189,
210 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301,
211 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417,
212 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493,
213 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619,
214 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699,
215 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16829,
216 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927,
217 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021,
218 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107,
219 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207,
220 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327,
221 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401,
222 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489,
223 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581,
224 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683,
225 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791,
226 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903, 17909,
227 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981,
228 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077,
229 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169,
230 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253,
231 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341,
232 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439,
233 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523,
234 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671,
235 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773,
236 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913,
237 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013, 19031,
238 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141,
239 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237,
240 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373,
241 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429,
242 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489,
243 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583,
244 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717,
245 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813,
246 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919,
247 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997,
248 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, 20101,
249 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173,
250 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287,
251 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369,
252 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479,
253 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, 20563, 20593,
254 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, 20707, 20717,
255 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, 20773, 20789,
256 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, 20903,
257 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, 21001, 21011,
258 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101,
259 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187,
260 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313,
261 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397,
262 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, 21493, 21499,
263 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, 21569, 21577,
264 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, 21661,
265 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, 21757, 21767,
266 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, 21851, 21859,
267 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977,
268 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063,
269 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, 22133,
270 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247, 22259,
271 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349,
272 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453,
273 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, 22549, 22567,
274 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, 22651, 22669,
275 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, 22739, 22741,
276 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859,
277 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963,
278 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, 23041,
279 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, 23117, 23131,
280 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, 23227,
281 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327, 23333,
282 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473,
283 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567,
284 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, 23663,
285 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753,
286 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833,
287 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, 23917,
288 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, 24023,
289 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, 24097, 24103,
290 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, 24179, 24181,
291 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, 24317, 24329,
292 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, 24421,
293 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533,
294 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677,
295 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793,
296 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907,
297 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, 24979, 24989,
298 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, 25111, 25117,
299 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, 25189, 25219,
300 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, 25309,
301 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, 25409, 25411,
302 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, 25523, 25537,
303 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621,
304 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717,
305 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819,
306 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931,
307 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017,
308 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, 26119,
309 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, 26209, 26227,
310 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, 26309, 26317,
311 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, 26407, 26417,
312 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513,
313 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647,
314 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, 26717,
315 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821,
316 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903,
317 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011,
318 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103,
319 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, 27239, 27241,
320 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, 27337, 27361,
321 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, 27457, 27479,
322 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583,
323 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, 27701,
324 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, 27779,
325 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847, 27851,
326 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961,
327 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069,
328 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181,
329 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297,
330 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411,
331 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, 28513, 28517,
332 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, 28597,
333 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, 28657, 28661,
334 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, 28751, 28753,
335 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, 28843, 28859,
336 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, 28961,
337 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077,
338 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179,
339 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287,
340 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387,
341 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, 29473,
342 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, 29581, 29587,
343 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, 29683, 29717,
344 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, 29837,
345 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, 29927, 29947,
346 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, 30071, 30089,
347 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139, 30161,
348 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259,
349 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367,
350 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493,
351 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593,
352 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, 30697, 30703,
353 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, 30809, 30817,
354 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, 30881, 30893,
355 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, 31013, 31019,
356 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, 31123,
357 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193,
358 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271,
359 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387,
360 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517,
361 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627,
362 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727,
363 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, 31847, 31849,
364 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, 31991,
365 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, 32069, 32077,
366 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183,
367 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297,
368 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, 32363,
369 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429, 32441,
370 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537,
371 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621,
372 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749,
373 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839,
374 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, 32941, 32957,
375 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037,
376 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149,
377 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, 33247,
378 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, 33347, 33349,
379 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, 33457, 33461,
380 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, 33563,
381 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619,
382 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739,
383 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811,
384 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923,
385 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039,
386 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, 34171,
387 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, 34267, 34273,
388 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, 34351, 34361,
389 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, 34469, 34471,
390 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, 34543, 34549,
391 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651, 34667,
392 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757,
393 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871,
394 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981,
395 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099,
396 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, 35201,
397 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, 35311, 35317,
398 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, 35407, 35419,
399 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, 35521, 35527,
400 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, 35597, 35603,
401 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, 35771, 35797,
402 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879,
403 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983,
404 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073,
405 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191,
406 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299,
407 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, 36389, 36433,
408 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, 36527,
409 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, 36599, 36607,
410 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, 36697, 36709,
411 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, 36787, 36791,
412 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899,
413 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, 36979,
414 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087,
415 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201,
416 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321,
417 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423,
418 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, 37511, 37517,
419 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, 37579, 37589,
420 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693,
421 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847,
422 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, 37963,
423 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, 38053, 38069,
424 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, 38197,
425 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299,
426 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393,
427 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561,
428 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653,
429 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729,
430 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839,
431 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, 38933,
432 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, 39047,
433 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, 39139, 39157,
434 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, 39229, 39233,
435 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, 39341, 39343,
436 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, 39443,
437 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563,
438 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679,
439 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791,
440 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, 39869,
441 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, 39979, 39983,
442 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, 40093, 40099,
443 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, 40177, 40189,
444 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, 40343,
445 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, 40459, 40471,
446 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, 40543, 40559,
447 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697,
448 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813,
449 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883,
450 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011,
451 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, 41113, 41117,
452 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, 41201,
453 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, 41263, 41269,
454 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, 41389, 41399,
455 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, 41513, 41519,
456 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611,
457 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681, 41687,
458 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813,
459 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911,
460 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999,
461 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089,
462 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, 42193, 42197,
463 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, 42293, 42299,
464 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, 42397,
465 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463,
466 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571,
467 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, 42689,
468 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751, 42767,
469 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859,
470 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967,
471 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067,
472 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207,
473 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, 43321, 43331,
474 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481,
475 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597,
476 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, 43691,
477 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, 43787, 43789,
478 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, 43943, 43951,
479 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021, 44027,
480 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119,
481 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207,
482 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293,
483 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483,
484 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549,
485 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, 44651,
486 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, 44753, 44771,
487 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, 44851, 44867,
488 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, 44963,
489 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, 45083, 45119,
490 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191, 45197,
491 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319,
492 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427,
493 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553,
494 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667,
495 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, 45763, 45767,
496 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, 45869,
497 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, 45989, 46021,
498 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, 46103, 46133,
499 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, 46219, 46229,
500 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, 46337,
501 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457,
502 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567,
503 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46663,
504 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, 46757,
505 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861,
506 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, 46997, 47017,
507 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, 47123, 47129,
508 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, 47251,
509 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, 47339, 47351,
510 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441,
511 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543,
512 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, 47653,
513 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741,
514 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, 47837, 47843,
515 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, 47947, 47951,
516 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079,
517 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, 48187, 48193,
518 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, 48311, 48313,
519 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437,
520 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527,
521 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, 48623,
522 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, 48751, 48757,
523 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821, 48823,
524 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953,
525 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, 49037, 49043,
526 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, 49139, 49157,
527 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253,
528 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367,
529 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459,
530 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, 49549,
531 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, 49667, 49669,
532 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, 49787,
533 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, 49871, 49877,
534 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991, 49993,
535 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087,
536 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159,
537 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291,
538 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387,
539 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, 50527,
540 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, 50627,
541 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, 50767, 50773,
542 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, 50873, 50891,
543 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, 50989, 50993,
544 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, 51133,
545 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217, 51229,
546 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343,
547 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431,
548 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511,
549 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607,
550 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, 51691, 51713,
551 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, 51817, 51827,
552 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, 51913,
553 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, 52021, 52027,
554 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, 52147, 52153,
555 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253,
556 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369,
557 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517,
558 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609,
559 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721,
560 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837,
561 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, 52937, 52951,
562 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, 53047, 53051,
563 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, 53129, 53147,
564 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239,
565 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359,
566 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, 53479,
567 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597, 53609,
568 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693,
569 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813,
570 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899,
571 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011,
572 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, 54133, 54139,
573 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, 54277, 54287,
574 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377,
575 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, 54469,
576 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, 54559,
577 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, 54631, 54647,
578 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767, 54773,
579 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907,
580 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009,
581 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117,
582 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229,
583 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, 55339, 55343,
584 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, 55487,
585 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, 55609, 55619,
586 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, 55681, 55691,
587 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, 55799, 55807,
588 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, 55889,
589 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967, 55987,
590 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099,
591 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207,
592 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333,
593 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443,
594 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, 56509, 56519,
595 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, 56611, 56629,
596 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, 56731,
597 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, 56813, 56821,
598 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, 56911, 56921,
599 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, 56993, 56999,
600 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119,
601 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203,
602 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301,
603 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413,
604 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559,
605 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, 57667, 57679,
606 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, 57751, 57773,
607 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, 57847, 57853,
608 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, 57973, 57977,
609 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, 58067, 58073,
610 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189,
611 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, 58271,
612 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393,
613 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481,
614 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613,
615 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733,
616 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, 58901,
617 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, 58979, 58991,
618 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069,
619 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, 59149, 59159,
620 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, 59243,
621 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, 59369, 59377,
622 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447, 59453,
623 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567,
624 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669,
625 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771,
626 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929,
627 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041,
628 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139,
629 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, 60259,
630 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, 60373, 60383,
631 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, 60509, 60521,
632 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, 60637,
633 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727, 60733,
634 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859,
635 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937,
636 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057,
637 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223,
638 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, 61343,
639 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, 61463, 61469,
640 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, 61547, 61553,
641 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, 61637, 61643,
642 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, 61723, 61729,
643 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, 61871, 61879,
644 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, 61991,
645 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099,
646 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201,
647 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323,
648 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473,
649 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, 62563, 62581,
650 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, 62659, 62683,
651 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, 62791, 62801,
652 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, 62927,
653 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, 63029, 63031,
654 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149,
655 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311,
656 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389,
657 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473,
658 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587,
659 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659,
660 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, 63737,
661 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, 63823, 63839,
662 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, 63949, 63977,
663 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091,
664 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223,
665 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, 64333,
666 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, 64483, 64489,
667 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613,
668 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717,
669 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871,
670 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969,
671 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, 65071, 65089,
672 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171,
673 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287,
674 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, 65407,
675 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, 65519, 65521,
676 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, 65587, 65599,
677 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, 65687, 65699,
678 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, 65777, 65789,
679 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, 65881, 65899,
680 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, 65993, 66029,
681 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, 66107, 66109,
682 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, 66271, 66293,
683 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, 66383, 66403,
684 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, 66509, 66523,
685 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, 66601, 66617,
686 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, 66733, 66739,
687 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, 66851, 66853,
688 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, 66947, 66949,
689 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, 67057, 67061,
690 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, 67157, 67169,
691 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, 67247, 67261,
692 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, 67391, 67399,
693 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, 67477, 67481,
694 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, 67559, 67567,
695 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, 67679, 67699,
696 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, 67777, 67783,
697 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, 67883, 67891,
698 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, 67967, 67979,
699 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, 68099, 68111,
700 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, 68219, 68227,
701 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, 68389, 68399,
702 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, 68491, 68501,
703 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, 68611, 68633,
704 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, 68729, 68737,
705 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, 68821, 68863,
706 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, 68927, 68947,
707 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, 69067, 69073,
708 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, 69193, 69197,
709 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, 69313, 69317,
710 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, 69427, 69431,
711 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, 69497, 69499,
712 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, 69697, 69709,
713 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, 69827, 69829,
714 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, 69931, 69941,
715 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, 70051, 70061,
716 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, 70141, 70157,
717 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, 70229, 70237,
718 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, 70327, 70351,
719 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, 70457, 70459,
720 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, 70571, 70573,
721 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, 70663, 70667,
722 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, 70823, 70841,
723 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, 70913, 70919,
724 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, 70991, 70997,
725 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, 71119, 71129,
726 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, 71233, 71237,
727 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, 71329, 71333,
728 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, 71399, 71411,
729 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, 71479, 71483,
730 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, 71597, 71633,
731 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, 71719, 71741,
732 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, 71849, 71861,
733 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, 71941, 71947,
734 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, 72043, 72047,
735 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, 72139, 72161,
736 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, 72251, 72253,
737 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, 72353, 72367,
738 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, 72493, 72497,
739 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, 72623, 72643,
740 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, 72707, 72719,
741 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, 72859, 72869,
742 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, 72931, 72937,
743 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, 73019, 73037,
744 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, 73133, 73141,
745 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, 73309, 73327,
746 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, 73421, 73433,
747 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, 73547, 73553,
748 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, 73637, 73643,
749 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, 73727, 73751,
750 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, 73867, 73877,
751 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, 73999, 74017,
752 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, 74101, 74131,
753 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, 74201, 74203,
754 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, 74311, 74317,
755 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, 74413, 74419,
756 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, 74527, 74531,
757 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, 74623, 74653,
758 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, 74747, 74759,
759 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, 74857, 74861,
760 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, 74933, 74941,
761 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, 75083, 75109,
762 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, 75211, 75217,
763 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, 75323, 75329,
764 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, 75403, 75407,
765 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, 75539, 75541,
766 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, 75629, 75641,
767 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, 75721, 75731,
768 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, 75833, 75853,
769 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, 75983, 75989,
770 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, 76091, 76099,
771 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, 76213, 76231,
772 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, 76333, 76343,
773 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, 76463, 76471,
774 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, 76543, 76561,
775 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, 76673, 76679,
776 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, 76801, 76819,
777 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, 76913, 76919,
778 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, 77029, 77041,
779 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, 77167, 77171,
780 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, 77263, 77267,
781 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, 77359, 77369,
782 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, 77479, 77489,
783 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, 77557, 77563,
784 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, 77647, 77659,
785 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, 77731, 77743,
786 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, 77849, 77863,
787 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, 77983, 77999,
788 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, 78121, 78137,
789 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, 78203, 78229,
790 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, 78317, 78341,
791 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, 78487, 78497,
792 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, 78577, 78583,
793 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, 78707, 78713,
794 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, 78809, 78823,
795 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, 78919, 78929,
796 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, 79087, 79103,
797 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, 79187, 79193,
798 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, 79301, 79309,
799 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, 79397, 79399,
800 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, 79537, 79549,
801 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, 79627, 79631,
802 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, 79757, 79769,
803 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, 79843, 79847,
804 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, 79943, 79967,
805 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, 80071, 80077,
806 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, 80177, 80191,
807 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, 80273, 80279,
808 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, 80387, 80407,
809 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, 80527, 80537,
810 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, 80651, 80657,
811 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, 80737, 80747,
812 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, 80819, 80831,
813 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, 80929, 80933,
814 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, 81031, 81041,
815 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, 81119, 81131,
816 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, 81233, 81239,
817 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, 81353, 81359,
818 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, 81509, 81517,
819 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, 81611, 81619,
820 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, 81701, 81703,
821 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, 81817, 81839,
822 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, 81931, 81937,
823 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, 82013, 82021,
824 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, 82141, 82153,
825 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, 82223, 82231,
826 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, 82349, 82351,
827 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, 82471, 82483,
828 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, 82561, 82567,
829 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, 82657, 82699,
830 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, 82787, 82793,
831 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, 82903, 82913,
832 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, 83059, 83063,
833 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, 83203, 83207,
834 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, 83269, 83273,
835 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, 83401, 83407,
836 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, 83477, 83497,
837 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, 83617, 83621,
838 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, 83737, 83761,
839 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, 83873, 83891,
840 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, 84011, 84017,
841 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, 84131, 84137,
842 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, 84223, 84229,
843 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, 84347, 84349,
844 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, 84443, 84449,
845 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, 84523, 84533,
846 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, 84673, 84691,
847 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, 84787, 84793,
848 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, 84919, 84947,
849 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, 85037, 85049,
850 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, 85133, 85147,
851 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, 85243, 85247,
852 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, 85369, 85381,
853 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, 85487, 85513,
854 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, 85607, 85619,
855 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, 85703, 85711,
856 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, 85831, 85837,
857 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, 85991, 85999
859 /* should be 8352 primes */
860 #define BLOOM_MAX_DEGREE 8352
865 mark_bloom(Lisp_Object obj)
873 print_bloom(Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
875 write_fmt_string(printcharfun,
876 "#<bloom-filter :order %u :degree %u :size %u>",
877 XBLOOM_ORDER(obj), XBLOOM_DEGREE(obj), XBLOOM_SIZE(obj));
882 finalise_bloom(void *header, int UNUSED(for_disksave))
884 Lisp_Bloom *free_me = header;
886 xfree(bloom_vector(free_me));
887 xfree(bloom_scratch(free_me));
891 static const struct lrecord_description bloom_description[] = {
892 {XD_OPAQUE_PTR, offsetof(Lisp_Bloom, vector)},
893 {XD_INT, offsetof(Lisp_Bloom, order)},
894 {XD_INT, offsetof(Lisp_Bloom, degree)},
895 {XD_INT, offsetof(Lisp_Bloom, size)},
896 {XD_OPAQUE_PTR, offsetof(Lisp_Bloom, scratch)},
900 DEFINE_LRECORD_IMPLEMENTATION("bloom", bloom,
901 mark_bloom, print_bloom, finalise_bloom,
910 alloc_lcrecord_type(Lisp_Bloom, &lrecord_bloom);
915 make_bloom_uninitted(uint32_t order, uint32_t degree)
917 Lisp_Bloom *bf = allocate_bloom();
918 #if !BLOOM_USE_PRIMES
919 /* we must use a 2-power */
920 order = 1 << (1 + __ase_flsl(order - 1));
923 bloom_order(bf) = order;
924 bloom_degree(bf) = degree;
925 bloom_vector(bf) = xmalloc_atomic(order*sizeof(BLOOM_DEPTH_TYPE));
926 bloom_scratch(bf) = xmalloc_atomic(degree*sizeof(uint32_t));
931 Lisp_Object make_bloom(uint32_t order, uint32_t degree)
933 Lisp_Bloom *bf = make_bloom_uninitted(order, degree);
937 memset(bloom_vector(bf), 0, bloom_order(bf) * sizeof(BLOOM_DEPTH_TYPE));
939 XSETBLOOM(result, bf);
943 Lisp_Object make_bloom_universe(uint32_t order, uint32_t degree)
945 Lisp_Bloom *bf = make_bloom_uninitted(order, degree);
949 bloom_size(bf) = (BLOOM_DEPTH_TYPE)(-1 >> 1);
951 for (i = 0; i < bloom_order(bf); i++) {
952 bloom_vector(bf)[i] = (BLOOM_DEPTH_TYPE)(-1 >> 1);
955 XSETBLOOM(result, bf);
960 DEFUN("make-bloom", Fmake_bloom, 0, 2, 0, /*
961 Return an empty bloom-filter.
963 Optional argument ORDER (a positive integer) specifies the
964 ``length'' of the internal filter vector, defaults to 1024.
966 Optional argument DEGREE (a positive integer) specifies the
967 number of hash slices, defaults to 8.
971 uint32_t o = 1024, d = 8;
978 CHECK_NATNUM(degree);
983 if (d > BLOOM_MAX_DEGREE)
984 d = BLOOM_MAX_DEGREE;
987 return make_bloom(o, d);
990 DEFUN("make-bloom-universe", Fmake_bloom_universe, 0, 2, 0, /*
991 Return a complete bloom-filter.
993 Optional argument ORDER (a positive integer) specifies the
994 ``length'' of the internal filter vector, defaults to 1024.
996 Optional argument DEGREE (a positive integer) specifies the
997 number of hash slices, defaults to 8.
1001 uint32_t o = 1024, d = 8;
1004 CHECK_NATNUM(order);
1007 if (!NILP(degree)) {
1008 CHECK_NATNUM(degree);
1012 #if BLOOM_USE_PRIMES
1013 if (d > BLOOM_MAX_DEGREE)
1014 d = BLOOM_MAX_DEGREE;
1017 return make_bloom_universe(o, d);
1021 DEFUN("bloomp", Fbloomp, 1, 1, 0, /*
1022 Return non-nil if OBJECT is a bloom filter.
1032 /* modifiers and accessors */
1034 bloom_hash(Lisp_Bloom *bloom, Lisp_Object element)
1036 unsigned long elhash = internal_hash(element, 0);
1037 uint32_t *result = bloom_scratch(bloom);
1039 #if BLOOM_USE_PRIMES
1042 /* now pass elhash to DEGREE hash function moduli */
1043 j = BLOOM_MAX_DEGREE;
1044 if (j < BLOOM_MAX_DEGREE/2)
1045 j = BLOOM_MAX_DEGREE;
1046 for (i = 0; i < bloom_degree(bloom); i++) {
1047 result[i] = (elhash % bloom_primes[j]) % bloom_order(bloom);
1051 unsigned long tmphash = elhash;
1053 for (i = 0; i < bloom_degree(bloom); i++) {
1054 result[i] = (tmphash & (bloom_order(bloom) - 1));
1055 tmphash ^= elhash << 3;
1056 tmphash += tmphash >> 5;
1057 tmphash ^= tmphash << 4;
1058 tmphash += elhash >> 17;
1059 tmphash ^= tmphash << 25;
1060 tmphash += tmphash >> 6;
1067 int bloom_owns_p(Lisp_Bloom *bloom, Lisp_Object element)
1069 /* retrieve the index positions */
1070 uint32_t *ind = bloom_hash(bloom, element);
1071 bloom_vector vec = bloom_vector(bloom);
1074 for (i = 0; i < bloom_degree(bloom); i++) {
1075 if (vec[ind[i]] == 0)
1081 DEFUN("bloom-owns-p", Fbloom_owns_p, 2, 2, 0, /*
1082 Return non-nil if ELEMENT is in the bloom-filter BLOOM.
1088 if (bloom_owns_p(XBLOOM(bloom), element))
1094 void bloom_add(Lisp_Bloom *bloom, Lisp_Object element)
1096 /* retrieve the index positions */
1097 uint32_t *ind = bloom_hash(bloom, element);
1098 bloom_vector vec = bloom_vector(bloom);
1101 for (i = 0; i < bloom_degree(bloom); i++)
1104 bloom_size(bloom)++;
1106 DEFUN("bloom-add", Fbloom_add, 2, 2, 0, /*
1107 Add ELEMENT to the bloom-filter BLOOM.
1113 bloom_add(XBLOOM(bloom), element);
1118 void bloom_remove(Lisp_Bloom *bloom, Lisp_Object element)
1120 /* retrieve the index positions */
1121 uint32_t *ind = bloom_hash(bloom, element);
1122 bloom_vector vec = bloom_vector(bloom);
1125 /* perform an owns-p to not mangle the bf-vector */
1126 for (i = 0; i < bloom_degree(bloom); i++)
1127 if (vec[ind[i]] == 0)
1130 for (i = 0; i < bloom_degree(bloom); i++)
1133 bloom_size(bloom)--;
1135 DEFUN("bloom-remove", Fbloom_remove, 2, 2, 0, /*
1136 Remove ELEMENT from the bloom-filter BLOOM.
1142 bloom_remove(XBLOOM(bloom), element);
1148 void bloom_union(Lisp_Bloom *bloom1, Lisp_Bloom *bloom2)
1150 /* unite bloom1 and bloom2 into bloom1 */
1151 bloom_vector vec1 = bloom_vector(bloom1);
1152 bloom_vector vec2 = bloom_vector(bloom2);
1155 bloom_size(bloom1) += bloom_size(bloom2);
1157 for (i = 0; i < bloom_order(bloom1); i++)
1160 DEFUN("bloom-union", Fbloom_union, 0, MANY, 0, /*
1161 Return the union Bloom filter of all arguments.
1163 (int nargs, Lisp_Object *args))
1170 for (i = 0; i < nargs; i++)
1171 CHECK_BLOOM(args[i]);
1174 return Fmake_bloom(Qnil, Qnil);
1176 ord = XBLOOM_ORDER(args[0]);
1177 deg = XBLOOM_DEGREE(args[0]);
1180 /* perform left-associative binary union */
1181 result = make_bloom(ord, deg);
1182 for (i = 0; i < nargs; i++) {
1183 if (XBLOOM_ORDER(args[i]) != ord ||
1184 XBLOOM_DEGREE(args[i]) != deg)
1185 error("all bloom filters must "
1186 "have equal size and degree");
1188 bloom_union(XBLOOM(result), XBLOOM(args[i]));
1194 void bloom_intersection(Lisp_Bloom *bloom1, Lisp_Bloom *bloom2)
1196 /* intersect bloom1 and bloom2 into bloom1 */
1197 bloom_vector vec1 = bloom_vector(bloom1);
1198 bloom_vector vec2 = bloom_vector(bloom2);
1199 uint32_t i, min = -1;
1201 for (i = 0; i < bloom_order(bloom1); i++) {
1202 if (vec1[i] == 0 || vec2[i] == 0) {
1204 bloom_size(bloom1)--;
1205 } else if (vec1[i] > vec2[i]) {
1208 if (min > vec1[i] && vec1[i] > 0)
1210 else if (min > vec2[i] && vec2[i] > 0)
1214 /* rough estimation */
1216 bloom_size(bloom1) = 0;
1218 bloom_size(bloom1) = min;
1220 DEFUN("bloom-intersection", Fbloom_intersection, 0, MANY, 0, /*
1221 Return the intersection Bloom filter of all arguments.
1223 (int nargs, Lisp_Object *args))
1226 uint32_t i, ord, deg;
1229 for (i = 0; i < (uint32_t)nargs; i++)
1230 CHECK_BLOOM(args[i]);
1233 return Fmake_bloom(Qnil, Qnil);
1235 ord = XBLOOM_ORDER(args[0]);
1236 deg = XBLOOM_DEGREE(args[0]);
1239 /* perform left-associative binary intersection */
1240 result = make_bloom_universe(ord, deg);
1241 for (i = 0; i < (uint32_t)nargs; i++) {
1242 if (XBLOOM_ORDER(args[i]) != ord ||
1243 XBLOOM_DEGREE(args[i]) != deg)
1244 error("all bloom filters must "
1245 "have equal size and degree");
1247 bloom_intersection(XBLOOM(result), XBLOOM(args[i]));
1255 DEFUN("bloom-order", Fbloom_order, 1, 1, 0, /*
1256 Return the order of the bloom-filter BLOOM.
1261 return make_int(XBLOOM_ORDER(bloom));
1264 DEFUN("bloom-degree", Fbloom_degree, 1, 1, 0, /*
1265 Return the degree of the bloom-filter BLOOM.
1270 return make_int(XBLOOM_DEGREE(bloom));
1273 DEFUN("bloom-size", Fbloom_size, 1, 1, 0, /*
1274 Return the size of the bloom-filter BLOOM, that is the number
1280 return make_int(XBLOOM_SIZE(bloom));
1285 * Initialisation stuff
1287 void syms_of_bloom(void)
1289 INIT_LRECORD_IMPLEMENTATION(bloom);
1291 defsymbol(&Qbloomp, "bloomp");
1293 DEFSUBR(Fmake_bloom);
1294 DEFSUBR(Fmake_bloom_universe);
1298 DEFSUBR(Fbloom_add);
1299 DEFSUBR(Fbloom_remove);
1300 DEFSUBR(Fbloom_owns_p);
1302 DEFSUBR(Fbloom_order);
1303 DEFSUBR(Fbloom_degree);
1304 DEFSUBR(Fbloom_size);
1306 DEFSUBR(Fbloom_union);
1307 DEFSUBR(Fbloom_intersection);
1310 void vars_of_bloom(void)
1312 Fprovide(intern("bloom"));