X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/59600f67b6dd739bb31a2cb23e887adef13c3ac8..edb548cd8283b5e3f680a0a8b641f9afb12d4ba4:/sshprime.c diff --git a/sshprime.c b/sshprime.c index 4a2a660e..03b9c728 100644 --- a/sshprime.c +++ b/sshprime.c @@ -2,9 +2,111 @@ * Prime generation. */ +#include #include "ssh.h" /* + * This prime generation algorithm is pretty much cribbed from + * OpenSSL. The algorithm is: + * + * - invent a B-bit random number and ensure the top and bottom + * bits are set (so it's definitely B-bit, and it's definitely + * odd) + * + * - see if it's coprime to all primes below 2^16; increment it by + * two until it is (this shouldn't take long in general) + * + * - perform the Miller-Rabin primality test enough times to + * ensure the probability of it being composite is 2^-80 or + * less + * + * - go back to square one if any M-R test fails. + */ + +/* + * The Miller-Rabin primality test is an extension to the Fermat + * test. The Fermat test just checks that a^(p-1) == 1 mod p; this + * is vulnerable to Carmichael numbers. Miller-Rabin considers how + * that 1 is derived as well. + * + * Lemma: if a^2 == 1 (mod p), and p is prime, then either a == 1 + * or a == -1 (mod p). + * + * Proof: p divides a^2-1, i.e. p divides (a+1)(a-1). Hence, + * since p is prime, either p divides (a+1) or p divides (a-1). + * But this is the same as saying that either a is congruent to + * -1 mod p or a is congruent to +1 mod p. [] + * + * Comment: This fails when p is not prime. Consider p=mn, so + * that mn divides (a+1)(a-1). Now we could have m dividing (a+1) + * and n dividing (a-1), without the whole of mn dividing either. + * For example, consider a=10 and p=99. 99 = 9 * 11; 9 divides + * 10-1 and 11 divides 10+1, so a^2 is congruent to 1 mod p + * without a having to be congruent to either 1 or -1. + * + * So the Miller-Rabin test, as well as considering a^(p-1), + * considers a^((p-1)/2), a^((p-1)/4), and so on as far as it can + * go. In other words. we write p-1 as q * 2^k, with k as large as + * possible (i.e. q must be odd), and we consider the powers + * + * a^(q*2^0) a^(q*2^1) ... a^(q*2^(k-1)) a^(q*2^k) + * i.e. a^((n-1)/2^k) a^((n-1)/2^(k-1)) ... a^((n-1)/2) a^(n-1) + * + * If p is to be prime, the last of these must be 1. Therefore, by + * the above lemma, the one before it must be either 1 or -1. And + * _if_ it's 1, then the one before that must be either 1 or -1, + * and so on ... In other words, we expect to see a trailing chain + * of 1s preceded by a -1. (If we're unlucky, our trailing chain of + * 1s will be as long as the list so we'll never get to see what + * lies before it. This doesn't count as a test failure because it + * hasn't _proved_ that p is not prime.) + * + * For example, consider a=2 and p=1729. 1729 is a Carmichael + * number: although it's not prime, it satisfies a^(p-1) == 1 mod p + * for any a coprime to it. So the Fermat test wouldn't have a + * problem with it at all, unless we happened to stumble on an a + * which had a common factor. + * + * So. 1729 - 1 equals 27 * 2^6. So we look at + * + * 2^27 mod 1729 == 645 + * 2^108 mod 1729 == 1065 + * 2^216 mod 1729 == 1 + * 2^432 mod 1729 == 1 + * 2^864 mod 1729 == 1 + * 2^1728 mod 1729 == 1 + * + * We do have a trailing string of 1s, so the Fermat test would + * have been happy. But this trailing string of 1s is preceded by + * 1065; whereas if 1729 were prime, we'd expect to see it preceded + * by -1 (i.e. 1728.). Guards! Seize this impostor. + * + * (If we were unlucky, we might have tried a=16 instead of a=2; + * now 16^27 mod 1729 == 1, so we would have seen a long string of + * 1s and wouldn't have seen the thing _before_ the 1s. So, just + * like the Fermat test, for a given p there may well exist values + * of a which fail to show up its compositeness. So we try several, + * just like the Fermat test. The difference is that Miller-Rabin + * is not _in general_ fooled by Carmichael numbers.) + * + * Put simply, then, the Miller-Rabin test requires us to: + * + * 1. write p-1 as q * 2^k, with q odd + * 2. compute z = (a^q) mod p. + * 3. report success if z == 1 or z == -1. + * 4. square z at most k-1 times, and report success if it becomes + * -1 at any point. + * 5. report failure otherwise. + * + * (We expect z to become -1 after at most k-1 squarings, because + * if it became -1 after k squarings then a^(p-1) would fail to be + * 1. And we don't need to investigate what happens after we see a + * -1, because we _know_ that -1 squared is 1 modulo anything at + * all, so after we've seen a -1 we can be sure of seeing nothing + * but 1s.) + */ + +/* * The first few odd primes. * * import sys @@ -21,690 +123,964 @@ * for i in list[1:]: sys.stdout.write("%d," % i) */ static const unsigned short primes[] = { - 3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101, - 103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193, - 197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293, - 307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409, - 419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521, - 523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641, - 643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757, - 761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881, - 883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009, - 1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093, - 1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201, - 1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297, - 1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427, - 1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499, - 1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607, - 1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709, - 1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823, - 1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933, - 1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039, - 2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141, - 2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269, - 2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371, - 2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467, - 2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609, - 2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699, - 2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797, - 2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909, - 2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037, - 3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169, - 3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299, - 3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389, - 3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517, - 3527,3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613, - 3617,3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719, - 3727,3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847, - 3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943, - 3947,3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073, - 4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201, - 4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289, - 4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441, - 4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549, - 4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663, - 4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793, - 4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933, - 4937,4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021, - 5023,5039,5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153, - 5167,5171,5179,5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281, - 5297,5303,5309,5323,5333,5347,5351,5381,5387,5393,5399,5407,5413,5417, - 5419,5431,5437,5441,5443,5449,5471,5477,5479,5483,5501,5503,5507,5519, - 5521,5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,5641,5647,5651, - 5653,5657,5659,5669,5683,5689,5693,5701,5711,5717,5737,5741,5743,5749, - 5779,5783,5791,5801,5807,5813,5821,5827,5839,5843,5849,5851,5857,5861, - 5867,5869,5879,5881,5897,5903,5923,5927,5939,5953,5981,5987,6007,6011, - 6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,6101,6113,6121,6131, - 6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,6229,6247,6257, - 6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,6343,6353, - 6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,6481, - 6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619, - 6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737, - 6761,6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863, - 6869,6871,6883,6899,6907,6911,6917,6947,6949,6959,6961,6967,6971,6977, - 6983,6991,6997,7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109, - 7121,7127,7129,7151,7159,7177,7187,7193,7207,7211,7213,7219,7229,7237, - 7243,7247,7253,7283,7297,7307,7309,7321,7331,7333,7349,7351,7369,7393, - 7411,7417,7433,7451,7457,7459,7477,7481,7487,7489,7499,7507,7517,7523, - 7529,7537,7541,7547,7549,7559,7561,7573,7577,7583,7589,7591,7603,7607, - 7621,7639,7643,7649,7669,7673,7681,7687,7691,7699,7703,7717,7723,7727, - 7741,7753,7757,7759,7789,7793,7817,7823,7829,7841,7853,7867,7873,7877, - 7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,7963,7993,8009,8011, - 8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,8117,8123,8147, - 8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,8263,8269, - 8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,8389, - 8419,8423,8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539, - 8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669, - 8677,8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761, - 8779,8783,8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887, - 8893,8923,8929,8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013, - 9029,9041,9043,9049,9059,9067,9091,9103,9109,9127,9133,9137,9151,9157, - 9161,9173,9181,9187,9199,9203,9209,9221,9227,9239,9241,9257,9277,9281, - 9283,9293,9311,9319,9323,9337,9341,9343,9349,9371,9377,9391,9397,9403, - 9413,9419,9421,9431,9433,9437,9439,9461,9463,9467,9473,9479,9491,9497, - 9511,9521,9533,9539,9547,9551,9587,9601,9613,9619,9623,9629,9631,9643, - 9649,9661,9677,9679,9689,9697,9719,9721,9733,9739,9743,9749,9767,9769, - 9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,9857,9859,9871,9883, - 9887,9901,9907,9923,9929,9931,9941,9949,9967,9973,10007,10009,10037, - 10039,10061,10067,10069,10079,10091,10093,10099,10103,10111,10133,10139, - 10141,10151,10159,10163,10169,10177,10181,10193,10211,10223,10243,10247, - 10253,10259,10267,10271,10273,10289,10301,10303,10313,10321,10331,10333, - 10337,10343,10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, - 10463,10477,10487,10499,10501,10513,10529,10531,10559,10567,10589,10597, - 10601,10607,10613,10627,10631,10639,10651,10657,10663,10667,10687,10691, - 10709,10711,10723,10729,10733,10739,10753,10771,10781,10789,10799,10831, - 10837,10847,10853,10859,10861,10867,10883,10889,10891,10903,10909,10937, - 10939,10949,10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, - 11069,11071,11083,11087,11093,11113,11117,11119,11131,11149,11159,11161, - 11171,11173,11177,11197,11213,11239,11243,11251,11257,11261,11273,11279, - 11287,11299,11311,11317,11321,11329,11351,11353,11369,11383,11393,11399, - 11411,11423,11437,11443,11447,11467,11471,11483,11489,11491,11497,11503, - 11519,11527,11549,11551,11579,11587,11593,11597,11617,11621,11633,11657, - 11677,11681,11689,11699,11701,11717,11719,11731,11743,11777,11779,11783, - 11789,11801,11807,11813,11821,11827,11831,11833,11839,11863,11867,11887, - 11897,11903,11909,11923,11927,11933,11939,11941,11953,11959,11969,11971, - 11981,11987,12007,12011,12037,12041,12043,12049,12071,12073,12097,12101, - 12107,12109,12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, - 12227,12239,12241,12251,12253,12263,12269,12277,12281,12289,12301,12323, - 12329,12343,12347,12373,12377,12379,12391,12401,12409,12413,12421,12433, - 12437,12451,12457,12473,12479,12487,12491,12497,12503,12511,12517,12527, - 12539,12541,12547,12553,12569,12577,12583,12589,12601,12611,12613,12619, - 12637,12641,12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, - 12743,12757,12763,12781,12791,12799,12809,12821,12823,12829,12841,12853, - 12889,12893,12899,12907,12911,12917,12919,12923,12941,12953,12959,12967, - 12973,12979,12983,13001,13003,13007,13009,13033,13037,13043,13049,13063, - 13093,13099,13103,13109,13121,13127,13147,13151,13159,13163,13171,13177, - 13183,13187,13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, - 13313,13327,13331,13337,13339,13367,13381,13397,13399,13411,13417,13421, - 13441,13451,13457,13463,13469,13477,13487,13499,13513,13523,13537,13553, - 13567,13577,13591,13597,13613,13619,13627,13633,13649,13669,13679,13681, - 13687,13691,13693,13697,13709,13711,13721,13723,13729,13751,13757,13759, - 13763,13781,13789,13799,13807,13829,13831,13841,13859,13873,13877,13879, - 13883,13901,13903,13907,13913,13921,13931,13933,13963,13967,13997,13999, - 14009,14011,14029,14033,14051,14057,14071,14081,14083,14087,14107,14143, - 14149,14153,14159,14173,14177,14197,14207,14221,14243,14249,14251,14281, - 14293,14303,14321,14323,14327,14341,14347,14369,14387,14389,14401,14407, - 14411,14419,14423,14431,14437,14447,14449,14461,14479,14489,14503,14519, - 14533,14537,14543,14549,14551,14557,14561,14563,14591,14593,14621,14627, - 14629,14633,14639,14653,14657,14669,14683,14699,14713,14717,14723,14731, - 14737,14741,14747,14753,14759,14767,14771,14779,14783,14797,14813,14821, - 14827,14831,14843,14851,14867,14869,14879,14887,14891,14897,14923,14929, - 14939,14947,14951,14957,14969,14983,15013,15017,15031,15053,15061,15073, - 15077,15083,15091,15101,15107,15121,15131,15137,15139,15149,15161,15173, - 15187,15193,15199,15217,15227,15233,15241,15259,15263,15269,15271,15277, - 15287,15289,15299,15307,15313,15319,15329,15331,15349,15359,15361,15373, - 15377,15383,15391,15401,15413,15427,15439,15443,15451,15461,15467,15473, - 15493,15497,15511,15527,15541,15551,15559,15569,15581,15583,15601,15607, - 15619,15629,15641,15643,15647,15649,15661,15667,15671,15679,15683,15727, - 15731,15733,15737,15739,15749,15761,15767,15773,15787,15791,15797,15803, - 15809,15817,15823,15859,15877,15881,15887,15889,15901,15907,15913,15919, - 15923,15937,15959,15971,15973,15991,16001,16007,16033,16057,16061,16063, - 16067,16069,16073,16087,16091,16097,16103,16111,16127,16139,16141,16183, - 16187,16189,16193,16217,16223,16229,16231,16249,16253,16267,16273,16301, - 16319,16333,16339,16349,16361,16363,16369,16381,16411,16417,16421,16427, - 16433,16447,16451,16453,16477,16481,16487,16493,16519,16529,16547,16553, - 16561,16567,16573,16603,16607,16619,16631,16633,16649,16651,16657,16661, - 16673,16691,16693,16699,16703,16729,16741,16747,16759,16763,16787,16811, - 16823,16829,16831,16843,16871,16879,16883,16889,16901,16903,16921,16927, - 16931,16937,16943,16963,16979,16981,16987,16993,17011,17021,17027,17029, - 17033,17041,17047,17053,17077,17093,17099,17107,17117,17123,17137,17159, - 17167,17183,17189,17191,17203,17207,17209,17231,17239,17257,17291,17293, - 17299,17317,17321,17327,17333,17341,17351,17359,17377,17383,17387,17389, - 17393,17401,17417,17419,17431,17443,17449,17467,17471,17477,17483,17489, - 17491,17497,17509,17519,17539,17551,17569,17573,17579,17581,17597,17599, - 17609,17623,17627,17657,17659,17669,17681,17683,17707,17713,17729,17737, - 17747,17749,17761,17783,17789,17791,17807,17827,17837,17839,17851,17863, - 17881,17891,17903,17909,17911,17921,17923,17929,17939,17957,17959,17971, - 17977,17981,17987,17989,18013,18041,18043,18047,18049,18059,18061,18077, - 18089,18097,18119,18121,18127,18131,18133,18143,18149,18169,18181,18191, - 18199,18211,18217,18223,18229,18233,18251,18253,18257,18269,18287,18289, - 18301,18307,18311,18313,18329,18341,18353,18367,18371,18379,18397,18401, - 18413,18427,18433,18439,18443,18451,18457,18461,18481,18493,18503,18517, - 18521,18523,18539,18541,18553,18583,18587,18593,18617,18637,18661,18671, - 18679,18691,18701,18713,18719,18731,18743,18749,18757,18773,18787,18793, - 18797,18803,18839,18859,18869,18899,18911,18913,18917,18919,18947,18959, - 18973,18979,19001,19009,19013,19031,19037,19051,19069,19073,19079,19081, - 19087,19121,19139,19141,19157,19163,19181,19183,19207,19211,19213,19219, - 19231,19237,19249,19259,19267,19273,19289,19301,19309,19319,19333,19373, - 19379,19381,19387,19391,19403,19417,19421,19423,19427,19429,19433,19441, - 19447,19457,19463,19469,19471,19477,19483,19489,19501,19507,19531,19541, - 19543,19553,19559,19571,19577,19583,19597,19603,19609,19661,19681,19687, - 19697,19699,19709,19717,19727,19739,19751,19753,19759,19763,19777,19793, - 19801,19813,19819,19841,19843,19853,19861,19867,19889,19891,19913,19919, - 19927,19937,19949,19961,19963,19973,19979,19991,19993,19997,20011,20021, - 20023,20029,20047,20051,20063,20071,20089,20101,20107,20113,20117,20123, - 20129,20143,20147,20149,20161,20173,20177,20183,20201,20219,20231,20233, - 20249,20261,20269,20287,20297,20323,20327,20333,20341,20347,20353,20357, - 20359,20369,20389,20393,20399,20407,20411,20431,20441,20443,20477,20479, - 20483,20507,20509,20521,20533,20543,20549,20551,20563,20593,20599,20611, - 20627,20639,20641,20663,20681,20693,20707,20717,20719,20731,20743,20747, - 20749,20753,20759,20771,20773,20789,20807,20809,20849,20857,20873,20879, - 20887,20897,20899,20903,20921,20929,20939,20947,20959,20963,20981,20983, - 21001,21011,21013,21017,21019,21023,21031,21059,21061,21067,21089,21101, - 21107,21121,21139,21143,21149,21157,21163,21169,21179,21187,21191,21193, - 21211,21221,21227,21247,21269,21277,21283,21313,21317,21319,21323,21341, - 21347,21377,21379,21383,21391,21397,21401,21407,21419,21433,21467,21481, - 21487,21491,21493,21499,21503,21517,21521,21523,21529,21557,21559,21563, - 21569,21577,21587,21589,21599,21601,21611,21613,21617,21647,21649,21661, - 21673,21683,21701,21713,21727,21737,21739,21751,21757,21767,21773,21787, - 21799,21803,21817,21821,21839,21841,21851,21859,21863,21871,21881,21893, - 21911,21929,21937,21943,21961,21977,21991,21997,22003,22013,22027,22031, - 22037,22039,22051,22063,22067,22073,22079,22091,22093,22109,22111,22123, - 22129,22133,22147,22153,22157,22159,22171,22189,22193,22229,22247,22259, - 22271,22273,22277,22279,22283,22291,22303,22307,22343,22349,22367,22369, - 22381,22391,22397,22409,22433,22441,22447,22453,22469,22481,22483,22501, - 22511,22531,22541,22543,22549,22567,22571,22573,22613,22619,22621,22637, - 22639,22643,22651,22669,22679,22691,22697,22699,22709,22717,22721,22727, - 22739,22741,22751,22769,22777,22783,22787,22807,22811,22817,22853,22859, - 22861,22871,22877,22901,22907,22921,22937,22943,22961,22963,22973,22993, - 23003,23011,23017,23021,23027,23029,23039,23041,23053,23057,23059,23063, - 23071,23081,23087,23099,23117,23131,23143,23159,23167,23173,23189,23197, - 23201,23203,23209,23227,23251,23269,23279,23291,23293,23297,23311,23321, - 23327,23333,23339,23357,23369,23371,23399,23417,23431,23447,23459,23473, - 23497,23509,23531,23537,23539,23549,23557,23561,23563,23567,23581,23593, - 23599,23603,23609,23623,23627,23629,23633,23663,23669,23671,23677,23687, - 23689,23719,23741,23743,23747,23753,23761,23767,23773,23789,23801,23813, - 23819,23827,23831,23833,23857,23869,23873,23879,23887,23893,23899,23909, - 23911,23917,23929,23957,23971,23977,23981,23993,24001,24007,24019,24023, - 24029,24043,24049,24061,24071,24077,24083,24091,24097,24103,24107,24109, - 24113,24121,24133,24137,24151,24169,24179,24181,24197,24203,24223,24229, - 24239,24247,24251,24281,24317,24329,24337,24359,24371,24373,24379,24391, - 24407,24413,24419,24421,24439,24443,24469,24473,24481,24499,24509,24517, - 24527,24533,24547,24551,24571,24593,24611,24623,24631,24659,24671,24677, - 24683,24691,24697,24709,24733,24749,24763,24767,24781,24793,24799,24809, - 24821,24841,24847,24851,24859,24877,24889,24907,24917,24919,24923,24943, - 24953,24967,24971,24977,24979,24989,25013,25031,25033,25037,25057,25073, - 25087,25097,25111,25117,25121,25127,25147,25153,25163,25169,25171,25183, - 25189,25219,25229,25237,25243,25247,25253,25261,25301,25303,25307,25309, - 25321,25339,25343,25349,25357,25367,25373,25391,25409,25411,25423,25439, - 25447,25453,25457,25463,25469,25471,25523,25537,25541,25561,25577,25579, - 25583,25589,25601,25603,25609,25621,25633,25639,25643,25657,25667,25673, - 25679,25693,25703,25717,25733,25741,25747,25759,25763,25771,25793,25799, - 25801,25819,25841,25847,25849,25867,25873,25889,25903,25913,25919,25931, - 25933,25939,25943,25951,25969,25981,25997,25999,26003,26017,26021,26029, - 26041,26053,26083,26099,26107,26111,26113,26119,26141,26153,26161,26171, - 26177,26183,26189,26203,26209,26227,26237,26249,26251,26261,26263,26267, - 26293,26297,26309,26317,26321,26339,26347,26357,26371,26387,26393,26399, - 26407,26417,26423,26431,26437,26449,26459,26479,26489,26497,26501,26513, - 26539,26557,26561,26573,26591,26597,26627,26633,26641,26647,26669,26681, - 26683,26687,26693,26699,26701,26711,26713,26717,26723,26729,26731,26737, - 26759,26777,26783,26801,26813,26821,26833,26839,26849,26861,26863,26879, - 26881,26891,26893,26903,26921,26927,26947,26951,26953,26959,26981,26987, - 26993,27011,27017,27031,27043,27059,27061,27067,27073,27077,27091,27103, - 27107,27109,27127,27143,27179,27191,27197,27211,27239,27241,27253,27259, - 27271,27277,27281,27283,27299,27329,27337,27361,27367,27397,27407,27409, - 27427,27431,27437,27449,27457,27479,27481,27487,27509,27527,27529,27539, - 27541,27551,27581,27583,27611,27617,27631,27647,27653,27673,27689,27691, - 27697,27701,27733,27737,27739,27743,27749,27751,27763,27767,27773,27779, - 27791,27793,27799,27803,27809,27817,27823,27827,27847,27851,27883,27893, - 27901,27917,27919,27941,27943,27947,27953,27961,27967,27983,27997,28001, - 28019,28027,28031,28051,28057,28069,28081,28087,28097,28099,28109,28111, - 28123,28151,28163,28181,28183,28201,28211,28219,28229,28277,28279,28283, - 28289,28297,28307,28309,28319,28349,28351,28387,28393,28403,28409,28411, - 28429,28433,28439,28447,28463,28477,28493,28499,28513,28517,28537,28541, - 28547,28549,28559,28571,28573,28579,28591,28597,28603,28607,28619,28621, - 28627,28631,28643,28649,28657,28661,28663,28669,28687,28697,28703,28711, - 28723,28729,28751,28753,28759,28771,28789,28793,28807,28813,28817,28837, - 28843,28859,28867,28871,28879,28901,28909,28921,28927,28933,28949,28961, - 28979,29009,29017,29021,29023,29027,29033,29059,29063,29077,29101,29123, - 29129,29131,29137,29147,29153,29167,29173,29179,29191,29201,29207,29209, - 29221,29231,29243,29251,29269,29287,29297,29303,29311,29327,29333,29339, - 29347,29363,29383,29387,29389,29399,29401,29411,29423,29429,29437,29443, - 29453,29473,29483,29501,29527,29531,29537,29567,29569,29573,29581,29587, - 29599,29611,29629,29633,29641,29663,29669,29671,29683,29717,29723,29741, - 29753,29759,29761,29789,29803,29819,29833,29837,29851,29863,29867,29873, - 29879,29881,29917,29921,29927,29947,29959,29983,29989,30011,30013,30029, - 30047,30059,30071,30089,30091,30097,30103,30109,30113,30119,30133,30137, - 30139,30161,30169,30181,30187,30197,30203,30211,30223,30241,30253,30259, - 30269,30271,30293,30307,30313,30319,30323,30341,30347,30367,30389,30391, - 30403,30427,30431,30449,30467,30469,30491,30493,30497,30509,30517,30529, - 30539,30553,30557,30559,30577,30593,30631,30637,30643,30649,30661,30671, - 30677,30689,30697,30703,30707,30713,30727,30757,30763,30773,30781,30803, - 30809,30817,30829,30839,30841,30851,30853,30859,30869,30871,30881,30893, - 30911,30931,30937,30941,30949,30971,30977,30983,31013,31019,31033,31039, - 31051,31063,31069,31079,31081,31091,31121,31123,31139,31147,31151,31153, - 31159,31177,31181,31183,31189,31193,31219,31223,31231,31237,31247,31249, - 31253,31259,31267,31271,31277,31307,31319,31321,31327,31333,31337,31357, - 31379,31387,31391,31393,31397,31469,31477,31481,31489,31511,31513,31517, - 31531,31541,31543,31547,31567,31573,31583,31601,31607,31627,31643,31649, - 31657,31663,31667,31687,31699,31721,31723,31727,31729,31741,31751,31769, - 31771,31793,31799,31817,31847,31849,31859,31873,31883,31891,31907,31957, - 31963,31973,31981,31991,32003,32009,32027,32029,32051,32057,32059,32063, - 32069,32077,32083,32089,32099,32117,32119,32141,32143,32159,32173,32183, - 32189,32191,32203,32213,32233,32237,32251,32257,32261,32297,32299,32303, - 32309,32321,32323,32327,32341,32353,32359,32363,32369,32371,32377,32381, - 32401,32411,32413,32423,32429,32441,32443,32467,32479,32491,32497,32503, - 32507,32531,32533,32537,32561,32563,32569,32573,32579,32587,32603,32609, - 32611,32621,32633,32647,32653,32687,32693,32707,32713,32717,32719,32749, - 32771,32779,32783,32789,32797,32801,32803,32831,32833,32839,32843,32869, - 32887,32909,32911,32917,32933,32939,32941,32957,32969,32971,32983,32987, - 32993,32999,33013,33023,33029,33037,33049,33053,33071,33073,33083,33091, - 33107,33113,33119,33149,33151,33161,33179,33181,33191,33199,33203,33211, - 33223,33247,33287,33289,33301,33311,33317,33329,33331,33343,33347,33349, - 33353,33359,33377,33391,33403,33409,33413,33427,33457,33461,33469,33479, - 33487,33493,33503,33521,33529,33533,33547,33563,33569,33577,33581,33587, - 33589,33599,33601,33613,33617,33619,33623,33629,33637,33641,33647,33679, - 33703,33713,33721,33739,33749,33751,33757,33767,33769,33773,33791,33797, - 33809,33811,33827,33829,33851,33857,33863,33871,33889,33893,33911,33923, - 33931,33937,33941,33961,33967,33997,34019,34031,34033,34039,34057,34061, - 34123,34127,34129,34141,34147,34157,34159,34171,34183,34211,34213,34217, - 34231,34253,34259,34261,34267,34273,34283,34297,34301,34303,34313,34319, - 34327,34337,34351,34361,34367,34369,34381,34403,34421,34429,34439,34457, - 34469,34471,34483,34487,34499,34501,34511,34513,34519,34537,34543,34549, - 34583,34589,34591,34603,34607,34613,34631,34649,34651,34667,34673,34679, - 34687,34693,34703,34721,34729,34739,34747,34757,34759,34763,34781,34807, - 34819,34841,34843,34847,34849,34871,34877,34883,34897,34913,34919,34939, - 34949,34961,34963,34981,35023,35027,35051,35053,35059,35069,35081,35083, - 35089,35099,35107,35111,35117,35129,35141,35149,35153,35159,35171,35201, - 35221,35227,35251,35257,35267,35279,35281,35291,35311,35317,35323,35327, - 35339,35353,35363,35381,35393,35401,35407,35419,35423,35437,35447,35449, - 35461,35491,35507,35509,35521,35527,35531,35533,35537,35543,35569,35573, - 35591,35593,35597,35603,35617,35671,35677,35729,35731,35747,35753,35759, - 35771,35797,35801,35803,35809,35831,35837,35839,35851,35863,35869,35879, - 35897,35899,35911,35923,35933,35951,35963,35969,35977,35983,35993,35999, - 36007,36011,36013,36017,36037,36061,36067,36073,36083,36097,36107,36109, - 36131,36137,36151,36161,36187,36191,36209,36217,36229,36241,36251,36263, - 36269,36277,36293,36299,36307,36313,36319,36341,36343,36353,36373,36383, - 36389,36433,36451,36457,36467,36469,36473,36479,36493,36497,36523,36527, - 36529,36541,36551,36559,36563,36571,36583,36587,36599,36607,36629,36637, - 36643,36653,36671,36677,36683,36691,36697,36709,36713,36721,36739,36749, - 36761,36767,36779,36781,36787,36791,36793,36809,36821,36833,36847,36857, - 36871,36877,36887,36899,36901,36913,36919,36923,36929,36931,36943,36947, - 36973,36979,36997,37003,37013,37019,37021,37039,37049,37057,37061,37087, - 37097,37117,37123,37139,37159,37171,37181,37189,37199,37201,37217,37223, - 37243,37253,37273,37277,37307,37309,37313,37321,37337,37339,37357,37361, - 37363,37369,37379,37397,37409,37423,37441,37447,37463,37483,37489,37493, - 37501,37507,37511,37517,37529,37537,37547,37549,37561,37567,37571,37573, - 37579,37589,37591,37607,37619,37633,37643,37649,37657,37663,37691,37693, - 37699,37717,37747,37781,37783,37799,37811,37813,37831,37847,37853,37861, - 37871,37879,37889,37897,37907,37951,37957,37963,37967,37987,37991,37993, - 37997,38011,38039,38047,38053,38069,38083,38113,38119,38149,38153,38167, - 38177,38183,38189,38197,38201,38219,38231,38237,38239,38261,38273,38281, - 38287,38299,38303,38317,38321,38327,38329,38333,38351,38371,38377,38393, - 38431,38447,38449,38453,38459,38461,38501,38543,38557,38561,38567,38569, - 38593,38603,38609,38611,38629,38639,38651,38653,38669,38671,38677,38693, - 38699,38707,38711,38713,38723,38729,38737,38747,38749,38767,38783,38791, - 38803,38821,38833,38839,38851,38861,38867,38873,38891,38903,38917,38921, - 38923,38933,38953,38959,38971,38977,38993,39019,39023,39041,39043,39047, - 39079,39089,39097,39103,39107,39113,39119,39133,39139,39157,39161,39163, - 39181,39191,39199,39209,39217,39227,39229,39233,39239,39241,39251,39293, - 39301,39313,39317,39323,39341,39343,39359,39367,39371,39373,39383,39397, - 39409,39419,39439,39443,39451,39461,39499,39503,39509,39511,39521,39541, - 39551,39563,39569,39581,39607,39619,39623,39631,39659,39667,39671,39679, - 39703,39709,39719,39727,39733,39749,39761,39769,39779,39791,39799,39821, - 39827,39829,39839,39841,39847,39857,39863,39869,39877,39883,39887,39901, - 39929,39937,39953,39971,39979,39983,39989,40009,40013,40031,40037,40039, - 40063,40087,40093,40099,40111,40123,40127,40129,40151,40153,40163,40169, - 40177,40189,40193,40213,40231,40237,40241,40253,40277,40283,40289,40343, - 40351,40357,40361,40387,40423,40427,40429,40433,40459,40471,40483,40487, - 40493,40499,40507,40519,40529,40531,40543,40559,40577,40583,40591,40597, - 40609,40627,40637,40639,40693,40697,40699,40709,40739,40751,40759,40763, - 40771,40787,40801,40813,40819,40823,40829,40841,40847,40849,40853,40867, - 40879,40883,40897,40903,40927,40933,40939,40949,40961,40973,40993,41011, - 41017,41023,41039,41047,41051,41057,41077,41081,41113,41117,41131,41141, - 41143,41149,41161,41177,41179,41183,41189,41201,41203,41213,41221,41227, - 41231,41233,41243,41257,41263,41269,41281,41299,41333,41341,41351,41357, - 41381,41387,41389,41399,41411,41413,41443,41453,41467,41479,41491,41507, - 41513,41519,41521,41539,41543,41549,41579,41593,41597,41603,41609,41611, - 41617,41621,41627,41641,41647,41651,41659,41669,41681,41687,41719,41729, - 41737,41759,41761,41771,41777,41801,41809,41813,41843,41849,41851,41863, - 41879,41887,41893,41897,41903,41911,41927,41941,41947,41953,41957,41959, - 41969,41981,41983,41999,42013,42017,42019,42023,42043,42061,42071,42073, - 42083,42089,42101,42131,42139,42157,42169,42179,42181,42187,42193,42197, - 42209,42221,42223,42227,42239,42257,42281,42283,42293,42299,42307,42323, - 42331,42337,42349,42359,42373,42379,42391,42397,42403,42407,42409,42433, - 42437,42443,42451,42457,42461,42463,42467,42473,42487,42491,42499,42509, - 42533,42557,42569,42571,42577,42589,42611,42641,42643,42649,42667,42677, - 42683,42689,42697,42701,42703,42709,42719,42727,42737,42743,42751,42767, - 42773,42787,42793,42797,42821,42829,42839,42841,42853,42859,42863,42899, - 42901,42923,42929,42937,42943,42953,42961,42967,42979,42989,43003,43013, - 43019,43037,43049,43051,43063,43067,43093,43103,43117,43133,43151,43159, - 43177,43189,43201,43207,43223,43237,43261,43271,43283,43291,43313,43319, - 43321,43331,43391,43397,43399,43403,43411,43427,43441,43451,43457,43481, - 43487,43499,43517,43541,43543,43573,43577,43579,43591,43597,43607,43609, - 43613,43627,43633,43649,43651,43661,43669,43691,43711,43717,43721,43753, - 43759,43777,43781,43783,43787,43789,43793,43801,43853,43867,43889,43891, - 43913,43933,43943,43951,43961,43963,43969,43973,43987,43991,43997,44017, - 44021,44027,44029,44041,44053,44059,44071,44087,44089,44101,44111,44119, - 44123,44129,44131,44159,44171,44179,44189,44201,44203,44207,44221,44249, - 44257,44263,44267,44269,44273,44279,44281,44293,44351,44357,44371,44381, - 44383,44389,44417,44449,44453,44483,44491,44497,44501,44507,44519,44531, - 44533,44537,44543,44549,44563,44579,44587,44617,44621,44623,44633,44641, - 44647,44651,44657,44683,44687,44699,44701,44711,44729,44741,44753,44771, - 44773,44777,44789,44797,44809,44819,44839,44843,44851,44867,44879,44887, - 44893,44909,44917,44927,44939,44953,44959,44963,44971,44983,44987,45007, - 45013,45053,45061,45077,45083,45119,45121,45127,45131,45137,45139,45161, - 45179,45181,45191,45197,45233,45247,45259,45263,45281,45289,45293,45307, - 45317,45319,45329,45337,45341,45343,45361,45377,45389,45403,45413,45427, - 45433,45439,45481,45491,45497,45503,45523,45533,45541,45553,45557,45569, - 45587,45589,45599,45613,45631,45641,45659,45667,45673,45677,45691,45697, - 45707,45737,45751,45757,45763,45767,45779,45817,45821,45823,45827,45833, - 45841,45853,45863,45869,45887,45893,45943,45949,45953,45959,45971,45979, - 45989,46021,46027,46049,46051,46061,46073,46091,46093,46099,46103,46133, - 46141,46147,46153,46171,46181,46183,46187,46199,46219,46229,46237,46261, - 46271,46273,46279,46301,46307,46309,46327,46337,46349,46351,46381,46399, - 46411,46439,46441,46447,46451,46457,46471,46477,46489,46499,46507,46511, - 46523,46549,46559,46567,46573,46589,46591,46601,46619,46633,46639,46643, - 46649,46663,46679,46681,46687,46691,46703,46723,46727,46747,46751,46757, - 46769,46771,46807,46811,46817,46819,46829,46831,46853,46861,46867,46877, - 46889,46901,46919,46933,46957,46993,46997,47017,47041,47051,47057,47059, - 47087,47093,47111,47119,47123,47129,47137,47143,47147,47149,47161,47189, - 47207,47221,47237,47251,47269,47279,47287,47293,47297,47303,47309,47317, - 47339,47351,47353,47363,47381,47387,47389,47407,47417,47419,47431,47441, - 47459,47491,47497,47501,47507,47513,47521,47527,47533,47543,47563,47569, - 47581,47591,47599,47609,47623,47629,47639,47653,47657,47659,47681,47699, - 47701,47711,47713,47717,47737,47741,47743,47777,47779,47791,47797,47807, - 47809,47819,47837,47843,47857,47869,47881,47903,47911,47917,47933,47939, - 47947,47951,47963,47969,47977,47981,48017,48023,48029,48049,48073,48079, - 48091,48109,48119,48121,48131,48157,48163,48179,48187,48193,48197,48221, - 48239,48247,48259,48271,48281,48299,48311,48313,48337,48341,48353,48371, - 48383,48397,48407,48409,48413,48437,48449,48463,48473,48479,48481,48487, - 48491,48497,48523,48527,48533,48539,48541,48563,48571,48589,48593,48611, - 48619,48623,48647,48649,48661,48673,48677,48679,48731,48733,48751,48757, - 48761,48767,48779,48781,48787,48799,48809,48817,48821,48823,48847,48857, - 48859,48869,48871,48883,48889,48907,48947,48953,48973,48989,48991,49003, - 49009,49019,49031,49033,49037,49043,49057,49069,49081,49103,49109,49117, - 49121,49123,49139,49157,49169,49171,49177,49193,49199,49201,49207,49211, - 49223,49253,49261,49277,49279,49297,49307,49331,49333,49339,49363,49367, - 49369,49391,49393,49409,49411,49417,49429,49433,49451,49459,49463,49477, - 49481,49499,49523,49529,49531,49537,49547,49549,49559,49597,49603,49613, - 49627,49633,49639,49663,49667,49669,49681,49697,49711,49727,49739,49741, - 49747,49757,49783,49787,49789,49801,49807,49811,49823,49831,49843,49853, - 49871,49877,49891,49919,49921,49927,49937,49939,49943,49957,49991,49993, - 49999,50021,50023,50033,50047,50051,50053,50069,50077,50087,50093,50101, - 50111,50119,50123,50129,50131,50147,50153,50159,50177,50207,50221,50227, - 50231,50261,50263,50273,50287,50291,50311,50321,50329,50333,50341,50359, - 50363,50377,50383,50387,50411,50417,50423,50441,50459,50461,50497,50503, - 50513,50527,50539,50543,50549,50551,50581,50587,50591,50593,50599,50627, - 50647,50651,50671,50683,50707,50723,50741,50753,50767,50773,50777,50789, - 50821,50833,50839,50849,50857,50867,50873,50891,50893,50909,50923,50929, - 50951,50957,50969,50971,50989,50993,51001,51031,51043,51047,51059,51061, - 51071,51109,51131,51133,51137,51151,51157,51169,51193,51197,51199,51203, - 51217,51229,51239,51241,51257,51263,51283,51287,51307,51329,51341,51343, - 51347,51349,51361,51383,51407,51413,51419,51421,51427,51431,51437,51439, - 51449,51461,51473,51479,51481,51487,51503,51511,51517,51521,51539,51551, - 51563,51577,51581,51593,51599,51607,51613,51631,51637,51647,51659,51673, - 51679,51683,51691,51713,51719,51721,51749,51767,51769,51787,51797,51803, - 51817,51827,51829,51839,51853,51859,51869,51871,51893,51899,51907,51913, - 51929,51941,51949,51971,51973,51977,51991,52009,52021,52027,52051,52057, - 52067,52069,52081,52103,52121,52127,52147,52153,52163,52177,52181,52183, - 52189,52201,52223,52237,52249,52253,52259,52267,52289,52291,52301,52313, - 52321,52361,52363,52369,52379,52387,52391,52433,52453,52457,52489,52501, - 52511,52517,52529,52541,52543,52553,52561,52567,52571,52579,52583,52609, - 52627,52631,52639,52667,52673,52691,52697,52709,52711,52721,52727,52733, - 52747,52757,52769,52783,52807,52813,52817,52837,52859,52861,52879,52883, - 52889,52901,52903,52919,52937,52951,52957,52963,52967,52973,52981,52999, - 53003,53017,53047,53051,53069,53077,53087,53089,53093,53101,53113,53117, - 53129,53147,53149,53161,53171,53173,53189,53197,53201,53231,53233,53239, - 53267,53269,53279,53281,53299,53309,53323,53327,53353,53359,53377,53381, - 53401,53407,53411,53419,53437,53441,53453,53479,53503,53507,53527,53549, - 53551,53569,53591,53593,53597,53609,53611,53617,53623,53629,53633,53639, - 53653,53657,53681,53693,53699,53717,53719,53731,53759,53773,53777,53783, - 53791,53813,53819,53831,53849,53857,53861,53881,53887,53891,53897,53899, - 53917,53923,53927,53939,53951,53959,53987,53993,54001,54011,54013,54037, - 54049,54059,54083,54091,54101,54121,54133,54139,54151,54163,54167,54181, - 54193,54217,54251,54269,54277,54287,54293,54311,54319,54323,54331,54347, - 54361,54367,54371,54377,54401,54403,54409,54413,54419,54421,54437,54443, - 54449,54469,54493,54497,54499,54503,54517,54521,54539,54541,54547,54559, - 54563,54577,54581,54583,54601,54617,54623,54629,54631,54647,54667,54673, - 54679,54709,54713,54721,54727,54751,54767,54773,54779,54787,54799,54829, - 54833,54851,54869,54877,54881,54907,54917,54919,54941,54949,54959,54973, - 54979,54983,55001,55009,55021,55049,55051,55057,55061,55073,55079,55103, - 55109,55117,55127,55147,55163,55171,55201,55207,55213,55217,55219,55229, - 55243,55249,55259,55291,55313,55331,55333,55337,55339,55343,55351,55373, - 55381,55399,55411,55439,55441,55457,55469,55487,55501,55511,55529,55541, - 55547,55579,55589,55603,55609,55619,55621,55631,55633,55639,55661,55663, - 55667,55673,55681,55691,55697,55711,55717,55721,55733,55763,55787,55793, - 55799,55807,55813,55817,55819,55823,55829,55837,55843,55849,55871,55889, - 55897,55901,55903,55921,55927,55931,55933,55949,55967,55987,55997,56003, - 56009,56039,56041,56053,56081,56087,56093,56099,56101,56113,56123,56131, - 56149,56167,56171,56179,56197,56207,56209,56237,56239,56249,56263,56267, - 56269,56299,56311,56333,56359,56369,56377,56383,56393,56401,56417,56431, - 56437,56443,56453,56467,56473,56477,56479,56489,56501,56503,56509,56519, - 56527,56531,56533,56543,56569,56591,56597,56599,56611,56629,56633,56659, - 56663,56671,56681,56687,56701,56711,56713,56731,56737,56747,56767,56773, - 56779,56783,56807,56809,56813,56821,56827,56843,56857,56873,56891,56893, - 56897,56909,56911,56921,56923,56929,56941,56951,56957,56963,56983,56989, - 56993,56999,57037,57041,57047,57059,57073,57077,57089,57097,57107,57119, - 57131,57139,57143,57149,57163,57173,57179,57191,57193,57203,57221,57223, - 57241,57251,57259,57269,57271,57283,57287,57301,57329,57331,57347,57349, - 57367,57373,57383,57389,57397,57413,57427,57457,57467,57487,57493,57503, - 57527,57529,57557,57559,57571,57587,57593,57601,57637,57641,57649,57653, - 57667,57679,57689,57697,57709,57713,57719,57727,57731,57737,57751,57773, - 57781,57787,57791,57793,57803,57809,57829,57839,57847,57853,57859,57881, - 57899,57901,57917,57923,57943,57947,57973,57977,57991,58013,58027,58031, - 58043,58049,58057,58061,58067,58073,58099,58109,58111,58129,58147,58151, - 58153,58169,58171,58189,58193,58199,58207,58211,58217,58229,58231,58237, - 58243,58271,58309,58313,58321,58337,58363,58367,58369,58379,58391,58393, - 58403,58411,58417,58427,58439,58441,58451,58453,58477,58481,58511,58537, - 58543,58549,58567,58573,58579,58601,58603,58613,58631,58657,58661,58679, - 58687,58693,58699,58711,58727,58733,58741,58757,58763,58771,58787,58789, - 58831,58889,58897,58901,58907,58909,58913,58921,58937,58943,58963,58967, - 58979,58991,58997,59009,59011,59021,59023,59029,59051,59053,59063,59069, - 59077,59083,59093,59107,59113,59119,59123,59141,59149,59159,59167,59183, - 59197,59207,59209,59219,59221,59233,59239,59243,59263,59273,59281,59333, - 59341,59351,59357,59359,59369,59377,59387,59393,59399,59407,59417,59419, - 59441,59443,59447,59453,59467,59471,59473,59497,59509,59513,59539,59557, - 59561,59567,59581,59611,59617,59621,59627,59629,59651,59659,59663,59669, - 59671,59693,59699,59707,59723,59729,59743,59747,59753,59771,59779,59791, - 59797,59809,59833,59863,59879,59887,59921,59929,59951,59957,59971,59981, - 59999,60013,60017,60029,60037,60041,60077,60083,60089,60091,60101,60103, - 60107,60127,60133,60139,60149,60161,60167,60169,60209,60217,60223,60251, - 60257,60259,60271,60289,60293,60317,60331,60337,60343,60353,60373,60383, - 60397,60413,60427,60443,60449,60457,60493,60497,60509,60521,60527,60539, - 60589,60601,60607,60611,60617,60623,60631,60637,60647,60649,60659,60661, - 60679,60689,60703,60719,60727,60733,60737,60757,60761,60763,60773,60779, - 60793,60811,60821,60859,60869,60887,60889,60899,60901,60913,60917,60919, - 60923,60937,60943,60953,60961,61001,61007,61027,61031,61043,61051,61057, - 61091,61099,61121,61129,61141,61151,61153,61169,61211,61223,61231,61253, - 61261,61283,61291,61297,61331,61333,61339,61343,61357,61363,61379,61381, - 61403,61409,61417,61441,61463,61469,61471,61483,61487,61493,61507,61511, - 61519,61543,61547,61553,61559,61561,61583,61603,61609,61613,61627,61631, - 61637,61643,61651,61657,61667,61673,61681,61687,61703,61717,61723,61729, - 61751,61757,61781,61813,61819,61837,61843,61861,61871,61879,61909,61927, - 61933,61949,61961,61967,61979,61981,61987,61991,62003,62011,62017,62039, - 62047,62053,62057,62071,62081,62099,62119,62129,62131,62137,62141,62143, - 62171,62189,62191,62201,62207,62213,62219,62233,62273,62297,62299,62303, - 62311,62323,62327,62347,62351,62383,62401,62417,62423,62459,62467,62473, - 62477,62483,62497,62501,62507,62533,62539,62549,62563,62581,62591,62597, - 62603,62617,62627,62633,62639,62653,62659,62683,62687,62701,62723,62731, - 62743,62753,62761,62773,62791,62801,62819,62827,62851,62861,62869,62873, - 62897,62903,62921,62927,62929,62939,62969,62971,62981,62983,62987,62989, - 63029,63031,63059,63067,63073,63079,63097,63103,63113,63127,63131,63149, - 63179,63197,63199,63211,63241,63247,63277,63281,63299,63311,63313,63317, - 63331,63337,63347,63353,63361,63367,63377,63389,63391,63397,63409,63419, - 63421,63439,63443,63463,63467,63473,63487,63493,63499,63521,63527,63533, - 63541,63559,63577,63587,63589,63599,63601,63607,63611,63617,63629,63647, - 63649,63659,63667,63671,63689,63691,63697,63703,63709,63719,63727,63737, - 63743,63761,63773,63781,63793,63799,63803,63809,63823,63839,63841,63853, - 63857,63863,63901,63907,63913,63929,63949,63977,63997,64007,64013,64019, - 64033,64037,64063,64067,64081,64091,64109,64123,64151,64153,64157,64171, - 64187,64189,64217,64223,64231,64237,64271,64279,64283,64301,64303,64319, - 64327,64333,64373,64381,64399,64403,64433,64439,64451,64453,64483,64489, - 64499,64513,64553,64567,64577,64579,64591,64601,64609,64613,64621,64627, - 64633,64661,64663,64667,64679,64693,64709,64717,64747,64763,64781,64783, - 64793,64811,64817,64849,64853,64871,64877,64879,64891,64901,64919,64921, - 64927,64937,64951,64969,64997,65003,65011,65027,65029,65033,65053,65063, - 65071,65089,65099,65101,65111,65119,65123,65129,65141,65147,65167,65171, - 65173,65179,65183,65203,65213,65239,65257,65267,65269,65287,65293,65309, - 65323,65327,65353,65357,65371,65381,65393,65407,65413,65419,65423,65437, - 65447,65449,65479,65497,65519,65521, + 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, + 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, + 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, + 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, + 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, + 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, + 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, + 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, + 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, + 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, + 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, + 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, + 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, + 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, + 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, + 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, + 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, + 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, + 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, + 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, + 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, + 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, + 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, + 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, + 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, + 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, + 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, + 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, + 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, + 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, + 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, + 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, + 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, + 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, + 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, + 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, + 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, + 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, + 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, + 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, + 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, + 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, + 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, + 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, + 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, + 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, + 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, + 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, + 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, + 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, + 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, + 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, + 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, + 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, + 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, + 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, + 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, + 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, + 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, + 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, + 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, + 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, + 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, + 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, + 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, + 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, + 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, + 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, + 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, + 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, + 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, + 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, + 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, + 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, + 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, + 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, + 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, + 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, + 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, + 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, + 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, + 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, + 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, + 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, + 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, + 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, + 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, + 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, + 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, + 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, + 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, + 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, + 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, + 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, + 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, + 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, + 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, + 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, + 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, + 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, + 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, + 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, + 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, + 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, + 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, + 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, + 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, + 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, + 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, + 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, + 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, + 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, + 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, + 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, + 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, + 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, + 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, + 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, + 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, + 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, + 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, + 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, + 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, + 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, + 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, + 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, + 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, + 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, + 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, + 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, + 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, + 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, + 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, + 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, + 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, + 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, + 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, + 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, + 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, + 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, + 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, + 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, + 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, + 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, + 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, + 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, + 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, + 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, + 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, + 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, + 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, + 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, + 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, + 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, + 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, + 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, + 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, + 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, + 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, + 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, + 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, + 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, + 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, + 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, + 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, + 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, + 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, + 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, + 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, + 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, + 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, + 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791, + 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, + 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, + 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, + 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, + 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, + 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, + 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, + 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, + 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, + 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, + 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, + 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, + 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, + 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, + 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, + 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, + 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, + 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, + 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, + 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, + 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, + 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, + 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, + 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, + 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, + 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, + 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, + 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, + 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, + 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, + 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, + 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, + 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, + 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, + 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, + 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, + 19079, 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, + 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, + 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, + 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, + 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, + 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, + 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, + 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, + 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, + 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, + 19963, 19973, 19979, 19991, 19993, 19997, 20011, 20021, 20023, + 20029, 20047, 20051, 20063, 20071, 20089, 20101, 20107, 20113, + 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173, 20177, + 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, + 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, + 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, + 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, + 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, + 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749, + 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, + 20873, 20879, 20887, 20897, 20899, 20903, 20921, 20929, 20939, + 20947, 20959, 20963, 20981, 20983, 21001, 21011, 21013, 21017, + 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101, 21107, + 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187, + 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, + 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, + 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, + 21491, 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, + 21559, 21563, 21569, 21577, 21587, 21589, 21599, 21601, 21611, + 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713, + 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, + 21803, 21817, 21821, 21839, 21841, 21851, 21859, 21863, 21871, + 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, + 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063, + 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, + 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, + 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, + 22307, 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, + 22433, 22441, 22447, 22453, 22469, 22481, 22483, 22501, 22511, + 22531, 22541, 22543, 22549, 22567, 22571, 22573, 22613, 22619, + 22621, 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697, + 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, + 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859, 22861, + 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963, + 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, + 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, + 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, + 23203, 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, + 23311, 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, + 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, 23537, + 23539, 23549, 23557, 23561, 23563, 23567, 23581, 23593, 23599, + 23603, 23609, 23623, 23627, 23629, 23633, 23663, 23669, 23671, + 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753, 23761, + 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833, + 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, + 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, + 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, + 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, + 24151, 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, + 24247, 24251, 24281, 24317, 24329, 24337, 24359, 24371, 24373, + 24379, 24391, 24407, 24413, 24419, 24421, 24439, 24443, 24469, + 24473, 24481, 24499, 24509, 24517, 24527, 24533, 24547, 24551, + 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683, + 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793, + 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, + 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, + 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, + 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, + 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, + 25261, 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, + 25357, 25367, 25373, 25391, 25409, 25411, 25423, 25439, 25447, + 25453, 25457, 25463, 25469, 25471, 25523, 25537, 25541, 25561, + 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, + 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717, + 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, + 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, + 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, + 25999, 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, + 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171, 26177, + 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, + 26263, 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, + 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, 26431, + 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513, 26539, + 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647, + 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, + 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, + 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, + 26891, 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, + 26981, 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, + 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, 27143, + 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, + 27277, 27281, 27283, 27299, 27329, 27337, 27361, 27367, 27397, + 27407, 27409, 27427, 27431, 27437, 27449, 27457, 27479, 27481, + 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583, + 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, + 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, + 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, + 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, + 27943, 27947, 27953, 27961, 27967, 27983, 27997, 28001, 28019, + 28027, 28031, 28051, 28057, 28069, 28081, 28087, 28097, 28099, + 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201, 28211, + 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, + 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, + 28433, 28439, 28447, 28463, 28477, 28493, 28499, 28513, 28517, + 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, + 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, + 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, + 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, + 28817, 28837, 28843, 28859, 28867, 28871, 28879, 28901, 28909, + 28921, 28927, 28933, 28949, 28961, 28979, 29009, 29017, 29021, + 29023, 29027, 29033, 29059, 29063, 29077, 29101, 29123, 29129, + 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191, 29201, + 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, + 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, + 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, + 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, + 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, + 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, + 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, + 29881, 29917, 29921, 29927, 29947, 29959, 29983, 29989, 30011, + 30013, 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, + 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, 30181, + 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259, 30269, + 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, + 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, + 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, + 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, + 30689, 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, + 30781, 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853, + 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, + 30949, 30971, 30977, 30983, 31013, 31019, 31033, 31039, 31051, + 31063, 31069, 31079, 31081, 31091, 31121, 31123, 31139, 31147, + 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193, 31219, + 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271, + 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, + 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, + 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, + 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, + 31699, 31721, 31723, 31727, 31729, 31741, 31751, 31769, 31771, + 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891, + 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, + 32029, 32051, 32057, 32059, 32063, 32069, 32077, 32083, 32089, + 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183, 32189, + 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297, + 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, + 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, + 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, + 32531, 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, + 32603, 32609, 32611, 32621, 32633, 32647, 32653, 32687, 32693, + 32707, 32713, 32717, 32719, 32749, 32771, 32779, 32783, 32789, + 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887, + 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, + 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, + 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149, + 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, + 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, + 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, + 33427, 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, + 33529, 33533, 33547, 33563, 33569, 33577, 33581, 33587, 33589, + 33599, 33601, 33613, 33617, 33619, 33623, 33629, 33637, 33641, + 33647, 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, + 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829, + 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, + 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039, + 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, + 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, + 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, + 34337, 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, + 34439, 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, + 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, 34603, + 34607, 34613, 34631, 34649, 34651, 34667, 34673, 34679, 34687, + 34693, 34703, 34721, 34729, 34739, 34747, 34757, 34759, 34763, + 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877, + 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, + 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, + 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, + 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, + 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, + 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, + 35491, 35507, 35509, 35521, 35527, 35531, 35533, 35537, 35543, + 35569, 35573, 35591, 35593, 35597, 35603, 35617, 35671, 35677, + 35729, 35731, 35747, 35753, 35759, 35771, 35797, 35801, 35803, + 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879, 35897, + 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983, + 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, + 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, + 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, + 36277, 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, + 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469, 36473, + 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, + 36563, 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, + 36653, 36671, 36677, 36683, 36691, 36697, 36709, 36713, 36721, + 36739, 36749, 36761, 36767, 36779, 36781, 36787, 36791, 36793, + 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899, + 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, + 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, + 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, + 37189, 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, + 37307, 37309, 37313, 37321, 37337, 37339, 37357, 37361, 37363, + 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463, 37483, + 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, + 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, + 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693, 37699, + 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847, + 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, + 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, + 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, + 38183, 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, + 38273, 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, + 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, 38453, + 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569, 38593, + 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, + 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, + 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839, + 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, + 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, + 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, + 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, + 39217, 39227, 39229, 39233, 39239, 39241, 39251, 39293, 39301, + 39313, 39317, 39323, 39341, 39343, 39359, 39367, 39371, 39373, + 39383, 39397, 39409, 39419, 39439, 39443, 39451, 39461, 39499, + 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569, 39581, + 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, + 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, + 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, + 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, + 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, + 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, + 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, + 40253, 40277, 40283, 40289, 40343, 40351, 40357, 40361, 40387, + 40423, 40427, 40429, 40433, 40459, 40471, 40483, 40487, 40493, + 40499, 40507, 40519, 40529, 40531, 40543, 40559, 40577, 40583, + 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697, 40699, + 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, + 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, + 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, + 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, + 41081, 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, + 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231, + 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, + 41351, 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, + 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, 41539, + 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611, 41617, + 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681, 41687, + 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, + 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, + 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, + 41981, 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, + 42071, 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, + 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227, + 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, + 42337, 42349, 42359, 42373, 42379, 42391, 42397, 42403, 42407, + 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463, 42467, + 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571, + 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, + 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, + 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, + 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, + 42943, 42953, 42961, 42967, 42979, 42989, 43003, 43013, 43019, + 43037, 43049, 43051, 43063, 43067, 43093, 43103, 43117, 43133, + 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261, + 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, + 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481, 43487, + 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597, + 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, + 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, + 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, + 43933, 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, + 43997, 44017, 44021, 44027, 44029, 44041, 44053, 44059, 44071, + 44087, 44089, 44101, 44111, 44119, 44123, 44129, 44131, 44159, + 44171, 44179, 44189, 44201, 44203, 44207, 44221, 44249, 44257, + 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357, + 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, + 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549, + 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, + 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, + 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, + 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, + 44939, 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, + 45053, 45061, 45077, 45083, 45119, 45121, 45127, 45131, 45137, + 45139, 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, + 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, 45337, + 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433, + 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553, + 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, 45659, + 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, + 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, + 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, + 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, + 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, + 46181, 46183, 46187, 46199, 46219, 46229, 46237, 46261, 46271, + 46273, 46279, 46301, 46307, 46309, 46327, 46337, 46349, 46351, + 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457, 46471, + 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567, + 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, + 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, + 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, + 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, + 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059, 47087, + 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, + 47161, 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, + 47293, 47297, 47303, 47309, 47317, 47339, 47351, 47353, 47363, + 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441, 47459, + 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543, + 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, + 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, + 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, + 47819, 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, + 47933, 47939, 47947, 47951, 47963, 47969, 47977, 47981, 48017, + 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119, 48121, + 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, + 48247, 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, + 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, + 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527, + 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, + 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, + 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, + 48817, 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, + 48889, 48907, 48947, 48953, 48973, 48989, 48991, 49003, 49009, + 49019, 49031, 49033, 49037, 49043, 49057, 49069, 49081, 49103, + 49109, 49117, 49121, 49123, 49139, 49157, 49169, 49171, 49177, + 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, + 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, + 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459, + 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, + 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, + 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, + 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, + 49843, 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, + 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, 50033, + 50047, 50051, 50053, 50069, 50077, 50087, 50093, 50101, 50111, + 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177, 50207, + 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, + 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, + 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, + 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, + 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, + 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, + 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, + 50957, 50969, 50971, 50989, 50993, 51001, 51031, 51043, 51047, + 51059, 51061, 51071, 51109, 51131, 51133, 51137, 51151, 51157, + 51169, 51193, 51197, 51199, 51203, 51217, 51229, 51239, 51241, + 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343, 51347, + 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, + 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, + 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, + 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, + 51683, 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, + 51797, 51803, 51817, 51827, 51829, 51839, 51853, 51859, 51869, + 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, + 51973, 51977, 51991, 52009, 52021, 52027, 52051, 52057, 52067, + 52069, 52081, 52103, 52121, 52127, 52147, 52153, 52163, 52177, + 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, + 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369, + 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, + 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, + 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, + 52709, 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, + 52807, 52813, 52817, 52837, 52859, 52861, 52879, 52883, 52889, + 52901, 52903, 52919, 52937, 52951, 52957, 52963, 52967, 52973, + 52981, 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, + 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, 53161, + 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239, 53267, + 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359, + 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, + 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, + 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, + 53657, 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, + 53777, 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, + 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, 53939, + 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049, + 54059, 54083, 54091, 54101, 54121, 54133, 54139, 54151, 54163, + 54167, 54181, 54193, 54217, 54251, 54269, 54277, 54287, 54293, + 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377, + 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, + 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, + 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, + 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, + 54727, 54751, 54767, 54773, 54779, 54787, 54799, 54829, 54833, + 54851, 54869, 54877, 54881, 54907, 54917, 54919, 54941, 54949, + 54959, 54973, 54979, 54983, 55001, 55009, 55021, 55049, 55051, + 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147, + 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, + 55249, 55259, 55291, 55313, 55331, 55333, 55337, 55339, 55343, + 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, + 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, + 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, + 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, + 55787, 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, + 55837, 55843, 55849, 55871, 55889, 55897, 55901, 55903, 55921, + 55927, 55931, 55933, 55949, 55967, 55987, 55997, 56003, 56009, + 56039, 56041, 56053, 56081, 56087, 56093, 56099, 56101, 56113, + 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, + 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, + 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, + 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, + 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, + 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, + 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, + 56783, 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, + 56891, 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, + 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, 57041, + 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119, 57131, + 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203, + 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, + 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, + 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, + 57529, 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, + 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, + 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, + 57803, 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, + 57901, 57917, 57923, 57943, 57947, 57973, 57977, 57991, 58013, + 58027, 58031, 58043, 58049, 58057, 58061, 58067, 58073, 58099, + 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189, + 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, + 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, + 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, + 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, + 58579, 58601, 58603, 58613, 58631, 58657, 58661, 58679, 58687, + 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763, 58771, + 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, + 58921, 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, + 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069, 59077, + 59083, 59093, 59107, 59113, 59119, 59123, 59141, 59149, 59159, + 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, + 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, + 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, + 59443, 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, + 59539, 59557, 59561, 59567, 59581, 59611, 59617, 59621, 59627, + 59629, 59651, 59659, 59663, 59669, 59671, 59693, 59699, 59707, + 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791, 59797, + 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, + 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, + 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139, + 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, + 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, + 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, + 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, + 60617, 60623, 60631, 60637, 60647, 60649, 60659, 60661, 60679, + 60689, 60703, 60719, 60727, 60733, 60737, 60757, 60761, 60763, + 60773, 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, + 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, 60953, + 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, + 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, + 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, + 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, + 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, + 61543, 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, + 61627, 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, + 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, 61813, + 61819, 61837, 61843, 61861, 61871, 61879, 61909, 61927, 61933, + 61949, 61961, 61967, 61979, 61981, 61987, 61991, 62003, 62011, + 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099, 62119, + 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, + 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, + 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, + 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, + 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, + 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743, + 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, + 62869, 62873, 62897, 62903, 62921, 62927, 62929, 62939, 62969, + 62971, 62981, 62983, 62987, 62989, 63029, 63031, 63059, 63067, + 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149, 63179, + 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311, + 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, + 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, + 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, + 63559, 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, + 63629, 63647, 63649, 63659, 63667, 63671, 63689, 63691, 63697, + 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781, + 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, + 63863, 63901, 63907, 63913, 63929, 63949, 63977, 63997, 64007, + 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, + 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223, + 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, + 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, + 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, + 64601, 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, + 64679, 64693, 64709, 64717, 64747, 64763, 64781, 64783, 64793, + 64811, 64817, 64849, 64853, 64871, 64877, 64879, 64891, 64901, + 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, + 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, + 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171, 65173, + 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287, + 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, + 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, + 65519, 65521, }; #define NPRIMES (sizeof(primes) / sizeof(*primes)) /* - * Generate a prime. We arrange to select a prime with the property - * (prime % modulus) != residue (to speed up use in RSA). + * Generate a prime. We can deal with various extra properties of + * the prime: + * + * - to speed up use in RSA, we can arrange to select a prime with + * the property (prime % modulus) != residue. + * + * - for use in DSA, we can arrange to select a prime which is one + * more than a multiple of a dirty great bignum. In this case + * `bits' gives the size of the factor by which we _multiply_ + * that bignum, rather than the size of the whole number. + * + * - for the basically cosmetic purposes of generating keys of the + * length actually specified rather than off by one bit, we permit + * the caller to provide an unsigned integer 'firstbits' which will + * match the top few bits of the returned prime. (That is, there + * will exist some n such that (returnvalue >> n) == firstbits.) If + * 'firstbits' is not needed, specifying it to either 0 or 1 is + * an adequate no-op. */ -Bignum primegen(int bits, int modulus, int residue, - int phase, progfn_t pfn, void *pfnparam) { - int i, k, v, byte, bitsleft, check, checks; - unsigned long delta, moduli[NPRIMES+1], residues[NPRIMES+1]; - Bignum p, q, wqp, wqp2; +Bignum primegen(int bits, int modulus, int residue, Bignum factor, + int phase, progfn_t pfn, void *pfnparam, unsigned firstbits) +{ + int i, k, v, byte, bitsleft, check, checks, fbsize; + unsigned long delta; + unsigned long moduli[NPRIMES + 1]; + unsigned long residues[NPRIMES + 1]; + unsigned long multipliers[NPRIMES + 1]; + Bignum p, pm1, q, wqp, wqp2; int progress = 0; - byte = 0; bitsleft = 0; + byte = 0; + bitsleft = 0; - STARTOVER: + fbsize = 0; + while (firstbits >> fbsize) /* work out how to align this */ + fbsize++; - pfn(pfnparam, phase, ++progress); + STARTOVER: + + pfn(pfnparam, PROGFN_PROGRESS, phase, ++progress); /* * Generate a k-bit random number with top and bottom bits set. + * Alternatively, if `factor' is nonzero, generate a k-bit + * random number with the top bit set and the bottom bit clear, + * multiply it by `factor', and add one. */ - p = newbn((bits+15)/16); + p = bn_power_2(bits - 1); for (i = 0; i < bits; i++) { - if (i == 0 || i == bits-1) - v = 1; - else { - if (bitsleft <= 0) - bitsleft = 8; byte = random_byte(); - v = byte & 1; - byte >>= 1; - bitsleft--; - } - bignum_set_bit(p, i, v); + if (i == 0 || i == bits - 1) { + v = (i != 0 || !factor) ? 1 : 0; + } else if (i >= bits - fbsize) { + v = (firstbits >> (i - (bits - fbsize))) & 1; + } else { + if (bitsleft <= 0) + bitsleft = 8, byte = random_byte(); + v = byte & 1; + byte >>= 1; + bitsleft--; + } + bignum_set_bit(p, i, v); + } + if (factor) { + Bignum tmp = p; + p = bigmul(tmp, factor); + freebn(tmp); + assert(bignum_bit(p, 0) == 0); + bignum_set_bit(p, 0, 1); } /* * Ensure this random number is coprime to the first few - * primes, by repeatedly adding 2 to it until it is. + * primes, by repeatedly adding either 2 or 2*factor to it + * until it is. */ for (i = 0; i < NPRIMES; i++) { - moduli[i] = primes[i]; - residues[i] = bignum_mod_short(p, primes[i]); + moduli[i] = primes[i]; + residues[i] = bignum_mod_short(p, primes[i]); + if (factor) + multipliers[i] = bignum_mod_short(factor, primes[i]); + else + multipliers[i] = 1; } moduli[NPRIMES] = modulus; - residues[NPRIMES] = bignum_mod_short(p, modulus) + modulus - residue; + residues[NPRIMES] = (bignum_mod_short(p, (unsigned short) modulus) + + modulus - residue); + if (factor) + multipliers[NPRIMES] = bignum_mod_short(factor, modulus); + else + multipliers[NPRIMES] = 1; delta = 0; while (1) { - for (i = 0; i < (sizeof(moduli) / sizeof(*moduli)); i++) - if (!((residues[i] + delta) % moduli[i])) - break; - if (i < (sizeof(moduli) / sizeof(*moduli))) {/* we broke */ - delta += 2; - if (delta < 2) { - freebn(p); - goto STARTOVER; - } - continue; - } - break; + for (i = 0; i < (sizeof(moduli) / sizeof(*moduli)); i++) + if (!((residues[i] + delta * multipliers[i]) % moduli[i])) + break; + if (i < (sizeof(moduli) / sizeof(*moduli))) { /* we broke */ + delta += 2; + if (delta > 65536) { + freebn(p); + goto STARTOVER; + } + continue; + } + break; } q = p; - p = bignum_add_long(q, delta); + if (factor) { + Bignum tmp; + tmp = bignum_from_long(delta); + p = bigmuladd(tmp, factor, q); + freebn(tmp); + } else { + p = bignum_add_long(q, delta); + } freebn(q); /* - * Now apply the Fermat primality test a few times. First work - * out how many checks are needed. + * Now apply the Miller-Rabin primality test a few times. First + * work out how many checks are needed. */ checks = 27; - if (bits >= 150) checks = 18; - if (bits >= 200) checks = 15; - if (bits >= 250) checks = 12; - if (bits >= 300) checks = 9; - if (bits >= 350) checks = 8; - if (bits >= 400) checks = 7; - if (bits >= 450) checks = 6; - if (bits >= 550) checks = 5; - if (bits >= 650) checks = 4; - if (bits >= 850) checks = 3; - if (bits >= 1300) checks = 2; + if (bits >= 150) + checks = 18; + if (bits >= 200) + checks = 15; + if (bits >= 250) + checks = 12; + if (bits >= 300) + checks = 9; + if (bits >= 350) + checks = 8; + if (bits >= 400) + checks = 7; + if (bits >= 450) + checks = 6; + if (bits >= 550) + checks = 5; + if (bits >= 650) + checks = 4; + if (bits >= 850) + checks = 3; + if (bits >= 1300) + checks = 2; /* * Next, write p-1 as q*2^k. */ - for (k = 0; bignum_bit(p, k) == !k; k++); /* find first 1 bit in p-1 */ + for (k = 0; bignum_bit(p, k) == !k; k++) + continue; /* find first 1 bit in p-1 */ q = bignum_rshift(p, k); + /* And store p-1 itself, which we'll need. */ + pm1 = copybn(p); + decbn(pm1); /* * Now, for each check ... */ for (check = 0; check < checks; check++) { - Bignum w; + Bignum w; - /* - * Invent a random number between 1 and p-1 inclusive. - */ - while (1) { - w = newbn((bits+15)/16); - for (i = 0; i < bits; i++) { - if (bitsleft <= 0) - bitsleft = 8; byte = random_byte(); - v = byte & 1; - byte >>= 1; - bitsleft--; - bignum_set_bit(w, i, v); - } - if (bignum_cmp(w, p) >= 0 || bignum_cmp(w, Zero) == 0) { - freebn(w); - continue; - } - break; - } + /* + * Invent a random number between 1 and p-1 inclusive. + */ + while (1) { + w = bn_power_2(bits - 1); + for (i = 0; i < bits; i++) { + if (bitsleft <= 0) + bitsleft = 8, byte = random_byte(); + v = byte & 1; + byte >>= 1; + bitsleft--; + bignum_set_bit(w, i, v); + } + bn_restore_invariant(w); + if (bignum_cmp(w, p) >= 0 || bignum_cmp(w, Zero) == 0) { + freebn(w); + continue; + } + break; + } - pfn(pfnparam, phase, ++progress); + pfn(pfnparam, PROGFN_PROGRESS, phase, ++progress); - /* - * Compute w^q mod p. - */ - wqp = modpow(w, q, p); - freebn(w); + /* + * Compute w^q mod p. + */ + wqp = modpow(w, q, p); + freebn(w); - /* - * See if this is 1, or if it becomes 1 when squared at - * most k times. - */ - if (bignum_cmp(wqp, One) == 0) { - freebn(wqp); - continue; - } - for (i = 0; i < k; i++) { - wqp2 = modmul(wqp, wqp, p); - freebn(wqp); - wqp = wqp2; - if (bignum_cmp(wqp, One) == 0) - break; - } - if (i < k) { - freebn(wqp); - continue; - } + /* + * See if this is 1, or if it is -1, or if it becomes -1 + * when squared at most k-1 times. + */ + if (bignum_cmp(wqp, One) == 0 || bignum_cmp(wqp, pm1) == 0) { + freebn(wqp); + continue; + } + for (i = 0; i < k - 1; i++) { + wqp2 = modmul(wqp, wqp, p); + freebn(wqp); + wqp = wqp2; + if (bignum_cmp(wqp, pm1) == 0) + break; + } + if (i < k - 1) { + freebn(wqp); + continue; + } - /* - * It didn't. Therefore, w is a witness for the - * compositeness of p. - */ - freebn(p); - freebn(q); - goto STARTOVER; + /* + * It didn't. Therefore, w is a witness for the + * compositeness of p. + */ + freebn(wqp); + freebn(p); + freebn(pm1); + freebn(q); + goto STARTOVER; } /* * We have a prime! */ freebn(q); + freebn(pm1); return p; } + +/* + * Invent a pair of values suitable for use as 'firstbits' in the + * above function, such that their product is at least 2. + * + * This is used for generating both RSA and DSA keys which have + * exactly the specified number of bits rather than one fewer - if you + * generate an a-bit and a b-bit number completely at random and + * multiply them together, you could end up with either an (ab-1)-bit + * number or an (ab)-bit number. The former happens log(2)*2-1 of the + * time (about 39%) and, though actually harmless, every time it + * occurs it has a non-zero probability of sparking a user email along + * the lines of 'Hey, I asked PuTTYgen for a 2048-bit key and I only + * got 2047 bits! Bug!' + */ +void invent_firstbits(unsigned *one, unsigned *two) +{ + /* + * Our criterion is that any number in the range [one,one+1) + * multiplied by any number in the range [two,two+1) should have + * the highest bit set. It should be clear that we can trivially + * test this by multiplying the smallest values in each interval, + * i.e. the ones we actually invented. + */ + do { + *one = 0x100 | random_byte(); + *two = 0x100 | random_byte(); + } while (*one * *two < 0x20000); +}