/******************************************************************************/ /* */ /* COMPUTE 3N+1 OR 3N-1 SEQUENCE (tree for k<=26, more efficient algorithm) */ /* 01/18/10 (dkc) */ /* */ /* This C program generates sequence vectors of live limbs. The error in */ /* approximating z is computed. The maximum and minimum y values are */ /* computed for sequence vectors. The maximum and minimum z values are */ /* also computed for sequence vectors. For limb lengths of 4, 9, 14, 22, */ /* 27, 35, 40, ..., the maximum z value, minimum y value ratio is less than */ /* 3/2. For limb lengths of 7, 12, 17, 20, 25, 30, 33, 38, ..., the minimum */ /* z value, maximum y value ratio is greater than 3/4. */ /* */ /******************************************************************************/ #include <stdio.h> #include <math.h> void add64(unsigned int *a, unsigned int *b); void shift(unsigned int *a, unsigned int *b, unsigned int c); int main () { // unsigned int order=50331648; // order unsigned int tflag=0; // A, B, C, or D (0, 1, 2, 3) (k=26) // // A or B (0 or 1) (k=25) int c=1; // c unsigned int l=22; // specified limb length unsigned int a=9; // number of elements in sv unsigned int b=9; // number of sequence vectors // unsigned int d,e,f,g,h,i,j,n,t,u,mask,count,flag,offset,first; // indices unsigned int savea,saveb; int k,m; unsigned int X[2],Y[2]; unsigned int v[66]; // sequence vector unsigned int maxy[66]; // maximum y value array unsigned int miny[66]; // minimum y value array unsigned int maxz[66]; // maximum z value array unsigned int minz[66]; // minimum z value array unsigned int he[66]; // sequence vector histogram unsigned int s[131072]; // duplicate array, minimum size=(order/12)/32 unsigned int ho[512]; // histogram of lengths unsigned int dist[200]; // histogram of z values int num[19]={1,-1,7,5,-17,47,13,-217,295,-139,1909,1631,-3299, 13085,6487,-46075,84997,-7153,502829}; int den[19]={4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384, 32768,65536,131072,262144,524288,2097152}; unsigned int len[19]={2,4,5,7,9,10,12,14,15,17,18,20,22,23,25,27,28,30,33}; unsigned int aa[19]= {0,0,0,1,1, 0, 2, 2, 0, 3, 0, 4, 4, 0, 5, 5, 0, 6, 7}; unsigned int bb[19]= {1,2,0,2,3, 0, 3, 4, 0, 4, 0, 4, 5, 0, 5, 6, 0, 6, 6}; unsigned int y[40]={0,3,6,8,11, // B (invalid lengths) 13,16,19,21,24, // B 26,29,32,34,37, // B 39,42,44,47,50, // C 52,55,57,60,63, // C 65,68,70,73,75, // D 78,81,83,86,88, // D 91,94,96,99,101}; // D //int z[1]={2}; // length=2 //int z[1]={10}; // length=4 //int z[1]={58}; // length=7 //int z[1]={206}; // length=9 //unsigned int z[2]={ // length=12, live only // 986,842}; //unsigned int z[2]={ // length=14, live only // 2782,3214}; //unsigned int z[5]={ // length=17, live only // 14314,11434,12586,10138,11290}; //unsigned int z[5]={ // length=20, live only // 54718,49534,50110,44926,61630}; unsigned int z[9]={ // length=22, live only 156794,158522,172346,193082,145130,142970,132602,131306,120938}; //unsigned int z[19]={ // length=25, live only // 666542,532910,569774,574382,728750,611246,636590,673454,811694,619886,486254, // 523118,527726,564590,451262,492734,584894,488126,529598}; //unsigned int z[23]={ // length=27, live only // 1788682,1654330,2065162,1975306,2251786,1774858,1524298,1899274,1648714, // 2500618,1925194,1541578,1326010,1634890,1419322,1759306,1529914,1543738, // 1820218,1664266,1430986,2085898,1436602}; //unsigned int z[66]={ // length=30, live only // 10356766,9361438,8697886,8614942,8255518,8055070,7960606,7951390,7635166, // 7509022,7453726,7391518,7320238,7214110,7011358,6971614,6949150,6893854, // 6716446,6679582,6656686,6654238,6529246,6520606,6473950,6451486,6384670, // 6234334,6214318,6159022,6156574,6119710,6100702,6078238,6031582,5919406, // 5824798,5820766,5785774,5783326,5746462,5736670,5716654,5699806,5658334, // 5505838,5451550,5421742,5404894,5384878,5378398,5363422,5343406,5326558, // 5089966,5083486,5063470,5048494,5046622,5031646,5011630,4768558,4751710, // 4731694,4716718,4436782}; //unsigned int z[66]={ // length=33, live only // 38508634,35854426,35522650,34084954,33283162,32905306,32868442,31603546, // 31098970,30877786,30343834,29919322,28949338,28859482,28638298,27928666, // 27781210,27689626,27679834,27179866,27145306,26958682,26868826,26601562, // 26000218,25920154,25698970,25689178,25541722,25465690,25189210,24740506, // 24362074,24345946,24196186,24048730,24009562,23862106,23696218,23086234, // 22869082,22749850,22682458,22602394,22576474,22436506,22369114,21422746, // 21396826,21316762,21256858,21249370,21189466,21109402,20137114,20069722, // 19989658,19929754,18810010,42489946,30628954,29108314,25375834,24205978, // 23929498,22516570}; //unsigned int sv[1*1]={ // length=2, live only // 1}; //unsigned int sv[2*1]={ // length=4, live only // 1, 1}; //unsigned int sv[3*1]={ // length=7, live only // 1, 2, 1}; //unsigned int sv[4*1]={ // length=9, live only // 1, 2, 1, 1}; //unsigned int sv[5*2]={ // length=12, live only // 1, 2, 2, 1, 1, // 986 // 1, 2, 1, 2, 1}; // 842 //unsigned int sv[6*2]={ // length=14, live only // 1, 2, 2, 1, 1, 1, // 3214 // 1, 2, 1, 2, 1, 1}; // 2782 //unsigned int sv[7*5]={ // length=17, live only // 1, 2, 2, 2, 1, 1, 1, // 14314 // 1, 2, 2, 1, 2, 1, 1, // 12586 // 1, 2, 2, 1, 1, 2, 1, // 11434 // 1, 2, 1, 2, 2, 1, 1, // 11290 // 1, 2, 1, 2, 1, 2, 1}; // 10138 //unsigned int sv[8*5]={ // length=20, live only // 1, 2, 2, 2, 2, 1, 1, 1, // 61630 // 1, 2, 2, 2, 1, 2, 1, 1, // 54718 // 1, 2, 2, 2, 1, 1, 2, 1, // 50110 // 1, 2, 2, 1, 2, 2, 1, 1, // 49534 // 1, 2, 2, 1, 2, 1, 2, 1}; // 44926 unsigned int sv[9*9]={ // length=22, live only 1, 2, 2, 2, 2, 1, 1, 1, 1, // 193082 1, 2, 2, 2, 1, 2, 1, 1, 1, // 172346 1, 2, 2, 2, 1, 1, 2, 1, 1, // 158522 1, 2, 2, 1, 2, 2, 1, 1, 1, // 156794 1, 2, 1, 2, 2, 2, 1, 1, 1, // 145130 1, 2, 2, 1, 2, 1, 2, 1, 1, // 142970 1, 2, 2, 1, 1, 2, 2, 1, 1, // 132602 1, 2, 1, 2, 2, 1, 2, 1, 1, // 131306 1, 2, 1, 2, 1, 2, 2, 1, 1}; // 120938 /* unsigned int sv[10*19]={ // length=25, live only 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, // 811694 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, // 728750 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, // 673454 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, // 666542 1, 2, 2, 2, 2, 1, 1, 1, 2, 1, // 636590 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, // 619886 1, 2, 2, 2, 1, 2, 1, 2, 1, 1, // 611246 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, // 584894 1, 2, 2, 2, 1, 2, 1, 1, 2, 1, // 574382 1, 2, 2, 2, 1, 1, 2, 2, 1, 1, // 569774 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, // 564590 1, 2, 2, 2, 1, 1, 2, 1, 2, 1, // 532910 1, 2, 1, 2, 2, 2, 1, 2, 1, 1, // 529598 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, // 527726 1, 2, 2, 1, 2, 1, 2, 2, 1, 1, // 523118 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, // 492734 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, // 488126 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, // 486254 1, 2, 1, 2, 2, 1, 2, 1, 2, 1}; // 451262 */ /* unsigned int sv[11*23]={ // length=27, live only 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, // 2500618 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, // 2251786 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, // 2085898 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1, // 2065162 1, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, // 1975306 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, // 1925194 1, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1, // 1899274 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, // 1820218 1, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, // 1788682 1, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, // 1774858 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 1, // 1759306 1, 2, 2, 2, 1, 1, 2, 1, 2, 1, 1, // 1664266 1, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, // 1654330 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, // 1648714 1, 2, 2, 1, 2, 1, 2, 2, 1, 1, 1, // 1634890 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, // 1543738 1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1, // 1541578 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, // 1529914 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, // 1524298 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 1, // 1436602 1, 2, 2, 1, 1, 2, 2, 1, 2, 1, 1, // 1430986 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, // 1419322 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 1}; // 1326010 */ /* unsigned int sv[12*66]={ // length=30, live only 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, // 10356766 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, // 9361438 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, // 8697886 1, 2, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1, // 8614942 1, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, // 8255518 1, 2, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, // 8055070 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 1, // 7960606 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1, // 7951390 1, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, // 7635166 1, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, // 7509022 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, // 7453726 1, 2, 2, 2, 1, 2, 2, 1, 2, 1, 1, 1, // 7391518 1, 2, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, // 7320238 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 1, // 7214110 1, 2, 2, 2, 2, 1, 1, 2, 1, 2, 1, 1, // 7011358 1, 2, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, // 6971614 1, 2, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, // 6949150 1, 2, 2, 2, 1, 2, 1, 2, 2, 1, 1, 1, // 6893854 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, // 6716446 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, // 6679582 1, 2, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, // 6656686 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 1, // 6654238 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, // 6529246 1, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1, // 6520606 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, // 6473950 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, // 6451486 1, 2, 2, 2, 2, 1, 1, 1, 2, 1, 2, 1, // 6384670 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 2, 1, // 6234334 1, 2, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, // 6214318 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, // 6159022 1, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, // 6156574 1, 2, 2, 2, 1, 2, 1, 1, 2, 2, 1, 1, // 6119710 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 1, // 6100702 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 1, // 6078238 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, // 6031582 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 2, 1, // 5919406 1, 2, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, // 5824798 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, // 5820766 1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, // 5785774 1, 2, 2, 2, 1, 1, 2, 2, 1, 1, 2, 1, // 5783326 1, 2, 2, 2, 1, 1, 2, 1, 2, 2, 1, 1, // 5746462 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, // 5736670 1, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 1, // 5716654 1, 2, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1, // 5699806 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 1, // 5658334 1, 2, 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, // 5505838 1, 2, 2, 2, 1, 1, 2, 1, 2, 1, 2, 1, // 5451550 1, 2, 1, 2, 2, 2, 1, 2, 1, 1, 2, 1, // 5421742 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, // 5404894 1, 2, 1, 2, 2, 2, 1, 1, 2, 2, 1, 1, // 5384878 1, 2, 2, 1, 1, 2, 2, 2, 1, 2, 1, 1, // 5378398 1, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2, 1, // 5363422 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, // 5343406 1, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 1, // 5326558 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 2, 1, // 5089966 1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, // 5083486 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 1, 1, // 5063470 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, // 5048494 1, 2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, // 5046622 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, // 5031646 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 1, // 5011630 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, // 4768558 1, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, // 4751710 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, // 4731694 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, // 4716718 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1}; // 4436782 */ /* unsigned int sv[13*66]={ // length=33, live only 1,2,2,2,2,2,2,2,1,1,1,1,1, // 42489946 1,2,2,2,2,2,2,1,2,1,1,1,1, // 38508634 1,2,2,2,2,2,2,1,1,2,1,1,1, // 35854426 1,2,2,2,2,2,1,2,2,1,1,1,1, // 35522650 1,2,2,2,2,2,2,1,1,1,2,1,1, // 34084954 1,2,2,2,2,1,2,2,2,1,1,1,1, // 33283162 1,2,2,2,2,2,2,1,1,1,1,2,1, // 32905306 1,2,2,2,2,2,1,2,1,2,1,1,1, // 32868442 1,2,2,2,1,2,2,2,2,1,1,1,1, // 31603546 1,2,2,2,2,2,1,2,1,1,2,1,1, // 31098970 1,2,2,2,2,2,1,1,2,2,1,1,1, // 30877786 1,2,2,2,2,1,2,2,1,2,1,1,1, // 30628954 1,2,2,1,2,2,2,2,2,1,1,1,1, // 30343834 1,2,2,2,2,2,1,2,1,1,1,2,1, // 29919322 1,2,2,2,2,2,1,1,2,1,2,1,1, // 29108314 1,2,2,2,1,2,2,2,1,2,1,1,1, // 28949338 1,2,2,2,2,1,2,2,1,1,2,1,1, // 28859482 1,2,2,2,2,1,2,1,2,2,1,1,1, // 28638298 1,2,2,2,2,2,1,1,2,1,1,2,1, // 27928666 1,2,2,2,2,2,1,1,1,2,2,1,1, // 27781210 1,2,2,1,2,2,2,2,1,2,1,1,1, // 27689626 1,2,2,2,2,1,2,2,1,1,1,2,1, // 27679834 1,2,2,2,1,2,2,2,1,1,2,1,1, // 27179866 1,2,2,2,2,1,1,2,2,2,1,1,1, // 27145306 1,2,2,2,1,2,2,1,2,2,1,1,1, // 26958682 1,2,2,2,2,1,2,1,2,1,2,1,1, // 26868826 1,2,2,2,2,2,1,1,1,2,1,2,1, // 26601562 1,2,2,2,1,2,2,2,1,1,1,2,1, // 26000218 1,2,2,1,2,2,2,2,1,1,2,1,1, // 25920154 1,2,2,1,2,2,2,1,2,2,1,1,1, // 25698970 1,2,2,2,2,1,2,1,2,1,1,2,1, // 25689178 1,2,2,2,2,1,2,1,1,2,2,1,1, // 25541722 1,2,2,2,1,2,1,2,2,2,1,1,1, // 25465690 1,2,2,2,2,1,1,2,2,1,2,1,1, // 25375834 1,2,2,2,1,2,2,1,2,1,2,1,1, // 25189210 1,2,2,1,2,2,2,2,1,1,1,2,1, // 24740506 1,2,2,2,2,1,2,1,1,2,1,2,1, // 24362074 1,2,2,2,1,1,2,2,2,2,1,1,1, // 24345946 1,2,2,1,2,2,1,2,2,2,1,1,1, // 24205978 1,2,2,2,2,1,1,2,2,1,1,2,1, // 24196186 1,2,2,2,2,1,1,2,1,2,2,1,1, // 24048730 1,2,2,2,1,2,2,1,2,1,1,2,1, // 24009562 1,2,2,1,2,2,2,1,2,1,2,1,1, // 23929498 1,2,2,2,1,2,2,1,1,2,2,1,1, // 23862106 1,2,2,2,1,2,1,2,2,1,2,1,1, // 23696218 1,2,2,1,2,1,2,2,2,2,1,1,1, // 23086234 1,2,2,2,2,1,1,2,1,2,1,2,1, // 22869082 1,2,2,1,2,2,2,1,2,1,1,2,1, // 22749850 1,2,2,2,1,2,2,1,1,2,1,2,1, // 22682458 1,2,2,1,2,2,2,1,1,2,2,1,1, // 22602394 1,2,2,2,1,1,2,2,2,1,2,1,1, // 22576474 1,2,2,2,1,2,1,2,2,1,1,2,1, // 22516570 1,2,2,1,2,2,1,2,2,1,2,1,1, // 22436506 1,2,2,2,1,2,1,2,1,2,2,1,1, // 22369114 1,2,2,1,2,1,2,2,2,1,2,1,1, // 21316762 1,2,2,1,2,2,1,2,2,1,1,2,1, // 21256858 1,2,2,2,1,1,2,2,1,2,2,1,1, // 21249370 1,2,2,2,1,2,1,2,1,2,1,2,1, // 21189466 1,2,2,1,2,2,2,1,1,2,1,2,1, // 21422746 1,2,2,2,1,1,2,2,2,1,1,2,1, // 21396826 1,2,2,1,2,2,1,2,1,2,2,1,1, // 21109402 1,2,2,1,2,1,2,2,2,1,1,2,1, // 20137114 1,2,2,2,1,1,2,2,1,2,1,2,1, // 20069722 1,2,2,1,2,1,2,2,1,2,2,1,1, // 19989658 1,2,2,1,2,2,1,2,1,2,1,2,1, // 19929754 1,2,2,1,2,1,2,2,1,2,1,2,1}; // 18810010 */ int r,del,savex; double x,dx,maxr,minr,rat,ratio; double maxmin[2*66]; unsigned int savem; FILE *Outfp; Outfp = fopen("out6a.dat","w"); if ((l==5)||(l==10)||(l==15)||(l==18)||(l==23)||(l==28)) { printf("dead limbs \n"); goto zskip; } if (l>33) { printf("length too big \n"); goto zskip; } if (order>50331648*4) { printf("order too big \n"); goto zskip; } if (c<-1) { printf("c too small \n"); goto zskip; } if (c>1) { printf("c too big \n"); goto zskip; } if (c==1) offset=8; else offset=4; for (i=0; i<200; i++) // clear distribution of e values dist[i]=0; for (i=0; i<512; i++) // clear histogram of lengths ho[i]=0; for (i=0; i<131072; i++) // clear duplicate array s[i]=0; for (i=0; i<66; i++) { // clear maximum y values maxy[i]=0; miny[i]=0x7fffffff; maxz[i]=0; minz[i]=0x7fffffff; he[i]=0; // clear histogram of sv's } for (i=0; i<66; i++) { maxmin[2*i]=0.0; maxmin[2*i+1]=1000000.0; } fprintf(Outfp,"ORDER=%d c=%d \n",order,c); // // limbs in A, B, C, and D // g=0; // clear counter count=0; // clear counter maxr=0.0; minr=1000000.0; for (i=order/2; i<order; i+=2) { // possible starting elements if ((i-offset)==((i-offset)/12)*12) // check for elements of U continue; k=i; // back-track if (k!=(k/3)*3) { // check for dead limb if ((k-c)!=((k-c)/3)*3) { // check for beginning of limb goto askip; } k=(k-c)/3; // previous number in sequence if (k==(k/3)*3) // check for dead limb goto bskip; k=k*2; // previous number in sequence while ((k<(int)(order/2))||((k-c)==((k-c)/3)*3)) { // check for beginning if ((k-c)==((k-c)/3)*3) { k=(k-c)/3; // previous number in sequence if (k==(k/3)*3) // check for dead limb goto bskip; k=k*2; // previous number in sequence } else k=k*2; // previous number in sequence } } askip: m=k; // save beginning of limb n=1; // set length while (k==(k/2)*2) { // check for even element k=k/2; // next element of limb n=n+1; // increment length } for (j=1; j<1000000; j++) { // iterate until end of limb h=3*k+c; // next element of limb if (h>order) { // check for end of limb if (k<(int)(order/3)) goto bskip; if (order<=50331648) t=((k-(order/3))-1)/2; // index into array if (order==50331648*2) { if (tflag==0) { if ((k-1)!=((k-1)/4)*4) goto bskip; } if (tflag==1) { if ((k-3)!=((k-3)/4)*4) goto bskip; } if (tflag>1) printf("error: flag=%d \n",tflag); t=((k-(order/3))-1)/4; // index into array } if (order==50331648*4) { if (tflag==0) { if ((k-1)!=((k-1)/8)*8) goto bskip; } if (tflag==1) { if ((k-3)!=((k-3)/8)*8) goto bskip; } if (tflag==2) { if ((k-5)!=((k-5)/8)*8) goto bskip; } if (tflag==3) { if ((k-7)!=((k-7)/8)*8) goto bskip; } if (tflag>3) printf("error: flag=%d \n",tflag); t=((k-(order/3))-1)/8; // index into array } u=t-(t/32)*32; // fractional portion of index t=t/32; // integer portion of index mask=1<<u; // set mask if ((s[t]&mask)==0) // check if bit not set s[t]=s[t]|mask; // set bit in array else // already set goto bskip; g=g+1; // increment counter if (n<512) // check length ho[n]=ho[n]+1; // histogram length else { printf("error: histogram array not big enough \n"); goto zskip; } if (n!=l) // continue if not specified length goto bskip; if (m==(m/3)*3) goto bskip; r=(int)(m)-(int)(h/2); // difference of first elements savem=m; for (f=0; f<19; f++) { if (n==len[f]) { savea=aa[f]; saveb=bb[f]; savex=den[f]; x=(double)m; x=x*(double)num[f]; dx=(double)r; dx=dx*(double)den[f]; x=x-dx; del=(int)x; flag=0; for (e=0; e<b; e++) { if (del==c*(int)z[e]) { flag=z[e]; goto fskip; } } printf("error: no solution of Diophantine equation found \n"); goto zskip; fskip: if (l==2) { v[0]=1; f=1; goto dskip; } f=0; if ((m&1)==0) { count=0; while ((m&1)==0) { count=count+1; m=m/2; } v[0]=count; f=1; } first=1; while (m!=k) { if ((m&1)==0) { m=m/2; count=count+1; } else { m=3*m+c; if (first==0) { v[f]=count; f=f+1; if (f>16) { printf("error: sequence vector array not big enough \n"); goto zskip; } } else first=0; count=0; } } v[f]=count; f=f+1; dskip: if (f!=a) { printf("error: incorrect sequence vector length \n"); goto zskip; } x=0.5; for (d=0; d<b; d++) { for (j=0; j<a; j++) { if (v[j]!=sv[j+a*d]) goto eskip; if (sv[j+a*d]==1) x=x*1.5; else x=x*0.75; } // // delta=z-(y/2)((3/4)**a)*((3/2)**b), then multiply by X/y // (same as X((z/y)-(1/2)((3/4)**a)*((3/2)**b)) // rat=(double)savex*((double)(h/2)/(double)savem-x); if (dist[d]==0) { printf("limb=(%d, %d)=>%d, z'=%e, del=%e \n", savem,k,h/2,x*(double)savem,(double)(h/2)-x*(double)savem); printf("del/y=%e, r=%e, index=%d \n", (double)(h/2)/(double)savem-x,rat,d); fprintf(Outfp,"del/y=%e, r=%e, index=%d, z=%d \n", (double)(h/2)/(double)savem-x,rat,d,flag); printf("\n"); } dist[d]=dist[d]+1; if (rat<0.0) rat=-rat; if (rat>maxr) maxr=rat; if (rat<minr) minr=rat; if (rat>maxmin[2*d]) maxmin[2*d]=rat; if (rat<maxmin[2*d+1]) maxmin[2*d+1]=rat; if (savem>maxy[d]) maxy[d]=savem; if (savem<miny[d]) miny[d]=savem; if ((h/2)>maxz[d]) maxz[d]=h/2; if ((h/2)<minz[d]) minz[d]=h/2; he[d]=he[d]+1; // // check if o=[(y/2)(3/4)**a]+0,1 // if (d==0) { if ((l==2)||(l==4)) goto bskip; X[0]=0; X[1]=savem/2; for (j=0; j<savea; j++) { Y[0]=X[0]; Y[1]=X[1]; add64(Y, X); add64(Y, X); } shift(X, X, 2*savea); m=(int)X[1]; if ((c==1)&&(m!=(m/2)*2)) { printf("error: o is odd \n"); goto zskip; } if ((c==-1)&&(m==(m/2)*2)) { printf("error: o is even \n"); goto zskip; } if (c==1) m=m+1; m=m+c; for (j=0; j<saveb; j++) { m=m/2; m=m*3; } m=m-c; if (m!=(int)(h/2)) { printf("error: y=%d, o=%d, z=%d \n",savem,m,h/2); goto zskip; } } goto bskip; eskip: x=0.5; } printf("error: sequence vector not found \n"); fprintf(Outfp,"error: sequence vector not found \n"); goto zskip; } } goto bskip; } k=h; // next element if (k==(k/8)*8) // not valid limb, start over goto bskip; // (prevents taking even path at nodes) n=n+1; // increment length while (k==(k/2)*2) { // check for even element k=k/2; // next element n=n+1; // increment length } } bskip: n=0; } printf("maxr=%e, minr=%e \n",maxr,minr); // // compute upper bound // if (l>4) { printf("\n"); x=2.0; j=4; for (i=0; i<a; i++) { if (sv[i]==1) { x=x*1.5; j=j<<1; } else j=j<<2; } x=x-1.0; x=x*(double)j; x=x/(double)order; printf("upper bound of X(delta/y)=%e \n",x); } // // DISTRIBUTION OF Z VALUES // printf("\n"); fprintf(Outfp,"\n"); printf("distribution of e values \n"); for (i=0; i<b; i++) { printf("i=%d, d=%d, max=%e, min=%e \n",i,dist[i],maxmin[2*i],maxmin[2*i+1]); fprintf(Outfp,"i=%d, d=%d, max=%e, min=%e \n",i,dist[i],maxmin[2*i],maxmin[2*i+1]); } printf("\n"); printf("maximum y values \n"); for (i=0; i<b; i++) printf(" i=%d, max=%d, n=%d, ratio=%e \n",i,maxy[i],he[i],(double)maxy[i]/(double)order); printf("\n"); printf("minimum y values \n"); for (i=0; i<b; i++) printf(" i=%d, min=%d, n=%d, ratio=%e \n",i,miny[i],he[i],(double)miny[i]/(double)order); printf("\n"); printf("maximum z values \n"); for (i=0; i<b; i++) printf(" i=%d, max=%d, n=%d, ratio=%e \n",i,maxz[i],he[i],(double)maxz[i]/(double)order); printf("\n"); printf("minimum z values \n"); for (i=0; i<b; i++) printf(" i=%d, min=%d, n=%d, ratio=%e \n",i,minz[i],he[i],(double)minz[i]/(double)order); if ((l==7)||(l==12)||(l==17)||(l==20)||(l==25)||(l==30)||(l==33)) flag=1; else flag=0; printf("\n"); printf("maximum z/minimum y values \n"); for (i=0; i<b; i++) { ratio=(double)maxz[i]/(double)miny[i]; printf("maximum z/minimum y=%e \n",ratio); if ((flag==0)&&(ratio>1.5)) { printf("error: ratio>1.5 \n"); goto zskip; } } printf("\n"); printf("minimum z/maximum y values \n"); for (i=0; i<b; i++) { ratio=(double)minz[i]/(double)maxy[i]; printf("minimum z/maximum y=%e \n",ratio); if ((flag==1)&&(ratio<.75)) { printf("error: ratio<.75 \n"); goto zskip; } } // // check for valid lengths // for (i=0; i<40; i++) { if (ho[y[i]]!=0) { printf("error: n=%d \n",y[i]); goto zskip; } } // // HISTOGRAM OF LENGTHS // if (order<=50331648) { if (g!=(order/12)) { printf("error: incorrect number of entries in histogram \n"); printf("g=%d, order/12=%d \n",g,order/12); goto zskip; } } if (order==(50331648*2)) { if (g!=(order/24)) { printf("error: incorrect number of entries in histogram \n"); printf("g=%d, order/12=%d \n",g,order/12); goto zskip; } } if (order==(50331648*4)) { if (g!=(order/48)) { printf("error: incorrect number of entries in histogram \n"); printf("g=%d, order/12=%d \n",g,order/12); goto zskip; } } fprintf(Outfp,"\n"); printf("\n"); fprintf(Outfp,"HISTOGRAM: number of entries=%d \n",g); printf("HISTOGRAM: number of entries=%d \n",g); for (h=0; h<64; h++) { fprintf(Outfp," %d %d %d %d %d %d %d %d \n",ho[8*h],ho[8*h+1],ho[8*h+2], ho[8*h+3],ho[8*h+4],ho[8*h+5],ho[8*h+6],ho[8*h+7]); } for (h=0; h<16; h++) { printf(" %d %d %d %d %d %d %d %d \n",ho[8*h],ho[8*h+1],ho[8*h+2], ho[8*h+3],ho[8*h+4],ho[8*h+5],ho[8*h+6],ho[8*h+7]); } zskip: fclose(Outfp); return(0); }