/******************************************************************************/ /* */ /* COMPUTE 3N+1 SEQUENCE (tree for k>28, more efficient algorithm, */ /* several passes required) */ /* 01/15/10 (dkc) */ /* */ /* This C program is for the C64. The maximum limb length is 33. */ /* */ /******************************************************************************/ #include <math.h> void sub64(unsigned int *a, unsigned int *b); void add64(unsigned int *a, unsigned int *b); void shift(unsigned int a, unsigned int b, unsigned int c, unsigned int *s); void mul64_32(unsigned int a, unsigned int b, unsigned int c, unsigned int *d); unsigned int subr2(unsigned int A, unsigned int B, unsigned int *P); far unsigned int s[2097152]; // duplicate array, size=(order/12)/32 far unsigned int ho[256]; // histogram of limb lengths far unsigned int he[66]; // histogram of sequence vectors far unsigned int v[13]; // sequence vector far unsigned int error[5]; // error far unsigned int maxy[66*2]; // maximum y value array far unsigned int g; // counter far unsigned int l=33; // limb length far unsigned int a=13; // length of sequence vector far unsigned int b=66; // number of sequence vectors //far unsigned int sv[1*1]={ // length=2, live only // 1}; //far unsigned int sv[2*1]={ // length=4, live only // 1, 1}; //far unsigned int sv[3*1]={ // length=7, live only // 1, 2, 1}; //far unsigned int sv[4*1]={ // length=9, live only // 1, 2, 1, 1}; //far unsigned int sv[5*2]={ // length=12, live only // 1, 2, 2, 1, 1, // 986 // 1, 2, 1, 2, 1}; // 842 //far unsigned int sv[6*2]={ // length=14, live only // 1, 2, 2, 1, 1, 1, // 3214 // 1, 2, 1, 2, 1, 1}; // 2782 //far 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 //far 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 //far 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 /* far 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 */ /* far 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 */ /* far 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 */ far 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 //far unsigned int z[1]={2}; // length=2, live only //far unsigned int z[1]={10}; // length=4, live only //far unsigned int z[1]={58}; // length=7, live only //far unsigned int z[1]={206}; // length=9, live only //far unsigned int z[2]={ // length=12, live only // 986,842}; //far unsigned int z[2]={ // length=14, live only // 2782,3214}; //far unsigned int z[5]={ // length=17, live only // 14314,11434,12586,10138,11290}; //far unsigned int z[5]={ // length=20, live only // 54718,49534,50110,44926,61630}; //far unsigned int z[9]={ // length=22, live only // 156794,158522,172346,193082,145130,142970,132602,131306,120938}; //far 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}; //far 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}; //far 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}; far 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}; // int main () { unsigned int kay=32; // k // // kay=29, stage=1,3 // kay=30, stage=1,3,5,7 // kay=31, stage=1,3,5,7,9,11,13,15 // kay=32, stage=1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 // kay=33, stage=1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43, // 45,47,49,51,53,55,57,59,61,63 // unsigned int C[2],I[2],K[2],O[2],P[4],S[2],T[2],U[2],V[2],W[3],X[2],Y[2],Z[2]; unsigned int D[2],E[3],F[2],G[2],H[2],J[2]; unsigned int d,e,f,i,j,n,t,u,mask,flag,test,count,first,flagn; // indices unsigned int stage; // stage (odd) unsigned int num[19]={1,1,7,5,17,47,13,217,295,139,1909,1631,3299, 13085,6487,46075,84997,7153,502829}; unsigned 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 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 for (i=0; i<a; i++) // clear sequence vector v[i]=0; error[0]=0; error[1]=0; error[2]=0; error[3]=0; error[4]=0; for (i=0; i<256; i++) // clear histogram of lengths ho[i]=0; for (i=0; i<66; i++) { he[i]=0; maxy[2*i]=0; maxy[2*i+1]=0; } g=0; // clear counter if (kay<32) { // compute order O[0]=0; O[1]=1<<kay; } else { if (kay!=32) O[0]=1<<(kay-32); else O[0]=1; O[1]=0; } Z[0]=O[0]; // order/3 Z[1]=O[1]; T[0]=O[0]; T[1]=O[1]; add64(O, T); add64(T, O); // order=(1<<kay)*3 shift(O[0], O[1], 1, X); // save order/2 /*********************/ /* begin outer loop */ /*********************/ for (stage=1; stage<=31; stage+=2) { shift(O[0], O[1], 1, I); // i=order/2 shift(O[0], O[1], 2, C); // loop count=order/4 for (i=0; i<2097152; i++) // clear duplicate array s[i]=0; // // limbs ending in elements of A, B, C, and D // /*********************/ /* begin outer loop */ /*********************/ aloop: if ((I[1]&3)!=0) // check if 4 divides i goto hskip; shift(I[0], I[1], 2, T); // i/4 U[0]=0; U[1]=2; sub64(T, U); // i-8 flag=subr2(U[0], U[1], P); // check if 12 divides i-8 if (flag!=0) goto bskip; hskip: K[0]=I[0]; // k=i; K[1]=I[1]; flag=subr2(K[0], K[1], P); // check if 3 divides k if (flag!=0) goto askip; T[0]=0; T[1]=1; sub64(K, T); // k-1 flag=subr2(T[0], T[1], P); // check if 3 divides k-1 if (flag==0) goto askip; K[0]=P[0]; // k=(k-1)/3 K[1]=P[1]; flag=subr2(K[0], K[1], P); // check if 3 divides k if (flag!=0) goto bskip; add64(K, K); // k=k*2 /***********************/ /* begin inner loop */ /***********************/ bloop: test=1; T[0]=X[0]; T[1]=X[1]; sub64(K, T); // k-order/2 if ((T[0]&0x80000000)==0) test=0; T[0]=0; T[1]=1; sub64(K, T); // k-1 flag=subr2(T[0], T[1], P); // check if 3 divides k-1 if ((flag==0)&&(test==0)) goto askip; if (flag!=0) { K[0]=P[0]; // k=(k-1)/3 K[1]=P[1]; flag=subr2(K[0], K[1], P); // check if 3 divide k if (flag!=0) goto bskip; add64(K, K); // k=k*2; } else add64(K, K); // k=k*2 goto bloop; /***********************/ /* end inner loop */ /***********************/ askip: S[0]=K[0]; // save starting element S[1]=K[1]; n=1; // set length cloop: if ((K[1]&1)==0) { shift(K[0], K[1], 1, K); n=n+1; // increment length goto cloop; } for (j=1; j<1000000; j++) { // iterate until end of limb T[0]=K[0]; T[1]=K[1]; add64(K, T); // 2*k add64(K, T); // 3*k Y[0]=0; Y[1]=1; add64(T, Y); // h=3*k+1 T[0]=O[0]; T[1]=O[1]; sub64(Y, T); // h-order if ((T[0]&0x80000000)!=0) goto cskip; if (kay<29) { T[0]=Z[0]; // order/3 T[1]=Z[1]; sub64(K, T); // k-(order/3) U[0]=0; U[1]=1; sub64(T, U); // k-(order/3)-1 shift(U[0], U[1], 1, T); // t=((k-order/3))-1)/2 } else { T[0]=0; T[1]=stage; sub64(K, T); // k-stage mask=(1<<(kay-29+2))-1; if ((T[1]&mask)!=0) // check if 2^x divides k-stage goto bskip; T[0]=Z[0]; T[1]=Z[1]; sub64(K, T); // k-(order/3) U[0]=0; U[1]=stage; sub64(T, U); // k-(order/3)-stage shift(U[0], U[1], kay-29+2, T); } t=T[1]; u=t-(t>>5)*32; // fractional portion of index t=t>>5; // 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<256) // check length ho[n]=ho[n]+1; // histogram length else { error[0]=1; // set error ho[0]=0xffffffff; // set flag goto zskip; } if (n!=l) // check length goto bskip; flag=subr2(S[0], S[1], P); // check if 3 divides m if (flag==1) // dead limb goto bskip; shift(Y[0], Y[1], 1, V); // h/2 sub64(S, V); // r=m-(h/2) flagn=0; // check for negative r if ((V[0]&0x80000000)!=0) { D[0]=0; D[1]=0; sub64(D, V); flagn=1; } for (f=0; f<19; f++) { if (n==len[f]) { mul64_32(S[0], S[1], num[f], W); F[0]=W[1]; F[1]=W[2]; mul64_32(V[0], V[1], den[f], E); G[0]=E[1]; G[1]=E[2]; if (flagn==0) sub64(F, G); else { sub64(G, F); G[0]=F[0]; G[1]=F[1]; } if (G[0]!=0) { error[0]=14; error[1]=W[1]; error[2]=W[2]; error[3]=E[1]; error[4]=E[2]; goto zskip; } flag=0; for (e=0; e<b; e++) { if (G[1]==z[e]) { flag=z[e]; goto fskip; } } error[0]=G[1]; // e value not found goto zskip; fskip: if (l==2) { v[0]=1; f=1; goto dskip; } H[0]=S[0]; // save m H[1]=S[1]; f=0; if ((S[1]&1)==0) { count=0; while ((S[1]&1)==0) { count=count+1; shift(S[0], S[1], 1, S); } v[0]=count; f=1; } first=1; while ((S[0]!=K[0])||(S[1]!=K[1])) { if ((S[1]&1)==0) { shift(S[0], S[1], 1, S); count=count+1; } else { D[0]=S[0]; D[1]=S[1]; add64(S, S); add64(D, S); D[0]=0; D[1]=1; add64(D, S); if (first==0) { v[f]=count; f=f+1; if (f>a) { error[0]=9; error[1]=H[0]; error[2]=H[1]; error[3]=K[0]; error[4]=K[1]; goto zskip; } } else first=0; count=0; } } v[f]=count; f=f+1; dskip: if (f!=a) { error[0]=10; goto zskip; } for (d=0; d<b; d++) { for (j=0; j<a; j++) { if (v[j]!=sv[j+a*d]) goto eskip; } he[d]=he[d]+1; J[0]=maxy[2*d]; J[1]=maxy[2*d+1]; sub64(H, J); if ((J[0]&0x80000000)==0) { maxy[2*d]=H[0]; maxy[2*d+1]=H[1]; } goto bskip; eskip: n=0; } error[0]=flag; // sequence vector not found error[1]=H[0]; error[2]=H[1]; error[3]=K[0]; error[4]=K[1]; goto zskip; } } goto bskip; cskip: K[0]=Y[0]; // k=h K[1]=Y[1]; if ((K[1]&7)==0) // check if 8 divides k goto bskip; n=n+1; // increment length dloop: if ((K[1]&1)==0) { shift(K[0], K[1], 1, K); // k=k>>1 n=n+1; // increment length goto dloop; } } error[0]=2; // limb not found ho[0]=0xffffffff; goto zskip; bskip: T[0]=0; T[1]=2; add64(I, T); I[0]=T[0]; // i=i+2 I[1]=T[1]; T[0]=0; T[1]=1; sub64(C,T); C[0]=T[0]; // loop count=loop count-1 C[1]=T[1]; if ((C[0]!=0)||(C[1]!=0)) goto aloop; /*********************/ /* end outer loop */ /*********************/ } /*********************/ /* end outer loop */ /*********************/ for (i=0; i<40; i++) { if (ho[y[i]]!=0) { error[0]=13; goto zskip; } } zskip: return(0); }