/*****************************************************************************/ /* */ /* REGENERATE LOOPS */ /* 12/28/08 (dkc) */ /* */ /* This C program regenerates loops for the 3n+c sequence given entry */ /* points ("list.dat" is verified). A check for 1-2 sequence vectors is */ /* made. "jumping over" is verified to be a 1-2 sequence vector. */ /* */ /*****************************************************************************/ #include <stdio.h> #include <math.h> int main () { int c=125; // c value int iters=22; // number of entry points //int s[1]={-68}; // c=1 //int s[7]={2,38,1562,1496,374,1436,1334}; // c=5 //int s[1]={10}; // c=7 //int s[4]={8,2,62,26}; // c=11 //int s[9]={4,454,502,574,682,844,1048,262,358}; // c=13 //int s[5]={140,62,50,8,2}; // c=17 //int s[2]={28,10}; // c=19 //int s[18]={14,20,1244,392,98,110, // -23704,-5926,-12526,-19330,-8134,-14686,-12364,-11878,-7486,-9436, // -9052,-7330}; // c=23 //int s[3]={34,88,22}; // c=25 //int s[19]={8,2,-226,98,44,788552,197138,194366,79082,73934,41606,18794,1707830, // 1441016,360254,577232,144308,36902,7622}; // c=29 //int s[5]={-380,106,58,52,34}; // c=31 //int s[3]={68,104,26}; // c=35 //int s[3]={46,58,76}; // c=37 //int s[5]={128,32,8,2,38}; // c=41 //int s[3]={28,16,4}; // c=43 //int s[12]={146,170,206,260,44,38,26,20,494,200,50,98}; // c=47 //int s[4]={814,400,100,178}; // c=49 //int s[3]={350,230,206}; // c=53 //int s[7]={76,634,244,82,64,16,4}; // c=55 //int s[14]={104,26,92,38,32,8,2,1064,266,740,434,596,578,362}; // c=59 //int s[8]={16,4,24958,5974,3850,2878,1258,586}; // c=61 //int s[5]={332,134,116,62,38}; // c=65 //int s[5]={1060,340,184,46,34}; // c=67 //int s[14]={116,248,62,41360,10340,17042,48488,12122,18692,7970,22472,5618, // 13874,22724}; // c=71 //int s[15]={58,40,10,22,202,166,94,1216,304,76,958,328,82,100,46}; // c=73 //int s[13]={-18448,-4612,-1978,-14254,-5326,-3874,284,128,32,8,2,74,20}; // c=77 //int s[20]={1864,466,1060,658,268,136,34,88,22,70,46,28, // 460,172,142,106,64,16,4,52}; // c=79 //int s[7]={1052,218,566,314,1646,638,260}; // c=83 //int s[13]={2194,2146,1174,844,826,736,184,46,364,214,142,112,28}; // c=85 //int s[3]={266,122,68}; // c=89 //int s[10]={400,100,118,1018,748,220,64,16,4,58}; // c=91 //int s[21]={236,68,182,92,140,50,-1870,-1150,-1426,2288,572,416,104,26, // 254,128,32,8,2,122,74}; // c=95 //int s[10]={52,34,106,64,16,4,-5516,-1010,-2222,-1250}; // c=97 //int s[13]={152,38,92,116,74,98,62,200,50,44,224,56,14}; // c=101 //int s[12]={160,40,10,70,52,286,214,184,46,124,106,58}; // c=103 //int s[17]={9104,2276,1862,554,512,128,32,8,2,230,194,176,44,86,80,20, // 68}; // c=107 //int s[5]={2170,658,274,130,76}; // c=109 //int s[12]={1064,266,128,32,8,2,50,-13678,-13138,-5668,-5098,-3076}; // c=113 //int s[12]={1036,196,124,52,964,442,286,136,34,46,100,-422}; // c=115 //int s[27]={80,20,56,14,44,38,1196,254,296,74,218,116,110,92, // -622,4922,3698,3350,2978,2654,2162,1286,512,128,32,8,2}; // c=119 //int s[29]={628,196,148,124,58,52,40,10,34,790,670,562,520,130,304,76,238, // 202,184,46,106,70,-10244,-4178,-5042,-55928,-13982,-7166, // -4340}; // c=121 int s[22]={32,8,3218,1238,926,764,752,188,734,572,136328,34082,61538,42764, 42584,10646,29462,23108,12812,8852,4364,3002}; // c=125 //int s[15]={382,274,220,166,154,94,82,1030,418,622,598,256,64,16,4}; // c=127 //int s[37]={380,266,104,26,338,326,272,68,1694,668,542,236,218,158,110,92,74, // 50,-756598,-638224,-159556,-29884,-170044,-31750,-134566, // -155020,-41182,-21766,-146716,-41182,-21766,-155020,-133108, // -70342,-108628,-43018,-60694}; // c=131 //int s[13]={460,358,352,88,22,298,142,2728,682,1942,250,226,118}; // c=133 //int s[20]={80000,20000,5000,1250,13418,5066,2726,1934,3806,3374,2972, // 3212,1916,1178,776,194,692,476,206,164}; // c=137 //int s[58]={1510,916,868,862,706,538,490,484,358,220,202,142,88,22,76, // -16472,-4118,-13556,-12098,-4502,-11612,-10316,-10154,-9182, // -5078,-8876,-8858,-8492,-7994,-7886,-7418,-7238,-5942,-7034, // -7022,-6446,-6374,-6062,-5798,-5414,-5366,-4982,-4694,-17624, // -4406,-5294,-17240,-4310,-7724,-14546,-5420,-10328,-2582, // -35102,-19658,-21602,-8066,-2990}; // c=139 //int s[26]={158,122,116,33224,8306,24476,18032,4508,7178,2384,596,1148,1022, // 698,482,392,98,350,224,56,14,536,134,86,68,44}; // c=143 //int s[20]={328,82,184,46,166,802,616,154,226,94,64,16,4, // -1130,490,220,-5486,-3758,-1454,-482}; // c=145 //int s[12]={5798,4826,4412,1334,29450,8348,1868,608,152,38,194,110}; // c=149 //int s[14]={502,370,226,2854,1108,1018,856,214,730,538,406,190,118,82}; // c=151 // int jump[48*2]={ 13,262, 17,2, 23,98, 25,22, 41,8, 43,4, 47,50, 49,100, 55,16, 59,26, 59,8, 61,4, 67,46, 71,5618, 73,304, 77,8, 79,4, 79,22, 85,46, 85,28, 91,16, 95,8, 95,26, 97,4, 101,50, 101,14, 103,10, 103,46, 107,128, 107,2, 107,20, 113,8, 119,32, 119,14, 121,10, 121,46, 125,2, 131,26, 133,22, 137,32, 137,5000, 137,194, 139,-4310, 139,-2582, 143,596, 143,56, 145,16, 149,152}; int dest[48]={358,5,110,28,2,1,98,25,4,92,2,1,34,32734,76,2,1,28,79,7,4,2, 74,1,44,71,70,43,32,68,5,2,8,35,34,304,32,299,298,8,1250,107,-7724,-9911, 149,14,4,38}; int i,k,n,max,order,temp,flag,flag1,flag2,flag3,endjmp; unsigned int j,count,first; FILE *Outfp; Outfp = fopen("out0e.dat","w"); // // compute order (of loop) // for (i=0; i<iters; i++) { k=s[i]; flag1=0; for (j=0; j<48; j++) { if ((c==jump[2*j])&&(k==jump[2*j+1])) { flag1=1; endjmp=dest[j]; } } max=k; if (max<0) max=-max; while (k==(k/2)*2) k=k/2; for (j=1; j<10000; j++) { k=3*k+c; temp=k; if (temp<0) temp=-temp; if (temp>max) max=temp; while (k==(k/2)*2) { if (k==s[i]) goto bskip; k=k/2; } } printf("error: s[i]=%d \n",s[i]); goto zskip; bskip: order=3; while (order<max) order=order*2; // // find odd natural number divisible by 3 // k=s[i]; max=k; if (max<0) max=-max; while (k!=(k/3)*3) { if (k==(k/2)*2) { if ((k-c)==((k-c)/3)*3) { k=(k-c)/3; temp=k; if (temp<0) temp=-temp; if (temp>max) max=temp; } else { k=k*2; temp=k; if (temp<0) temp=-temp; if (temp>max) max=temp; } } else { k=k*2; temp=k; if (temp<0) temp=-temp; if (temp>max) max=temp; } } // // include even natural numbers to the left of the odd natural number divisible // by 3 // temp=k; if (temp<0) temp=-temp; while (temp<(order/2)) { temp=temp*2; k=k*2; } // // compute sequence // count=1; first=1; while (k==(k/2)*2) { k=k/2; count=count+1; } flag2=0; if (flag1==1) { printf(" %d",k); fprintf(Outfp," %d",k); flag3=1; } flag=1; for (j=1; j<10000; j++) { k=3*k+c; count=count+1; n=1; if (flag1==1) { if (flag3==1) { printf(" %d",k); fprintf(Outfp," %d",k); } if (k==endjmp) { flag2=1; flag3=0; } } while (k==(k/2)*2) { if (k==s[i]) { flag=0; if (first==1) first=0; else goto askip; } k=k/2; count=count+1; n=n+1; if (flag1==1) { if (flag3==1) { printf(" %d",k); fprintf(Outfp," %d",k); } if (k==endjmp) { flag2=1; flag3=0; } } if ((n>3)&&(flag==1)) { printf("error: not a 1-2 sequence vector, c=%d, s=%d \n",c,s[i]); fprintf(Outfp,"error: not a 1-2 sequence vector, c=%d, s=%d \n",c,s[i]); goto zskip; } } } printf("error \n"); fprintf(Outfp,"error \n"); askip: if (flag1==1) { printf("\n"); fprintf(Outfp,"\n"); if (flag2==0) printf("error: end jump=%d \n",endjmp); } if (flag1==1) printf("order=%d, count=%d, c=%d, d=%d \n",order,count-1,c,s[i]); else printf("order=%d, count=%d, c=%d \n",order,count-1,c); fprintf(Outfp,"order=%d, count=%d \n",order,count-1); if (max>order) { printf(" error: order=%d, maximum=%d \n",order,max); fprintf(Outfp," error: order=%d, maximum=%d \n",order,max); } } zskip: fclose(Outfp); return(0); }