/******************************************************************************/ /* */ /* CHECK PARITY VECTOR (to determine if it is a rotation of the parity */ /* vector p) */ /* 07/09/13 (dkc) */ /* */ /******************************************************************************/ #include <stdio.h> #include <math.h> #include "ln.h" #include "sv.h" unsigned int lastl[285]={ // last of the group of l values with a difference of 3 30,38,49,57,68,76,95,103,114,122,133,141,152,160,168,179,187,198,206, 217,225,236,244,252,263,271,282,290,301,309,320,328,336,347,355,366, 374,385,393,404,412,420,431,439,450,458,469,477,488,496,504,515,523, 534,542,553,561,580,588,599,607,618,626,637,645,653,664,672,683,691, 702,710,721,729,737,748,756,767,775,786,794,805,813,821,832,840,851, 859,870,878,889,897,905,916,924,935,943,954,962,973,981,989,1000, 1008,1019,1027,1038,1046,1065,1073,1084,1092,1103,1111,1122,1130, 1138,1149,1157,1168,1176,1187,1195,1206,1214,1222,1233,1241,1252, 1260,1271,1279,1290,1298,1306,1317,1325,1336,1344,1355,1363,1374, 1382,1390,1401,1409,1420,1428,1439,1447,1458,1466,1474,1485,1493,1504, 1512,1523,1531,1542,1550,1558,1569,1577,1588,1596,1607,1615,1623, 1634,1642,1653,1661,1672,1680,1691,1699,1707,1718,1726,1737,1745,1756, 1764,1775,1783,1791,1802,1810,1821,1829,1840,1848,1859,1867,1875,1886, 1894,1905,1913,1924,1932,1943,1951,1959,1970,1978,1989,1997,2008,2016, 2027,2035,2043,2054,2062,2073,2081,2092,2100,2108,2119,2127,2138,2146, 2157,2165,2176,2184,2192,2203,2211,2222,2230,2241,2249,2260,2268,2276, 2287,2295,2306,2314,2325,2333,2344,2352,2360,2371,2379,2390,2398,2409, 2417,2428,2436,2444,2455,2463,2474,2482,2493,2501,2512,2520,2528,2539, 2547,2558,2566,2577,2585,2596,2604,2612,2623,2631,2642,2650,2661,2669, 2677,2688,2696,2707}; unsigned int conv[75*2]={ // generalized continued-fraction convergents of log(3)/log(2) 5, 3, 6, 4, 8, 5, 9, 6, 11, 7, 16, 10, 19, 12, 24, 15, 27, 17, 38, 24, 46, 29, 57, 36, 65, 41, 76, 48, 84, 53, 130, 82, 149, 94, 168, 106, 233, 147, 252, 159, 317, 200, 336, 212, 401, 253, 420, 265, 485, 306, 504, 318, 569, 359, 970, 612, 1054, 665, 1455, 918, 1539, 971, 2108, 1330, 2593, 1636, 3162, 1995, 3647, 2301, 4216, 2660, 4701, 2966, 5270, 3325, 5755, 3631, 6324, 3990, 6809, 4296, 7378, 4655, 7863, 4961, 8432, 5320, 8917, 5626, 9486, 5985, 9971, 6291, 10540, 6650, 11025, 6956, 11594, 7315, 12079, 7621, 12648, 7980, 13133, 8286, 13702, 8645, 14187, 8951, 14756, 9310, 15241, 9616, 15810, 9975, 16295, 10281, 16864, 10640, 17349, 10946, 17918, 11305, 18403, 11611, 18972, 11970, 19457, 12276, 20026, 12635, 20511, 12941, 21080, 13300, 21565, 13606, 22134, 13965, 22619, 14271, 23188, 14630, 23673, 14936, 24242, 15295, 24727, 15601}; //l=3; // continued-fraction convergents of log(3)/log(2) //n=2; //l=8; //n=5; //l=19; //n=12; //l=65; //n=41; //l=84; //n=53; //l=485; //n=306; //l=1054; //n=665; //l=24727; //n=15601; int main () { unsigned int l,lp,a,b,h,i,j,k,n,np,flag; unsigned int pv[25000],qv[25000]; FILE *Outfp; Outfp = fopen("out14db.dat","w"); for (h=4; h<75; h++) { l=conv[2*h]; n=conv[2*h+1]; printf("l=%d, n=%d \n",l,n); fprintf(Outfp,"l=%d, n=%d \n",l,n); for (j=1; j<=l; j++) { a=j*n; if (a==((a/l)*l)) // a=(j*n)/l a=a/l; else a=(a/l)+1; b=(j-1)*n; if (b==((b/l)*l)) // b=((j-1)*n)/l b=b/l; else b=(b/l)+1; if (j!=1) // skip first element qv[j-2]=a-b; } qv[l-1]=0; lp=l; // // check if a rotation of parity vector matches parity vector p // for (i=0; i<1000; i++) { l=ln[i]>>16; for (k=0; k<lp; k++) // copy parity vector pv[k]=qv[k]; flag=0; // check for required element swaps for (k=0; k<285; k++) { if (l==lastl[k]) { flag=1; break; } if (lastl[k]>l) break; } if (flag!=0) { // switch last two elements a=pv[l-2]; pv[l-2]=pv[l-1]; pv[l-1]=a; } n=0; // check if number of odd elements match np=0; for (k=0; k<l; k++) { n=n+pv[k]; np=np+sv[k]; } if ((n!=np)||(n!=(ln[i]&0xffff))) { if ((n+1)!=conv[2*h+1]) { printf("number of odd elements not equal: n=%d, np=%d \n",n,np); fprintf(Outfp,"number of odd elements not equal: n=%d, np=%d \n",n,np); goto zskip; } else goto cskip; } for (k=0; k<l; k++) { // compare parity vectors for (j=0; j<l; j++) { if (pv[j]!=sv[j]) goto askip; } if (k!=3) { printf("l=%d, n=%d, k=%d \n",l,n,k); fprintf(Outfp,"l=%d, n=%d, k=%d \n",l,n,k); } goto bskip; askip: a=pv[l-1]; // rotate parity vector for (j=(l-1); j>0; j--) pv[j]=pv[j-1]; pv[0]=a; } printf("l=%d, n=%d, no match \n",l,n); fprintf(Outfp,"l=%d, n=%d, no match \n",l,n); if (((l+3)==conv[h*2])&&((n+2)==conv[h*2+1])) break; else { if ((l==conv[h*2])&&(n==conv[h*2+1])) break; else { printf("error: l=%d, n=%d \n",l,n); break; } } bskip: k=0; } cskip: printf("\n"); fprintf(Outfp,"\n"); } zskip: fclose(Outfp); return(0); }