﻿ /*  DETERMINE IF 2^
```/*  DETERMINE IF 2^(K+L)-3^K INCREASES MONOTONICALLY (for generalized	      */
/*  continued-fraction convergents of log(3)/log(2))			      */
/*  03/12/13 (dkc)							      */
/*									      */
/*  This C program computes 2^l-3^m where (l,m) are continued-fraction	      */
/*  convergents of log(3)/log(2) (excluding (2,1), (4,2), (6,4), and (9,6)).  */
/*									      */
/******************************************************************************/
#include <math.h>
void mult3(unsigned int *c, unsigned int n);
void lshiftn(unsigned int *a, unsigned int *b, unsigned int shift, unsigned int n);
void addn(unsigned int *a, unsigned int *b, unsigned int n);
void copyn(unsigned int *a, unsigned int *b, unsigned int n);
void setn(unsigned int *a, unsigned int b, unsigned int n);
void negn(unsigned int *a, unsigned int n);
void dummy(unsigned int a);
far unsigned int error[6];
far unsigned int S[65536+32768];
far unsigned int ln[221*2]={
// 1, 1,  // exclude
// 2, 1,  // exclude
3, 2,
// 4, 2,  // exclude
5, 3,
// 6, 4,  // exclude
8, 5,
// 9, 6,  // exclude
11, 7,
13, 8,   // extra (length=20)
16, 10,
19, 12,
24, 15,
27, 17,
32, 20,  // extra
35, 22,  // extra (length=56)
38, 24,
46, 29,
54, 34,  // extra
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,
25296, 15960,
25781, 16266,
49454, 31202,
50508, 31867,
74181, 46803,
75235, 47468,
101016, 63734,
125743, 79335,
151524, 95601,
176251, 111202,
251486, 158670,
301994, 190537,
352502, 222404,
478245, 301739,
603988, 381074,
780239, 492276,
905982, 571611,
1082233, 682813,
1207976, 762148,
1384227, 873350,
1509970, 952685,
1686221, 1063887,
1811964, 1143222,
1988215, 1254424,
2113958, 1333759,
2290209, 1444961,
2415952, 1524296,
2592203, 1635498,
2717946, 1714833,
2894197, 1826035,
3019940, 1905370,
3196191, 2016572,
3321934, 2095907,
3498185, 2207109,
3623928, 2286444,
3800179, 2397646,
3925922, 2476981,
4102173, 2588183,
4227916, 2667518,
4404167, 2778720,
4529910, 2858055,
4706161, 2969257,
4831904, 3048592,
5008155, 3159794,
5133898, 3239129,
5310149, 3350331,
5435892, 3429666,
5612143, 3540868,
5737886, 3620203,
5914137, 3731405,
6039880, 3810740,
6216131, 3921942,
6341874, 4001277,
6518125, 4112479,
6643868, 4191814,
6820119, 4303016,
6945862, 4382351,
7122113, 4493553,
7247856, 4572888,
7424107, 4684090,
7549850, 4763425,
7726101, 4874627,
7851844, 4953962,
8028095, 5065164,
8153838, 5144499,
8330089, 5255701,
8455832, 5335036,
8632083, 5446238,
8757826, 5525573,
8934077, 5636775,
9059820, 5716110,
9236071, 5827312,
9361814, 5906647,
9538065, 6017849,
9663808, 6097184,
9840059, 6208386,
9965802, 6287721,
10142053, 6398923,
10267796, 6478258,
10444047, 6589460,
10569790, 6668795,
10746041, 6779997,
10871784, 6859332,
11048035, 6970534,
11173778, 7049869,
11350029, 7161071,
11475772, 7240406,
11652023, 7351608,
11777766, 7430943,
11954017, 7542145,
12079760, 7621480,
12256011, 7732682,
12381754, 7812017,
12558005, 7923219,
12683748, 8002554,
12859999, 8113756,
12985742, 8193091,
13161993, 8304293,
13287736, 8383628,
13463987, 8494830,
13589730, 8574165,
13765981, 8685367,
13891724, 8764702,
14067975, 8875904,
14193718, 8955239,
14369969, 9066441,
14495712, 9145776,
14671963, 9256978,
14797706, 9336313,
14973957, 9447515,
15099700, 9526850,
15275951, 9638052,
15401694, 9717387,
15577945, 9828589,
15703688, 9907924,
15879939, 10019126,
16005682, 10098461,
16181933, 10209663,
16307676, 10288998,
16483927, 10400200,
16609670, 10479535,
16785921, 10590737,
16911664, 10670072,
17087915, 10781274,
33571842, 21181474,
33873836, 21372011,
34175830, 21562548,
50961751, 32153285,
51263745, 32343822,
68049666, 42934559,
68351660, 43125096,
85137581, 53715833,
85439575, 53906370,
102225496, 64497107,
170275162, 107431666,
187363077, 118212940,
255412743, 161147499,
272500658, 171928773,
340550324, 214863332,
357638239, 225644606,
545001316, 343857546,
630138897, 397573379,
715276478, 451289212};

int main () {
unsigned int A[65536+32768],B[65536+32768];
unsigned int m=65536+32768;
unsigned int h,i,l,n;
error[0]=0;
error[1]=0;
error[2]=0;
error[3]=0;
error[4]=0;
error[5]=0;
setn(S, 0, m);
for (i=0; i<221; i++) {
l=ln[2*i];			// length of cycle
n=ln[2*i+1]; 		// number of odd elements in loop
error[3]=i;
error[4]=n;
if ((l>>5)>m) {		// 2**l-3**n is too big
error[0]=5;
error[1]=l;
error[2]=n;
goto zskip;
}
setn(A, 1, m);
lshiftn(A, B, l, m); 		// 2**l
setn(A, 1, m);
for (h=0; h<n; h++) {		// 3**n
mult3(A, m);
if ((A[0]&0xff000000)!=0) {
error[0]=2;
goto zskip;
}
}
negn(A, m);
if ((A[0]&0x80000000)!=0)		// negate 2**l-3**n
negn(A, m);
copyn(S, B, m);
negn(B, m);