File Coverage

blib/lib/VOMS/Lite/RSAKey.pm
Criterion Covered Total %
statement 149 262 56.8
branch 65 162 40.1
condition 22 49 44.9
subroutine 8 12 66.6
pod 8 8 100.0
total 252 493 51.1


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package VOMS::Lite::RSAKey;
4              
5 1     1   6 use Math::BigInt lib => 'GMP';
  1         3  
  1         11  
6 1     1   1247 use 5.004;
  1         4  
  1         38  
7 1     1   6 use strict;
  1         1  
  1         53  
8             require Exporter;
9 1     1   5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  1         27  
  1         9402  
10             @ISA = qw(Exporter);
11              
12             $VERSION = '0.20';
13              
14             my $DefaultRandom=undef;
15             my ($CryptCtx,$Generator);
16             my $urdev="/dev/urandom";
17             if ( -c $urdev && -r $urdev ) { $DefaultRandom="/dev/urandom"; }
18             elsif ( -l $urdev && -r $urdev ) {
19             my $link=$urdev;
20             while ( -l $link ) {
21             my ($dir) = $link =~ m{(.*?)[^/]*$};
22             $link = readlink($link);
23             $link =~ s#^([^/])#$dir$1#;
24             $link =~ s#//#/#g;
25             $link =~ s#/[^/]*/../##g;
26             }
27             if ( -c $link && -r $link ) { $DefaultRandom=$link; }
28             }
29             else { # If no /dev/random perhaps we are in win32
30             eval '
31             use WIN32::API;
32             sub WinRandom {
33             my $CryptCtx=new Win32::API "advapi32","CryptAcquireContextA","PNNNN","N" or die "Cannot Create Crypt CTX";
34             my $Generator=new Win32::API "advapi32", "CryptGenRandom","NNP","N"||die "Cannot Access Random Generator";
35             my $bytes=shift;
36             my $rnd = 0x00 x $bytes; #i.e. char rnd[$bytes];
37             my $CSPHandle = 0x00 x 4; #i.e. void* CSPHandle;
38             my ($DEFAULTCONTAINER,$DEFAULTPROVIDER,$PROV_RSA_FULL,$CRYPT_VERIFYCONTEXT)=(0,0,1,0xF0000000);
39             $CryptCtx->Call($CSPHandle,$DEFAULTCONTAINER,$DEFAULTPROVIDER,$PROV_RSA_FULL,$CRYPT_VERIFYCONTEXT);
40             my $Addr=unpack("L",$CSPHandle);
41             $Generator->Call($Addr,$bytes,$rnd);
42             return $rnd;
43             }
44             $DefaultRandom=\\&WinRandom;
45             ';
46             if ( $@ ) { die "No random source at either $urdev via the filesystem or CryptGenRandom via WIN32::API";}
47             }
48              
49             sub Random {
50              
51 947     947 1 163504 my %input = %{ $_[0] };
  947         5101  
52 947         2195 my $Random=$DefaultRandom;
53 947 50       4049 if ( defined $input{'RandomFile'} ) { $Random=$input{'RandomFile'}; }
  0         0  
54              
55             #Define Lower if not defined
56 947 100       3356 if ( ! defined ( $input{'Lower'} ) ) { $input{'Lower'} = Math::BigInt->bzero(); }
  4         40  
57 947 100       3629 if ( ref($input{'Lower'}) ne "Math::BigInt" ) { $input{'Lower'} = Math::BigInt->new("$input{Lower}"); }
  939         4363  
58              
59             #Is Size specified in bits?
60 947 100       27906 my $SizeInBits = ( defined ( $input{'Bits'} ) )?"yes":"no";
61              
62             #Set range = upper - lower
63 947 100       3663 if ( defined ( $input{'Upper'} ) ) {
64 943 50       3326 if ( ref($input{'Upper'}) ne "Math::BigInt" ) { $input{'Upper'} = Math::BigInt->new("$input{Upper}"); }
  0         0  
65 943         3532 $input{'Range'} = $input{'Upper'}->bsub($input{'Lower'});
66 943 100       83051 if ( defined $input{'Parity'} ) {
67 4         18 $input{'Range'}->bdiv(2);
68 4 100 50     663 if ( $input{'Parity'} =~ /^o/i xor $input{'Lower'}->is_odd() ) {
69 2         45 $input{'Lower'}->binc();
70 2         191 $input{'Range'}->bdec();
71             }
72             }
73 943         3709 $input{'Bits'} = length($input{'Range'}->as_bin())-2;
74             }
75              
76 947 50       629100 die 'No bits selected' if ! defined $input{'Bits'};
77              
78             #Read in bytes from random
79 947         1863 my $VAL;
80 947         4500 my $max=int(($input{'Bits'}+7) / 8 );
81 947 50       3920 if ( ref($Random) eq "CODE" ) { #this is the windows stuff
82 0         0 my $max=int(($input{'Bits'}+7) / 8 );
83 0         0 $VAL=&{ $Random }($max);
  0         0  
84 0 0       0 if ( $SizeInBits eq "yes" ) { $VAL =~ s/^./$& | chr(128)/es; }
  0         0  
  0         0  
85 0         0 $VAL=~ s/./unpack('H2',$&)/ges;
  0         0  
86             }
87             else { #this is the *nix stuff
88 947         81732 open (RND,"<$Random");
89 947         4174 my $count=0;
90 947         2824 while ( $count < $max ) {
91 30459         32934 $count ++;
92 30459         30624 my $char;
93 30459 50       956092 if ( read(RND,$char,1) != 1 ) { die "Not enough data for random read"; }
  0         0  
94 30459 100 100     64289 if ( $SizeInBits eq "yes" && $count == 1 && ord($char) < 128) { $char = $char | chr(128); }
  3   100     11  
95 30459         71618 my $hexchar=unpack('H2',$char);
96 30459         72514 $VAL .= $hexchar;
97             }
98 947         109026 close RND;
99             }
100              
101 947         9841 $VAL =~ s/^.(..)*$/0$&/; # Make even number of hex couplets
102 947         7226 my $x=Math::BigInt->new("0x$VAL");
103             # Scale down to range
104 947 100       709361 if ( defined $input{'Range'} ) {
105 943         4107 my $tmp=Math::BigInt->new(256)->bpow( $max );
106 943         385556 my ($quo,$rem)=$x->bmul($input{'Range'})->bdiv( $tmp );
107 943 100       771395 if ( $rem->bmul(2)->bcmp($tmp) != -1 ) { $x->binc(); }
  462         72927  
108             }
109              
110 947 100       98185 if ( $SizeInBits eq "no" ) {
111 943 100       2985 if ( defined $input{'Parity'} ) { $x->bmul(2); }
  4         16  
112 943 50       3606 if ( defined $input{'Lower'} ) { $x->badd($input{'Lower'}); }
  943         4829  
113             } else {
114 4 100 66     36 if ( $input{'Parity'} =~ /^o/i && $x->is_even() ) { $x->binc(); }
  2         40  
115 4 50 33     139 if ( $input{'Parity'} =~ /^e/i && $x->is_odd() ) { $x->bdec(); }
  0         0  
116             }
117              
118 947         61272 return $x;
119             }
120              
121             my @primes = ( 2,3,5,7,11,13,17,19,23,
122             29,31,37,41,43,47,53,59,
123             61,67,71,73,79,83,89,97,
124             101,103,107,109,113,127,131,137,
125             139,149,151,157,163,167,173,179,
126             181,191,193,197,199,211,223,227,
127             229,233,239,241,251,257,263,269,
128             271,277,281,283,293,307,311,313,
129             317,331,337,347,349,353,359,367,
130             373,379,383,389,397,401,409,419,
131             421,431,433,439,443,449,457,461,
132             463,467,479,487,491,499,503,509,
133             521,523,541,547,557,563,569,571,
134             577,587,593,599,601,607,613,617,
135             619,631,641,643,647,653,659,661,
136             673,677,683,691,701,709,719,727,
137             733,739,743,751,757,761,769,773,
138             787,797,809,811,821,823,827,829,
139             839,853,857,859,863,877,881,883,
140             887,907,911,919,929,937,941,947,
141             953,967,971,977,983,991,997,1009,
142             1013,1019,1021,1031,1033,1039,1049,1051,
143             1061,1063,1069,1087,1091,1093,1097,1103,
144             1109,1117,1123,1129,1151,1153,1163,1171,
145             1181,1187,1193,1201,1213,1217,1223,1229,
146             1231,1237,1249,1259,1277,1279,1283,1289,
147             1291,1297,1301,1303,1307,1319,1321,1327,
148             1361,1367,1373,1381,1399,1409,1423,1427,
149             1429,1433,1439,1447,1451,1453,1459,1471,
150             1481,1483,1487,1489,1493,1499,1511,1523,
151             1531,1543,1549,1553,1559,1567,1571,1579,
152             1583,1597,1601,1607,1609,1613,1619,1621,
153             1627,1637,1657,1663,1667,1669,1693,1697,
154             1699,1709,1721,1723,1733,1741,1747,1753,
155             1759,1777,1783,1787,1789,1801,1811,1823,
156             1831,1847,1861,1867,1871,1873,1877,1879,
157             1889,1901,1907,1913,1931,1933,1949,1951,
158             1973,1979,1987,1993,1997,1999,2003,2011,
159             2017,2027,2029,2039,2053,2063,2069,2081,
160             2083,2087,2089,2099,2111,2113,2129,2131,
161             2137,2141,2143,2153,2161,2179,2203,2207,
162             2213,2221,2237,2239,2243,2251,2267,2269,
163             2273,2281,2287,2293,2297,2309,2311,2333,
164             2339,2341,2347,2351,2357,2371,2377,2381,
165             2383,2389,2393,2399,2411,2417,2423,2437,
166             2441,2447,2459,2467,2473,2477,2503,2521,
167             2531,2539,2543,2549,2551,2557,2579,2591,
168             2593,2609,2617,2621,2633,2647,2657,2659,
169             2663,2671,2677,2683,2687,2689,2693,2699,
170             2707,2711,2713,2719,2729,2731,2741,2749,
171             2753,2767,2777,2789,2791,2797,2801,2803,
172             2819,2833,2837,2843,2851,2857,2861,2879,
173             2887,2897,2903,2909,2917,2927,2939,2953,
174             2957,2963,2969,2971,2999,3001,3011,3019,
175             3023,3037,3041,3049,3061,3067,3079,3083,
176             3089,3109,3119,3121,3137,3163,3167,3169,
177             3181,3187,3191,3203,3209,3217,3221,3229,
178             3251,3253,3257,3259,3271,3299,3301,3307,
179             3313,3319,3323,3329,3331,3343,3347,3359,
180             3361,3371,3373,3389,3391,3407,3413,3433,
181             3449,3457,3461,3463,3467,3469,3491,3499,
182             3511,3517,3527,3529,3533,3539,3541,3547,
183             3557,3559,3571,3581,3583,3593,3607,3613,
184             3617,3623,3631,3637,3643,3659,3671,3673,
185             3677,3691,3697,3701,3709,3719,3727,3733,
186             3739,3761,3767,3769,3779,3793,3797,3803,
187             3821,3823,3833,3847,3851,3853,3863,3877,
188             3881,3889,3907,3911,3917,3919,3923,3929,
189             3931,3943,3947,3967,3989,4001,4003,4007,
190             4013,4019,4021,4027,4049,4051,4057,4073,
191             4079,4091,4093,4099,4111,4127,4129,4133,
192             4139,4153,4157,4159,4177,4201,4211,4217,
193             4219,4229,4231,4241,4243,4253,4259,4261,
194             4271,4273,4283,4289,4297,4327,4337,4339,
195             4349,4357,4363,4373,4391,4397,4409,4421,
196             4423,4441,4447,4451,4457,4463,4481,4483,
197             4493,4507,4513,4517,4519,4523,4547,4549,
198             4561,4567,4583,4591,4597,4603,4621,4637,
199             4639,4643,4649,4651,4657,4663,4673,4679,
200             4691,4703,4721,4723,4729,4733,4751,4759,
201             4783,4787,4789,4793,4799,4801,4813,4817,
202             4831,4861,4871,4877,4889,4903,4909,4919,
203             4931,4933,4937,4943,4951,4957,4967,4969,
204             4973,4987,4993,4999,5003,5009,5011,5021,
205             5023,5039,5051,5059,5077,5081,5087,5099,
206             5101,5107,5113,5119,5147,5153,5167,5171,
207             5179,5189,5197,5209,5227,5231,5233,5237,
208             5261,5273,5279,5281,5297,5303,5309,5323,
209             5333,5347,5351,5381,5387,5393,5399,5407,
210             5413,5417,5419,5431,5437,5441,5443,5449,
211             5471,5477,5479,5483,5501,5503,5507,5519,
212             5521,5527,5531,5557,5563,5569,5573,5581,
213             5591,5623,5639,5641,5647,5651,5653,5657,
214             5659,5669,5683,5689,5693,5701,5711,5717,
215             5737,5741,5743,5749,5779,5783,5791,5801,
216             5807,5813,5821,5827,5839,5843,5849,5851,
217             5857,5861,5867,5869,5879,5881,5897,5903,
218             5923,5927,5939,5953,5981,5987,6007,6011,
219             6029,6037,6043,6047,6053,6067,6073,6079,
220             6089,6091,6101,6113,6121,6131,6133,6143,
221             6151,6163,6173,6197,6199,6203,6211,6217,
222             6221,6229,6247,6257,6263,6269,6271,6277,
223             6287,6299,6301,6311,6317,6323,6329,6337,
224             6343,6353,6359,6361,6367,6373,6379,6389,
225             6397,6421,6427,6449,6451,6469,6473,6481,
226             6491,6521,6529,6547,6551,6553,6563,6569,
227             6571,6577,6581,6599,6607,6619,6637,6653,
228             6659,6661,6673,6679,6689,6691,6701,6703,
229             6709,6719,6733,6737,6761,6763,6779,6781,
230             6791,6793,6803,6823,6827,6829,6833,6841,
231             6857,6863,6869,6871,6883,6899,6907,6911,
232             6917,6947,6949,6959,6961,6967,6971,6977,
233             6983,6991,6997,7001,7013,7019,7027,7039,
234             7043,7057,7069,7079,7103,7109,7121,7127,
235             7129,7151,7159,7177,7187,7193,7207,7211,
236             7213,7219,7229,7237,7243,7247,7253,7283,
237             7297,7307,7309,7321,7331,7333,7349,7351,
238             7369,7393,7411,7417,7433,7451,7457,7459,
239             7477,7481,7487,7489,7499,7507,7517,7523,
240             7529,7537,7541,7547,7549,7559,7561,7573,
241             7577,7583,7589,7591,7603,7607,7621,7639,
242             7643,7649,7669,7673,7681,7687,7691,7699,
243             7703,7717,7723,7727,7741,7753,7757,7759,
244             7789,7793,7817,7823,7829,7841,7853,7867,
245             7873,7877,7879,7883,7901,7907,7919,7927,
246             7933,7937,7949,7951,7963,7993,8009,8011,
247             8017,8039,8053,8059,8069,8081,8087,8089,
248             8093,8101,8111,8117,8123,8147,8161,8167,
249             8171,8179,8191,8209,8219,8221,8231,8233,
250             8237,8243,8263,8269,8273,8287,8291,8293,
251             8297,8311,8317,8329,8353,8363,8369,8377,
252             8387,8389,8419,8423,8429,8431,8443,8447,
253             8461,8467,8501,8513,8521,8527,8537,8539,
254             8543,8563,8573,8581,8597,8599,8609,8623,
255             8627,8629,8641,8647,8663,8669,8677,8681,
256             8689,8693,8699,8707,8713,8719,8731,8737,
257             8741,8747,8753,8761,8779,8783,8803,8807,
258             8819,8821,8831,8837,8839,8849,8861,8863,
259             8867,8887,8893,8923,8929,8933,8941,8951,
260             8963,8969,8971,8999,9001,9007,9011,9013,
261             9029,9041,9043,9049,9059,9067,9091,9103,
262             9109,9127,9133,9137,9151,9157,9161,9173,
263             9181,9187,9199,9203,9209,9221,9227,9239,
264             9241,9257,9277,9281,9283,9293,9311,9319,
265             9323,9337,9341,9343,9349,9371,9377,9391,
266             9397,9403,9413,9419,9421,9431,9433,9437,
267             9439,9461,9463,9467,9473,9479,9491,9497,
268             9511,9521,9533,9539,9547,9551,9587,9601,
269             9613,9619,9623,9629,9631,9643,9649,9661,
270             9677,9679,9689,9697,9719,9721,9733,9739,
271             9743,9749,9767,9769,9781,9787,9791,9803,
272             9811,9817,9829,9833,9839,9851,9857,9859,
273             9871,9883,9887,9901,9907,9923,9929,9931,
274             9941,9949,9967,9973,10007,10009,10037,10039,
275             10061,10067,10069,10079,10091,10093,10099,10103,
276             10111,10133,10139,10141,10151,10159,10163,10169,
277             10177,10181,10193,10211,10223,10243,10247,10253,
278             10259,10267,10271,10273,10289,10301,10303,10313,
279             10321,10331,10333,10337,10343,10357,10369,10391,
280             10399,10427,10429,10433,10453,10457,10459,10463,
281             10477,10487,10499,10501,10513,10529,10531,10559,
282             10567,10589,10597,10601,10607,10613,10627,10631,
283             10639,10651,10657,10663,10667,10687,10691,10709,
284             10711,10723,10729,10733,10739,10753,10771,10781,
285             10789,10799,10831,10837,10847,10853,10859,10861,
286             10867,10883,10889,10891,10903,10909,10937,10939,
287             10949,10957,10973,10979,10987,10993,11003,11027,
288             11047,11057,11059,11069,11071,11083,11087,11093,
289             11113,11117,11119,11131,11149,11159,11161,11171,
290             11173,11177,11197,11213,11239,11243,11251,11257,
291             11261,11273,11279,11287,11299,11311,11317,11321,
292             11329,11351,11353,11369,11383,11393,11399,11411,
293             11423,11437,11443,11447,11467,11471,11483,11489,
294             11491,11497,11503,11519,11527,11549,11551,11579,
295             11587,11593,11597,11617,11621,11633,11657,11677,
296             11681,11689,11699,11701,11717,11719,11731,11743,
297             11777,11779,11783,11789,11801,11807,11813,11821,
298             11827,11831,11833,11839,11863,11867,11887,11897,
299             11903,11909,11923,11927,11933,11939,11941,11953,
300             11959,11969,11971,11981,11987,12007,12011,12037,
301             12041,12043,12049,12071,12073,12097,12101,12107,
302             12109,12113,12119,12143,12149,12157,12161,12163,
303             12197,12203,12211,12227,12239,12241,12251,12253,
304             12263,12269,12277,12281,12289,12301,12323,12329,
305             12343,12347,12373,12377,12379,12391,12401,12409,
306             12413,12421,12433,12437,12451,12457,12473,12479,
307             12487,12491,12497,12503,12511,12517,12527,12539,
308             12541,12547,12553,12569,12577,12583,12589,12601,
309             12611,12613,12619,12637,12641,12647,12653,12659,
310             12671,12689,12697,12703,12713,12721,12739,12743,
311             12757,12763,12781,12791,12799,12809,12821,12823,
312             12829,12841,12853,12889,12893,12899,12907,12911,
313             12917,12919,12923,12941,12953,12959,12967,12973,
314             12979,12983,13001,13003,13007,13009,13033,13037,
315             13043,13049,13063,13093,13099,13103,13109,13121,
316             13127,13147,13151,13159,13163,13171,13177,13183,
317             13187,13217,13219,13229,13241,13249,13259,13267,
318             13291,13297,13309,13313,13327,13331,13337,13339,
319             13367,13381,13397,13399,13411,13417,13421,13441,
320             13451,13457,13463,13469,13477,13487,13499,13513,
321             13523,13537,13553,13567,13577,13591,13597,13613,
322             13619,13627,13633,13649,13669,13679,13681,13687,
323             13691,13693,13697,13709,13711,13721,13723,13729,
324             13751,13757,13759,13763,13781,13789,13799,13807,
325             13829,13831,13841,13859,13873,13877,13879,13883,
326             13901,13903,13907,13913,13921,13931,13933,13963,
327             13967,13997,13999,14009,14011,14029,14033,14051,
328             14057,14071,14081,14083,14087,14107,14143,14149,
329             14153,14159,14173,14177,14197,14207,14221,14243,
330             14249,14251,14281,14293,14303,14321,14323,14327,
331             14341,14347,14369,14387,14389,14401,14407,14411,
332             14419,14423,14431,14437,14447,14449,14461,14479,
333             14489,14503,14519,14533,14537,14543,14549,14551,
334             14557,14561,14563,14591,14593,14621,14627,14629,
335             14633,14639,14653,14657,14669,14683,14699,14713,
336             14717,14723,14731,14737,14741,14747,14753,14759,
337             14767,14771,14779,14783,14797,14813,14821,14827,
338             14831,14843,14851,14867,14869,14879,14887,14891,
339             14897,14923,14929,14939,14947,14951,14957,14969,
340             14983,15013,15017,15031,15053,15061,15073,15077,
341             15083,15091,15101,15107,15121,15131,15137,15139,
342             15149,15161,15173,15187,15193,15199,15217,15227,
343             15233,15241,15259,15263,15269,15271,15277,15287,
344             15289,15299,15307,15313,15319,15329,15331,15349,
345             15359,15361,15373,15377,15383,15391,15401,15413,
346             15427,15439,15443,15451,15461,15467,15473,15493,
347             15497,15511,15527,15541,15551,15559,15569,15581,
348             15583,15601,15607,15619,15629,15641,15643,15647,
349             15649,15661,15667,15671,15679,15683,15727,15731,
350             15733,15737,15739,15749,15761,15767,15773,15787,
351             15791,15797,15803,15809,15817,15823,15859,15877,
352             15881,15887,15889,15901,15907,15913,15919,15923,
353             15937,15959,15971,15973,15991,16001,16007,16033,
354             16057,16061,16063,16067,16069,16073,16087,16091,
355             16097,16103,16111,16127,16139,16141,16183,16187,
356             16189,16193,16217,16223,16229,16231,16249,16253,
357             16267,16273,16301,16319,16333,16339,16349,16361,
358             16363,16369,16381,16411,16417,16421,16427,16433,
359             16447,16451,16453,16477,16481,16487,16493,16519,
360             16529,16547,16553,16561,16567,16573,16603,16607,
361             16619,16631,16633,16649,16651,16657,16661,16673,
362             16691,16693,16699,16703,16729,16741,16747,16759,
363             16763,16787,16811,16823,16829,16831,16843,16871,
364             16879,16883,16889,16901,16903,16921,16927,16931,
365             16937,16943,16963,16979,16981,16987,16993,17011,
366             17021,17027,17029,17033,17041,17047,17053,17077,
367             17093,17099,17107,17117,17123,17137,17159,17167,
368             17183,17189,17191,17203,17207,17209,17231,17239,
369             17257,17291,17293,17299,17317,17321,17327,17333,
370             17341,17351,17359,17377,17383,17387,17389,17393,
371             17401,17417,17419,17431,17443,17449,17467,17471,
372             17477,17483,17489,17491,17497,17509,17519,17539,
373             17551,17569,17573,17579,17581,17597,17599,17609,
374             17623,17627,17657,17659,17669,17681,17683,17707,
375             17713,17729,17737,17747,17749,17761,17783,17789,
376             17791,17807,17827,17837,17839,17851,17863,17881,
377             17891,17903,17909,17911,17921,17923,17929,17939,
378             17957,17959,17971,17977,17981,17987,17989,18013,
379             18041,18043,18047,18049,18059,18061,18077,18089,
380             18097,18119,18121,18127,18131,18133,18143,18149,
381             18169,18181,18191,18199,18211,18217,18223,18229,
382             18233,18251,18253,18257,18269,18287,18289,18301,
383             18307,18311,18313,18329,18341,18353,18367,18371,
384             18379,18397,18401,18413,18427,18433,18439,18443,
385             18451,18457,18461,18481,18493,18503,18517,18521,
386             18523,18539,18541,18553,18583,18587,18593,18617,
387             18637,18661,18671,18679,18691,18701,18713,18719,
388             18731,18743,18749,18757,18773,18787,18793,18797,
389             18803,18839,18859,18869,18899,18911,18913,18917,
390             18919,18947,18959,18973,18979,19001,19009,19013,
391             19031,19037,19051,19069,19073,19079,19081,19087,
392             19121,19139,19141,19157,19163,19181,19183,19207,
393             19211,19213,19219,19231,19237,19249,19259,19267,
394             19273,19289,19301,19309,19319,19333,19373,19379,
395             19381,19387,19391,19403,19417,19421,19423,19427,
396             19429,19433,19441,19447,19457,19463,19469,19471,
397             19477,19483,19489,19501,19507,19531,19541,19543,
398             19553,19559,19571,19577,19583,19597,19603,19609,
399             19661,19681,19687,19697,19699,19709,19717,19727,
400             19739,19751,19753,19759,19763,19777,19793,19801,
401             19813,19819,19841,19843,19853,19861,19867,19889,
402             19891,19913,19919,19927,19937,19949,19961,19963,
403             19973,19979,19991,19993,19997,20011,20021,20023,
404             20029,20047,20051,20063,20071,20089,20101,20107,
405             20113,20117,20123,20129,20143,20147,20149,20161,
406             20173,20177,20183,20201,20219,20231,20233,20249,
407             20261,20269,20287,20297,20323,20327,20333,20341,
408             20347,20353,20357,20359,20369,20389,20393,20399,
409             20407,20411,20431,20441,20443,20477,20479,20483,
410             20507,20509,20521,20533,20543,20549,20551,20563,
411             20593,20599,20611,20627,20639,20641,20663,20681,
412             20693,20707,20717,20719,20731,20743,20747,20749,
413             20753,20759,20771,20773,20789,20807,20809,20849,
414             20857,20873,20879,20887,20897,20899,20903,20921,
415             20929,20939,20947,20959,20963,20981,20983,21001,
416             21011,21013,21017,21019,21023,21031,21059,21061,
417             21067,21089,21101,21107,21121,21139,21143,21149,
418             21157,21163,21169,21179,21187,21191,21193,21211,
419             21221,21227,21247,21269,21277,21283,21313,21317,
420             21319,21323,21341,21347,21377,21379,21383,21391,
421             21397,21401,21407,21419,21433,21467,21481,21487,
422             21491,21493,21499,21503,21517,21521,21523,21529,
423             21557,21559,21563,21569,21577,21587,21589,21599,
424             21601,21611,21613,21617,21647,21649,21661,21673,
425             21683,21701,21713,21727,21737,21739,21751,21757,
426             21767,21773,21787,21799,21803,21817,21821,21839,
427             21841,21851,21859,21863,21871,21881,21893,21911,
428             21929,21937,21943,21961,21977,21991,21997,22003,
429             22013,22027,22031,22037,22039,22051,22063,22067,
430             22073,22079,22091,22093,22109,22111,22123,22129,
431             22133,22147,22153,22157,22159,22171,22189,22193,
432             22229,22247,22259,22271,22273,22277,22279,22283,
433             22291,22303,22307,22343,22349,22367,22369,22381,
434             22391,22397,22409,22433,22441,22447,22453,22469,
435             22481,22483,22501,22511,22531,22541,22543,22549,
436             22567,22571,22573,22613,22619,22621,22637,22639,
437             22643,22651,22669,22679,22691,22697,22699,22709,
438             22717,22721,22727,22739,22741,22751,22769,22777,
439             22783,22787,22807,22811,22817,22853,22859,22861,
440             22871,22877,22901,22907,22921,22937,22943,22961,
441             22963,22973,22993,23003,23011,23017,23021,23027,
442             23029,23039,23041,23053,23057,23059,23063,23071,
443             23081,23087,23099,23117,23131,23143,23159,23167,
444             23173,23189,23197,23201,23203,23209,23227,23251,
445             23269,23279,23291,23293,23297,23311,23321,23327,
446             23333,23339,23357,23369,23371,23399,23417,23431,
447             23447,23459,23473,23497,23509,23531,23537,23539,
448             23549,23557,23561,23563,23567,23581,23593,23599,
449             23603,23609,23623,23627,23629,23633,23663,23669,
450             23671,23677,23687,23689,23719,23741,23743,23747,
451             23753,23761,23767,23773,23789,23801,23813,23819,
452             23827,23831,23833,23857,23869,23873,23879,23887,
453             23893,23899,23909,23911,23917,23929,23957,23971,
454             23977,23981,23993,24001,24007,24019,24023,24029,
455             24043,24049,24061,24071,24077,24083,24091,24097,
456             24103,24107,24109,24113,24121,24133,24137,24151,
457             24169,24179,24181,24197,24203,24223,24229,24239,
458             24247,24251,24281,24317,24329,24337,24359,24371,
459             24373,24379,24391,24407,24413,24419,24421,24439,
460             24443,24469,24473,24481,24499,24509,24517,24527,
461             24533,24547,24551,24571,24593,24611,24623,24631,
462             24659,24671,24677,24683,24691,24697,24709,24733,
463             24749,24763,24767,24781,24793,24799,24809,24821,
464             24841,24847,24851,24859,24877,24889,24907,24917,
465             24919,24923,24943,24953,24967,24971,24977,24979,
466             24989,25013,25031,25033,25037,25057,25073,25087,
467             25097,25111,25117,25121,25127,25147,25153,25163,
468             25169,25171,25183,25189,25219,25229,25237,25243,
469             25247,25253,25261,25301,25303,25307,25309,25321,
470             25339,25343,25349,25357,25367,25373,25391,25409,
471             25411,25423,25439,25447,25453,25457,25463,25469,
472             25471,25523,25537,25541,25561,25577,25579,25583,
473             25589,25601,25603,25609,25621,25633,25639,25643,
474             25657,25667,25673,25679,25693,25703,25717,25733,
475             25741,25747,25759,25763,25771,25793,25799,25801,
476             25819,25841,25847,25849,25867,25873,25889,25903,
477             25913,25919,25931,25933,25939,25943,25951,25969,
478             25981,25997,25999,26003,26017,26021,26029,26041,
479             26053,26083,26099,26107,26111,26113,26119,26141,
480             26153,26161,26171,26177,26183,26189,26203,26209,
481             26227,26237,26249,26251,26261,26263,26267,26293,
482             26297,26309,26317,26321,26339,26347,26357,26371,
483             26387,26393,26399,26407,26417,26423,26431,26437,
484             26449,26459,26479,26489,26497,26501,26513,26539,
485             26557,26561,26573,26591,26597,26627,26633,26641,
486             26647,26669,26681,26683,26687,26693,26699,26701,
487             26711,26713,26717,26723,26729,26731,26737,26759,
488             26777,26783,26801,26813,26821,26833,26839,26849,
489             26861,26863,26879,26881,26891,26893,26903,26921,
490             26927,26947,26951,26953,26959,26981,26987,26993,
491             27011,27017,27031,27043,27059,27061,27067,27073,
492             27077,27091,27103,27107,27109,27127,27143,27179,
493             27191,27197,27211,27239,27241,27253,27259,27271,
494             27277,27281,27283,27299,27329,27337,27361,27367,
495             27397,27407,27409,27427,27431,27437,27449,27457,
496             27479,27481,27487,27509,27527,27529,27539,27541,
497             27551,27581,27583,27611,27617,27631,27647,27653,
498             27673,27689,27691,27697,27701,27733,27737,27739,
499             27743,27749,27751,27763,27767,27773,27779,27791,
500             27793,27799,27803,27809,27817,27823,27827,27847,
501             27851,27883,27893,27901,27917,27919,27941,27943,
502             27947,27953,27961,27967,27983,27997,28001,28019,
503             28027,28031,28051,28057,28069,28081,28087,28097,
504             28099,28109,28111,28123,28151,28163,28181,28183,
505             28201,28211,28219,28229,28277,28279,28283,28289,
506             28297,28307,28309,28319,28349,28351,28387,28393,
507             28403,28409,28411,28429,28433,28439,28447,28463,
508             28477,28493,28499,28513,28517,28537,28541,28547,
509             28549,28559,28571,28573,28579,28591,28597,28603,
510             28607,28619,28621,28627,28631,28643,28649,28657,
511             28661,28663,28669,28687,28697,28703,28711,28723,
512             28729,28751,28753,28759,28771,28789,28793,28807,
513             28813,28817,28837,28843,28859,28867,28871,28879,
514             28901,28909,28921,28927,28933,28949,28961,28979,
515             29009,29017,29021,29023,29027,29033,29059,29063,
516             29077,29101,29123,29129,29131,29137,29147,29153,
517             29167,29173,29179,29191,29201,29207,29209,29221,
518             29231,29243,29251,29269,29287,29297,29303,29311,
519             29327,29333,29339,29347,29363,29383,29387,29389,
520             29399,29401,29411,29423,29429,29437,29443,29453,
521             29473,29483,29501,29527,29531,29537,29567,29569,
522             29573,29581,29587,29599,29611,29629,29633,29641,
523             29663,29669,29671,29683,29717,29723,29741,29753,
524             29759,29761,29789,29803,29819,29833,29837,29851,
525             29863,29867,29873,29879,29881,29917,29921,29927,
526             29947,29959,29983,29989,30011,30013,30029,30047,
527             30059,30071,30089,30091,30097,30103,30109,30113,
528             30119,30133,30137,30139,30161,30169,30181,30187,
529             30197,30203,30211,30223,30241,30253,30259,30269,
530             30271,30293,30307,30313,30319,30323,30341,30347,
531             30367,30389,30391,30403,30427,30431,30449,30467,
532             30469,30491,30493,30497,30509,30517,30529,30539,
533             30553,30557,30559,30577,30593,30631,30637,30643,
534             30649,30661,30671,30677,30689,30697,30703,30707,
535             30713,30727,30757,30763,30773,30781,30803,30809,
536             30817,30829,30839,30841,30851,30853,30859,30869,
537             30871,30881,30893,30911,30931,30937,30941,30949,
538             30971,30977,30983,31013,31019,31033,31039,31051,
539             31063,31069,31079,31081,31091,31121,31123,31139,
540             31147,31151,31153,31159,31177,31181,31183,31189,
541             31193,31219,31223,31231,31237,31247,31249,31253,
542             31259,31267,31271,31277,31307,31319,31321,31327,
543             31333,31337,31357,31379,31387,31391,31393,31397,
544             31469,31477,31481,31489,31511,31513,31517,31531,
545             31541,31543,31547,31567,31573,31583,31601,31607,
546             31627,31643,31649,31657,31663,31667,31687,31699,
547             31721,31723,31727,31729,31741,31751,31769,31771,
548             31793,31799,31817,31847,31849,31859,31873,31883,
549             31891,31907,31957,31963,31973,31981,31991,32003,
550             32009,32027,32029,32051,32057,32059,32063,32069,
551             32077,32083,32089,32099,32117,32119,32141,32143,
552             32159,32173,32183,32189,32191,32203,32213,32233,
553             32237,32251,32257,32261,32297,32299,32303,32309,
554             32321,32323,32327,32341,32353,32359,32363,32369,
555             32371,32377,32381,32401,32411,32413,32423,32429,
556             32441,32443,32467,32479,32491,32497,32503,32507,
557             32531,32533,32537,32561,32563,32569,32573,32579,
558             32587,32603,32609,32611,32621,32633,32647,32653,
559             32687,32693,32707,32713,32717,32719,32749,32771,
560             32779,32783,32789,32797,32801,32803,32831,32833,
561             32839,32843,32869,32887,32909,32911,32917,32933,
562             32939,32941,32957,32969,32971,32983,32987,32993,
563             32999,33013,33023,33029,33037,33049,33053,33071,
564             33073,33083,33091,33107,33113,33119,33149,33151,
565             33161,33179,33181,33191,33199,33203,33211,33223,
566             33247,33287,33289,33301,33311,33317,33329,33331,
567             33343,33347,33349,33353,33359,33377,33391,33403,
568             33409,33413,33427,33457,33461,33469,33479,33487,
569             33493,33503,33521,33529,33533,33547,33563,33569,
570             33577,33581,33587,33589,33599,33601,33613,33617,
571             33619,33623,33629,33637,33641,33647,33679,33703,
572             33713,33721,33739,33749,33751,33757,33767,33769,
573             33773,33791,33797,33809,33811,33827,33829,33851,
574             33857,33863,33871,33889,33893,33911,33923,33931,
575             33937,33941,33961,33967,33997,34019,34031,34033,
576             34039,34057,34061,34123,34127,34129,34141,34147,
577             34157,34159,34171,34183,34211,34213,34217,34231,
578             34253,34259,34261,34267,34273,34283,34297,34301,
579             34303,34313,34319,34327,34337,34351,34361,34367,
580             34369,34381,34403,34421,34429,34439,34457,34469,
581             34471,34483,34487,34499,34501,34511,34513,34519,
582             34537,34543,34549,34583,34589,34591,34603,34607,
583             34613,34631,34649,34651,34667,34673,34679,34687,
584             34693,34703,34721,34729,34739,34747,34757,34759,
585             34763,34781,34807,34819,34841,34843,34847,34849,
586             34871,34877,34883,34897,34913,34919,34939,34949,
587             34961,34963,34981,35023,35027,35051,35053,35059,
588             35069,35081,35083,35089,35099,35107,35111,35117,
589             35129,35141,35149,35153,35159,35171,35201,35221,
590             35227,35251,35257,35267,35279,35281,35291,35311,
591             35317,35323,35327,35339,35353,35363,35381,35393,
592             35401,35407,35419,35423,35437,35447,35449,35461,
593             35491,35507,35509,35521,35527,35531,35533,35537,
594             35543,35569,35573,35591,35593,35597,35603,35617,
595             35671,35677,35729,35731,35747,35753,35759,35771,
596             35797,35801,35803,35809,35831,35837,35839,35851,
597             35863,35869,35879,35897,35899,35911,35923,35933,
598             35951,35963,35969,35977,35983,35993,35999,36007,
599             36011,36013,36017,36037,36061,36067,36073,36083,
600             36097,36107,36109,36131,36137,36151,36161,36187,
601             36191,36209,36217,36229,36241,36251,36263,36269,
602             36277,36293,36299,36307,36313,36319,36341,36343,
603             36353,36373,36383,36389,36433,36451,36457,36467,
604             36469,36473,36479,36493,36497,36523,36527,36529,
605             36541,36551,36559,36563,36571,36583,36587,36599,
606             36607,36629,36637,36643,36653,36671,36677,36683,
607             36691,36697,36709,36713,36721,36739,36749,36761,
608             36767,36779,36781,36787,36791,36793,36809,36821,
609             36833,36847,36857,36871,36877,36887,36899,36901,
610             36913,36919,36923,36929,36931,36943,36947,36973,
611             36979,36997,37003,37013,37019,37021,37039,37049,
612             37057,37061,37087,37097,37117,37123,37139,37159,
613             37171,37181,37189,37199,37201,37217,37223,37243,
614             37253,37273,37277,37307,37309,37313,37321,37337,
615             37339,37357,37361,37363,37369,37379,37397,37409,
616             37423,37441,37447,37463,37483,37489,37493,37501,
617             37507,37511,37517,37529,37537,37547,37549,37561,
618             37567,37571,37573,37579,37589,37591,37607,37619,
619             37633,37643,37649,37657,37663,37691,37693,37699,
620             37717,37747,37781,37783,37799,37811,37813,37831,
621             37847,37853,37861,37871,37879,37889,37897,37907,
622             37951,37957,37963,37967,37987,37991,37993,37997,
623             38011,38039,38047,38053,38069,38083,38113,38119,
624             38149,38153,38167,38177,38183,38189,38197,38201,
625             38219,38231,38237,38239,38261,38273,38281,38287,
626             38299,38303,38317,38321,38327,38329,38333,38351,
627             38371,38377,38393,38431,38447,38449,38453,38459,
628             38461,38501,38543,38557,38561,38567,38569,38593,
629             38603,38609,38611,38629,38639,38651,38653,38669,
630             38671,38677,38693,38699,38707,38711,38713,38723,
631             38729,38737,38747,38749,38767,38783,38791,38803,
632             38821,38833,38839,38851,38861,38867,38873,38891,
633             38903,38917,38921,38923,38933,38953,38959,38971,
634             38977,38993,39019,39023,39041,39043,39047,39079,
635             39089,39097,39103,39107,39113,39119,39133,39139,
636             39157,39161,39163,39181,39191,39199,39209,39217,
637             39227,39229,39233,39239,39241,39251,39293,39301,
638             39313,39317,39323,39341,39343,39359,39367,39371,
639             39373,39383,39397,39409,39419,39439,39443,39451,
640             39461,39499,39503,39509,39511,39521,39541,39551,
641             39563,39569,39581,39607,39619,39623,39631,39659,
642             39667,39671,39679,39703,39709,39719,39727,39733,
643             39749,39761,39769,39779,39791,39799,39821,39827,
644             39829,39839,39841,39847,39857,39863,39869,39877,
645             39883,39887,39901,39929,39937,39953,39971,39979,
646             39983,39989,40009,40013,40031,40037,40039,40063,
647             40087,40093,40099,40111,40123,40127,40129,40151,
648             40153,40163,40169,40177,40189,40193,40213,40231,
649             40237,40241,40253,40277,40283,40289,40343,40351,
650             40357,40361,40387,40423,40427,40429,40433,40459,
651             40471,40483,40487,40493,40499,40507,40519,40529,
652             40531,40543,40559,40577,40583,40591,40597,40609,
653             40627,40637,40639,40693,40697,40699,40709,40739,
654             40751,40759,40763,40771,40787,40801,40813,40819,
655             40823,40829,40841,40847,40849,40853,40867,40879,
656             40883,40897,40903,40927,40933,40939,40949,40961,
657             40973,40993,41011,41017,41023,41039,41047,41051,
658             41057,41077,41081,41113,41117,41131,41141,41143,
659             41149,41161,41177,41179,41183,41189,41201,41203,
660             41213,41221,41227,41231,41233,41243,41257,41263,
661             41269,41281,41299,41333,41341,41351,41357,41381,
662             41387,41389,41399,41411,41413,41443,41453,41467,
663             41479,41491,41507,41513,41519,41521,41539,41543,
664             41549,41579,41593,41597,41603,41609,41611,41617,
665             41621,41627,41641,41647,41651,41659,41669,41681,
666             41687,41719,41729,41737,41759,41761,41771,41777,
667             41801,41809,41813,41843,41849,41851,41863,41879,
668             41887,41893,41897,41903,41911,41927,41941,41947,
669             41953,41957,41959,41969,41981,41983,41999,42013,
670             42017,42019,42023,42043,42061,42071,42073,42083,
671             42089,42101,42131,42139,42157,42169,42179,42181,
672             42187,42193,42197,42209,42221,42223,42227,42239,
673             42257,42281,42283,42293,42299,42307,42323,42331,
674             42337,42349,42359,42373,42379,42391,42397,42403,
675             42407,42409,42433,42437,42443,42451,42457,42461,
676             42463,42467,42473,42487,42491,42499,42509,42533,
677             42557,42569,42571,42577,42589,42611,42641,42643,
678             42649,42667,42677,42683,42689,42697,42701,42703,
679             42709,42719,42727,42737,42743,42751,42767,42773,
680             42787,42793,42797,42821,42829,42839,42841,42853,
681             42859,42863,42899,42901,42923,42929,42937,42943,
682             42953,42961,42967,42979,42989,43003,43013,43019,
683             43037,43049,43051,43063,43067,43093,43103,43117,
684             43133,43151,43159,43177,43189,43201,43207,43223,
685             43237,43261,43271,43283,43291,43313,43319,43321,
686             43331,43391,43397,43399,43403,43411,43427,43441,
687             43451,43457,43481,43487,43499,43517,43541,43543,
688             43573,43577,43579,43591,43597,43607,43609,43613,
689             43627,43633,43649,43651,43661,43669,43691,43711,
690             43717,43721,43753,43759,43777,43781,43783,43787,
691             43789,43793,43801,43853,43867,43889,43891,43913,
692             43933,43943,43951,43961,43963,43969,43973,43987,
693             43991,43997,44017,44021,44027,44029,44041,44053,
694             44059,44071,44087,44089,44101,44111,44119,44123,
695             44129,44131,44159,44171,44179,44189,44201,44203,
696             44207,44221,44249,44257,44263,44267,44269,44273,
697             44279,44281,44293,44351,44357,44371,44381,44383,
698             44389,44417,44449,44453,44483,44491,44497,44501,
699             44507,44519,44531,44533,44537,44543,44549,44563,
700             44579,44587,44617,44621,44623,44633,44641,44647,
701             44651,44657,44683,44687,44699,44701,44711,44729,
702             44741,44753,44771,44773,44777,44789,44797,44809,
703             44819,44839,44843,44851,44867,44879,44887,44893,
704             44909,44917,44927,44939,44953,44959,44963,44971,
705             44983,44987,45007,45013,45053,45061,45077,45083,
706             45119,45121,45127,45131,45137,45139,45161,45179,
707             45181,45191,45197,45233,45247,45259,45263,45281,
708             45289,45293,45307,45317,45319,45329,45337,45341,
709             45343,45361,45377,45389,45403,45413,45427,45433,
710             45439,45481,45491,45497,45503,45523,45533,45541,
711             45553,45557,45569,45587,45589,45599,45613,45631,
712             45641,45659,45667,45673,45677,45691,45697,45707,
713             45737,45751,45757,45763,45767,45779,45817,45821,
714             45823,45827,45833,45841,45853,45863,45869,45887,
715             45893,45943,45949,45953,45959,45971,45979,45989,
716             46021,46027,46049,46051,46061,46073,46091,46093,
717             46099,46103,46133,46141,46147,46153,46171,46181,
718             46183,46187,46199,46219,46229,46237,46261,46271,
719             46273,46279,46301,46307,46309,46327,46337,46349,
720             46351,46381,46399,46411,46439,46441,46447,46451,
721             46457,46471,46477,46489,46499,46507,46511,46523,
722             46549,46559,46567,46573,46589,46591,46601,46619,
723             46633,46639,46643,46649,46663,46679,46681,46687,
724             46691,46703,46723,46727,46747,46751,46757,46769,
725             46771,46807,46811,46817,46819,46829,46831,46853,
726             46861,46867,46877,46889,46901,46919,46933,46957,
727             46993,46997,47017,47041,47051,47057,47059,47087,
728             47093,47111,47119,47123,47129,47137,47143,47147,
729             47149,47161,47189,47207,47221,47237,47251,47269,
730             47279,47287,47293,47297,47303,47309,47317,47339,
731             47351,47353,47363,47381,47387,47389,47407,47417,
732             47419,47431,47441,47459,47491,47497,47501,47507,
733             47513,47521,47527,47533,47543,47563,47569,47581,
734             47591,47599,47609,47623,47629,47639,47653,47657,
735             47659,47681,47699,47701,47711,47713,47717,47737,
736             47741,47743,47777,47779,47791,47797,47807,47809,
737             47819,47837,47843,47857,47869,47881,47903,47911,
738             47917,47933,47939,47947,47951,47963,47969,47977,
739             47981,48017,48023,48029,48049,48073,48079,48091,
740             48109,48119,48121,48131,48157,48163,48179,48187,
741             48193,48197,48221,48239,48247,48259,48271,48281,
742             48299,48311,48313,48337,48341,48353,48371,48383,
743             48397,48407,48409,48413,48437,48449,48463,48473,
744             48479,48481,48487,48491,48497,48523,48527,48533,
745             48539,48541,48563,48571,48589,48593,48611,48619,
746             48623,48647,48649,48661,48673,48677,48679,48731,
747             48733,48751,48757,48761,48767,48779,48781,48787,
748             48799,48809,48817,48821,48823,48847,48857,48859,
749             48869,48871,48883,48889,48907,48947,48953,48973,
750             48989,48991,49003,49009,49019,49031,49033,49037,
751             49043,49057,49069,49081,49103,49109,49117,49121,
752             49123,49139,49157,49169,49171,49177,49193,49199,
753             49201,49207,49211,49223,49253,49261,49277,49279,
754             49297,49307,49331,49333,49339,49363,49367,49369,
755             49391,49393,49409,49411,49417,49429,49433,49451,
756             49459,49463,49477,49481,49499,49523,49529,49531,
757             49537,49547,49549,49559,49597,49603,49613,49627,
758             49633,49639,49663,49667,49669,49681,49697,49711,
759             49727,49739,49741,49747,49757,49783,49787,49789,
760             49801,49807,49811,49823,49831,49843,49853,49871,
761             49877,49891,49919,49921,49927,49937,49939,49943,
762             49957,49991,49993,49999,50021,50023,50033,50047,
763             50051,50053,50069,50077,50087,50093,50101,50111,
764             50119,50123,50129,50131,50147,50153,50159,50177,
765             50207,50221,50227,50231,50261,50263,50273,50287,
766             50291,50311,50321,50329,50333,50341,50359,50363,
767             50377,50383,50387,50411,50417,50423,50441,50459,
768             50461,50497,50503,50513,50527,50539,50543,50549,
769             50551,50581,50587,50591,50593,50599,50627,50647,
770             50651,50671,50683,50707,50723,50741,50753,50767,
771             50773,50777,50789,50821,50833,50839,50849,50857,
772             50867,50873,50891,50893,50909,50923,50929,50951,
773             50957,50969,50971,50989,50993,51001,51031,51043,
774             51047,51059,51061,51071,51109,51131,51133,51137,
775             51151,51157,51169,51193,51197,51199,51203,51217,
776             51229,51239,51241,51257,51263,51283,51287,51307,
777             51329,51341,51343,51347,51349,51361,51383,51407,
778             51413,51419,51421,51427,51431,51437,51439,51449,
779             51461,51473,51479,51481,51487,51503,51511,51517,
780             51521,51539,51551,51563,51577,51581,51593,51599,
781             51607,51613,51631,51637,51647,51659,51673,51679,
782             51683,51691,51713,51719,51721,51749,51767,51769,
783             51787,51797,51803,51817,51827,51829,51839,51853,
784             51859,51869,51871,51893,51899,51907,51913,51929,
785             51941,51949,51971,51973,51977,51991,52009,52021,
786             52027,52051,52057,52067,52069,52081,52103,52121,
787             52127,52147,52153,52163,52177,52181,52183,52189,
788             52201,52223,52237,52249,52253,52259,52267,52289,
789             52291,52301,52313,52321,52361,52363,52369,52379,
790             52387,52391,52433,52453,52457,52489,52501,52511,
791             52517,52529,52541,52543,52553,52561,52567,52571,
792             52579,52583,52609,52627,52631,52639,52667,52673,
793             52691,52697,52709,52711,52721,52727,52733,52747,
794             52757,52769,52783,52807,52813,52817,52837,52859,
795             52861,52879,52883,52889,52901,52903,52919,52937,
796             52951,52957,52963,52967,52973,52981,52999,53003,
797             53017,53047,53051,53069,53077,53087,53089,53093,
798             53101,53113,53117,53129,53147,53149,53161,53171,
799             53173,53189,53197,53201,53231,53233,53239,53267,
800             53269,53279,53281,53299,53309,53323,53327,53353,
801             53359,53377,53381,53401,53407,53411,53419,53437,
802             53441,53453,53479,53503,53507,53527,53549,53551,
803             53569,53591,53593,53597,53609,53611,53617,53623,
804             53629,53633,53639,53653,53657,53681,53693,53699,
805             53717,53719,53731,53759,53773,53777,53783,53791,
806             53813,53819,53831,53849,53857,53861,53881,53887,
807             53891,53897,53899,53917,53923,53927,53939,53951,
808             53959,53987,53993,54001,54011,54013,54037,54049,
809             54059,54083,54091,54101,54121,54133,54139,54151,
810             54163,54167,54181,54193,54217,54251,54269,54277,
811             54287,54293,54311,54319,54323,54331,54347,54361,
812             54367,54371,54377,54401,54403,54409,54413,54419,
813             54421,54437,54443,54449,54469,54493,54497,54499,
814             54503,54517,54521,54539,54541,54547,54559,54563,
815             54577,54581,54583,54601,54617,54623,54629,54631,
816             54647,54667,54673,54679,54709,54713,54721,54727,
817             54751,54767,54773,54779,54787,54799,54829,54833,
818             54851,54869,54877,54881,54907,54917,54919,54941,
819             54949,54959,54973,54979,54983,55001,55009,55021,
820             55049,55051,55057,55061,55073,55079,55103,55109,
821             55117,55127,55147,55163,55171,55201,55207,55213,
822             55217,55219,55229,55243,55249,55259,55291,55313,
823             55331,55333,55337,55339,55343,55351,55373,55381,
824             55399,55411,55439,55441,55457,55469,55487,55501,
825             55511,55529,55541,55547,55579,55589,55603,55609,
826             55619,55621,55631,55633,55639,55661,55663,55667,
827             55673,55681,55691,55697,55711,55717,55721,55733,
828             55763,55787,55793,55799,55807,55813,55817,55819,
829             55823,55829,55837,55843,55849,55871,55889,55897,
830             55901,55903,55921,55927,55931,55933,55949,55967,
831             55987,55997,56003,56009,56039,56041,56053,56081,
832             56087,56093,56099,56101,56113,56123,56131,56149,
833             56167,56171,56179,56197,56207,56209,56237,56239,
834             56249,56263,56267,56269,56299,56311,56333,56359,
835             56369,56377,56383,56393,56401,56417,56431,56437,
836             56443,56453,56467,56473,56477,56479,56489,56501,
837             56503,56509,56519,56527,56531,56533,56543,56569,
838             56591,56597,56599,56611,56629,56633,56659,56663,
839             56671,56681,56687,56701,56711,56713,56731,56737,
840             56747,56767,56773,56779,56783,56807,56809,56813,
841             56821,56827,56843,56857,56873,56891,56893,56897,
842             56909,56911,56921,56923,56929,56941,56951,56957,
843             56963,56983,56989,56993,56999,57037,57041,57047,
844             57059,57073,57077,57089,57097,57107,57119,57131,
845             57139,57143,57149,57163,57173,57179,57191,57193,
846             57203,57221,57223,57241,57251,57259,57269,57271,
847             57283,57287,57301,57329,57331,57347,57349,57367,
848             57373,57383,57389,57397,57413,57427,57457,57467,
849             57487,57493,57503,57527,57529,57557,57559,57571,
850             57587,57593,57601,57637,57641,57649,57653,57667,
851             57679,57689,57697,57709,57713,57719,57727,57731,
852             57737,57751,57773,57781,57787,57791,57793,57803,
853             57809,57829,57839,57847,57853,57859,57881,57899,
854             57901,57917,57923,57943,57947,57973,57977,57991,
855             58013,58027,58031,58043,58049,58057,58061,58067,
856             58073,58099,58109,58111,58129,58147,58151,58153,
857             58169,58171,58189,58193,58199,58207,58211,58217,
858             58229,58231,58237,58243,58271,58309,58313,58321,
859             58337,58363,58367,58369,58379,58391,58393,58403,
860             58411,58417,58427,58439,58441,58451,58453,58477,
861             58481,58511,58537,58543,58549,58567,58573,58579,
862             58601,58603,58613,58631,58657,58661,58679,58687,
863             58693,58699,58711,58727,58733,58741,58757,58763,
864             58771,58787,58789,58831,58889,58897,58901,58907,
865             58909,58913,58921,58937,58943,58963,58967,58979,
866             58991,58997,59009,59011,59021,59023,59029,59051,
867             59053,59063,59069,59077,59083,59093,59107,59113,
868             59119,59123,59141,59149,59159,59167,59183,59197,
869             59207,59209,59219,59221,59233,59239,59243,59263,
870             59273,59281,59333,59341,59351,59357,59359,59369,
871             59377,59387,59393,59399,59407,59417,59419,59441,
872             59443,59447,59453,59467,59471,59473,59497,59509,
873             59513,59539,59557,59561,59567,59581,59611,59617,
874             59621,59627,59629,59651,59659,59663,59669,59671,
875             59693,59699,59707,59723,59729,59743,59747,59753,
876             59771,59779,59791,59797,59809,59833,59863,59879,
877             59887,59921,59929,59951,59957,59971,59981,59999,
878             60013,60017,60029,60037,60041,60077,60083,60089,
879             60091,60101,60103,60107,60127,60133,60139,60149,
880             60161,60167,60169,60209,60217,60223,60251,60257,
881             60259,60271,60289,60293,60317,60331,60337,60343,
882             60353,60373,60383,60397,60413,60427,60443,60449,
883             60457,60493,60497,60509,60521,60527,60539,60589,
884             60601,60607,60611,60617,60623,60631,60637,60647,
885             60649,60659,60661,60679,60689,60703,60719,60727,
886             60733,60737,60757,60761,60763,60773,60779,60793,
887             60811,60821,60859,60869,60887,60889,60899,60901,
888             60913,60917,60919,60923,60937,60943,60953,60961,
889             61001,61007,61027,61031,61043,61051,61057,61091,
890             61099,61121,61129,61141,61151,61153,61169,61211,
891             61223,61231,61253,61261,61283,61291,61297,61331,
892             61333,61339,61343,61357,61363,61379,61381,61403,
893             61409,61417,61441,61463,61469,61471,61483,61487,
894             61493,61507,61511,61519,61543,61547,61553,61559,
895             61561,61583,61603,61609,61613,61627,61631,61637,
896             61643,61651,61657,61667,61673,61681,61687,61703,
897             61717,61723,61729,61751,61757,61781,61813,61819,
898             61837,61843,61861,61871,61879,61909,61927,61933,
899             61949,61961,61967,61979,61981,61987,61991,62003,
900             62011,62017,62039,62047,62053,62057,62071,62081,
901             62099,62119,62129,62131,62137,62141,62143,62171,
902             62189,62191,62201,62207,62213,62219,62233,62273,
903             62297,62299,62303,62311,62323,62327,62347,62351,
904             62383,62401,62417,62423,62459,62467,62473,62477,
905             62483,62497,62501,62507,62533,62539,62549,62563,
906             62581,62591,62597,62603,62617,62627,62633,62639,
907             62653,62659,62683,62687,62701,62723,62731,62743,
908             62753,62761,62773,62791,62801,62819,62827,62851,
909             62861,62869,62873,62897,62903,62921,62927,62929,
910             62939,62969,62971,62981,62983,62987,62989,63029,
911             63031,63059,63067,63073,63079,63097,63103,63113,
912             63127,63131,63149,63179,63197,63199,63211,63241,
913             63247,63277,63281,63299,63311,63313,63317,63331,
914             63337,63347,63353,63361,63367,63377,63389,63391,
915             63397,63409,63419,63421,63439,63443,63463,63467,
916             63473,63487,63493,63499,63521,63527,63533,63541,
917             63559,63577,63587,63589,63599,63601,63607,63611,
918             63617,63629,63647,63649,63659,63667,63671,63689,
919             63691,63697,63703,63709,63719,63727,63737,63743,
920             63761,63773,63781,63793,63799,63803,63809,63823,
921             63839,63841,63853,63857,63863,63901,63907,63913,
922             63929,63949,63977,63997,64007,64013,64019,64033,
923             64037,64063,64067,64081,64091,64109,64123,64151,
924             64153,64157,64171,64187,64189,64217,64223,64231,
925             64237,64271,64279,64283,64301,64303,64319,64327,
926             64333,64373,64381,64399,64403,64433,64439,64451,
927             64453,64483,64489,64499,64513,64553,64567,64577,
928             64579,64591,64601,64609,64613,64621,64627,64633,
929             64661,64663,64667,64679,64693,64709,64717,64747,
930             64763,64781,64783,64793,64811,64817,64849,64853,
931             64871,64877,64879,64891,64901,64919,64921,64927,
932             64937,64951,64969,64997,65003,65011,65027,65029,
933             65033,65053,65063,65071,65089,65099,65101,65111,
934             65119,65123,65129,65141,65147,65167,65171,65173,
935             65179,65183,65203,65213,65239,65257,65267,65269,
936             65287,65293,65309,65323,65327,65353,65357,65371,
937             65381,65393,65407,65413,65419,65423,65437,65447,
938             65449,65479,65497,65519,65521,65537,65539,65543,
939             65551,65557,65563,65579,65581,65587,65599,65609,
940             65617,65629,65633,65647,65651,65657,65677,65687,
941             65699,65701,65707,65713,65717,65719,65729,65731,
942             65761,65777,65789,65809,65827,65831,65837,65839,
943             65843,65851,65867,65881,65899,65921,65927,65929,
944             65951,65957,65963,65981,65983,65993,66029,66037,
945             66041,66047,66067,66071,66083,66089,66103,66107,
946             66109,66137,66161,66169,66173,66179,66191,66221,
947             66239,66271,66293,66301,66337,66343,66347,66359,
948             66361,66373,66377,66383,66403,66413,66431,66449,
949             66457,66463,66467,66491,66499,66509,66523,66529,
950             66533,66541,66553,66569,66571,66587,66593,66601,
951             66617,66629,66643,66653,66683,66697,66701,66713,
952             66721,66733,66739,66749,66751,66763,66791,66797,
953             66809,66821,66841,66851,66853,66863,66877,66883,
954             66889,66919,66923,66931,66943,66947,66949,66959,
955             66973,66977,67003,67021,67033,67043,67049,67057,
956             67061,67073,67079,67103,67121,67129,67139,67141,
957             67153,67157,67169,67181,67187,67189,67211,67213,
958             67217,67219,67231,67247,67261,67271,67273,67289,
959             67307,67339,67343,67349,67369,67391,67399,67409,
960             67411,67421,67427,67429,67433,67447,67453,67477,
961             67481,67489,67493,67499,67511,67523,67531,67537,
962             67547,67559,67567,67577,67579,67589,67601,67607,
963             67619,67631,67651,67679,67699,67709,67723,67733,
964             67741,67751,67757,67759,67763,67777,67783,67789,
965             67801,67807,67819,67829,67843,67853,67867,67883,
966             67891,67901,67927,67931,67933,67939,67943,67957,
967             67961,67967,67979,67987,67993,68023,68041,68053,
968             68059,68071,68087,68099,68111,68113,68141,68147,
969             68161,68171,68207,68209,68213,68219,68227,68239,
970             68261,68279,68281,68311,68329,68351,68371,68389,
971             68399,68437,68443,68447,68449,68473,68477,68483,
972             68489,68491,68501,68507,68521,68531,68539,68543,
973             68567,68581,68597,68611,68633,68639,68659,68669,
974             68683,68687,68699,68711,68713,68729,68737,68743,
975             68749,68767,68771,68777,68791,68813,68819,68821,
976             68863,68879,68881,68891,68897,68899,68903,68909,
977             68917,68927,68947,68963,68993,69001,69011,69019,
978             69029,69031,69061,69067,69073,69109,69119,69127,
979             69143,69149,69151,69163,69191,69193,69197,69203,
980             69221,69233,69239,69247,69257,69259,69263,69313,
981             69317,69337,69341,69371,69379,69383,69389,69401,
982             69403,69427,69431,69439,69457,69463,69467,69473,
983             69481,69491,69493,69497,69499,69539,69557,69593,
984             69623,69653,69661,69677,69691,69697,69709,69737,
985             69739,69761,69763,69767,69779,69809,69821,69827,
986             69829,69833,69847,69857,69859,69877,69899,69911,
987             69929,69931,69941,69959,69991,69997,70001,70003,
988             70009,70019,70039,70051,70061,70067,70079,70099,
989             70111,70117,70121,70123,70139,70141,70157,70163,
990             70177,70181,70183,70199,70201,70207,70223,70229,
991             70237,70241,70249,70271,70289,70297,70309,70313,
992             70321,70327,70351,70373,70379,70381,70393,70423,
993             70429,70439,70451,70457,70459,70481,70487,70489,
994             70501,70507,70529,70537,70549,70571,70573,70583,
995             70589,70607,70619,70621,70627,70639,70657,70663,
996             70667,70687,70709,70717,70729,70753,70769,70783,
997             70793,70823,70841,70843,70849,70853,70867,70877,
998             70879,70891,70901,70913,70919,70921,70937,70949,
999             70951,70957,70969,70979,70981,70991,70997,70999,
1000             71011,71023,71039,71059,71069,71081,71089,71119,
1001             71129,71143,71147,71153,71161,71167,71171,71191,
1002             71209,71233,71237,71249,71257,71261,71263,71287,
1003             71293,71317,71327,71329,71333,71339,71341,71347,
1004             71353,71359,71363,71387,71389,71399,71411,71413,
1005             71419,71429,71437,71443,71453,71471,71473,71479,
1006             71483,71503,71527,71537,71549,71551,71563,71569,
1007             71593,71597,71633,71647,71663,71671,71693,71699,
1008             71707,71711,71713,71719,71741,71761,71777,71789,
1009             71807,71809,71821,71837,71843,71849,71861,71867,
1010             71879,71881,71887,71899,71909,71917,71933,71941,
1011             71947,71963,71971,71983,71987,71993,71999,72019,
1012             72031,72043,72047,72053,72073,72077,72089,72091,
1013             72101,72103,72109,72139,72161,72167,72169,72173,
1014             72211,72221,72223,72227,72229,72251,72253,72269,
1015             72271,72277,72287,72307,72313,72337,72341,72353,
1016             72367,72379,72383,72421,72431,72461,72467,72469,
1017             72481,72493,72497,72503,72533,72547,72551,72559,
1018             72577,72613,72617,72623,72643,72647,72649,72661,
1019             72671,72673,72679,72689,72701,72707,72719,72727,
1020             72733,72739,72763,72767,72797,72817,72823,72859,
1021             72869,72871,72883,72889,72893,72901,72907,72911,
1022             72923,72931,72937,72949,72953,72959,72973,72977,
1023             72997,73009,73013,73019,73037,73039,73043,73061,
1024             73063,73079,73091,73121,73127,73133,73141,73181,
1025             73189,73237,73243,73259,73277,73291,73303,73309,
1026             73327,73331,73351,73361,73363,73369,73379,73387,
1027             73417,73421,73433,73453,73459,73471,73477,73483,
1028             73517,73523,73529,73547,73553,73561,73571,73583,
1029             73589,73597,73607,73609,73613,73637,73643,73651,
1030             73673,73679,73681,73693,73699,73709,73721,73727,
1031             73751,73757,73771,73783,73819,73823,73847,73849,
1032             73859,73867,73877,73883,73897,73907,73939,73943,
1033             73951,73961,73973,73999,74017,74021,74027,74047,
1034             74051,74071,74077,74093,74099,74101,74131,74143,
1035             74149,74159,74161,74167,74177,74189,74197,74201,
1036             74203,74209,74219,74231,74257,74279,74287,74293,
1037             74297,74311,74317,74323,74353,74357,74363,74377,
1038             74381,74383,74411,74413,74419,74441,74449,74453,
1039             74471,74489,74507,74509,74521,74527,74531,74551,
1040             74561,74567,74573,74587,74597,74609,74611,74623,
1041             74653,74687,74699,74707,74713,74717,74719,74729,
1042             74731,74747,74759,74761,74771,74779,74797,74821,
1043             74827,74831,74843,74857,74861,74869,74873,74887,
1044             74891,74897,74903,74923,74929,74933,74941,74959,
1045             75011,75013,75017,75029,75037,75041,75079,75083,
1046             75109,75133,75149,75161,75167,75169,75181,75193,
1047             75209,75211,75217,75223,75227,75239,75253,75269,
1048             75277,75289,75307,75323,75329,75337,75347,75353,
1049             75367,75377,75389,75391,75401,75403,75407,75431,
1050             75437,75479,75503,75511,75521,75527,75533,75539,
1051             75541,75553,75557,75571,75577,75583,75611,75617,
1052             75619,75629,75641,75653,75659,75679,75683,75689,
1053             75703,75707,75709,75721,75731,75743,75767,75773,
1054             75781,75787,75793,75797,75821,75833,75853,75869,
1055             75883,75913,75931,75937,75941,75967,75979,75983,
1056             75989,75991,75997,76001,76003,76031,76039,76079,
1057             76081,76091,76099,76103,76123,76129,76147,76157,
1058             76159,76163,76207,76213,76231,76243,76249,76253,
1059             76259,76261,76283,76289,76303,76333,76343,76367,
1060             76369,76379,76387,76403,76421,76423,76441,76463,
1061             76471,76481,76487,76493,76507,76511,76519,76537,
1062             76541,76543,76561,76579,76597,76603,76607,76631,
1063             76649,76651,76667,76673,76679,76697,76717,76733,
1064             76753,76757,76771,76777,76781,76801,76819,76829,
1065             76831,76837,76847,76871,76873,76883,76907,76913,
1066             76919,76943,76949,76961,76963,76991,77003,77017,
1067             77023,77029,77041,77047,77069,77081,77093,77101,
1068             77137,77141,77153,77167,77171,77191,77201,77213,
1069             77237,77239,77243,77249,77261,77263,77267,77269,
1070             77279,77291,77317,77323,77339,77347,77351,77359,
1071             77369,77377,77383,77417,77419,77431,77447,77471,
1072             77477,77479,77489,77491,77509,77513,77521,77527,
1073             77543,77549,77551,77557,77563,77569,77573,77587,
1074             77591,77611,77617,77621,77641,77647,77659,77681,
1075             77687,77689,77699,77711,77713,77719,77723,77731,
1076             77743,77747,77761,77773,77783,77797,77801,77813,
1077             77839,77849,77863,77867,77893,77899,77929,77933,
1078             77951,77969,77977,77983,77999,78007,78017,78031,
1079             78041,78049,78059,78079,78101,78121,78137,78139,
1080             78157,78163,78167,78173,78179,78191,78193,78203,
1081             78229,78233,78241,78259,78277,78283,78301,78307,
1082             78311,78317,78341,78347,78367,78401,78427,78437,
1083             78439,78467,78479,78487,78497,78509,78511,78517,
1084             78539,78541,78553,78569,78571,78577,78583,78593,
1085             78607,78623,78643,78649,78653,78691,78697,78707,
1086             78713,78721,78737,78779,78781,78787,78791,78797,
1087             78803,78809,78823,78839,78853,78857,78877,78887,
1088             78889,78893,78901,78919,78929,78941,78977,78979,
1089             78989,79031,79039,79043,79063,79087,79103,79111,
1090             79133,79139,79147,79151,79153,79159,79181,79187,
1091             79193,79201,79229,79231,79241,79259,79273,79279,
1092             79283,79301,79309,79319,79333,79337,79349,79357,
1093             79367,79379,79393,79397,79399,79411,79423,79427,
1094             79433,79451,79481,79493,79531,79537,79549,79559,
1095             79561,79579,79589,79601,79609,79613,79621,79627,
1096             79631,79633,79657,79669,79687,79691,79693,79697,
1097             79699,79757,79769,79777,79801,79811,79813,79817,
1098             79823,79829,79841,79843,79847,79861,79867,79873,
1099             79889,79901,79903,79907,79939,79943,79967,79973,
1100             79979,79987,79997,79999,80021,80039,80051,80071,
1101             80077,80107,80111,80141,80147,80149,80153,80167,
1102             80173,80177,80191,80207,80209,80221,80231,80233,
1103             80239,80251,80263,80273,80279,80287,80309,80317,
1104             80329,80341,80347,80363,80369,80387,80407,80429,
1105             80447,80449,80471,80473,80489,80491,80513,80527,
1106             80537,80557,80567,80599,80603,80611,80621,80627,
1107             80629,80651,80657,80669,80671,80677,80681,80683,
1108             80687,80701,80713,80737,80747,80749,80761,80777,
1109             80779,80783,80789,80803,80809,80819,80831,80833,
1110             80849,80863,80897,80909,80911,80917,80923,80929,
1111             80933,80953,80963,80989,81001,81013,81017,81019,
1112             81023,81031,81041,81043,81047,81049,81071,81077,
1113             81083,81097,81101,81119,81131,81157,81163,81173,
1114             81181,81197,81199,81203,81223,81233,81239,81281,
1115             81283,81293,81299,81307,81331,81343,81349,81353,
1116             81359,81371,81373,81401,81409,81421,81439,81457,
1117             81463,81509,81517,81527,81533,81547,81551,81553,
1118             81559,81563,81569,81611,81619,81629,81637,81647,
1119             81649,81667,81671,81677,81689,81701,81703,81707,
1120             81727,81737,81749,81761,81769,81773,81799,81817,
1121             81839,81847,81853,81869,81883,81899,81901,81919,
1122             81929,81931,81937,81943,81953,81967,81971,81973,
1123             82003,82007,82009,82013,82021,82031,82037,82039,
1124             82051,82067,82073,82129,82139,82141,82153,82163,
1125             82171,82183,82189,82193,82207,82217,82219,82223,
1126             82231,82237,82241,82261,82267,82279,82301,82307,
1127             82339,82349,82351,82361,82373,82387,82393,82421,
1128             82457,82463,82469,82471,82483,82487,82493,82499,
1129             82507,82529,82531,82549,82559,82561,82567,82571,
1130             82591,82601,82609,82613,82619,82633,82651,82657,
1131             82699,82721,82723,82727,82729,82757,82759,82763,
1132             82781,82787,82793,82799,82811,82813,82837,82847,
1133             82883,82889,82891,82903,82913,82939,82963,82981,
1134             82997,83003,83009,83023,83047,83059,83063,83071,
1135             83077,83089,83093,83101,83117,83137,83177,83203,
1136             83207,83219,83221,83227,83231,83233,83243,83257,
1137             83267,83269,83273,83299,83311,83339,83341,83357,
1138             83383,83389,83399,83401,83407,83417,83423,83431,
1139             83437,83443,83449,83459,83471,83477,83497,83537,
1140             83557,83561,83563,83579,83591,83597,83609,83617,
1141             83621,83639,83641,83653,83663,83689,83701,83717,
1142             83719,83737,83761,83773,83777,83791,83813,83833,
1143             83843,83857,83869,83873,83891,83903,83911,83921,
1144             83933,83939,83969,83983,83987,84011,84017,84047,
1145             84053,84059,84061,84067,84089,84121,84127,84131,
1146             84137,84143,84163,84179,84181,84191,84199,84211,
1147             84221,84223,84229,84239,84247,84263,84299,84307,
1148             84313,84317,84319,84347,84349,84377,84389,84391,
1149             84401,84407,84421,84431,84437,84443,84449,84457,
1150             84463,84467,84481,84499,84503,84509,84521,84523,
1151             84533,84551,84559,84589,84629,84631,84649,84653,
1152             84659,84673,84691,84697,84701,84713,84719,84731,
1153             84737,84751,84761,84787,84793,84809,84811,84827,
1154             84857,84859,84869,84871,84913,84919,84947,84961,
1155             84967,84977,84979,84991,85009,85021,85027,85037,
1156             85049,85061,85081,85087,85091,85093,85103,85109,
1157             85121,85133,85147,85159,85193,85199,85201,85213,
1158             85223,85229,85237,85243,85247,85259,85297,85303,
1159             85313,85331,85333,85361,85363,85369,85381,85411,
1160             85427,85429,85439,85447,85451,85453,85469,85487,
1161             85513,85517,85523,85531,85549,85571,85577,85597,
1162             85601,85607,85619,85621,85627,85639,85643,85661,
1163             85667,85669,85691,85703,85711,85717,85733,85751,
1164             85781,85793,85817,85819,85829,85831,85837,85843,
1165             85847,85853,85889,85903,85909,85931,85933,85991,
1166             85999,86011,86017,86027,86029,86069,86077,86083,
1167             86111,86113,86117,86131,86137,86143,86161,86171,
1168             86179,86183,86197,86201,86209,86239,86243,86249,
1169             86257,86263,86269,86287,86291,86293,86297,86311,
1170             86323,86341,86351,86353,86357,86369,86371,86381,
1171             86389,86399,86413,86423,86441,86453,86461,86467,
1172             86477,86491,86501,86509,86531,86533,86539,86561,
1173             86573,86579,86587,86599,86627,86629,86677,86689,
1174             86693,86711,86719,86729,86743,86753,86767,86771,
1175             86783,86813,86837,86843,86851,86857,86861,86869,
1176             86923,86927,86929,86939,86951,86959,86969,86981,
1177             86993,87011,87013,87037,87041,87049,87071,87083,
1178             87103,87107,87119,87121,87133,87149,87151,87179,
1179             87181,87187,87211,87221,87223,87251,87253,87257,
1180             87277,87281,87293,87299,87313,87317,87323,87337,
1181             87359,87383,87403,87407,87421,87427,87433,87443,
1182             87473,87481,87491,87509,87511,87517,87523,87539,
1183             87541,87547,87553,87557,87559,87583,87587,87589,
1184             87613,87623,87629,87631,87641,87643,87649,87671,
1185             87679,87683,87691,87697,87701,87719,87721,87739,
1186             87743,87751,87767,87793,87797,87803,87811,87833,
1187             87853,87869,87877,87881,87887,87911,87917,87931,
1188             87943,87959,87961,87973,87977,87991,88001,88003,
1189             88007,88019,88037,88069,88079,88093,88117,88129,
1190             88169,88177,88211,88223,88237,88241,88259,88261,
1191             88289,88301,88321,88327,88337,88339,88379,88397,
1192             88411,88423,88427,88463,88469,88471,88493,88499,
1193             88513,88523,88547,88589,88591,88607,88609,88643,
1194             88651,88657,88661,88663,88667,88681,88721,88729,
1195             88741,88747,88771,88789,88793,88799,88801,88807,
1196             88811,88813,88817,88819,88843,88853,88861,88867,
1197             88873,88883,88897,88903,88919,88937,88951,88969,
1198             88993,88997,89003,89009,89017,89021,89041,89051,
1199             89057,89069,89071,89083,89087,89101,89107,89113,
1200             89119,89123,89137,89153,89189,89203,89209,89213,
1201             89227,89231,89237,89261,89269,89273,89293,89303,
1202             89317,89329,89363,89371,89381,89387,89393,89399,
1203             89413,89417,89431,89443,89449,89459,89477,89491,
1204             89501,89513,89519,89521,89527,89533,89561,89563,
1205             89567,89591,89597,89599,89603,89611,89627,89633,
1206             89653,89657,89659,89669,89671,89681,89689,89753,
1207             89759,89767,89779,89783,89797,89809,89819,89821,
1208             89833,89839,89849,89867,89891,89897,89899,89909,
1209             89917,89923,89939,89959,89963,89977,89983,89989,
1210             90001,90007,90011,90017,90019,90023,90031,90053,
1211             90059,90067,90071,90073,90089,90107,90121,90127,
1212             90149,90163,90173,90187,90191,90197,90199,90203,
1213             90217,90227,90239,90247,90263,90271,90281,90289,
1214             90313,90353,90359,90371,90373,90379,90397,90401,
1215             90403,90407,90437,90439,90469,90473,90481,90499,
1216             90511,90523,90527,90529,90533,90547,90583,90599,
1217             90617,90619,90631,90641,90647,90659,90677,90679,
1218             90697,90703,90709,90731,90749,90787,90793,90803,
1219             90821,90823,90833,90841,90847,90863,90887,90901,
1220             90907,90911,90917,90931,90947,90971,90977,90989,
1221             90997,91009,91019,91033,91079,91081,91097,91099,
1222             91121,91127,91129,91139,91141,91151,91153,91159,
1223             91163,91183,91193,91199,91229,91237,91243,91249,
1224             91253,91283,91291,91297,91303,91309,91331,91367,
1225             91369,91373,91381,91387,91393,91397,91411,91423,
1226             91433,91453,91457,91459,91463,91493,91499,91513,
1227             91529,91541,91571,91573,91577,91583,91591,91621,
1228             91631,91639,91673,91691,91703,91711,91733,91753,
1229             91757,91771,91781,91801,91807,91811,91813,91823,
1230             91837,91841,91867,91873,91909,91921,91939,91943,
1231             91951,91957,91961,91967,91969,91997,92003,92009,
1232             92033,92041,92051,92077,92083,92107,92111,92119,
1233             92143,92153,92173,92177,92179,92189,92203,92219,
1234             92221,92227,92233,92237,92243,92251,92269,92297,
1235             92311,92317,92333,92347,92353,92357,92363,92369,
1236             92377,92381,92383,92387,92399,92401,92413,92419,
1237             92431,92459,92461,92467,92479,92489,92503,92507,
1238             92551,92557,92567,92569,92581,92593,92623,92627,
1239             92639,92641,92647,92657,92669,92671,92681,92683,
1240             92693,92699,92707,92717,92723,92737,92753,92761,
1241             92767,92779,92789,92791,92801,92809,92821,92831,
1242             92849,92857,92861,92863,92867,92893,92899,92921,
1243             92927,92941,92951,92957,92959,92987,92993,93001,
1244             93047,93053,93059,93077,93083,93089,93097,93103,
1245             93113,93131,93133,93139,93151,93169,93179,93187,
1246             93199,93229,93239,93241,93251,93253,93257,93263,
1247             93281,93283,93287,93307,93319,93323,93329,93337,
1248             93371,93377,93383,93407,93419,93427,93463,93479,
1249             93481,93487,93491,93493,93497,93503,93523,93529,
1250             93553,93557,93559,93563,93581,93601,93607,93629,
1251             93637,93683,93701,93703,93719,93739,93761,93763,
1252             93787,93809,93811,93827,93851,93871,93887,93889,
1253             93893,93901,93911,93913,93923,93937,93941,93949,
1254             93967,93971,93979,93983,93997,94007,94009,94033,
1255             94049,94057,94063,94079,94099,94109,94111,94117,
1256             94121,94151,94153,94169,94201,94207,94219,94229,
1257             94253,94261,94273,94291,94307,94309,94321,94327,
1258             94331,94343,94349,94351,94379,94397,94399,94421,
1259             94427,94433,94439,94441,94447,94463,94477,94483,
1260             94513,94529,94531,94541,94543,94547,94559,94561,
1261             94573,94583,94597,94603,94613,94621,94649,94651,
1262             94687,94693,94709,94723,94727,94747,94771,94777,
1263             94781,94789,94793,94811,94819,94823,94837,94841,
1264             94847,94849,94873,94889,94903,94907,94933,94949,
1265             94951,94961,94993,94999,95003,95009,95021,95027,
1266             95063,95071,95083,95087,95089,95093,95101,95107,
1267             95111,95131,95143,95153,95177,95189,95191,95203,
1268             95213,95219,95231,95233,95239,95257,95261,95267,
1269             95273,95279,95287,95311,95317,95327,95339,95369,
1270             95383,95393,95401,95413,95419,95429,95441,95443,
1271             95461,95467,95471,95479,95483,95507,95527,95531,
1272             95539,95549,95561,95569,95581,95597,95603,95617,
1273             95621,95629,95633,95651,95701,95707,95713,95717,
1274             95723,95731,95737,95747,95773,95783,95789,95791,
1275             95801,95803,95813,95819,95857,95869,95873,95881,
1276             95891,95911,95917,95923,95929,95947,95957,95959,
1277             95971,95987,95989,96001,96013,96017,96043,96053,
1278             96059,96079,96097,96137,96149,96157,96167,96179,
1279             96181,96199,96211,96221,96223,96233,96259,96263,
1280             96269,96281,96289,96293,96323,96329,96331,96337,
1281             96353,96377,96401,96419,96431,96443,96451,96457,
1282             96461,96469,96479,96487,96493,96497,96517,96527,
1283             96553,96557,96581,96587,96589,96601,96643,96661,
1284             96667,96671,96697,96703,96731,96737,96739,96749,
1285             96757,96763,96769,96779,96787,96797,96799,96821,
1286             96823,96827,96847,96851,96857,96893,96907,96911,
1287             96931,96953,96959,96973,96979,96989,96997,97001,
1288             97003,97007,97021,97039,97073,97081,97103,97117,
1289             97127,97151,97157,97159,97169,97171,97177,97187,
1290             97213,97231,97241,97259,97283,97301,97303,97327,
1291             97367,97369,97373,97379,97381,97387,97397,97423,
1292             97429,97441,97453,97459,97463,97499,97501,97511,
1293             97523,97547,97549,97553,97561,97571,97577,97579,
1294             97583,97607,97609,97613,97649,97651,97673,97687,
1295             97711,97729,97771,97777,97787,97789,97813,97829,
1296             97841,97843,97847,97849,97859,97861,97871,97879,
1297             97883,97919,97927,97931,97943,97961,97967,97973,
1298             97987,98009,98011,98017,98041,98047,98057,98081,
1299             98101,98123,98129,98143,98179,98207,98213,98221,
1300             98227,98251,98257,98269,98297,98299,98317,98321,
1301             98323,98327,98347,98369,98377,98387,98389,98407,
1302             98411,98419,98429,98443,98453,98459,98467,98473,
1303             98479,98491,98507,98519,98533,98543,98561,98563,
1304             98573,98597,98621,98627,98639,98641,98663,98669,
1305             98689,98711,98713,98717,98729,98731,98737,98773,
1306             98779,98801,98807,98809,98837,98849,98867,98869,
1307             98873,98887,98893,98897,98899,98909,98911,98927,
1308             98929,98939,98947,98953,98963,98981,98993,98999,
1309             99013,99017,99023,99041,99053,99079,99083,99089,
1310             99103,99109,99119,99131,99133,99137,99139,99149,
1311             99173,99181,99191,99223,99233,99241,99251,99257,
1312             99259,99277,99289,99317,99347,99349,99367,99371,
1313             99377,99391,99397,99401,99409,99431,99439,99469,
1314             99487,99497,99523,99527,99529,99551,99559,99563,
1315             99571,99577,99581,99607,99611,99623,99643,99661,
1316             99667,99679,99689,99707,99709,99713,99719,99721,
1317             99733,99761,99767,99787,99793,99809,99817,99823,
1318             99829,99833,99839,99859,99871,99877,99881,99901,
1319             99907,99923,99929,99961,99971,99989,99991,100003,
1320             100019,100043,100049,100057,100069,100103,100109,100129,
1321             100151,100153,100169,100183,100189,100193,100207,100213,
1322             100237,100267,100271,100279,100291,100297,100313,100333,
1323             100343,100357,100361,100363,100379,100391,100393,100403,
1324             100411,100417,100447,100459,100469,100483,100493,100501,
1325             100511,100517,100519,100523,100537,100547,100549,100559,
1326             100591,100609,100613,100621,100649,100669,100673,100693,
1327             100699,100703,100733,100741,100747,100769,100787,100799,
1328             100801,100811,100823,100829,100847,100853,100907,100913,
1329             100927,100931,100937,100943,100957,100981,100987,100999,
1330             101009,101021,101027,101051,101063,101081,101089,101107,
1331             101111,101113,101117,101119,101141,101149,101159,101161,
1332             101173,101183,101197,101203,101207,101209,101221,101267,
1333             101273,101279,101281,101287,101293,101323,101333,101341,
1334             101347,101359,101363,101377,101383,101399,101411,101419,
1335             101429,101449,101467,101477,101483,101489,101501,101503,
1336             101513,101527,101531,101533,101537,101561,101573,101581,
1337             101599,101603,101611,101627,101641,101653,101663,101681,
1338             101693,101701,101719,101723,101737,101741,101747,101749,
1339             101771,101789,101797,101807,101833,101837,101839,101863,
1340             101869,101873,101879,101891,101917,101921,101929,101939,
1341             101957,101963,101977,101987,101999,102001,102013,102019,
1342             102023,102031,102043,102059,102061,102071,102077,102079,
1343             102101,102103,102107,102121,102139,102149,102161,102181,
1344             102191,102197,102199,102203,102217,102229,102233,102241,
1345             102251,102253,102259,102293,102299,102301,102317,102329,
1346             102337,102359,102367,102397,102407,102409,102433,102437,
1347             102451,102461,102481,102497,102499,102503,102523,102533,
1348             102539,102547,102551,102559,102563,102587,102593,102607,
1349             102611,102643,102647,102653,102667,102673,102677,102679,
1350             102701,102761,102763,102769,102793,102797,102811,102829,
1351             102841,102859,102871,102877,102881,102911,102913,102929,
1352             102931,102953,102967,102983,103001,103007,103043,103049,
1353             103067,103069,103079,103087,103091,103093,103099,103123,
1354             103141,103171,103177,103183,103217,103231,103237,103289,
1355             103291,103307,103319,103333,103349,103357,103387,103391,
1356             103393,103399,103409,103421,103423,103451,103457,103471,
1357             103483,103511,103529,103549,103553,103561,103567,103573,
1358             103577,103583,103591,103613,103619,103643,103651,103657,
1359             103669,103681,103687,103699,103703,103723,103769,103787,
1360             103801,103811,103813,103837,103841,103843,103867,103889,
1361             103903,103913,103919,103951,103963,103967,103969,103979,
1362             103981,103991,103993,103997,104003,104009,104021,104033,
1363             104047,104053,104059,104087,104089,104107,104113,104119,
1364             104123,104147,104149,104161,104173,104179,104183,104207,
1365             104231,104233,104239,104243,104281,104287,104297,104309,
1366             104311,104323,104327,104347,104369,104381,104383,104393,
1367             104399,104417,104459,104471,104473,104479,104491,104513,
1368             104527,104537,104543,104549,104551,104561,104579,104593,
1369             104597,104623,104639,104651,104659,104677,104681,104683,
1370             104693,104701,104707,104711,104717,104723,104729);
1371              
1372             $|=1;
1373              
1374             sub Finder {
1375              
1376 8     8 1 20 my $ref = shift;
1377 8 50       29 if (! defined $ref) { return { Errors => [ "no input to Finder" ] }; }
  0         0  
1378 8         13 my %input = %{ $ref };
  8         43  
1379              
1380 8 50       30 return { Errors => [ "Start not defined" ] } if (! defined $input{'Start'} );
1381             # if ( ! defined $input{'Tests'} ) { $input{'Tests'} = "DM"; }
1382 8 50       29 if ( ! defined $input{'Tests'} ) { $input{'Tests'} = "M"; }
  8         22  
1383              
1384 8 50       37 $input{'D'}=750 if (! defined $input{'D'} );
1385              
1386 8 50       32 if ( ref($input{'Start'}) ne "Math::BigInt" ) { $input{'Start'} = Math::BigInt->new("$input{Start}"); }
  0         0  
1387 8         49 $input{'Candidate'}=$input{'Start'}->copy()->bsub(2);
1388              
1389 8         1891 OUTER: while (1) {
1390 851         6391 $input{'Candidate'}->badd(2);
1391 851         116634 my $Tests=$input{'Tests'};
1392 851         3272 while ( $Tests ) {
1393 851         3141 my $Test=substr($Tests,0,1,"");
1394 851 50       73245 print $Test if ( defined $input{'Verbose'} );
1395 851 50 33     4629 next OUTER if ( $Test eq 'D' && ! DivisionTest(\%input) );
1396 851 50 33     2706 next OUTER if ( $Test eq 'F' && ! FermatTest(\%input) );
1397 851 50 33     2672 next OUTER if ( $Test eq 'S' && ! SolovayStrassenTest(\%input) );
1398 851 100 66     4759 next OUTER if ( $Test eq 'M' && ! MillerRabinTest(\%input) );
1399             }
1400 8         30 last OUTER;
1401             }
1402 8 50       2173 print "\n" if ( defined $input{'Verbose'} );
1403 8         59 return \%input;
1404             }
1405              
1406             sub DivisionTest {
1407 0     0 1 0 my $ref = shift;
1408 0 0       0 if (! defined $ref) { return { Errors => [ "no input to DivisionTest" ] }; }
  0         0  
1409 0         0 my %input = %{ $ref };
  0         0  
1410 0 0       0 if (! defined $input{'Candidate'}) { return { Errors=> [ "no prime candidate to DivisionTest" ] }; }
  0         0  
1411 0 0       0 if ( ref($input{'Candidate'}) ne "Math::BigInt" ) { $input{'Candidate'} = Math::BigInt->new("$input{Candidate}"); }
  0         0  
1412 0 0       0 $input{'D'} = $#primes if (!defined $input{'D'});
1413              
1414 0         0 for (my $i=0;$i<$input{'D'};$i++) {
1415 0 0       0 if ( $input{'Candidate'}->copy()->bmod($primes[$i])->bcmp(0) == 0 ) { return 0; }
  0         0  
1416             }
1417 0 0       0 if ( defined $input{'Verbose'} ) { print "!"; }
  0         0  
1418 0         0 return 1; # Passed Division Test
1419             }
1420              
1421             sub FermatTest {
1422 0     0 1 0 my $ref = shift;
1423 0 0       0 if (! defined $ref) { return { Errors => [ "no input to FermatTest" ] }; }
  0         0  
1424 0         0 my %input = %{ $ref };
  0         0  
1425 0 0       0 if (! defined $input{'Candidate'}) { return { Errors => [ "no prime candidate to FermatTest" ] }; }
  0         0  
1426 0 0       0 if ( ref($input{'Candidate'}) ne "Math::BigInt" ) { $input{'Candidate'} = Math::BigInt->new("$input{Candidate}"); }
  0         0  
1427 0 0       0 $input{'F'} = 10 if (!defined $input{'F'});
1428              
1429 0         0 my %usedprimes;
1430 0         0 for (my $a=0;$a<$input{'F'};$a++) {
1431 0         0 my $i = int(rand($#primes)); while ( defined $usedprimes{$i} ) { $i = int(rand($#primes)); }
  0         0  
  0         0  
1432 0         0 my $prime = $primes[$i];
1433 0         0 my $y = $input{'Candidate'}->copy()->bdec();
1434 0         0 my $a = Math::BigInt->new("$prime"); # witness / liar
1435 0         0 my $m = $a->bmodpow($y,$input{'Candidate'});
1436 0 0       0 if ( $m->bcmp(1) != 0 ) { return 0; }
  0         0  
1437 0 0       0 print "." if ( defined $input{'Verbose'});
1438             }
1439 0 0       0 print "!" if ( defined $input{'Verbose'});
1440 0         0 return 1;
1441             }
1442              
1443             sub SolovayStrassenTest {
1444 0     0 1 0 my $ref = shift;
1445 0 0       0 if (! defined $ref) { return { Errors => [ "no input to SolovayStrassenTest" ] }; }
  0         0  
1446 0         0 my %input = %{ $ref };
  0         0  
1447 0 0       0 if (! defined $input{'Candidate'}) { return { Errors => [ "no prime candidate to SolovayStrassenTest" ] }; }
  0         0  
1448 0 0       0 if ( ref($input{'Candidate'}) ne "Math::BigInt" ) { $input{'Candidate'} = Math::BigInt->new("$input{Candidate}"); }
  0         0  
1449 0 0       0 $input{'S'} = 10 if (!defined $input{'S'});
1450              
1451 0         0 for my $i (1..$input{'S'}) {
1452 0         0 my $a = Random( { Lower => 2 , Upper => $input{'Candidate'}->copy()->bsub(2) } );
1453 0         0 my $nd2 = $input{'Candidate'}->copy()->bdec()->bdiv(2);
1454 0         0 my $r = $a->copy()->bmodpow( $nd2 ,$input{'Candidate'});
1455 0 0 0     0 if ( ( $r->bcmp(1) != 0 ) && ($r->bcmp($input{'Candidate'}->copy()->bdec()) != 0) ) { return 0; }
  0         0  
1456 0         0 my $s=JacobiSymbol($a,$input{'Candidate'});
1457 0         0 my $sm=$s->copy()->bmod($input{'Candidate'});
1458 0 0       0 if ($r->bcmp($s->bmod($input{'Candidate'})) != 0 ) { return 0; }
  0         0  
1459 0 0       0 print "." if ( defined $input{'Verbose'});
1460             }
1461 0 0       0 print "!" if ( defined $input{'Verbose'});
1462 0         0 return 1;
1463             }
1464              
1465             sub JacobiSymbol {
1466 0     0 1 0 my $a=shift;
1467 0         0 my $n=shift; #should be odd, and > a, and > 3
1468 0 0       0 if ( ref($a) ne "Math::BigInt" ) { $a = Math::BigInt->new("$a"); }
  0         0  
1469 0 0       0 if ( ref($n) ne "Math::BigInt" ) { $n = Math::BigInt->new("$n"); }
  0         0  
1470 0 0       0 die "n is even in JacobiSymbol" if ( $n->is_even() );
1471 0 0       0 die "n<=a" if ( $n->bcmp($a) < 0 );
1472 0 0       0 die "n<3" if ( $n->bcmp(3) < 0 );
1473             # Trivial Results
1474 0 0       0 return $a->copy() if ( $a->bcmp(0) == 0 );
1475 0 0       0 return $a->copy() if ( $a->bcmp(1) == 0 );
1476             # Keep halving a until it's an odd number to satisfy 2^e * a1 == a
1477 0         0 my $e=0;
1478 0         0 my $a1=$a->copy();
1479 0         0 while ( $a1->is_even() ) { $e++; $a1->brsft(1); }
  0         0  
  0         0  
1480             #calculate s
1481 0         0 my $s=-1;
1482 0 0       0 if ( $e % 2 == 0 ) { $s=1 }
  0         0  
1483             else {
1484 0         0 my $n8 = $n->copy()->bmod(8)->numify();
1485 0 0 0     0 if ( $n8 == 1 || $n8 == 7 ) { $s=1; }
  0         0  
1486             }
1487 0 0 0     0 if ( ( $n->copy()->bmod(4)->numify() == 3 ) && ( $a1->copy()->bmod(4)->numify() == 3 ) ) { $s *= -1; }
  0         0  
1488             # Iterate until $a1=1 multiplying by s each time
1489 0 0       0 return ($a1->bcmp(1)==0)?Math::BigInt->new("$s"):JacobiSymbol($n->copy()->bmod($a1),$a1)->bmul($s);
1490             }
1491              
1492             sub MillerRabinTest {
1493 851     851 1 2045 my $ref = shift;
1494 851 50       2582 if (! defined $ref) { return { Errors => [ "no input to MillerRabinTest" ] }; }
  0         0  
1495 851         1613 my %input = %{ $ref };
  851         7140  
1496 851 50       3525 if (! defined $input{'Candidate'}) { return { Errors => [ "no prime candidate to MillerRabinTest" ] }; }
  0         0  
1497 851 50       2755 if ( ref($input{'Candidate'}) ne "Math::BigInt" ) { $input{'Candidate'} = Math::BigInt->new("$input{Candidate}"); }
  0         0  
1498              
1499 851 50       3691 return { Errors => ["n < 3"] } if ( $input{'Candidate'}->bcmp(3) < 0 );
1500 851 50       79307 if ( ! defined $input{'M'} ) { # count bits and estimate t (guess for 0-100)
1501 851         7284 my @MRTests = qw(0 50 100 27 150 18 200 15 250 12 300 9 350 8 400 7 450 6 550 5 650 4 850 3 1300 2);
1502 851         4940 my $bits=length($input{'Candidate'}->as_bin())-2;
1503 851 100       611663 for (my $i=0;$i<26;$i+=2) { if ($bits > $MRTests[$i]) { $input{'M'}=$MRTests[$i+1]; } else { last; } }
  5106         12808  
  4255         11599  
  851         3032  
1504             }
1505              
1506 851         4624 my $n1=$input{'Candidate'}->copy()->bdec();
1507 851         68134 my $s=0;
1508 851         2730 my $r=$n1->copy();
1509 851         15918 while ( $r->is_even() ) { $s++; $r->brsft(1); }
  1709         160070  
  1709         6438  
1510 851         167541 for my $i (1 .. $input{'M'}) {
1511 939         3966 my $a=Random( { Lower => 2 , Upper => $input{'Candidate'}->copy()->bsub(2) } );
1512 939         5802 my $y=$a->copy()->bmodpow($r,$input{'Candidate'});
1513 939 100 100     222941237 if ($y->bcmp(1) != 0 && $y->bcmp($n1) != 0) {
1514 867         166535 foreach my $j (1..($s-1)) {
1515 887 100       39528 last if ( $y->bcmp($n1) == 0 );
1516 883         24450 $y->bmodpow(2,$input{'Candidate'});
1517 883 50       1285307 if ( $y->bcmp(1) == 0 ) { return 0; }
  0         0  
1518             }
1519 867 100       39550 if ( $y->bcmp($n1) != 0 ) { return 0; }
  843         36320  
1520             }
1521 96 50       21835 print "." if ( defined $input{'Verbose'});
1522             }
1523 8 50       444 print "!" if ( defined $input{'Verbose'});
1524 8         159 return 1;
1525             }
1526              
1527             sub Create {
1528 4     4 1 6 my $ref=shift;
1529 4 50       14 if (! defined $ref) { return { Errors => [ "no input to GenRSAKey" ] }; }
  0         0  
1530 4         5 my %input = %{ $ref };
  4         22  
1531 4 50       22 if (! defined $input{'Bits'}) { $input{'Bits'}=512; }
  0         0  
1532 4         5 my $Nbits=${$ref}{'Bits'};
  4         11  
1533 4         9 my $Nbitp=int ($Nbits/2);
1534 4         7 my ($x,$y,$n,$d,$e,$dp,$dq,$phi,$len,$iqmp);
1535              
1536 4         6 while ( 1 ) {
1537 4         29 $x=Random( { RandomFile => $input{'RandomFile'} , Bits => $Nbitp , Parity => 'Odd' } );
1538 4 50 33     36 if (defined $input{'Verbose'} && $input{'Verbose'} =~ /^y/i) {$x=${Finder({Start=>$x,Verbose=>'y'})}{'Candidate'};}
  4         7  
  4         21  
1539 0         0 else { $x=${ Finder( { Start=>$x }) }{'Candidate'}; }
  0         0  
1540             #find range for second number
1541 4         73 my $minq=Math::BigInt->new(2)->bpow(($Nbits-1))->bdiv($x);
1542 4         5504 my $maxq=Math::BigInt->new(2)->bpow(($Nbits))->bdec()->bdiv($x);
1543 4         4735 $y=Random( { RandomFile => ${$ref}{'RandomFile'} , Lower => $minq , Upper => $maxq , Parity => 'Odd' } );
  4         39  
1544 4 50 33     59 if (defined $input{'Verbose'} && $input{'Verbose'} =~ /^y/i) {$y=${Finder({Start=>$y,Verbose=>'y'})}{'Candidate'};}
  4         6  
  4         25  
1545 0         0 else { $y=${ Finder( { Start=>$y }) }{'Candidate'}; }
  0         0  
1546              
1547 4         47 $n=$x->copy()->bmul($y);
1548 4         1175 $e=65537;
1549 4         17 $phi=$x->copy()->bdec()->bmul( $y->copy()->bdec() );
1550 4         1424 $d=Math::BigInt->new("$e")->bmodinv($phi);
1551 4         4963 $dp=$d->copy()->bmod($x->copy()->bdec());
1552 4         2243 $dq=$d->copy()->bmod($y->copy()->bdec());
1553 4         2062 $iqmp=$y->copy()->bmodinv($x);
1554              
1555             last if (
1556 4 50 33     70996 $n->copy()->broot(4)->bdiv(3)->bcmp($d) <= 1 && # Test for Michael J. Wiener's RSA key weakness
1557             $n->copy()->broot(4)->bmul(2)->bcmp( $x->copy()->bsub($y)->babs() ) < 1 # Test for Fermat factorization weekness
1558             );
1559             }
1560              
1561 4         39379 $len=(length($n->as_hex())-2)*4;
1562              
1563 4 50       6667 if ( $len != $Nbits ) { return \{ Errors => [ "Number of bits in modulus did not match" ] }; }
  0         0  
1564             return {
1565 4         82 Modulus => $n,
1566             PublicExponent => $e,
1567             PrivateExponent => $d,
1568             Prime1 => $x,
1569             Prime2 => $y,
1570             Exponent1 => $dp,
1571             Exponent2 => $dq,
1572             Iqmp => $iqmp,
1573             Phi => $phi,
1574             Bits => $len
1575             };
1576             }
1577              
1578             1;
1579              
1580             __END__